@@ -57,11 +57,11 @@ class NablaTutorialExampleApp : public ApplicationBase
57
57
nbl::core::smart_refctd_ptr<nbl::video::IUtilities> utilities;
58
58
nbl::core::smart_refctd_ptr<nbl::video::ILogicalDevice> logicalDevice;
59
59
nbl::video::IPhysicalDevice* physicalDevice;
60
- std::array<nbl::video::IGPUQueue*, CommonAPI::InitOutput<SC_IMG_COUNT>::EQT_COUNT > queues = { nullptr , nullptr , nullptr , nullptr };
60
+ std::array<nbl::video::IGPUQueue*, CommonAPI::InitOutput::MaxQueuesCount > queues = { nullptr , nullptr , nullptr , nullptr };
61
61
nbl::core::smart_refctd_ptr<nbl::video::ISwapchain> swapchain;
62
62
nbl::core::smart_refctd_ptr<nbl::video::IGPURenderpass> renderpass;
63
- std::array<nbl::core::smart_refctd_ptr<nbl::video::IGPUFramebuffer>, SC_IMG_COUNT> fbos ;
64
- nbl::core::smart_refctd_ptr<nbl::video::IGPUCommandPool> commandPool ; // TODO: Multibuffer and reset the commandpools
63
+ std::array<nbl::core::smart_refctd_ptr<nbl::video::IGPUFramebuffer>, CommonAPI::InitOutput::MaxSwapChainImageCount> fbo ;
64
+ std::array< nbl::core::smart_refctd_ptr<nbl::video::IGPUCommandPool>, CommonAPI::InitOutput::MaxQueuesCount> commandPools ; // TODO: Multibuffer and reset the commandpools
65
65
nbl::core::smart_refctd_ptr<nbl::system::ISystem> system;
66
66
nbl::core::smart_refctd_ptr<nbl::asset::IAssetManager> assetManager;
67
67
nbl::video::IGPUObjectFromAssetConverter::SParams cpu2gpuParams;
@@ -84,8 +84,8 @@ class NablaTutorialExampleApp : public ApplicationBase
84
84
core::smart_refctd_ptr<video::IGPUSemaphore> renderFinished[FRAMES_IN_FLIGHT] = { nullptr };
85
85
core::smart_refctd_ptr<video::IGPUCommandBuffer> commandBuffers[FRAMES_IN_FLIGHT];
86
86
87
- CommonAPI::InputSystem::ChannelReader<IMouseEventChannel> mouse;
88
- CommonAPI::InputSystem::ChannelReader<IKeyboardEventChannel> keyboard;
87
+ CommonAPI::InputSystem::ChannelReader<ui:: IMouseEventChannel> mouse;
88
+ CommonAPI::InputSystem::ChannelReader<ui:: IKeyboardEventChannel> keyboard;
89
89
Camera camera = Camera(vectorSIMDf(0 , 0 , 0 ), vectorSIMDf(0 , 0 , 0 ), matrix4SIMD());
90
90
91
91
uint32_t ds1UboBinding = 0 ;
@@ -120,14 +120,54 @@ class NablaTutorialExampleApp : public ApplicationBase
120
120
{
121
121
return window.get ();
122
122
}
123
+ video::IAPIConnection* getAPIConnection () override
124
+ {
125
+ return apiConnection.get ();
126
+ }
127
+ video::ILogicalDevice* getLogicalDevice () override
128
+ {
129
+ return logicalDevice.get ();
130
+ }
131
+ video::IGPURenderpass* getRenderpass () override
132
+ {
133
+ return renderpass.get ();
134
+ }
135
+ void setSurface (core::smart_refctd_ptr<video::ISurface>&& s) override
136
+ {
137
+ surface = std::move (s);
138
+ }
139
+ void setFBOs (std::vector<core::smart_refctd_ptr<video::IGPUFramebuffer>>& f) override
140
+ {
141
+ for (int i = 0 ; i < f.size (); i++)
142
+ {
143
+ fbo[i] = core::smart_refctd_ptr (f[i]);
144
+ }
145
+ }
146
+ void setSwapchain (core::smart_refctd_ptr<video::ISwapchain>&& s) override
147
+ {
148
+ swapchain = std::move (s);
149
+ }
150
+ uint32_t getSwapchainImageCount () override
151
+ {
152
+ return SC_IMG_COUNT;
153
+ }
154
+ virtual nbl::asset::E_FORMAT getDepthFormat () override
155
+ {
156
+ return nbl::asset::EF_D32_SFLOAT;
157
+ }
123
158
124
159
APP_CONSTRUCTOR (NablaTutorialExampleApp)
125
160
126
161
void onAppInitialized_impl () override
127
162
{
128
- CommonAPI::InitOutput<SC_IMG_COUNT> initOutput;
129
- initOutput.window = core::smart_refctd_ptr (window);
130
- CommonAPI::Init<WIN_W, WIN_H, SC_IMG_COUNT>(initOutput, video::EAT_OPENGL, " NablaTutorialExample" , nbl::asset::EF_D32_SFLOAT);
163
+ CommonAPI::InitOutput initOutput;
164
+ initOutput.window = core::smart_refctd_ptr (window);
165
+ initOutput.system = core::smart_refctd_ptr (system);
166
+
167
+ const auto swapchainImageUsage = static_cast <asset::IImage::E_USAGE_FLAGS>(asset::IImage::EUF_COLOR_ATTACHMENT_BIT);
168
+ const video::ISurface::SFormat surfaceFormat (asset::EF_R8G8B8A8_SRGB, asset::ECP_COUNT, asset::EOTF_UNKNOWN);
169
+
170
+ CommonAPI::InitWithDefaultExt (initOutput, video::EAT_OPENGL_ES, " NablaTutorialExample" , WIN_W, WIN_H, SC_IMG_COUNT, swapchainImageUsage, surfaceFormat, nbl::asset::EF_D32_SFLOAT);
131
171
window = std::move (initOutput.window );
132
172
windowCb = std::move (initOutput.windowCb );
133
173
apiConnection = std::move (initOutput.apiConnection );
@@ -138,8 +178,8 @@ class NablaTutorialExampleApp : public ApplicationBase
138
178
queues = std::move (initOutput.queues );
139
179
swapchain = std::move (initOutput.swapchain );
140
180
renderpass = std::move (initOutput.renderpass );
141
- fbos = std::move (initOutput.fbo );
142
- commandPool = std::move (initOutput.commandPool );
181
+ fbo = std::move (initOutput.fbo );
182
+ commandPools = std::move (initOutput.commandPools );
143
183
system = std::move (initOutput.system );
144
184
assetManager = std::move (initOutput.assetManager );
145
185
cpu2gpuParams = std::move (initOutput.cpu2gpuParams );
@@ -149,12 +189,6 @@ class NablaTutorialExampleApp : public ApplicationBase
149
189
gpuTransferFence = logicalDevice->createFence (static_cast <video::IGPUFence::E_CREATE_FLAGS>(0 ));
150
190
gpuComputeFence = logicalDevice->createFence (static_cast <video::IGPUFence::E_CREATE_FLAGS>(0 ));
151
191
152
- nbl::video::IGPUObjectFromAssetConverter cpu2gpu;
153
- {
154
- cpu2gpuParams.perQueue [nbl::video::IGPUObjectFromAssetConverter::EQU_TRANSFER].fence = &gpuTransferFence;
155
- cpu2gpuParams.perQueue [nbl::video::IGPUObjectFromAssetConverter::EQU_COMPUTE].fence = &gpuComputeFence;
156
- }
157
-
158
192
/*
159
193
Helpfull class for managing basic geometry objects.
160
194
Thanks to it you can get half filled pipeline for your
@@ -181,6 +215,7 @@ class NablaTutorialExampleApp : public ApplicationBase
181
215
image view through the driver.
182
216
*/
183
217
218
+ cpu2gpuParams.beginCommandBuffers ();
184
219
auto gpuImage = cpu2gpu.getGPUObjectsFromAssets (&image_raw, &image_raw + 1 , cpu2gpuParams)->front ();
185
220
cpu2gpuParams.waitForCreationToComplete ();
186
221
auto & gpuParams = gpuImage->getCreationParameters ();
@@ -199,11 +234,10 @@ class NablaTutorialExampleApp : public ApplicationBase
199
234
auto cpuVertexShader = core::smart_refctd_ptr_static_cast<ICPUSpecializedShader>(assetManager->findAssets (" nbl/builtin/material/lambertian/singletexture/specialized_shader.vert" , types)->front ().getContents ().begin ()[0 ]);
200
235
auto cpuFragmentShader = core::smart_refctd_ptr_static_cast<ICPUSpecializedShader>(assetManager->findAssets (" nbl/builtin/material/lambertian/singletexture/specialized_shader.frag" , types)->front ().getContents ().begin ()[0 ]);
201
236
237
+ cpu2gpuParams.beginCommandBuffers ();
202
238
auto gpuVertexShader = cpu2gpu.getGPUObjectsFromAssets (&cpuVertexShader.get (), &cpuVertexShader.get () + 1 , cpu2gpuParams)->front ();
203
- cpu2gpuParams.waitForCreationToComplete ();
204
239
auto gpuFragmentShader = cpu2gpu.getGPUObjectsFromAssets (&cpuFragmentShader.get (), &cpuFragmentShader.get () + 1 , cpu2gpuParams)->front ();
205
240
cpu2gpuParams.waitForCreationToComplete ();
206
- cpu2gpuParams.waitForCreationToComplete ();
207
241
std::array<IGPUSpecializedShader*, 2 > gpuShaders = { gpuVertexShader.get (), gpuFragmentShader.get () };
208
242
209
243
size_t ds0SamplerBinding = 0 , ds1UboBinding = 0 ;
@@ -217,7 +251,7 @@ class NablaTutorialExampleApp : public ApplicationBase
217
251
gpuSamplerBinding.binding = ds0SamplerBinding;
218
252
gpuSamplerBinding.type = EDT_COMBINED_IMAGE_SAMPLER;
219
253
gpuSamplerBinding.count = 1u ;
220
- gpuSamplerBinding.stageFlags = static_cast <IGPUSpecializedShader ::E_SHADER_STAGE>(IGPUSpecializedShader ::ESS_FRAGMENT);
254
+ gpuSamplerBinding.stageFlags = static_cast <IGPUShader ::E_SHADER_STAGE>(IGPUShader ::ESS_FRAGMENT);
221
255
gpuSamplerBinding.samplers = nullptr ;
222
256
223
257
/*
@@ -227,7 +261,7 @@ class NablaTutorialExampleApp : public ApplicationBase
227
261
IGPUDescriptorSetLayout::SBinding gpuUboBinding;
228
262
gpuUboBinding.count = 1u ;
229
263
gpuUboBinding.binding = ds1UboBinding;
230
- gpuUboBinding.stageFlags = static_cast <asset::ICPUSpecializedShader ::E_SHADER_STAGE>(asset::ICPUSpecializedShader ::ESS_VERTEX | asset::ICPUSpecializedShader ::ESS_FRAGMENT);
264
+ gpuUboBinding.stageFlags = static_cast <asset::ICPUShader ::E_SHADER_STAGE>(asset::ICPUShader ::ESS_VERTEX | asset::ICPUShader ::ESS_FRAGMENT);
231
265
gpuUboBinding.type = asset::EDT_UNIFORM_BUFFER;
232
266
233
267
/*
@@ -383,7 +417,7 @@ class NablaTutorialExampleApp : public ApplicationBase
383
417
gpuDescriptorSet3 = std::get<4 >(gpuRectangle);
384
418
gpuGraphicsPipeline = std::get<5 >(gpuRectangle);
385
419
386
- logicalDevice->createCommandBuffers (commandPool .get (), video::IGPUCommandBuffer::EL_PRIMARY, FRAMES_IN_FLIGHT, commandBuffers);
420
+ logicalDevice->createCommandBuffers (commandPools[CommonAPI::InitOutput::EQT_GRAPHICS] .get (), video::IGPUCommandBuffer::EL_PRIMARY, FRAMES_IN_FLIGHT, commandBuffers);
387
421
388
422
for (uint32_t i = 0u ; i < FRAMES_IN_FLIGHT; i++)
389
423
{
@@ -439,8 +473,8 @@ class NablaTutorialExampleApp : public ApplicationBase
439
473
inputSystem->getDefaultKeyboard (&keyboard);
440
474
441
475
camera.beginInputProcessing (nextPresentationTimeStamp);
442
- mouse.consumeEvents ([&](const IMouseEventChannel::range_t & events) -> void { camera.mouseProcess (events); }, logger.get ());
443
- keyboard.consumeEvents ([&](const IKeyboardEventChannel::range_t & events) -> void { camera.keyboardProcess (events); }, logger.get ());
476
+ mouse.consumeEvents ([&](const ui:: IMouseEventChannel::range_t & events) -> void { camera.mouseProcess (events); }, logger.get ());
477
+ keyboard.consumeEvents ([&](const ui:: IKeyboardEventChannel::range_t & events) -> void { camera.keyboardProcess (events); }, logger.get ());
444
478
camera.endInputProcessing (nextPresentationTimeStamp);
445
479
446
480
const auto & viewMatrix = camera.getViewMatrix ();
@@ -473,7 +507,7 @@ class NablaTutorialExampleApp : public ApplicationBase
473
507
clear[1 ].depthStencil .depth = 0 .f ;
474
508
475
509
beginInfo.clearValueCount = 2u ;
476
- beginInfo.framebuffer = fbos [acquiredNextFBO];
510
+ beginInfo.framebuffer = fbo [acquiredNextFBO];
477
511
beginInfo.renderpass = renderpass;
478
512
beginInfo.renderArea = area;
479
513
beginInfo.clearValues = clear;
@@ -511,8 +545,8 @@ class NablaTutorialExampleApp : public ApplicationBase
511
545
*/
512
546
513
547
commandBuffer->bindGraphicsPipeline (gpuGraphicsPipeline.get ());
514
- commandBuffer->bindDescriptorSets (asset::EPBP_GRAPHICS, gpuRenderpassIndependentPipeline->getLayout (), 1u , 1u , &gpuDescriptorSet1.get (), nullptr );
515
- commandBuffer->bindDescriptorSets (asset::EPBP_GRAPHICS, gpuRenderpassIndependentPipeline->getLayout (), 3u , 1u , &gpuDescriptorSet3.get (), nullptr );
548
+ commandBuffer->bindDescriptorSets (asset::EPBP_GRAPHICS, gpuRenderpassIndependentPipeline->getLayout (), 1u , 1u , &gpuDescriptorSet1.get (), 0u );
549
+ commandBuffer->bindDescriptorSets (asset::EPBP_GRAPHICS, gpuRenderpassIndependentPipeline->getLayout (), 3u , 1u , &gpuDescriptorSet3.get (), 0u );
516
550
517
551
/*
518
552
Drawing a mesh (created rectangle) with it's gpu mesh buffer usage.
@@ -523,8 +557,8 @@ class NablaTutorialExampleApp : public ApplicationBase
523
557
commandBuffer->endRenderPass ();
524
558
commandBuffer->end ();
525
559
526
- CommonAPI::Submit (logicalDevice.get (), swapchain.get (), commandBuffer.get (), queues[CommonAPI::InitOutput< 1 > ::EQT_GRAPHICS], imageAcquire[resourceIx].get (), renderFinished[resourceIx].get (), fence.get ());
527
- CommonAPI::Present (logicalDevice.get (), swapchain.get (), queues[CommonAPI::InitOutput< 1 > ::EQT_GRAPHICS], renderFinished[resourceIx].get (), acquiredNextFBO);
560
+ CommonAPI::Submit (logicalDevice.get (), swapchain.get (), commandBuffer.get (), queues[CommonAPI::InitOutput::EQT_GRAPHICS], imageAcquire[resourceIx].get (), renderFinished[resourceIx].get (), fence.get ());
561
+ CommonAPI::Present (logicalDevice.get (), swapchain.get (), queues[CommonAPI::InitOutput::EQT_GRAPHICS], renderFinished[resourceIx].get (), acquiredNextFBO);
528
562
}
529
563
530
564
bool keepRunning () override
0 commit comments