From 95116e858026e4e39d1cf009692ea80716bfe9b5 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Tue, 5 Mar 2019 02:06:20 +0100 Subject: [PATCH] - fix dynamic buffer offset not getting updated - fix lightbuffer blocksize being hardcoded --- src/rendering/vulkan/renderer/vk_renderpass.cpp | 2 +- src/rendering/vulkan/renderer/vk_renderstate.cpp | 4 +++- src/rendering/vulkan/renderer/vk_renderstate.h | 2 ++ src/rendering/vulkan/system/vk_framebuffer.cpp | 5 +++++ src/rendering/vulkan/system/vk_framebuffer.h | 2 ++ 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/rendering/vulkan/renderer/vk_renderpass.cpp b/src/rendering/vulkan/renderer/vk_renderpass.cpp index adb681877..ca1120b2f 100644 --- a/src/rendering/vulkan/renderer/vk_renderpass.cpp +++ b/src/rendering/vulkan/renderer/vk_renderpass.cpp @@ -161,7 +161,7 @@ void VkRenderPassManager::CreateDynamicSet() auto fb = GetVulkanFrameBuffer(); WriteDescriptors update; update.addBuffer(DynamicSet.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->ViewpointUBO->mBuffer.get(), 0, sizeof(HWViewpointUniforms)); - update.addBuffer(DynamicSet.get(), 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, fb->LightBufferSSO->mBuffer.get(), 0, 4096); + update.addBuffer(DynamicSet.get(), 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, fb->LightBufferSSO->mBuffer.get(), 0, fb->GetLightBufferBlockSize()); update.addBuffer(DynamicSet.get(), 2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->MatricesUBO->mBuffer.get(), 0, sizeof(MatricesUBO)); update.addBuffer(DynamicSet.get(), 3, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->StreamUBO->mBuffer.get(), 0, sizeof(StreamUBO)); update.updateSets(fb->device); diff --git a/src/rendering/vulkan/renderer/vk_renderstate.cpp b/src/rendering/vulkan/renderer/vk_renderstate.cpp index bb7ed28cf..e15a1179e 100644 --- a/src/rendering/vulkan/renderer/vk_renderstate.cpp +++ b/src/rendering/vulkan/renderer/vk_renderstate.cpp @@ -572,7 +572,7 @@ void VkRenderState::ApplyMaterial() void VkRenderState::ApplyDynamicSet() { - if (mViewpointOffset != mLastViewpointOffset || mLightBufferOffset != mLastLightBufferOffset) + if (mViewpointOffset != mLastViewpointOffset || mLightBufferOffset != mLastLightBufferOffset || mMatricesOffset != mLastMatricesOffset || mStreamDataOffset != mLastStreamDataOffset) { auto fb = GetVulkanFrameBuffer(); auto passManager = fb->GetRenderPassManager(); @@ -582,6 +582,8 @@ void VkRenderState::ApplyDynamicSet() mLastViewpointOffset = mViewpointOffset; mLastLightBufferOffset = mLightBufferOffset; + mLastMatricesOffset = mMatricesOffset; + mLastStreamDataOffset = mStreamDataOffset; } } diff --git a/src/rendering/vulkan/renderer/vk_renderstate.h b/src/rendering/vulkan/renderer/vk_renderstate.h index 3ad555543..1d2721a0c 100644 --- a/src/rendering/vulkan/renderer/vk_renderstate.h +++ b/src/rendering/vulkan/renderer/vk_renderstate.h @@ -86,6 +86,8 @@ private: uint32_t mLastViewpointOffset = 0xffffffff; uint32_t mLastLightBufferOffset = 0xffffffff; + uint32_t mLastMatricesOffset = 0xffffffff; + uint32_t mLastStreamDataOffset = 0xffffffff; uint32_t mViewpointOffset = 0; uint32_t mLightBufferOffset = 0; uint32_t mMatricesOffset = 0; diff --git a/src/rendering/vulkan/system/vk_framebuffer.cpp b/src/rendering/vulkan/system/vk_framebuffer.cpp index 8666d78c5..0d8162534 100644 --- a/src/rendering/vulkan/system/vk_framebuffer.cpp +++ b/src/rendering/vulkan/system/vk_framebuffer.cpp @@ -583,6 +583,11 @@ VulkanCommandBuffer *VulkanFrameBuffer::GetDrawCommands() return mDrawCommands.get(); } +unsigned int VulkanFrameBuffer::GetLightBufferBlockSize() const +{ + return mLights->GetBlockSize(); +} + void VulkanFrameBuffer::PrintStartupLog() { FString deviceType; diff --git a/src/rendering/vulkan/system/vk_framebuffer.h b/src/rendering/vulkan/system/vk_framebuffer.h index 3d2fb98d3..926e744f8 100644 --- a/src/rendering/vulkan/system/vk_framebuffer.h +++ b/src/rendering/vulkan/system/vk_framebuffer.h @@ -28,6 +28,8 @@ public: VkRenderPassManager *GetRenderPassManager() { return mRenderPassManager.get(); } VkRenderState *GetRenderState() { return mRenderState.get(); } + unsigned int GetLightBufferBlockSize() const; + VKDataBuffer *ViewpointUBO = nullptr; VKDataBuffer *LightBufferSSO = nullptr; VKDataBuffer *MatricesUBO = nullptr;