Skip to content

Commit 8f47e8b

Browse files
committed
WIP
1 parent 1fc44b7 commit 8f47e8b

File tree

10 files changed

+1400
-57
lines changed

10 files changed

+1400
-57
lines changed

docs/version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ the API is complete. It just means we won't break what currently exists.
4444
* Data Structures v1.0.1 (pl_ds.h)
4545
* Json v1.0.3 (pl_json.h)
4646
* Logging v1.0.1 (pl_log.h)
47-
* Math v1.0.0 (pl_math.h)
47+
* Math v1.2.0 (pl_math.h)
4848
* Memory Allocators v1.1.0 (pl_memory.h)
4949
* Profiling v1.0.0 (pl_profile.h)
5050
* Stl v1.0.0 (pl_stl.h)

examples/example_gfx_2.c

Lines changed: 48 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ typedef struct _plAppData
5858
// buffers
5959
plBufferHandle tStagingBuffer;
6060
plBufferHandle tIndexBuffer;
61-
plBufferHandle tVertexBuffer;
61+
plBufferHandle atVertexBuffer[2];
6262

6363
// textures
6464
plTextureHandle tTexture;
@@ -181,7 +181,8 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
181181
"../shaders/",
182182
"../examples/shaders/"
183183
},
184-
.tFlags = PL_SHADER_FLAGS_AUTO_OUTPUT | PL_SHADER_FLAGS_NEVER_CACHE
184+
.pcCacheOutputDirectory = "../shader-temp/",
185+
.tFlags = PL_SHADER_FLAGS_AUTO_OUTPUT | PL_SHADER_FLAGS_ALWAYS_COMPILE | PL_SHADER_FLAGS_INCLUDE_DEBUG
185186
};
186187
gptShader->initialize(&tDefaultShaderOptions);
187188

@@ -192,33 +193,49 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
192193
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~vertex buffer~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
193194

194195
// vertex buffer data
195-
const float atVertexData[] = { // x, y, u, v
196-
-0.5f, -0.5f, 0.0f, 0.0f,
197-
-0.5f, 0.5f, 0.0f, 1.0f,
198-
0.5f, 0.5f, 1.0f, 1.0f,
199-
0.5f, -0.5f, 1.0f, 0.0f
196+
const float atVertexData0[] = { // x, y
197+
-0.5f, -0.5f,
198+
-0.5f, 0.5f,
199+
0.5f, 0.5f,
200+
0.5f, -0.5f
201+
};
202+
203+
const float atVertexData1[] = { // u, v
204+
0.0f, 0.0f,
205+
0.0f, 1.0f,
206+
1.0f, 1.0f,
207+
1.0f, 0.0f
200208
};
201209

202210
// create vertex buffer
203211
const plBufferDesc tVertexBufferDesc = {
204212
.tUsage = PL_BUFFER_USAGE_VERTEX,
205-
.szByteSize = sizeof(float) * PL_ARRAYSIZE(atVertexData),
213+
.szByteSize = sizeof(float) * PL_ARRAYSIZE(atVertexData0),
206214
.pcDebugName = "vertex buffer"
207215
};
208-
ptAppData->tVertexBuffer = gptGfx->create_buffer(ptDevice, &tVertexBufferDesc, NULL);
216+
ptAppData->atVertexBuffer[0] = gptGfx->create_buffer(ptDevice, &tVertexBufferDesc, NULL);
217+
ptAppData->atVertexBuffer[1] = gptGfx->create_buffer(ptDevice, &tVertexBufferDesc, NULL);
209218

210219
// retrieve buffer to get memory allocation requirements (do not store buffer pointer)
211-
plBuffer* ptVertexBuffer = gptGfx->get_buffer(ptDevice, ptAppData->tVertexBuffer);
220+
plBuffer* ptVertexBuffer0 = gptGfx->get_buffer(ptDevice, ptAppData->atVertexBuffer[0]);
221+
plBuffer* ptVertexBuffer1 = gptGfx->get_buffer(ptDevice, ptAppData->atVertexBuffer[1]);
212222

213223
// allocate memory for the vertex buffer
214-
const plDeviceMemoryAllocation tVertexBufferAllocation = gptGfx->allocate_memory(ptDevice,
215-
ptVertexBuffer->tMemoryRequirements.ulSize,
224+
const plDeviceMemoryAllocation tVertexBufferAllocation0 = gptGfx->allocate_memory(ptDevice,
225+
ptVertexBuffer0->tMemoryRequirements.ulSize,
226+
PL_MEMORY_FLAGS_DEVICE_LOCAL,
227+
ptVertexBuffer0->tMemoryRequirements.uMemoryTypeBits,
228+
"vertex buffer memory");
229+
230+
const plDeviceMemoryAllocation tVertexBufferAllocation1 = gptGfx->allocate_memory(ptDevice,
231+
ptVertexBuffer1->tMemoryRequirements.ulSize,
216232
PL_MEMORY_FLAGS_DEVICE_LOCAL,
217-
ptVertexBuffer->tMemoryRequirements.uMemoryTypeBits,
233+
ptVertexBuffer1->tMemoryRequirements.uMemoryTypeBits,
218234
"vertex buffer memory");
219235

220236
// bind the buffer to the new memory allocation
221-
gptGfx->bind_buffer_to_memory(ptDevice, ptAppData->tVertexBuffer, &tVertexBufferAllocation);
237+
gptGfx->bind_buffer_to_memory(ptDevice, ptAppData->atVertexBuffer[0], &tVertexBufferAllocation0);
238+
gptGfx->bind_buffer_to_memory(ptDevice, ptAppData->atVertexBuffer[1], &tVertexBufferAllocation1);
222239

223240
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~index buffer~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
224241

@@ -274,11 +291,13 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
274291

275292
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~transfers~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
276293

277-
memcpy(ptStagingBuffer->tMemoryAllocation.pHostMapped, atVertexData, sizeof(float) * PL_ARRAYSIZE(atVertexData));
294+
memcpy(ptStagingBuffer->tMemoryAllocation.pHostMapped, atVertexData0, sizeof(float) * PL_ARRAYSIZE(atVertexData0));
295+
memcpy(&ptStagingBuffer->tMemoryAllocation.pHostMapped[512], atVertexData1, sizeof(float) * PL_ARRAYSIZE(atVertexData1));
278296
memcpy(&ptStagingBuffer->tMemoryAllocation.pHostMapped[1024], atIndexData, sizeof(uint32_t) * PL_ARRAYSIZE(atIndexData));
279297

280298
plBlitEncoder* ptEncoder = gptStarter->get_blit_encoder();
281-
gptGfx->copy_buffer(ptEncoder, ptAppData->tStagingBuffer, ptAppData->tVertexBuffer, 0, 0, sizeof(float) * PL_ARRAYSIZE(atVertexData));
299+
gptGfx->copy_buffer(ptEncoder, ptAppData->tStagingBuffer, ptAppData->atVertexBuffer[0], 0, 0, sizeof(float) * PL_ARRAYSIZE(atVertexData0));
300+
gptGfx->copy_buffer(ptEncoder, ptAppData->tStagingBuffer, ptAppData->atVertexBuffer[1], 512, 0, sizeof(float) * PL_ARRAYSIZE(atVertexData1));
282301
gptGfx->copy_buffer(ptEncoder, ptAppData->tStagingBuffer, ptAppData->tIndexBuffer, 1024, 0, sizeof(uint32_t) * PL_ARRAYSIZE(atIndexData));
283302

284303
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~textures~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -431,10 +450,17 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
431450
},
432451
.atVertexBufferLayouts = {
433452
{
434-
.uByteStride = sizeof(float) * 4,
453+
// .uByteStride = sizeof(float) * 2,
454+
.atAttributes = {
455+
{.tFormat = PL_VERTEX_FORMAT_FLOAT2}
456+
// {.uByteOffset = 0, .tFormat = PL_VERTEX_FORMAT_FLOAT2}
457+
}
458+
},
459+
{
460+
// .uByteStride = sizeof(float) * 2,
435461
.atAttributes = {
436-
{.uByteOffset = 0, .tFormat = PL_VERTEX_FORMAT_FLOAT2},
437-
{.uByteOffset = sizeof(float) * 2, .tFormat = PL_VERTEX_FORMAT_FLOAT2},
462+
{.uLocation = 3, .tFormat = PL_VERTEX_FORMAT_FLOAT2}
463+
// {.uLocation = 3, .uByteOffset = 0, .tFormat = PL_VERTEX_FORMAT_FLOAT2}
438464
}
439465
}
440466
},
@@ -474,7 +500,8 @@ pl_app_shutdown(plAppData* ptAppData)
474500
gptGfx->flush_device(ptDevice);
475501

476502
// cleanup our resources
477-
gptGfx->destroy_buffer(ptDevice, ptAppData->tVertexBuffer);
503+
gptGfx->destroy_buffer(ptDevice, ptAppData->atVertexBuffer[0]);
504+
gptGfx->destroy_buffer(ptDevice, ptAppData->atVertexBuffer[1]);
478505
gptGfx->destroy_buffer(ptDevice, ptAppData->tIndexBuffer);
479506
gptGfx->destroy_buffer(ptDevice, ptAppData->tStagingBuffer);
480507
gptGfx->destroy_texture(ptDevice, ptAppData->tTexture);
@@ -513,7 +540,7 @@ pl_app_update(plAppData* ptAppData)
513540

514541
// submit nonindexed draw using basic API
515542
gptGfx->bind_shader(ptEncoder, ptAppData->tShader);
516-
gptGfx->bind_vertex_buffer(ptEncoder, ptAppData->tVertexBuffer);
543+
gptGfx->bind_vertex_buffers(ptEncoder, 0, 2, ptAppData->atVertexBuffer, NULL);
517544

518545
// retrieve dynamic binding data
519546
// NOTE: This system is meant frequently updated shader data. Underneath its just simple

examples/shaders/example_gfx_2.vert

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
// input
55
layout(location = 0) in vec2 inPos;
6-
layout(location = 1) in vec2 inUV;
6+
layout(location = 3) in vec2 inUV;
77

88
// output
99
layout(location = 0) out struct plShaderOut {

extensions/pl_graphics_ext.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,53 @@
1212
#else
1313
#endif
1414

15+
static size_t
16+
pl__get_vertex_attribute_size(plVertexFormat tFormat)
17+
{
18+
switch(tFormat)
19+
{
20+
case PL_VERTEX_FORMAT_HALF: return 2;
21+
case PL_VERTEX_FORMAT_HALF2: return 4;
22+
case PL_VERTEX_FORMAT_HALF3: return 6;
23+
case PL_VERTEX_FORMAT_HALF4: return 8;
24+
case PL_VERTEX_FORMAT_FLOAT: return sizeof(float);
25+
case PL_VERTEX_FORMAT_FLOAT2: return sizeof(float) * 2;
26+
case PL_VERTEX_FORMAT_FLOAT3: return sizeof(float) * 3;
27+
case PL_VERTEX_FORMAT_FLOAT4: return sizeof(float) * 4;
28+
case PL_VERTEX_FORMAT_DOUBLE: return sizeof(double);
29+
case PL_VERTEX_FORMAT_DOUBLE2: return sizeof(double) * 2;
30+
case PL_VERTEX_FORMAT_DOUBLE3: return sizeof(double) * 3;
31+
case PL_VERTEX_FORMAT_DOUBLE4: return sizeof(double) * 4;
32+
case PL_VERTEX_FORMAT_UCHAR: return sizeof(unsigned char);
33+
case PL_VERTEX_FORMAT_UCHAR2: return sizeof(unsigned char) * 2;
34+
case PL_VERTEX_FORMAT_UCHAR3: return sizeof(unsigned char) * 3;
35+
case PL_VERTEX_FORMAT_UCHAR4: return sizeof(unsigned char) * 4;
36+
case PL_VERTEX_FORMAT_CHAR: return sizeof(char);
37+
case PL_VERTEX_FORMAT_CHAR2: return sizeof(char) * 2;
38+
case PL_VERTEX_FORMAT_CHAR3: return sizeof(char) * 3;
39+
case PL_VERTEX_FORMAT_CHAR4: return sizeof(char) * 4;
40+
case PL_VERTEX_FORMAT_USHORT: return sizeof(uint16_t);
41+
case PL_VERTEX_FORMAT_USHORT2: return sizeof(uint16_t) * 2;
42+
case PL_VERTEX_FORMAT_USHORT3: return sizeof(uint16_t) * 3;
43+
case PL_VERTEX_FORMAT_USHORT4: return sizeof(uint16_t) * 4;
44+
case PL_VERTEX_FORMAT_SHORT: return sizeof(int16_t);
45+
case PL_VERTEX_FORMAT_SHORT2: return sizeof(int16_t) * 2;
46+
case PL_VERTEX_FORMAT_SHORT3: return sizeof(int16_t) * 3;
47+
case PL_VERTEX_FORMAT_SHORT4: return sizeof(int16_t) * 4;
48+
case PL_VERTEX_FORMAT_UINT: return sizeof(uint32_t);
49+
case PL_VERTEX_FORMAT_UINT2: return sizeof(uint32_t) * 2;
50+
case PL_VERTEX_FORMAT_UINT3: return sizeof(uint32_t) * 3;
51+
case PL_VERTEX_FORMAT_UINT4: return sizeof(uint32_t) * 4;
52+
case PL_VERTEX_FORMAT_INT: return sizeof(int);
53+
case PL_VERTEX_FORMAT_INT2: return sizeof(int) * 2;
54+
case PL_VERTEX_FORMAT_INT3: return sizeof(int) * 3;
55+
case PL_VERTEX_FORMAT_INT4: return sizeof(int) * 4;
56+
}
57+
58+
PL_ASSERT(false && "Unsupported vertex format");
59+
return 0;
60+
}
61+
1562
static size_t
1663
pl__get_data_type_size(plDataType tType)
1764
{

extensions/pl_graphics_ext.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,7 @@ typedef struct _plBlendState
848848

849849
typedef struct _plVertexAttribute
850850
{
851+
uint32_t uLocation;
851852
uint32_t uByteOffset;
852853
plVertexFormat tFormat;
853854
} plVertexAttribute;

extensions/pl_graphics_internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ static void pl_queue_sampler_for_deletion(plDevice*, plSamplerHandle);
118118
// helpers
119119
static size_t pl__get_data_type_size(plDataType);
120120
static uint32_t pl__format_stride(plFormat);
121+
static size_t pl__get_vertex_attribute_size(plVertexFormat);
121122

122123
// backends
123124
static uint32_t pl_get_current_frame_index(void);

extensions/pl_graphics_metal.m

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
// [SECTION] unity build
1515
*/
1616

17-
18-
1917
//-----------------------------------------------------------------------------
2018
// [SECTION] includes
2119
//-----------------------------------------------------------------------------
@@ -1279,27 +1277,58 @@
12791277

12801278
uint32_t uVertexBufferCount = 0;
12811279
uint32_t uCurrentAttributeCount = 0;
1280+
bool abExplicitAttributePosition[2] = {0};
1281+
bool abExplicitOffset[2] = {0};
1282+
bool abExplicitStride[2] = {0};
1283+
size_t auCalculatedStrides[2] = {0};
1284+
12821285
for(uint32_t uVtxBufferIdx = 0; uVtxBufferIdx < 2; uVtxBufferIdx++)
12831286
{
1284-
if(ptDescription->atVertexBufferLayouts[uVtxBufferIdx].uByteStride == 0)
1287+
if(ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[0].tFormat == PL_VERTEX_FORMAT_UNKNOWN)
12851288
break;
12861289

1290+
if(ptDescription->atVertexBufferLayouts[uVtxBufferIdx].uByteStride != 0)
1291+
abExplicitStride[uVtxBufferIdx] = true;
1292+
1293+
uVertexBufferCount++;
1294+
uint32_t uByteStride = 0;
1295+
for (uint32_t i = 0; i < PL_MAX_VERTEX_ATTRIBUTES; i++)
1296+
{
1297+
if (ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].tFormat == PL_VERTEX_FORMAT_UNKNOWN)
1298+
break;
1299+
1300+
auCalculatedStrides[uVtxBufferIdx] += pl__get_vertex_attribute_size(ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].tFormat);
1301+
if(ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].uLocation != 0)
1302+
{
1303+
abExplicitAttributePosition[uVtxBufferIdx] = true;
1304+
}
1305+
1306+
if(ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].uByteOffset != 0)
1307+
{
1308+
abExplicitOffset[uVtxBufferIdx] = true;
1309+
}
1310+
}
1311+
}
1312+
1313+
for(uint32_t uVtxBufferIdx = 0; uVtxBufferIdx < uVertexBufferCount; uVtxBufferIdx++)
1314+
{
1315+
size_t uOffset = 0;
12871316
for (uint32_t i = 0; i < PL_MAX_VERTEX_ATTRIBUTES; i++)
12881317
{
12891318
if(ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].tFormat == PL_VERTEX_FORMAT_UNKNOWN)
12901319
break;
1291-
const uint32_t uLocation = ptDescription->atVertexBufferLayouts[uVtxBufferIdx].bExplicitLocation ? ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].uLocation : uCurrentAttributeCount;
1320+
const uint32_t uLocation = abExplicitAttributePosition[uVtxBufferIdx] ? ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].uLocation : uCurrentAttributeCount;
12921321
vertexDescriptor.attributes[uLocation].bufferIndex = 4 + uVtxBufferIdx;
1293-
vertexDescriptor.attributes[uLocation].offset = ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].uByteOffset;
1322+
vertexDescriptor.attributes[uLocation].offset = abExplicitOffset[uVtxBufferIdx] ? ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].uByteOffset : (uint32_t)uOffset;
12941323
vertexDescriptor.attributes[uLocation].format = pl__metal_vertex_format(ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].tFormat);
1324+
uOffset += pl__get_vertex_attribute_size(ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].tFormat);
12951325
uCurrentAttributeCount++;
12961326

