[Mesa-dev] [PATCH v2 15/35] i965/blorp: Add an isl_view to blorp_surface_info

Pohjolainen, Topi topi.pohjolainen at intel.com
Wed Jul 27 08:13:45 UTC 2016


On Tue, Jul 26, 2016 at 11:26:34PM -0700, Jason Ekstrand wrote:
>    On Jul 26, 2016 10:41 PM, "Pohjolainen, Topi"
>    <[1]topi.pohjolainen at intel.com> wrote:
>    >
>    > On Tue, Jul 26, 2016 at 03:02:06PM -0700, Jason Ekstrand wrote:
>    > > Eventually, this will be the actual view that gets passed into isl
>    to
>    > > create the surface state.  For now, we just use it for the format
>    and the
>    > > swizzle.
>    > > ---
>    > >  src/mesa/drivers/dri/i965/brw_blorp.c         | 38
>    +++++++++++++++++++--------
>    > >  src/mesa/drivers/dri/i965/brw_blorp.h         | 16 ++---------
>    > >  src/mesa/drivers/dri/i965/brw_blorp_blit.cpp  | 34
>    ++++++++++++++++++++----
>    > >  src/mesa/drivers/dri/i965/brw_blorp_clear.cpp |  2 +-
>    > >  src/mesa/drivers/dri/i965/gen8_blorp.c        | 29
>    ++++----------------
>    > >  5 files changed, 64 insertions(+), 55 deletions(-)
>    > >
>    > > diff --git a/src/mesa/drivers/dri/i965/brw_blorp.c
>    b/src/mesa/drivers/dri/i965/brw_blorp.c
>    > > index 8f7690c..ef256a7 100644
>    > > --- a/src/mesa/drivers/dri/i965/brw_blorp.c
>    > > +++ b/src/mesa/drivers/dri/i965/brw_blorp.c
>    > > @@ -43,9 +43,11 @@ brw_blorp_surface_info_init(struct brw_context
>    *brw,
>    > >      * using INTEL_MSAA_LAYOUT_UMS or INTEL_MSAA_LAYOUT_CMS, then
>    it had better
>    > >      * be a multiple of num_samples.
>    > >      */
>    > > +   unsigned layer_multiplier = 1;
>    >
>    > In principle we could just:
>    >
>    >       const unsigned layer_multiplier = MAX2(mt->num_samples, 1);
> 
>    No, it only applies to array multisampling and not interleaved

Ah true. And yes, this patch is:

Reviewed-by; Topi Pohjolainen <topi.pohjolainen at intel.com>

> 
>    > >     if (mt->msaa_layout == INTEL_MSAA_LAYOUT_UMS ||
>    > >         mt->msaa_layout == INTEL_MSAA_LAYOUT_CMS) {
>    > >        assert(mt->num_samples <= 1 || layer % mt->num_samples ==
>    0);
>    > > +      layer_multiplier = MAX2(mt->num_samples, 1);
>    > >     }
>    > >
>    > >     intel_miptree_check_level_layer(mt, level, layer);
>    > > @@ -61,13 +63,27 @@ brw_blorp_surface_info_init(struct brw_context
>    *brw,
>    > >        info->aux_usage = ISL_AUX_USAGE_NONE;
>    > >     }
>    > >
>    > > +   info->view = (struct isl_view) {
>    > > +      .usage = is_render_target ? ISL_SURF_USAGE_RENDER_TARGET_BIT
>    :
>    > > +                                  ISL_SURF_USAGE_TEXTURE_BIT,
>    > > +      .format = ISL_FORMAT_UNSUPPORTED, /* Set later */
>    > > +      .base_level = level,
>    > > +      .levels = 1,
>    > > +      .base_array_layer = layer / layer_multiplier,
>    > > +      .array_len = 1,
>    > > +      .channel_select = {
>    > > +         ISL_CHANNEL_SELECT_RED,
>    > > +         ISL_CHANNEL_SELECT_GREEN,
>    > > +         ISL_CHANNEL_SELECT_BLUE,
>    > > +         ISL_CHANNEL_SELECT_ALPHA,
>    > > +      },
>    > > +   };
>    > > +
>    > >     info->level = level;
>    > >     info->layer = layer;
>    > >     info->width = minify(mt->physical_width0, level -
>    mt->first_level);
>    > >     info->height = minify(mt->physical_height0, level -
>    mt->first_level);
>    > >
>    > > -   info->swizzle = SWIZZLE_XYZW;
>    > > -
>    > >     if (format == MESA_FORMAT_NONE)
>    > >        format = mt->format;
>    > >
>    > > @@ -75,8 +91,8 @@ brw_blorp_surface_info_init(struct brw_context
>    *brw,
>    > >     case MESA_FORMAT_S_UINT8:
>    > >        assert(info->surf.tiling == ISL_TILING_W);
>    > >        /* Prior to Broadwell, we can't render to R8_UINT */
>    > > -      info->brw_surfaceformat = brw->gen >= 8 ?
>    BRW_SURFACEFORMAT_R8_UINT :
>    > > -
>    BRW_SURFACEFORMAT_R8_UNORM;
>    > > +      info->view.format = brw->gen >= 8 ?
>    BRW_SURFACEFORMAT_R8_UINT :
>    > > +
>    BRW_SURFACEFORMAT_R8_UNORM;
>    > >        break;
>    > >     case MESA_FORMAT_Z24_UNORM_X8_UINT:
>    > >        /* It would make sense to use
>    BRW_SURFACEFORMAT_R24_UNORM_X8_TYPELESS
>    > > @@ -89,20 +105,20 @@ brw_blorp_surface_info_init(struct brw_context
>    *brw,
>    > >         * pattern as long as we copy the right amount of data, so
>    just map it
>    > >         * as 8-bit BGRA.
>    > >         */
>    > > -      info->brw_surfaceformat = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
>    > > +      info->view.format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
>    > >        break;
>    > >     case MESA_FORMAT_Z_FLOAT32:
>    > > -      info->brw_surfaceformat = BRW_SURFACEFORMAT_R32_FLOAT;
>    > > +      info->view.format = BRW_SURFACEFORMAT_R32_FLOAT;
>    > >        break;
>    > >     case MESA_FORMAT_Z_UNORM16:
>    > > -      info->brw_surfaceformat = BRW_SURFACEFORMAT_R16_UNORM;
>    > > +      info->view.format = BRW_SURFACEFORMAT_R16_UNORM;
>    > >        break;
>    > >     default: {
>    > >        if (is_render_target) {
>    > >           assert(brw->format_supported_as_render_target[format]);
>    > > -         info->brw_surfaceformat =
>    brw->render_target_format[format];
>    > > +         info->view.format = brw->render_target_format[format];
>    > >        } else {
>    > > -         info->brw_surfaceformat =
>    brw_format_for_mesa_format(format);
>    > > +         info->view.format = brw_format_for_mesa_format(format);
>    > >        }
>    > >        break;
>    > >     }
>    > > @@ -111,7 +127,7 @@ brw_blorp_surface_info_init(struct brw_context
>    *brw,
>    > >     uint32_t x_offset, y_offset;
>    > >     intel_miptree_get_image_offset(mt, level, layer, &x_offset,
>    &y_offset);
>    > >
>    > > -   uint8_t bs =
>    isl_format_get_layout(info->brw_surfaceformat)->bpb / 8;
>    > > +   uint8_t bs = isl_format_get_layout(info->view.format)->bpb / 8;
>    > >     isl_tiling_get_intratile_offset_el(&brw->isl_dev,
>    info->surf.tiling, bs,
>    > >                                        info->surf.row_pitch,
>    x_offset, y_offset,
>    > >                                        &info->bo_offset,
>    > > @@ -287,7 +303,7 @@ brw_blorp_emit_surface_state(struct brw_context
>    *brw,
>    > >     }
>    > >
>    > >     struct isl_view view = {
>    > > -      .format = surface->brw_surfaceformat,
>    > > +      .format = surface->view.format,
>    > >        .base_level = 0,
>    > >        .levels = 1,
>    > >        .base_array_layer = 0,
>    > > diff --git a/src/mesa/drivers/dri/i965/brw_blorp.h
>    b/src/mesa/drivers/dri/i965/brw_blorp.h
>    > > index e591f41..185406e 100644
>    > > --- a/src/mesa/drivers/dri/i965/brw_blorp.h
>    > > +++ b/src/mesa/drivers/dri/i965/brw_blorp.h
>    > > @@ -76,6 +76,8 @@ struct brw_blorp_surface_info
>    > >     struct isl_surf aux_surf;
>    > >     enum isl_aux_usage aux_usage;
>    > >
>    > > +   struct isl_view view;
>    > > +
>    > >     /**
>    > >      * The miplevel to use.
>    > >      */
>    > > @@ -106,20 +108,6 @@ struct brw_blorp_surface_info
>    > >
>    > >     uint32_t bo_offset;
>    > >     uint32_t tile_x_sa, tile_y_sa;
>    > > -
>    > > -   /**
>    > > -    * Format that should be used when setting up the surface state
>    for this
>    > > -    * surface.  Should correspond to one of the
>    BRW_SURFACEFORMAT_* enums.
>    > > -    */
>    > > -   uint32_t brw_surfaceformat;
>    > > -
>    > > -   /**
>    > > -    * In order to support cases where RGBA format is backing
>    client requested
>    > > -    * RGB, one needs to have means to force alpha channel to one
>    when user
>    > > -    * requested RGB surface is used as blit source. This is
>    possible by
>    > > -    * setting source swizzle for the texture surface.
>    > > -    */
>    > > -   int swizzle;
>    > >  };
>    > >
>    > >  void
>    > > diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
>    b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
>    > > index fc0aada..32450aa 100644
>    > > --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
>    > > +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
>    > > @@ -1575,6 +1575,25 @@ get_isl_msaa_layout(unsigned samples, enum
>    intel_msaa_layout layout)
>    > >  }
>    > >
>    > >  /**
>    > > + * Convert an swizzle enumeration (i.e. SWIZZLE_X) to one of the
>    Gen7.5+
>    > > + * "Shader Channel Select" enumerations (i.e. HSW_SCS_RED).  The
>    mappings are
>    > > + *
>    > > + * SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W, SWIZZLE_ZERO,
>    SWIZZLE_ONE
>    > > + *         0          1          2          3             4
>        5
>    > > + *         4          5          6          7             0
>        1
>    > > + *   SCS_RED, SCS_GREEN,  SCS_BLUE, SCS_ALPHA,     SCS_ZERO,
>    SCS_ONE
>    > > + *
>    > > + * which is simply adding 4 then modding by 8 (or anding with 7).
>    > > + *
>    > > + * We then may need to apply workarounds for textureGather
>    hardware bugs.
>    > > + */
>    > > +static enum isl_channel_select
>    > > +swizzle_to_scs(GLenum swizzle)
>    > > +{
>    > > +   return (enum isl_channel_select)((swizzle + 4) & 7);
>    > > +}
>    > > +
>    > > +/**
>    > >   * Note: if the src (or dst) is a 2D multisample array texture on
>    Gen7+ using
>    > >   * INTEL_MSAA_LAYOUT_UMS or INTEL_MSAA_LAYOUT_CMS, src_layer
>    (dst_layer) is
>    > >   * the physical layer holding sample 0.  So, for example, if
>    > > @@ -1651,8 +1670,10 @@ brw_blorp_blit_miptrees(struct brw_context
>    *brw,
>    > >         _mesa_get_srgb_format_linear(src_mt->format) ==
>    > >         _mesa_get_srgb_format_linear(dst_mt->format)) {
>    > >
>    assert(brw->format_supported_as_render_target[dst_mt->format]);
>    > > -      params.dst.brw_surfaceformat =
>    brw->render_target_format[dst_mt->format];
>    > > -      params.src.brw_surfaceformat =
>    brw_format_for_mesa_format(dst_mt->format);
>    > > +      params.dst.view.format =
>    > > +         (enum
>    isl_format)brw->render_target_format[dst_mt->format];
>    > > +      params.src.view.format =
>    > > +         (enum
>    isl_format)brw_format_for_mesa_format(dst_mt->format);
>    > >     }
>    > >
>    > >     /* When doing a multisample resolve of a GL_LUMINANCE32F or
>    GL_INTENSITY32F
>    > > @@ -1667,8 +1688,8 @@ brw_blorp_blit_miptrees(struct brw_context
>    *brw,
>    > >     if (brw->gen == 6 &&
>    > >         params.src.surf.samples > 1 && params.dst.surf.samples <= 1
>    &&
>    > >         src_mt->format == dst_mt->format &&
>    > > -       params.dst.brw_surfaceformat ==
>    BRW_SURFACEFORMAT_R32_FLOAT) {
>    > > -      params.src.brw_surfaceformat = params.dst.brw_surfaceformat;
>    > > +       params.dst.view.format == ISL_FORMAT_R32_FLOAT) {
>    > > +      params.src.view.format = params.dst.view.format;
>    > >     }
>    > >
>    > >     struct brw_blorp_blit_prog_key wm_prog_key;
>    > > @@ -1951,7 +1972,10 @@ brw_blorp_blit_miptrees(struct brw_context
>    *brw,
>    > >
>    > >     brw_blorp_get_blit_kernel(brw, &params, &wm_prog_key);
>    > >
>    > > -   params.src.swizzle = src_swizzle;
>    > > +   for (unsigned i = 0; i < 4; i++) {
>    > > +      params.src.view.channel_select[i] =
>    > > +         swizzle_to_scs(GET_SWZ(src_swizzle, i));
>    > > +   }
>    > >
>    > >     brw_blorp_exec(brw, &params);
>    > >
>    > > diff --git a/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp
>    b/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp
>    > > index 1e00719..625bace 100644
>    > > --- a/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp
>    > > +++ b/src/mesa/drivers/dri/i965/brw_blorp_clear.cpp
>    > > @@ -216,7 +216,7 @@ do_single_blorp_clear(struct brw_context *brw,
>    struct gl_framebuffer *fb,
>    > >                                 layer, format, true);
>    > >
>    > >     /* Override the surface format according to the context's sRGB
>    rules. */
>    > > -   params.dst.brw_surfaceformat =
>    brw->render_target_format[format];
>    > > +   params.dst.view.format = (enum
>    isl_format)brw->render_target_format[format];
>    > >
>    > >     const char *clear_type;
>    > >     if (is_fast_clear)
>    > > diff --git a/src/mesa/drivers/dri/i965/gen8_blorp.c
>    b/src/mesa/drivers/dri/i965/gen8_blorp.c
>    > > index 99adebe..806895c 100644
>    > > --- a/src/mesa/drivers/dri/i965/gen8_blorp.c
>    > > +++ b/src/mesa/drivers/dri/i965/gen8_blorp.c
>    > > @@ -475,25 +475,6 @@ gen8_blorp_emit_depth_stencil_state(struct
>    brw_context *brw,
>    > >     ADVANCE_BATCH();
>    > >  }
>    > >
>    > > -/**
>    > > - * Convert an swizzle enumeration (i.e. SWIZZLE_X) to one of the
>    Gen7.5+
>    > > - * "Shader Channel Select" enumerations (i.e. HSW_SCS_RED).  The
>    mappings are
>    > > - *
>    > > - * SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W, SWIZZLE_ZERO,
>    SWIZZLE_ONE
>    > > - *         0          1          2          3             4
>        5
>    > > - *         4          5          6          7             0
>        1
>    > > - *   SCS_RED, SCS_GREEN,  SCS_BLUE, SCS_ALPHA,     SCS_ZERO,
>    SCS_ONE
>    > > - *
>    > > - * which is simply adding 4 then modding by 8 (or anding with 7).
>    > > - *
>    > > - * We then may need to apply workarounds for textureGather
>    hardware bugs.
>    > > - */
>    > > -static unsigned
>    > > -swizzle_to_scs(GLenum swizzle)
>    > > -{
>    > > -   return (swizzle + 4) & 7;
>    > > -}
>    > > -
>    > >  static uint32_t
>    > >  gen8_blorp_emit_surface_states(struct brw_context *brw,
>    > >                                 const struct brw_blorp_params
>    *params)
>    > > @@ -533,16 +514,16 @@ gen8_blorp_emit_surface_states(struct
>    brw_context *brw,
>    > >                                  surface->layer / layer_divider :
>    0;
>    > >
>    > >        struct isl_view view = {
>    > > -         .format = surface->brw_surfaceformat,
>    > > +         .format = surface->view.format,
>    > >           .base_level = surface->level,
>    > >           .levels = mt->last_level - surface->level + 1,
>    > >           .base_array_layer = layer,
>    > >           .array_len = depth - layer,
>    > >           .channel_select = {
>    > > -            swizzle_to_scs(GET_SWZ(surface->swizzle, 0)),
>    > > -            swizzle_to_scs(GET_SWZ(surface->swizzle, 1)),
>    > > -            swizzle_to_scs(GET_SWZ(surface->swizzle, 2)),
>    > > -            swizzle_to_scs(GET_SWZ(surface->swizzle, 3)),
>    > > +            surface->view.channel_select[0],
>    > > +            surface->view.channel_select[1],
>    > > +            surface->view.channel_select[2],
>    > > +            surface->view.channel_select[3],
>    > >           },
>    > >           .usage = ISL_SURF_USAGE_TEXTURE_BIT,
>    > >        };
>    > > --
>    > > 2.5.0.400.gff86faf
>    > >
>    > > _______________________________________________
>    > > mesa-dev mailing list
>    > > [2]mesa-dev at lists.freedesktop.org
>    > > [3]https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 
> References
> 
>    1. mailto:topi.pohjolainen at intel.com
>    2. mailto:mesa-dev at lists.freedesktop.org
>    3. https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list