@@ -145,7 +145,6 @@ Renderer::Renderer(IVideoDriver* _driver, IAssetManager* _assetManager, scene::I
145
145
bindings[3 ].type = asset::EDT_UNIFORM_TEXEL_BUFFER;
146
146
bindings[4 ].type = asset::EDT_STORAGE_IMAGE;
147
147
bindings[5 ].type = asset::EDT_STORAGE_BUFFER;
148
- bindings[5 ].count = 2u ;
149
148
bindings[6 ].type = asset::EDT_STORAGE_BUFFER;
150
149
151
150
m_commonRaytracingDSLayout = m_driver->createGPUDescriptorSetLayout (bindings,bindings+raytracingCommonDescriptorCount);
@@ -168,14 +167,11 @@ Renderer::Renderer(IVideoDriver* _driver, IAssetManager* _assetManager, scene::I
168
167
m_raygenDSLayout = m_driver->createGPUDescriptorSetLayout (bindings,bindings+raygenDescriptorCount);
169
168
}
170
169
{
171
- IGPUDescriptorSetLayout::SBinding binding;
172
- binding.binding = 0 ;
173
- binding.type = EDT_STORAGE_BUFFER;
174
- binding.count = 2u ;
175
- binding.stageFlags = ISpecializedShader::ESS_COMPUTE;
176
- binding.samplers = nullptr ;
170
+ constexpr auto closestHitDescriptorCount = 2u ;
171
+ IGPUDescriptorSetLayout::SBinding bindings[2 ];
172
+ fillIotaDescriptorBindingDeclarations (bindings,ISpecializedShader::ESS_COMPUTE,closestHitDescriptorCount,EDT_STORAGE_BUFFER);
177
173
178
- m_closestHitDSLayout = m_driver->createGPUDescriptorSetLayout (&binding,&binding+ 1u );
174
+ m_closestHitDSLayout = m_driver->createGPUDescriptorSetLayout (bindings,bindings+closestHitDescriptorCount );
179
175
}
180
176
{
181
177
constexpr auto resolveDescriptorCount = 3u ;
@@ -655,7 +651,7 @@ core::smart_refctd_ptr<IGPUImageView> Renderer::createScreenSizedTexture(E_FORMA
655
651
return m_driver->createGPUImageView (std::move (viewparams));
656
652
}
657
653
658
- constexpr uint16_t m_maxDepth = 3u ;
654
+ constexpr uint16_t m_maxDepth = 6u ;
659
655
constexpr uint16_t m_UNUSED_russianRouletteDepth = 5u ;
660
656
bool extractIntegratorInfo (const ext::MitsubaLoader::CElementIntegrator& integrator, uint32_t &bxdfSamples, uint32_t &maxNEESamples)
661
657
{
@@ -780,18 +776,17 @@ void Renderer::init(const SAssetBundle& meshes, core::smart_refctd_ptr<ICPUBuffe
780
776
// i know what I'm doing
781
777
auto globalBackendDataDSLayout = core::smart_refctd_ptr<IGPUDescriptorSetLayout>(const_cast <IGPUDescriptorSetLayout*>(m_globalBackendDataDS->getLayout ()));
782
778
783
- //
784
-
785
779
// cull
786
780
{
787
781
SPushConstantRange range{ISpecializedShader::ESS_COMPUTE,0u ,sizeof (CullShaderData_t)};
788
782
auto _cullPipelineLayout = m_driver->createGPUPipelineLayout (&range,&range+1u ,core::smart_refctd_ptr (globalBackendDataDSLayout),core::smart_refctd_ptr (m_cullDSLayout),nullptr ,nullptr );
789
783
m_cullPipeline = m_driver->createGPUComputePipeline (nullptr ,std::move (_cullPipelineLayout),gpuSpecializedShaderFromFile (m_assetManager,m_driver," ../cull.comp" ));
790
784
}
791
-
785
+
786
+ for (auto i=0u ; i<2u ; i++)
787
+ m_commonRaytracingDS[i] = m_driver->createGPUDescriptorSet (core::smart_refctd_ptr (m_commonRaytracingDSLayout));
792
788
793
789
SPushConstantRange raytracingCommonPCRange{ISpecializedShader::ESS_COMPUTE,0u ,sizeof (RaytraceShaderCommonData_t)};
794
- m_commonRaytracingDS = m_driver->createGPUDescriptorSet (core::smart_refctd_ptr (m_commonRaytracingDSLayout));
795
790
(std::ofstream (" runtime_defines.glsl" )
796
791
<< " #define _NBL_EXT_MITSUBA_LOADER_VT_STORAGE_VIEW_COUNT " << initData.globalMeta ->m_global .getVTStorageViewCount () << " \n "
797
792
<< initData.globalMeta ->m_global .m_materialCompilerGLSL_declarations
@@ -823,8 +818,9 @@ void Renderer::init(const SAssetBundle& meshes, core::smart_refctd_ptr<ICPUBuffe
823
818
core::smart_refctd_ptr (m_closestHitDSLayout)
824
819
);
825
820
m_closestHitPipeline = m_driver->createGPUComputePipeline (nullptr ,std::move (_closestHitPipelineLayout),gpuSpecializedShaderFromFile (m_assetManager,m_driver," ../closestHit.comp" ));
826
-
827
- m_closestHitDS = m_driver->createGPUDescriptorSet (core::smart_refctd_ptr (m_closestHitDSLayout));
821
+
822
+ for (auto i=0u ; i<2u ; i++)
823
+ m_closestHitDS[i] = m_driver->createGPUDescriptorSet (core::smart_refctd_ptr (m_closestHitDSLayout));
828
824
}
829
825
// resolve
830
826
{
@@ -837,7 +833,7 @@ void Renderer::init(const SAssetBundle& meshes, core::smart_refctd_ptr<ICPUBuffe
837
833
838
834
//
839
835
constexpr uint32_t descriptorUpdates = 5 ;
840
- constexpr uint32_t descriptorUpdateCounts[descriptorUpdates] = {2u ,9u ,2u ,2u ,3u };
836
+ constexpr uint32_t descriptorUpdateCounts[descriptorUpdates] = {2u ,7u ,2u ,2u ,3u };
841
837
constexpr uint32_t descriptorUpdateMaxCount = *std::max_element (descriptorUpdateCounts,descriptorUpdateCounts+descriptorUpdates);
842
838
843
839
//
@@ -943,10 +939,9 @@ void Renderer::init(const SAssetBundle& meshes, core::smart_refctd_ptr<ICPUBuffe
943
939
}
944
940
setImageInfo (infos+4 ,asset::EIL_GENERAL,core::smart_refctd_ptr (m_accumulation));
945
941
createEmptyInteropBufferAndSetUpInfo (infos+5 ,m_rayBuffer[0 ],raygenBufferSize);
946
- createEmptyInteropBufferAndSetUpInfo (infos+6 ,m_rayBuffer[1 ],raygenBufferSize);
947
- setBufferInfo (infos+7 ,m_rayCountBuffer);
942
+ setBufferInfo (infos+6 ,m_rayCountBuffer);
948
943
949
- setDstSetAndDescTypesOnWrites (m_commonRaytracingDS.get (),writes,infos,{
944
+ setDstSetAndDescTypesOnWrites (m_commonRaytracingDS[ 0 ] .get (),writes,infos,{
950
945
EDT_UNIFORM_BUFFER,
951
946
EDT_STORAGE_BUFFER,
952
947
EDT_STORAGE_IMAGE,
@@ -955,11 +950,14 @@ void Renderer::init(const SAssetBundle& meshes, core::smart_refctd_ptr<ICPUBuffe
955
950
EDT_STORAGE_BUFFER,
956
951
EDT_STORAGE_BUFFER
957
952
});
958
- writes[5 ].count = 2u ;
959
- writes[6 ].info = infos+7 ;
953
+ m_driver->updateDescriptorSets (descriptorUpdateCounts[1 ],writes,0u ,nullptr );
954
+ // set up second DS
955
+ createEmptyInteropBufferAndSetUpInfo (infos+5 ,m_rayBuffer[1 ],raygenBufferSize);
956
+ for (auto i=0u ; i<descriptorUpdateCounts[1 ]; i++)
957
+ writes[i].dstSet = m_commonRaytracingDS[1 ].get ();
958
+ m_driver->updateDescriptorSets (descriptorUpdateCounts[1 ],writes,0u ,nullptr );
960
959
}
961
960
initData = {}; // reclaim some memory
962
- m_driver->updateDescriptorSets (7u ,writes,0u ,nullptr );
963
961
// set up m_raygenDS
964
962
{
965
963
visibilityBuffer = createScreenSizedTexture (EF_R32G32B32A32_UINT);
@@ -969,14 +967,17 @@ void Renderer::init(const SAssetBundle& meshes, core::smart_refctd_ptr<ICPUBuffe
969
967
}
970
968
m_driver->updateDescriptorSets (descriptorUpdateCounts[2 ],writes,0u ,nullptr );
971
969
// set up m_closestHitDS
970
+ for (auto i=0u ; i<2u ; i++)
972
971
{
973
- createEmptyInteropBufferAndSetUpInfo (infos+0 ,m_intersectionBuffer[0 ],intersectionBufferSize);
974
- createEmptyInteropBufferAndSetUpInfo (infos+1 ,m_intersectionBuffer[1 ],intersectionBufferSize);
975
-
976
- setDstSetAndDescTypesOnWrites (m_closestHitDS.get (),writes,infos,{EDT_STORAGE_BUFFER,EDT_STORAGE_BUFFER});
977
- writes->count = 2u ;
972
+ const auto other = i^0x1u ;
973
+ infos[0u ].desc = m_rayBuffer[other].buffer ;
974
+ infos[0u ].buffer .offset = 0u ;
975
+ infos[0u ].buffer .size = m_rayBuffer[other].buffer ->getSize ();
976
+ createEmptyInteropBufferAndSetUpInfo (infos+1 ,m_intersectionBuffer[other],intersectionBufferSize);
977
+
978
+ setDstSetAndDescTypesOnWrites (m_closestHitDS[i].get (),writes,infos,{EDT_STORAGE_BUFFER,EDT_STORAGE_BUFFER});
979
+ m_driver->updateDescriptorSets (descriptorUpdateCounts[3 ],writes,0u ,nullptr );
978
980
}
979
- m_driver->updateDescriptorSets (1u ,writes,0u ,nullptr );
980
981
// set up m_resolveDS
981
982
{
982
983
infos[0 ].buffer = {0u ,_staticViewDataBuffer->getSize ()};
@@ -1107,9 +1108,9 @@ void Renderer::deinit()
1107
1108
1108
1109
m_raygenWorkGroups[0 ] = m_raygenWorkGroups[1 ] = 0u ;
1109
1110
m_resolveDS = nullptr ;
1110
- m_closestHitDS = nullptr ;
1111
+ m_closestHitDS[ 0 ] = m_closestHitDS[ 1 ] = nullptr ;
1111
1112
m_raygenDS = nullptr ;
1112
- m_commonRaytracingDS = nullptr ;
1113
+ m_commonRaytracingDS[ 0 ] = m_commonRaytracingDS[ 1 ] = nullptr ;
1113
1114
m_additionalGlobalDS = nullptr ;
1114
1115
m_rasterInstanceDataDS = nullptr ;
1115
1116
m_globalBackendDataDS = nullptr ;
@@ -1329,8 +1330,7 @@ void Renderer::render(nbl::ITimer* timer)
1329
1330
1330
1331
uint32_t Renderer::traceBounce (uint32_t raycount)
1331
1332
{
1332
- const uint32_t readIx = (++m_raytraceCommonData.depth )&0x1u ;
1333
- const uint32_t writeIx = readIx^0x1u ;
1333
+ const uint32_t descSetIx = (m_raytraceCommonData.depth ++)&0x1u ;
1334
1334
if (raycount==0u )
1335
1335
return 0u ;
1336
1336
// trace bounce (accumulate contributions and optionally generate rays)
@@ -1339,10 +1339,10 @@ uint32_t Renderer::traceBounce(uint32_t raycount)
1339
1339
const auto * pipelineLayout = (continuation ? m_closestHitPipeline:m_raygenPipeline)->getLayout ();
1340
1340
m_driver->pushConstants (pipelineLayout,ISpecializedShader::ESS_COMPUTE,0u ,sizeof (RaytraceShaderCommonData_t),&m_raytraceCommonData);
1341
1341
1342
- IGPUDescriptorSet* descriptorSets[4 ] = {m_globalBackendDataDS.get (),m_additionalGlobalDS.get (),m_commonRaytracingDS.get ()};
1342
+ IGPUDescriptorSet* descriptorSets[4 ] = {m_globalBackendDataDS.get (),m_additionalGlobalDS.get (),m_commonRaytracingDS[descSetIx] .get ()};
1343
1343
if (continuation)
1344
1344
{
1345
- descriptorSets[3 ] = m_closestHitDS.get ();
1345
+ descriptorSets[3 ] = m_closestHitDS[descSetIx] .get ();
1346
1346
m_driver->bindDescriptorSets (EPBP_COMPUTE,pipelineLayout,0u ,4u ,descriptorSets,nullptr );
1347
1347
m_driver->bindComputePipeline (m_closestHitPipeline.get ());
1348
1348
m_driver->dispatch ((raycount-1u )/WORKGROUP_SIZE+1u ,1u ,1u );
@@ -1369,7 +1369,7 @@ uint32_t Renderer::traceBounce(uint32_t raycount)
1369
1369
m_raytraceCommonData.rayCountWriteIx = (++m_raytraceCommonData.rayCountWriteIx )&RAYCOUNT_N_BUFFERING_MASK;
1370
1370
1371
1371
auto commandQueue = m_rrManager->getCLCommandQueue ();
1372
- const cl_mem clObjects[] = {m_rayBuffer[writeIx ].asRRBuffer .second ,m_intersectionBuffer[writeIx ].asRRBuffer .second };
1372
+ const cl_mem clObjects[] = {m_rayBuffer[descSetIx ].asRRBuffer .second ,m_intersectionBuffer[descSetIx ].asRRBuffer .second };
1373
1373
const auto objCount = sizeof (clObjects)/sizeof (cl_mem);
1374
1374
cl_event acquired=nullptr , raycastDone=nullptr ;
1375
1375
// run the raytrace queries
@@ -1378,8 +1378,8 @@ uint32_t Renderer::traceBounce(uint32_t raycount)
1378
1378
1379
1379
clEnqueueWaitForEvents (commandQueue,1u ,&acquired);
1380
1380
m_rrManager->getRadeonRaysAPI ()->QueryIntersection (
1381
- m_rayBuffer[writeIx ].asRRBuffer .first ,nextTraceRaycount,
1382
- m_intersectionBuffer[writeIx ].asRRBuffer .first ,nullptr ,nullptr
1381
+ m_rayBuffer[descSetIx ].asRRBuffer .first ,nextTraceRaycount,
1382
+ m_intersectionBuffer[descSetIx ].asRRBuffer .first ,nullptr ,nullptr
1383
1383
);
1384
1384
clEnqueueMarker (commandQueue,&raycastDone);
1385
1385
}
0 commit comments