anv/cmd_buffer: Set the correct surface type for depth/stencil
Reviewed-by: Nanley Chery <nanley.g.chery@intel.com>
This commit is contained in:
@@ -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
|
static void
|
||||||
cmd_buffer_emit_depth_stencil(struct anv_cmd_buffer *cmd_buffer)
|
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 */
|
/* Emit 3DSTATE_DEPTH_BUFFER */
|
||||||
if (has_depth) {
|
if (has_depth) {
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_DEPTH_BUFFER), db) {
|
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.DepthWriteEnable = true;
|
||||||
db.StencilWriteEnable = has_stencil;
|
db.StencilWriteEnable = has_stencil;
|
||||||
|
|
||||||
@@ -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.
|
* be combined with a stencil buffer so we use D32_FLOAT instead.
|
||||||
*/
|
*/
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_DEPTH_BUFFER), db) {
|
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.SurfaceFormat = D32_FLOAT;
|
||||||
db.Width = fb->width - 1;
|
db.Width = fb->width - 1;
|
||||||
db.Height = fb->height - 1;
|
db.Height = fb->height - 1;
|
||||||
|
Reference in New Issue
Block a user