diff --git a/res/shaders/lib/VertexData.slang b/res/shaders/lib/VertexData.slang index 7cee4f9..4fcf677 100644 --- a/res/shaders/lib/VertexData.slang +++ b/res/shaders/lib/VertexData.slang @@ -2,7 +2,7 @@ import MaterialParameter; struct VertexInput { - uint vertexId; + uint vertexId : SV_VertexID; uint instanceId: SV_InstanceID; } diff --git a/src/Engine/Graphics/Vulkan/PipelineCache.cpp b/src/Engine/Graphics/Vulkan/PipelineCache.cpp index e2aab87..2c592ce 100644 --- a/src/Engine/Graphics/Vulkan/PipelineCache.cpp +++ b/src/Engine/Graphics/Vulkan/PipelineCache.cpp @@ -52,28 +52,31 @@ PGraphicsPipeline PipelineCache::createPipeline(Gfx::LegacyPipelineCreateInfo gf { PPipelineLayout layout = Gfx::PPipelineLayout(gfxInfo.pipelineLayout).cast(); uint32 hash = layout->getHash(); - const VertexInputStateCreateInfo& vertexInputDesc = gfxInfo.vertexInput->getInfo(); - Array bindings(vertexInputDesc.bindings.size()); - Array attributes(vertexInputDesc.attributes.size()); - for (size_t i = 0; i < bindings.size(); i++) + Array bindings; + Array attributes; + if (gfxInfo.vertexInput != nullptr) { - bindings[i] = { - .binding = vertexInputDesc.bindings[i].binding, - .stride = vertexInputDesc.bindings[i].stride, - .inputRate = VkVertexInputRate(vertexInputDesc.bindings[i].inputRate), - }; + const VertexInputStateCreateInfo& vertexInputDesc = gfxInfo.vertexInput->getInfo(); + for (const auto& b : vertexInputDesc.bindings) + { + 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 = { .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, .pNext = nullptr,