<div dir="ltr">On 30 November 2013 15:30, Chris Forbes <span dir="ltr"><<a href="mailto:chrisf@ijw.co.nz" target="_blank">chrisf@ijw.co.nz</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Signed-off-by: Chris Forbes <<a href="mailto:chrisf@ijw.co.nz">chrisf@ijw.co.nz</a>><br>
---<br>
 src/mesa/drivers/dri/i965/brw_vec4.h           |  1 +<br>
 src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 42 +++++++++++++++++++++-----<br>
 2 files changed, 36 insertions(+), 7 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h<br>
index 5cec9f9..d4029d8 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_vec4.h<br>
+++ b/src/mesa/drivers/dri/i965/brw_vec4.h<br>
@@ -477,6 +477,7 @@ public:<br>
    void emit_unpack_half_2x16(dst_reg dst, src_reg src0);<br>
<br>
    uint32_t gather_channel(ir_texture *ir, int sampler);<br>
+   src_reg emit_mcs_fetch(ir_texture *ir, src_reg coordinate, int sampler);<br>
    void swizzle_result(ir_texture *ir, src_reg orig_val, int sampler);<br>
<br>
    void emit_ndc_computation();<br>
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp<br>
index a13eafb..619b386 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp<br>
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp<br>
@@ -2215,6 +2215,31 @@ vec4_visitor::visit(ir_call *ir)<br>
    }<br>
 }<br>
<br>
+src_reg<br>
+vec4_visitor::emit_mcs_fetch(ir_texture *ir, src_reg coordinate, int sampler)<br>
+{<br>
+   vec4_instruction *inst = new(mem_ctx) vec4_instruction(this, SHADER_OPCODE_TXF_MCS);<br>
+   inst->base_mrf = 2;<br>
+   inst->mlen = 1;<br>
+   inst->sampler = sampler;<br>
+   inst->dst = dst_reg(this, glsl_type::uvec4_type);<br>
+   inst->dst.writemask = WRITEMASK_XYZW;<br>
+<br>
+   /* parameters are: u, v, r, lod; lod will always be zero due to api restrictions */<br>
+   int param_base = inst->base_mrf;<br>
+   int coord_mask = (1 << ir->coordinate->type->vector_elements) - 1;<br>
+   int zero_mask = 0xf & ~coord_mask;<br>
+<br>
+   emit(MOV(dst_reg(MRF, param_base, ir->coordinate->type, coord_mask),<br>
+            coordinate));<br>
+<br>
+   emit(MOV(dst_reg(MRF, param_base, ir->coordinate->type, zero_mask),<br>
+            src_reg(0)));<br>
+<br>
+   emit(inst);<br>
+   return src_reg(inst->dst);<br>
+}<br>
+<br>
 void<br>
 vec4_visitor::visit(ir_texture *ir)<br>
 {<br>
@@ -2265,7 +2290,7 @@ vec4_visitor::visit(ir_texture *ir)<br>
    }<br>
<br>
    const glsl_type *lod_type = NULL, *sample_index_type = NULL;<br>
-   src_reg lod, dPdx, dPdy, sample_index;<br>
+   src_reg lod, dPdx, dPdy, sample_index, mcs;<br>
    switch (ir->op) {<br>
    case ir_tex:<br>
       lod = src_reg(0.0f);<br>
@@ -2286,6 +2311,11 @@ vec4_visitor::visit(ir_texture *ir)<br>
       ir->lod_info.sample_index->accept(this);<br>
       sample_index = this->result;<br>
       sample_index_type = ir->lod_info.sample_index->type;<br>
+<br>
+      if (brw->gen >= 7 && key->tex.compressed_multisample_layout_mask & (1<<sampler))<br>
+         mcs = emit_mcs_fetch(ir, coordinate, sampler);<br>
+      else<br>
+         mcs = src_reg(0u);<br>
       break;<br>
    case ir_txd:<br>
       ir->lod_info.grad.dPdx->accept(this);<br>
@@ -2406,13 +2436,11 @@ vec4_visitor::visit(ir_texture *ir)<br>
       } else if (ir->op == ir_txf_ms) {<br>
          emit(MOV(dst_reg(MRF, param_base + 1, sample_index_type, WRITEMASK_X),<br>
                   sample_index));<br>
+         if (brw->gen >= 7)<br>
+            mcs.swizzle = BRW_SWIZZLE4(SWIZZLE_X,SWIZZLE_X,SWIZZLE_X,SWIZZLE_X);<br>
+            emit(MOV(dst_reg(MRF, param_base + 1, glsl_type::uint_type, WRITEMASK_Y),<br>
+                     mcs));<br></blockquote><div><br></div><div>It would be nice to have a quick comment here explaining that the swizzle and writemask are needed because ld2dms expects mcs to be in position 5, which corresponds to the y component of the 2nd vec4.<br>
</div><div><br></div><div>With that added, this patch is:<br><br>Reviewed-by: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br></div><br> <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

          inst->mlen++;<br>
-<br>
-         /* on Gen7, there is an additional MCS parameter here after SI,<br>
-          * but we don't bother to emit it since it's always zero. If<br>
-          * we start supporting texturing from CMS surfaces, this will have<br>
-          * to change<br>
-          */<br>
       } else if (ir->op == ir_txd) {<br>
         const glsl_type *type = lod_type;<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
1.8.4.2<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div></div>