[Mesa-dev] [PATCH] st/mesa: swizzle argument when there's a vector size mismatch
Marek Olšák
maraeo at gmail.com
Mon Dec 4 19:50:29 UTC 2017
There is a typo, so it doesn't build.
It breaks these CTS tests:
gl45-cts at shader_multisample_interpolation@render at interpolate_at_offset*
Error:
state_tracker/st_glsl_to_tgsi.cpp:1347: void
glsl_to_tgsi_visitor::visit_expression(ir_expression*, st_src_reg*):
Assertion `ir->operands[1]->type->vector_elements == 1' failed.
The CTS shader is attached. (to be run with shader-db)
Marek
On Sat, Dec 2, 2017 at 5:35 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> GLSL IR operation arguments can sometimes have an implicit swizzle as a
> result of a vector arg and a scalar arg, where the scalar argument is
> implicitly expanded to the size of the vector argument.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103955
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
>
> I'm *pretty* sure I looked at all of ir_validate to make sure that this will
> be fine, but I wouldn't exclude the possibility that I missed some extremely
> odd case. Could use a piglit run.
>
> src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 21 +++++++++++++++++++++
> 1 file changed, 21 insertions(+)
>
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index 0772b736275..8ca337d16ec 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -1342,9 +1342,30 @@ glsl_to_tgsi_visitor::visit_expression(ir_expression* ir, st_src_reg *op)
>
> int vector_elements = ir->operands[0]->type->vector_elements;
> if (ir->operands[1]) {
> + st_src_reg *swz_op = NULL;
> + if (vector_elements > ir->operands[1]->type->vector_elements) {
> + assert(ir->operands[1]->type->vector_elements == 1);
> + swz_op = &op[1];
> + } else if (vector_elements < ir->operands[1]->type->vector_elements) {
> + assert(ir->operands[0]->type->vector_elements == 1);
> + swz_op = &op[0];
> + }
> + if (swz_op) {
> + uint16_t swizzle_x = GET_SWZ(swz_op->swizzle, 0);
> + swz_op->swizzle = MAKE_SWIZZLE4(swizzle_x, swizzle_x,
> + swizzle_x, swizzle_x);
> + }
> vector_elements = MAX2(vector_elements,
> ir->operands[1]->type->vector_elements);
> }
> + if (ir->operands[2] &&
> + ir->operands[2]->type->vector_elements != vector_elements) {
> + /* This can happen with ir_triop_lrp, i.e. glsl mix */
> + assert(ir->operands[2]->type->vector_elements == 1);
> + uint16_t swizzle_x = GET_SWZ(op[2]->swizzle, 0);
> + op[2].swizzle = MAKE_SWIZZLE4(swizzle_x, swizzle_x,
> + swizzle_x, swizzle_x);
> + }
>
> this->result.file = PROGRAM_UNDEFINED;
>
> --
> 2.13.6
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 3.shader_test
Type: application/octet-stream
Size: 612 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20171204/a541fcf1/attachment.obj>
More information about the mesa-dev
mailing list