[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, ¶ms, &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, ¶ms);
> > >
> > > 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