You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-23 15:16:17 +00:00
Create HWND swap chain when window transparency is disabled on D3D12.
This commit is contained in:
@@ -2932,6 +2932,15 @@ Error RenderingDeviceDriverD3D12::swap_chain_resize(CommandQueueID p_cmd_queue,
|
||||
_swap_chain_release(swap_chain);
|
||||
}
|
||||
|
||||
#ifdef DCOMP_ENABLED
|
||||
bool create_for_composition = OS::get_singleton()->is_layered_allowed();
|
||||
#else
|
||||
if (OS::get_singleton()->is_layered_allowed()) {
|
||||
WARN_PRINT_ONCE("Window transparency is not supported without DirectComposition on D3D12.");
|
||||
}
|
||||
bool create_for_composition = false;
|
||||
#endif
|
||||
|
||||
DXGI_SWAP_CHAIN_DESC1 swap_chain_desc = {};
|
||||
if (swap_chain->d3d_swap_chain != nullptr) {
|
||||
_swap_chain_release_buffers(swap_chain);
|
||||
@@ -2945,7 +2954,7 @@ Error RenderingDeviceDriverD3D12::swap_chain_resize(CommandQueueID p_cmd_queue,
|
||||
swap_chain_desc.SampleDesc.Count = 1;
|
||||
swap_chain_desc.Flags = creation_flags;
|
||||
swap_chain_desc.Scaling = DXGI_SCALING_STRETCH;
|
||||
if (OS::get_singleton()->is_layered_allowed()) {
|
||||
if (create_for_composition) {
|
||||
swap_chain_desc.AlphaMode = DXGI_ALPHA_MODE_PREMULTIPLIED;
|
||||
has_comp_alpha[(uint64_t)p_cmd_queue.id] = true;
|
||||
} else {
|
||||
@@ -2956,16 +2965,12 @@ Error RenderingDeviceDriverD3D12::swap_chain_resize(CommandQueueID p_cmd_queue,
|
||||
swap_chain_desc.Height = surface->height;
|
||||
|
||||
ComPtr<IDXGISwapChain1> swap_chain_1;
|
||||
#ifdef DCOMP_ENABLED
|
||||
res = context_driver->dxgi_factory_get()->CreateSwapChainForComposition(command_queue->d3d_queue.Get(), &swap_chain_desc, nullptr, swap_chain_1.GetAddressOf());
|
||||
#else
|
||||
res = context_driver->dxgi_factory_get()->CreateSwapChainForHwnd(command_queue->d3d_queue.Get(), surface->hwnd, &swap_chain_desc, nullptr, nullptr, swap_chain_1.GetAddressOf());
|
||||
if (!SUCCEEDED(res) && swap_chain_desc.AlphaMode != DXGI_ALPHA_MODE_IGNORE) {
|
||||
swap_chain_desc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;
|
||||
has_comp_alpha[(uint64_t)p_cmd_queue.id] = false;
|
||||
if (create_for_composition) {
|
||||
res = context_driver->dxgi_factory_get()->CreateSwapChainForComposition(command_queue->d3d_queue.Get(), &swap_chain_desc, nullptr, swap_chain_1.GetAddressOf());
|
||||
} else {
|
||||
res = context_driver->dxgi_factory_get()->CreateSwapChainForHwnd(command_queue->d3d_queue.Get(), surface->hwnd, &swap_chain_desc, nullptr, nullptr, swap_chain_1.GetAddressOf());
|
||||
}
|
||||
#endif
|
||||
|
||||
ERR_FAIL_COND_V(!SUCCEEDED(res), ERR_CANT_CREATE);
|
||||
|
||||
swap_chain_1.As(&swap_chain->d3d_swap_chain);
|
||||
@@ -2976,34 +2981,36 @@ Error RenderingDeviceDriverD3D12::swap_chain_resize(CommandQueueID p_cmd_queue,
|
||||
}
|
||||
|
||||
#ifdef DCOMP_ENABLED
|
||||
if (surface->composition_device.Get() == nullptr) {
|
||||
using PFN_DCompositionCreateDevice = HRESULT(WINAPI *)(IDXGIDevice *, REFIID, void **);
|
||||
PFN_DCompositionCreateDevice pfn_DCompositionCreateDevice = (PFN_DCompositionCreateDevice)(void *)GetProcAddress(context_driver->lib_dcomp, "DCompositionCreateDevice");
|
||||
ERR_FAIL_NULL_V(pfn_DCompositionCreateDevice, ERR_CANT_CREATE);
|
||||
if (create_for_composition) {
|
||||
if (surface->composition_device.Get() == nullptr) {
|
||||
using PFN_DCompositionCreateDevice = HRESULT(WINAPI *)(IDXGIDevice *, REFIID, void **);
|
||||
PFN_DCompositionCreateDevice pfn_DCompositionCreateDevice = (PFN_DCompositionCreateDevice)(void *)GetProcAddress(context_driver->lib_dcomp, "DCompositionCreateDevice");
|
||||
ERR_FAIL_NULL_V(pfn_DCompositionCreateDevice, ERR_CANT_CREATE);
|
||||
|
||||
res = pfn_DCompositionCreateDevice(nullptr, IID_PPV_ARGS(surface->composition_device.GetAddressOf()));
|
||||
ERR_FAIL_COND_V(!SUCCEEDED(res), ERR_CANT_CREATE);
|
||||
res = pfn_DCompositionCreateDevice(nullptr, IID_PPV_ARGS(surface->composition_device.GetAddressOf()));
|
||||
ERR_FAIL_COND_V(!SUCCEEDED(res), ERR_CANT_CREATE);
|
||||
|
||||
res = surface->composition_device->CreateTargetForHwnd(surface->hwnd, TRUE, surface->composition_target.GetAddressOf());
|
||||
ERR_FAIL_COND_V(!SUCCEEDED(res), ERR_CANT_CREATE);
|
||||
res = surface->composition_device->CreateTargetForHwnd(surface->hwnd, TRUE, surface->composition_target.GetAddressOf());
|
||||
ERR_FAIL_COND_V(!SUCCEEDED(res), ERR_CANT_CREATE);
|
||||
|
||||
res = surface->composition_device->CreateVisual(surface->composition_visual.GetAddressOf());
|
||||
ERR_FAIL_COND_V(!SUCCEEDED(res), ERR_CANT_CREATE);
|
||||
res = surface->composition_device->CreateVisual(surface->composition_visual.GetAddressOf());
|
||||
ERR_FAIL_COND_V(!SUCCEEDED(res), ERR_CANT_CREATE);
|
||||
|
||||
res = surface->composition_visual->SetContent(swap_chain->d3d_swap_chain.Get());
|
||||
ERR_FAIL_COND_V(!SUCCEEDED(res), ERR_CANT_CREATE);
|
||||
res = surface->composition_visual->SetContent(swap_chain->d3d_swap_chain.Get());
|
||||
ERR_FAIL_COND_V(!SUCCEEDED(res), ERR_CANT_CREATE);
|
||||
|
||||
res = surface->composition_target->SetRoot(surface->composition_visual.Get());
|
||||
ERR_FAIL_COND_V(!SUCCEEDED(res), ERR_CANT_CREATE);
|
||||
res = surface->composition_target->SetRoot(surface->composition_visual.Get());
|
||||
ERR_FAIL_COND_V(!SUCCEEDED(res), ERR_CANT_CREATE);
|
||||
|
||||
res = surface->composition_device->Commit();
|
||||
ERR_FAIL_COND_V(!SUCCEEDED(res), ERR_CANT_CREATE);
|
||||
} else {
|
||||
res = surface->composition_visual->SetContent(swap_chain->d3d_swap_chain.Get());
|
||||
ERR_FAIL_COND_V(!SUCCEEDED(res), ERR_CANT_CREATE);
|
||||
res = surface->composition_device->Commit();
|
||||
ERR_FAIL_COND_V(!SUCCEEDED(res), ERR_CANT_CREATE);
|
||||
} else {
|
||||
res = surface->composition_visual->SetContent(swap_chain->d3d_swap_chain.Get());
|
||||
ERR_FAIL_COND_V(!SUCCEEDED(res), ERR_CANT_CREATE);
|
||||
|
||||
res = surface->composition_device->Commit();
|
||||
ERR_FAIL_COND_V(!SUCCEEDED(res), ERR_CANT_CREATE);
|
||||
res = surface->composition_device->Commit();
|
||||
ERR_FAIL_COND_V(!SUCCEEDED(res), ERR_CANT_CREATE);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user