[Mesa-dev] [PATCH 15/28] glsl: add support for packing varyings with explicit locations
Anuj Phogat
anuj.phogat at gmail.com
Wed Jan 20 09:32:51 PST 2016
On Mon, Dec 28, 2015 at 9:00 PM, Timothy Arceri
<timothy.arceri at collabora.com> wrote:
> ---
> src/glsl/lower_packed_varyings.cpp | 45 +++++++++++++++++++++++++++-----------
> 1 file changed, 32 insertions(+), 13 deletions(-)
>
> diff --git a/src/glsl/lower_packed_varyings.cpp b/src/glsl/lower_packed_varyings.cpp
> index d91aa22..2899846 100644
> --- a/src/glsl/lower_packed_varyings.cpp
> +++ b/src/glsl/lower_packed_varyings.cpp
> @@ -178,11 +178,13 @@ private:
> void bitwise_assign_unpack(ir_rvalue *lhs, ir_rvalue *rhs);
> unsigned lower_rvalue(ir_rvalue *rvalue, unsigned fine_location,
> ir_variable *unpacked_var, const char *name,
> - bool gs_input_toplevel, unsigned vertex_index);
> + bool gs_input_toplevel, unsigned vertex_index,
> + bool explicit_location);
> unsigned lower_arraylike(ir_rvalue *rvalue, unsigned array_size,
> unsigned fine_location,
> ir_variable *unpacked_var, const char *name,
> - bool gs_input_toplevel, unsigned vertex_index);
> + bool gs_input_toplevel, unsigned vertex_index,
> + bool explicit_location);
> ir_dereference *get_packed_varying_deref(unsigned location,
> ir_variable *unpacked_var,
> const char *name,
> @@ -294,7 +296,8 @@ lower_packed_varyings_visitor::run(struct gl_shader *shader)
>
> /* Recursively pack or unpack it. */
> this->lower_rvalue(deref, var->data.location * 4 + var->data.location_frac, var,
> - var->name, this->gs_input_vertices != 0, 0);
> + var->name, this->gs_input_vertices != 0, 0,
> + var->data.explicit_location);
> }
> }
>
> @@ -426,7 +429,8 @@ lower_packed_varyings_visitor::lower_rvalue(ir_rvalue *rvalue,
> ir_variable *unpacked_var,
> const char *name,
> bool gs_input_toplevel,
> - unsigned vertex_index)
> + unsigned vertex_index,
> + bool explicit_location)
> {
> unsigned dmul = rvalue->type->is_double() ? 2 : 1;
> /* When gs_input_toplevel is set, we should be looking at a geometry shader
> @@ -445,7 +449,7 @@ lower_packed_varyings_visitor::lower_rvalue(ir_rvalue *rvalue,
> = ralloc_asprintf(this->mem_ctx, "%s.%s", name, field_name);
> fine_location = this->lower_rvalue(dereference_record, fine_location,
> unpacked_var, deref_name, false,
> - vertex_index);
> + vertex_index, explicit_location);
> }
> return fine_location;
> } else if (rvalue->type->is_array()) {
> @@ -454,14 +458,15 @@ lower_packed_varyings_visitor::lower_rvalue(ir_rvalue *rvalue,
> */
> return this->lower_arraylike(rvalue, rvalue->type->array_size(),
> fine_location, unpacked_var, name,
> - gs_input_toplevel, vertex_index);
> + gs_input_toplevel, vertex_index,
> + explicit_location);
> } else if (rvalue->type->is_matrix()) {
> /* Matrices are packed/unpacked by considering each column vector in
> * sequence.
> */
> return this->lower_arraylike(rvalue, rvalue->type->matrix_columns,
> fine_location, unpacked_var, name,
> - false, vertex_index);
> + false, vertex_index, explicit_location);
> } else if (rvalue->type->vector_elements * dmul +
> fine_location % 4 > 4) {
> /* This vector is going to be "double parked" across two varying slots,
> @@ -502,12 +507,13 @@ lower_packed_varyings_visitor::lower_rvalue(ir_rvalue *rvalue,
> if (left_components)
> fine_location = this->lower_rvalue(left_swizzle, fine_location,
> unpacked_var, left_name, false,
> - vertex_index);
> + vertex_index, explicit_location);
> else
> /* Top up the fine location to the next slot */
> fine_location++;
> return this->lower_rvalue(right_swizzle, fine_location, unpacked_var,
> - right_name, false, vertex_index);
> + right_name, false, vertex_index,
> + explicit_location);
> } else {
> /* No special handling is necessary; pack the rvalue into the
> * varying.
> @@ -528,7 +534,17 @@ lower_packed_varyings_visitor::lower_rvalue(ir_rvalue *rvalue,
> } else {
> this->bitwise_assign_unpack(rvalue, swizzle);
> }
> - return fine_location + components;
> +
> + /* Explicitly packed components are packed by interleaving arrays, so
> + * simply bump the location by 4 to increment the location to the next
> + * element.
> + *
> + * Otherwise we pack arrays elements end to end.
> + */
Can you help me understand this comment using an example?
> + if (explicit_location) {
> + return fine_location + 4;
> + } else
> + return fine_location + components;
> }
> }
>
> @@ -554,7 +570,8 @@ lower_packed_varyings_visitor::lower_arraylike(ir_rvalue *rvalue,
> ir_variable *unpacked_var,
> const char *name,
> bool gs_input_toplevel,
> - unsigned vertex_index)
> + unsigned vertex_index,
> + bool explicit_location)
> {
> for (unsigned i = 0; i < array_size; i++) {
> if (i != 0)
> @@ -568,14 +585,16 @@ lower_packed_varyings_visitor::lower_arraylike(ir_rvalue *rvalue,
> * are at the same location, but with a different vertex index.
> */
> (void) this->lower_rvalue(dereference_array, fine_location,
> - unpacked_var, name, false, i);
> + unpacked_var, name, false, i,
> + explicit_location);
> } else {
> char *subscripted_name
> = ralloc_asprintf(this->mem_ctx, "%s[%d]", name, i);
> +
> fine_location =
> this->lower_rvalue(dereference_array, fine_location,
> unpacked_var, subscripted_name,
> - false, vertex_index);
> + false, vertex_index, explicit_location);
> }
> }
> return fine_location;
> --
> 2.4.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list