[Mesa-dev] [RFC PATCH 24/26] i965/vs: emit sample index for txf

Chris Forbes chrisf at ijw.co.nz
Sat Dec 29 04:35:37 PST 2012


When fetching texels from a multisample surface, the sample index is
provided as an extra argument after the lod, and the actual lod needs
to be hardwired to 0.

The frontend gives us the sample index in the lod parameter, so fix this
up.

Signed-off-by: Chris Forbes <chrisf at ijw.co.nz>
---
 src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
index 104057c..8aa4b2d 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
@@ -2088,8 +2088,19 @@ vec4_visitor::visit(ir_texture *ir)
 	 }
 	 emit(MOV(dst_reg(MRF, mrf, ir->lod_info.lod->type, writemask), lod));
       } else if (ir->op == ir_txf) {
-	 emit(MOV(dst_reg(MRF, param_base, ir->lod_info.lod->type, WRITEMASK_W),
-		  lod));
+         if (ir->sampler->type->sampler_dimensionality == GLSL_SAMPLER_DIM_MS) {
+            /* for multisample samplers, actual lod is always 0, and the
+             * extra parameter is the sample index */
+            emit(MOV(dst_reg(MRF, param_base, ir->lod_info.lod->type, WRITEMASK_W),
+                     src_reg(0)));
+            emit(MOV(dst_reg(MRF, param_base + 1, ir->lod_info.lod->type, WRITEMASK_X),
+                     lod));   /* sample_index */
+            inst->mlen++;     /* spilled over into a second reg of args */
+         }
+         else {
+            emit(MOV(dst_reg(MRF, param_base, ir->lod_info.lod->type, WRITEMASK_W),
+                     lod));
+         }
       } else if (ir->op == ir_txd) {
 	 const glsl_type *type = ir->lod_info.grad.dPdx->type;
 
-- 
1.8.0.3



More information about the mesa-dev mailing list