[Mesa-dev] [PATCH 020/133] i965/fs: make emit_fragcoord_interpolation() more general
Jason Ekstrand
jason at jlekstrand.net
Mon Dec 15 22:04:30 PST 2014
From: Connor Abbott <connor.abbott at intel.com>
---
src/mesa/drivers/dri/i965/brw_fs.cpp | 13 +++++++------
src/mesa/drivers/dri/i965/brw_fs.h | 3 ++-
src/mesa/drivers/dri/i965/brw_fs_fp.cpp | 4 +++-
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 3 ++-
4 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 6cac6d7..5de862c 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -1194,16 +1194,17 @@ fs_visitor::setup_builtin_uniform_values(ir_variable *ir)
}
fs_reg *
-fs_visitor::emit_fragcoord_interpolation(ir_variable *ir)
+fs_visitor::emit_fragcoord_interpolation(bool pixel_center_integer,
+ bool origin_upper_left)
{
assert(stage == MESA_SHADER_FRAGMENT);
brw_wm_prog_key *key = (brw_wm_prog_key*) this->key;
- fs_reg *reg = new(this->mem_ctx) fs_reg(this, ir->type);
+ fs_reg *reg = new(this->mem_ctx) fs_reg(this, glsl_type::vec4_type);
fs_reg wpos = *reg;
- bool flip = !ir->data.origin_upper_left ^ key->render_to_fbo;
+ bool flip = !origin_upper_left ^ key->render_to_fbo;
/* gl_FragCoord.x */
- if (ir->data.pixel_center_integer) {
+ if (pixel_center_integer) {
emit(MOV(wpos, this->pixel_x));
} else {
emit(ADD(wpos, this->pixel_x, fs_reg(0.5f)));
@@ -1211,11 +1212,11 @@ fs_visitor::emit_fragcoord_interpolation(ir_variable *ir)
wpos = offset(wpos, 1);
/* gl_FragCoord.y */
- if (!flip && ir->data.pixel_center_integer) {
+ if (!flip && pixel_center_integer) {
emit(MOV(wpos, this->pixel_y));
} else {
fs_reg pixel_y = this->pixel_y;
- float offset = (ir->data.pixel_center_integer ? 0.0 : 0.5);
+ float offset = (pixel_center_integer ? 0.0 : 0.5);
if (flip) {
pixel_y.negate = true;
diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
index 58bb3ae..b270623 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.h
+++ b/src/mesa/drivers/dri/i965/brw_fs.h
@@ -471,7 +471,8 @@ public:
void emit_dummy_fs();
void emit_repclear_shader();
- fs_reg *emit_fragcoord_interpolation(ir_variable *ir);
+ fs_reg *emit_fragcoord_interpolation(bool pixel_center_integer,
+ bool origin_upper_left);
fs_inst *emit_linterp(const fs_reg &attr, const fs_reg &interp,
glsl_interp_qualifier interpolation_mode,
bool is_centroid, bool is_sample);
diff --git a/src/mesa/drivers/dri/i965/brw_fs_fp.cpp b/src/mesa/drivers/dri/i965/brw_fs_fp.cpp
index 6348bc1..acef9de 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_fp.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_fp.cpp
@@ -586,8 +586,10 @@ fs_visitor::setup_fp_regs()
gl_fragment_program *fp = (gl_fragment_program*) prog;
ir->data.pixel_center_integer = fp->PixelCenterInteger;
ir->data.origin_upper_left = fp->OriginUpperLeft;
+ fp_input_regs[i] =
+ *emit_fragcoord_interpolation(fp->PixelCenterInteger,
+ fp->OriginUpperLeft);
}
- fp_input_regs[i] = *emit_fragcoord_interpolation(ir);
break;
case VARYING_SLOT_FACE:
fp_input_regs[i] = *emit_frontfacing_interpolation();
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index 399e772..593c6e9 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -92,7 +92,8 @@ fs_visitor::visit(ir_variable *ir)
fs_reg(ATTR, ir->data.location,
brw_type_for_base_type(ir->type->get_scalar_type()));
} else if (!strcmp(ir->name, "gl_FragCoord")) {
- reg = emit_fragcoord_interpolation(ir);
+ reg = emit_fragcoord_interpolation(ir->data.pixel_center_integer,
+ ir->data.origin_upper_left);
} else if (!strcmp(ir->name, "gl_FrontFacing")) {
reg = emit_frontfacing_interpolation();
} else {
--
2.2.0
More information about the mesa-dev
mailing list