From 35c6b9c066ce583648b3f833b94055537a949d12 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Fri, 17 May 2024 14:04:50 +0200 Subject: [PATCH] ac,radv,radeonsi: add a function to translate db format Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/common/ac_formats.c | 20 ++++++++++++++++++++ src/amd/common/ac_formats.h | 3 +++ src/amd/vulkan/radv_device.c | 2 +- src/amd/vulkan/radv_formats.c | 21 ++++----------------- src/amd/vulkan/radv_formats.h | 2 -- src/gallium/drivers/radeonsi/si_state.c | 25 +++++-------------------- 6 files changed, 33 insertions(+), 40 deletions(-) diff --git a/src/amd/common/ac_formats.c b/src/amd/common/ac_formats.c index 7ea3627b9f1..25fd636a1c5 100644 --- a/src/amd/common/ac_formats.c +++ b/src/amd/common/ac_formats.c @@ -256,3 +256,23 @@ ac_translate_colorswap(enum amd_gfx_level gfx_level, enum pipe_format format, bo } return ~0U; } + +uint32_t +ac_translate_dbformat(enum pipe_format format) +{ + switch (format) { + case PIPE_FORMAT_Z16_UNORM: + case PIPE_FORMAT_Z16_UNORM_S8_UINT: + return V_028040_Z_16; + case PIPE_FORMAT_S8_UINT_Z24_UNORM: + case PIPE_FORMAT_X8Z24_UNORM: + case PIPE_FORMAT_Z24X8_UNORM: + case PIPE_FORMAT_Z24_UNORM_S8_UINT: + return V_028040_Z_24; /* not present on GFX12 */ + case PIPE_FORMAT_Z32_FLOAT: + case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: + return V_028040_Z_32_FLOAT; + default: + return V_028040_Z_INVALID; + } +} diff --git a/src/amd/common/ac_formats.h b/src/amd/common/ac_formats.h index b5f5b196a2d..4e7ff0bdc3d 100644 --- a/src/amd/common/ac_formats.h +++ b/src/amd/common/ac_formats.h @@ -33,6 +33,9 @@ ac_translate_colorswap(enum amd_gfx_level gfx_level, enum pipe_format format, bool do_endian_swap); +uint32_t +ac_translate_dbformat(enum pipe_format format); + #ifdef __cplusplus } #endif diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 177f4264eef..57405e217be 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -1877,7 +1877,7 @@ radv_initialise_ds_surface(const struct radv_device *device, struct radv_ds_buff memset(ds, 0, sizeof(*ds)); - format = radv_translate_dbformat(vk_format_to_pipe_format(iview->image->vk.format)); + format = ac_translate_dbformat(vk_format_to_pipe_format(iview->image->vk.format)); stencil_format = surf->has_stencil ? V_028044_STENCIL_8 : V_028044_STENCIL_INVALID; uint32_t max_slice = radv_surface_max_layer_count(iview) - 1; diff --git a/src/amd/vulkan/radv_formats.c b/src/amd/vulkan/radv_formats.c index f7ca45d6d5c..815e91335f3 100644 --- a/src/amd/vulkan/radv_formats.c +++ b/src/amd/vulkan/radv_formats.c @@ -465,8 +465,10 @@ radv_is_colorbuffer_format_supported(const struct radv_physical_device *pdev, Vk static bool radv_is_zs_format_supported(VkFormat format) { - return radv_translate_dbformat(vk_format_to_pipe_format(format)) != V_028040_Z_INVALID || - format == VK_FORMAT_S8_UINT; + if (format == VK_FORMAT_D24_UNORM_S8_UINT || format == VK_FORMAT_X8_D24_UNORM_PACK32) + return false; + + return ac_translate_dbformat(vk_format_to_pipe_format(format)) != V_028040_Z_INVALID || format == VK_FORMAT_S8_UINT; } static bool @@ -844,21 +846,6 @@ radv_colorformat_endian_swap(uint32_t colorformat) } } -uint32_t -radv_translate_dbformat(enum pipe_format format) -{ - switch (format) { - case PIPE_FORMAT_Z16_UNORM: - case PIPE_FORMAT_Z16_UNORM_S8_UINT: - return V_028040_Z_16; - case PIPE_FORMAT_Z32_FLOAT: - case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: - return V_028040_Z_32_FLOAT; - default: - return V_028040_Z_INVALID; - } -} - bool radv_format_pack_clear_color(VkFormat format, uint32_t clear_vals[2], VkClearColorValue *value) { diff --git a/src/amd/vulkan/radv_formats.h b/src/amd/vulkan/radv_formats.h index 7a1ad0dc1f8..90e7d1685c7 100644 --- a/src/amd/vulkan/radv_formats.h +++ b/src/amd/vulkan/radv_formats.h @@ -161,8 +161,6 @@ bool radv_is_format_emulated(const struct radv_physical_device *pdev, VkFormat f uint32_t radv_colorformat_endian_swap(uint32_t colorformat); -uint32_t radv_translate_dbformat(enum pipe_format format); - bool radv_format_pack_clear_color(VkFormat format, uint32_t clear_vals[2], VkClearColorValue *value); bool radv_dcc_formats_compatible(enum amd_gfx_level gfx_level, VkFormat format1, VkFormat format2, diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 9014f0a1ab2..141773027cf 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -2022,24 +2022,6 @@ static uint32_t si_colorformat_endian_swap(uint32_t colorformat) } } -static uint32_t si_translate_dbformat(enum pipe_format format) -{ - switch (format) { - case PIPE_FORMAT_Z16_UNORM: - return V_028040_Z_16; - case PIPE_FORMAT_S8_UINT_Z24_UNORM: - case PIPE_FORMAT_X8Z24_UNORM: - case PIPE_FORMAT_Z24X8_UNORM: - case PIPE_FORMAT_Z24_UNORM_S8_UINT: - return V_028040_Z_24; /* not present on GFX12 */ - case PIPE_FORMAT_Z32_FLOAT: - case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: - return V_028040_Z_32_FLOAT; - default: - return V_028040_Z_INVALID; - } -} - /* * Texture translation */ @@ -2530,7 +2512,10 @@ static bool si_is_colorbuffer_format_supported(enum amd_gfx_level gfx_level, static bool si_is_zs_format_supported(enum pipe_format format) { - return si_translate_dbformat(format) != V_028040_Z_INVALID; + if (format == PIPE_FORMAT_Z16_UNORM_S8_UINT) + return false; + + return ac_translate_dbformat(format) != V_028040_Z_INVALID; } static bool si_is_format_supported(struct pipe_screen *screen, enum pipe_format format, @@ -2845,7 +2830,7 @@ static void si_init_depth_surface(struct si_context *sctx, struct si_surface *su unsigned level = surf->base.u.tex.level; unsigned format, stencil_format; - format = si_translate_dbformat(tex->db_render_format); + format = ac_translate_dbformat(tex->db_render_format); stencil_format = tex->surface.has_stencil ? V_028044_STENCIL_8 : V_028044_STENCIL_INVALID; assert(format != V_028040_Z_24 || sctx->gfx_level < GFX12);