[Mesa-dev] [PATCH 1/5] i965: Move program key structures to brw_program.h.
Kenneth Graunke
kenneth at whitecape.org
Mon Dec 1 02:00:35 PST 2014
With fs_visitor/fs_generator being reused for SIMD8 VS/GS programs,
we're running into weird #include patterns, where scalar code #includes
brw_vec4.h and such.
Program keys aren't really related to SIMD4X2/SIMD8 execution - they
mostly capture NOS for a particular shader stage. Consolidating them
all in one place that's vec4/scalar neutral should help avoid problems.
Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
src/mesa/drivers/dri/i965/brw_program.h | 108 ++++++++++++++++++++++--
src/mesa/drivers/dri/i965/brw_vec4.h | 22 -----
src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.h | 9 --
src/mesa/drivers/dri/i965/brw_vs.h | 22 -----
src/mesa/drivers/dri/i965/brw_wm.h | 24 ------
5 files changed, 103 insertions(+), 82 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_program.h b/src/mesa/drivers/dri/i965/brw_program.h
index 672777f..5328e3c 100644
--- a/src/mesa/drivers/dri/i965/brw_program.h
+++ b/src/mesa/drivers/dri/i965/brw_program.h
@@ -24,11 +24,25 @@
#ifndef BRW_PROGRAM_H
#define BRW_PROGRAM_H
-enum 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 */
-};
+/**
+ * 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.
+ *
+ * @{
+ */
/**
* Sampler information needed by VS, WM, and GS program cache keys.
@@ -57,6 +71,90 @@ struct brw_sampler_prog_key_data {
uint8_t gen6_gather_wa[MAX_SAMPLERS];
};
+
+struct brw_vec4_prog_key {
+ GLuint program_string_id;
+
+ /**
+ * True if at least one clip flag is enabled, regardless of whether the
+ * shader uses clip planes or gl_ClipDistance.
+ */
+ GLuint userclip_active:1;
+
+ /**
+ * How many user clipping planes are being uploaded to the vertex shader as
+ * push constants.
+ */
+ GLuint nr_userclip_plane_consts:4;
+
+ GLuint clamp_vertex_color:1;
+
+ struct brw_sampler_prog_key_data tex;
+};
+
+/** The program key for Vertex Shaders. */
+struct brw_vs_prog_key {
+ struct brw_vec4_prog_key base;
+
+ /*
+ * Per-attribute workaround flags
+ */
+ uint8_t gl_attrib_wa_flags[VERT_ATTRIB_MAX];
+
+ GLuint copy_edgeflag:1;
+
+ /**
+ * 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.
+ */
+ GLuint point_coord_replace:8;
+};
+
+/** The program key for Geometry Shaders. */
+struct brw_gs_prog_key
+{
+ struct brw_vec4_prog_key base;
+
+ GLbitfield64 input_varyings;
+};
+
+/** The program key for Fragment/Pixel Shaders. */
+struct brw_wm_prog_key {
+ uint8_t iz_lookup;
+ GLuint stats_wm:1;
+ GLuint flat_shade:1;
+ GLuint persample_shading:1;
+ GLuint persample_2x:1;
+ GLuint nr_color_regions:5;
+ GLuint replicate_alpha:1;
+ GLuint render_to_fbo:1;
+ GLuint clamp_fragment_color:1;
+ GLuint compute_pos_offset:1;
+ GLuint compute_sample_id:1;
+ GLuint line_aa:2;
+ GLuint high_quality_derivatives:1;
+
+ GLushort drawable_height;
+ GLbitfield64 input_slots_valid;
+ GLuint program_string_id:32;
+ GLenum alpha_test_func; /* < For Gen4/5 MRT alpha test */
+ float alpha_test_ref;
+
+ struct brw_sampler_prog_key_data tex;
+};
+
+/** @} */
+
+enum 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 */
+};
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h
index 7d814ca..066ea2e 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.h
+++ b/src/mesa/drivers/dri/i965/brw_vec4.h
@@ -49,28 +49,6 @@ struct brw_vec4_compile {
GLuint last_scratch; /**< measured in 32-byte (register size) units */
};
-
-struct brw_vec4_prog_key {
- GLuint program_string_id;
-
- /**
- * True if at least one clip flag is enabled, regardless of whether the
- * shader uses clip planes or gl_ClipDistance.
- */
- GLuint userclip_active:1;
-
- /**
- * How many user clipping planes are being uploaded to the vertex shader as
- * push constants.
- */
- GLuint nr_userclip_plane_consts:4;
-
- GLuint clamp_vertex_color:1;
-
- struct brw_sampler_prog_key_data tex;
-};
-
-
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.h b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.h
index 8bf11fa..bcb5a2b 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.h
+++ b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.h
@@ -32,15 +32,6 @@
#include "brw_vec4.h"
-
-struct brw_gs_prog_key
-{
- struct brw_vec4_prog_key base;
-
- GLbitfield64 input_varyings;
-};
-
-
/**
* Scratch data used when compiling a GLSL geometry shader.
*/
diff --git a/src/mesa/drivers/dri/i965/brw_vs.h b/src/mesa/drivers/dri/i965/brw_vs.h
index f6e6b31..93c5389 100644
--- a/src/mesa/drivers/dri/i965/brw_vs.h
+++ b/src/mesa/drivers/dri/i965/brw_vs.h
@@ -50,28 +50,6 @@
#define BRW_ATTRIB_WA_SIGN 32 /* interpret as signed in shader */
#define BRW_ATTRIB_WA_SCALE 64 /* interpret as scaled in shader */
-struct brw_vs_prog_key {
- struct brw_vec4_prog_key base;
-
- /*
- * Per-attribute workaround flags
- */
- uint8_t gl_attrib_wa_flags[VERT_ATTRIB_MAX];
-
- GLuint copy_edgeflag:1;
-
- /**
- * 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.
- */
- GLuint point_coord_replace:8;
-};
-
-
struct brw_vs_compile {
struct brw_vec4_compile base;
struct brw_vs_prog_key key;
diff --git a/src/mesa/drivers/dri/i965/brw_wm.h b/src/mesa/drivers/dri/i965/brw_wm.h
index 0e0039b..a12c7d4 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.h
+++ b/src/mesa/drivers/dri/i965/brw_wm.h
@@ -57,30 +57,6 @@
#define AA_SOMETIMES 1
#define AA_ALWAYS 2
-struct brw_wm_prog_key {
- uint8_t iz_lookup;
- GLuint stats_wm:1;
- GLuint flat_shade:1;
- GLuint persample_shading:1;
- GLuint persample_2x:1;
- GLuint nr_color_regions:5;
- GLuint replicate_alpha:1;
- GLuint render_to_fbo:1;
- GLuint clamp_fragment_color:1;
- GLuint compute_pos_offset:1;
- GLuint compute_sample_id:1;
- GLuint line_aa:2;
- GLuint high_quality_derivatives:1;
-
- GLushort drawable_height;
- GLbitfield64 input_slots_valid;
- GLuint program_string_id:32;
- GLenum alpha_test_func; /* < For Gen4/5 MRT alpha test */
- float alpha_test_ref;
-
- struct brw_sampler_prog_key_data tex;
-};
-
/**
* Compile a fragment shader.
*
--
2.1.3
More information about the mesa-dev
mailing list