diff --git a/1364.patch b/1364.patch new file mode 100644 index 00000000..89e6cfc7 --- /dev/null +++ b/1364.patch @@ -0,0 +1,182 @@ +From 9b7625f03e96cccf4733b700f16c56e0b0fae42e Mon Sep 17 00:00:00 2001 +From: Dario +Date: Thu, 13 Mar 2025 19:08:35 -0300 +Subject: [PATCH 1/3] Remove the need for waitIdle from Vulkan. + +--- + UnleashedRecomp/gpu/video.cpp | 24 +++++++++++------------- + 1 file changed, 11 insertions(+), 13 deletions(-) + +diff --git a/UnleashedRecomp/gpu/video.cpp b/UnleashedRecomp/gpu/video.cpp +index e24ce4de..f9ba6820 100644 +--- a/UnleashedRecomp/gpu/video.cpp ++++ b/UnleashedRecomp/gpu/video.cpp +@@ -1973,23 +1973,21 @@ void Video::WaitForGPU() + { + g_waitForGPUCount++; + +- if (g_vulkan) +- { +- g_device->waitIdle(); +- } +- else ++ // Wait for all queue frames to finish. ++ for (size_t i = 0; i < NUM_FRAMES; i++) + { +- for (size_t i = 0; i < NUM_FRAMES; i++) ++ if (g_commandListStates[i]) + { +- if (g_commandListStates[i]) +- { +- g_queue->waitForCommandFence(g_commandFences[i].get()); +- g_commandListStates[i] = false; +- } ++ g_queue->waitForCommandFence(g_commandFences[i].get()); ++ g_commandListStates[i] = false; + } +- g_queue->executeCommandLists(nullptr, g_commandFences[0].get()); +- g_queue->waitForCommandFence(g_commandFences[0].get()); + } ++ ++ // Execute an empty command list and wait for it to end to guarantee that any remaining presentation has finished. ++ g_commandLists[0]->begin(); ++ g_commandLists[0]->end(); ++ g_queue->executeCommandLists(g_commandLists[0].get(), g_commandFences[0].get()); ++ g_queue->waitForCommandFence(g_commandFences[0].get()); + } + + static uint32_t CreateDevice(uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5, be* a6) + +From cb4eaae9ff98fd6d6f73f2a2badc556ff8ea7357 Mon Sep 17 00:00:00 2001 +From: Dario +Date: Thu, 13 Mar 2025 19:11:02 -0300 +Subject: [PATCH 2/3] Remove waitIdle and only accept valid pointers on + execute. + +--- + UnleashedRecomp/gpu/rhi/plume_d3d12.cpp | 11 ++++------- + UnleashedRecomp/gpu/rhi/plume_d3d12.h | 1 - + UnleashedRecomp/gpu/rhi/plume_render_interface.h | 3 +-- + UnleashedRecomp/gpu/rhi/plume_vulkan.cpp | 4 ---- + UnleashedRecomp/gpu/rhi/plume_vulkan.h | 1 - + 5 files changed, 5 insertions(+), 15 deletions(-) + +diff --git a/UnleashedRecomp/gpu/rhi/plume_d3d12.cpp b/UnleashedRecomp/gpu/rhi/plume_d3d12.cpp +index 395630c2..31e4dfac 100644 +--- a/UnleashedRecomp/gpu/rhi/plume_d3d12.cpp ++++ b/UnleashedRecomp/gpu/rhi/plume_d3d12.cpp +@@ -2285,6 +2285,9 @@ namespace plume { + } + + void D3D12CommandQueue::executeCommandLists(const RenderCommandList **commandLists, uint32_t commandListCount, RenderCommandSemaphore **waitSemaphores, uint32_t waitSemaphoreCount, RenderCommandSemaphore **signalSemaphores, uint32_t signalSemaphoreCount, RenderCommandFence *signalFence) { ++ assert(commandLists != nullptr); ++ assert(commandListCount > 0); ++ + for (uint32_t i = 0; i < waitSemaphoreCount; i++) { + D3D12CommandSemaphore *interfaceSemaphore = static_cast(waitSemaphores[i]); + d3d->Wait(interfaceSemaphore->d3d, interfaceSemaphore->semaphoreValue); +@@ -2297,9 +2300,7 @@ namespace plume { + executionVector.emplace_back(static_cast(interfaceCommandList->d3d)); + } + +- if (!executionVector.empty()) { +- d3d->ExecuteCommandLists(UINT(executionVector.size()), executionVector.data()); +- } ++ d3d->ExecuteCommandLists(UINT(executionVector.size()), executionVector.data()); + + for (uint32_t i = 0; i < signalSemaphoreCount; i++) { + D3D12CommandSemaphore *interfaceSemaphore = static_cast(signalSemaphores[i]); +@@ -3798,10 +3799,6 @@ namespace plume { + return countsSupported; + } + +- void D3D12Device::waitIdle() const { +- assert(false && "Use fences to replicate wait idle behavior on D3D12."); +- } +- + void D3D12Device::release() { + if (d3d != nullptr) { + d3d->Release(); +diff --git a/UnleashedRecomp/gpu/rhi/plume_d3d12.h b/UnleashedRecomp/gpu/rhi/plume_d3d12.h +index d4987fbc..83304b41 100644 +--- a/UnleashedRecomp/gpu/rhi/plume_d3d12.h ++++ b/UnleashedRecomp/gpu/rhi/plume_d3d12.h +@@ -459,7 +459,6 @@ namespace plume { + const RenderDeviceCapabilities &getCapabilities() const override; + const RenderDeviceDescription &getDescription() const override; + RenderSampleCounts getSampleCountsSupported(RenderFormat format) const override; +- void waitIdle() const override; + void release(); + bool isValid() const; + }; +diff --git a/UnleashedRecomp/gpu/rhi/plume_render_interface.h b/UnleashedRecomp/gpu/rhi/plume_render_interface.h +index e62db052..15f661e7 100644 +--- a/UnleashedRecomp/gpu/rhi/plume_render_interface.h ++++ b/UnleashedRecomp/gpu/rhi/plume_render_interface.h +@@ -200,7 +200,7 @@ namespace plume { + + // Concrete implementation shortcuts. + inline void executeCommandLists(const RenderCommandList *commandList, RenderCommandFence *signalFence = nullptr) { +- executeCommandLists(commandList != nullptr ? &commandList : nullptr, commandList != nullptr ? 1 : 0, nullptr, 0, nullptr, 0, signalFence); ++ executeCommandLists(&commandList, 1, nullptr, 0, nullptr, 0, signalFence); + } + }; + +@@ -242,7 +242,6 @@ namespace plume { + virtual const RenderDeviceCapabilities &getCapabilities() const = 0; + virtual const RenderDeviceDescription &getDescription() const = 0; + virtual RenderSampleCounts getSampleCountsSupported(RenderFormat format) const = 0; +- virtual void waitIdle() const = 0; + }; + + struct RenderInterface { +diff --git a/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp b/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp +index 477a431a..bfac73aa 100644 +--- a/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp ++++ b/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp +@@ -4190,10 +4190,6 @@ namespace plume { + } + } + +- void VulkanDevice::waitIdle() const { +- vkDeviceWaitIdle(vk); +- } +- + void VulkanDevice::release() { + if (allocator != VK_NULL_HANDLE) { + vmaDestroyAllocator(allocator); +diff --git a/UnleashedRecomp/gpu/rhi/plume_vulkan.h b/UnleashedRecomp/gpu/rhi/plume_vulkan.h +index e25e1869..27cda006 100644 +--- a/UnleashedRecomp/gpu/rhi/plume_vulkan.h ++++ b/UnleashedRecomp/gpu/rhi/plume_vulkan.h +@@ -430,7 +430,6 @@ namespace plume { + const RenderDeviceCapabilities &getCapabilities() const override; + const RenderDeviceDescription &getDescription() const override; + RenderSampleCounts getSampleCountsSupported(RenderFormat format) const override; +- void waitIdle() const override; + void release(); + bool isValid() const; + }; + +From 888f11e7f4472a3e4f67fe1a9c33318a44d097c9 Mon Sep 17 00:00:00 2001 +From: Dario +Date: Thu, 13 Mar 2025 19:12:05 -0300 +Subject: [PATCH 3/3] Update comment. + +--- + UnleashedRecomp/gpu/video.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/UnleashedRecomp/gpu/video.cpp b/UnleashedRecomp/gpu/video.cpp +index f9ba6820..f80e04fd 100644 +--- a/UnleashedRecomp/gpu/video.cpp ++++ b/UnleashedRecomp/gpu/video.cpp +@@ -1973,7 +1973,7 @@ void Video::WaitForGPU() + { + g_waitForGPUCount++; + +- // Wait for all queue frames to finish. ++ // Wait for all queued frames to finish. + for (size_t i = 0; i < NUM_FRAMES; i++) + { + if (g_commandListStates[i]) diff --git a/1449.patch b/1449.patch new file mode 100644 index 00000000..cb2e4f1f --- /dev/null +++ b/1449.patch @@ -0,0 +1,27 @@ +From 220eaa19ac55f0de5beeb0794aba23f5e5e2b1de Mon Sep 17 00:00:00 2001 +From: AL2009man <67606569+AL2009man@users.noreply.github.com> +Date: Thu, 20 Mar 2025 23:25:09 -0400 +Subject: [PATCH] Updated SDL2 Submodule to Version 2.32.x Release Build + +when UnleashedRecomp was released, it was running on SDL2 2.29.2 pre-release, this ultimately become 2.30.0. To closely align with the most up-to-date version of SDL2 and SDL2 Mixer: the submodule for both of them has been updated to be based on the 2.32.X branch. + +Specifically: SDL Version 2.32.2-9-g2708e08f4, and SDL2_mixer 2.8.1. +--- + thirdparty/SDL | 2 +- + thirdparty/SDL_mixer | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/thirdparty/SDL b/thirdparty/SDL +index 1edaad17..2708e08f 160000 +--- a/thirdparty/SDL ++++ b/thirdparty/SDL +@@ -1 +1 @@ +-Subproject commit 1edaad17218d67b567c149badce9ef0fc67f65fa ++Subproject commit 2708e08f40933d57aee0ba5f3406f1f75f3d9f55 +diff --git a/thirdparty/SDL_mixer b/thirdparty/SDL_mixer +index 43799269..942151a4 160000 +--- a/thirdparty/SDL_mixer ++++ b/thirdparty/SDL_mixer +@@ -1 +1 @@ +-Subproject commit 437992692cf9300f2b2f04be35adc7445a9055bf ++Subproject commit 942151a4e8594a79037826963a5bc1e1add7bc3b diff --git a/CMakeLists.txt b/CMakeLists.txt index 9032d762..94e17699 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,7 @@ set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") # Target Sandy Bridge for all projects add_compile_options( - -march=sandybridge + -march=native ) add_subdirectory(${UNLEASHED_RECOMP_THIRDPARTY_ROOT}) diff --git a/UnleashedRecomp/gpu/rhi/plume_d3d12.cpp b/UnleashedRecomp/gpu/rhi/plume_d3d12.cpp index 073ea68a..8100108c 100644 --- a/UnleashedRecomp/gpu/rhi/plume_d3d12.cpp +++ b/UnleashedRecomp/gpu/rhi/plume_d3d12.cpp @@ -2287,6 +2287,9 @@ namespace plume { } void D3D12CommandQueue::executeCommandLists(const RenderCommandList **commandLists, uint32_t commandListCount, RenderCommandSemaphore **waitSemaphores, uint32_t waitSemaphoreCount, RenderCommandSemaphore **signalSemaphores, uint32_t signalSemaphoreCount, RenderCommandFence *signalFence) { + assert(commandLists != nullptr); + assert(commandListCount > 0); + for (uint32_t i = 0; i < waitSemaphoreCount; i++) { D3D12CommandSemaphore *interfaceSemaphore = static_cast(waitSemaphores[i]); d3d->Wait(interfaceSemaphore->d3d, interfaceSemaphore->semaphoreValue); @@ -2299,9 +2302,7 @@ namespace plume { executionVector.emplace_back(static_cast(interfaceCommandList->d3d)); } - if (!executionVector.empty()) { - d3d->ExecuteCommandLists(UINT(executionVector.size()), executionVector.data()); - } + d3d->ExecuteCommandLists(UINT(executionVector.size()), executionVector.data()); for (uint32_t i = 0; i < signalSemaphoreCount; i++) { D3D12CommandSemaphore *interfaceSemaphore = static_cast(signalSemaphores[i]); @@ -3827,10 +3828,6 @@ namespace plume { return countsSupported; } - void D3D12Device::waitIdle() const { - assert(false && "Use fences to replicate wait idle behavior on D3D12."); - } - void D3D12Device::release() { if (d3d != nullptr) { d3d->Release(); diff --git a/UnleashedRecomp/gpu/rhi/plume_d3d12.h b/UnleashedRecomp/gpu/rhi/plume_d3d12.h index 34461c07..13a8586c 100644 --- a/UnleashedRecomp/gpu/rhi/plume_d3d12.h +++ b/UnleashedRecomp/gpu/rhi/plume_d3d12.h @@ -461,7 +461,6 @@ namespace plume { const RenderDeviceCapabilities &getCapabilities() const override; const RenderDeviceDescription &getDescription() const override; RenderSampleCounts getSampleCountsSupported(RenderFormat format) const override; - void waitIdle() const override; void release(); bool isValid() const; }; diff --git a/UnleashedRecomp/gpu/rhi/plume_render_interface.h b/UnleashedRecomp/gpu/rhi/plume_render_interface.h index e62db052..15f661e7 100644 --- a/UnleashedRecomp/gpu/rhi/plume_render_interface.h +++ b/UnleashedRecomp/gpu/rhi/plume_render_interface.h @@ -200,7 +200,7 @@ namespace plume { // Concrete implementation shortcuts. inline void executeCommandLists(const RenderCommandList *commandList, RenderCommandFence *signalFence = nullptr) { - executeCommandLists(commandList != nullptr ? &commandList : nullptr, commandList != nullptr ? 1 : 0, nullptr, 0, nullptr, 0, signalFence); + executeCommandLists(&commandList, 1, nullptr, 0, nullptr, 0, signalFence); } }; @@ -242,7 +242,6 @@ namespace plume { virtual const RenderDeviceCapabilities &getCapabilities() const = 0; virtual const RenderDeviceDescription &getDescription() const = 0; virtual RenderSampleCounts getSampleCountsSupported(RenderFormat format) const = 0; - virtual void waitIdle() const = 0; }; struct RenderInterface { diff --git a/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp b/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp index 94f91faf..1fb74c6a 100644 --- a/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp +++ b/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp @@ -4207,10 +4207,6 @@ namespace plume { } } - void VulkanDevice::waitIdle() const { - vkDeviceWaitIdle(vk); - } - void VulkanDevice::release() { if (allocator != VK_NULL_HANDLE) { vmaDestroyAllocator(allocator); diff --git a/UnleashedRecomp/gpu/rhi/plume_vulkan.h b/UnleashedRecomp/gpu/rhi/plume_vulkan.h index e25e1869..27cda006 100644 --- a/UnleashedRecomp/gpu/rhi/plume_vulkan.h +++ b/UnleashedRecomp/gpu/rhi/plume_vulkan.h @@ -430,7 +430,6 @@ namespace plume { const RenderDeviceCapabilities &getCapabilities() const override; const RenderDeviceDescription &getDescription() const override; RenderSampleCounts getSampleCountsSupported(RenderFormat format) const override; - void waitIdle() const override; void release(); bool isValid() const; }; diff --git a/UnleashedRecomp/gpu/video.cpp b/UnleashedRecomp/gpu/video.cpp index 19c7fb64..1930c00e 100644 --- a/UnleashedRecomp/gpu/video.cpp +++ b/UnleashedRecomp/gpu/video.cpp @@ -1978,23 +1978,21 @@ void Video::WaitForGPU() { g_waitForGPUCount++; - if (g_vulkan) + // Wait for all queued frames to finish. + for (size_t i = 0; i < NUM_FRAMES; i++) { - g_device->waitIdle(); - } - else - { - for (size_t i = 0; i < NUM_FRAMES; i++) + if (g_commandListStates[i]) { - if (g_commandListStates[i]) - { - g_queue->waitForCommandFence(g_commandFences[i].get()); - g_commandListStates[i] = false; - } + g_queue->waitForCommandFence(g_commandFences[i].get()); + g_commandListStates[i] = false; } - g_queue->executeCommandLists(nullptr, g_commandFences[0].get()); - g_queue->waitForCommandFence(g_commandFences[0].get()); } + + // Execute an empty command list and wait for it to end to guarantee that any remaining presentation has finished. + g_commandLists[0]->begin(); + g_commandLists[0]->end(); + g_queue->executeCommandLists(g_commandLists[0].get(), g_commandFences[0].get()); + g_queue->waitForCommandFence(g_commandFences[0].get()); } static uint32_t CreateDevice(uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5, be* a6) diff --git a/nilton.patch b/nilton.patch new file mode 100644 index 00000000..0d05f63f --- /dev/null +++ b/nilton.patch @@ -0,0 +1,169 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 9032d76..94e1769 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -20,7 +20,7 @@ set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + + # Target Sandy Bridge for all projects + add_compile_options( +- -march=sandybridge ++ -march=native + ) + + add_subdirectory(${UNLEASHED_RECOMP_THIRDPARTY_ROOT}) +diff --git a/UnleashedRecomp/gpu/rhi/plume_d3d12.cpp b/UnleashedRecomp/gpu/rhi/plume_d3d12.cpp +index 073ea68..8100108 100644 +--- a/UnleashedRecomp/gpu/rhi/plume_d3d12.cpp ++++ b/UnleashedRecomp/gpu/rhi/plume_d3d12.cpp +@@ -2287,6 +2287,9 @@ namespace plume { + } + + void D3D12CommandQueue::executeCommandLists(const RenderCommandList **commandLists, uint32_t commandListCount, RenderCommandSemaphore **waitSemaphores, uint32_t waitSemaphoreCount, RenderCommandSemaphore **signalSemaphores, uint32_t signalSemaphoreCount, RenderCommandFence *signalFence) { ++ assert(commandLists != nullptr); ++ assert(commandListCount > 0); ++ + for (uint32_t i = 0; i < waitSemaphoreCount; i++) { + D3D12CommandSemaphore *interfaceSemaphore = static_cast(waitSemaphores[i]); + d3d->Wait(interfaceSemaphore->d3d, interfaceSemaphore->semaphoreValue); +@@ -2299,9 +2302,7 @@ namespace plume { + executionVector.emplace_back(static_cast(interfaceCommandList->d3d)); + } + +- if (!executionVector.empty()) { +- d3d->ExecuteCommandLists(UINT(executionVector.size()), executionVector.data()); +- } ++ d3d->ExecuteCommandLists(UINT(executionVector.size()), executionVector.data()); + + for (uint32_t i = 0; i < signalSemaphoreCount; i++) { + D3D12CommandSemaphore *interfaceSemaphore = static_cast(signalSemaphores[i]); +@@ -3827,10 +3828,6 @@ namespace plume { + return countsSupported; + } + +- void D3D12Device::waitIdle() const { +- assert(false && "Use fences to replicate wait idle behavior on D3D12."); +- } +- + void D3D12Device::release() { + if (d3d != nullptr) { + d3d->Release(); +diff --git a/UnleashedRecomp/gpu/rhi/plume_d3d12.h b/UnleashedRecomp/gpu/rhi/plume_d3d12.h +index 34461c0..13a8586 100644 +--- a/UnleashedRecomp/gpu/rhi/plume_d3d12.h ++++ b/UnleashedRecomp/gpu/rhi/plume_d3d12.h +@@ -461,7 +461,6 @@ namespace plume { + const RenderDeviceCapabilities &getCapabilities() const override; + const RenderDeviceDescription &getDescription() const override; + RenderSampleCounts getSampleCountsSupported(RenderFormat format) const override; +- void waitIdle() const override; + void release(); + bool isValid() const; + }; +diff --git a/UnleashedRecomp/gpu/rhi/plume_render_interface.h b/UnleashedRecomp/gpu/rhi/plume_render_interface.h +index e62db05..15f661e 100644 +--- a/UnleashedRecomp/gpu/rhi/plume_render_interface.h ++++ b/UnleashedRecomp/gpu/rhi/plume_render_interface.h +@@ -200,7 +200,7 @@ namespace plume { + + // Concrete implementation shortcuts. + inline void executeCommandLists(const RenderCommandList *commandList, RenderCommandFence *signalFence = nullptr) { +- executeCommandLists(commandList != nullptr ? &commandList : nullptr, commandList != nullptr ? 1 : 0, nullptr, 0, nullptr, 0, signalFence); ++ executeCommandLists(&commandList, 1, nullptr, 0, nullptr, 0, signalFence); + } + }; + +@@ -242,7 +242,6 @@ namespace plume { + virtual const RenderDeviceCapabilities &getCapabilities() const = 0; + virtual const RenderDeviceDescription &getDescription() const = 0; + virtual RenderSampleCounts getSampleCountsSupported(RenderFormat format) const = 0; +- virtual void waitIdle() const = 0; + }; + + struct RenderInterface { +diff --git a/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp b/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp +index 94f91fa..1fb74c6 100644 +--- a/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp ++++ b/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp +@@ -4207,10 +4207,6 @@ namespace plume { + } + } + +- void VulkanDevice::waitIdle() const { +- vkDeviceWaitIdle(vk); +- } +- + void VulkanDevice::release() { + if (allocator != VK_NULL_HANDLE) { + vmaDestroyAllocator(allocator); +diff --git a/UnleashedRecomp/gpu/rhi/plume_vulkan.h b/UnleashedRecomp/gpu/rhi/plume_vulkan.h +index e25e186..27cda00 100644 +--- a/UnleashedRecomp/gpu/rhi/plume_vulkan.h ++++ b/UnleashedRecomp/gpu/rhi/plume_vulkan.h +@@ -430,7 +430,6 @@ namespace plume { + const RenderDeviceCapabilities &getCapabilities() const override; + const RenderDeviceDescription &getDescription() const override; + RenderSampleCounts getSampleCountsSupported(RenderFormat format) const override; +- void waitIdle() const override; + void release(); + bool isValid() const; + }; +diff --git a/UnleashedRecomp/gpu/video.cpp b/UnleashedRecomp/gpu/video.cpp +index 19c7fb6..1930c00 100644 +--- a/UnleashedRecomp/gpu/video.cpp ++++ b/UnleashedRecomp/gpu/video.cpp +@@ -1978,23 +1978,21 @@ void Video::WaitForGPU() + { + g_waitForGPUCount++; + +- if (g_vulkan) +- { +- g_device->waitIdle(); +- } +- else ++ // Wait for all queued frames to finish. ++ for (size_t i = 0; i < NUM_FRAMES; i++) + { +- for (size_t i = 0; i < NUM_FRAMES; i++) ++ if (g_commandListStates[i]) + { +- if (g_commandListStates[i]) +- { +- g_queue->waitForCommandFence(g_commandFences[i].get()); +- g_commandListStates[i] = false; +- } ++ g_queue->waitForCommandFence(g_commandFences[i].get()); ++ g_commandListStates[i] = false; + } +- g_queue->executeCommandLists(nullptr, g_commandFences[0].get()); +- g_queue->waitForCommandFence(g_commandFences[0].get()); + } ++ ++ // Execute an empty command list and wait for it to end to guarantee that any remaining presentation has finished. ++ g_commandLists[0]->begin(); ++ g_commandLists[0]->end(); ++ g_queue->executeCommandLists(g_commandLists[0].get(), g_commandFences[0].get()); ++ g_queue->waitForCommandFence(g_commandFences[0].get()); + } + + static uint32_t CreateDevice(uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5, be* a6) +diff --git a/thirdparty/Vulkan-Headers b/thirdparty/Vulkan-Headers +index 14345da..78c3597 160000 +--- a/thirdparty/Vulkan-Headers ++++ b/thirdparty/Vulkan-Headers +@@ -1 +1 @@ +-Subproject commit 14345dab231912ee9601136e96ca67a6e1f632e7 ++Subproject commit 78c359741d855213e8685278eb81bb62599f8e56 +diff --git a/thirdparty/VulkanMemoryAllocator b/thirdparty/VulkanMemoryAllocator +index 1c35ba9..29b35ea 160000 +--- a/thirdparty/VulkanMemoryAllocator ++++ b/thirdparty/VulkanMemoryAllocator +@@ -1 +1 @@ +-Subproject commit 1c35ba99ce775f8342d87a83a3f0f696f99c2a39 ++Subproject commit 29b35ea4232688c0f42cdff0c10848290760a417 +diff --git a/thirdparty/vcpkg b/thirdparty/vcpkg +index b322364..b1d8051 160000 +--- a/thirdparty/vcpkg ++++ b/thirdparty/vcpkg +@@ -1 +1 @@ +-Subproject commit b322364f06308bdd24823f9d8f03fe0cc86fd46f ++Subproject commit b1d8051c9259b82fda906e0e8249e7d848efdbaa diff --git a/thirdparty/Vulkan-Headers b/thirdparty/Vulkan-Headers index 14345dab..78c35974 160000 --- a/thirdparty/Vulkan-Headers +++ b/thirdparty/Vulkan-Headers @@ -1 +1 @@ -Subproject commit 14345dab231912ee9601136e96ca67a6e1f632e7 +Subproject commit 78c359741d855213e8685278eb81bb62599f8e56 diff --git a/thirdparty/VulkanMemoryAllocator b/thirdparty/VulkanMemoryAllocator index 1c35ba99..29b35ea4 160000 --- a/thirdparty/VulkanMemoryAllocator +++ b/thirdparty/VulkanMemoryAllocator @@ -1 +1 @@ -Subproject commit 1c35ba99ce775f8342d87a83a3f0f696f99c2a39 +Subproject commit 29b35ea4232688c0f42cdff0c10848290760a417 diff --git a/thirdparty/vcpkg b/thirdparty/vcpkg index b322364f..b1d8051c 160000 --- a/thirdparty/vcpkg +++ b/thirdparty/vcpkg @@ -1 +1 @@ -Subproject commit b322364f06308bdd24823f9d8f03fe0cc86fd46f +Subproject commit b1d8051c9259b82fda906e0e8249e7d848efdbaa