From 11bf9ad9ee6a23c3202d1a0a6aad35d0a9645494 Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Mon, 25 Aug 2025 14:52:40 -0700 Subject: [PATCH] d3d12: Only use DComp swapchains when alpha is present in the framebuffer Part-of: --- .../d3d12/wgl/d3d12_wgl_framebuffer.cpp | 49 ++++++++++++------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp b/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp index 31917eb359b..8f239d90292 100644 --- a/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp +++ b/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp @@ -179,30 +179,45 @@ d3d12_wgl_framebuffer_resize(stw_winsys_framebuffer *fb, break; } - if (!framebuffer->dcomp) { - framebuffer->dcomp.Attach(dcomp_get_device()); + if (desc.AlphaMode != DXGI_ALPHA_MODE_IGNORE) { if (!framebuffer->dcomp) { - debug_printf("D3D12: failed to create dcomp device\n"); - return; + framebuffer->dcomp.Attach(dcomp_get_device()); + if (!framebuffer->dcomp) { + debug_printf("D3D12: failed to create dcomp device\n"); + return; + } } - } - if (!framebuffer->target) { - if (FAILED(framebuffer->dcomp->CreateTargetForHwnd(framebuffer->window, TRUE, &framebuffer->target))) { - debug_printf("D3D12: failed to create dcomp target\n"); - return; + if (!framebuffer->target) { + if (FAILED(framebuffer->dcomp->CreateTargetForHwnd(framebuffer->window, TRUE, &framebuffer->target))) { + debug_printf("D3D12: failed to create dcomp target\n"); + return; + } } } if (!framebuffer->swapchain) { ComPtr swapchain1; - if (FAILED(screen->factory->CreateSwapChainForComposition( - screen->base.cmdqueue, - &desc, - nullptr, - &swapchain1))) { - debug_printf("D3D12: failed to create swapchain\n"); - return; + if (desc.AlphaMode != DXGI_ALPHA_MODE_IGNORE) { + if (FAILED(screen->factory->CreateSwapChainForComposition( + screen->base.cmdqueue, + &desc, + nullptr, + &swapchain1))) { + debug_printf("D3D12: failed to create swapchain\n"); + return; + } + } else { + if (FAILED(screen->factory->CreateSwapChainForHwnd( + screen->base.cmdqueue, + framebuffer->window, + &desc, + nullptr, + nullptr, + &swapchain1))) { + debug_printf("D3D12: failed to create swapchain\n"); + return; + } } swapchain1.As(&framebuffer->swapchain); @@ -235,7 +250,7 @@ d3d12_wgl_framebuffer_resize(stw_winsys_framebuffer *fb, } } - if (!framebuffer->visual) { + if (!framebuffer->visual && desc.AlphaMode != DXGI_ALPHA_MODE_IGNORE) { if (FAILED(framebuffer->dcomp->CreateVisual(&framebuffer->visual)) || FAILED(framebuffer->target->SetRoot(framebuffer->visual.Get())) || FAILED(framebuffer->visual->SetContent(framebuffer->swapchain.Get())) ||