d3d12: Only use DComp swapchains when alpha is present in the framebuffer

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36994>
This commit is contained in:
Jesse Natalie
2025-08-25 14:52:40 -07:00
committed by Marge Bot
parent 75d285c2e2
commit 11bf9ad9ee

View File

@@ -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<IDXGISwapChain1> 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())) ||