Conor McCarthy : vkd3d: Check specific formats for typed UAV load feature support.
Alexandre Julliard
julliard at winehq.org
Tue Aug 9 15:17:46 CDT 2022
Module: vkd3d
Branch: master
Commit: 971ab01add7318443766979ffd870fa57b383f32
URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/971ab01add7318443766979ffd870fa57b383f32
Author: Conor McCarthy <cmccarthy at codeweavers.com>
Date: Mon Aug 8 23:42:28 2022 +1000
vkd3d: Check specific formats for typed UAV load feature support.
Vulkan's shaderStorageImageExtendedFormats includes more formats than are
required by D3D12.
Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
libs/vkd3d/device.c | 42 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 41 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index eaedc444..ec6bb57c 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -1391,6 +1391,45 @@ static void vkd3d_device_vk_heaps_descriptor_limits_init(struct vkd3d_device_des
limits->sampler_max_descriptors = min(limits->sampler_max_descriptors, VKD3D_MAX_DESCRIPTOR_SET_SAMPLERS);
}
+static bool d3d12_device_supports_typed_uav_load_additional_formats(const struct d3d12_device *device)
+{
+ const struct vkd3d_vk_instance_procs *vk_procs = &device->vkd3d_instance->vk_procs;
+ const struct vkd3d_format *format;
+ VkFormatProperties properties;
+ unsigned int i;
+
+ static const DXGI_FORMAT additional_formats[] =
+ {
+ DXGI_FORMAT_R32G32B32A32_FLOAT,
+ DXGI_FORMAT_R32G32B32A32_UINT,
+ DXGI_FORMAT_R32G32B32A32_SINT,
+ DXGI_FORMAT_R16G16B16A16_FLOAT,
+ DXGI_FORMAT_R16G16B16A16_UINT,
+ DXGI_FORMAT_R16G16B16A16_SINT,
+ DXGI_FORMAT_R8G8B8A8_UNORM,
+ DXGI_FORMAT_R8G8B8A8_UINT,
+ DXGI_FORMAT_R8G8B8A8_SINT,
+ DXGI_FORMAT_R16_FLOAT,
+ DXGI_FORMAT_R16_UINT,
+ DXGI_FORMAT_R16_SINT,
+ DXGI_FORMAT_R8_UNORM,
+ DXGI_FORMAT_R8_UINT,
+ DXGI_FORMAT_R8_SINT,
+ };
+
+ for (i = 0; i < ARRAY_SIZE(additional_formats); ++i)
+ {
+ format = vkd3d_get_format(device, additional_formats[i], false);
+ assert(format);
+
+ VK_CALL(vkGetPhysicalDeviceFormatProperties(device->vk_physical_device, format->vk_format, &properties));
+ if (!((properties.linearTilingFeatures | properties.optimalTilingFeatures) & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT))
+ return false;
+ }
+
+ return true;
+}
+
static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
const struct vkd3d_device_create_info *create_info,
struct vkd3d_physical_device_info *physical_device_info,
@@ -1455,7 +1494,8 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
else
device->feature_options.ResourceBindingTier = D3D12_RESOURCE_BINDING_TIER_3;
- device->feature_options.TypedUAVLoadAdditionalFormats = features->shaderStorageImageExtendedFormats;
+ device->feature_options.TypedUAVLoadAdditionalFormats = features->shaderStorageImageReadWithoutFormat
+ && d3d12_device_supports_typed_uav_load_additional_formats(device);
/* GL_INTEL_fragment_shader_ordering, no Vulkan equivalent. */
device->feature_options.ROVsSupported = FALSE;
/* GL_INTEL_conservative_rasterization, no Vulkan equivalent. */
More information about the wine-cvs
mailing list