summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatt Turner <mattst88@gmail.com>2014-03-24 16:18:58 -0700
committerMatt Turner <mattst88@gmail.com>2014-06-17 09:38:06 -0700
commit856860db4a62bbe1cbcf63c68ce921b608ffae01 (patch)
tree5270212bc9e2feb4bb02af2204a2bff456015c00 /src
parent15b6ab04e2bef02f009eb305707b7b4fe4e5a7dd (diff)
i965/fs: Apply cube map array fixup and restore the payload.
So that we don't have partial writes to a large VGRF. Will be cleaned up by register coalescing.
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs_visitor.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index 4d58cc6ef59..6352739e794 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -1739,7 +1739,20 @@ fs_visitor::visit(ir_texture *ir)
type->sampler_array) {
fs_reg depth = dst;
depth.reg_offset = 2;
- emit_math(SHADER_OPCODE_INT_QUOTIENT, depth, depth, fs_reg(6));
+ fs_reg fixed_depth = fs_reg(this, glsl_type::int_type);
+ emit_math(SHADER_OPCODE_INT_QUOTIENT, fixed_depth, depth, fs_reg(6));
+
+ fs_reg *fixed_payload = ralloc_array(mem_ctx, fs_reg, inst->regs_written);
+ fs_reg d = dst;
+ for (int i = 0; i < inst->regs_written; i++) {
+ if (i == 2) {
+ fixed_payload[i] = fixed_depth;
+ } else {
+ d.reg_offset = i;
+ fixed_payload[i] = d;
+ }
+ }
+ emit(LOAD_PAYLOAD(dst, fixed_payload, inst->regs_written));
}
}