12971327
}
12981328

12991329
vertexDescriptor.layouts[4 + uVtxBufferIdx].stepRate = 1;
13001330
vertexDescriptor.layouts[4 + uVtxBufferIdx].stepFunction = MTLVertexStepFunctionPerVertex;
1301-
vertexDescriptor.layouts[4 + uVtxBufferIdx].stride = ptDescription->atVertexBufferLayouts[uVtxBufferIdx].uByteStride;
1302-
uVertexBufferCount++;
1331+
vertexDescriptor.layouts[4 + uVtxBufferIdx].stride = abExplicitStride[uVtxBufferIdx] ? ptDescription->atVertexBufferLayouts[uVtxBufferIdx].uByteStride : (uint32_t)auCalculatedStrides[uVtxBufferIdx];
13031332
}
13041333

13051334
// prepare preprocessor defines

extensions/pl_graphics_vulkan.c

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1510,27 +1510,57 @@ pl_create_shader(plDevice* ptDevice, const plShaderDesc* ptDescription)
15101510
uint32_t uVertexBufferCount = 0;
15111511
uint32_t uCurrentAttributeCount = 0;
15121512

1513+
bool abExplicitAttributePosition[2] = {0};
1514+
bool abExplicitOffset[2] = {0};
1515+
bool abExplicitStride[2] = {0};
1516+
size_t auCalculatedStrides[2] = {0};
1517+
15131518
for(uint32_t uVtxBufferIdx = 0; uVtxBufferIdx < 2; uVtxBufferIdx++)
15141519
{
1515-
if(ptDescription->atVertexBufferLayouts[uVtxBufferIdx].uByteStride == 0)
1520+
if(ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[0].tFormat == PL_VERTEX_FORMAT_UNKNOWN)
15161521
break;
15171522

1518-
1523+
if(ptDescription->atVertexBufferLayouts[uVtxBufferIdx].uByteStride != 0)
1524+
abExplicitStride[uVtxBufferIdx] = true;
1525+
1526+
uVertexBufferCount++;
1527+
uint32_t uByteStride = 0;
1528+
for (uint32_t i = 0; i < PL_MAX_VERTEX_ATTRIBUTES; i++)
1529+
{
1530+
if (ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].tFormat == PL_VERTEX_FORMAT_UNKNOWN)
1531+
break;
1532+
1533+
auCalculatedStrides[uVtxBufferIdx] += pl__get_vertex_attribute_size(ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].tFormat);
1534+
if(ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].uLocation != 0)
1535+
{
1536+
abExplicitAttributePosition[uVtxBufferIdx] = true;
1537+
}
1538+
1539+
if(ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].uByteOffset != 0)
1540+
{
1541+
abExplicitOffset[uVtxBufferIdx] = true;
1542+
}
1543+
}
1544+
}
1545+
1546+
for(uint32_t uVtxBufferIdx = 0; uVtxBufferIdx < uVertexBufferCount; uVtxBufferIdx++)
1547+
{
1548+
size_t uOffset = 0;
15191549
for (uint32_t i = 0; i < PL_MAX_VERTEX_ATTRIBUTES; i++)
15201550
{
15211551
if (ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].tFormat == PL_VERTEX_FORMAT_UNKNOWN)
15221552
break;
15231553
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;
1554+
atAttributeDescription[uCurrentAttributeCount].location = abExplicitAttributePosition[uVtxBufferIdx] ? ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].uLocation : uCurrentAttributeCount;
1555+
atAttributeDescription[uCurrentAttributeCount].offset = abExplicitOffset[uVtxBufferIdx] ? ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].uByteOffset : (uint32_t)uOffset;
15261556
atAttributeDescription[uCurrentAttributeCount].format = pl__vulkan_vertex_format(ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].tFormat);
1557+
uOffset += pl__get_vertex_attribute_size(ptDescription->atVertexBufferLayouts[uVtxBufferIdx].atAttributes[i].tFormat);
15271558
uCurrentAttributeCount++;
15281559
}
15291560

