On Thu, Aug 20, 2015 at 7:20 AM, Francisco Jerez <curroje...@riseup.net> wrote: > Jason Ekstrand <ja...@jlekstrand.net> writes: > >> This way they don't implicitly increment the uniforms variable and don't >> have to be called in-sequence during uniform setup. >> >> Cc: Francisco Jerez <curroje...@riseup.net> >> --- >> src/mesa/drivers/dri/i965/brw_fs.cpp | 7 ++++--- >> src/mesa/drivers/dri/i965/brw_fs.h | 3 ++- >> src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 7 +++++-- >> src/mesa/drivers/dri/i965/brw_shader.cpp | 16 +++++++++------- >> src/mesa/drivers/dri/i965/brw_shader.h | 6 ++++-- >> src/mesa/drivers/dri/i965/brw_vec4.h | 3 ++- >> src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 18 ++++++++++++------ >> 7 files changed, 38 insertions(+), 22 deletions(-) >> >> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp >> b/src/mesa/drivers/dri/i965/brw_fs.cpp >> index 47cc167..6ee9f3a 100644 >> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp >> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp >> @@ -943,16 +943,17 @@ fs_visitor::import_uniforms(fs_visitor *v) >> } >> >> void >> -fs_visitor::setup_vec4_uniform_value(const gl_constant_value *values, >> +fs_visitor::setup_vec4_uniform_value(unsigned param_offset, >> + const gl_constant_value *values, >> unsigned n) >> { >> static const gl_constant_value zero = { 0 }; >> >> for (unsigned i = 0; i < n; ++i) >> - stage_prog_data->param[uniforms++] = &values[i]; >> + stage_prog_data->param[param_offset + i] = &values[i]; >> >> for (unsigned i = n; i < 4; ++i) >> - stage_prog_data->param[uniforms++] = &zero; >> + stage_prog_data->param[param_offset + i] = &zero; >> } >> >> fs_reg * >> diff --git a/src/mesa/drivers/dri/i965/brw_fs.h >> b/src/mesa/drivers/dri/i965/brw_fs.h >> index 1a56c2a..9484e63 100644 >> --- a/src/mesa/drivers/dri/i965/brw_fs.h >> +++ b/src/mesa/drivers/dri/i965/brw_fs.h >> @@ -291,7 +291,8 @@ public: >> >> struct brw_reg interp_reg(int location, int channel); >> >> - virtual void setup_vec4_uniform_value(const gl_constant_value *values, >> + virtual void setup_vec4_uniform_value(unsigned param_offset, >> + const gl_constant_value *values, >> unsigned n); >> >> int implied_mrf_writes(fs_inst *inst); >> diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp >> b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp >> index ce4153d..7873d3f 100644 >> --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp >> +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp >> @@ -244,10 +244,13 @@ fs_visitor::nir_setup_uniform(nir_variable *var) >> * space for them here at the end of the parameter array. >> */ >> var->data.driver_location = uniforms; >> - param_size[uniforms] = >> + unsigned size = > > const?
That line gets deleted 3 or 4 patches later so I'd rather not deal with the merge conflicts. >> BRW_IMAGE_PARAM_SIZE * MAX2(storage->array_elements, 1); >> >> - setup_image_uniform_values(storage); >> + setup_image_uniform_values(uniforms, storage); >> + >> + param_size[uniforms] = size; >> + uniforms += size; >> } else { >> unsigned slots = storage->type->component_slots(); >> if (storage->array_elements) >> diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp >> b/src/mesa/drivers/dri/i965/brw_shader.cpp >> index 48fbe8f..a7453fa 100644 >> --- a/src/mesa/drivers/dri/i965/brw_shader.cpp >> +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp >> @@ -1420,7 +1420,8 @@ >> backend_shader::assign_common_binding_table_offsets(uint32_t >> next_binding_table_ >> } >> >> void >> -backend_shader::setup_image_uniform_values(const gl_uniform_storage >> *storage) >> +backend_shader::setup_image_uniform_values(unsigned param_offset, >> + const gl_uniform_storage >> *storage) >> { >> const unsigned stage = _mesa_program_enum_to_shader_stage(prog->Target); >> >> @@ -1431,18 +1432,19 @@ backend_shader::setup_image_uniform_values(const >> gl_uniform_storage *storage) >> /* Upload the brw_image_param structure. The order is expected to >> match >> * the BRW_IMAGE_PARAM_*_OFFSET defines. >> */ >> - setup_vec4_uniform_value( >> + setup_vec4_uniform_value(param_offset, >> (const gl_constant_value *)¶m->surface_idx, 1); >> - setup_vec4_uniform_value( >> + setup_vec4_uniform_value(param_offset + 4, >> (const gl_constant_value *)param->offset, 2); >> - setup_vec4_uniform_value( >> + setup_vec4_uniform_value(param_offset + 8, >> (const gl_constant_value *)param->size, 3); >> - setup_vec4_uniform_value( >> + setup_vec4_uniform_value(param_offset + 12, >> (const gl_constant_value *)param->stride, 4); >> - setup_vec4_uniform_value( >> + setup_vec4_uniform_value(param_offset + 16, >> (const gl_constant_value *)param->tiling, 3); >> - setup_vec4_uniform_value( >> + setup_vec4_uniform_value(param_offset + 20, >> (const gl_constant_value *)param->swizzling, 2); >> + param_offset += 24; >> > These could use the symbolic BRW_IMAGE_PARAM_* defines instead of > hardcoded constants. With that fixed: I'd forgotten those existed. Fixed locally. > Reviewed-by: Francisco Jerez <curroje...@riseup.net> Thanks! >> brw_mark_surface_used( >> stage_prog_data, >> diff --git a/src/mesa/drivers/dri/i965/brw_shader.h >> b/src/mesa/drivers/dri/i965/brw_shader.h >> index 933869a..d449ffa 100644 >> --- a/src/mesa/drivers/dri/i965/brw_shader.h >> +++ b/src/mesa/drivers/dri/i965/brw_shader.h >> @@ -270,9 +270,11 @@ public: >> >> virtual void invalidate_live_intervals() = 0; >> >> - virtual void setup_vec4_uniform_value(const gl_constant_value *values, >> + virtual void setup_vec4_uniform_value(unsigned param_offset, >> + const gl_constant_value *values, >> unsigned n) = 0; >> - void setup_image_uniform_values(const gl_uniform_storage *storage); >> + void setup_image_uniform_values(unsigned param_offset, >> + const gl_uniform_storage *storage); >> }; >> >> uint32_t brw_texture_offset(int *offsets, unsigned num_components); >> diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h >> b/src/mesa/drivers/dri/i965/brw_vec4.h >> index f8f31fc..b21f8dc 100644 >> --- a/src/mesa/drivers/dri/i965/brw_vec4.h >> +++ b/src/mesa/drivers/dri/i965/brw_vec4.h >> @@ -177,7 +177,8 @@ public: >> void fail(const char *msg, ...); >> >> void setup_uniform_clipplane_values(gl_clip_plane *clip_planes); >> - virtual void setup_vec4_uniform_value(const gl_constant_value *values, >> + virtual void setup_vec4_uniform_value(unsigned param_offset, >> + const gl_constant_value *values, >> unsigned n); >> void setup_uniform_values(ir_variable *ir); >> void setup_builtin_uniform_values(ir_variable *ir); >> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp >> b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp >> index 64d4abe..f5701c8 100644 >> --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp >> +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp >> @@ -696,18 +696,21 @@ dst_reg::dst_reg(class vec4_visitor *v, const struct >> glsl_type *type) >> } >> >> void >> -vec4_visitor::setup_vec4_uniform_value(const gl_constant_value *values, >> +vec4_visitor::setup_vec4_uniform_value(unsigned param_offset, >> + const gl_constant_value *values, >> unsigned n) >> { >> static const gl_constant_value zero = { 0 }; >> >> + assert(param_offset % 4 == 0); >> + >> for (unsigned i = 0; i < n; ++i) >> - stage_prog_data->param[4 * uniforms + i] = &values[i]; >> + stage_prog_data->param[param_offset + i] = &values[i]; >> >> for (unsigned i = n; i < 4; ++i) >> - stage_prog_data->param[4 * uniforms + i] = &zero; >> + stage_prog_data->param[param_offset + i] = &zero; >> >> - uniform_vector_size[uniforms++] = n; >> + uniform_vector_size[param_offset / 4] = n; >> } >> >> /* Our support for uniforms is piggy-backed on the struct >> @@ -743,9 +746,12 @@ vec4_visitor::setup_uniform_values(ir_variable *ir) >> storage->type->matrix_columns); >> const unsigned vector_size = storage->type->vector_elements; >> >> - for (unsigned s = 0; s < vector_count; s++) >> - setup_vec4_uniform_value(&storage->storage[s * vector_size], >> + for (unsigned s = 0; s < vector_count; s++) { >> + setup_vec4_uniform_value(uniforms * 4, >> + &storage->storage[s * vector_size], >> vector_size); >> + uniforms++; >> + } >> } >> } >> >> -- >> 2.4.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev