[Mesa-dev] [PATCH] glsl: reduce memory footprint of uniform_storage struct
Timothy Arceri
t_arceri at yahoo.com.au
Tue Sep 29 19:25:01 PDT 2015
The uniform will only be of a single type so store the data for
opaque types in a single array.
---
src/glsl/ir_uniform.h | 6 +---
src/glsl/link_uniform_initializers.cpp | 12 +++----
src/glsl/link_uniforms.cpp | 41 +++++++++++-------------
src/glsl/linker.cpp | 2 +-
src/glsl/nir/nir_lower_samplers.c | 4 +--
src/glsl/tests/set_uniform_initializer_tests.cpp | 8 ++---
src/mesa/drivers/dri/i965/brw_shader.cpp | 2 +-
src/mesa/main/shaderapi.c | 2 +-
src/mesa/main/uniform_query.cpp | 8 ++---
src/mesa/program/ir_to_mesa.cpp | 5 +--
src/mesa/program/sampler.cpp | 4 +--
11 files changed, 43 insertions(+), 51 deletions(-)
diff --git a/src/glsl/ir_uniform.h b/src/glsl/ir_uniform.h
index 858a7da..50fe76b 100644
--- a/src/glsl/ir_uniform.h
+++ b/src/glsl/ir_uniform.h
@@ -110,11 +110,7 @@ struct gl_uniform_storage {
*/
bool initialized;
- struct gl_opaque_uniform_index sampler[MESA_SHADER_STAGES];
-
- struct gl_opaque_uniform_index image[MESA_SHADER_STAGES];
-
- struct gl_opaque_uniform_index subroutine[MESA_SHADER_STAGES];
+ struct gl_opaque_uniform_index opaque[MESA_SHADER_STAGES];
/**
* Storage used by the driver for the uniform
diff --git a/src/glsl/link_uniform_initializers.cpp b/src/glsl/link_uniform_initializers.cpp
index 3483082..0918d2a 100644
--- a/src/glsl/link_uniform_initializers.cpp
+++ b/src/glsl/link_uniform_initializers.cpp
@@ -134,16 +134,16 @@ set_opaque_binding(gl_shader_program *prog, const char *name, int binding)
if (shader) {
if (storage->type->base_type == GLSL_TYPE_SAMPLER &&
- storage->sampler[sh].active) {
+ storage->opaque[sh].active) {
for (unsigned i = 0; i < elements; i++) {
- const unsigned index = storage->sampler[sh].index + i;
+ const unsigned index = storage->opaque[sh].index + i;
shader->SamplerUnits[index] = storage->storage[i].i;
}
} else if (storage->type->base_type == GLSL_TYPE_IMAGE &&
- storage->image[sh].active) {
+ storage->opaque[sh].active) {
for (unsigned i = 0; i < elements; i++) {
- const unsigned index = storage->image[sh].index + i;
+ const unsigned index = storage->opaque[sh].index + i;
shader->ImageUnits[index] = storage->storage[i].i;
}
}
@@ -243,8 +243,8 @@ set_uniform_initializer(void *mem_ctx, gl_shader_program *prog,
for (int sh = 0; sh < MESA_SHADER_STAGES; sh++) {
gl_shader *shader = prog->_LinkedShaders[sh];
- if (shader && storage->sampler[sh].active) {
- unsigned index = storage->sampler[sh].index;
+ if (shader && storage->opaque[sh].active) {
+ unsigned index = storage->opaque[sh].index;
shader->SamplerUnits[index] = storage->storage[0].i;
}
diff --git a/src/glsl/link_uniforms.cpp b/src/glsl/link_uniforms.cpp
index 47d49c8..b92e73c 100644
--- a/src/glsl/link_uniforms.cpp
+++ b/src/glsl/link_uniforms.cpp
@@ -566,7 +566,7 @@ private:
struct gl_uniform_storage *uniform, const char *name)
{
if (base_type->is_sampler()) {
- uniform->sampler[shader_type].active = true;
+ uniform->opaque[shader_type].active = true;
/* Handle multiple samplers inside struct arrays */
if (this->record_array_count > 1) {
@@ -586,8 +586,8 @@ private:
/* In this case, we've already seen this uniform so we just use
* the next sampler index recorded the last time we visited.
*/
- uniform->sampler[shader_type].index = index;
- index = inner_array_size + uniform->sampler[shader_type].index;
+ uniform->opaque[shader_type].index = index;
+ index = inner_array_size + uniform->opaque[shader_type].index;
this->record_next_sampler->put(index, name_copy);
ralloc_free(name_copy);
@@ -605,13 +605,13 @@ private:
* structs. This allows the offset to be easily calculated for
* indirect indexing.
*/
- uniform->sampler[shader_type].index = this->next_sampler;
+ uniform->opaque[shader_type].index = this->next_sampler;
this->next_sampler +=
inner_array_size * this->record_array_count;
/* Store the next index for future passes over the struct array
*/
- index = uniform->sampler[shader_type].index + inner_array_size;
+ index = uniform->opaque[shader_type].index + inner_array_size;
this->record_next_sampler->put(index, name_copy);
ralloc_free(name_copy);
}
@@ -619,22 +619,19 @@ private:
/* Increment the sampler by 1 for non-arrays and by the number of
* array elements for arrays.
*/
- uniform->sampler[shader_type].index = this->next_sampler;
+ uniform->opaque[shader_type].index = this->next_sampler;
this->next_sampler += MAX2(1, uniform->array_elements);
}
const gl_texture_index target = base_type->sampler_index();
const unsigned shadow = base_type->sampler_shadow;
- for (unsigned i = uniform->sampler[shader_type].index;
+ for (unsigned i = uniform->opaque[shader_type].index;
i < MIN2(this->next_sampler, MAX_SAMPLERS);
i++) {
this->targets[i] = target;
this->shader_samplers_used |= 1U << i;
this->shader_shadow_samplers |= shadow << i;
}
- } else {
- uniform->sampler[shader_type].index = ~0;
- uniform->sampler[shader_type].active = false;
}
}
@@ -642,17 +639,14 @@ private:
struct gl_uniform_storage *uniform)
{
if (base_type->is_image()) {
- uniform->image[shader_type].index = this->next_image;
- uniform->image[shader_type].active = true;
+ uniform->opaque[shader_type].index = this->next_image;
+ uniform->opaque[shader_type].active = true;
/* Increment the image index by 1 for non-arrays and by the
* number of array elements for arrays.
*/
this->next_image += MAX2(1, uniform->array_elements);
- } else {
- uniform->image[shader_type].index = ~0;
- uniform->image[shader_type].active = false;
}
}
@@ -660,17 +654,14 @@ private:
struct gl_uniform_storage *uniform)
{
if (base_type->is_subroutine()) {
- uniform->subroutine[shader_type].index = this->next_subroutine;
- uniform->subroutine[shader_type].active = true;
+ uniform->opaque[shader_type].index = this->next_subroutine;
+ uniform->opaque[shader_type].active = true;
/* Increment the subroutine index by 1 for non-arrays and by the
* number of array elements for arrays.
*/
this->next_subroutine += MAX2(1, uniform->array_elements);
- } else {
- uniform->subroutine[shader_type].index = ~0;
- uniform->subroutine[shader_type].active = false;
}
}
@@ -738,6 +729,10 @@ private:
base_type = type;
}
+ /* Initialise opaque data */
+ this->uniforms[id].opaque[shader_type].index = ~0;
+ this->uniforms[id].opaque[shader_type].active = false;
+
/* This assigns uniform indices to sampler and image uniforms. */
handle_samplers(base_type, &this->uniforms[id], name);
handle_images(base_type, &this->uniforms[id]);
@@ -1029,7 +1024,7 @@ link_set_image_access_qualifiers(struct gl_shader_program *prog)
assert(found);
(void) found;
const gl_uniform_storage *storage = &prog->UniformStorage[id];
- const unsigned index = storage->image[i].index;
+ const unsigned index = storage->opaque[i].index;
const GLenum access = (var->data.image_read_only ? GL_READ_ONLY :
var->data.image_write_only ? GL_WRITE_ONLY :
GL_READ_WRITE);
@@ -1238,7 +1233,7 @@ link_assign_uniform_locations(struct gl_shader_program *prog,
if (!sh)
continue;
- if (!uniforms[i].subroutine[j].active)
+ if (!uniforms[i].opaque[j].active)
continue;
/* How many new entries for this uniform? */
@@ -1268,7 +1263,7 @@ link_assign_uniform_locations(struct gl_shader_program *prog,
if (!sh)
continue;
- if (!uniforms[i].subroutine[j].active)
+ if (!uniforms[i].opaque[j].active)
continue;
sh->SubroutineUniformRemapTable =
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 87c7d4b..ccbcda2 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -3439,7 +3439,7 @@ build_program_resource_list(struct gl_shader_program *shProg)
continue;
for (int j = MESA_SHADER_VERTEX; j < MESA_SHADER_STAGES; j++) {
- if (!shProg->UniformStorage[i].subroutine[j].active)
+ if (!shProg->UniformStorage[i].opaque[j].active)
continue;
type = _mesa_shader_stage_to_subroutine_uniform((gl_shader_stage)j);
diff --git a/src/glsl/nir/nir_lower_samplers.c b/src/glsl/nir/nir_lower_samplers.c
index 58ea0db..5df79a6 100644
--- a/src/glsl/nir/nir_lower_samplers.c
+++ b/src/glsl/nir/nir_lower_samplers.c
@@ -131,13 +131,13 @@ lower_sampler(nir_tex_instr *instr, const struct gl_shader_program *shader_progr
}
if (location > shader_program->NumUniformStorage - 1 ||
- !shader_program->UniformStorage[location].sampler[stage].active) {
+ !shader_program->UniformStorage[location].opaque[stage].active) {
assert(!"cannot return a sampler");
return;
}
instr->sampler_index +=
- shader_program->UniformStorage[location].sampler[stage].index;
+ shader_program->UniformStorage[location].opaque[stage].index;
instr->sampler = NULL;
}
diff --git a/src/glsl/tests/set_uniform_initializer_tests.cpp b/src/glsl/tests/set_uniform_initializer_tests.cpp
index 91227d9..0b1f66c 100644
--- a/src/glsl/tests/set_uniform_initializer_tests.cpp
+++ b/src/glsl/tests/set_uniform_initializer_tests.cpp
@@ -117,8 +117,8 @@ establish_uniform_storage(struct gl_shader_program *prog, unsigned num_storage,
prog->UniformStorage[index_to_set].array_elements = array_size;
prog->UniformStorage[index_to_set].initialized = false;
for (int sh = 0; sh < MESA_SHADER_STAGES; sh++) {
- prog->UniformStorage[index_to_set].sampler[sh].index = ~0;
- prog->UniformStorage[index_to_set].sampler[sh].active = false;
+ prog->UniformStorage[index_to_set].opaque[sh].index = ~0;
+ prog->UniformStorage[index_to_set].opaque[sh].active = false;
}
prog->UniformStorage[index_to_set].num_driver_storage = 0;
prog->UniformStorage[index_to_set].driver_storage = NULL;
@@ -138,8 +138,8 @@ establish_uniform_storage(struct gl_shader_program *prog, unsigned num_storage,
prog->UniformStorage[i].array_elements = 0;
prog->UniformStorage[i].initialized = false;
for (int sh = 0; sh < MESA_SHADER_STAGES; sh++) {
- prog->UniformStorage[i].sampler[sh].index = ~0;
- prog->UniformStorage[i].sampler[sh].active = false;
+ prog->UniformStorage[i].opaque[sh].index = ~0;
+ prog->UniformStorage[i].opaque[sh].active = false;
}
prog->UniformStorage[i].num_driver_storage = 0;
prog->UniformStorage[i].driver_storage = NULL;
diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp
index 785cb27..c29005c 100644
--- a/src/mesa/drivers/dri/i965/brw_shader.cpp
+++ b/src/mesa/drivers/dri/i965/brw_shader.cpp
@@ -1434,7 +1434,7 @@ backend_shader::setup_image_uniform_values(unsigned param_offset,
const unsigned stage = _mesa_program_enum_to_shader_stage(prog->Target);
for (unsigned i = 0; i < MAX2(storage->array_elements, 1); i++) {
- const unsigned image_idx = storage->image[stage].index + i;
+ const unsigned image_idx = storage->opaque[stage].index + i;
const brw_image_param *param = &stage_prog_data->image_param[image_idx];
/* Upload the brw_image_param structure. The order is expected to match
diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
index 82a1ec3..bbe8520 100644
--- a/src/mesa/main/shaderapi.c
+++ b/src/mesa/main/shaderapi.c
@@ -2597,7 +2597,7 @@ _mesa_GetUniformSubroutineuiv(GLenum shadertype, GLint location,
{
struct gl_uniform_storage *uni = sh->SubroutineUniformRemapTable[location];
- int offset = location - uni->subroutine[stage].index;
+ int offset = location - uni->opaque[stage].index;
memcpy(params, &uni->storage[offset],
sizeof(GLuint));
}
diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
index 0bee594..70dfb34 100644
--- a/src/mesa/main/uniform_query.cpp
+++ b/src/mesa/main/uniform_query.cpp
@@ -805,11 +805,11 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
/* If the shader stage doesn't use the sampler uniform, skip this.
*/
- if (sh == NULL || !uni->sampler[i].active)
+ if (sh == NULL || !uni->opaque[i].active)
continue;
for (int j = 0; j < count; j++) {
- sh->SamplerUnits[uni->sampler[i].index + offset + j] =
+ sh->SamplerUnits[uni->opaque[i].index + offset + j] =
((unsigned *) values)[j];
}
@@ -851,11 +851,11 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
*/
if (uni->type->is_image()) {
for (int i = 0; i < MESA_SHADER_STAGES; i++) {
- if (uni->image[i].active) {
+ if (uni->opaque[i].active) {
struct gl_shader *sh = shProg->_LinkedShaders[i];
for (int j = 0; j < count; j++)
- sh->ImageUnits[uni->image[i].index + offset + j] =
+ sh->ImageUnits[uni->opaque[i].index + offset + j] =
((GLint *) values)[j];
}
}
diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
index 4201a80..98d6faf 100644
--- a/src/mesa/program/ir_to_mesa.cpp
+++ b/src/mesa/program/ir_to_mesa.cpp
@@ -2354,11 +2354,12 @@ add_uniform_to_shader::visit_field(const glsl_type *type, const char *name,
struct gl_uniform_storage *storage =
&this->shader_program->UniformStorage[location];
- assert(storage->sampler[shader_type].active);
+ assert(storage->type->is_sampler() &&
+ storage->opaque[shader_type].active);
for (unsigned int j = 0; j < size / 4; j++)
params->ParameterValues[index + j][0].f =
- storage->sampler[shader_type].index + j;
+ storage->opaque[shader_type].index + j;
}
}
diff --git a/src/mesa/program/sampler.cpp b/src/mesa/program/sampler.cpp
index ea3024d..adfe18e 100644
--- a/src/mesa/program/sampler.cpp
+++ b/src/mesa/program/sampler.cpp
@@ -120,7 +120,7 @@ _mesa_get_sampler_uniform_value(class ir_dereference *sampler,
return 0;
}
- if (!shader_program->UniformStorage[location].sampler[shader].active) {
+ if (!shader_program->UniformStorage[location].opaque[shader].active) {
assert(0 && "cannot return a sampler");
linker_error(shader_program,
"cannot return a sampler named %s, because it is not "
@@ -129,7 +129,7 @@ _mesa_get_sampler_uniform_value(class ir_dereference *sampler,
return 0;
}
- return shader_program->UniformStorage[location].sampler[shader].index +
+ return shader_program->UniformStorage[location].opaque[shader].index +
getname.offset;
}
--
2.4.3
More information about the mesa-dev
mailing list