Conor McCarthy : vkd3d: Handle D3D12_TEXTURE_ADDRESS_MODE_MIRROR_ONCE using a Vulkan extension.

Alexandre Julliard julliard at winehq.org
Mon Jan 10 15:57:17 CST 2022


Module: vkd3d
Branch: master
Commit: 5d2b604b5cdb0b3f7a990df482c5d843886be4d5
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=5d2b604b5cdb0b3f7a990df482c5d843886be4d5

Author: Conor McCarthy <cmccarthy at codeweavers.com>
Date:   Mon Jan 10 16:08:27 2022 +1000

vkd3d: Handle D3D12_TEXTURE_ADDRESS_MODE_MIRROR_ONCE using a Vulkan extension.

Used by Cyberpunk 2077.

Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 libs/vkd3d/device.c        |  1 +
 libs/vkd3d/resource.c      | 14 +++++++++-----
 libs/vkd3d/vkd3d_private.h |  1 +
 3 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index 4a9a0c7..4ce3ed8 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -128,6 +128,7 @@ static const struct vkd3d_optional_extension_info optional_device_extensions[] =
     VK_EXTENSION(KHR_IMAGE_FORMAT_LIST, KHR_image_format_list),
     VK_EXTENSION(KHR_MAINTENANCE3, KHR_maintenance3),
     VK_EXTENSION(KHR_PUSH_DESCRIPTOR, KHR_push_descriptor),
+    VK_EXTENSION(KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE, KHR_sampler_mirror_clamp_to_edge),
     /* EXT extensions */
     VK_EXTENSION(EXT_CONDITIONAL_RENDERING, EXT_conditional_rendering),
     VK_EXTENSION(EXT_DEBUG_MARKER, EXT_debug_marker),
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index fb5346e..78b32bd 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -3044,7 +3044,8 @@ static VkSamplerMipmapMode vk_mipmap_mode_from_d3d12(D3D12_FILTER_TYPE type)
     }
 }
 
-static VkSamplerAddressMode vk_address_mode_from_d3d12(D3D12_TEXTURE_ADDRESS_MODE mode)
+static VkSamplerAddressMode vk_address_mode_from_d3d12(const struct d3d12_device *device,
+        D3D12_TEXTURE_ADDRESS_MODE mode)
 {
     switch (mode)
     {
@@ -3056,7 +3057,10 @@ static VkSamplerAddressMode vk_address_mode_from_d3d12(D3D12_TEXTURE_ADDRESS_MOD
             return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
         case D3D12_TEXTURE_ADDRESS_MODE_BORDER:
             return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
-            /* D3D12_TEXTURE_ADDRESS_MODE_MIRROR_ONCE requires VK_KHR_mirror_clamp_to_edge. */
+        case D3D12_TEXTURE_ADDRESS_MODE_MIRROR_ONCE:
+            if (device->vk_info.KHR_sampler_mirror_clamp_to_edge)
+                return VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
+            /* Fall through */
         default:
             FIXME("Unhandled address mode %#x.\n", mode);
             return VK_SAMPLER_ADDRESS_MODE_REPEAT;
@@ -3085,9 +3089,9 @@ static VkResult d3d12_create_sampler(struct d3d12_device *device, D3D12_FILTER f
     sampler_desc.magFilter = vk_filter_from_d3d12(D3D12_DECODE_MAG_FILTER(filter));
     sampler_desc.minFilter = vk_filter_from_d3d12(D3D12_DECODE_MIN_FILTER(filter));
     sampler_desc.mipmapMode = vk_mipmap_mode_from_d3d12(D3D12_DECODE_MIP_FILTER(filter));
-    sampler_desc.addressModeU = vk_address_mode_from_d3d12(address_u);
-    sampler_desc.addressModeV = vk_address_mode_from_d3d12(address_v);
-    sampler_desc.addressModeW = vk_address_mode_from_d3d12(address_w);
+    sampler_desc.addressModeU = vk_address_mode_from_d3d12(device, address_u);
+    sampler_desc.addressModeV = vk_address_mode_from_d3d12(device, address_v);
+    sampler_desc.addressModeW = vk_address_mode_from_d3d12(device, address_w);
     sampler_desc.mipLodBias = mip_lod_bias;
     sampler_desc.anisotropyEnable = D3D12_DECODE_IS_ANISOTROPIC_FILTER(filter);
     sampler_desc.maxAnisotropy = max_anisotropy;
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 454b066..047f4a2 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -106,6 +106,7 @@ struct vkd3d_vulkan_info
     bool KHR_image_format_list;
     bool KHR_maintenance3;
     bool KHR_push_descriptor;
+    bool KHR_sampler_mirror_clamp_to_edge;
     /* EXT device extensions */
     bool EXT_conditional_rendering;
     bool EXT_debug_marker;




More information about the wine-cvs mailing list