From: Chad Versace Date: Fri, 26 Jun 2015 02:29:59 +0000 (-0700) Subject: vk/formats: Fix incorrect depth formats X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ebe1e768b8f0c3a7e2958c6e82182016a1c9bb5c;p=mesa.git 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. --- diff --git a/src/vulkan/formats.c b/src/vulkan/formats.c index c88c7ce1ab9..c5cac6db7f7 100644 --- a/src/vulkan/formats.c +++ b/src/vulkan/formats.c @@ -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), diff --git a/src/vulkan/image.c b/src/vulkan/image.c index 8a6f1952a4a..5999318baaa 100644 --- a/src/vulkan/image.c +++ b/src/vulkan/image.c @@ -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; diff --git a/src/vulkan/private.h b/src/vulkan/private.h index f89e92af2d1..7833f080b53 100644 --- a/src/vulkan/private.h +++ b/src/vulkan/private.h @@ -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; };