[Mesa-dev] [PATCH 1/2] anv/cmd_buffer: Set the correct surface type for depth/stencil

Jason Ekstrand jason at jlekstrand.net
Tue Nov 29 20:44:05 UTC 2016


On Tue, Nov 29, 2016 at 12:24 PM, Nanley Chery <nanleychery at gmail.com>
wrote:

> On Mon, Nov 28, 2016 at 03:45:41PM -0800, Jason Ekstrand wrote:
> > ---
> >  src/intel/vulkan/genX_cmd_buffer.c | 51 ++++++++++++++++++++++++++++++
> ++++++--
> >  1 file changed, 49 insertions(+), 2 deletions(-)
> >
>
> This patch does not match the one you've merged
> (d4ef87c1bb4290293148cbd6cb782764df38f8f4). The committed code
> introduces the following buggy hunk:
>
> @@ -2106,7 +2152,12 @@ cmd_buffer_emit_depth_stencil(struct
> anv_cmd_buffer *cmd_buffer)
>         * be combined with a stencil buffer so we use D32_FLOAT instead.
>         */
>        anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_DEPTH_BUFFER), db)
> {
> -         db.SurfaceType          = SURFTYPE_2D;
> +         if (has_stencil) {
> +            db.SurfaceType       = SURFTYPE_2D;
> +               depth_stencil_surface_type(image->stencil_surface.isl.
> dim);
> +         } else {
> +            db.SurfaceType       = SURFTYPE_2D;
> +         }
>           db.SurfaceFormat        = D32_FLOAT;
>           db.Width                = fb->width - 1;
>           db.Height               = fb->height - 1;
>

Yes, it introduces that hunk.  What's buggy about it?  The old code made
Jenkins explode.  Maybe I should have sent a v2.


>
> -Nanley
>
> > diff --git a/src/intel/vulkan/genX_cmd_buffer.c
> b/src/intel/vulkan/genX_cmd_buffer.c
> > index a965cd6..c953b93 100644
> > --- a/src/intel/vulkan/genX_cmd_buffer.c
> > +++ b/src/intel/vulkan/genX_cmd_buffer.c
> > @@ -2033,6 +2033,51 @@ genX(cmd_buffer_emit_gen7_depth_flush)(struct
> anv_cmd_buffer *cmd_buffer)
> >     }
> >  }
> >
> > +static uint32_t
> > +depth_stencil_surface_type(enum isl_surf_dim dim)
> > +{
> > +   switch (dim) {
> > +   case ISL_SURF_DIM_1D:
> > +      if (GEN_GEN >= 9) {
> > +         /* From the Sky Lake PRM, 3DSTATAE_DEPTH_BUFFER::SurfaceType
> > +          *
> > +          *    Programming Notes:
> > +          *    The Surface Type of the depth buffer must be the same as
> the
> > +          *    Surface Type of the render target(s) (defined in
> > +          *    SURFACE_STATE), unless either the depth buffer or render
> > +          *    targets are SURFTYPE_NULL (see exception below for
> SKL).  1D
> > +          *    surface type not allowed for depth surface and stencil
> surface.
> > +          *
> > +          *    Workaround:
> > +          *    If depth/stencil is enabled with 1D render target,
> > +          *    depth/stencil surface type needs to be set to 2D surface
> type
> > +          *    and height set to 1. Depth will use (legacy) TileY and
> stencil
> > +          *    will use TileW. For this case only, the Surface Type of
> the
> > +          *    depth buffer can be 2D while the Surface Type of the
> render
> > +          *    target(s) are 1D, representing an exception to a
> programming
> > +          *    note above.
> > +          */
> > +         return SURFTYPE_2D;
> > +      } else {
> > +         return SURFTYPE_1D;
> > +      }
> > +   case ISL_SURF_DIM_2D:
> > +      return SURFTYPE_2D;
> > +   case ISL_SURF_DIM_3D:
> > +      if (GEN_GEN >= 9) {
> > +         /* The Sky Lake docs list the value for 3D as "Reserved".
> However,
> > +          * they have the exact same layout as 2D arrays on gen9+, so
> we can
> > +          * just use 2D here.
> > +          */
> > +         return SURFTYPE_2D;
> > +      } else {
> > +         return SURFTYPE_3D;
> > +      }
> > +   default:
> > +      unreachable("Invalid surface dimension");
> > +   }
> > +}
> > +
> >  static void
> >  cmd_buffer_emit_depth_stencil(struct anv_cmd_buffer *cmd_buffer)
> >  {
> > @@ -2054,7 +2099,8 @@ cmd_buffer_emit_depth_stencil(struct
> anv_cmd_buffer *cmd_buffer)
> >     /* Emit 3DSTATE_DEPTH_BUFFER */
> >     if (has_depth) {
> >        anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_DEPTH_BUFFER),
> db) {
> > -         db.SurfaceType                   = SURFTYPE_2D;
> > +         db.SurfaceType                   =
> > +            depth_stencil_surface_type(image->depth_surface.isl.dim);
> >           db.DepthWriteEnable              = true;
> >           db.StencilWriteEnable            = has_stencil;
> >
> > @@ -2106,7 +2152,8 @@ cmd_buffer_emit_depth_stencil(struct
> anv_cmd_buffer *cmd_buffer)
> >         * be combined with a stencil buffer so we use D32_FLOAT instead.
> >         */
> >        anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_DEPTH_BUFFER),
> db) {
> > -         db.SurfaceType          = SURFTYPE_2D;
> > +         db.SurfaceType          =
> > +            depth_stencil_surface_type(image->depth_surface.isl.dim);
> >           db.SurfaceFormat        = D32_FLOAT;
> >           db.Width                = fb->width - 1;
> >           db.Height               = fb->height - 1;
> > --
> > 2.5.0.400.gff86faf
> >
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20161129/25383e19/attachment-0001.html>


More information about the mesa-dev mailing list