So actually.... this isn't enough. For named blocks, the variable in question is the block var, not the actual field. So I also need to add a glsl_struct_field. And a few related items. Will resend this patch (potentially as a handful of patches).
On Mon, Jan 18, 2016 at 9:30 PM, Ilia Mirkin <imir...@alum.mit.edu> wrote: > Currently any access params (coherent/volatile/restrict) are being lost > when lowering to the ssbo load/store intrinsics. Keep track of the > variable being used, and bake its access params in as the last arg of > the load/store intrinsics. > > Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu> > Reviewed-by: Marek Olšák <marek.ol...@amd.com> > Reviewed-by: Iago Toral Quiroga <ito...@igalia.com> > --- > src/glsl/lower_ubo_reference.cpp | 23 +++++++++++++++++++++++ > src/glsl/nir/shader_enums.h | 10 ++++++++++ > 2 files changed, 33 insertions(+) > > diff --git a/src/glsl/lower_ubo_reference.cpp > b/src/glsl/lower_ubo_reference.cpp > index a172054..2fa50c7 100644 > --- a/src/glsl/lower_ubo_reference.cpp > +++ b/src/glsl/lower_ubo_reference.cpp > @@ -104,6 +104,7 @@ public: > > struct gl_shader *shader; > struct gl_uniform_buffer_variable *ubo_var; > + ir_variable *variable; > ir_rvalue *uniform_block; > bool progress; > }; > @@ -317,6 +318,7 @@ lower_ubo_reference_visitor::handle_rvalue(ir_rvalue > **rvalue) > this->buffer_access_type = > var->is_in_shader_storage_block() ? > ssbo_load_access : ubo_load_access; > + this->variable = var; > > /* Compute the offset to the start if the dereference as well as other > * information we need to configure the write > @@ -370,6 +372,14 @@ shader_storage_buffer_object(const > _mesa_glsl_parse_state *state) > return state->ARB_shader_storage_buffer_object_enable; > } > > +static uint32_t > +ssbo_access_params(const ir_variable *var) > +{ > + return (var->data.image_coherent ? ACCESS_COHERENT : 0) | > + (var->data.image_restrict ? ACCESS_RESTRICT : 0) | > + (var->data.image_volatile ? ACCESS_VOLATILE : 0); > +} > + > ir_call * > lower_ubo_reference_visitor::ssbo_store(void *mem_ctx, > ir_rvalue *deref, > @@ -394,6 +404,10 @@ lower_ubo_reference_visitor::ssbo_store(void *mem_ctx, > ir_variable(glsl_type::uint_type, "write_mask" , ir_var_function_in); > sig_params.push_tail(writemask_ref); > > + ir_variable *access_ref = new(mem_ctx) > + ir_variable(glsl_type::uint_type, "access" , ir_var_function_in); > + sig_params.push_tail(access_ref); > + > ir_function_signature *sig = new(mem_ctx) > ir_function_signature(glsl_type::void_type, > shader_storage_buffer_object); > assert(sig); > @@ -408,6 +422,7 @@ lower_ubo_reference_visitor::ssbo_store(void *mem_ctx, > call_params.push_tail(offset->clone(mem_ctx, NULL)); > call_params.push_tail(deref->clone(mem_ctx, NULL)); > call_params.push_tail(new(mem_ctx) ir_constant(write_mask)); > + call_params.push_tail(new(mem_ctx) > ir_constant(ssbo_access_params(variable))); > return new(mem_ctx) ir_call(sig, NULL, &call_params); > } > > @@ -426,6 +441,10 @@ lower_ubo_reference_visitor::ssbo_load(void *mem_ctx, > ir_variable(glsl_type::uint_type, "offset_ref" , ir_var_function_in); > sig_params.push_tail(offset_ref); > > + ir_variable *access_ref = new(mem_ctx) > + ir_variable(glsl_type::uint_type, "access" , ir_var_function_in); > + sig_params.push_tail(access_ref); > + > ir_function_signature *sig = > new(mem_ctx) ir_function_signature(type, shader_storage_buffer_object); > assert(sig); > @@ -444,6 +463,7 @@ lower_ubo_reference_visitor::ssbo_load(void *mem_ctx, > exec_list call_params; > call_params.push_tail(this->uniform_block->clone(mem_ctx, NULL)); > call_params.push_tail(offset->clone(mem_ctx, NULL)); > + call_params.push_tail(new(mem_ctx) > ir_constant(ssbo_access_params(variable))); > > return new(mem_ctx) ir_call(sig, deref_result, &call_params); > } > @@ -499,6 +519,7 @@ lower_ubo_reference_visitor::write_to_memory(void > *mem_ctx, > unsigned packing = var->get_interface_type()->interface_packing; > > this->buffer_access_type = ssbo_store_access; > + this->variable = var; > > /* Compute the offset to the start if the dereference as well as other > * information we need to configure the write > @@ -678,6 +699,7 @@ > lower_ubo_reference_visitor::process_ssbo_unsized_array_length(ir_rvalue > **rvalu > int unsized_array_stride = calculate_unsized_array_stride(deref, packing); > > this->buffer_access_type = ssbo_unsized_array_length_access; > + this->variable = var; > > /* Compute the offset to the start if the dereference as well as other > * information we need to calculate the length. > @@ -910,6 +932,7 @@ > lower_ubo_reference_visitor::lower_ssbo_atomic_intrinsic(ir_call *ir) > unsigned packing = var->get_interface_type()->interface_packing; > > this->buffer_access_type = ssbo_atomic_access; > + this->variable = var; > > setup_for_load_or_store(mem_ctx, var, deref, > &offset, &const_offset, > diff --git a/src/glsl/nir/shader_enums.h b/src/glsl/nir/shader_enums.h > index c747464..19610c9 100644 > --- a/src/glsl/nir/shader_enums.h > +++ b/src/glsl/nir/shader_enums.h > @@ -535,6 +535,16 @@ enum gl_frag_depth_layout > FRAG_DEPTH_LAYOUT_UNCHANGED > }; > > +/** > + * \brief Buffer access qualifiers > + */ > +enum gl_buffer_access_qualifier > +{ > + ACCESS_COHERENT = 1, > + ACCESS_RESTRICT = 2, > + ACCESS_VOLATILE = 4, > +}; > + > #ifdef __cplusplus > } /* extern "C" */ > #endif > -- > 2.4.10 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev