[Mesa-dev] [PATCH 03/22] glsl: Add a "ubo_load" expression type for fetches from UBOs.
Kenneth Graunke
kenneth at whitecape.org
Tue Jul 31 23:19:28 PDT 2012
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.romanick at 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".
More information about the mesa-dev
mailing list