From a4cc4ab9e20a922e4d7dbd0d230f3c6e5f42230f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Tue, 25 Feb 2025 10:43:21 -0300 Subject: [PATCH] fix pushconstants validation issues --- .../vulkan/pipelines/vk_renderpass.cpp | 9 ++------ .../vulkan/pipelines/vk_renderpass.h | 2 +- .../rendering/vulkan/vk_renderstate.cpp | 22 ++++++++++++++++--- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp index de4c790fc..a58e9036c 100644 --- a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp +++ b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp @@ -133,7 +133,7 @@ VkVertexFormat *VkRenderPassManager::GetVertexFormat(int index) VulkanPipelineLayout* VkRenderPassManager::GetPipelineLayout(bool levelmesh, int UserUniformSize) { - auto &layout = PipelineLayouts[levelmesh]; + auto &layout = PipelineLayouts[levelmesh][UserUniformSize]; if (layout) return layout.get(); @@ -143,12 +143,7 @@ VulkanPipelineLayout* VkRenderPassManager::GetPipelineLayout(bool levelmesh, int builder.AddSetLayout(descriptors->GetFixedLayout()); builder.AddSetLayout(levelmesh ? descriptors->GetLevelMeshLayout() : descriptors->GetRSBufferLayout()); builder.AddSetLayout(descriptors->GetBindlessLayout()); - builder.AddPushConstantRange(VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(PushConstants)); - - if(UserUniformSize > 0) - { - builder.AddPushConstantRange(VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, sizeof(PushConstants), UserUniformSize); - } + builder.AddPushConstantRange(VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(PushConstants) + UserUniformSize); builder.DebugName("VkRenderPassManager.PipelineLayout"); layout = builder.Create(fb->GetDevice()); diff --git a/src/common/rendering/vulkan/pipelines/vk_renderpass.h b/src/common/rendering/vulkan/pipelines/vk_renderpass.h index b1e114a92..b5c0b23ec 100644 --- a/src/common/rendering/vulkan/pipelines/vk_renderpass.h +++ b/src/common/rendering/vulkan/pipelines/vk_renderpass.h @@ -137,7 +137,7 @@ private: VulkanRenderDevice* fb = nullptr; std::map> RenderPassSetup; - std::unique_ptr PipelineLayouts[2]; + std::map> PipelineLayouts[2]; std::vector VertexFormats; std::map> PPRenderPassSetup; diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index ad66bcf15..d16ce3ed1 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -469,6 +469,8 @@ void VkRenderState::ApplySurfaceUniforms() } } +TArray buffer; + void VkRenderState::ApplyPushConstants() { mPushConstants.uDataIndex = mRSBuffers->SurfaceUniformsBuffer->DataIndex(); @@ -476,11 +478,25 @@ void VkRenderState::ApplyPushConstants() mPushConstants.uBoneIndexBase = mBoneIndexBase; mPushConstants.uFogballIndex = mFogballIndex >= 0 ? (mFogballIndex % MAX_FOGBALL_DATA) : -1; - mCommandBuffer->pushConstants(fb->GetRenderPassManager()->GetPipelineLayout(mPipelineKey.ShaderKey.UseLevelMesh, mUniforms.sz), VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, (uint32_t)sizeof(PushConstants), &mPushConstants); - + if(mUniforms.sz > 0) { - mCommandBuffer->pushConstants(fb->GetRenderPassManager()->GetPipelineLayout(mPipelineKey.ShaderKey.UseLevelMesh, mUniforms.sz), VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, (uint32_t)sizeof(PushConstants), (uint32_t)mUniforms.sz, mUniforms.addr); + //thanks khronos /s + size_t sz = sizeof(PushConstants) + mUniforms.sz; + + if(buffer.Size() < sz) + { + buffer.Resize(sz); + } + + memcpy(buffer.Data(), &mPushConstants, sizeof(PushConstants)); + memcpy(buffer.Data() + sizeof(PushConstants), mUniforms.addr, mUniforms.sz); + + mCommandBuffer->pushConstants(fb->GetRenderPassManager()->GetPipelineLayout(mPipelineKey.ShaderKey.UseLevelMesh, mUniforms.sz), VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sz, buffer.Data()); + } + else + { + mCommandBuffer->pushConstants(fb->GetRenderPassManager()->GetPipelineLayout(mPipelineKey.ShaderKey.UseLevelMesh, mUniforms.sz), VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, (uint32_t)sizeof(PushConstants), &mPushConstants); } }