summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Forbes <chrisf@ijw.co.nz>2013-10-13 00:02:55 +1300
committerChris Forbes <chrisf@ijw.co.nz>2013-10-26 22:56:25 +1300
commit06de9f8ff15559dffddf26d1969d35e74fbf253f (patch)
tree3b331f11ebda41031e7988935d557e53c15a3db0
parent72b5e9c42a6cfe085f7683057672ab2278e45c2e (diff)
i965: Generalize coord+offset lowering pass for ir_txf
ir_txf expects an ivec* coordinate, and may be larger than ivec2; shuffle things around so that this will work. V2: Fix style nits, use ir_builder Signed-off-by: Chris Forbes <chrisf@ijw.co.nz> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
-rw-r--r--src/mesa/drivers/dri/i965/brw_lower_unnormalized_offset.cpp29
1 files changed, 26 insertions, 3 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_lower_unnormalized_offset.cpp b/src/mesa/drivers/dri/i965/brw_lower_unnormalized_offset.cpp
index 0581e0539ae..df4fe4be463 100644
--- a/src/mesa/drivers/dri/i965/brw_lower_unnormalized_offset.cpp
+++ b/src/mesa/drivers/dri/i965/brw_lower_unnormalized_offset.cpp
@@ -52,11 +52,34 @@ public:
ir_visitor_status
brw_lower_unnormalized_offset_visitor::visit_leave(ir_texture *ir)
{
- if (ir->sampler->type->sampler_dimensionality != GLSL_SAMPLER_DIM_RECT ||
- !ir->offset || ir->op != ir_tg4)
+ if (!ir->offset)
return visit_continue;
- ir->coordinate = add(ir->coordinate, i2f(ir->offset));
+ if (ir->op == ir_tg4) {
+ if (ir->sampler->type->sampler_dimensionality != GLSL_SAMPLER_DIM_RECT)
+ return visit_continue;
+ }
+ else if (ir->op != ir_txf) {
+ return visit_continue;
+ }
+
+ void *mem_ctx = ralloc_parent(ir);
+
+ if (ir->op == ir_txf) {
+ ir_variable *var = new(mem_ctx) ir_variable(ir->coordinate->type,
+ "coordinate",
+ ir_var_temporary);
+ base_ir->insert_before(var);
+ base_ir->insert_before(assign(var, ir->coordinate));
+ base_ir->insert_before(assign(var,
+ add(swizzle_for_size(var, ir->offset->type->vector_elements), ir->offset),
+ (1 << ir->offset->type->vector_elements) - 1));
+
+ ir->coordinate = new(mem_ctx) ir_dereference_variable(var);
+ } else {
+ ir->coordinate = add(ir->coordinate, i2f(ir->offset));
+ }
+
ir->offset = NULL;
progress = true;