[Mesa-dev] [PATCH v2 04/11] glsl: Pack integer and double varyings as flat even if interpolation mode is none
Ian Romanick
idr at freedesktop.org
Fri Jun 17 03:04:54 UTC 2016
On 06/16/2016 12:07 PM, Ian Romanick wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
>
> v2: Also update varying_matches::compute_packing_class(). Suggested by
> Timothy Arceri.
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=96358
> Cc: "12.0" <mesa-stable at lists.freedesktop.org>
> Cc: Gregory Hainaut <gregory.hainaut at gmail.com>
> Cc: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
> src/compiler/glsl/ir.h | 7 +++++++
> src/compiler/glsl/link_varyings.cpp | 3 ++-
> src/compiler/glsl/lower_packed_varyings.cpp | 11 ++++++-----
> 3 files changed, 15 insertions(+), 6 deletions(-)
>
> diff --git a/src/compiler/glsl/ir.h b/src/compiler/glsl/ir.h
> index 3629356..e5b8154 100644
> --- a/src/compiler/glsl/ir.h
> +++ b/src/compiler/glsl/ir.h
> @@ -590,6 +590,13 @@ public:
> return this->u.state_slots;
> }
>
> + inline bool is_interpolation_flat() const
> + {
> + return this->data.interpolation == INTERP_QUALIFIER_FLAT ||
> + this->type->contains_integer() ||
> + this->type->contains_double();
> + }
> +
> inline bool is_name_ralloced() const
> {
> return this->name != ir_variable::tmp_name;
> diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp
> index ef8bdbe..84686ee 100644
> --- a/src/compiler/glsl/link_varyings.cpp
> +++ b/src/compiler/glsl/link_varyings.cpp
> @@ -1610,7 +1610,8 @@ varying_matches::compute_packing_class(const ir_variable *var)
> unsigned packing_class = var->data.centroid | (var->data.sample << 1) |
> (var->data.patch << 2);
> packing_class *= 4;
> - packing_class += var->data.interpolation;
> + packing_class += var->is_interpolation_flat()
> + ? INTERP_QUALIFIER_FLAT : data.interpolation;
I had fixed the two bugs in this line, but I didn't squash the !fixup
patch before sending this out. This should obviously be:
packing_class += var->is_interpolation_flat()
? unsigned(INTERP_QUALIFIER_FLAT) : var->data.interpolation;
D'oh!
> return packing_class;
> }
>
> diff --git a/src/compiler/glsl/lower_packed_varyings.cpp b/src/compiler/glsl/lower_packed_varyings.cpp
> index 130b8f6..9aa463c 100644
> --- a/src/compiler/glsl/lower_packed_varyings.cpp
> +++ b/src/compiler/glsl/lower_packed_varyings.cpp
> @@ -273,11 +273,11 @@ lower_packed_varyings_visitor::run(struct gl_shader *shader)
> continue;
>
> /* This lowering pass is only capable of packing floats and ints
> - * together when their interpolation mode is "flat". Therefore, to be
> - * safe, caller should ensure that integral varyings always use flat
> - * interpolation, even when this is not required by GLSL.
> + * together when their interpolation mode is "flat". Treat integers as
> + * being flat when the interpolation mode is none.
> */
> assert(var->data.interpolation == INTERP_QUALIFIER_FLAT ||
> + var->data.interpolation == INTERP_QUALIFIER_NONE ||
> !var->type->contains_integer());
>
> /* Clone the variable for program resource list before
> @@ -607,7 +607,7 @@ lower_packed_varyings_visitor::get_packed_varying_deref(
> if (this->packed_varyings[slot] == NULL) {
> char *packed_name = ralloc_asprintf(this->mem_ctx, "packed:%s", name);
> const glsl_type *packed_type;
> - if (unpacked_var->data.interpolation == INTERP_QUALIFIER_FLAT)
> + if (unpacked_var->is_interpolation_flat())
> packed_type = glsl_type::ivec4_type;
> else
> packed_type = glsl_type::vec4_type;
> @@ -627,7 +627,8 @@ lower_packed_varyings_visitor::get_packed_varying_deref(
> packed_var->data.centroid = unpacked_var->data.centroid;
> packed_var->data.sample = unpacked_var->data.sample;
> packed_var->data.patch = unpacked_var->data.patch;
> - packed_var->data.interpolation = unpacked_var->data.interpolation;
> + packed_var->data.interpolation = packed_type == glsl_type::ivec4_type
> + ? unsigned(INTERP_QUALIFIER_FLAT) : unpacked_var->data.interpolation;
> packed_var->data.location = location;
> packed_var->data.precision = unpacked_var->data.precision;
> packed_var->data.always_active_io = unpacked_var->data.always_active_io;
>
More information about the mesa-dev
mailing list