Fixing pipelines crashing when not providing vertex input

This commit is contained in:
Dynamitos
2024-01-20 22:24:05 +01:00
parent c99451ad10
commit cf4a8e9d03
2 changed files with 24 additions and 21 deletions
+1 -1
View File
@@ -2,7 +2,7 @@ import MaterialParameter;
struct VertexInput struct VertexInput
{ {
uint vertexId; uint vertexId : SV_VertexID;
uint instanceId: SV_InstanceID; uint instanceId: SV_InstanceID;
} }
+23 -20
View File
@@ -52,28 +52,31 @@ PGraphicsPipeline PipelineCache::createPipeline(Gfx::LegacyPipelineCreateInfo gf
{ {
PPipelineLayout layout = Gfx::PPipelineLayout(gfxInfo.pipelineLayout).cast<PipelineLayout>(); PPipelineLayout layout = Gfx::PPipelineLayout(gfxInfo.pipelineLayout).cast<PipelineLayout>();
uint32 hash = layout->getHash(); uint32 hash = layout->getHash();
const VertexInputStateCreateInfo& vertexInputDesc = gfxInfo.vertexInput->getInfo(); Array<VkVertexInputBindingDescription> bindings;
Array<VkVertexInputBindingDescription> bindings(vertexInputDesc.bindings.size()); Array<VkVertexInputAttributeDescription> attributes;
Array<VkVertexInputAttributeDescription> attributes(vertexInputDesc.attributes.size()); if (gfxInfo.vertexInput != nullptr)
for (size_t i = 0; i < bindings.size(); i++)
{ {
bindings[i] = { const VertexInputStateCreateInfo& vertexInputDesc = gfxInfo.vertexInput->getInfo();
.binding = vertexInputDesc.bindings[i].binding, for (const auto& b : vertexInputDesc.bindings)
.stride = vertexInputDesc.bindings[i].stride, {
.inputRate = VkVertexInputRate(vertexInputDesc.bindings[i].inputRate), bindings.add() = {
}; .binding = b.binding,
.stride = b.stride,
.inputRate = VkVertexInputRate(b.inputRate),
};
}
for (const auto& a : vertexInputDesc.attributes)
{
attributes.add() = {
.location = a.location,
.binding = a.binding,
.format = cast(a.format),
.offset = a.offset,
};
}
hash = CRC::Calculate(bindings.data(), sizeof(VkVertexInputBindingDescription) * bindings.size(), CRC::CRC_32(), hash);
hash = CRC::Calculate(attributes.data(), sizeof(VkVertexInputAttributeDescription) * attributes.size(), CRC::CRC_32(), hash);
} }
for (size_t i = 0; i < attributes.size(); i++)
{
attributes[i] = {
.location = vertexInputDesc.attributes[i].location,
.binding = vertexInputDesc.attributes[i].binding,
.format = cast(vertexInputDesc.attributes[i].format),
.offset = vertexInputDesc.attributes[i].offset,
};
}
hash = CRC::Calculate(bindings.data(), sizeof(VkVertexInputBindingDescription) * bindings.size(), CRC::CRC_32(), hash);
hash = CRC::Calculate(attributes.data(), sizeof(VkVertexInputAttributeDescription) * attributes.size(), CRC::CRC_32(), hash);
VkPipelineVertexInputStateCreateInfo vertexInput = { VkPipelineVertexInputStateCreateInfo vertexInput = {
.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
.pNext = nullptr, .pNext = nullptr,