We'll want to reuse this for ARB_fp handling. --- src/mesa/drivers/dri/i965/brw_fs.h | 2 ++ src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 44 +++++++++++++++----------- 2 files changed, 27 insertions(+), 19 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index e0dd720..5134857 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -307,6 +307,8 @@ public: void emit_interpolation_setup_gen4(); void emit_interpolation_setup_gen6(); fs_reg emit_texcoord(ir_texture *ir, int sampler, int texunit); + fs_reg rescale_texcoord(ir_texture *ir, fs_reg coordinate, + bool is_rect, int sampler, int texunit); fs_inst *emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate, fs_reg shadow_comp, fs_reg lod, fs_reg lod2); fs_inst *emit_texture_gen5(ir_texture *ir, fs_reg dst, fs_reg coordinate, diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index da09538..5bd7238 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -1159,32 +1159,19 @@ fs_visitor::emit_texture_gen7(ir_texture *ir, fs_reg dst, fs_reg coordinate, return inst; } -/** - * Emit code to produce the coordinates for a texture lookup. - * - * Returns the fs_reg containing the texture coordinate (as opposed to - * setting this->result). - */ fs_reg -fs_visitor::emit_texcoord(ir_texture *ir, int sampler, int texunit) +fs_visitor::rescale_texcoord(ir_texture *ir, fs_reg coordinate, + bool is_rect, int sampler, int texunit) { fs_inst *inst = NULL; - - if (!ir->coordinate) - return fs_reg(); /* Return the default BAD_FILE register. */ - - ir->coordinate->accept(this); - fs_reg coordinate = this->result; - bool needs_gl_clamp = true; - fs_reg scale_x, scale_y; /* The 965 requires the EU to do the normalization of GL rectangle * texture coordinates. We use the program parameter state * tracking to get the scaling factor. */ - if (ir->sampler->type->sampler_dimensionality == GLSL_SAMPLER_DIM_RECT && + if (is_rect && (intel->gen < 6 || (intel->gen >= 6 && (c->key.tex.gl_clamp_mask[0] & (1 << sampler) || c->key.tex.gl_clamp_mask[1] & (1 << sampler))))) { @@ -1220,8 +1207,7 @@ fs_visitor::emit_texcoord(ir_texture *ir, int sampler, int texunit) * texture coordinates. We use the program parameter state * tracking to get the scaling factor. */ - if (intel->gen < 6 && - ir->sampler->type->sampler_dimensionality == GLSL_SAMPLER_DIM_RECT) { + if (intel->gen < 6 && is_rect) { fs_reg dst = fs_reg(this, ir->coordinate->type); fs_reg src = coordinate; coordinate = dst; @@ -1230,7 +1216,7 @@ fs_visitor::emit_texcoord(ir_texture *ir, int sampler, int texunit) dst.reg_offset++; src.reg_offset++; emit(BRW_OPCODE_MUL, dst, src, scale_y); - } else if (ir->sampler->type->sampler_dimensionality == GLSL_SAMPLER_DIM_RECT) { + } else if (is_rect) { /* On gen6+, the sampler handles the rectangle coordinates * natively, without needing rescaling. But that means we have * to do GL_CLAMP clamping at the [0, width], [0, height] scale, @@ -1277,6 +1263,26 @@ fs_visitor::emit_texcoord(ir_texture *ir, int sampler, int texunit) return coordinate; } +/** + * Emit code to produce the coordinates for a texture lookup. + * + * Returns the fs_reg containing the texture coordinate (as opposed to + * setting this->result). + */ +fs_reg +fs_visitor::emit_texcoord(ir_texture *ir, int sampler, int texunit) +{ + if (!ir->coordinate) + return fs_reg(); /* Return the default BAD_FILE register. */ + + ir->coordinate->accept(this); + + return rescale_texcoord(ir, this->result, + ir->sampler->type->sampler_dimensionality == + GLSL_SAMPLER_DIM_RECT, + sampler, texunit); +} + void fs_visitor::visit(ir_texture *ir) { -- 1.7.10.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev