-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256
On 10/03/16 19:58, Matt Turner wrote: > On Thu, Mar 10, 2016 at 10:13 AM, Topi Pohjolainen > <topi.pohjolai...@intel.com> wrote: >> Uniform linking in (see link_assign_uniform_locations()) already >> stores the index to the storage in ir_variable which is further >> stored into nir_variable (see nir_visitor::visit(ir_variable >> *)). >> >> Instead of doing uniform_num^2 string comparisons one can recur >> over the uniform type the same way uniform linking does. >> >> Unfortunately I didn't see any improvement in performance tests, >> at least on BDW. Only the the fps numbers in a few synthetic >> benchmarks started to vary more than before between two >> subsequent runs. >> >> CC: Kenneth Graunke <kenn...@whitecape.org> Signed-off-by: Topi >> Pohjolainen <topi.pohjolai...@intel.com> --- >> src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp | 113 >> +++++++++++++++---------- 1 file changed, 67 insertions(+), 46 >> deletions(-) >> >> diff --git a/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp >> b/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp index >> f3361d6..f8ee0af 100644 --- >> a/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp +++ >> b/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp @@ -67,62 +67,83 >> @@ brw_nir_setup_glsl_builtin_uniform(nir_variable *var, } >> >> static void -brw_nir_setup_glsl_uniform(gl_shader_stage stage, >> nir_variable *var, - struct >> gl_shader_program *shader_prog, >> +brw_nir_setup_glsl_uniform(gl_shader_stage stage, bool >> is_scalar, struct brw_stage_prog_data *stage_prog_data, - >> bool is_scalar) + const struct >> gl_uniform_storage *storage, + unsigned >> *uniform_index) { - int namelen = strlen(var->name); - - /* >> 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 uniform_index = var->data.driver_location / 4; - for >> (unsigned u = 0; u < shader_prog->NumUniformStorage; u++) { - >> struct gl_uniform_storage *storage = >> &shader_prog->UniformStorage[u]; - - if (storage->builtin) - >> continue; + if (storage->type->is_image()) { + >> brw_setup_image_uniform_values(stage, stage_prog_data, + >> *uniform_index, storage); + *uniform_index += + >> BRW_IMAGE_PARAM_SIZE * MAX2(storage->array_elements, 1); + } >> else { + gl_constant_value *components = storage->storage; + >> unsigned vector_count = (MAX2(storage->array_elements, 1) * + >> storage->type->matrix_columns); + unsigned vector_size = >> storage->type->vector_elements; + + for (unsigned s = 0; s < >> vector_count; s++) { + unsigned i; + for (i = 0; >> i < vector_size; i++) { + >> stage_prog_data->param[(*uniform_index)++] = components++; + >> } >> >> - if (strncmp(var->name, storage->name, namelen) != 0 || - >> (storage->name[namelen] != 0 && - >> storage->name[namelen] != '.' && - >> storage->name[namelen] != '[')) { - continue; + >> if (!is_scalar) { + /* Pad out with zeros if needed >> (only needed for vec4) */ + for (; i < 4; i++) { + >> static const gl_constant_value zero = { 0.0 }; + >> stage_prog_data->param[(*uniform_index)++] = &zero; + >> } + } } + } +} >> >> - if (storage->type->is_image()) { - >> brw_setup_image_uniform_values(stage, stage_prog_data, - >> uniform_index, storage); - uniform_index += - >> BRW_IMAGE_PARAM_SIZE * MAX2(storage->array_elements, 1); - } >> else { - gl_constant_value *components = >> storage->storage; - unsigned vector_count = >> (MAX2(storage->array_elements, 1) * - >> storage->type->matrix_columns); - unsigned vector_size = >> storage->type->vector_elements; - - for (unsigned s = 0; >> s < vector_count; s++) { - unsigned i; - >> for (i = 0; i < vector_size; i++) { - >> stage_prog_data->param[uniform_index++] = components++; - >> } +/* This mirrors the breakdown of complex uniforms in >> link_uniforms.cpp */ +static void >> +brw_nir_recur_to_glsl_uniform(gl_shader_stage stage, bool >> is_scalar, + struct >> brw_stage_prog_data *stage_prog_data, + >> const struct gl_uniform_storage **storage, + >> unsigned *uniform_index, const glsl_type *t) +{ + >> assert(!t->is_interface() && >> !t->without_array()->is_interface()); >> >> - if (!is_scalar) { - /* Pad out with >> zeros if needed (only needed for vec4) */ - for (; >> i < 4; i++) { - static const gl_constant_value >> zero = { 0.0 }; - >> stage_prog_data->param[uniform_index++] = &zero; - >> } - } - } + if (t->is_record()) { + for >> (unsigned i = 0; i < t->length; i++) { + >> brw_nir_recur_to_glsl_uniform(stage, is_scalar, stage_prog_data, >> + storage, uniform_index, + >> t->fields.structure[i].type); + } + } else if >> (t->without_array()->is_record() || + (t->is_array() >> && t->fields.array->is_array())) { + for (unsigned i = 0; i >> < t->length; i++) { + >> brw_nir_recur_to_glsl_uniform(stage, is_scalar, stage_prog_data, >> + storage, uniform_index, + >> t->fields.array); } + } else { + >> brw_nir_setup_glsl_uniform(stage, is_scalar, stage_prog_data, + >> *storage, uniform_index); + ++(*storage); } } >> >> +static void +brw_nir_setup_glsl_uniform(gl_shader_stage stage, >> nir_variable *var, + struct >> gl_shader_program *shader_prog, + >> struct brw_stage_prog_data *stage_prog_data, + >> bool is_scalar) +{ + const unsigned location = >> var->data.location; + const struct gl_uniform_storage * storage >> = > > No space between * and variable name. With this change and assuming no regressions: Reviewed-by: Samuel Iglesias Gonsálvez <sigles...@igalia.com> > _______________________________________________ mesa-dev mailing > list mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev > -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJW6pSdAAoJEH/0ujLxfcNDf6IP/34xkqgjG+PgJorAxScRhO52 SQE++EhNNBbJLex9iRvLSALf/TWXtDZFPEnPI9QNYVF5kwwL7WSHtmZUqyD5W2q7 RIAJn3tEjZwSP74IqKNW0wWTkfLxasMMnjuYf2SSfGpRDQyzeQbkjaGZDYLC8Y/Y 95UVMh1pAsqqvY/vXD9SLaBFjrvz0E1Cc26jBtxqnUuSC+6Rss1VZ++BIdsnTUJD rhCgAvjcpCaRTmen+q08HnyHx6oOGaNNtMlqJOXqCbZRDrw0PGEetwlVV29jRQ/z E0a//SddDgZRloC+Q8Q+CexcIbhEJlCcwp0eQMjQD+McNCHKekRmNdCrZ15mOUDV ysPyY/YPAb56OLD3AKClQzz+xTmaJ2Ckb81oUalHMI/LV65fHaj2lMwTXz0CZgy4 KCk3P9KLL4576FL5NXBFw0F6veEyENRECV/P7Ot81GgBB5Ef4bLqa8sT+F8QmZ6n EyEP13SQadoS5kG2HiIfWPBRQGBNyC9haFdJ33CKcjDa/n5tVhPELtC4nyZL3/WI P41J9KDaCDlklyN0XmxbpESvCrTGh6JuzaWXiTDdYp6RJJbPYlXov0TMFfi3bwYF 8uWEyCAkbqOUP388nbX1yQELWGi2segdYnznHbikLm8ogvszOYsdRx8Ij7upCLkd wqb1zQycuZHrEHNmgwoB =AlIf -----END PGP SIGNATURE----- _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev