Skip to content

Commit c543216

Browse files
first concept of refactoring RadeonRays for new API
1 parent 0120522 commit c543216

File tree

3 files changed

+100
-65
lines changed

3 files changed

+100
-65
lines changed

examples_tests/22.RaytracedAO/raytraceCommon.glsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
#if WORKGROUP_SIZE!=256
66
#error "Hardcoded 16 should be NBL_SQRT(WORKGROUP_SIZE)"
77
#endif
8-
#ifndef __cplusplus
98
#define WORKGROUP_DIM 16
9+
#ifndef __cplusplus
1010
layout(local_size_x = WORKGROUP_DIM, local_size_y = WORKGROUP_DIM) in;
1111
#endif
1212

include/irr/ext/RadeonRays/RadeonRays.h

Lines changed: 63 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,26 @@ namespace ext
1717
namespace RadeonRays
1818
{
1919

20+
// this is a really bad mock (do not take inspiration from it for the real API)
21+
class MockSceneManager
22+
{
23+
public:
24+
using MeshBufferGUID = uint32_t;
25+
using ObjectGUID = uint32_t;
26+
27+
struct ObjectData
28+
{
29+
core::matrix3x4SIMD tform;
30+
core::smart_refctd_ptr<video::IGPUMesh> mesh;
31+
core::vector<MeshBufferGUID> meshbufferIDs;
32+
};
33+
34+
const ObjectData& getObjectData(const ObjectGUID guid) const {return m_objectData[guid];}
35+
36+
//mocks
37+
core::vector<ObjectData> m_objectData;
38+
};
39+
2040

2141
class Manager final : public core::IReferenceCounted
2242
{
@@ -31,23 +51,27 @@ class Manager final : public core::IReferenceCounted
3151
}
3252

3353

34-
using MeshBufferRRShapeCache = core::unordered_map<const asset::ICPUMeshBuffer*,::RadeonRays::Shape*>;
35-
#ifdef TODO
36-
using MeshNodeRRInstanceCache = core::unordered_map<scene::IMeshSceneNode*, core::smart_refctd_dynamic_array<::RadeonRays::Shape*> >;
37-
#endif
54+
struct MeshBufferRRShapeCache
55+
{
56+
core::unordered_map<const asset::ICPUMeshBuffer*,::RadeonRays::Shape*> m_cpuAssociative;
57+
core::unordered_map<const video::IGPUMeshBuffer*,::RadeonRays::Shape*> m_gpuAssociative;
58+
};
59+
using NblInstanceRRInstanceCache = core::unordered_map<MockSceneManager::ObjectGUID,core::smart_refctd_dynamic_array<::RadeonRays::Shape*>>;
3860

3961
template<typename Iterator>
4062
inline void makeRRShapes(MeshBufferRRShapeCache& shapeCache, Iterator _begin, Iterator _end)
4163
{
42-
shapeCache.reserve(std::distance(_begin,_end));
64+
auto& cpuCache = shapeCache.m_cpuAssociative;
65+
cpuCache.reserve(cpuCache.size()+std::distance(_begin,_end));
66+
shapeCache.m_gpuAssociative.reserve(cpuCache.size());
4367

4468
for (auto it=_begin; it!=_end; it++)
4569
{
4670
auto* mb = static_cast<irr::asset::ICPUMeshBuffer*>(*it);
47-
auto found = shapeCache.find(mb);
48-
if (found!=shapeCache.end())
71+
auto found = cpuCache.find(mb);
72+
if (found!=cpuCache.end())
4973
continue;
50-
shapeCache.insert({mb,nullptr});
74+
cpuCache.insert({mb,nullptr});
5175

5276

5377
const auto posAttrID = mb->getPositionAttributeIx();
@@ -59,37 +83,28 @@ class Manager final : public core::IReferenceCounted
5983
}
6084

6185
for (auto it=_begin; it!=_end; it++)
62-
makeShape(shapeCache,static_cast<irr::asset::ICPUMeshBuffer*>(*it));
86+
makeShape(cpuCache,static_cast<irr::asset::ICPUMeshBuffer*>(*it));
6387
}
6488

6589
template<typename Iterator>
6690
inline void deleteShapes(Iterator _begin, Iterator _end)
6791
{
6892
for (auto it = _begin; it != _end; it++)
93+
{
6994
rr->DeleteShape(std::get<::RadeonRays::Shape*>(*it));
95+
}
7096
}
7197

72-
#ifdef TODO
98+
7399
template<typename Iterator>
74-
inline void makeRRInstances(MeshNodeRRInstanceCache& instanceCache, const MeshBufferRRShapeCache& shapeCache,
75-
asset::IAssetManager* _assetManager, Iterator _begin, Iterator _end, const int32_t* _id_begin=nullptr)
100+
inline void makeRRInstances(NblInstanceRRInstanceCache& instanceCache, MockSceneManager* mock_smgr,
101+
const MeshBufferRRShapeCache& shapeCache, asset::IAssetManager* _assetManager,
102+
Iterator _objectsBegin, Iterator _objectsEnd)
76103
{
77-
core::unordered_map<const video::IGPUMeshBuffer*,MeshBufferRRShapeCache::value_type> GPU2CPUTable;
78-
GPU2CPUTable.reserve(shapeCache.size());
79-
for (auto record : shapeCache)
80-
{
81-
auto gpumesh = dynamic_cast<video::IGPUMeshBuffer*>(_assetManager->findGPUObject(record.first).get());
82-
if (!gpumesh)
83-
continue;
84-
85-
GPU2CPUTable.insert({gpumesh,record});
86-
}
87-
88-
auto* id_it = _id_begin;
89-
for (auto it=_begin; it!=_end; it++,id_it++)
104+
for (auto it=_objectsBegin; it!=_objectsEnd; it++)
90105
{
91-
irr::scene::IMeshSceneNode* node = *it;
92-
makeInstance(instanceCache,GPU2CPUTable,node,_id_begin ? id_it:nullptr);
106+
const MockSceneManager::ObjectGUID objectGUID = *it;
107+
makeInstance(instanceCache,mock_smgr,shapeCache,_assetManager,objectGUID);
93108
}
94109
}
95110

@@ -127,37 +142,43 @@ class Manager final : public core::IReferenceCounted
127142
}
128143

