Skip to content

Commit c9b64db

Browse files
author
devsh
committed
show how to rework examples to new SIntendedSubmitInfo
1 parent 0154eff commit c9b64db

File tree

4 files changed

+43
-58
lines changed

4 files changed

+43
-58
lines changed

07_StagingAndMultipleQueues/main.cpp

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -121,17 +121,14 @@ class StagingAndMultipleQueuesApp final : public application_templates::BasicMul
121121
}
122122

123123
core::smart_refctd_ptr<ISemaphore> imgFillSemaphore = m_device->createSemaphore(0);
124-
IQueue::SSubmitInfo::SSemaphoreInfo imgFillSemaphoreInfo[] =
125-
{
126-
{
124+
SIntendedSubmitInfo intendedSubmit = {
125+
.queue = transferUpQueue,
126+
.waitSemaphores = {},
127+
.commandBuffers = {}, // fill later
128+
.scratchSemaphore = {
127129
.semaphore = imgFillSemaphore.get(),
128-
.value = 1,
130+
.value = 0,
129131
.stageMask = PIPELINE_STAGE_FLAGS::ALL_TRANSFER_BITS
130-
},
131-
{
132-
.semaphore = m_imagesLoadedSemaphore.get(),
133-
.value = 0xdeadbeef,
134-
.stageMask = PIPELINE_STAGE_FLAGS::ALL_COMMANDS_BITS
135132
}
136133
};
137134

@@ -206,13 +203,7 @@ class StagingAndMultipleQueuesApp final : public application_templates::BasicMul
206203
}
207204

208205
IQueue::SSubmitInfo::SCommandBufferInfo imgFillCmdBuffInfo = { cmdBuff.get() };
209-
210-
imgFillSemaphoreInfo[1].value = imageIdx + 1u;
211-
212-
213-
SIntendedSubmitInfo intendedSubmit = {
214-
.frontHalf = {.queue = transferUpQueue, .waitSemaphores = {}, .commandBuffers = {&imgFillCmdBuffInfo, 1}}, .signalSemaphores = imgFillSemaphoreInfo
215-
};
206+
intendedSubmit.commandBuffers = {&imgFillCmdBuffInfo,1};
216207

217208
cmdBuff->begin(IGPUCommandBuffer::USAGE::ONE_TIME_SUBMIT_BIT);
218209

@@ -221,18 +212,18 @@ class StagingAndMultipleQueuesApp final : public application_templates::BasicMul
221212
if (!cmdBuff->pipelineBarrier(E_DEPENDENCY_FLAGS::EDF_NONE, pplnBarrierDepInfo0))
222213
logFailAndTerminate("Failed to issue barrier!\n");
223214

224-
225215
transferUpQueue->startCapture();
226-
uint64_t oldCntr = imgFillSemaphoreInfo[0].value;
216+
const uint64_t oldCntr = intendedSubmit.scratchSemaphore.value;
227217
const bool uploadCommendRecorded = m_utils->updateImageViaStagingBuffer(
228218
intendedSubmit, cpuImages[imageIdx]->getBuffer(), cpuImages[imageIdx]->getCreationParameters().format,
229219
images[imageIdx].get(), IImage::LAYOUT::TRANSFER_DST_OPTIMAL, cpuImages[imageIdx]->getRegions()
230220
);
231221
if (!uploadCommendRecorded)
232222
logFailAndTerminate("Couldn't update image data.\n");
233223

234-
if(imgFillSemaphoreInfo[0].value != oldCntr)
235-
m_logger->log("%d overflows when uploading image %d!\n", ILogger::ELL_PERFORMANCE, imgFillSemaphoreInfo[0].value - oldCntr, imageIdx);
224+
const auto newCntr = intendedSubmit.scratchSemaphore.value;
225+
if (newCntr!=oldCntr)
226+
m_logger->log("%d overflows when uploading image %d!\n", ILogger::ELL_PERFORMANCE, newCntr-oldCntr, imageIdx);
236227

237228
IGPUCommandBuffer::SPipelineBarrierDependencyInfo pplnBarrierDepInfo1;
238229
pplnBarrierDepInfo1.imgBarriers = { &imageLayoutTransitionBarrier1, 1 };
@@ -242,9 +233,8 @@ class StagingAndMultipleQueuesApp final : public application_templates::BasicMul
242233

243234
cmdBuff->end();
244235

245-
intendedSubmit.advanceScratchSemaphoreValue();
246-
IQueue::SSubmitInfo submitInfo[1] = { intendedSubmit };
247-
getTransferUpQueue()->submit(submitInfo);
236+
const IQueue::SSubmitInfo::SSemaphoreInfo signalSemaphore = {.semaphore=m_imagesLoadedSemaphore.get(),.value=imageIdx+1u,.stageMask=PIPELINE_STAGE_FLAGS::COPY_BIT};
237+
getTransferUpQueue()->submit(intendedSubmit.popSubmit({&signalSemaphore,1}));
248238
transferUpQueue->endCapture();
249239

250240

23_ArithmeticUnitTest/main.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,11 @@ class ArithmeticUnitTestApp final : public application_templates::BasicMultiQueu
7777
IGPUBuffer::SCreationParams inputDataBufferCreationParams = {};
7878
inputDataBufferCreationParams.size = sizeof(Output<>::data[0]) * elementCount;
7979
inputDataBufferCreationParams.usage = IGPUBuffer::EUF_STORAGE_BUFFER_BIT | IGPUBuffer::EUF_TRANSFER_DST_BIT;
80-
gpuinputDataBuffer = m_utils->createFilledDeviceLocalBufferOnDedMem(
81-
{.queue=getTransferUpQueue()},
80+
m_utils->createFilledDeviceLocalBufferOnDedMem(
81+
SIntendedSubmitInfo{.queue=getTransferUpQueue()},
8282
std::move(inputDataBufferCreationParams),
8383
inputData
84-
);
84+
).move_into(gpuinputDataBuffer);
8585
}
8686

8787
// create 8 buffers for 8 operations
@@ -380,7 +380,7 @@ class ArithmeticUnitTestApp final : public application_templates::BasicMultiQueu
380380

381381
// download data
382382
const SBufferRange<IGPUBuffer> bufferRange = {0u, resultsBuffer->getSize(), outputBuffers[Binop::BindingIndex]};
383-
m_utils->downloadBufferRangeViaStagingBufferAutoSubmit({.queue=transferDownQueue},bufferRange,resultsBuffer->getPointer());
383+
m_utils->downloadBufferRangeViaStagingBufferAutoSubmit(SIntendedSubmitInfo{.queue=transferDownQueue},bufferRange,resultsBuffer->getPointer());
384384

385385
using type_t = typename Binop::type_t;
386386
const auto dataFromBuffer = reinterpret_cast<const uint32_t*>(resultsBuffer->getPointer());

62_CAD/DrawBuffers.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,12 @@ void DrawBuffersFiller::allocateIndexBuffer(ILogicalDevice* logicalDevice, uint3
3131
indices[i * 6 + 4u] = objIndex * 4u + 2u;
3232
indices[i * 6 + 5u] = objIndex * 4u + 3u;
3333
}
34-
34+
3535
IGPUBuffer::SCreationParams indexBufferCreationParams = {};
3636
indexBufferCreationParams.size = indexBufferSize;
3737
indexBufferCreationParams.usage = IGPUBuffer::EUF_INDEX_BUFFER_BIT | IGPUBuffer::EUF_TRANSFER_DST_BIT;
3838

39-
SIntendedSubmitInfo::SFrontHalf intendedNextSubmit;
40-
intendedNextSubmit.queue = m_copyQueue;
41-
gpuDrawBuffers.indexBuffer = m_utilities->createFilledDeviceLocalBufferOnDedMem(intendedNextSubmit, std::move(indexBufferCreationParams), indices);
39+
m_utilities->createFilledDeviceLocalBufferOnDedMem(SIntendedSubmitInfo{.queue=m_copyQueue}, std::move(indexBufferCreationParams), indices).move_into(gpuDrawBuffers.indexBuffer);
4240
gpuDrawBuffers.indexBuffer->setObjectDebugName("indexBuffer");
4341
}
4442

62_CAD/main.cpp

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
446446
return logFail("Failed to Create Semaphores!");
447447

448448
m_overflowSubmitsScratchSemaphoreInfo.semaphore = m_overflowSubmitScratchSemaphore.get();
449-
m_overflowSubmitsScratchSemaphoreInfo.value = 1ull;
449+
m_overflowSubmitsScratchSemaphoreInfo.value = 0ull;
450450

451451
// Let's just use the same queue since there's no need for async present
452452
if (!m_surface)
@@ -777,21 +777,15 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
777777
.stageMask = asset::PIPELINE_STAGE_FLAGS::ALL_COMMANDS_BITS
778778
};
779779

780-
const IQueue::SSubmitInfo::SSemaphoreInfo thisFrameRendered = {
781-
.semaphore = m_renderSemaphore.get(),
782-
.value = m_realFrameIx + 1u,
783-
.stageMask = asset::PIPELINE_STAGE_FLAGS::ALL_COMMANDS_BITS
784-
};
785-
786780
IQueue::SSubmitInfo::SCommandBufferInfo cmdbufs[1u] = { {.cmdbuf = m_commandBuffers[resourceIx].get() } };
787781
IQueue::SSubmitInfo::SSemaphoreInfo waitSems[2u] = { acquired, prevFrameRendered };
788-
IQueue::SSubmitInfo::SSemaphoreInfo singalSems[2u] = { m_overflowSubmitsScratchSemaphoreInfo, thisFrameRendered };
789782

790-
SIntendedSubmitInfo intendedNextSubmit;
791-
intendedNextSubmit.frontHalf.queue = getGraphicsQueue();
792-
intendedNextSubmit.frontHalf.commandBuffers = cmdbufs;
793-
intendedNextSubmit.frontHalf.waitSemaphores = waitSems;
794-
intendedNextSubmit.signalSemaphores = singalSems;
783+
SIntendedSubmitInfo intendedNextSubmit = {
784+
.queue = getGraphicsQueue(),
785+
.waitSemaphores = waitSems,
786+
.commandBuffers = cmdbufs,
787+
.scratchSemaphore = m_overflowSubmitsScratchSemaphoreInfo
788+
};
795789

796790
addObjects(intendedNextSubmit);
797791

@@ -919,7 +913,7 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
919913
void submitDraws(SIntendedSubmitInfo& intendedSubmitInfo, bool inBetweenSubmit)
920914
{
921915
const auto resourceIx = m_realFrameIx%m_framesInFlight;
922-
auto* cb = intendedSubmitInfo.frontHalf.getScratchCommandBuffer();
916+
auto* cb = intendedSubmitInfo.getScratchCommandBuffer();
923917
auto&r = drawBuffer;
924918

925919
asset::SViewport vp =
@@ -1099,23 +1093,26 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
10991093
else
11001094
{
11011095
cb->end();
1102-
IQueue::SSubmitInfo submitInfo = static_cast<IQueue::SSubmitInfo>(intendedSubmitInfo);
1103-
if (getGraphicsQueue()->submit({ &submitInfo, 1u }) == IQueue::RESULT::SUCCESS)
1096+
1097+
const auto nextFrameIx = m_realFrameIx+1u;
1098+
const IQueue::SSubmitInfo::SSemaphoreInfo thisFrameRendered = {
1099+
.semaphore = m_renderSemaphore.get(),
1100+
.value = nextFrameIx,
1101+
.stageMask = asset::PIPELINE_STAGE_FLAGS::ALL_COMMANDS_BITS
1102+
};
1103+
if (getGraphicsQueue()->submit(intendedSubmitInfo.popSubmit({&thisFrameRendered,1})) == IQueue::RESULT::SUCCESS)
11041104
{
1105-
m_realFrameIx++;
1106-
intendedSubmitInfo.advanceScratchSemaphoreValue(); // last submits needs to also advance scratch sema value like overflowSubmit() does
1105+
m_realFrameIx = nextFrameIx;
11071106

1108-
IQueue::SSubmitInfo::SSemaphoreInfo renderFinished =
1109-
{
1110-
.semaphore = m_renderSemaphore.get(),
1111-
.value = m_realFrameIx,
1112-
.stageMask = PIPELINE_STAGE_FLAGS::COLOR_ATTACHMENT_OUTPUT_BIT
1113-
};
1114-
m_surface->present(m_currentImageAcquire.imageIndex, { &renderFinished, 1u });
1107+
IQueue::SSubmitInfo::SSemaphoreInfo presentWait = thisFrameRendered;
1108+
// the stages for a wait semaphore operation are about what stage you WAIT in, not what stage you wait for
1109+
presentWait.stageMask = PIPELINE_STAGE_FLAGS::NONE; // top of pipe, there's no explicit presentation engine stage
1110+
m_surface->present(m_currentImageAcquire.imageIndex,{&presentWait,1});
11151111
}
11161112
}
11171113

1118-
m_overflowSubmitsScratchSemaphoreInfo.value = intendedSubmitInfo.getScratchSemaphoreNextWait().value; // because we need this info consistent within frames
1114+
// NOTE: one can just make `m_overflowSubmitsScratchSemaphoreInfo` a reference tied to `intendedSubmitInfo.scratchSemaphore
1115+
m_overflowSubmitsScratchSemaphoreInfo.value = intendedSubmitInfo.scratchSemaphore.value; // because we need this info consistent within frames
11191116
}
11201117

11211118
void endFrameRender(SIntendedSubmitInfo& intendedSubmitInfo)
@@ -1163,7 +1160,7 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
11631160
}
11641161

11651162
// Use the last command buffer in intendedNextSubmit, it should be in recording state
1166-
auto* cmdbuf = intendedNextSubmit.frontHalf.getScratchCommandBuffer();
1163+
auto* cmdbuf = intendedNextSubmit.getScratchCommandBuffer();
11671164

11681165
assert(cmdbuf->getState() == video::IGPUCommandBuffer::STATE::RECORDING && cmdbuf->isResettable());
11691166
assert(cmdbuf->getRecordingFlags().hasFlags(video::IGPUCommandBuffer::USAGE::ONE_TIME_SUBMIT_BIT));

0 commit comments

Comments
 (0)