[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