@@ -1505,30 +1505,39 @@ pl_create_shader(plDevice* ptDevice, const plShaderDesc* ptDescription)
15051505 }
15061506
15071507 // setup & count vertex attributes
1508- VkVertexInputAttributeDescription atAttributeDescription [PL_MAX_VERTEX_ATTRIBUTES ] = {0 };
1508+ VkVertexInputBindingDescription atBindingDescription [2 ] = {0 };
1509+ VkVertexInputAttributeDescription atAttributeDescription [PL_MAX_VERTEX_ATTRIBUTES * 2 ] = {0 };
1510+ uint32_t uVertexBufferCount = 0 ;
15091511 uint32_t uCurrentAttributeCount = 0 ;
1510- for (uint32_t i = 0 ; i < PL_MAX_VERTEX_ATTRIBUTES ; i ++ )
1512+
1513+ for (uint32_t uVtxBufferIdx = 0 ; uVtxBufferIdx < 2 ; uVtxBufferIdx ++ )
15111514 {
1512- if (ptDescription -> atVertexBufferLayouts [0 ]. atAttributes [ i ]. tFormat == PL_VERTEX_FORMAT_UNKNOWN )
1515+ if (ptDescription -> atVertexBufferLayouts [uVtxBufferIdx ]. uByteStride == 0 )
15131516 break ;
1514- atAttributeDescription [i ].binding = 0 ;
1515- atAttributeDescription [i ].location = i ;
1516- atAttributeDescription [i ].offset = ptDescription -> atVertexBufferLayouts [0 ].atAttributes [i ].uByteOffset ;
1517- atAttributeDescription [i ].format = pl__vulkan_vertex_format (ptDescription -> atVertexBufferLayouts [0 ].atAttributes [i ].tFormat );
1518- uCurrentAttributeCount ++ ;
1519- }
15201517
1521- VkVertexInputBindingDescription tBindingDescription = {
1522- .binding = 0 ,
1523- .stride = ptDescription -> atVertexBufferLayouts [0 ].uByteStride ,
1524- .inputRate = VK_VERTEX_INPUT_RATE_VERTEX
1525- };
1518+
1519+ for (uint32_t i = 0 ; i < PL_MAX_VERTEX_ATTRIBUTES ; i ++ )
1520+ {
1521+ if (ptDescription -> atVertexBufferLayouts [uVtxBufferIdx ].atAttributes [i ].tFormat == PL_VERTEX_FORMAT_UNKNOWN )
1522+ break ;
1523+ atAttributeDescription [uCurrentAttributeCount ].binding = uVtxBufferIdx ;
1524+ atAttributeDescription [uCurrentAttributeCount ].location = ptDescription -> atVertexBufferLayouts [uVtxBufferIdx ].bExplicitLocation ? ptDescription -> atVertexBufferLayouts [uVtxBufferIdx ].atAttributes [i ].uLocation : uCurrentAttributeCount ;
1525+ atAttributeDescription [uCurrentAttributeCount ].offset = ptDescription -> atVertexBufferLayouts [uVtxBufferIdx ].atAttributes [i ].uByteOffset ;
1526+ atAttributeDescription [uCurrentAttributeCount ].format = pl__vulkan_vertex_format (ptDescription -> atVertexBufferLayouts [uVtxBufferIdx ].atAttributes [i ].tFormat );
1527+ uCurrentAttributeCount ++ ;
1528+ }
1529+
1530+ atBindingDescription [uVtxBufferIdx ].binding = uVtxBufferIdx ;
1531+ atBindingDescription [uVtxBufferIdx ].stride = ptDescription -> atVertexBufferLayouts [uVtxBufferIdx ].uByteStride ;
1532+ atBindingDescription [uVtxBufferIdx ].inputRate = VK_VERTEX_INPUT_RATE_VERTEX ;
1533+ uVertexBufferCount ++ ;
1534+ }
15261535
15271536 VkPipelineVertexInputStateCreateInfo tVertexInputInfo = {
15281537 .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO ,
1529- .vertexBindingDescriptionCount = 1 ,
1538+ .vertexBindingDescriptionCount = uVertexBufferCount ,
15301539 .vertexAttributeDescriptionCount = uCurrentAttributeCount ,
1531- .pVertexBindingDescriptions = & tBindingDescription ,
1540+ .pVertexBindingDescriptions = atBindingDescription ,
15321541 .pVertexAttributeDescriptions = atAttributeDescription
15331542 };
15341543
@@ -2057,6 +2066,24 @@ pl_bind_vertex_buffer(plRenderEncoder* ptEncoder, plBufferHandle tHandle)
20572066 vkCmdBindVertexBuffers (ptCmdBuffer -> tCmdBuffer , 0 , 1 , & ptVertexBuffer -> tBuffer , & offsets );
20582067}
20592068
2069+ void
2070+ pl_bind_vertex_buffers (plRenderEncoder * ptEncoder , uint32_t uFirst , uint32_t uCount , const plBufferHandle * ptHandles , const size_t * pszOffsets )
2071+ {
2072+ plCommandBuffer * ptCmdBuffer = ptEncoder -> ptCommandBuffer ;
2073+ plDevice * ptDevice = ptCmdBuffer -> ptDevice ;
2074+
2075+ VkBuffer atBuffers [8 ] = {0 };
2076+ static VkDeviceSize atOffsets [8 ] = {0 };
2077+ for (uint32_t i = 0 ; i < uCount ; i ++ )
2078+ {
2079+ if (pszOffsets )
2080+ atOffsets [i ] = pszOffsets [i ];
2081+ plVulkanBuffer * ptVertexBuffer = & ptDevice -> sbtBuffersHot [ptHandles [i ].uIndex ];
2082+ atBuffers [i ] = ptVertexBuffer -> tBuffer ;
2083+ }
2084+ vkCmdBindVertexBuffers (ptCmdBuffer -> tCmdBuffer , uFirst , uCount , atBuffers , atOffsets );
2085+ }
2086+
20602087void
20612088pl_draw (plRenderEncoder * ptEncoder , uint32_t uCount , const plDraw * atDraws )
20622089{
@@ -2267,6 +2294,13 @@ pl_draw_stream(plRenderEncoder* ptEncoder, uint32_t uAreaCount, plDrawArea *atAr
22672294 vkCmdBindVertexBuffers (ptCmdBuffer -> tCmdBuffer , 0 , 1 , & ptVertexBuffer -> tBuffer , & offsets );
22682295 uCurrentStreamIndex ++ ;
22692296 }
2297+ if (uDirtyMask & PL_DRAW_STREAM_BIT_VERTEX_BUFFER_1 )
2298+ {
2299+ const plBufferHandle tBufferHandle = {.uData = ptStream -> _auStream [uCurrentStreamIndex ] };
2300+ plVulkanBuffer * ptVertexBuffer = & ptDevice -> sbtBuffersHot [tBufferHandle .uIndex ];
2301+ vkCmdBindVertexBuffers (ptCmdBuffer -> tCmdBuffer , 1 , 1 , & ptVertexBuffer -> tBuffer , & offsets );
2302+ uCurrentStreamIndex ++ ;
2303+ }
22702304 if (uDirtyMask & PL_DRAW_STREAM_BIT_TRIANGLES )
22712305 {
22722306 uTriangleCount = ptStream -> _auStream [uCurrentStreamIndex ];
0 commit comments