Skip to content

Commit 2e0d2e4

Browse files
committed
WIP
1 parent ffc1ec4 commit 2e0d2e4

File tree

8 files changed

+218
-17
lines changed

8 files changed

+218
-17
lines changed

extensions/pl_graphics_cpu.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,12 @@ typedef struct _plTimelineSemaphore
164164
plTimelineSemaphore* ptNext; // for linked list
165165
} plTimelineSemaphore;
166166

167+
typedef struct _plTimelineEvent
168+
{
169+
plDevice* ptDevice; // for convience
170+
plTimelineEvent* ptNext; // for linked list
171+
} plTimelineEvent;
172+
167173
typedef struct _plFrameContext
168174
{
169175
// VkSemaphore tRenderFinish;
@@ -188,6 +194,9 @@ typedef struct _plDevice
188194
// timeline semaphore free list
189195
plTimelineSemaphore* ptSemaphoreFreeList;
190196

197+
// timeline evene free list
198+
plTimelineEvent* ptEventFreeList;
199+
191200
// render pass layout generation pool
192201
plCpuRenderPassLayout* sbtRenderPassLayoutsHot;
193202
plRenderPassLayout* sbtRenderPassLayoutsCold;
@@ -326,6 +335,35 @@ pl_get_semaphore_value(plDevice* ptDevice, plTimelineSemaphore* ptSemaphore)
326335
return ulValue;
327336
}
328337

338+
plTimelineEvent*
339+
pl_create_event(plDevice* ptDevice)
340+
{
341+
plTimelineEvent* ptEvent = pl__get_new_event(ptDevice);
342+
return ptEvent;
343+
}
344+
345+
void
346+
pl_cleanup_event(plTimelineEvent* ptEvent)
347+
{
348+
pl__return_event(ptEvent->ptDevice, ptEvent);
349+
}
350+
351+
void
352+
pl_reset_event(plCommandBuffer* ptCmdBuffer, plTimelineEvent* ptEvent, plPipelineStageFlags tSrcStages)
353+
{
354+
}
355+
356+
void
357+
pl_set_event(plCommandBuffer* ptCmdBuffer, plTimelineEvent* ptEvent, plPipelineStageFlags tFlags)
358+
{
359+
}
360+
361+
void
362+
pl_wait_for_events(plCommandBuffer* ptCmdBuffer, plTimelineEvent** atEvents, uint32_t uEventCount, plPipelineStageFlags tSrcStages, plPipelineStageFlags tDstStages)
363+
{
364+
}
365+
366+
329367
plBufferHandle
330368
pl_create_buffer(plDevice* ptDevice, const plBufferDesc* ptDesc, plBuffer **ptBufferOut)
331369
{

extensions/pl_graphics_ext.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -968,6 +968,24 @@ pl__get_new_semaphore(plDevice* ptDevice)
968968
return ptSemaphore;
969969
}
970970

971+
static plTimelineEvent*
972+
pl__get_new_event(plDevice* ptDevice)
973+
{
974+
plTimelineEvent* ptEvent = ptDevice->ptEventFreeList;
975+
if(ptEvent)
976+
{
977+
ptDevice->ptEventFreeList = ptEvent->ptNext;
978+
}
979+
else
980+
{
981+
ptEvent = PL_ALLOC(sizeof(plTimelineEvent));
982+
memset(ptEvent, 0, sizeof(plTimelineEvent));
983+
}
984+
ptEvent->ptDevice = ptDevice;
985+
ptEvent->ptNext = NULL;
986+
return ptEvent;
987+
}
988+
971989
static void
972990
pl__return_render_encoder(plRenderEncoder* ptEncoder)
973991
{
@@ -996,6 +1014,13 @@ pl__return_semaphore(plDevice* ptDevice, plTimelineSemaphore* ptSemaphore)
9961014
ptDevice->ptSemaphoreFreeList = ptSemaphore;
9971015
}
9981016

1017+
static void
1018+
pl__return_event(plDevice* ptDevice, plTimelineEvent* ptEvent)
1019+
{
1020+
ptEvent->ptNext = ptDevice->ptEventFreeList;
1021+
ptDevice->ptEventFreeList = ptEvent;
1022+
}
1023+
9991024
static plRenderPassHandle
10001025
pl_get_encoder_render_pass(plRenderEncoder* ptEncoder)
10011026
{
@@ -1266,6 +1291,11 @@ pl_load_graphics_ext(plApiRegistryI* ptApiRegistry, bool bReload)
12661291
.push_compute_debug_group = pl_push_compute_debug_group,
12671292
.pop_compute_debug_group = pl_pop_compute_debug_group,
12681293
.insert_debug_label = pl_insert_debug_label,
1294+
.create_event = pl_create_event,
1295+
.cleanup_event = pl_cleanup_event,
1296+
.reset_event = pl_reset_event,
1297+
.set_event = pl_set_event,
1298+
.wait_for_events = pl_wait_for_events,
12691299

12701300
#if defined(PL_GRAPHICS_EXPOSE_VULKAN) && defined(PL_VULKAN_BACKEND)
12711301
.get_vulkan_instance = pl_get_vulkan_instance,

extensions/pl_graphics_ext.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ typedef struct _plSampler plSampler; // sampler resource
149149
typedef struct _plTexture plTexture; // texture resource
150150
typedef struct _plBuffer plBuffer; // buffer resource
151151
typedef struct _plTimelineSemaphore plTimelineSemaphore; // timeline semaphore
152+
typedef struct _plTimelineEvent plTimelineEvent; // timeline event
152153

153154
// swapchains
154155
typedef struct _plSwapchain plSwapchain; // swapchain
@@ -360,6 +361,13 @@ typedef struct _plGraphicsI
360361
void (*end_command_recording) (plCommandBuffer*);
361362
void (*submit_command_buffer) (plCommandBuffer*, const plSubmitInfo*);
362363

364+
// timeline events
365+
plTimelineEvent* (*create_event) (plDevice*);
366+
void (*cleanup_event) (plTimelineEvent*);
367+
void (*reset_event) (plCommandBuffer*, plTimelineEvent*, plPipelineStageFlags srcStages);
368+
void (*set_event) (plCommandBuffer*, plTimelineEvent*, plPipelineStageFlags srcStages);
369+
void (*wait_for_events)(plCommandBuffer*, plTimelineEvent**, uint32_t eventCount, plPipelineStageFlags srcStages, plPipelineStageFlags dstStages);
370+
363371
// render encoder
364372
plRenderEncoder* (*begin_render_pass) (plCommandBuffer*, plRenderPassHandle, const plPassResources*); // do not store
365373
void (*next_subpass) (plRenderEncoder*, const plPassResources*);

extensions/pl_graphics_internal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,13 @@ static plRenderEncoder* pl__get_new_render_encoder(void);
9595
static plComputeEncoder* pl__get_new_compute_encoder(void);
9696
static plBlitEncoder* pl__get_new_blit_encoder(void);
9797
static plTimelineSemaphore* pl__get_new_semaphore(plDevice*);
98+
static plTimelineEvent* pl__get_new_event(plDevice*);
9899

99100
static void pl__return_render_encoder(plRenderEncoder*);
100101
static void pl__return_compute_encoder(plComputeEncoder*);
101102
static void pl__return_blit_encoder(plBlitEncoder*);
102103
static void pl__return_semaphore(plDevice*, plTimelineSemaphore*);
104+
static void pl__return_event(plDevice*, plTimelineEvent*);
103105

104106
// deletion
105107
static plFrameGarbage* pl__get_frame_garbage(plDevice*);

extensions/pl_graphics_metal.m

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,14 @@
141141
plTimelineSemaphore* ptNext;
142142
} plTimelineSemaphore;
143143

144+
typedef struct _plTimelineEvent
145+
{
146+
plDevice* ptDevice; // for convience
147+
id<MTLEvent> tEvent;
148+
plTimelineEvent* ptNext; // for linked list
149+
uint32_t uValue;
150+
} plTimelineEvent;
151+
144152
typedef struct _plMetalBindGroup
145153
{
146154
id<MTLBuffer> tShaderArgumentBuffer;
@@ -208,6 +216,9 @@
208216

209217
plTimelineSemaphore* ptSemaphoreFreeList;
210218

219+
// timeline evene free list
220+
plTimelineEvent* ptEventFreeList;
221+
211222
// render pass layouts
212223
plMetalRenderPassLayout* sbtRenderPassLayoutsHot;
213224
plRenderPassLayout* sbtRenderPassLayoutsCold;
@@ -738,6 +749,41 @@
738749
return 0;
739750
}
740751

752+
plTimelineEvent*
753+
pl_create_event(plDevice* ptDevice)
754+
{
755+
plTimelineEvent* ptEvent = pl__get_new_event(ptDevice);
756+
ptEvent->tEvent = [ptDevice->tDevice newEvent];
757+
return ptEvent;
758+
}
759+
760+
void
761+
pl_cleanup_event(plTimelineEvent* ptEvent)
762+
{
763+
pl__return_event(ptEvent->ptDevice, ptEvent);
764+
}
765+
766+
void
767+
pl_reset_event(plCommandBuffer* ptCmdBuffer, plTimelineEvent* ptEvent, plPipelineStageFlags tSrcStages)
768+
{
769+
ptEvent->uValue++;
770+
}
771+
772+
void
773+
pl_set_event(plCommandBuffer* ptCmdBuffer, plTimelineEvent* ptEvent, plPipelineStageFlags tFlags)
774+
{
775+
[ptCmdBuffer->tCmdBuffer encodeSignalEvent:ptEvent->tEvent value:ptEvent->uValue];
776+
}
777+
778+
void
779+
pl_wait_for_events(plCommandBuffer* ptCmdBuffer, plTimelineEvent** atEvents, uint32_t uEventCount, plPipelineStageFlags tSrcStages, plPipelineStageFlags tDstStages)
780+
{
781+
for(uint32_t i = 0; i < uEventCount; i++)
782+
{
783+
[ptCmdBuffer->tCmdBuffer encodeWaitForEvent:atEvents[i]->tEvent value:atEvents[i]->uValue];
784+
}
785+
}
786+
741787
static plBufferHandle
742788
pl_create_buffer(plDevice* ptDevice, const plBufferDesc* ptDesc, plBuffer** ptBufferOut)
743789
{
@@ -2256,7 +2302,6 @@
22562302
void
22572303
pl_pipeline_barrier_blit(plBlitEncoder* ptEncoder, plPipelineStageFlags beforeStages, plAccessFlags beforeAccesses, plPipelineStageFlags afterStages, plAccessFlags afterAccesses)
22582304
{
2259-
22602305
}
22612306

22622307
void

extensions/pl_graphics_vulkan.c

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,13 @@ typedef struct _plTimelineSemaphore
198198
plTimelineSemaphore* ptNext; // for linked list
199199
} plTimelineSemaphore;
200200

201+
typedef struct _plTimelineEvent
202+
{
203+
plDevice* ptDevice; // for convience
204+
VkEvent tEvent;
205+
plTimelineEvent* ptNext; // for linked list
206+
} plTimelineEvent;
207+
201208
typedef struct _plFrameContext
202209
{
203210
VkFence tInFlight;
@@ -227,6 +234,9 @@ typedef struct _plDevice
227234
// timeline semaphore free list
228235
plTimelineSemaphore* ptSemaphoreFreeList;
229236

237+
// timeline evene free list
238+
plTimelineEvent* ptEventFreeList;
239+
230240
// render pass layout generation pool
231241
plVulkanRenderPassLayout* sbtRenderPassLayoutsHot;
232242
plRenderPassLayout* sbtRenderPassLayoutsCold;
@@ -466,6 +476,56 @@ pl_get_semaphore_value(plDevice* ptDevice, plTimelineSemaphore* ptSemaphore)
466476
return ulValue;
467477
}
468478

479+
plTimelineEvent*
480+
pl_create_event(plDevice* ptDevice)
481+
{
482+
plTimelineEvent* ptEvent = pl__get_new_event(ptDevice);
483+
484+
VkEventCreateInfo tCreateInfo = {
485+
.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO,
486+
.flags = 0,
487+
};
488+
PL_VULKAN(vkCreateEvent(ptDevice->tLogicalDevice, &tCreateInfo, gptGraphics->ptAllocationCallbacks, &ptEvent->tEvent));
489+
return ptEvent;
490+
}
491+
492+
void
493+
pl_cleanup_event(plTimelineEvent* ptEvent)
494+
{
495+
pl__return_event(ptEvent->ptDevice, ptEvent);
496+
vkDestroyEvent(ptEvent->ptDevice->tLogicalDevice, ptEvent->tEvent, gptGraphics->ptAllocationCallbacks);
497+
ptEvent->tEvent = VK_NULL_HANDLE;
498+
}
499+
500+
void
501+
pl_reset_event(plCommandBuffer* ptCmdBuffer, plTimelineEvent* ptEvent, plPipelineStageFlags tSrcStages)
502+
{
503+
vkCmdResetEvent(ptCmdBuffer->tCmdBuffer, ptEvent->tEvent, pl_vulkan_pipeline_stage_flags(tSrcStages));
504+
}
505+
506+
void
507+
pl_set_event(plCommandBuffer* ptCmdBuffer, plTimelineEvent* ptEvent, plPipelineStageFlags tFlags)
508+
{
509+
vkCmdSetEvent(ptCmdBuffer->tCmdBuffer, ptEvent->tEvent, pl_vulkan_pipeline_stage_flags(tFlags));
510+
}
511+
512+
void
513+
pl_wait_for_events(plCommandBuffer* ptCmdBuffer, plTimelineEvent** atEvents, uint32_t uEventCount, plPipelineStageFlags tSrcStages, plPipelineStageFlags tDstStages)
514+
{
515+
VkEvent* atVkEvents = pl_temp_allocator_alloc(&gptGraphics->tTempAllocator, sizeof(VkEvent) * uEventCount);
516+
517+
for(uint32_t i = 0; i < uEventCount; i++)
518+
{
519+
atVkEvents[i] = atEvents[i]->tEvent;
520+
}
521+
522+
vkCmdWaitEvents(ptCmdBuffer->tCmdBuffer, uEventCount, atVkEvents,
523+
pl_vulkan_pipeline_stage_flags(tSrcStages),
524+
pl_vulkan_pipeline_stage_flags(tDstStages),
525+
0, NULL, 0, NULL, 0, NULL);
526+
pl_temp_allocator_reset(&gptGraphics->tTempAllocator);
527+
}
528+
469529
plBufferHandle
470530
pl_create_buffer(plDevice* ptDevice, const plBufferDesc* ptDesc, plBuffer **ptBufferOut)
471531
{

extensions/pl_renderer_ext.c

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1391,6 +1391,9 @@ pl_renderer_create_view(plScene* ptScene, plVec2 tDimensions)
13911391

13921392
for(uint32_t i = 0; i < gptGfx->get_frames_in_flight(); i++)
13931393
{
1394+
1395+
ptView->atTransmissionEvents[i] = gptGfx->create_event(gptData->ptDevice);
1396+
13941397
const plBufferDesc tPickBufferDesc = {
13951398
.tUsage = PL_BUFFER_USAGE_STAGING | PL_BUFFER_USAGE_STORAGE,
13961399
.szByteSize = sizeof(uint32_t) * 2,
@@ -3504,27 +3507,34 @@ pl_renderer_render_view(plView* ptView, plCamera* ptCamera, plCamera* ptCullCame
35043507

35053508

35063509

3510+
35073511
if(ptView->ptParentScene->bTransmissionRequired)
35083512
{
35093513

3510-
gptGfx->end_command_recording(ptSceneCmdBuffer);
3514+
// gptGfx->reset_event(ptSceneCmdBuffer, ptView->atTransmissionEvents[uFrameIdx], PL_PIPE)
35113515

3512-
const plSubmitInfo tScenePreSubmitInfo = {
3513-
.uSignalSemaphoreCount = 1,
3514-
.atSignalSempahores = {gptStarter->get_current_timeline_semaphore()},
3515-
.auSignalSemaphoreValues = {gptStarter->increment_current_timeline_value()}
3516-
};
3517-
gptGfx->submit_command_buffer(ptSceneCmdBuffer, &tScenePreSubmitInfo);
3518-
gptGfx->return_command_buffer(ptSceneCmdBuffer);
3516+
// gptGfx->end_command_recording(ptSceneCmdBuffer);
35193517

3520-
const plBeginCommandInfo tSceneBlitBeginInfo = {
3521-
.uWaitSemaphoreCount = 1,
3522-
.atWaitSempahores = {gptStarter->get_current_timeline_semaphore()},
3523-
.auWaitSemaphoreValues = {gptStarter->get_current_timeline_value()},
3524-
};
3518+
// const plSubmitInfo tScenePreSubmitInfo = {
3519+
// .uSignalSemaphoreCount = 1,
3520+
// .atSignalSempahores = {gptStarter->get_current_timeline_semaphore()},
3521+
// .auSignalSemaphoreValues = {gptStarter->increment_current_timeline_value()}
3522+
// };
3523+
// gptGfx->submit_command_buffer(ptSceneCmdBuffer, &tScenePreSubmitInfo);
3524+
// gptGfx->return_command_buffer(ptSceneCmdBuffer);
3525+
3526+
// const plBeginCommandInfo tSceneBlitBeginInfo = {
3527+
// .uWaitSemaphoreCount = 1,
3528+
// .atWaitSempahores = {gptStarter->get_current_timeline_semaphore()},
3529+
// .auWaitSemaphoreValues = {gptStarter->get_current_timeline_value()},
3530+
// };
35253531

3526-
ptSceneCmdBuffer = gptGfx->request_command_buffer(ptCmdPool, "main scene blit");
3527-
gptGfx->begin_command_recording(ptSceneCmdBuffer, &tSceneBeginInfo);
3532+
// ptSceneCmdBuffer = gptGfx->request_command_buffer(ptCmdPool, "main scene blit");
3533+
// gptGfx->begin_command_recording(ptSceneCmdBuffer, &tSceneBeginInfo);
3534+
3535+
gptGfx->reset_event(ptSceneCmdBuffer, ptView->atTransmissionEvents[uFrameIdx], PL_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT);
3536+
gptGfx->set_event(ptSceneCmdBuffer, ptView->atTransmissionEvents[uFrameIdx], PL_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT);
3537+
gptGfx->wait_for_events(ptSceneCmdBuffer, &ptView->atTransmissionEvents[uFrameIdx], 1, PL_PIPELINE_STAGE_FRAGMENT_SHADER, PL_PIPELINE_STAGE_TRANSFER);
35283538

35293539
plBlitEncoder* ptBlitEncoder = gptGfx->begin_blit_pass(ptSceneCmdBuffer);
35303540
gptGfx->pipeline_barrier_blit(ptBlitEncoder, PL_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT | PL_PIPELINE_STAGE_VERTEX_SHADER | PL_PIPELINE_STAGE_COMPUTE_SHADER | PL_PIPELINE_STAGE_TRANSFER, PL_ACCESS_COLOR_ATTACHMENT_WRITE | PL_ACCESS_SHADER_READ | PL_ACCESS_TRANSFER_READ, PL_PIPELINE_STAGE_TRANSFER, PL_ACCESS_TRANSFER_WRITE);
@@ -3542,9 +3552,14 @@ pl_renderer_render_view(plView* ptView, plCamera* ptCamera, plCamera* ptCullCame
35423552
gptGfx->copy_texture(ptBlitEncoder, ptView->tRawOutputTexture, ptView->tTransmissionTexture, 1, &tFrameCopy);
35433553
gptGfx->generate_mipmaps(ptBlitEncoder, ptView->tTransmissionTexture);
35443554
gptGfx->pipeline_barrier_blit(ptBlitEncoder, PL_PIPELINE_STAGE_TRANSFER, PL_ACCESS_TRANSFER_WRITE, PL_PIPELINE_STAGE_VERTEX_SHADER | PL_PIPELINE_STAGE_COMPUTE_SHADER | PL_PIPELINE_STAGE_TRANSFER, PL_ACCESS_SHADER_READ | PL_ACCESS_TRANSFER_READ);
3545-
gptGfx->end_blit_pass(ptBlitEncoder);
3555+
gptGfx->end_blit_pass(ptBlitEncoder);
3556+
3557+
gptGfx->reset_event(ptSceneCmdBuffer, ptView->atTransmissionEvents[uFrameIdx], PL_PIPELINE_STAGE_FRAGMENT_SHADER);
3558+
gptGfx->set_event(ptSceneCmdBuffer, ptView->atTransmissionEvents[uFrameIdx], PL_PIPELINE_STAGE_TRANSFER);
3559+
gptGfx->wait_for_events(ptSceneCmdBuffer, &ptView->atTransmissionEvents[uFrameIdx], 1, PL_PIPELINE_STAGE_TRANSFER, PL_PIPELINE_STAGE_FRAGMENT_SHADER);
35463560
}
35473561

3562+
35483563
ptSceneEncoder = gptGfx->begin_render_pass(ptSceneCmdBuffer, ptView->tTransparentRenderPass, NULL);
35493564
gptGfx->set_depth_bias(ptSceneEncoder, 0.0f, 0.0f, 0.0f);
35503565

extensions/pl_renderer_internal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,9 @@ typedef struct _plView
340340

341341
// shadows
342342
plDirectionLightShadowData tDirectionLightShadowData;
343+
344+
// sync
345+
plTimelineEvent* atTransmissionEvents[PL_MAX_FRAMES_IN_FLIGHT];
343346
} plView;
344347

345348
typedef struct _plScene

0 commit comments

Comments
 (0)