Module: vkd3d Branch: master Commit: 5d2b604b5cdb0b3f7a990df482c5d843886be4d5 URL: https://source.winehq.org/git/vkd3d.git/?a=commit;h=5d2b604b5cdb0b3f7a990df4...
Author: Conor McCarthy cmccarthy@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@codeweavers.com Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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;