X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fbrw_context.h;h=197ed3e6dc6d233dfa6e2ef92414b76d293ea74e;hb=eda3dd00760039493fa2afc00193aa47b6ce8c58;hp=5faa9422053f887a4a1a74ebab70061ba68d4201;hpb=864c463485aafaa2802b18a7427f8b75dc96e3ef;p=mesa.git diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 5faa9422053..197ed3e6dc6 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -145,12 +145,25 @@ extern "C" { struct brw_context; struct brw_inst; struct brw_vs_prog_key; -struct brw_vec4_prog_key; +struct brw_vue_prog_key; struct brw_wm_prog_key; struct brw_wm_prog_data; +enum brw_cache_id { + BRW_CACHE_FS_PROG, + BRW_CACHE_BLORP_BLIT_PROG, + BRW_CACHE_SF_PROG, + BRW_CACHE_VS_PROG, + BRW_CACHE_FF_GS_PROG, + BRW_CACHE_GS_PROG, + BRW_CACHE_CLIP_PROG, + + BRW_MAX_CACHE +}; + enum brw_state_id { - BRW_STATE_URB_FENCE, + /* brw_cache_ids must come first - see brw_state_cache.c */ + BRW_STATE_URB_FENCE = BRW_MAX_CACHE, BRW_STATE_FRAGMENT_PROGRAM, BRW_STATE_GEOMETRY_PROGRAM, BRW_STATE_VERTEX_PROGRAM, @@ -182,46 +195,92 @@ enum brw_state_id { BRW_STATE_INTERPOLATION_MAP, BRW_STATE_PUSH_CONSTANT_ALLOCATION, BRW_STATE_NUM_SAMPLES, + BRW_STATE_TEXTURE_BUFFER, + BRW_STATE_GEN4_UNIT_STATE, + BRW_STATE_CC_VP, + BRW_STATE_SF_VP, + BRW_STATE_CLIP_VP, + BRW_STATE_SAMPLER_STATE_TABLE, + BRW_STATE_VS_ATTRIB_WORKAROUNDS, BRW_NUM_STATE_BITS }; -#define BRW_NEW_URB_FENCE (1 << BRW_STATE_URB_FENCE) -#define BRW_NEW_FRAGMENT_PROGRAM (1 << BRW_STATE_FRAGMENT_PROGRAM) -#define BRW_NEW_GEOMETRY_PROGRAM (1 << BRW_STATE_GEOMETRY_PROGRAM) -#define BRW_NEW_VERTEX_PROGRAM (1 << BRW_STATE_VERTEX_PROGRAM) -#define BRW_NEW_CURBE_OFFSETS (1 << BRW_STATE_CURBE_OFFSETS) -#define BRW_NEW_REDUCED_PRIMITIVE (1 << BRW_STATE_REDUCED_PRIMITIVE) -#define BRW_NEW_PRIMITIVE (1 << BRW_STATE_PRIMITIVE) -#define BRW_NEW_CONTEXT (1 << BRW_STATE_CONTEXT) -#define BRW_NEW_PSP (1 << BRW_STATE_PSP) -#define BRW_NEW_SURFACES (1 << BRW_STATE_SURFACES) -#define BRW_NEW_VS_BINDING_TABLE (1 << BRW_STATE_VS_BINDING_TABLE) -#define BRW_NEW_GS_BINDING_TABLE (1 << BRW_STATE_GS_BINDING_TABLE) -#define BRW_NEW_PS_BINDING_TABLE (1 << BRW_STATE_PS_BINDING_TABLE) -#define BRW_NEW_INDICES (1 << BRW_STATE_INDICES) -#define BRW_NEW_VERTICES (1 << BRW_STATE_VERTICES) +/** + * BRW_NEW_*_PROG_DATA and BRW_NEW_*_PROGRAM are similar, but distinct. + * + * BRW_NEW_*_PROGRAM relates to the gl_shader_program/gl_program structures. + * When the currently bound shader program differs from the previous draw + * call, these will be flagged. They cover brw->{stage}_program and + * ctx->{Stage}Program->_Current. + * + * BRW_NEW_*_PROG_DATA is flagged when the effective shaders change, from a + * driver perspective. Even if the same shader is bound at the API level, + * we may need to switch between multiple versions of that shader to handle + * changes in non-orthagonal state. + * + * Additionally, multiple shader programs may have identical vertex shaders + * (for example), or compile down to the same code in the backend. We combine + * those into a single program cache entry. + * + * BRW_NEW_*_PROG_DATA occurs when switching program cache entries, which + * covers the brw_*_prog_data structures, and brw->*.prog_offset. + */ +#define BRW_NEW_FS_PROG_DATA (1ull << BRW_CACHE_FS_PROG) +/* XXX: The BRW_NEW_BLORP_BLIT_PROG_DATA dirty bit is unused (as BLORP doesn't + * use the normal state upload paths), but the cache is still used. To avoid + * polluting the brw_state_cache code with special cases, we retain the dirty + * bit for now. It should eventually be removed. + */ +#define BRW_NEW_BLORP_BLIT_PROG_DATA (1ull << BRW_CACHE_BLORP_BLIT_PROG) +#define BRW_NEW_SF_PROG_DATA (1ull << BRW_CACHE_SF_PROG) +#define BRW_NEW_VS_PROG_DATA (1ull << BRW_CACHE_VS_PROG) +#define BRW_NEW_FF_GS_PROG_DATA (1ull << BRW_CACHE_FF_GS_PROG) +#define BRW_NEW_GS_PROG_DATA (1ull << BRW_CACHE_GS_PROG) +#define BRW_NEW_CLIP_PROG_DATA (1ull << BRW_CACHE_CLIP_PROG) +#define BRW_NEW_URB_FENCE (1ull << BRW_STATE_URB_FENCE) +#define BRW_NEW_FRAGMENT_PROGRAM (1ull << BRW_STATE_FRAGMENT_PROGRAM) +#define BRW_NEW_GEOMETRY_PROGRAM (1ull << BRW_STATE_GEOMETRY_PROGRAM) +#define BRW_NEW_VERTEX_PROGRAM (1ull << BRW_STATE_VERTEX_PROGRAM) +#define BRW_NEW_CURBE_OFFSETS (1ull << BRW_STATE_CURBE_OFFSETS) +#define BRW_NEW_REDUCED_PRIMITIVE (1ull << BRW_STATE_REDUCED_PRIMITIVE) +#define BRW_NEW_PRIMITIVE (1ull << BRW_STATE_PRIMITIVE) +#define BRW_NEW_CONTEXT (1ull << BRW_STATE_CONTEXT) +#define BRW_NEW_PSP (1ull << BRW_STATE_PSP) +#define BRW_NEW_SURFACES (1ull << BRW_STATE_SURFACES) +#define BRW_NEW_VS_BINDING_TABLE (1ull << BRW_STATE_VS_BINDING_TABLE) +#define BRW_NEW_GS_BINDING_TABLE (1ull << BRW_STATE_GS_BINDING_TABLE) +#define BRW_NEW_PS_BINDING_TABLE (1ull << BRW_STATE_PS_BINDING_TABLE) +#define BRW_NEW_INDICES (1ull << BRW_STATE_INDICES) +#define BRW_NEW_VERTICES (1ull << BRW_STATE_VERTICES) /** * Used for any batch entry with a relocated pointer that will be used * by any 3D rendering. */ -#define BRW_NEW_BATCH (1 << BRW_STATE_BATCH) +#define BRW_NEW_BATCH (1ull << BRW_STATE_BATCH) /** \see brw.state.depth_region */ -#define BRW_NEW_INDEX_BUFFER (1 << BRW_STATE_INDEX_BUFFER) -#define BRW_NEW_VS_CONSTBUF (1 << BRW_STATE_VS_CONSTBUF) -#define BRW_NEW_GS_CONSTBUF (1 << BRW_STATE_GS_CONSTBUF) -#define BRW_NEW_PROGRAM_CACHE (1 << BRW_STATE_PROGRAM_CACHE) -#define BRW_NEW_STATE_BASE_ADDRESS (1 << BRW_STATE_STATE_BASE_ADDRESS) -#define BRW_NEW_VUE_MAP_VS (1 << BRW_STATE_VUE_MAP_VS) -#define BRW_NEW_VUE_MAP_GEOM_OUT (1 << BRW_STATE_VUE_MAP_GEOM_OUT) -#define BRW_NEW_TRANSFORM_FEEDBACK (1 << BRW_STATE_TRANSFORM_FEEDBACK) -#define BRW_NEW_RASTERIZER_DISCARD (1 << BRW_STATE_RASTERIZER_DISCARD) -#define BRW_NEW_STATS_WM (1 << BRW_STATE_STATS_WM) -#define BRW_NEW_UNIFORM_BUFFER (1 << BRW_STATE_UNIFORM_BUFFER) -#define BRW_NEW_ATOMIC_BUFFER (1 << BRW_STATE_ATOMIC_BUFFER) -#define BRW_NEW_META_IN_PROGRESS (1 << BRW_STATE_META_IN_PROGRESS) -#define BRW_NEW_INTERPOLATION_MAP (1 << BRW_STATE_INTERPOLATION_MAP) -#define BRW_NEW_PUSH_CONSTANT_ALLOCATION (1 << BRW_STATE_PUSH_CONSTANT_ALLOCATION) -#define BRW_NEW_NUM_SAMPLES (1 << BRW_STATE_NUM_SAMPLES) +#define BRW_NEW_INDEX_BUFFER (1ull << BRW_STATE_INDEX_BUFFER) +#define BRW_NEW_VS_CONSTBUF (1ull << BRW_STATE_VS_CONSTBUF) +#define BRW_NEW_GS_CONSTBUF (1ull << BRW_STATE_GS_CONSTBUF) +#define BRW_NEW_PROGRAM_CACHE (1ull << BRW_STATE_PROGRAM_CACHE) +#define BRW_NEW_STATE_BASE_ADDRESS (1ull << BRW_STATE_STATE_BASE_ADDRESS) +#define BRW_NEW_VUE_MAP_VS (1ull << BRW_STATE_VUE_MAP_VS) +#define BRW_NEW_VUE_MAP_GEOM_OUT (1ull << BRW_STATE_VUE_MAP_GEOM_OUT) +#define BRW_NEW_TRANSFORM_FEEDBACK (1ull << BRW_STATE_TRANSFORM_FEEDBACK) +#define BRW_NEW_RASTERIZER_DISCARD (1ull << BRW_STATE_RASTERIZER_DISCARD) +#define BRW_NEW_STATS_WM (1ull << BRW_STATE_STATS_WM) +#define BRW_NEW_UNIFORM_BUFFER (1ull << BRW_STATE_UNIFORM_BUFFER) +#define BRW_NEW_ATOMIC_BUFFER (1ull << BRW_STATE_ATOMIC_BUFFER) +#define BRW_NEW_META_IN_PROGRESS (1ull << BRW_STATE_META_IN_PROGRESS) +#define BRW_NEW_INTERPOLATION_MAP (1ull << BRW_STATE_INTERPOLATION_MAP) +#define BRW_NEW_PUSH_CONSTANT_ALLOCATION (1ull << BRW_STATE_PUSH_CONSTANT_ALLOCATION) +#define BRW_NEW_NUM_SAMPLES (1ull << BRW_STATE_NUM_SAMPLES) +#define BRW_NEW_TEXTURE_BUFFER (1ull << BRW_STATE_TEXTURE_BUFFER) +#define BRW_NEW_GEN4_UNIT_STATE (1ull << BRW_STATE_GEN4_UNIT_STATE) +#define BRW_NEW_CC_VP (1ull << BRW_STATE_CC_VP) +#define BRW_NEW_SF_VP (1ull << BRW_STATE_SF_VP) +#define BRW_NEW_CLIP_VP (1ull << BRW_STATE_CLIP_VP) +#define BRW_NEW_SAMPLER_STATE_TABLE (1ull << BRW_STATE_SAMPLER_STATE_TABLE) +#define BRW_NEW_VS_ATTRIB_WORKAROUNDS (1ull << BRW_STATE_VS_ATTRIB_WORKAROUNDS) struct brw_state_flags { /** State update flags signalled by mesa internals */ @@ -230,15 +289,6 @@ struct brw_state_flags { * State update flags signalled as the result of brw_tracked_state updates */ uint64_t brw; - /** - * State update flags that used to be signalled by brw_state_cache.c - * searches. - * - * Now almost all of that state is just streamed out on demand, but the - * flags for those state blobs updating have stayed in the same bitfield. - * brw_state_cache.c still flags CACHE_NEW_*_PROG. - */ - GLuint cache; }; /** Subclass of Mesa vertex program */ @@ -291,6 +341,7 @@ struct brw_stage_prog_data { uint32_t gather_texture_start; uint32_t ubo_start; uint32_t abo_start; + uint32_t image_start; uint32_t shader_time_start; /** @} */ } binding_table; @@ -307,6 +358,8 @@ struct brw_stage_prog_data { */ unsigned dispatch_grf_start_reg; + bool use_alt_mode; /**< Use ALT floating point mode? Otherwise, IEEE. */ + /* Pointers to tracked values (only valid once * _mesa_load_state_parameters has been called at runtime). * @@ -342,10 +395,13 @@ struct brw_wm_prog_data { /** @} */ } binding_table; + uint8_t computed_depth_mode; + bool no_8; bool dual_src_blend; bool uses_pos_offset; bool uses_omask; + bool uses_kill; uint32_t prog_offset_16; /** @@ -525,10 +581,10 @@ struct brw_ff_gs_prog_data { }; -/* Note: brw_vec4_prog_data_compare() must be updated when adding fields to +/* Note: brw_vue_prog_data_compare() must be updated when adding fields to * this struct! */ -struct brw_vec4_prog_data { +struct brw_vue_prog_data { struct brw_stage_prog_data base; struct brw_vue_map vue_map; @@ -540,6 +596,8 @@ struct brw_vec4_prog_data { * is the size of the URB entry used for output. */ GLuint urb_entry_size; + + bool simd8; }; @@ -547,51 +605,12 @@ struct brw_vec4_prog_data { * struct! */ struct brw_vs_prog_data { - struct brw_vec4_prog_data base; + struct brw_vue_prog_data base; GLbitfield64 inputs_read; bool uses_vertexid; -}; - - -/* Note: brw_gs_prog_data_compare() must be updated when adding fields to - * this struct! - */ -struct brw_gs_prog_data -{ - struct brw_vec4_prog_data base; - - /** - * Size of an output vertex, measured in HWORDS (32 bytes). - */ - unsigned output_vertex_size_hwords; - - unsigned output_topology; - - /** - * Size of the control data (cut bits or StreamID bits), in hwords (32 - * bytes). 0 if there is no control data. - */ - unsigned control_data_header_size_hwords; - - /** - * Format of the control data (either GEN7_GS_CONTROL_DATA_FORMAT_GSCTL_SID - * if the control data is StreamID bits, or - * GEN7_GS_CONTROL_DATA_FORMAT_GSCTL_CUT if the control data is cut bits). - * Ignored if control_data_header_size is 0. - */ - unsigned control_data_format; - - bool include_primitive_id; - - int invocations; - - /** - * True if the thread should be dispatched in DUAL_INSTANCE mode, false if - * it should be dispatched in DUAL_OBJECT mode. - */ - bool dual_instanced_dispatch; + bool uses_instanceid; }; /** Number of texture sampler units */ @@ -603,6 +622,9 @@ struct brw_gs_prog_data /** Max number of atomic counter buffer objects in a shader */ #define BRW_MAX_ABO 16 +/** Max number of image uniforms in a shader */ +#define BRW_MAX_IMAGES 32 + /** * Max number of binding table entries used for stream output. * @@ -635,10 +657,81 @@ struct brw_gs_prog_data BRW_MAX_TEX_UNIT * 2 + /* normal, gather */ \ 12 + /* ubo */ \ BRW_MAX_ABO + \ + BRW_MAX_IMAGES + \ 2 /* shader time, pull constants */) #define SURF_INDEX_GEN6_SOL_BINDING(t) (t) -#define BRW_MAX_GEN6_GS_SURFACES SURF_INDEX_GEN6_SOL_BINDING(BRW_MAX_SOL_BINDINGS) + +/* Note: brw_gs_prog_data_compare() must be updated when adding fields to + * this struct! + */ +struct brw_gs_prog_data +{ + struct brw_vue_prog_data base; + + /** + * Size of an output vertex, measured in HWORDS (32 bytes). + */ + unsigned output_vertex_size_hwords; + + unsigned output_topology; + + /** + * Size of the control data (cut bits or StreamID bits), in hwords (32 + * bytes). 0 if there is no control data. + */ + unsigned control_data_header_size_hwords; + + /** + * Format of the control data (either GEN7_GS_CONTROL_DATA_FORMAT_GSCTL_SID + * if the control data is StreamID bits, or + * GEN7_GS_CONTROL_DATA_FORMAT_GSCTL_CUT if the control data is cut bits). + * Ignored if control_data_header_size is 0. + */ + unsigned control_data_format; + + bool include_primitive_id; + + int invocations; + + /** + * Dispatch mode, can be any of: + * GEN7_GS_DISPATCH_MODE_DUAL_OBJECT + * GEN7_GS_DISPATCH_MODE_DUAL_INSTANCE + * GEN7_GS_DISPATCH_MODE_SINGLE + */ + int dispatch_mode; + + /** + * Gen6 transform feedback enabled flag. + */ + bool gen6_xfb_enabled; + + /** + * Gen6: Provoking vertex convention for odd-numbered triangles + * in tristrips. + */ + GLuint pv_first:1; + + /** + * Gen6: Number of varyings that are output to transform feedback. + */ + GLuint num_transform_feedback_bindings:7; /* 0-BRW_MAX_SOL_BINDINGS */ + + /** + * Gen6: Map from the index of a transform feedback binding table entry to the + * gl_varying_slot that should be streamed out through that binding table + * entry. + */ + unsigned char transform_feedback_bindings[BRW_MAX_SOL_BINDINGS]; + + /** + * Gen6: Map from the index of a transform feedback binding table entry to the + * swizzles that should be used when streaming out data through that + * binding table entry. + */ + unsigned char transform_feedback_swizzles[BRW_MAX_SOL_BINDINGS]; +}; /** * Stride in bytes between shader_time entries. @@ -648,34 +741,10 @@ struct brw_gs_prog_data */ #define SHADER_TIME_STRIDE 64 -enum brw_cache_id { - BRW_CC_VP, - BRW_CC_UNIT, - BRW_WM_PROG, - BRW_BLORP_BLIT_PROG, - BRW_BLORP_CONST_COLOR_PROG, - BRW_SAMPLER, - BRW_WM_UNIT, - BRW_SF_PROG, - BRW_SF_VP, - BRW_SF_UNIT, /* scissor state on gen6 */ - BRW_VS_UNIT, - BRW_VS_PROG, - BRW_FF_GS_UNIT, - BRW_FF_GS_PROG, - BRW_GS_PROG, - BRW_CLIP_VP, - BRW_CLIP_UNIT, - BRW_CLIP_PROG, - - BRW_MAX_CACHE -}; - struct brw_cache_item { /** * Effectively part of the key, cache_id identifies what kind of state - * buffer is involved, and also which brw->state.dirty.cache flag should - * be set when this cache item is chosen. + * buffer is involved, and also which dirty flag should set. */ enum brw_cache_id cache_id; /** 32-bit hash of the key data */ @@ -742,27 +811,6 @@ enum shader_time_shader_type { ST_FS16_RESET, }; -/* Flags for brw->state.cache. - */ -#define CACHE_NEW_CC_VP (1<