@@ -251,7 +251,7 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
251
251
constexpr static uint32_t WindowHeightRequest = 900u ;
252
252
constexpr static uint32_t MaxFramesInFlight = 8u ;
253
253
public:
254
-
254
+
255
255
void allocateResources (uint32_t maxObjects)
256
256
{
257
257
drawResourcesFiller = DrawResourcesFiller (core::smart_refctd_ptr (m_utils), getGraphicsQueue ());
@@ -467,9 +467,13 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
467
467
m_overflowSubmitScratchSemaphore = m_device->createSemaphore (0ull );
468
468
if (!m_renderSemaphore || !m_overflowSubmitScratchSemaphore)
469
469
return logFail (" Failed to Create Semaphores!" );
470
-
471
- m_overflowSubmitsScratchSemaphoreInfo.semaphore = m_overflowSubmitScratchSemaphore.get ();
472
- m_overflowSubmitsScratchSemaphoreInfo.value = 0ull ;
470
+
471
+ // Set Queue and ScratchSemaInfo -> wait semaphores and command buffers will be modified by workLoop each frame
472
+ m_intendedNextSubmit.queue = getGraphicsQueue ();
473
+ m_intendedNextSubmit.scratchSemaphore = {
474
+ .semaphore = m_overflowSubmitScratchSemaphore.get (),
475
+ .value = 0ull ,
476
+ };
473
477
474
478
// Let's just use the same queue since there's no need for async present
475
479
if (!m_surface)
@@ -823,16 +827,12 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
823
827
IQueue::SSubmitInfo::SCommandBufferInfo cmdbufs[1u ] = { {.cmdbuf = m_commandBuffers[resourceIx].get () } };
824
828
IQueue::SSubmitInfo::SSemaphoreInfo waitSems[2u ] = { acquired, prevFrameRendered };
825
829
826
- SIntendedSubmitInfo intendedNextSubmit = {
827
- .queue = getGraphicsQueue (),
828
- .waitSemaphores = waitSems,
829
- .commandBuffers = cmdbufs,
830
- .scratchSemaphore = m_overflowSubmitsScratchSemaphoreInfo
831
- };
832
-
833
- addObjects (intendedNextSubmit);
830
+ m_intendedNextSubmit.waitSemaphores = waitSems;
831
+ m_intendedNextSubmit.commandBuffers = cmdbufs;
832
+
833
+ addObjects (m_intendedNextSubmit);
834
834
835
- endFrameRender (intendedNextSubmit );
835
+ endFrameRender (m_intendedNextSubmit );
836
836
837
837
#ifdef BENCHMARK_TILL_FIRST_FRAME
838
838
if (!stopBenchamrkFlag)
@@ -1041,7 +1041,7 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
1041
1041
auto & bufferBarrier = bufferBarriers[bufferBarriersCount++];
1042
1042
bufferBarrier.barrier .dep .srcStageMask = PIPELINE_STAGE_FLAGS::COPY_BIT;
1043
1043
bufferBarrier.barrier .dep .srcAccessMask = ACCESS_FLAGS::TRANSFER_WRITE_BIT;
1044
- bufferBarrier.barrier .dep .dstStageMask = PIPELINE_STAGE_FLAGS::VERTEX_SHADER_BIT;
1044
+ bufferBarrier.barrier .dep .dstStageMask = PIPELINE_STAGE_FLAGS::VERTEX_SHADER_BIT | PIPELINE_STAGE_FLAGS::FRAGMENT_SHADER_BIT ;
1045
1045
bufferBarrier.barrier .dep .dstAccessMask = ACCESS_FLAGS::UNIFORM_READ_BIT;
1046
1046
bufferBarrier.range =
1047
1047
{
@@ -1078,12 +1078,26 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
1078
1078
.buffer = drawResourcesFiller.gpuDrawBuffers .geometryBuffer ,
1079
1079
};
1080
1080
}
1081
+ if (drawResourcesFiller.getCurrentMainObjectsBufferSize () > 0u )
1082
+ {
1083
+ auto & bufferBarrier = bufferBarriers[bufferBarriersCount++];
1084
+ bufferBarrier.barrier .dep .srcStageMask = PIPELINE_STAGE_FLAGS::COPY_BIT;
1085
+ bufferBarrier.barrier .dep .srcAccessMask = ACCESS_FLAGS::TRANSFER_WRITE_BIT;
1086
+ bufferBarrier.barrier .dep .dstStageMask = PIPELINE_STAGE_FLAGS::VERTEX_SHADER_BIT | PIPELINE_STAGE_FLAGS::FRAGMENT_SHADER_BIT;
1087
+ bufferBarrier.barrier .dep .dstAccessMask = ACCESS_FLAGS::SHADER_READ_BITS;
1088
+ bufferBarrier.range =
1089
+ {
1090
+ .offset = 0u ,
1091
+ .size = drawResourcesFiller.getCurrentMainObjectsBufferSize (),
1092
+ .buffer = drawResourcesFiller.gpuDrawBuffers .mainObjectsBuffer ,
1093
+ };
1094
+ }
1081
1095
if (drawResourcesFiller.getCurrentLineStylesBufferSize () > 0u )
1082
1096
{
1083
1097
auto & bufferBarrier = bufferBarriers[bufferBarriersCount++];
1084
1098
bufferBarrier.barrier .dep .srcStageMask = PIPELINE_STAGE_FLAGS::COPY_BIT;
1085
1099
bufferBarrier.barrier .dep .srcAccessMask = ACCESS_FLAGS::TRANSFER_WRITE_BIT;
1086
- bufferBarrier.barrier .dep .dstStageMask = PIPELINE_STAGE_FLAGS::VERTEX_SHADER_BIT;
1100
+ bufferBarrier.barrier .dep .dstStageMask = PIPELINE_STAGE_FLAGS::VERTEX_SHADER_BIT | PIPELINE_STAGE_FLAGS::FRAGMENT_SHADER_BIT ;
1087
1101
bufferBarrier.barrier .dep .dstAccessMask = ACCESS_FLAGS::SHADER_READ_BITS;
1088
1102
bufferBarrier.range =
1089
1103
{
@@ -1163,9 +1177,6 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
1163
1177
m_surface->present (m_currentImageAcquire.imageIndex ,{&presentWait,1 });
1164
1178
}
1165
1179
}
1166
-
1167
- // NOTE: one can just make `m_overflowSubmitsScratchSemaphoreInfo` a reference tied to `intendedSubmitInfo.scratchSemaphore
1168
- m_overflowSubmitsScratchSemaphoreInfo.value = intendedSubmitInfo.scratchSemaphore .value ; // because we need this info consistent within frames
1169
1180
}
1170
1181
1171
1182
void endFrameRender (SIntendedSubmitInfo& intendedSubmitInfo)
@@ -2543,8 +2554,7 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
2543
2554
2544
2555
// timeline semaphore used for overflows (they need to be on their own timeline to count overflows)
2545
2556
smart_refctd_ptr<ISemaphore> m_overflowSubmitScratchSemaphore;
2546
- // this is the semaphore info the overflows update the value for (the semaphore is set to the overflow semaphore above, and the value get's updated by SIntendedSubmitInfo)
2547
- IQueue::SSubmitInfo::SSemaphoreInfo m_overflowSubmitsScratchSemaphoreInfo;
2557
+ SIntendedSubmitInfo m_intendedNextSubmit;
2548
2558
2549
2559
ISimpleManagedSurface::SAcquireResult m_currentImageAcquire = {};
2550
2560
0 commit comments