Skip to content

Commit

Permalink
vulkan: optimize vertex buffer binding code
Browse files Browse the repository at this point in the history
  • Loading branch information
slime73 committed Mar 9, 2024
1 parent 52f3304 commit 51d5773
Showing 1 changed file with 24 additions and 11 deletions.
35 changes: 24 additions & 11 deletions src/modules/graphics/vulkan/Graphics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2354,36 +2354,49 @@ void Graphics::prepareDraw(const VertexAttributes &attributes, const BufferBindi
configuration.dynamicState.cullmode = cullmode;
}

std::vector<VkBuffer> bufferVector;
std::vector<VkDeviceSize> 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);

ensureGraphicsPipelineConfiguration(configuration);

configuration.shader->cmdPushDescriptorSets(commandBuffers.at(currentFrame), VK_PIPELINE_BIND_POINT_GRAPHICS);
vkCmdBindVertexBuffers(commandBuffers.at(currentFrame), 0, static_cast<uint32_t>(bufferVector.size()), bufferVector.data(), offsets.data());

if (buffercount > 0)
vkCmdBindVertexBuffers(commandBuffers.at(currentFrame), 0, static_cast<uint32_t>(buffercount), vkbuffers, vkoffsets);
}

void Graphics::setDefaultRenderPass()
Expand Down

0 comments on commit 51d5773

Please sign in to comment.