[Mesa-dev] [PATCH 7/7] i965/blorp: Use IMS layout when texturing from depth/stencil surfaces.

Anuj Phogat anuj.phogat at gmail.com
Thu Jul 19 17:44:11 PDT 2012


On Thu, Jul 12, 2012 at 10:43 AM, Paul Berry <stereotype441 at gmail.com> wrote:
> Previously, on Gen7, when texturing from a depth or stencil surface,
> the blorp engine would configure the 3D pipeline as though the input
> surface was non-multisampled, and perform the necessary coordinate
> transformations in the fragment shader to account for the IMS layout.
> This meant outputting a lot of extra fragment shader code, and it
> raised some uncertainty about how to deal with very large surfaces.
>
> This patch modifies blorp to configure the 3D pipeline properly for
> IMS layout when reading from depth and stencil surfaces.
> ---
>  src/mesa/drivers/dri/i965/brw_blorp_blit.cpp |   66 +++++++++++++++++---------
>  1 files changed, 43 insertions(+), 23 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> index c5e0ef9..f72145f 100644
> --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> @@ -1246,18 +1246,31 @@ brw_blorp_blit_program::texel_fetch(struct brw_reg dst)
>                       s_is_zero ? 2 : 5);
>        break;
>     case 7:
> -      if (key->tex_samples > 0) {
> -         if (key->tex_layout == INTEL_MSAA_LAYOUT_CMS) {
> -            texture_lookup(dst, GEN7_SAMPLER_MESSAGE_SAMPLE_LD2DMS,
> -                           gen7_ld2dms_args, ARRAY_SIZE(gen7_ld2dms_args));
> -         } else {
> -            texture_lookup(dst, GEN7_SAMPLER_MESSAGE_SAMPLE_LD2DSS,
> -                           gen7_ld2dss_args, ARRAY_SIZE(gen7_ld2dss_args));
> -         }
> -      } else {
> +      switch (key->tex_layout) {
> +      case INTEL_MSAA_LAYOUT_IMS:
> +         /* From the Ivy Bridge PRM, Vol4 Part1 p72 (Multisampled Surface Storage
> +          * Format):
> +          *
> +          *     If this field is MSFMT_DEPTH_STENCIL
> +          *     [a.k.a. INTEL_MSAA_LAYOUT_IMS], the only sampling engine
> +          *     messages allowed are "ld2dms", "resinfo", and "sampleinfo".
> +          *
> +          * So fall through to emit the same message as we use for
> +          * INTEL_MSAA_LAYOUT_CMS.
> +          */
> +      case INTEL_MSAA_LAYOUT_CMS:
> +         texture_lookup(dst, GEN7_SAMPLER_MESSAGE_SAMPLE_LD2DMS,
> +                        gen7_ld2dms_args, ARRAY_SIZE(gen7_ld2dms_args));
> +         break;
> +      case INTEL_MSAA_LAYOUT_UMS:
> +         texture_lookup(dst, GEN7_SAMPLER_MESSAGE_SAMPLE_LD2DSS,
> +                        gen7_ld2dss_args, ARRAY_SIZE(gen7_ld2dss_args));
> +         break;
> +      case INTEL_MSAA_LAYOUT_NONE:
>           assert(s_is_zero);
>           texture_lookup(dst, GEN5_SAMPLER_MESSAGE_SAMPLE_LD, gen7_ld_args,
>                          ARRAY_SIZE(gen7_ld_args));
> +         break;
>        }
>        break;
>     default:
> @@ -1321,7 +1334,22 @@ brw_blorp_blit_program::texture_lookup(struct brw_reg dst,
>              expand_to_32_bits(S, mrf);
>           break;
>        case SAMPLER_MESSAGE_ARG_MCS_INT:
> -         brw_MOV(&func, mrf, mcs_data);
> +         switch (key->tex_layout) {
> +         case INTEL_MSAA_LAYOUT_CMS:
> +            brw_MOV(&func, mrf, mcs_data);
> +            break;
> +         case INTEL_MSAA_LAYOUT_IMS:
> +            /* When sampling from an IMS surface, MCS data is not relevant,
> +             * and the hardware ignores it.  So don't bother populating it.
> +             */
> +            break;
> +         default:
> +            /* We shouldn't be trying to send MCS data with any other
> +             * layouts.
> +             */
> +            assert (!"Unsupported layout for MCS data");
> +            break;
> +         }
>           break;
>        case SAMPLER_MESSAGE_ARG_ZERO_INT:
>           brw_MOV(&func, mrf, brw_imm_ud(0));
> @@ -1485,19 +1513,11 @@ brw_blorp_blit_params::brw_blorp_blit_params(struct brw_context *brw,
>     }
>
>     if (brw->intel.gen > 6) {
> -      /* Gen7's texturing hardware only supports the IMS layout with the
> -       * ld2dms instruction (which blorp doesn't use).  So if the source is
> -       * IMS, we'll have to map it as a single-sampled texture and
> -       * de-interleave the samples ourselves.
> -       */
> -      if (src_mt->msaa_layout == INTEL_MSAA_LAYOUT_IMS)
> -         src.num_samples = 0;
> -
> -      /* Similarly, Gen7's rendering hardware only supports the IMS layout for
> -       * depth and stencil render targets.  Blorp always maps its destination
> -       * surface as a color render target (even if it's actually a depth or
> -       * stencil buffer).  So if the destination is IMS, we'll have to map it
> -       * as a single-sampled texture and interleave the samples ourselves.
> +      /* Gen7's rendering hardware only supports the IMS layout for depth and
> +       * stencil render targets.  Blorp always maps its destination surface as
> +       * a color render target (even if it's actually a depth or stencil
> +       * buffer).  So if the destination is IMS, we'll have to map it as a
> +       * single-sampled texture and interleave the samples ourselves.
>         */
>        if (dst_mt->msaa_layout == INTEL_MSAA_LAYOUT_IMS)
>           dst.num_samples = 0;
> --
> 1.7.7.6
>

Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>


More information about the mesa-dev mailing list