From a1c244479247a736961f637b415e07d327203250 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Thu, 12 May 2016 22:14:17 -0400 Subject: [PATCH] st/mesa: flip y coordinate of interpolateAtOffset for winsys This fixes a few dEQP tests like dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.no_qualifiers.default_framebuffer Signed-off-by: Ilia Mirkin Reviewed-by: Dave Airlie --- src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 58b6634..d8a0cb2 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -2151,9 +2151,29 @@ glsl_to_tgsi_visitor::visit_expression(ir_expression* ir, st_src_reg *op) case ir_unop_interpolate_at_centroid: emit_asm(ir, TGSI_OPCODE_INTERP_CENTROID, result_dst, op[0]); break; - case ir_binop_interpolate_at_offset: - emit_asm(ir, TGSI_OPCODE_INTERP_OFFSET, result_dst, op[0], op[1]); + case ir_binop_interpolate_at_offset: { + /* The y coordinate needs to be flipped for the default fb */ + static const gl_state_index transform_y_state[STATE_LENGTH] + = { STATE_INTERNAL, STATE_FB_WPOS_Y_TRANSFORM }; + + unsigned transform_y_index = + _mesa_add_state_reference(this->prog->Parameters, + transform_y_state); + + st_src_reg transform_y = st_src_reg(PROGRAM_STATE_VAR, + transform_y_index, + glsl_type::vec4_type); + transform_y.swizzle = SWIZZLE_XXXX; + + st_src_reg temp = get_temp(glsl_type::vec2_type); + st_dst_reg temp_dst = st_dst_reg(temp); + + emit_asm(ir, TGSI_OPCODE_MOV, temp_dst, op[1]); + temp_dst.writemask = WRITEMASK_Y; + emit_asm(ir, TGSI_OPCODE_MUL, temp_dst, transform_y, op[1]); + emit_asm(ir, TGSI_OPCODE_INTERP_OFFSET, result_dst, op[0], temp); break; + } case ir_binop_interpolate_at_sample: emit_asm(ir, TGSI_OPCODE_INTERP_SAMPLE, result_dst, op[0], op[1]); break; -- 2.7.4