15301561
atBindingDescription[uVtxBufferIdx].binding = uVtxBufferIdx;
1531-
atBindingDescription[uVtxBufferIdx].stride = ptDescription->atVertexBufferLayouts[uVtxBufferIdx].uByteStride;
1562+
atBindingDescription[uVtxBufferIdx].stride = abExplicitStride[uVtxBufferIdx] ? ptDescription->atVertexBufferLayouts[uVtxBufferIdx].uByteStride : (uint32_t)auCalculatedStrides[uVtxBufferIdx];
15321563
atBindingDescription[uVtxBufferIdx].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
1533-
uVertexBufferCount++;
15341564
}
15351565

15361566
VkPipelineVertexInputStateCreateInfo tVertexInputInfo = {

extensions/pl_shader_variant_ext.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,7 @@ pl_shader_tool_load_manifest(const char* pcPath)
676676
{
677677
plJsonObject* ptAttribute = pl_json_member_by_index(ptAttributes, j);
678678
tShaderDesc.atVertexBufferLayouts[i].atAttributes[j].uByteOffset = pl_json_uint_member(ptAttribute, "uByteOffset", 0);
679+
tShaderDesc.atVertexBufferLayouts[i].atAttributes[j].uLocation = pl_json_uint_member(ptAttribute, "uLocation", 0);
679680

680681
char acVertexFormatBuffer[64] = {0};
681682
char* pcVertexFormatEnum = pl_json_string_member(ptAttribute, "tFormat", acVertexFormatBuffer, 64);

0 commit comments

Comments
 (0)