[Mesa-dev] [PATCH V2 09/10] i965/vs: Sample from MCS surface when required

Paul Berry stereotype441 at gmail.com
Mon Dec 2 08:22:00 PST 2013


On 30 November 2013 15:30, Chris Forbes <chrisf at ijw.co.nz> wrote:

> Signed-off-by: Chris Forbes <chrisf at ijw.co.nz>
> ---
>  src/mesa/drivers/dri/i965/brw_vec4.h           |  1 +
>  src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 42
> +++++++++++++++++++++-----
>  2 files changed, 36 insertions(+), 7 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h
> b/src/mesa/drivers/dri/i965/brw_vec4.h
> index 5cec9f9..d4029d8 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4.h
> +++ b/src/mesa/drivers/dri/i965/brw_vec4.h
> @@ -477,6 +477,7 @@ public:
>     void emit_unpack_half_2x16(dst_reg dst, src_reg src0);
>
>     uint32_t gather_channel(ir_texture *ir, int sampler);
> +   src_reg emit_mcs_fetch(ir_texture *ir, src_reg coordinate, int
> sampler);
>     void swizzle_result(ir_texture *ir, src_reg orig_val, int sampler);
>
>     void emit_ndc_computation();
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> index a13eafb..619b386 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> @@ -2215,6 +2215,31 @@ vec4_visitor::visit(ir_call *ir)
>     }
>  }
>
> +src_reg
> +vec4_visitor::emit_mcs_fetch(ir_texture *ir, src_reg coordinate, int
> sampler)
> +{
> +   vec4_instruction *inst = new(mem_ctx) vec4_instruction(this,
> SHADER_OPCODE_TXF_MCS);
> +   inst->base_mrf = 2;
> +   inst->mlen = 1;
> +   inst->sampler = sampler;
> +   inst->dst = dst_reg(this, glsl_type::uvec4_type);
> +   inst->dst.writemask = WRITEMASK_XYZW;
> +
> +   /* parameters are: u, v, r, lod; lod will always be zero due to api
> restrictions */
> +   int param_base = inst->base_mrf;
> +   int coord_mask = (1 << ir->coordinate->type->vector_elements) - 1;
> +   int zero_mask = 0xf & ~coord_mask;
> +
> +   emit(MOV(dst_reg(MRF, param_base, ir->coordinate->type, coord_mask),
> +            coordinate));
> +
> +   emit(MOV(dst_reg(MRF, param_base, ir->coordinate->type, zero_mask),
> +            src_reg(0)));
> +
> +   emit(inst);
> +   return src_reg(inst->dst);
> +}
> +
>  void
>  vec4_visitor::visit(ir_texture *ir)
>  {
> @@ -2265,7 +2290,7 @@ vec4_visitor::visit(ir_texture *ir)
>     }
>
>     const glsl_type *lod_type = NULL, *sample_index_type = NULL;
> -   src_reg lod, dPdx, dPdy, sample_index;
> +   src_reg lod, dPdx, dPdy, sample_index, mcs;
>     switch (ir->op) {
>     case ir_tex:
>        lod = src_reg(0.0f);
> @@ -2286,6 +2311,11 @@ vec4_visitor::visit(ir_texture *ir)
>        ir->lod_info.sample_index->accept(this);
>        sample_index = this->result;
>        sample_index_type = ir->lod_info.sample_index->type;
> +
> +      if (brw->gen >= 7 && key->tex.compressed_multisample_layout_mask &
> (1<<sampler))
> +         mcs = emit_mcs_fetch(ir, coordinate, sampler);
> +      else
> +         mcs = src_reg(0u);
>        break;
>     case ir_txd:
>        ir->lod_info.grad.dPdx->accept(this);
> @@ -2406,13 +2436,11 @@ vec4_visitor::visit(ir_texture *ir)
>        } else if (ir->op == ir_txf_ms) {
>           emit(MOV(dst_reg(MRF, param_base + 1, sample_index_type,
> WRITEMASK_X),
>                    sample_index));
> +         if (brw->gen >= 7)
> +            mcs.swizzle =
> BRW_SWIZZLE4(SWIZZLE_X,SWIZZLE_X,SWIZZLE_X,SWIZZLE_X);
> +            emit(MOV(dst_reg(MRF, param_base + 1, glsl_type::uint_type,
> WRITEMASK_Y),
> +                     mcs));
>

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.

With that added, this patch is:

Reviewed-by: Paul Berry <stereotype441 at gmail.com>


>
>           inst->mlen++;
> -
> -         /* on Gen7, there is an additional MCS parameter here after SI,
> -          * but we don't bother to emit it since it's always zero. If
> -          * we start supporting texturing from CMS surfaces, this will
> have
> -          * to change
> -          */
>        } else if (ir->op == ir_txd) {
>          const glsl_type *type = lod_type;
>
> --
> 1.8.4.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20131202/ece68ee4/attachment.html>


More information about the mesa-dev mailing list