fix pushconstants validation issues
This commit is contained in:
parent
32e22a7866
commit
a4cc4ab9e2
3 changed files with 22 additions and 11 deletions
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue