[Mesa-dev] [PATCH 04/12] i965/fs/skl+: Use lcd2dms_w instead of lcd2dms

Ben Widawsky ben at bwidawsk.net
Tue Sep 22 12:05:29 PDT 2015


On Thu, Sep 17, 2015 at 05:00:06PM +0100, Neil Roberts wrote:
> In order to support 16x MSAA, skl+ has a wider version of lcd2dms that
> takes two parameters for the MCS data. This patch makes it allocate a
> register that is twice as big for the MCS data and then always use
> the wider version.
> ---
>  src/mesa/drivers/dri/i965/brw_defines.h        |  4 ++++
>  src/mesa/drivers/dri/i965/brw_disasm.c         |  1 +
>  src/mesa/drivers/dri/i965/brw_fs.cpp           | 27 ++++++++++++++++++++++++--
>  src/mesa/drivers/dri/i965/brw_fs_generator.cpp |  5 +++++
>  src/mesa/drivers/dri/i965/brw_fs_visitor.cpp   |  9 ++++++---
>  src/mesa/drivers/dri/i965/brw_shader.cpp       |  5 +++++
>  6 files changed, 46 insertions(+), 5 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h
> index 8fc8ceb..2d5b67d 100644
> --- a/src/mesa/drivers/dri/i965/brw_defines.h
> +++ b/src/mesa/drivers/dri/i965/brw_defines.h
> @@ -969,6 +969,8 @@ enum opcode {
>     FS_OPCODE_TXB_LOGICAL,
>     SHADER_OPCODE_TXF_CMS,
>     SHADER_OPCODE_TXF_CMS_LOGICAL,
> +   SHADER_OPCODE_TXF_CMS_W,
> +   SHADER_OPCODE_TXF_CMS_W_LOGICAL,
>     SHADER_OPCODE_TXF_UMS,
>     SHADER_OPCODE_TXF_UMS_LOGICAL,
>     SHADER_OPCODE_TXF_MCS,
> @@ -1517,10 +1519,12 @@ enum brw_message_target {
>  #define GEN7_SAMPLER_MESSAGE_SAMPLE_GATHER4_PO   17
>  #define GEN7_SAMPLER_MESSAGE_SAMPLE_GATHER4_PO_C 18
>  #define HSW_SAMPLER_MESSAGE_SAMPLE_DERIV_COMPARE 20
> +#define GEN9_SAMPLER_MESSAGE_SAMPLE_LD2DMS_W     28
>  #define GEN7_SAMPLER_MESSAGE_SAMPLE_LD_MCS       29
>  #define GEN7_SAMPLER_MESSAGE_SAMPLE_LD2DMS       30
>  #define GEN7_SAMPLER_MESSAGE_SAMPLE_LD2DSS       31
>  
> +
>  /* for GEN5 only */
>  #define BRW_SAMPLER_SIMD_MODE_SIMD4X2                   0
>  #define BRW_SAMPLER_SIMD_MODE_SIMD8                     1
> diff --git a/src/mesa/drivers/dri/i965/brw_disasm.c b/src/mesa/drivers/dri/i965/brw_disasm.c
> index db23a18..5aca728 100644
> --- a/src/mesa/drivers/dri/i965/brw_disasm.c
> +++ b/src/mesa/drivers/dri/i965/brw_disasm.c
> @@ -622,6 +622,7 @@ static const char *const gen5_sampler_msg_type[] = {
>     [GEN7_SAMPLER_MESSAGE_SAMPLE_GATHER4_PO]   = "gather4_po",
>     [GEN7_SAMPLER_MESSAGE_SAMPLE_GATHER4_PO_C] = "gather4_po_c",
>     [HSW_SAMPLER_MESSAGE_SAMPLE_DERIV_COMPARE] = "sample_d_c",
> +   [GEN9_SAMPLER_MESSAGE_SAMPLE_LD2DMS_W]     = "ld2dms_w",
>     [GEN7_SAMPLER_MESSAGE_SAMPLE_LD_MCS]       = "ld_mcs",
>     [GEN7_SAMPLER_MESSAGE_SAMPLE_LD2DMS]       = "ld2dms",
>     [GEN7_SAMPLER_MESSAGE_SAMPLE_LD2DSS]       = "ld2dss",
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index 32a2adf..82f49b4 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -697,6 +697,7 @@ fs_inst::components_read(unsigned i) const
>     case SHADER_OPCODE_TXS_LOGICAL:
>     case FS_OPCODE_TXB_LOGICAL:
>     case SHADER_OPCODE_TXF_CMS_LOGICAL:
> +   case SHADER_OPCODE_TXF_CMS_W_LOGICAL:
>     case SHADER_OPCODE_TXF_UMS_LOGICAL:
>     case SHADER_OPCODE_TXF_MCS_LOGICAL:
>     case SHADER_OPCODE_LOD_LOGICAL:
> @@ -712,6 +713,9 @@ fs_inst::components_read(unsigned i) const
>        /* Texture offset. */
>        else if (i == 7)
>           return 2;
> +      /* MCS */
> +      else if (i == 5 && opcode == SHADER_OPCODE_TXF_CMS_W_LOGICAL)
> +         return 2;
>        else
>           return 1;
>  
> @@ -873,6 +877,7 @@ fs_visitor::implied_mrf_writes(fs_inst *inst)
>     case SHADER_OPCODE_TXD:
>     case SHADER_OPCODE_TXF:
>     case SHADER_OPCODE_TXF_CMS:
> +   case SHADER_OPCODE_TXF_CMS_W:
>     case SHADER_OPCODE_TXF_MCS:
>     case SHADER_OPCODE_TG4:
>     case SHADER_OPCODE_TG4_OFFSET:
> @@ -3816,17 +3821,31 @@ lower_sampler_logical_send_gen7(const fs_builder &bld, fs_inst *inst, opcode op,
>        coordinate_done = true;
>        break;
>     case SHADER_OPCODE_TXF_CMS:
> +   case SHADER_OPCODE_TXF_CMS_W:
>     case SHADER_OPCODE_TXF_UMS:
>     case SHADER_OPCODE_TXF_MCS:
> -      if (op == SHADER_OPCODE_TXF_UMS || op == SHADER_OPCODE_TXF_CMS) {
> +      if (op == SHADER_OPCODE_TXF_UMS ||
> +          op == SHADER_OPCODE_TXF_CMS ||
> +          op == SHADER_OPCODE_TXF_CMS_W) {
>           bld.MOV(retype(sources[length], BRW_REGISTER_TYPE_UD), sample_index);
>           length++;
>        }
>  
> -      if (op == SHADER_OPCODE_TXF_CMS) {
> +      if (op == SHADER_OPCODE_TXF_CMS || op == SHADER_OPCODE_TXF_CMS_W) {
>           /* Data from the multisample control surface. */
>           bld.MOV(retype(sources[length], BRW_REGISTER_TYPE_UD), mcs);
>           length++;
> +
> +         /* On Gen9+ we'll use lcd2ms_w instead which has two registers for
> +          * the MCS data.
> +          */
> +         if (op == SHADER_OPCODE_TXF_CMS_W) {
> +            bld.MOV(retype(sources[length], BRW_REGISTER_TYPE_UD),
> +                    mcs.file == IMM ?
> +                    mcs :
> +                    offset(mcs, bld, 1));
> +            length++;
> +         }

This hunk is very confusing to me without more context from later patches. I
assume the upper bits of mcs are 0 for the cases where you're doing < 16x, but
there is no way to determine that. I am not a big fan of the, lay out all the
infrastructure, then use it later, when it comes to patch review. Or am I
missing something?

(Also, I think a separate case for SHADER_OPCODE_TXF_CMS_W would probably look a
bit nicer, but that's just a random thought).

>        }
>  
>        /* There is no offsetting for this message; just copy in the integer
> @@ -4040,6 +4059,10 @@ fs_visitor::lower_logical_sends()
>           lower_sampler_logical_send(ibld, inst, SHADER_OPCODE_TXF_CMS);
>           break;
>  
> +      case SHADER_OPCODE_TXF_CMS_W_LOGICAL:
> +         lower_sampler_logical_send(ibld, inst, SHADER_OPCODE_TXF_CMS_W);
> +         break;
> +
>        case SHADER_OPCODE_TXF_UMS_LOGICAL:
>           lower_sampler_logical_send(ibld, inst, SHADER_OPCODE_TXF_UMS);
>           break;
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> index 90805e4..d3e3e05 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> @@ -612,6 +612,10 @@ fs_generator::generate_tex(fs_inst *inst, struct brw_reg dst, struct brw_reg src
>        case SHADER_OPCODE_TXF:
>  	 msg_type = GEN5_SAMPLER_MESSAGE_SAMPLE_LD;
>  	 break;
> +      case SHADER_OPCODE_TXF_CMS_W:
> +         assert(devinfo->gen >= 9);
> +         msg_type = GEN9_SAMPLER_MESSAGE_SAMPLE_LD2DMS_W;
> +         break;
>        case SHADER_OPCODE_TXF_CMS:
>           if (devinfo->gen >= 7)
>              msg_type = GEN7_SAMPLER_MESSAGE_SAMPLE_LD2DMS;
> @@ -1916,6 +1920,7 @@ fs_generator::generate_code(const cfg_t *cfg, int dispatch_width)
>        case SHADER_OPCODE_TXD:
>        case SHADER_OPCODE_TXF:
>        case SHADER_OPCODE_TXF_CMS:
> +      case SHADER_OPCODE_TXF_CMS_W:
>        case SHADER_OPCODE_TXF_UMS:
>        case SHADER_OPCODE_TXF_MCS:
>        case SHADER_OPCODE_TXL:
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> index b85b52b..ea7b3eb 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> @@ -200,8 +200,8 @@ fs_visitor::emit_mcs_fetch(const fs_reg &coordinate, unsigned components,
>     fs_inst *inst = bld.emit(SHADER_OPCODE_TXF_MCS_LOGICAL, dest, srcs,
>                              ARRAY_SIZE(srcs));
>  
> -   /* We only care about one reg of response, but the sampler always writes
> -    * 4/8.
> +   /* We only care about one or two regs of response, but the sampler always
> +    * writes 4/8.
>      */
>     inst->regs_written = 4 * dispatch_width / 8;
>  
> @@ -287,7 +287,10 @@ fs_visitor::emit_texture(ir_texture_opcode op,
>        opcode = SHADER_OPCODE_TXF_LOGICAL;
>        break;
>     case ir_txf_ms:
> -      opcode = SHADER_OPCODE_TXF_CMS_LOGICAL;
> +      if (devinfo->gen >= 9)
> +         opcode = SHADER_OPCODE_TXF_CMS_W_LOGICAL;
> +      else
> +         opcode = SHADER_OPCODE_TXF_CMS_LOGICAL;
>        break;
>     case ir_txs:
>     case ir_query_levels:
> diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp
> index eed73fb..1e1ea9f 100644
> --- a/src/mesa/drivers/dri/i965/brw_shader.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp
> @@ -607,6 +607,10 @@ brw_instruction_name(enum opcode op)
>        return "txf_cms";
>     case SHADER_OPCODE_TXF_CMS_LOGICAL:
>        return "txf_cms_logical";
> +   case SHADER_OPCODE_TXF_CMS_W:
> +      return "txf_cms_w";
> +   case SHADER_OPCODE_TXF_CMS_W_LOGICAL:
> +      return "txf_cms_w_logical";
>     case SHADER_OPCODE_TXF_UMS:
>        return "txf_ums";
>     case SHADER_OPCODE_TXF_UMS_LOGICAL:
> @@ -1034,6 +1038,7 @@ backend_instruction::is_tex() const
>             opcode == SHADER_OPCODE_TXD ||
>             opcode == SHADER_OPCODE_TXF ||
>             opcode == SHADER_OPCODE_TXF_CMS ||
> +           opcode == SHADER_OPCODE_TXF_CMS_W ||
>             opcode == SHADER_OPCODE_TXF_UMS ||
>             opcode == SHADER_OPCODE_TXF_MCS ||
>             opcode == SHADER_OPCODE_TXL ||
> -- 
> 1.9.3
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list