X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fbrw_program.h;h=2e9f12172e4b73c4adbb74303d40aa2273d6e1e9;hp=cf0522a8b10f46e5c85498b9e808ffbdb65e293e;hb=700bebb958e93f4d472c383de62ced9db8e64bec;hpb=3948ac19a40663bd00deb84518ac747daa5f401f diff --git a/src/mesa/drivers/dri/i965/brw_program.h b/src/mesa/drivers/dri/i965/brw_program.h index cf0522a8b10..2e9f12172e4 100644 --- a/src/mesa/drivers/dri/i965/brw_program.h +++ b/src/mesa/drivers/dri/i965/brw_program.h @@ -24,157 +24,65 @@ #ifndef BRW_PROGRAM_H #define BRW_PROGRAM_H -/** - * Program key structures. - * - * When drawing, we look for the currently bound shaders in the program - * cache. This is essentially a hash table lookup, and these are the keys. - * - * Sometimes OpenGL features specified as state need to be simulated via - * shader code, due to a mismatch between the API and the hardware. This - * is often referred to as "non-orthagonal state" or "NOS". We store NOS - * in the program key so it's considered when searching for a program. If - * we haven't seen a particular combination before, we have to recompile a - * new specialized version. - * - * Shader compilation should not look up state in gl_context directly, but - * instead use the copy in the program key. This guarantees recompiles will - * happen correctly. - * - * @{ - */ - -enum PACKED gen6_gather_sampler_wa { - WA_SIGN = 1, /* whether we need to sign extend */ - WA_8BIT = 2, /* if we have an 8bit format needing wa */ - WA_16BIT = 4, /* if we have a 16bit format needing wa */ -}; - -/** - * Sampler information needed by VS, WM, and GS program cache keys. - */ -struct brw_sampler_prog_key_data { - /** - * EXT_texture_swizzle and DEPTH_TEXTURE_MODE swizzles. - */ - uint16_t swizzles[MAX_SAMPLERS]; - - uint32_t gl_clamp_mask[3]; - - /** - * For RG32F, gather4's channel select is broken. - */ - uint32_t gather_channel_quirk_mask; - - /** - * Whether this sampler uses the compressed multisample surface layout. - */ - uint32_t compressed_multisample_layout_mask; - - /** - * For Sandybridge, which shader w/a we need for gather quirks. - */ - enum gen6_gather_sampler_wa gen6_gather_wa[MAX_SAMPLERS]; -}; - - -/** The program key for Vertex Shaders. */ -struct brw_vs_prog_key { - unsigned program_string_id; - - /* - * Per-attribute workaround flags - */ - uint8_t gl_attrib_wa_flags[VERT_ATTRIB_MAX]; - - bool copy_edgeflag:1; - - bool clamp_vertex_color:1; - - /** - * How many user clipping planes are being uploaded to the vertex shader as - * push constants. - * - * These are used for lowering legacy gl_ClipVertex/gl_Position clipping to - * clip distances. - */ - unsigned nr_userclip_plane_consts:4; - - /** - * For pre-Gen6 hardware, a bitfield indicating which texture coordinates - * are going to be replaced with point coordinates (as a consequence of a - * call to glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE)). Because - * our SF thread requires exact matching between VS outputs and FS inputs, - * these texture coordinates will need to be unconditionally included in - * the VUE, even if they aren't written by the vertex shader. - */ - uint8_t point_coord_replace; - - struct brw_sampler_prog_key_data tex; -}; - -/** The program key for Geometry Shaders. */ -struct brw_gs_prog_key -{ - unsigned program_string_id; - - struct brw_sampler_prog_key_data tex; -}; - -/** The program key for Fragment/Pixel Shaders. */ -struct brw_wm_prog_key { - uint8_t iz_lookup; - bool stats_wm:1; - bool flat_shade:1; - bool persample_shading:1; - bool persample_2x:1; - unsigned nr_color_regions:5; - bool replicate_alpha:1; - bool render_to_fbo:1; - bool clamp_fragment_color:1; - bool compute_pos_offset:1; - bool compute_sample_id:1; - unsigned line_aa:2; - bool high_quality_derivatives:1; - - uint16_t drawable_height; - uint64_t input_slots_valid; - unsigned program_string_id; - GLenum alpha_test_func; /* < For Gen4/5 MRT alpha test */ - float alpha_test_ref; - - struct brw_sampler_prog_key_data tex; -}; - -/** @} */ +#include "compiler/brw_compiler.h" #ifdef __cplusplus extern "C" { #endif +struct brw_context; + +bool brw_do_channel_expressions(struct exec_list *instructions); +bool brw_do_vector_splitting(struct exec_list *instructions); + +struct nir_shader *brw_create_nir(struct brw_context *brw, + const struct gl_shader_program *shader_prog, + struct gl_program *prog, + gl_shader_stage stage, + bool is_scalar); + void brw_setup_tex_for_precompile(struct brw_context *brw, struct brw_sampler_prog_key_data *tex, struct gl_program *prog); void brw_populate_sampler_prog_key_data(struct gl_context *ctx, const struct gl_program *prog, - unsigned sampler_count, struct brw_sampler_prog_key_data *key); bool brw_debug_recompile_sampler_key(struct brw_context *brw, const struct brw_sampler_prog_key_data *old_key, const struct brw_sampler_prog_key_data *key); -void brw_add_texrect_params(struct gl_program *prog); -void -brw_mark_surface_used(struct brw_stage_prog_data *prog_data, - unsigned surf_index); +uint32_t +brw_assign_common_binding_table_offsets(const struct gen_device_info *devinfo, + const struct gl_program *prog, + struct brw_stage_prog_data *stage_prog_data, + uint32_t next_binding_table_offset); void brw_stage_prog_data_free(const void *prog_data); void -brw_dump_ir(const char *stage, struct gl_shader_program *shader_prog, - struct gl_shader *shader, struct gl_program *prog); +brw_dump_arb_asm(const char *stage, struct gl_program *prog); + +bool brw_vs_precompile(struct gl_context *ctx, struct gl_program *prog); +bool brw_tcs_precompile(struct gl_context *ctx, + struct gl_shader_program *shader_prog, + struct gl_program *prog); +bool brw_tes_precompile(struct gl_context *ctx, + struct gl_shader_program *shader_prog, + struct gl_program *prog); +bool brw_gs_precompile(struct gl_context *ctx, struct gl_program *prog); +bool brw_fs_precompile(struct gl_context *ctx, struct gl_program *prog); +bool brw_cs_precompile(struct gl_context *ctx, struct gl_program *prog); + +GLboolean brw_link_shader(struct gl_context *ctx, struct gl_shader_program *prog); + +void brw_upload_tcs_prog(struct brw_context *brw); +void brw_tcs_populate_key(struct brw_context *brw, + struct brw_tcs_prog_key *key); +void brw_upload_tes_prog(struct brw_context *brw); +void brw_tes_populate_key(struct brw_context *brw, + struct brw_tes_prog_key *key); #ifdef __cplusplus } /* extern "C" */