--- src/mesa/drivers/dri/i965/brw_fs.cpp | 36 +++++++++++++++------ src/mesa/drivers/dri/i965/brw_fs.h | 4 +++ src/mesa/drivers/dri/i965/brw_shader.cpp | 25 +++++++++++++++ src/mesa/drivers/dri/i965/brw_shader.h | 4 +++ src/mesa/drivers/dri/i965/brw_vec4.h | 2 ++ src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 44 +++++++++++++++++--------- 6 files changed, 90 insertions(+), 25 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index cce6ed0..ca152d1 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -505,6 +505,8 @@ fs_visitor::type_size(const struct glsl_type *type) return 0; case GLSL_TYPE_ATOMIC_UINT: return 0; + case GLSL_TYPE_IMAGE: + return BRW_IMAGE_PARAM_SIZE; case GLSL_TYPE_VOID: case GLSL_TYPE_ERROR: case GLSL_TYPE_INTERFACE: @@ -871,6 +873,20 @@ fs_visitor::import_uniforms(fs_visitor *v) this->nr_params_remap = v->nr_params_remap; } +void +fs_visitor::setup_vector_uniform_values(void *values, unsigned stride, + unsigned size) +{ + static float zero = 0; + + for (unsigned i = 0; i < size; ++i) + stage_prog_data->param[uniforms++] = + (float *)((char *)values + i * stride); + + for (unsigned i = size; i < 4; ++i) + stage_prog_data->param[uniforms++] = &zero; +} + /* Our support for uniforms is piggy-backed on the struct * gl_fragment_program, because that's where the values actually * get stored, rather than in some global gl_shader_program uniform @@ -887,7 +903,6 @@ fs_visitor::setup_uniform_values(ir_variable *ir) * 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 = uniforms; for (unsigned u = 0; u < shader_prog->NumUserUniformStorage; u++) { struct gl_uniform_storage *storage = &shader_prog->UniformStorage[u]; @@ -898,17 +913,18 @@ fs_visitor::setup_uniform_values(ir_variable *ir) continue; } - unsigned slots = storage->type->component_slots(); - if (storage->array_elements) - slots *= storage->array_elements; + if (storage->type->is_image()) { + setup_image_uniform_values(storage); - for (unsigned i = 0; i < slots; i++) - stage_prog_data->param[uniforms++] = &storage->storage[i].f; - } + } else { + unsigned slots = storage->type->component_slots(); + if (storage->array_elements) + slots *= storage->array_elements; - /* Make sure we actually initialized the right amount of stuff here. */ - assert(params_before + ir->type->component_slots() == uniforms); - (void)params_before; + for (unsigned i = 0; i < slots; i++) + stage_prog_data->param[uniforms++] = &storage->storage[i].f; + } + } } diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index 7bfa9fd..eb71676 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -434,8 +434,12 @@ public: fs_reg get_timestamp(); struct brw_reg interp_reg(int location, int channel); + + virtual void setup_vector_uniform_values(void *values, unsigned stride, + unsigned size); void setup_uniform_values(ir_variable *ir); void setup_builtin_uniform_values(ir_variable *ir); + int implied_mrf_writes(fs_inst *inst); void dump_instruction(backend_instruction *inst); diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp index dc6d35e..d903bb5 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.cpp +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp @@ -310,6 +310,8 @@ brw_type_for_base_type(const struct glsl_type *type) * way to trip up if we don't. */ return BRW_REGISTER_TYPE_UD; + case GLSL_TYPE_IMAGE: + return BRW_REGISTER_TYPE_UD; case GLSL_TYPE_VOID: case GLSL_TYPE_ERROR: case GLSL_TYPE_INTERFACE: @@ -761,3 +763,26 @@ backend_visitor::assign_common_binding_table_offsets(uint32_t next_binding_table /* prog_data->base.binding_table.size will be set by brw_mark_surface_used. */ } + +void +backend_visitor::setup_image_uniform_values(const gl_uniform_storage *storage) +{ + const unsigned stage = _mesa_program_target_to_index(prog->Target); + + for (unsigned i = 0; i < MAX2(storage->array_elements, 1); i++) { + const unsigned image_idx = storage->image[stage].index + i; + brw_image_param *param = &stage_prog_data->image_param[image_idx]; + + param->surface_idx = + stage_prog_data->binding_table.image_start + image_idx; + + setup_vector_uniform_values(¶m->surface_idx, sizeof(uint32_t), 1); + setup_vector_uniform_values(param->offset, sizeof(uint32_t), 2); + setup_vector_uniform_values(param->size, sizeof(uint32_t), 3); + setup_vector_uniform_values(param->stride, sizeof(uint32_t), 4); + setup_vector_uniform_values(param->tiling, sizeof(uint32_t), 3); + setup_vector_uniform_values(param->swizzling, sizeof(uint32_t), 2); + + brw_mark_surface_used(stage_prog_data, param->surface_idx); + } +} diff --git a/src/mesa/drivers/dri/i965/brw_shader.h b/src/mesa/drivers/dri/i965/brw_shader.h index 48382af..90b8157 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.h +++ b/src/mesa/drivers/dri/i965/brw_shader.h @@ -150,6 +150,10 @@ public: void assign_common_binding_table_offsets(uint32_t next_binding_table_offset); virtual void invalidate_live_intervals() = 0; + + virtual void setup_vector_uniform_values(void *values, unsigned stride, + unsigned size) = 0; + void setup_image_uniform_values(const gl_uniform_storage *storage); }; uint32_t brw_texture_offset(struct gl_context *ctx, ir_constant *offset); diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h index 7e07929..989c1a9 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.h +++ b/src/mesa/drivers/dri/i965/brw_vec4.h @@ -377,6 +377,8 @@ public: int virtual_grf_alloc(int size); void setup_uniform_clipplane_values(); + virtual void setup_vector_uniform_values(void *values, unsigned stride, + unsigned size); void setup_uniform_values(ir_variable *ir); void setup_builtin_uniform_values(ir_variable *ir); int setup_uniforms(int payload_reg); diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp index 97bd26d..3e8043f 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp @@ -570,6 +570,8 @@ type_size(const struct glsl_type *type) return 1; case GLSL_TYPE_ATOMIC_UINT: return 0; + case GLSL_TYPE_IMAGE: + return BRW_IMAGE_PARAM_SIZE / 4; case GLSL_TYPE_VOID: case GLSL_TYPE_ERROR: case GLSL_TYPE_INTERFACE: @@ -631,6 +633,22 @@ dst_reg::dst_reg(class vec4_visitor *v, const struct glsl_type *type) this->type = brw_type_for_base_type(type); } +void +vec4_visitor::setup_vector_uniform_values(void *values, unsigned stride, + unsigned size) +{ + static float zero = 0; + + for (unsigned i = 0; i < size; ++i) + stage_prog_data->param[4 * uniforms + i] = + (float *)((char *)values + i * stride); + + for (unsigned i = size; i < 4; ++i) + stage_prog_data->param[4 * uniforms + i] = &zero; + + uniform_vector_size[uniforms++] = size; +} + /* Our support for uniforms is piggy-backed on the struct * gl_fragment_program, because that's where the values actually * get stored, rather than in some global gl_shader_program uniform @@ -657,24 +675,20 @@ vec4_visitor::setup_uniform_values(ir_variable *ir) continue; } - gl_constant_value *components = storage->storage; - unsigned vector_count = (MAX2(storage->array_elements, 1) * - storage->type->matrix_columns); + if (storage->type->is_image()) { + setup_image_uniform_values(storage); - for (unsigned s = 0; s < vector_count; s++) { - uniform_vector_size[uniforms] = storage->type->vector_elements; + } else { + gl_constant_value *components = storage->storage; + unsigned vector_count = (MAX2(storage->array_elements, 1) * + storage->type->matrix_columns); - int i; - for (i = 0; i < uniform_vector_size[uniforms]; i++) { - stage_prog_data->param[uniforms * 4 + i] = &components->f; - components++; - } - for (; i < 4; i++) { - static float zero = 0; - stage_prog_data->param[uniforms * 4 + i] = &zero; - } + for (unsigned s = 0; s < vector_count; s++) { + setup_vector_uniform_values(&components->f, sizeof(*components), + storage->type->vector_elements); - uniforms++; + components += storage->type->vector_elements; + } } } } -- 1.8.3.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev