Skip to content

Commit 99be2a1

Browse files
committed
WIP on dev
1 parent 2e0d2e4 commit 99be2a1

File tree

6 files changed

+71
-7
lines changed

6 files changed

+71
-7
lines changed

extensions/pl_graphics_cpu.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,11 @@ pl_cleanup_device(plDevice* ptDevice)
738738
pl__cleanup_common_device(ptDevice);
739739
}
740740

741+
void
742+
pl_pipeline_barrier(plCommandBuffer* ptCommandBuffer, plPipelineStageFlags beforeStages, plAccessFlags beforeAccesses, plPipelineStageFlags afterStages, plAccessFlags afterAccesses)
743+
{
744+
}
745+
741746
void
742747
pl_pipeline_barrier_blit(plBlitEncoder* ptEncoder, plShaderStageFlags beforeStages, plAccessFlags beforeAccesses, plShaderStageFlags afterStages, plAccessFlags afterAccesses)
743748
{

extensions/pl_graphics_ext.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1265,6 +1265,7 @@ pl_load_graphics_ext(plApiRegistryI* ptApiRegistry, bool bReload)
12651265
.create_bind_group_pool = pl_create_bind_group_pool,
12661266
.cleanup_bind_group_pool = pl_cleanup_bind_group_pool,
12671267
.reset_bind_group_pool = pl_reset_bind_group_pool,
1268+
.pipeline_barrier = pl_pipeline_barrier,
12681269
.pipeline_barrier_blit = pl_pipeline_barrier_blit,
12691270
.pipeline_barrier_render = pl_pipeline_barrier_render,
12701271
.pipeline_barrier_compute = pl_pipeline_barrier_compute,

extensions/pl_graphics_ext.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ typedef struct _plGraphicsI
417417
plCommandBuffer* (*get_blit_encoder_command_buffer)(plBlitEncoder*);
418418

419419
// global barriers
420+
void (*pipeline_barrier) (plCommandBuffer*, plPipelineStageFlags beforeStages, plAccessFlags beforeAccesses, plPipelineStageFlags afterStages, plAccessFlags afterAccesses);
420421
void (*pipeline_barrier_blit) (plBlitEncoder*, plPipelineStageFlags beforeStages, plAccessFlags beforeAccesses, plPipelineStageFlags afterStages, plAccessFlags afterAccesses);
421422
void (*pipeline_barrier_compute)(plComputeEncoder*, plPipelineStageFlags beforeStages, plAccessFlags beforeAccesses, plPipelineStageFlags afterStages, plAccessFlags afterAccesses);
422423
void (*pipeline_barrier_render) (plRenderEncoder*, plPipelineStageFlags beforeStages, plAccessFlags beforeAccesses, plPipelineStageFlags afterStages, plAccessFlags afterAccesses);

extensions/pl_graphics_metal.m

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
plBeginCommandInfo tBeginInfo;
3737
plDevice* ptDevice;
3838
id<MTLCommandBuffer> tCmdBuffer;
39+
id<MTLEvent> tEvent;
40+
uint64_t uEventValue;
3941
plCommandBuffer* ptNext;
4042
} plCommandBuffer;
4143

@@ -146,7 +148,7 @@
146148
plDevice* ptDevice; // for convience
147149
id<MTLEvent> tEvent;
148150
plTimelineEvent* ptNext; // for linked list
149-
uint32_t uValue;
151+
uint64_t uValue;
150152
} plTimelineEvent;
151153

152154
typedef struct _plMetalBindGroup
@@ -1922,6 +1924,7 @@
19221924
while(ptCurrentCommandBuffer)
19231925
{
19241926
plCommandBuffer* ptNextCommandBuffer = ptCurrentCommandBuffer->ptNext;
1927+
ptCurrentCommandBuffer->tEvent = nil;
19251928
PL_FREE(ptCurrentCommandBuffer);
19261929
ptCurrentCommandBuffer = ptNextCommandBuffer;
19271930
}
@@ -2299,21 +2302,56 @@
22992302
pl__return_blit_encoder(ptEncoder);
23002303
}
23012304

2305+
void
2306+
pl_pipeline_barrier(plCommandBuffer* ptCommandBuffer, plPipelineStageFlags beforeStages, plAccessFlags beforeAccesses, plPipelineStageFlags afterStages, plAccessFlags afterAccesses)
2307+
{
2308+
if(ptCommandBuffer->tEvent == nil)
2309+
{
2310+
ptCommandBuffer->tEvent = [ptCommandBuffer->ptDevice->tDevice newEvent];
2311+
}
2312+
2313+
[ptCommandBuffer->tCmdBuffer encodeSignalEvent:ptCommandBuffer->tEvent value:++ptCommandBuffer->uEventValue];
2314+
[ptCommandBuffer->tCmdBuffer encodeWaitForEvent:ptCommandBuffer->tEvent value:ptCommandBuffer->uEventValue];
2315+
}
2316+
23022317
void
23032318
pl_pipeline_barrier_blit(plBlitEncoder* ptEncoder, plPipelineStageFlags beforeStages, plAccessFlags beforeAccesses, plPipelineStageFlags afterStages, plAccessFlags afterAccesses)
23042319
{
2320+
if(ptEncoder->ptCommandBuffer->tEvent == nil)
2321+
{
2322+
ptEncoder->ptCommandBuffer->tEvent = [ptEncoder->ptCommandBuffer->ptDevice->tDevice newEvent];
2323+
}
2324+
2325+
// [ptEncoder->ptCommandBuffer->tCmdBuffer encodeSignalEvent:ptEncoder->ptCommandBuffer->tEvent value:++ptEncoder->ptCommandBuffer->uEventValue];
2326+
// [ptEncoder->ptCommandBuffer->tCmdBuffer encodeWaitForEvent:ptEncoder->ptCommandBuffer->tEvent value:ptEncoder->ptCommandBuffer->uEventValue];
23052327
}
23062328

23072329
void
23082330
pl_pipeline_barrier_compute(plComputeEncoder* ptEncoder, plPipelineStageFlags beforeStages, plAccessFlags beforeAccesses, plPipelineStageFlags afterStages, plAccessFlags afterAccesses)
23092331
{
2332+
if(ptEncoder->ptCommandBuffer->tEvent == nil)
2333+
{
2334+
ptEncoder->ptCommandBuffer->tEvent = [ptEncoder->ptCommandBuffer->ptDevice->tDevice newEvent];
2335+
}
2336+
2337+
// [ptEncoder->tEncoder barrierAfterEncoderStages:pl__metal_stage_flags(afterStages) beforeEncoderStages:pl__metal_stage_flags(beforeStages)];
23102338
[ptEncoder->tEncoder memoryBarrierWithScope:MTLBarrierScopeBuffers | MTLBarrierScopeTextures];
2339+
2340+
// [ptEncoder->ptCommandBuffer->tCmdBuffer encodeSignalEvent:ptEncoder->ptCommandBuffer->tEvent value:++ptEncoder->ptCommandBuffer->uEventValue];
2341+
// [ptEncoder->ptCommandBuffer->tCmdBuffer encodeWaitForEvent:ptEncoder->ptCommandBuffer->tEvent value:ptEncoder->ptCommandBuffer->uEventValue];
23112342
}
23122343

23132344
void
23142345
pl_pipeline_barrier_render(plRenderEncoder* ptEncoder, plPipelineStageFlags beforeStages, plAccessFlags beforeAccesses, plPipelineStageFlags afterStages, plAccessFlags afterAccesses)
23152346
{
2347+
if(ptEncoder->ptCommandBuffer->tEvent == nil)
2348+
{
2349+
ptEncoder->ptCommandBuffer->tEvent = [ptEncoder->ptCommandBuffer->ptDevice->tDevice newEvent];
2350+
}
2351+
23162352
[ptEncoder->tEncoder memoryBarrierWithScope:MTLBarrierScopeRenderTargets | MTLBarrierScopeBuffers | MTLBarrierScopeTextures afterStages:pl__metal_pipeline_stage_flags(beforeStages) beforeStages:pl__metal_pipeline_stage_flags(afterStages)];
2353+
// [ptEncoder->ptCommandBuffer->tCmdBuffer encodeSignalEvent:ptEncoder->ptCommandBuffer->tEvent value:++ptEncoder->ptCommandBuffer->uEventValue];
2354+
// [ptEncoder->ptCommandBuffer->tCmdBuffer encodeWaitForEvent:ptEncoder->ptCommandBuffer->tEvent value:ptEncoder->ptCommandBuffer->uEventValue];
23172355
}
23182356

23192357
static plComputeEncoder*

extensions/pl_graphics_vulkan.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3986,6 +3986,21 @@ pl_cleanup_device(plDevice* ptDevice)
39863986
pl__cleanup_common_device(ptDevice);
39873987
}
39883988

3989+
void
3990+
pl_pipeline_barrier(plCommandBuffer* ptCommandBuffer, plPipelineStageFlags beforeStages, plAccessFlags beforeAccesses, plPipelineStageFlags afterStages, plAccessFlags afterAccesses)
3991+
{
3992+
VkMemoryBarrier tMemoryBarrier = {
3993+
.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER,
3994+
.srcAccessMask = pl__vulkan_access_flags(beforeAccesses),
3995+
.dstAccessMask = pl__vulkan_access_flags(afterAccesses)
3996+
};
3997+
3998+
VkPipelineStageFlagBits tSrcStageMask = pl_vulkan_pipeline_stage_flags(beforeStages);
3999+
VkPipelineStageFlagBits tDstStageMask = pl_vulkan_pipeline_stage_flags(afterStages);
4000+
4001+
vkCmdPipelineBarrier(ptCommandBuffer->tCmdBuffer, tSrcStageMask, tDstStageMask, 0, 1, &tMemoryBarrier, 0, NULL, 0, NULL);
4002+
}
4003+
39894004
void
39904005
pl_pipeline_barrier_blit(plBlitEncoder* ptEncoder, plPipelineStageFlags beforeStages, plAccessFlags beforeAccesses, plPipelineStageFlags afterStages, plAccessFlags afterAccesses)
39914006
{

extensions/pl_renderer_ext.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3532,9 +3532,12 @@ pl_renderer_render_view(plView* ptView, plCamera* ptCamera, plCamera* ptCullCame
35323532
// ptSceneCmdBuffer = gptGfx->request_command_buffer(ptCmdPool, "main scene blit");
35333533
// gptGfx->begin_command_recording(ptSceneCmdBuffer, &tSceneBeginInfo);
35343534

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);
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);
3538+
3539+
gptGfx->pipeline_barrier(ptSceneCmdBuffer, 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);
3540+
35383541

35393542
plBlitEncoder* ptBlitEncoder = gptGfx->begin_blit_pass(ptSceneCmdBuffer);
35403543
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);
@@ -3554,9 +3557,10 @@ pl_renderer_render_view(plView* ptView, plCamera* ptCamera, plCamera* ptCullCame
35543557
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);
35553558
gptGfx->end_blit_pass(ptBlitEncoder);
35563559

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);
3560+
gptGfx->pipeline_barrier(ptSceneCmdBuffer, 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);
3561+
// gptGfx->reset_event(ptSceneCmdBuffer, ptView->atTransmissionEvents[uFrameIdx], PL_PIPELINE_STAGE_FRAGMENT_SHADER);
3562+
// gptGfx->set_event(ptSceneCmdBuffer, ptView->atTransmissionEvents[uFrameIdx], PL_PIPELINE_STAGE_TRANSFER);
3563+
// gptGfx->wait_for_events(ptSceneCmdBuffer, &ptView->atTransmissionEvents[uFrameIdx], 1, PL_PIPELINE_STAGE_TRANSFER, PL_PIPELINE_STAGE_FRAGMENT_SHADER);
35603564
}
35613565

35623566

0 commit comments

Comments
 (0)