diff --git a/src/modules/graphics/vulkan/Graphics.cpp b/src/modules/graphics/vulkan/Graphics.cpp index 9b1ce0f39..7687d8bb6 100644 --- a/src/modules/graphics/vulkan/Graphics.cpp +++ b/src/modules/graphics/vulkan/Graphics.cpp @@ -2354,28 +2354,39 @@ void Graphics::prepareDraw(const VertexAttributes &attributes, const BufferBindi configuration.dynamicState.cullmode = cullmode; } - std::vector bufferVector; - std::vector offsets; + VkBuffer vkbuffers[VertexAttributes::MAX + 2]; + VkDeviceSize vkoffsets[VertexAttributes::MAX + 2]; + int buffercount = 0; - for (uint32_t i = 0; i < VertexAttributes::MAX; i++) + uint32 allbits = buffers.useBits; + uint32 i = 0; + while (allbits) { - if (buffers.useBits & (1u << i)) + uint32 bit = 1u << i; + + if (buffers.useBits & bit) { - bufferVector.push_back((VkBuffer)buffers.info[i].buffer->getHandle()); - offsets.push_back((VkDeviceSize)buffers.info[i].offset); + vkbuffers[buffercount] = (VkBuffer)buffers.info[i].buffer->getHandle(); + vkoffsets[buffercount] = (VkDeviceSize)buffers.info[i].offset; + buffercount++; } + + i++; + allbits >>= 1; } if (!(attributes.enableBits & (1u << ATTRIB_TEXCOORD))) { - bufferVector.push_back((VkBuffer)defaultConstantTexCoord->getHandle()); - offsets.push_back((VkDeviceSize)0); + vkbuffers[buffercount] = (VkBuffer)defaultConstantTexCoord->getHandle(); + vkoffsets[buffercount] = (VkDeviceSize)0; + buffercount++; } if (!(attributes.enableBits & (1u << ATTRIB_COLOR))) { - bufferVector.push_back((VkBuffer)defaultConstantColor->getHandle()); - offsets.push_back((VkDeviceSize)0); + vkbuffers[buffercount] = (VkBuffer)defaultConstantColor->getHandle(); + vkoffsets[buffercount] = (VkDeviceSize)0; + buffercount++; } configuration.shader->setMainTex(texture); @@ -2383,7 +2394,9 @@ void Graphics::prepareDraw(const VertexAttributes &attributes, const BufferBindi ensureGraphicsPipelineConfiguration(configuration); configuration.shader->cmdPushDescriptorSets(commandBuffers.at(currentFrame), VK_PIPELINE_BIND_POINT_GRAPHICS); - vkCmdBindVertexBuffers(commandBuffers.at(currentFrame), 0, static_cast(bufferVector.size()), bufferVector.data(), offsets.data()); + + if (buffercount > 0) + vkCmdBindVertexBuffers(commandBuffers.at(currentFrame), 0, static_cast(buffercount), vkbuffers, vkoffsets); } void Graphics::setDefaultRenderPass()