diff options
author | Marek Olšák <[email protected]> | 2012-07-23 01:27:51 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2012-07-23 19:23:53 +0200 |
commit | 82fc813ca870c4002502e098519bead7bec1a7e8 (patch) | |
tree | 11c59b419a7827eb81eb56dac4bdd3e9183d880a /src | |
parent | f40b5723f017bfb9e3819a5463184627ee727cc1 (diff) |
st/mesa: fix DDY opcode for FBOs
This fixes piglit/fbo-deriv.
Reviewed-by: Brian Paul <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 24 |
1 files 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 45136ded2bc..fcd69b18d3a 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -1448,9 +1448,29 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir) emit(ir, TGSI_OPCODE_DDX, result_dst, op[0]); break; case ir_unop_dFdy: - op[0].negate = ~op[0].negate; - emit(ir, TGSI_OPCODE_DDY, result_dst, op[0]); + { + /* The X component contains 1 or -1 depending on whether the framebuffer + * is a FBO or the window system buffer, respectively. + * It is then multiplied with the source operand of DDY. + */ + 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::vec4_type); + + emit(ir, TGSI_OPCODE_MUL, st_dst_reg(temp), transform_y, op[0]); + emit(ir, TGSI_OPCODE_DDY, result_dst, temp); break; + } case ir_unop_noise: { /* At some point, a motivated person could add a better |