Skip to content

Commit ce76b68

Browse files
WIP
1 parent 46f5114 commit ce76b68

File tree

5 files changed

+95
-21
lines changed

5 files changed

+95
-21
lines changed

extensions/pl_graphics_cpu.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,11 @@ pl_end_render_pass(plRenderEncoder* ptEncoder)
473473
{
474474
}
475475

476+
static void
477+
pl_bind_vertex_buffers(plRenderEncoder* ptEncoder, uint32_t uFirst, uint32_t uCount, const plBufferHandle* ptHandles, const size_t* pszOffsets)
478+
{
479+
}
480+
476481
void
477482
pl_bind_vertex_buffer(plRenderEncoder* ptEncoder, plBufferHandle tHandle)
478483
{

extensions/pl_graphics_ext.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -965,6 +965,7 @@ pl_load_graphics_ext(plApiRegistryI* ptApiRegistry, bool bReload)
965965
.set_scissor_region = pl_set_scissor_region,
966966
.set_viewport = pl_set_viewport,
967967
.bind_vertex_buffer = pl_bind_vertex_buffer,
968+
.bind_vertex_buffers = pl_bind_vertex_buffers,
968969
.bind_shader = pl_bind_shader,
969970
.bind_compute_shader = pl_bind_compute_shader,
970971
.cleanup = pl_cleanup_graphics,

extensions/pl_graphics_ext.h

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,7 @@ typedef struct _plGraphicsI
382382
void (*set_viewport) (plRenderEncoder*, const plRenderViewport*);
383383
void (*set_scissor_region) (plRenderEncoder*, const plScissor*);
384384
void (*bind_vertex_buffer) (plRenderEncoder*, plBufferHandle);
385+
void (*bind_vertex_buffers) (plRenderEncoder*, uint32_t first, uint32_t count, const plBufferHandle*, const size_t* offsets); // offsets can be NULL or array of "count" length
385386
void (*draw) (plRenderEncoder*, uint32_t count, const plDraw*);
386387
void (*draw_indexed) (plRenderEncoder*, uint32_t count, const plDrawIndex*);
387388
void (*bind_shader) (plRenderEncoder*, plShaderHandle);
@@ -847,12 +848,14 @@ typedef struct _plBlendState
847848

848849
typedef struct _plVertexAttribute
849850
{
851+
uint32_t uLocation;
850852
uint32_t uByteOffset;
851853
plVertexFormat tFormat;
852854
} plVertexAttribute;
853855

854856
typedef struct _plVertexBufferLayout
855857
{
858+
bool bExplicitLocation;
856859
uint32_t uByteStride;
857860
plVertexAttribute atAttributes[PL_MAX_VERTEX_ATTRIBUTES];
858861
} plVertexBufferLayout;
@@ -888,7 +891,7 @@ typedef struct _plShaderDesc
888891
uint32_t uSubpassIndex;
889892
plGraphicsState tGraphicsState;
890893
plBlendState atBlendStates[PL_MAX_RENDER_TARGETS];
891-
plVertexBufferLayout atVertexBufferLayouts[1];
894+
plVertexBufferLayout atVertexBufferLayouts[2];
892895
plShaderModule tVertexShader;
893896
plShaderModule tPixelShader;
894897
const void* pTempConstantData;
@@ -1111,7 +1114,7 @@ typedef struct _plDrawStreamData
11111114
plBindGroupHandle atBindGroups[3];
11121115
uint16_t auDynamicBuffers[1];
11131116
plBufferHandle tIndexBuffer;
1114-
plBufferHandle atVertexBuffers[1];
1117+
plBufferHandle atVertexBuffers[2];
11151118
uint32_t uIndexOffset;
11161119
uint32_t uVertexOffset;
11171120
uint32_t uInstanceOffset;
@@ -1727,9 +1730,10 @@ enum plDrawStreamBits
17271730
PL_DRAW_STREAM_BIT_VERTEX_OFFSET = 1 << 7,
17281731
PL_DRAW_STREAM_BIT_INDEX_BUFFER = 1 << 8,
17291732
PL_DRAW_STREAM_BIT_VERTEX_BUFFER_0 = 1 << 9,
1730-
PL_DRAW_STREAM_BIT_TRIANGLES = 1 << 10,
1731-
PL_DRAW_STREAM_BIT_INSTANCE_OFFSET = 1 << 11,
1732-
PL_DRAW_STREAM_BIT_INSTANCE_COUNT = 1 << 12
1733+
PL_DRAW_STREAM_BIT_VERTEX_BUFFER_1 = 1 << 10,
1734+
PL_DRAW_STREAM_BIT_TRIANGLES = 1 << 11,
1735+
PL_DRAW_STREAM_BIT_INSTANCE_OFFSET = 1 << 12,
1736+
PL_DRAW_STREAM_BIT_INSTANCE_COUNT = 1 << 13
17331737
};
17341738

