[Mesa-dev] [PATCH 08/10] glsl: Add a lowering pass for packing varyings.
Paul Berry
stereotype441 at gmail.com
Wed Dec 12 16:23:04 PST 2012
On 12 December 2012 14:49, Eric Anholt <eric at anholt.net> wrote:
> Paul Berry <stereotype441 at gmail.com> writes:
> > diff --git a/src/glsl/lower_packed_varyings.cpp
> b/src/glsl/lower_packed_varyings.cpp
> > new file mode 100644
> > index 0000000..4cb9066
> > --- /dev/null
> > +++ b/src/glsl/lower_packed_varyings.cpp
> > @@ -0,0 +1,371 @@
> > +/*
> > + * Copyright © 2011 Intel Corporation
>
> 2012
>
> > +/**
> > + * \file lower_varyings_to_packed.cpp
>
> lower_packed_varyings.cpp
>
> > + /**
> > + * Number of generic varying slots which are used by this shader.
> This is
> > + * used to allocate temporary intermediate data structures. If any
> any
>
> Too many "any"s.
>
> > + * varying used by this shader has a location greater than or equal
> to
> > + * location_base + locations_used, an assertion will fire.
> > + */
> > + const unsigned locations_used;
>
>
> > +ir_visitor_status
> > +lower_packed_varyings_visitor::visit(ir_variable *var)
> > +{
> > + if (var->mode != this->mode ||
> > + var->location < (int) this->location_base ||
> > + !this->needs_lowering(var))
> > + return visit_continue;
> > +
> > + /* Change the old varying into an ordinary global. */
> > + var->mode = ir_var_auto;
> > +
> > + /* Create a reference to the old varying. */
> > + ir_dereference_variable *deref
> > + = new(this->mem_ctx) ir_dereference_variable(var);
> > +
> > + /* Recursively pack or unpack it. */
> > + this->lower_rvalue(deref, var->location * 4 + var->location_frac,
> var);
> > +
> > + return visit_continue;
> > +}
>
> I think an alternative here, instead of using the visitor class and
> skipping functions, would be to just walk the top-level ir_instruction
> list, check if it's a variable, and the run this function body on it.
>
Yeah, I considered that too. I don't really have a strong preference
either way.
>
> > +unsigned
> > +lower_packed_varyings_visitor::lower_rvalue(ir_rvalue *rvalue,
> > + unsigned fine_location,
> > + ir_variable *unpacked_var)
> > +{
>
> I will admit I didn't totally follow the path of the swizzles through
> this code, but that's my fault and I expect testing to have covered it.
>
> > + unsigned slot = location - this->location_base;
> > + assert(slot < locations_used);
> > + if (this->packed_varyings[slot] == NULL) {
> > + char name[10];
> > + sprintf(name, "packed%d", slot);
>
> Bonus points if this could also strcat the variable names contributing
> to it somehow. Turning all my FS inputs into packedN is ugly for shader
> debugging.
>
Yeah, I can see why that would be useful. I'll spend a little time on it
and see if I can do it without complicating the code too much--if I can't,
I'll leave the bonus points available for someone else to pick up :)
>
> > + const glsl_type *packed_type;
> > + switch (unpacked_var->type->get_scalar_type()->base_type) {
> > + case GLSL_TYPE_UINT:
> > + packed_type = glsl_type::uvec4_type;
> > + break;
> > + case GLSL_TYPE_INT:
> > + packed_type = glsl_type::ivec4_type;
> > + break;
> > + case GLSL_TYPE_FLOAT:
> > + packed_type = glsl_type::vec4_type;
> > + break;
> > + case GLSL_TYPE_BOOL:
> > + /* Note: in theory bools aren't supposed to be allowed to be
> > + * varyings, however Mesa doesn't know to reject them yet.
> Until
> > + * this is fixed, we might as well allow them to be packed too.
> > + */
> > + packed_type = glsl_type::bvec4_type;
> > + break;
> > + default:
> > + assert(!"Unexpected varying type while packing");
> > + packed_type = glsl_type::vec4_type;
> > + break;
> > + }
>
> Maybe just:
>
> packed_type = get_instance(unpacked_var->get_scalar_type()->base_type, 4,
> 1);
>
Aha, yes! That's way better.
>
> At this point I've read through the series, and only had trivial
> review/suggestions. Fix what you like and:
>
> Reviewed-by: Eric Anholt <eric at anholt.net>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20121212/c02b9d4e/attachment-0001.html>
More information about the mesa-dev
mailing list