On 07/31/2012 03:01 PM, Eric Anholt wrote: > Drivers will probably want to be able to take UBO references in a > shader like: > > uniform ubo1 { > float a; > float b; > float c; > float d; > } > > void main() { > gl_FragColor = vec4(a, b, c, d); > } > > and generate a single aligned vec4 load out of the UBO. For intel, > this involves recognizing the shared offset of the aligned loads and > CSEing them out. Obviously that involves breaking things down to > loads from an offset from a particular UBO first. Thus, the driver > doesn't want to see > > variable_ref(ir_variable("a")), > > and even more so does it not want to see > > array_ref(record_ref(variable_ref(ir_variable("a")), > "field1"), variable_ref(ir_variable("i"))). > > where a.field1[i] is a row_major matrix. > > Instead, we're going to make a lowering pass to break UBO references > down to expressions that are obvious to codegen, and amenable to > merging through CSE. > > Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> > --- > src/glsl/ir.cpp | 1 + > src/glsl/ir.h | 11 ++++++++++- > src/glsl/ir_validate.cpp | 7 +++++++ > src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp | 5 +++++ > src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 4 ++++ > src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 4 ++++ > src/mesa/program/ir_to_mesa.cpp | 4 ++++ > src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 4 ++++ > 8 files changed, 39 insertions(+), 1 deletion(-) > > diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp > index b0e38d8..f59cdd2 100644 > --- a/src/glsl/ir.cpp > +++ b/src/glsl/ir.cpp > @@ -480,6 +480,7 @@ static const char *const operator_strs[] = { > "min", > "max", > "pow", > + "ubo_load", > "vector", > }; > > diff --git a/src/glsl/ir.h b/src/glsl/ir.h > index f019837..2807ba6 100644 > --- a/src/glsl/ir.h > +++ b/src/glsl/ir.h > @@ -1018,9 +1018,18 @@ enum ir_expression_operation { > ir_binop_pow, > > /** > + * Load a value the size of a given GLSL type from a uniform block. > + * > + * operand0 is the uniform block index in the linked shader. > + * operand1 is a constant or variable byte offset within the
Constant or variable...you don't say :) I'd just go with "byte offset within the uniform block". _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev