vk/formats: Fix incorrect depth formats

anv_format::surface_format was incorrect for Vulkan depth formats.
For example, the format table mapped

    VK_FORMAT_D24_UNORM -> .surface_format = D24_UNORM_X8_UINT
    VK_FORMAT_D32_FLOAT -> .surface_format = D32_FLOAT

but should have mapped

    VK_FORMAT_D24_UNORM -> .surface_format = R24_UNORM_X8_TYPELESS
    VK_FORMAT_D32_FLOAT -> .surface_format = R32_FLOAT

The Crucible test func.depthstencil.basic passed despite the bug, but
only because it did not attempt to texture from the depth surface.

The core problem is that RENDER_SURFACE_STATE.SurfaceFormat and
3DSTATE_DEPTH_BUFFER.SurfaceFormat are distinct types. Considering them
as enum spaces, the two enum spaces have incompatible collisions.

Fix this by adding a new field 'depth_format' to struct anv_format.

Refer to brw_surface_formats.c:translate_tex_format() for precedent.
This commit is contained in:
Chad Versace
2015-06-25 19:29:59 -07:00
parent 45b804a049
commit ebe1e768b8
3 changed files with 9 additions and 8 deletions

View File

@@ -123,13 +123,13 @@ static const struct anv_format anv_formats[] = {
* depth format. The field .has_stencil indicates whether or not there's a
* stencil buffer.
*/
fmt(VK_FORMAT_D16_UNORM, D16_UNORM, .cpp = 2, .num_channels = 1),
fmt(VK_FORMAT_D24_UNORM, D24_UNORM_X8_UINT, .cpp = 4, .num_channels = 1),
fmt(VK_FORMAT_D32_SFLOAT, D32_FLOAT, .cpp = 4, .num_channels = 1),
fmt(VK_FORMAT_S8_UINT, UNSUPPORTED, .cpp = 0, .num_channels = 1, .has_stencil = true),
fmt(VK_FORMAT_D16_UNORM_S8_UINT, D16_UNORM, .cpp = 2, .num_channels = 2, .has_stencil = true),
fmt(VK_FORMAT_D24_UNORM_S8_UINT, D24_UNORM_X8_UINT, .cpp = 4, .num_channels = 2, .has_stencil = true),
fmt(VK_FORMAT_D32_SFLOAT_S8_UINT, D32_FLOAT, .cpp = 4, .num_channels = 2, .has_stencil = true),
fmt(VK_FORMAT_D16_UNORM, R16_UNORM, .cpp = 2, .num_channels = 1, .depth_format = D16_UNORM),
fmt(VK_FORMAT_D24_UNORM, R24_UNORM_X8_TYPELESS, .cpp = 4, .num_channels = 1, .depth_format = D24_UNORM_X8_UINT),
fmt(VK_FORMAT_D32_SFLOAT, R32_FLOAT, .cpp = 4, .num_channels = 1, .depth_format = D32_FLOAT),
fmt(VK_FORMAT_S8_UINT, UNSUPPORTED, .cpp = 0, .num_channels = 1, .has_stencil = true),
fmt(VK_FORMAT_D16_UNORM_S8_UINT, R16_UNORM, .cpp = 2, .num_channels = 2, .depth_format = D16_UNORM, .has_stencil = true),
fmt(VK_FORMAT_D24_UNORM_S8_UINT, R24_UNORM_X8_TYPELESS, .cpp = 4, .num_channels = 2, .depth_format = D24_UNORM_X8_UINT, .has_stencil = true),
fmt(VK_FORMAT_D32_SFLOAT_S8_UINT, R32_FLOAT, .cpp = 4, .num_channels = 2, .depth_format = D32_FLOAT, .has_stencil = true),
fmt(VK_FORMAT_BC1_RGB_UNORM, UNSUPPORTED),
fmt(VK_FORMAT_BC1_RGB_SRGB, UNSUPPORTED),

View File

@@ -486,7 +486,7 @@ VkResult anv_CreateDepthStencilView(
view->depth_stride = image->stride;
view->depth_offset = image->offset;
view->depth_format = format->surface_format;
view->depth_format = format->depth_format;
view->stencil_stride = image->stencil_stride;
view->stencil_offset = image->offset + image->stencil_offset;

View File

@@ -776,6 +776,7 @@ struct anv_format {
uint16_t surface_format; /**< RENDER_SURFACE_STATE.SurfaceFormat */
uint8_t cpp;
uint8_t num_channels;
uint8_t depth_format; /**< 3DSTATE_DEPTH_BUFFER.SurfaceFormat */
bool has_stencil;
};