@@ -552,7 +552,7 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
552552 // make a shortened version of the globalBackendDataDS
553553 m_rasterInstanceDataDS = m_driver->createGPUDescriptorSet (core::smart_refctd_ptr (m_rasterInstanceDataDSLayout));
554554 {
555- IGPUDescriptorSet::SCopyDescriptorSet copy;
555+ IGPUDescriptorSet::SCopyDescriptorSet copy = {} ;
556556 copy.dstSet = m_rasterInstanceDataDS.get ();
557557 copy.srcSet = m_globalBackendDataDS.get ();
558558 copy.srcBinding = 5u ;
@@ -731,9 +731,6 @@ void Renderer::initSceneResources(SAssetBundle& meshes)
731731 {
732732 // i know what I'm doing
733733 auto globalBackendDataDSLayout = core::smart_refctd_ptr<IGPUDescriptorSetLayout>(const_cast <IGPUDescriptorSetLayout*>(m_globalBackendDataDS->getLayout ()));
734-
735- for (auto i=0u ; i<2u ; i++)
736- m_commonRaytracingDS[i] = m_driver->createGPUDescriptorSet (core::smart_refctd_ptr (m_commonRaytracingDSLayout));
737734
738735 // cull
739736 {
@@ -764,9 +761,6 @@ void Renderer::initSceneResources(SAssetBundle& meshes)
764761 core::smart_refctd_ptr (m_commonRaytracingDSLayout),
765762 core::smart_refctd_ptr (m_closestHitDSLayout)
766763 );
767-
768- for (auto i=0u ; i<2u ; i++)
769- m_closestHitDS[i] = m_driver->createGPUDescriptorSet (core::smart_refctd_ptr (m_closestHitDSLayout));
770764 }
771765
772766 // resolve
@@ -842,9 +836,7 @@ void Renderer::deinitSceneResources()
842836 glFinish ();
843837
844838 m_resolveDS = nullptr ;
845- m_closestHitDS[0 ] = m_closestHitDS[1 ] = nullptr ;
846839 m_raygenDS = nullptr ;
847- m_commonRaytracingDS[0 ] = m_commonRaytracingDS[1 ] = nullptr ;
848840 m_additionalGlobalDS = nullptr ;
849841 m_rasterInstanceDataDS = nullptr ;
850842 m_globalBackendDataDS = nullptr ;
@@ -1059,6 +1051,9 @@ void Renderer::initScreenSizedResources(uint32_t width, uint32_t height, core::s
10591051 setImageInfo (infos+3 ,asset::EIL_GENERAL,core::smart_refctd_ptr (m_accumulation));
10601052 createEmptyInteropBufferAndSetUpInfo (infos+4 ,m_rayBuffer[0 ],raygenBufferSize);
10611053 setBufferInfo (infos+5 ,m_rayCountBuffer);
1054+
1055+ for (auto i=0u ; i<2u ; i++)
1056+ m_commonRaytracingDS[i] = m_driver->createGPUDescriptorSet (core::smart_refctd_ptr (m_commonRaytracingDSLayout));
10621057
10631058 constexpr auto descriptorUpdateCount = 6u ;
10641059 setDstSetAndDescTypesOnWrites (m_commonRaytracingDS[0 ].get (),writes,infos,{
@@ -1094,6 +1089,8 @@ void Renderer::initScreenSizedResources(uint32_t width, uint32_t height, core::s
10941089 infos[0u ].buffer .offset = 0u ;
10951090 infos[0u ].buffer .size = m_rayBuffer[other].buffer ->getSize ();
10961091 createEmptyInteropBufferAndSetUpInfo (infos+1 ,m_intersectionBuffer[other],intersectionBufferSize);
1092+
1093+ m_closestHitDS[i] = m_driver->createGPUDescriptorSet (core::smart_refctd_ptr (m_closestHitDSLayout));
10971094
10981095 setDstSetAndDescTypesOnWrites (m_closestHitDS[i].get (),writes,infos,{EDT_STORAGE_BUFFER,EDT_STORAGE_BUFFER});
10991096 m_driver->updateDescriptorSets (2u ,writes,0u ,nullptr );
@@ -1203,6 +1200,11 @@ void Renderer::deinitScreenSizedResources()
12031200 m_denoiserInputs[EDI_NORMAL] = {};
12041201 m_denoiserOutput = {};
12051202#endif
1203+
1204+ // make sure descriptor sets dont dangle
1205+ // m_driver->bindDescriptorSets(video::EPBP_COMPUTE,nullptr,0u,4u,nullptr);
1206+ m_closestHitDS[0 ] = m_closestHitDS[1 ] = nullptr ;
1207+ m_commonRaytracingDS[0 ] = m_commonRaytracingDS[1 ] = nullptr ;
12061208
12071209 // unset the framebuffer (dangling smartpointer in state cache can prevent the framebuffer from being dropped until the next framebuffer set)
12081210 m_driver->setRenderTarget (nullptr ,false );
@@ -1217,6 +1219,7 @@ void Renderer::deinitScreenSizedResources()
12171219 m_colorBuffer = nullptr ;
12181220 }
12191221 m_accumulation = m_tonemapOutput = nullptr ;
1222+ glFinish ();
12201223
12211224 // wait for OpenCL to finish
12221225 ocl::COpenCLHandler::ocl.pclFlush (commandQueue);
@@ -1225,8 +1228,7 @@ void Renderer::deinitScreenSizedResources()
12251228 {
12261229 auto deleteInteropBuffer = [&](InteropBuffer& buffer) -> void
12271230 {
1228- if (buffer.asRRBuffer .first )
1229- m_rrManager->deleteRRBuffer (buffer.asRRBuffer .first );
1231+ m_rrManager->unlinkBuffer (std::move (buffer.asRRBuffer ));
12301232 buffer = {};
12311233 };
12321234 deleteInteropBuffer (m_intersectionBuffer[i]);
0 commit comments