Skip to content

Commit 8065bb2

Browse files
make sure Nabla refcounting doesn't keep large raybuffers alive and release OpenCL objects properly
1 parent 9a68602 commit 8065bb2

File tree

4 files changed

+25
-15
lines changed

4 files changed

+25
-15
lines changed

examples_tests/22.RaytracedAO/Renderer.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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]);

include/nbl/ext/RadeonRays/RadeonRays.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,7 @@ class Manager final : public core::IReferenceCounted
4949

5050

5151
std::pair<::RadeonRays::Buffer*,cl_mem> linkBuffer(const video::IGPUBuffer* buffer, cl_mem_flags access);
52-
inline void deleteRRBuffer(::RadeonRays::Buffer* buffer)
53-
{
54-
rr->DeleteBuffer(buffer);
55-
}
52+
void unlinkBuffer(std::pair<::RadeonRays::Buffer*,cl_mem>&& link);
5653

5754

5855
struct MeshBufferRRShapeCache

source/Nabla/COpenCLHandler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@ class COpenCLHandler
284284
,clEnqueueWaitForEvents
285285
,clEnqueueMarker
286286
,clWaitForEvents
287+
,clReleaseMemObject
287288
,clEnqueueAcquireGLObjects
288289
,clEnqueueReleaseGLObjects
289290
);

src/nbl/ext/RadeonRays/RadeonRays.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,16 @@ std::pair<::RadeonRays::Buffer*,cl_mem> Manager::linkBuffer(const video::IGPUBuf
7373
return {nullptr,nullptr};
7474
}
7575

76+
void Manager::unlinkBuffer(std::pair<::RadeonRays::Buffer*,cl_mem>&& link)
77+
{
78+
auto buffer = std::get<::RadeonRays::Buffer*>(link);
79+
if (buffer)
80+
rr->DeleteBuffer(buffer);
81+
auto clbuff = std::get<cl_mem>(link);
82+
if (clbuff)
83+
clReleaseMemObject(clbuff);
84+
}
85+
7686
void Manager::makeShape(core::unordered_map<const asset::ICPUMeshBuffer*,::RadeonRays::Shape*>& cpuCache, const asset::ICPUMeshBuffer* mb)
7787
{
7888
auto found = cpuCache.find(mb);

0 commit comments

Comments
 (0)