From 0d9c7bc3adcc7b61a3d11ab9b2e720abda9e01c7 Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Tue, 22 Jun 2021 19:21:00 +0200 Subject: [PATCH] vkd3d: Index formats by format. Signed-off-by: Georg Lehmann --- libs/vkd3d/utils.c | 56 ++++++++++++++++++++++++++++++-------- libs/vkd3d/vkd3d_private.h | 1 + 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/libs/vkd3d/utils.c b/libs/vkd3d/utils.c index ee975cc3..b22d2f9a 100644 --- a/libs/vkd3d/utils.c +++ b/libs/vkd3d/utils.c @@ -397,6 +397,32 @@ static void vkd3d_cleanup_depth_stencil_formats(struct d3d12_device *device) device->depth_stencil_formats = NULL; } +static HRESULT vkd3d_init_formats(struct d3d12_device *device) +{ + struct vkd3d_format *formats; + unsigned int i; + + if (!(formats = vkd3d_calloc(VKD3D_MAX_DXGI_FORMAT + 1, sizeof(*formats)))) + return E_OUTOFMEMORY; + + for (i = 0; i < ARRAY_SIZE(vkd3d_formats); ++i) + { + assert(vkd3d_formats[i].dxgi_format <= VKD3D_MAX_DXGI_FORMAT); + formats[vkd3d_formats[i].dxgi_format] = vkd3d_formats[i]; + } + + device->formats = formats; + + return S_OK; +} + +static void vkd3d_cleanup_formats(struct d3d12_device *device) +{ + vkd3d_free((void *)device->formats); + + device->formats = NULL; +} + HRESULT vkd3d_init_format_info(struct d3d12_device *device) { HRESULT hr; @@ -405,7 +431,16 @@ HRESULT vkd3d_init_format_info(struct d3d12_device *device) return hr; if (FAILED(hr = vkd3d_init_format_compatibility_lists(device))) + { vkd3d_cleanup_depth_stencil_formats(device); + return hr; + } + + if (FAILED(hr = vkd3d_init_formats(device))) + { + vkd3d_cleanup_depth_stencil_formats(device); + vkd3d_cleanup_format_compatibility_lists(device); + } return hr; } @@ -414,6 +449,7 @@ void vkd3d_cleanup_format_info(struct d3d12_device *device) { vkd3d_cleanup_depth_stencil_formats(device); vkd3d_cleanup_format_compatibility_lists(device); + vkd3d_cleanup_formats(device); } /* We use overrides for depth/stencil formats. This is required in order to @@ -435,7 +471,6 @@ const struct vkd3d_format *vkd3d_get_format(const struct d3d12_device *device, DXGI_FORMAT dxgi_format, bool depth_stencil) { const struct vkd3d_format *format; - unsigned int i; if (dxgi_format > VKD3D_MAX_DXGI_FORMAT) return NULL; @@ -443,13 +478,9 @@ const struct vkd3d_format *vkd3d_get_format(const struct d3d12_device *device, if (depth_stencil && (format = vkd3d_get_depth_stencil_format(device, dxgi_format))) return format; - for (i = 0; i < ARRAY_SIZE(vkd3d_formats); ++i) - { - if (vkd3d_formats[i].dxgi_format == dxgi_format) - return &vkd3d_formats[i]; - } + format = &device->formats[dxgi_format]; - return NULL; + return format->dxgi_format ? format : NULL; } DXGI_FORMAT vkd3d_get_typeless_format(const struct d3d12_device *device, DXGI_FORMAT dxgi_format) @@ -520,12 +551,15 @@ void vkd3d_format_copy_data(const struct vkd3d_format *format, const uint8_t *sr VKD3D_EXPORT VkFormat vkd3d_get_vk_format(DXGI_FORMAT format) { - const struct vkd3d_format *vkd3d_format; + unsigned int i; - if (!(vkd3d_format = vkd3d_get_format(NULL, format, false))) - return VK_FORMAT_UNDEFINED; + for (i = 0; i < ARRAY_SIZE(vkd3d_formats); ++i) + { + if (vkd3d_formats[i].dxgi_format == format) + return vkd3d_formats[i].vk_format; + } - return vkd3d_format->vk_format; + return VK_FORMAT_UNDEFINED; } VKD3D_EXPORT DXGI_FORMAT vkd3d_get_dxgi_format(VkFormat format) diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 6ebf3e16..c71b083b 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -2613,6 +2613,7 @@ struct d3d12_device HRESULT removed_reason; + const struct vkd3d_format *formats; const struct vkd3d_format *depth_stencil_formats; unsigned int format_compatibility_list_count; const struct vkd3d_format_compatibility_list *format_compatibility_lists;