summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2020-12-05 09:17:17 -0500
committerMarge Bot <eric+marge@anholt.net>2021-01-21 21:59:29 +0000
commit0c77190b312a495b010302b3fe9a097ddf8a7b30 (patch)
treedc65a70914e6bc264ef2679f21688d23903d536c
parente3a7acf9583444d426b9cbcc61cee34b4481b6ea (diff)
glsl: split gl_CurrentAttribFragMESA into elements
This reduces the constant buffer size by eliminating unused elements because it's no longer a uniform array that the compiler can't split. This looks silly, but there is no other way because all elements must be globally declared, which means they can't be generated by a loop. Reviewed-by: Eric Anholt <eric@anholt.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8183>
-rw-r--r--src/compiler/glsl/builtin_variables.cpp82
-rw-r--r--src/mesa/main/ff_fragment_shader.cpp11
2 files changed, 82 insertions, 11 deletions
diff --git a/src/compiler/glsl/builtin_variables.cpp b/src/compiler/glsl/builtin_variables.cpp
index d84cc66b992..2df045eb345 100644
--- a/src/compiler/glsl/builtin_variables.cpp
+++ b/src/compiler/glsl/builtin_variables.cpp
@@ -184,9 +184,43 @@ static const struct gl_builtin_uniform_element gl_FogParamsOptimizedMESA_element
{NULL, {STATE_FOG_PARAMS_OPTIMIZED}, SWIZZLE_XYZW},
};
-static const struct gl_builtin_uniform_element gl_CurrentAttribFragMESA_elements[] = {
- {NULL, {STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED, 0}, SWIZZLE_XYZW},
-};
+#define ATTRIB(i) \
+ static const struct gl_builtin_uniform_element gl_CurrentAttribFrag##i##MESA_elements[] = { \
+ {NULL, {STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED, i}, SWIZZLE_XYZW}, \
+ };
+
+ATTRIB(0)
+ATTRIB(1)
+ATTRIB(2)
+ATTRIB(3)
+ATTRIB(4)
+ATTRIB(5)
+ATTRIB(6)
+ATTRIB(7)
+ATTRIB(8)
+ATTRIB(9)
+ATTRIB(10)
+ATTRIB(11)
+ATTRIB(12)
+ATTRIB(13)
+ATTRIB(14)
+ATTRIB(15)
+ATTRIB(16)
+ATTRIB(17)
+ATTRIB(18)
+ATTRIB(19)
+ATTRIB(20)
+ATTRIB(21)
+ATTRIB(22)
+ATTRIB(23)
+ATTRIB(24)
+ATTRIB(25)
+ATTRIB(26)
+ATTRIB(27)
+ATTRIB(28)
+ATTRIB(29)
+ATTRIB(30)
+ATTRIB(31)
#define MATRIX(name, statevar) \
static const struct gl_builtin_uniform_element name ## _elements[] = { \
@@ -277,7 +311,39 @@ static const struct gl_builtin_uniform_desc _mesa_builtin_uniform_desc[] = {
STATEVAR(gl_NormalScale),
STATEVAR(gl_FogParamsOptimizedMESA),
- STATEVAR(gl_CurrentAttribFragMESA),
+
+ STATEVAR(gl_CurrentAttribFrag0MESA),
+ STATEVAR(gl_CurrentAttribFrag1MESA),
+ STATEVAR(gl_CurrentAttribFrag2MESA),
+ STATEVAR(gl_CurrentAttribFrag3MESA),
+ STATEVAR(gl_CurrentAttribFrag4MESA),
+ STATEVAR(gl_CurrentAttribFrag5MESA),
+ STATEVAR(gl_CurrentAttribFrag6MESA),
+ STATEVAR(gl_CurrentAttribFrag7MESA),
+ STATEVAR(gl_CurrentAttribFrag8MESA),
+ STATEVAR(gl_CurrentAttribFrag9MESA),
+ STATEVAR(gl_CurrentAttribFrag10MESA),
+ STATEVAR(gl_CurrentAttribFrag11MESA),
+ STATEVAR(gl_CurrentAttribFrag12MESA),
+ STATEVAR(gl_CurrentAttribFrag13MESA),
+ STATEVAR(gl_CurrentAttribFrag14MESA),
+ STATEVAR(gl_CurrentAttribFrag15MESA),
+ STATEVAR(gl_CurrentAttribFrag16MESA),
+ STATEVAR(gl_CurrentAttribFrag17MESA),
+ STATEVAR(gl_CurrentAttribFrag18MESA),
+ STATEVAR(gl_CurrentAttribFrag19MESA),
+ STATEVAR(gl_CurrentAttribFrag20MESA),
+ STATEVAR(gl_CurrentAttribFrag21MESA),
+ STATEVAR(gl_CurrentAttribFrag22MESA),
+ STATEVAR(gl_CurrentAttribFrag23MESA),
+ STATEVAR(gl_CurrentAttribFrag24MESA),
+ STATEVAR(gl_CurrentAttribFrag25MESA),
+ STATEVAR(gl_CurrentAttribFrag26MESA),
+ STATEVAR(gl_CurrentAttribFrag27MESA),
+ STATEVAR(gl_CurrentAttribFrag28MESA),
+ STATEVAR(gl_CurrentAttribFrag29MESA),
+ STATEVAR(gl_CurrentAttribFrag30MESA),
+ STATEVAR(gl_CurrentAttribFrag31MESA),
{NULL, NULL, 0}
};
@@ -960,7 +1026,13 @@ builtin_variable_generator::generate_uniforms()
state->OES_sample_variables_enable)
add_uniform(int_t, GLSL_PRECISION_LOW, "gl_NumSamples");
add_uniform(type("gl_DepthRangeParameters"), "gl_DepthRange");
- add_uniform(array(vec4_t, VARYING_SLOT_MAX), "gl_CurrentAttribFragMESA");
+
+ for (unsigned i = 0; i < VARYING_SLOT_VAR0; i++) {
+ char name[128];
+
+ snprintf(name, sizeof(name), "gl_CurrentAttribFrag%uMESA", i);
+ add_uniform(vec4_t, name);
+ }
if (compatibility) {
add_uniform(mat4_t, "gl_ModelViewMatrix");
diff --git a/src/mesa/main/ff_fragment_shader.cpp b/src/mesa/main/ff_fragment_shader.cpp
index 94ed943ab77..420163b3e99 100644
--- a/src/mesa/main/ff_fragment_shader.cpp
+++ b/src/mesa/main/ff_fragment_shader.cpp
@@ -363,14 +363,13 @@ static ir_rvalue *
get_current_attrib(texenv_fragment_program *p, GLuint attrib)
{
ir_variable *current;
- ir_rvalue *val;
+ char name[128];
+
+ snprintf(name, sizeof(name), "gl_CurrentAttribFrag%uMESA", attrib);
- current = p->shader->symbols->get_variable("gl_CurrentAttribFragMESA");
+ current = p->shader->symbols->get_variable(name);
assert(current);
- current->data.max_array_access = MAX2(current->data.max_array_access, (int)attrib);
- val = new(p->mem_ctx) ir_dereference_variable(current);
- ir_rvalue *index = new(p->mem_ctx) ir_constant(attrib);
- return new(p->mem_ctx) ir_dereference_array(val, index);
+ return new(p->mem_ctx) ir_dereference_variable(current);
}
static ir_rvalue *