diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index 3ce26512e55..794344281d1 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -188,7 +188,7 @@ static const char *shaderBindings = R"( #endif // This must match the HWViewpointUniforms struct - layout(set = 1, binding = 0, std140) uniform ViewpointUBO { + layout(set = 1, binding = 0, std140) uniform readonly ViewpointUBO { mat4 ProjectionMatrix; mat4 ViewMatrix; mat4 NormalViewMatrix; @@ -209,7 +209,7 @@ static const char *shaderBindings = R"( float uThickFogMultiplier; }; - layout(set = 1, binding = 1, std140) uniform MatricesUBO { + layout(set = 1, binding = 1, std140) uniform readonly MatricesUBO { mat4 ModelMatrix; mat4 NormalModelMatrix; mat4 TextureMatrix; @@ -248,18 +248,18 @@ static const char *shaderBindings = R"( vec4 padding1, padding2, padding3; }; - layout(set = 1, binding = 2, std140) uniform StreamUBO { + layout(set = 1, binding = 2, std140) uniform readonly StreamUBO { StreamData data[MAX_STREAM_DATA]; }; // light buffers - layout(set = 1, binding = 3, std430) buffer LightBufferSSO + layout(set = 1, binding = 3, std430) buffer readonly LightBufferSSO { vec4 lights[]; }; // bone matrix buffers - layout(set = 1, binding = 4, std430) buffer BoneBufferSSO + layout(set = 1, binding = 4, std430) buffer readonly BoneBufferSSO { mat4 bones[]; }; diff --git a/src/common/rendering/vulkan/system/vk_commandbuffer.cpp b/src/common/rendering/vulkan/system/vk_commandbuffer.cpp index 683a3b7ffda..20a9db0e322 100644 --- a/src/common/rendering/vulkan/system/vk_commandbuffer.cpp +++ b/src/common/rendering/vulkan/system/vk_commandbuffer.cpp @@ -116,10 +116,11 @@ void VkCommandBufferManager::FlushCommands(VulkanCommandBuffer** commands, size_ if (mNextSubmit > 0) submit.AddWait(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, mSubmitSemaphore[(mNextSubmit - 1) % maxConcurrentSubmitCount].get()); - if (finish && fb->GetFramebufferManager()->PresentImageIndex != -1) + auto framebuffers = fb->GetFramebufferManager(); + if (finish && framebuffers->PresentImageIndex != -1) { - submit.AddWait(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, fb->GetFramebufferManager()->SwapChainImageAvailableSemaphore.get()); - submit.AddSignal(fb->GetFramebufferManager()->RenderFinishedSemaphore.get()); + submit.AddWait(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, framebuffers->SwapChainImageAvailableSemaphore.get()); + submit.AddSignal(framebuffers->RenderFinishedSemaphores[framebuffers->PresentImageIndex].get()); } if (!lastsubmit) diff --git a/src/common/rendering/vulkan/textures/vk_framebuffer.cpp b/src/common/rendering/vulkan/textures/vk_framebuffer.cpp index c32e73b9d43..3c38e7ed575 100644 --- a/src/common/rendering/vulkan/textures/vk_framebuffer.cpp +++ b/src/common/rendering/vulkan/textures/vk_framebuffer.cpp @@ -39,10 +39,6 @@ VkFramebufferManager::VkFramebufferManager(VulkanRenderDevice* fb) : fb(fb) SwapChainImageAvailableSemaphore = SemaphoreBuilder() .DebugName("SwapChainImageAvailableSemaphore") .Create(fb->device.get()); - - RenderFinishedSemaphore = SemaphoreBuilder() - .DebugName("RenderFinishedSemaphore") - .Create(fb->device.get()); } VkFramebufferManager::~VkFramebufferManager() @@ -63,6 +59,14 @@ void VkFramebufferManager::AcquireImage() CurrentExclusiveFullscreen = exclusiveFullscreen; SwapChain->Create(CurrentWidth, CurrentHeight, CurrentVSync ? 2 : 3, CurrentVSync, CurrentHdr, CurrentExclusiveFullscreen); + + RenderFinishedSemaphores.clear(); + for (int i = 0; i < SwapChain->ImageCount(); i++) + { + RenderFinishedSemaphores.push_back(SemaphoreBuilder() + .DebugName("RenderFinishedSemaphore") + .Create(fb->device.get())); + } } PresentImageIndex = SwapChain->AcquireImage(SwapChainImageAvailableSemaphore.get()); @@ -75,5 +79,5 @@ void VkFramebufferManager::AcquireImage() void VkFramebufferManager::QueuePresent() { if (PresentImageIndex != -1) - SwapChain->QueuePresent(PresentImageIndex, RenderFinishedSemaphore.get()); + SwapChain->QueuePresent(PresentImageIndex, RenderFinishedSemaphores[PresentImageIndex].get()); } diff --git a/src/common/rendering/vulkan/textures/vk_framebuffer.h b/src/common/rendering/vulkan/textures/vk_framebuffer.h index 06cc6a261ce..6a40be9706c 100644 --- a/src/common/rendering/vulkan/textures/vk_framebuffer.h +++ b/src/common/rendering/vulkan/textures/vk_framebuffer.h @@ -4,6 +4,7 @@ #include "zvulkan/vulkanobjects.h" #include #include +#include class VulkanRenderDevice; enum class PPFilterMode; @@ -24,7 +25,7 @@ class VkFramebufferManager int PresentImageIndex = -1; std::unique_ptr SwapChainImageAvailableSemaphore; - std::unique_ptr RenderFinishedSemaphore; + std::vector> RenderFinishedSemaphores; private: VulkanRenderDevice* fb = nullptr;