fix pushconstants validation issues

This commit is contained in:
Ricardo Luís Vaz Silva 2025-02-25 10:43:21 -03:00 committed by Magnus Norddahl
commit a4cc4ab9e2
3 changed files with 22 additions and 11 deletions

View file

@ -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());

View file

@ -137,7 +137,7 @@ private:
VulkanRenderDevice* fb = nullptr;
std::map<VkRenderPassKey, std::unique_ptr<VkRenderPassSetup>> RenderPassSetup;
std::unique_ptr<VulkanPipelineLayout> PipelineLayouts[2];
std::map<int, std::unique_ptr<VulkanPipelineLayout>> PipelineLayouts[2];
std::vector<VkVertexFormat> VertexFormats;
std::map<VkPPRenderPassKey, std::unique_ptr<VkPPRenderPassSetup>> PPRenderPassSetup;

View file

@ -469,6 +469,8 @@ void VkRenderState::ApplySurfaceUniforms()
}
}
TArray<char> 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);
}
}