summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4.h4
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp19
2 files changed, 15 insertions, 8 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h
index 170353a0c28..f1482bb60b1 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.h
+++ b/src/mesa/drivers/dri/i965/brw_vec4.h
@@ -337,7 +337,9 @@ public:
src_reg emit_mcs_fetch(const glsl_type *coordinate_type, src_reg coordinate,
src_reg sampler);
void emit_gen6_gather_wa(uint8_t wa, dst_reg dst);
- void swizzle_result(ir_texture *ir, src_reg orig_val, uint32_t sampler);
+ void swizzle_result(ir_texture_opcode op, dst_reg dest,
+ src_reg orig_val, uint32_t sampler,
+ const glsl_type *dest_type);
void emit_ndc_computation();
void emit_psiz_and_flags(dst_reg reg);
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
index c72fae6ce0c..81a5cd12f47 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
@@ -2815,7 +2815,11 @@ vec4_visitor::visit(ir_texture *ir)
emit_gen6_gather_wa(key->tex.gen6_gather_wa[sampler], inst->dst);
}
- swizzle_result(ir, src_reg(inst->dst), sampler);
+ this->result = src_reg(this, ir->type);
+ dst_reg dest = dst_reg(this->result);
+
+ swizzle_result(ir->op, dest, src_reg(inst->dst),
+ sampler, ir->type);
}
/**
@@ -2869,22 +2873,23 @@ vec4_visitor::gather_channel(unsigned gather_component, uint32_t sampler)
}
void
-vec4_visitor::swizzle_result(ir_texture *ir, src_reg orig_val, uint32_t sampler)
+vec4_visitor::swizzle_result(ir_texture_opcode op, dst_reg dest,
+ src_reg orig_val, uint32_t sampler,
+ const glsl_type *dest_type)
{
int s = key->tex.swizzles[sampler];
- this->result = src_reg(this, ir->type);
- dst_reg swizzled_result(this->result);
+ dst_reg swizzled_result = dest;
- if (ir->op == ir_query_levels) {
+ if (op == ir_query_levels) {
/* # levels is in .w */
orig_val.swizzle = BRW_SWIZZLE4(SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W);
emit(MOV(swizzled_result, orig_val));
return;
}
- if (ir->op == ir_txs || ir->type == glsl_type::float_type
- || s == SWIZZLE_NOOP || ir->op == ir_tg4) {
+ if (op == ir_txs || dest_type == glsl_type::float_type
+ || s == SWIZZLE_NOOP || op == ir_tg4) {
emit(MOV(swizzled_result, orig_val));
return;
}