From 3e81c666db6940675eca623044e5b372dc6b7756 Mon Sep 17 00:00:00 2001 From: Paul Berry Date: Wed, 5 Dec 2012 10:47:55 -0800 Subject: [PATCH] glsl: Create a field to store fractional varying locations. Currently, the location of each varying is recorded in ir_variable as a multiple of the size of a vec4. In order to pack varyings, we need to be able to record, e.g. that a vec2 is stored in the second half of a varying slot rather than the first half. This patch introduces a field ir_variable::location_frac, which represents the offset within a vec4 where a varying's value is stored. Varyings that are not subject to packing will always have a location_frac value of zero. Reviewed-by: Eric Anholt Reviewed-by: Ian Romanick --- src/glsl/ir.cpp | 1 + src/glsl/ir.h | 9 +++++++++ src/glsl/linker.cpp | 6 ++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp index 7b0a487b6fc..703f5ec58ef 100644 --- a/src/glsl/ir.cpp +++ b/src/glsl/ir.cpp @@ -1492,6 +1492,7 @@ ir_variable::ir_variable(const struct glsl_type *type, const char *name, this->explicit_location = false; this->has_initializer = false; this->location = -1; + this->location_frac = 0; this->uniform_block = -1; this->warn_extension = NULL; this->constant_value = NULL; diff --git a/src/glsl/ir.h b/src/glsl/ir.h index e2ecb3d9dfd..85fc5ce95da 100644 --- a/src/glsl/ir.h +++ b/src/glsl/ir.h @@ -445,6 +445,15 @@ public: */ unsigned is_unmatched_generic_inout:1; + /** + * If non-zero, then this variable may be packed along with other variables + * into a single varying slot, so this offset should be applied when + * accessing components. For example, an offset of 1 means that the x + * component of this variable is actually stored in component y of the + * location specified by \c location. + */ + unsigned location_frac:2; + /** * \brief Layout qualifier for gl_FragDepth. * diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index ee6dc2596d0..b13a6aa1ab6 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -226,10 +226,12 @@ link_invalidate_variable_locations(gl_shader *sh, int input_base, if ((var->location >= base) && !var->explicit_location) var->location = -1; - if ((var->location == -1) && !var->explicit_location) + if ((var->location == -1) && !var->explicit_location) { var->is_unmatched_generic_inout = 1; - else + var->location_frac = 0; + } else { var->is_unmatched_generic_inout = 0; + } } } -- 2.30.2