129144

130-
inline void update(const MeshNodeRRInstanceCache& instances)
145+
template<typename Iterator>
146+
inline void update(const MockSceneManager* mock_smgr, Iterator _instancesBegin, Iterator _instancesEnd)
131147
{
132148
bool needToCommit = false;
133-
for (const auto& instance : instances)
149+
for (auto it=_instancesBegin; it!=_instancesEnd; it++)
134150
{
135-
auto absoluteTForm = core::matrix3x4SIMD().set(instance.first->getAbsoluteTransformation());
136-
auto* shapes = instance.second.get();
151+
const MockSceneManager::ObjectGUID objectID = it->first;
152+
const auto* shapeArray = it->second.get();
153+
154+
const auto firstShape = shapeArray->operator[](0);
137155

156+
// TODO: when actually implemented smgr, need a way to pull absolute transforms from GPU or CPU for RR to use
157+
const auto& absoluteTForm = mock_smgr->getObjectData(objectID).tform;
138158
// check if moved
139159
{
140-
core::matrix4SIMD oldTForm,dummy;
141-
shapes->operator[](0)->GetTransform(reinterpret_cast<::RadeonRays::matrix&>(oldTForm),reinterpret_cast<::RadeonRays::matrix&>(dummy));
142-
if (absoluteTForm==oldTForm.extractSub3x4())
160+
core::matrix4SIMD oldTForm, dummy;
161+
firstShape->GetTransform(reinterpret_cast<::RadeonRays::matrix&>(oldTForm), reinterpret_cast<::RadeonRays::matrix&>(dummy));
162+
if (absoluteTForm == oldTForm.extractSub3x4())
143163
continue;
164+
165+
needToCommit = true;
144166
}
145167

146-
needToCommit = true;
168+
147169
core::matrix4SIMD world(absoluteTForm);
148170

149171
core::matrix3x4SIMD tmp;
150172
absoluteTForm.getInverse(tmp);
151173
core::matrix4SIMD worldinv(tmp);
152174

153-
for (auto it=shapes->begin(); it!=shapes->end(); it++)
154-
(*it)->SetTransform(reinterpret_cast<::RadeonRays::matrix&>(world),reinterpret_cast<::RadeonRays::matrix&>(worldinv));
175+
for (auto shape : *shapeArray)
176+
shape->SetTransform(reinterpret_cast<::RadeonRays::matrix&>(world),reinterpret_cast<::RadeonRays::matrix&>(worldinv));
155177
}
156178

157179
if (needToCommit)
158180
rr->Commit();
159181
}
160-
#endif
161182

162183
inline bool hasImplicitCL2GLSync() const { return m_automaticOpenCLSync; }
163184

@@ -170,12 +191,10 @@ class Manager final : public core::IReferenceCounted
170191
Manager(video::IVideoDriver* _driver, cl_context context, bool automaticOpenCLSync);
171192
~Manager();
172193

