diff options
author | Ilia Mirkin <[email protected]> | 2017-12-02 11:20:46 -0500 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2017-12-11 23:08:43 -0500 |
commit | 0332c7484b712e56ce1a6648c5fa04c90e286c37 (patch) | |
tree | 3e373134e0f4563854f096ca8737e8dea2f97bf6 /src/mesa/state_tracker | |
parent | 84c363fb09167bc45aeba95423b20bee7293f44a (diff) |
st/mesa: swizzle argument when there's a vector size mismatch
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 <[email protected]>
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 8eeae86dabb..740c197c74b 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -1341,10 +1341,33 @@ glsl_to_tgsi_visitor::visit_expression(ir_expression* ir, st_src_reg *op) st_dst_reg result_dst; int vector_elements = ir->operands[0]->type->vector_elements; - if (ir->operands[1]) { + if (ir->operands[1] && + ir->operation != ir_binop_interpolate_at_offset && + ir->operation != ir_binop_interpolate_at_sample) { + 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; |