Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/HansKristian-Work/vkd3d-proton.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Ashton <joshua@froggi.es>2022-09-10 00:26:42 +0300
committerHans-Kristian Arntzen <post@arntzen-software.no>2022-09-16 15:11:07 +0300
commitc48c15444854fd456b00b483cf89cd2b23a2cb04 (patch)
tree10a6474f4157820734db3edd61650f8d9b3ded77
parent60d139d34fb4accafa52df48486d20fbc83f85b2 (diff)
vkd3d: Implement CheckColorSpaceSupport
Simply checks if we have a surface format that supports the given color space.
-rw-r--r--libs/vkd3d/swapchain.c51
1 files changed, 46 insertions, 5 deletions
diff --git a/libs/vkd3d/swapchain.c b/libs/vkd3d/swapchain.c
index 3fc18a7d..1f71e0a7 100644
--- a/libs/vkd3d/swapchain.c
+++ b/libs/vkd3d/swapchain.c
@@ -2636,19 +2636,60 @@ static UINT STDMETHODCALLTYPE d3d12_swapchain_GetCurrentBackBufferIndex(dxgi_swa
return index;
}
+static VkColorSpaceKHR convert_color_space(DXGI_COLOR_SPACE_TYPE dxgi_color_space)
+{
+ switch (dxgi_color_space)
+ {
+ case DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709:
+ return VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
+ case DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020:
+ return VK_COLOR_SPACE_HDR10_ST2084_EXT;
+ case DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709:
+ return VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT;
+ default:
+ WARN("Unhandled color space %#x. Falling back to sRGB.\n", dxgi_color_space);
+ return VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
+ }
+}
+
static HRESULT STDMETHODCALLTYPE d3d12_swapchain_CheckColorSpaceSupport(dxgi_swapchain_iface *iface,
DXGI_COLOR_SPACE_TYPE colour_space, UINT *colour_space_support)
{
+ struct d3d12_swapchain *swapchain = d3d12_swapchain_from_IDXGISwapChain(iface);
+ const struct d3d12_device* device = d3d12_swapchain_device(swapchain);
+ VkColorSpaceKHR vk_color_space = convert_color_space(colour_space);
+ const struct vkd3d_vk_device_procs* vk_procs = &device->vk_procs;
+ VkSurfaceFormatKHR* formats;
+ uint32_t i, format_count;
UINT support_flags = 0;
-
- FIXME("iface %p, colour_space %#x, colour_space_support %p semi-stub!\n",
- iface, colour_space, colour_space_support);
+ VkResult vr;
if (!colour_space_support)
return E_INVALIDARG;
- if (colour_space == DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709)
- support_flags |= DXGI_SWAP_CHAIN_COLOR_SPACE_SUPPORT_FLAG_PRESENT;
+ vr = VK_CALL(vkGetPhysicalDeviceSurfaceFormatsKHR(device->vk_physical_device, swapchain->vk_surface, &format_count, NULL));
+ if (vr < 0 || !format_count)
+ {
+ WARN("Failed to get supported surface formats, vr %d.\n", vr);
+ return DXGI_ERROR_INVALID_CALL;
+ }
+
+ if (!(formats = vkd3d_calloc(format_count, sizeof(*formats))))
+ return E_OUTOFMEMORY;
+
+ if ((vr = VK_CALL(vkGetPhysicalDeviceSurfaceFormatsKHR(device->vk_physical_device, swapchain->vk_surface, &format_count, formats))) < 0)
+ {
+ WARN("Failed to enumerate supported surface formats, vr %d.\n", vr);
+ vkd3d_free(formats);
+ return hresult_from_vk_result(vr);
+ }
+
+ for (i = 0; i < format_count; i++)
+ {
+ if (formats[i].colorSpace == vk_color_space)
+ support_flags |= DXGI_SWAP_CHAIN_COLOR_SPACE_SUPPORT_FLAG_PRESENT;
+ }
+ vkd3d_free(formats);
*colour_space_support = support_flags;
return S_OK;