173-
void makeShape(MeshBufferRRShapeCache& shapeCache, const asset::ICPUMeshBuffer* mb);
174-
#ifdef TODO
175-
void makeInstance( MeshNodeRRInstanceCache& instanceCache,
176-
const core::unordered_map<const video::IGPUMeshBuffer*,MeshBufferRRShapeCache::value_type>& GPU2CPUTable,
177-
scene::IMeshSceneNode* node, const int32_t* id_it);
178-
#endif
194+
void makeShape(core::unordered_map<const asset::ICPUMeshBuffer*,::RadeonRays::Shape*>& cpuCache, const asset::ICPUMeshBuffer* mb);
195+
void makeInstance( NblInstanceRRInstanceCache& instanceCache, MockSceneManager* mock_smgr,
196+
MeshBufferRRShapeCache& shapeCache, asset::IAssetManager* _assetManager,
197+
MockSceneManager::ObjectGUID objectID);
179198

180199
video::IVideoDriver* driver;
181200
::RadeonRays::IntersectionApi* rr;

src/irr/ext/RadeonRays/RadeonRays.cpp

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,10 @@ std::pair<::RadeonRays::Buffer*,cl_mem> Manager::linkBuffer(const video::IGPUBuf
6969
return {nullptr,nullptr};
7070
}
7171

72-
void Manager::makeShape(MeshBufferRRShapeCache& shapeCache, const asset::ICPUMeshBuffer* mb)
72+
void Manager::makeShape(core::unordered_map<const asset::ICPUMeshBuffer*,::RadeonRays::Shape*>& cpuCache, const asset::ICPUMeshBuffer* mb)
7373
{
74-
auto found = shapeCache.find(mb);
75-
if (found==shapeCache.end())
74+
auto found = cpuCache.find(mb);
75+
if (found==cpuCache.end())
7676
return;
7777

7878
auto pType = mb->getPipeline()->getPrimitiveAssemblyParams().primitiveType;
@@ -91,32 +91,48 @@ void Manager::makeShape(MeshBufferRRShapeCache& shapeCache, const asset::ICPUMes
9191
nullptr,indexCount/IndicesPerTriangle);
9292
}
9393

94-
#ifdef TODO
95-
void Manager::makeInstance( MeshNodeRRInstanceCache& instanceCache,
96-
const core::unordered_map<const video::IGPUMeshBuffer*,MeshBufferRRShapeCache::value_type>& GPU2CPUTable,
97-
scene::IMeshSceneNode* node, const int32_t* id_it)
94+
void Manager::makeInstance( NblInstanceRRInstanceCache& instanceCache, MockSceneManager* mock_smgr,
95+
MeshBufferRRShapeCache& shapeCache, asset::IAssetManager* _assetManager,
96+
MockSceneManager::ObjectGUID objectID)
9897
{
99-
if (instanceCache.find(node)!=instanceCache.end())
98+
if (instanceCache.find(objectID)!=instanceCache.end())
10099
return; // already cached
101100

102-
const auto* mesh = node->getMesh();
103-
auto mbCount = mesh->getMeshBufferCount();
104-
if (mbCount==0u)
105-
return;
101+
const auto& objectData = mock_smgr->getObjectData(objectID);
102+
const auto& mesh = objectData.mesh;
103+
const auto mbCount = mesh->getMeshBufferCount();
104+
assert(mbCount==objectData.meshbufferIDs.size());
105+
assert(mbCount>0u);
106+
107+
auto& gpuCache = shapeCache.m_gpuAssociative;
108+
bool notRefreshedAlready = true;
106109

107110
auto output = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<::RadeonRays::Shape*>>(mbCount);
108111
for (auto i=0; i<mbCount; i++)
109112
{
110113
const auto* mb = mesh->getMeshBuffer(i);
111-
auto found = GPU2CPUTable.find(mb);
112-
if (found==GPU2CPUTable.end())
114+
auto found = gpuCache.find(mb);
115+
// refresh cpu cache from cpu cache if not found
116+
if (notRefreshedAlready && found==gpuCache.end())
117+
{
118+
for (auto cpuAssociation : shapeCache.m_cpuAssociative)
119+
{
120+
const auto* gpumeshbuffer = dynamic_cast<video::IGPUMeshBuffer*>(_assetManager->findGPUObject(cpuAssociation.first).get());
121+
if (!gpumeshbuffer)
122+
continue;
123+
::RadeonRays::Shape* shape = cpuAssociation.second;
124+
auto successAndLocation = gpuCache.emplace(gpumeshbuffer,shape);
125+
if (gpumeshbuffer==mb)
126+
found = successAndLocation.first;
127+
}
128+
notRefreshedAlready = false;
129+
}
130+
if (found==gpuCache.end())
113131
continue;
114132

115-
auto* instance = rr->CreateInstance(found->second.second);
116-
if (id_it)
117-
instance->SetId(*id_it);
133+
auto* instance = rr->CreateInstance(found->second);
134+
instance->SetId(objectData.meshbufferIDs[i]);
118135
output->operator[](i) = instance;
119136
}
120-
instanceCache.insert({node,output});
121-
}
122-
#endif
137+
instanceCache.insert({objectID,output});
138+
}

0 commit comments

Comments
 (0)