diff options
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.cpp | 70 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.h | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 2 |
3 files changed, 30 insertions, 44 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index e157dc29155..ae26d07e03d 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -792,55 +792,41 @@ fs_visitor::import_uniforms(fs_visitor *v) * get stored, rather than in some global gl_shader_program uniform * store. */ -int -fs_visitor::setup_uniform_values(int loc, const glsl_type *type) +void +fs_visitor::setup_uniform_values(ir_variable *ir) { - unsigned int offset = 0; - - if (type->is_matrix()) { - const glsl_type *column = glsl_type::get_instance(GLSL_TYPE_FLOAT, - type->vector_elements, - 1); - - for (unsigned int i = 0; i < type->matrix_columns; i++) { - offset += setup_uniform_values(loc + offset, column); - } - - return offset; - } + int namelen = strlen(ir->name); - switch (type->base_type) { - case GLSL_TYPE_FLOAT: - case GLSL_TYPE_UINT: - case GLSL_TYPE_INT: - case GLSL_TYPE_BOOL: - for (unsigned int i = 0; i < type->vector_elements; i++) { - c->prog_data.param[c->prog_data.nr_params++] = - &fp->Base.Parameters->ParameterValues[loc][i].f; + /* The data for our (non-builtin) uniforms is stored in a series of + * gl_uniform_driver_storage structs for each subcomponent that + * glGetUniformLocation() could name. We know it's been set up in the same + * order we'd walk the type, so walk the list of storage and find anything + * with our name, or the prefix of a component that starts with our name. + */ + unsigned params_before = c->prog_data.nr_params; + for (unsigned u = 0; u < prog->NumUserUniformStorage; u++) { + struct gl_uniform_storage *storage = &prog->UniformStorage[u]; + + if (strncmp(ir->name, storage->name, namelen) != 0 || + (storage->name[namelen] != 0 && + storage->name[namelen] != '.' && + storage->name[namelen] != '[')) { + continue; } - return 1; - case GLSL_TYPE_STRUCT: - for (unsigned int i = 0; i < type->length; i++) { - offset += setup_uniform_values(loc + offset, - type->fields.structure[i].type); - } - return offset; + unsigned slots = storage->type->component_slots(); + if (storage->array_elements) + slots *= storage->array_elements; - case GLSL_TYPE_ARRAY: - for (unsigned int i = 0; i < type->length; i++) { - offset += setup_uniform_values(loc + offset, type->fields.array); + for (unsigned i = 0; i < slots; i++) { + c->prog_data.param[c->prog_data.nr_params++] = + &storage->storage[i].f; } - return offset; - - case GLSL_TYPE_SAMPLER: - /* The sampler takes up a slot, but we don't use any values from it. */ - return 1; - - default: - assert(!"not reached"); - return 0; } + + /* Make sure we actually initialized the right amount of stuff here. */ + assert(params_before + ir->type->component_slots() == + c->prog_data.nr_params); } diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index d80129887bc..bcf38f3cf79 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -407,7 +407,7 @@ public: fs_reg get_timestamp(); struct brw_reg interp_reg(int location, int channel); - int setup_uniform_values(int loc, const glsl_type *type); + void setup_uniform_values(ir_variable *ir); void setup_builtin_uniform_values(ir_variable *ir); int implied_mrf_writes(fs_inst *inst); diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index d85d48b81be..e70d6bf89c5 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -121,7 +121,7 @@ fs_visitor::visit(ir_variable *ir) if (!strncmp(ir->name, "gl_", 3)) { setup_builtin_uniform_values(ir); } else { - setup_uniform_values(ir->location, ir->type); + setup_uniform_values(ir); } reg = new(this->mem_ctx) fs_reg(UNIFORM, param_index); |