vulkan/wsi: Support alpha swapchains on win32

Map VkSwapchainCreateInfoKHR.compositeAlpha to corresponding
DXGI_SWAP_CHAIN_DESC1.alphaMode.

Add VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR to capabilities as
it was missing there.

Signed-off-by: Benjamin Otte <otte@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32048>
This commit is contained in:
Benjamin Otte 2024-11-08 00:08:58 +01:00 committed by Marge Bot
parent f2f4206d49
commit e757238370

View file

@ -209,7 +209,8 @@ wsi_win32_surface_get_capabilities(VkIcdSurfaceBase *surf,
caps->supportedCompositeAlpha =
VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR |
VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR;
VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR |
VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR;
caps->supportedUsageFlags = wsi_caps_get_image_usage();
@ -751,6 +752,22 @@ wsi_win32_surface_create_swapchain_dxgi(
ID3D12CommandQueue *queue =
(ID3D12CommandQueue *)wsi->wsi->win32.get_d3d12_command_queue(device);
DXGI_ALPHA_MODE alpha_mode;
switch (create_info->compositeAlpha) {
case VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR:
alpha_mode = DXGI_ALPHA_MODE_IGNORE;
break;
case VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR:
alpha_mode = DXGI_ALPHA_MODE_PREMULTIPLIED;
break;
case VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR:
alpha_mode = DXGI_ALPHA_MODE_STRAIGHT;
break;
default:
alpha_mode = DXGI_ALPHA_MODE_UNSPECIFIED;
break;
}
DXGI_SWAP_CHAIN_DESC1 desc = {
create_info->imageExtent.width,
create_info->imageExtent.height,
@ -761,7 +778,7 @@ wsi_win32_surface_create_swapchain_dxgi(
create_info->minImageCount,
DXGI_SCALING_STRETCH,
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL,
DXGI_ALPHA_MODE_UNSPECIFIED,
alpha_mode,
chain->base.present_mode == VK_PRESENT_MODE_IMMEDIATE_KHR ?
DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0u
};