Skip to content

Commit 892d070

Browse files
committed
[62.CAD] only use 1 set of descriptor sets
1 parent 460fdb9 commit 892d070

File tree

1 file changed

+34
-40
lines changed

1 file changed

+34
-40
lines changed

62_CAD/main.cpp

Lines changed: 34 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
11

2+
using namespace nbl::hlsl;
3+
using namespace nbl;
4+
using namespace core;
5+
using namespace system;
6+
using namespace asset;
7+
using namespace ui;
8+
using namespace video;
9+
210

311
#include "nbl/application_templates/MonoAssetManagerAndBuiltinResourceApplication.hpp"
412
#include "../common/SimpleWindowedApplication.hpp"
@@ -32,15 +40,7 @@ enum class ExampleMode
3240
CASE_5, // Advanced Styling
3341
};
3442

35-
constexpr ExampleMode mode = ExampleMode::CASE_4;
36-
37-
using namespace nbl::hlsl;
38-
using namespace nbl;
39-
using namespace core;
40-
using namespace system;
41-
using namespace asset;
42-
using namespace ui;
43-
using namespace video;
43+
constexpr ExampleMode mode = ExampleMode::CASE_5;
4444

4545
class Camera2D
4646
{
@@ -248,12 +248,11 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
248248
constexpr static uint32_t MaxFramesInFlight = 8u;
249249
public:
250250

251-
void initCADResources(uint32_t maxObjects)
251+
void allocateResources(uint32_t maxObjects)
252252
{
253253
drawBuffer = DrawBuffersFiller(core::smart_refctd_ptr(m_utils));
254254

255255
uint32_t maxIndices = maxObjects * 6u * 2u;
256-
drawBuffer.allocateIndexBuffer(m_device.get(), maxIndices);
257256
drawBuffer.allocateMainObjectsBuffer(m_device.get(), maxObjects);
258257
drawBuffer.allocateDrawObjectsBuffer(m_device.get(), maxObjects * 5u);
259258
drawBuffer.allocateStylesBuffer(m_device.get(), 32u);
@@ -263,16 +262,15 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
263262
size_t geometryBufferSize = maxObjects * sizeof(QuadraticBezierInfo) * 3;
264263
drawBuffer.allocateGeometryBuffer(m_device.get(), geometryBufferSize);
265264

266-
for (uint32_t i = 0; i < m_framesInFlight; ++i)
267265
{
268266
IGPUBuffer::SCreationParams globalsCreationParams = {};
269267
globalsCreationParams.size = sizeof(Globals);
270268
globalsCreationParams.usage = IGPUBuffer::EUF_UNIFORM_BUFFER_BIT | IGPUBuffer::EUF_TRANSFER_DST_BIT | IGPUBuffer::EUF_INLINE_UPDATE_VIA_CMDBUF;
271-
globalsBuffer[i] = m_device->createBuffer(std::move(globalsCreationParams));
269+
globalsBuffer = m_device->createBuffer(std::move(globalsCreationParams));
272270

273-
IDeviceMemoryBacked::SDeviceMemoryRequirements memReq = globalsBuffer[i]->getMemoryReqs();
271+
IDeviceMemoryBacked::SDeviceMemoryRequirements memReq = globalsBuffer->getMemoryReqs();
274272
memReq.memoryTypeBits &= m_device->getPhysicalDevice()->getDeviceLocalMemoryTypeBits();
275-
auto globalsBufferMem = m_device->allocate(memReq, globalsBuffer[i].get());
273+
auto globalsBufferMem = m_device->allocate(memReq, globalsBuffer.get());
276274
}
277275

278276
// pseudoStencil
@@ -284,7 +282,6 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
284282
promotionRequest.usages.storageImageAtomic = true;
285283
pseudoStencilFormat = m_physicalDevice->promoteImageFormat(promotionRequest, IGPUImage::TILING::OPTIMAL);
286284

287-
for (uint32_t i = 0u; i < m_framesInFlight; ++i)
288285
{
289286
IGPUImage::SCreationParams imgInfo;
290287
imgInfo.format = pseudoStencilFormat;
@@ -318,7 +315,7 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
318315
imgViewInfo.subresourceRange.layerCount = 1u;
319316
imgViewInfo.subresourceRange.levelCount = 1u;
320317

321-
pseudoStencilImageViews[i] = m_device->createImageView(std::move(imgViewInfo));
318+
pseudoStencilImageView = m_device->createImageView(std::move(imgViewInfo));
322319
}
323320
}
324321

@@ -457,16 +454,14 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
457454
renderpassFinal = createRenderpass(format, IGPURenderpass::LOAD_OP::LOAD, IImage::LAYOUT::ATTACHMENT_OPTIMAL, IImage::LAYOUT::PRESENT_SRC);
458455
const auto compatibleRenderPass = renderpassInitial; // all 3 above are compatible
459456

460-
461457
scResources->setCompatibleRenderpass(compatibleRenderPass);
462458

463459
if (!m_surface->init(getGraphicsQueue(),std::move(scResources),{}))
464460
return logFail("Could not initialize the Surface!");
465461

466462
m_framesInFlight = min(m_surface->getMaxFramesInFlight(), MaxFramesInFlight);
467-
468463

469-
initCADResources(40960u);
464+
allocateResources(40960u);
470465

471466
// Create DescriptorSetLayout, PipelineLayout and update DescriptorSets
472467
{
@@ -528,23 +523,22 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
528523

529524
smart_refctd_ptr<IDescriptorPool> descriptorPool = nullptr;
530525
{
531-
const uint32_t setCounts[2u] = { m_framesInFlight, m_framesInFlight};
526+
const uint32_t setCounts[2u] = { 1u, 1u};
532527
descriptorPool = m_device->createDescriptorPoolForDSLayouts(IDescriptorPool::E_CREATE_FLAGS::ECF_NONE, layouts, setCounts);
533528
if (!descriptorPool)
534529
return logFail("Failed to Create Descriptor Pool");
535530
}
536531

537-
for (size_t i = 0; i < m_framesInFlight; i++)
538532
{
539-
descriptorSets0[i] = descriptorPool->createDescriptorSet(smart_refctd_ptr(descriptorSetLayout0));
540-
descriptorSets1[i] = descriptorPool->createDescriptorSet(smart_refctd_ptr(descriptorSetLayout1));
533+
descriptorSet0 = descriptorPool->createDescriptorSet(smart_refctd_ptr(descriptorSetLayout0));
534+
descriptorSet1 = descriptorPool->createDescriptorSet(smart_refctd_ptr(descriptorSetLayout1));
541535
constexpr uint32_t DescriptorCount = 6u;
542536
video::IGPUDescriptorSet::SDescriptorInfo descriptorInfos[DescriptorCount] = {};
543537

544538
// Descriptors For Set 0:
545539
descriptorInfos[0u].info.buffer.offset = 0u;
546-
descriptorInfos[0u].info.buffer.size = globalsBuffer[i]->getCreationParams().size;
547-
descriptorInfos[0u].desc = globalsBuffer[i];
540+
descriptorInfos[0u].info.buffer.size = globalsBuffer->getCreationParams().size;
541+
descriptorInfos[0u].desc = globalsBuffer;
548542

549543
descriptorInfos[1u].info.buffer.offset = 0u;
550544
descriptorInfos[1u].info.buffer.size = drawBuffer.gpuDrawBuffers.drawObjectsBuffer->getCreationParams().size;
@@ -565,43 +559,43 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
565559
// Descriptors For Set 1:
566560
descriptorInfos[5u].info.image.imageLayout = IImage::LAYOUT::GENERAL;
567561
descriptorInfos[5u].info.image.sampler = nullptr;
568-
descriptorInfos[5u].desc = pseudoStencilImageViews[i];
562+
descriptorInfos[5u].desc = pseudoStencilImageView;
569563

570564
video::IGPUDescriptorSet::SWriteDescriptorSet descriptorUpdates[6u] = {};
571565

572566
// Set 0 Updates:
573-
descriptorUpdates[0u].dstSet = descriptorSets0[i].get();
567+
descriptorUpdates[0u].dstSet = descriptorSet0.get();
574568
descriptorUpdates[0u].binding = 0u;
575569
descriptorUpdates[0u].arrayElement = 0u;
576570
descriptorUpdates[0u].count = 1u;
577571
descriptorUpdates[0u].info = &descriptorInfos[0u];
578572

579-
descriptorUpdates[1u].dstSet = descriptorSets0[i].get();
573+
descriptorUpdates[1u].dstSet = descriptorSet0.get();
580574
descriptorUpdates[1u].binding = 1u;
581575
descriptorUpdates[1u].arrayElement = 0u;
582576
descriptorUpdates[1u].count = 1u;
583577
descriptorUpdates[1u].info = &descriptorInfos[1u];
584578

585-
descriptorUpdates[2u].dstSet = descriptorSets0[i].get();
579+
descriptorUpdates[2u].dstSet = descriptorSet0.get();
586580
descriptorUpdates[2u].binding = 2u;
587581
descriptorUpdates[2u].arrayElement = 0u;
588582
descriptorUpdates[2u].count = 1u;
589583
descriptorUpdates[2u].info = &descriptorInfos[2u];
590584

591-
descriptorUpdates[3u].dstSet = descriptorSets0[i].get();
585+
descriptorUpdates[3u].dstSet = descriptorSet0.get();
592586
descriptorUpdates[3u].binding = 3u;
593587
descriptorUpdates[3u].arrayElement = 0u;
594588
descriptorUpdates[3u].count = 1u;
595589
descriptorUpdates[3u].info = &descriptorInfos[3u];
596590

597-
descriptorUpdates[4u].dstSet = descriptorSets0[i].get();
591+
descriptorUpdates[4u].dstSet = descriptorSet0.get();
598592
descriptorUpdates[4u].binding = 4u;
599593
descriptorUpdates[4u].arrayElement = 0u;
600594
descriptorUpdates[4u].count = 1u;
601595
descriptorUpdates[4u].info = &descriptorInfos[4u];
602596

603597
// Set 1 Updates:
604-
descriptorUpdates[5u].dstSet = descriptorSets1[i].get();
598+
descriptorUpdates[5u].dstSet = descriptorSet1.get();
605599
descriptorUpdates[5u].binding = 0u;
606600
descriptorUpdates[5u].arrayElement = 0u;
607601
descriptorUpdates[5u].count = 1u;
@@ -858,13 +852,13 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
858852
globalData.screenToWorldRatio = screenToWorld;
859853
globalData.worldToScreenRatio = (1.0/screenToWorld);
860854
globalData.miterLimit = 10.0f;
861-
SBufferRange<IGPUBuffer> globalBufferUpdateRange = { .offset = 0ull, .size = sizeof(Globals), .buffer = globalsBuffer[resourceIx].get() };
855+
SBufferRange<IGPUBuffer> globalBufferUpdateRange = { .offset = 0ull, .size = sizeof(Globals), .buffer = globalsBuffer.get() };
862856
bool updateSuccess = cb->updateBuffer(globalBufferUpdateRange, &globalData);
863857
assert(updateSuccess);
864858

865859
// Clear pseudoStencil
866860
{
867-
auto pseudoStencilImage = pseudoStencilImageViews[resourceIx]->getCreationParameters().image;
861+
auto pseudoStencilImage = pseudoStencilImageView->getCreationParameters().image;
868862

869863
IGPUCommandBuffer::SPipelineBarrierDependencyInfo::image_barrier_t imageBarriers[] =
870864
{
@@ -961,7 +955,7 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
961955
// pipelineBarriersBeforeDraw
962956
{
963957
// prepare pseudoStencilImage for usage in drawcall
964-
auto pseudoStencilImage = pseudoStencilImageViews[resourceIx]->getCreationParameters().image;
958+
auto pseudoStencilImage = pseudoStencilImageView->getCreationParameters().image;
965959
IGPUCommandBuffer::SPipelineBarrierDependencyInfo::image_barrier_t imageBarriers[] =
966960
{
967961
{
@@ -2419,10 +2413,10 @@ class ComputerAidedDesign final : public examples::SimpleWindowedApplication, pu
24192413
std::array<smart_refctd_ptr<IGPUCommandPool>, MaxFramesInFlight> m_graphicsCommandPools;
24202414
std::array<smart_refctd_ptr<IGPUCommandBuffer>, MaxFramesInFlight> m_commandBuffers;
24212415

2422-
std::array<smart_refctd_ptr<IGPUImageView>, MaxFramesInFlight> pseudoStencilImageViews;
2423-
std::array<smart_refctd_ptr<IGPUBuffer>, MaxFramesInFlight> globalsBuffer;
2424-
std::array<smart_refctd_ptr<IGPUDescriptorSet>, MaxFramesInFlight> descriptorSets0;
2425-
std::array<smart_refctd_ptr<IGPUDescriptorSet>, MaxFramesInFlight> descriptorSets1;
2416+
smart_refctd_ptr<IGPUImageView> pseudoStencilImageView;
2417+
smart_refctd_ptr<IGPUBuffer> globalsBuffer;
2418+
smart_refctd_ptr<IGPUDescriptorSet> descriptorSet0;
2419+
smart_refctd_ptr<IGPUDescriptorSet> descriptorSet1;
24262420
DrawBuffersFiller drawBuffer; // you can think of this as the scene data needed to draw everything, we only have one instance so let's use a timeline semaphore to sync all renders
24272421

24282422
smart_refctd_ptr<ISemaphore> m_renderSemaphore; // timeline semaphore to sync frames together

0 commit comments

Comments
 (0)