17351739
//-----------------------------------------------------------------------------
@@ -1819,6 +1823,12 @@ pl_add_to_draw_stream(plDrawStream* ptStream, plDrawStreamData tDraw)
18191823
uDirtyMask |= PL_DRAW_STREAM_BIT_VERTEX_BUFFER_0;
18201824
}
18211825

1826+
if(ptStream->_tCurrentDraw.atVertexBuffers[1].uData != tDraw.atVertexBuffers[1].uData)
1827+
{
1828+
ptStream->_tCurrentDraw.atVertexBuffers[1] = tDraw.atVertexBuffers[1];
1829+
uDirtyMask |= PL_DRAW_STREAM_BIT_VERTEX_BUFFER_1;
1830+
}
1831+
18221832
if(ptStream->_tCurrentDraw.uTriangleCount != tDraw.uTriangleCount)
18231833
{
18241834
ptStream->_tCurrentDraw.uTriangleCount = tDraw.uTriangleCount;
@@ -1858,6 +1868,8 @@ pl_add_to_draw_stream(plDrawStream* ptStream, plDrawStreamData tDraw)
18581868
ptStream->_auStream[ptStream->_uStreamCount++] = ptStream->_tCurrentDraw.tIndexBuffer.uData;
18591869
if(uDirtyMask & PL_DRAW_STREAM_BIT_VERTEX_BUFFER_0)
18601870
ptStream->_auStream[ptStream->_uStreamCount++] = ptStream->_tCurrentDraw.atVertexBuffers[0].uData;
1871+
if(uDirtyMask & PL_DRAW_STREAM_BIT_VERTEX_BUFFER_1)
1872+
ptStream->_auStream[ptStream->_uStreamCount++] = ptStream->_tCurrentDraw.atVertexBuffers[1].uData;
18611873
if(uDirtyMask & PL_DRAW_STREAM_BIT_TRIANGLES)
18621874
ptStream->_auStream[ptStream->_uStreamCount++] = ptStream->_tCurrentDraw.uTriangleCount;
18631875
if(uDirtyMask & PL_DRAW_STREAM_BIT_INSTANCE_OFFSET)

extensions/pl_graphics_metal.m

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2381,6 +2381,20 @@
23812381
atIndex:4];
23822382
}
23832383

2384+
static void
2385+
pl_bind_vertex_buffers(plRenderEncoder* ptEncoder, uint32_t uFirst, uint32_t uCount, const plBufferHandle* ptHandles, const size_t* pszOffsets)
2386+
{
2387+
plCommandBuffer* ptCmdBuffer = ptEncoder->ptCommandBuffer;
2388+
plDevice* ptDevice = ptCmdBuffer->ptDevice;
2389+
2390+
for(uint32_t i = 0; i < uCount; i++)
2391+
{
2392+
[ptEncoder->tEncoder setVertexBuffer:ptDevice->sbtBuffersHot[ptHandles[i].uIndex].tBuffer
2393+
offset:(pszOffsets == NULL) ? 0 : pszOffsets[i]
2394+
atIndex:4 + uFirst + i];
2395+
}
2396+
}
2397+
23842398
static void
23852399
pl_draw(plRenderEncoder* ptEncoder, uint32_t uCount, const plDraw* atDraws)
23862400
{
@@ -2668,6 +2682,14 @@
26682682
atIndex:4];
26692683
uCurrentStreamIndex++;
26702684
}
2685+
if(uDirtyMask & PL_DRAW_STREAM_BIT_VERTEX_BUFFER_1)
2686+
{
2687+
const plBufferHandle tBufferHandle = {.uData = ptStream->_auStream[uCurrentStreamIndex] };
2688+
[ptEncoder->tEncoder setVertexBuffer:ptDevice->sbtBuffersHot[tBufferHandle.uIndex].tBuffer
2689+
offset:0
2690+
atIndex:5];
2691+
uCurrentStreamIndex++;
2692+
}
26712693
if(uDirtyMask & PL_DRAW_STREAM_BIT_TRIANGLES)
26722694
{
26732695
uTriangleCount = ptStream->_auStream[uCurrentStreamIndex];

extensions/pl_graphics_vulkan.c

Lines changed: 50 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
20602087
void
20612088
pl_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

Comments
 (0)