[Mesa-dev] [PATCH 2/2] glsl: Relax ir_quadop_bitfield_insert type restrictions.
Kenneth Graunke
kenneth at whitecape.org
Tue Jan 5 05:34:25 PST 2016
While GLSL restricts bitfieldInsert's offset and bits parameters to
be scalars, we shouldn't require this in the IR.
In particular, opt_vectorize() tries to combine
result.x = bitfieldInsert(src0.x, src1.x, src2.x, src3.x);
result.y = bitfieldInsert(src0.y, src1.y, src2.y, src3.y);
result.z = bitfieldInsert(src0.z, src1.z, src2.z, src3.z);
result.w = bitfieldInsert(src0.w, src1.w, src2.w, src3.w);
into a single ivec4 bitfieldInsert operation. This currently breaks,
because the last two types become ivec4 rather than int. It seems
perfectly reasonable to allow this.
i965 lowers ir_quadop_bitfield_insert to ir_binop_bfm and ir_triop_bfi,
which already lift these restrictions.
(I debated about using is_integer() or base_type == GLSL_TYPE_INT here;
I ended up relaxing it to allow either int/uint because ir_binop_bfm
and ir_triop_bfi do that already.)
Fixes assertion failures when compiling Shadow of Mordor vertex shaders
on i965 in vec4 mode (where OptimizeForAOS enables opt_vectorize()).
Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
Cc: Matt Turner <mattst88 at gmail.com>
Cc: mesa-stable at lists.freedesktop.org
---
src/glsl/ir_validate.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp
index dcc079c..b5eaaff 100644
--- a/src/glsl/ir_validate.cpp
+++ b/src/glsl/ir_validate.cpp
@@ -661,8 +661,8 @@ ir_validate::visit_leave(ir_expression *ir)
case ir_quadop_bitfield_insert:
assert(ir->operands[0]->type == ir->type);
assert(ir->operands[1]->type == ir->type);
- assert(ir->operands[2]->type == glsl_type::int_type);
- assert(ir->operands[3]->type == glsl_type::int_type);
+ assert(ir->operands[2]->type->is_integer());
+ assert(ir->operands[3]->type->is_integer());
break;
case ir_quadop_vector:
--
2.6.4
More information about the mesa-dev
mailing list