Skip to content

Commit dc09b39

Browse files
committed
Merge branch 'animation' of https://github.com/Devsh-Graphics-Programming/Nabla into spirv-optimizer
2 parents 69f90c5 + 570d0e2 commit dc09b39

File tree

6 files changed

+77
-88
lines changed

6 files changed

+77
-88
lines changed

examples_tests/22.RaytracedAO/Renderer.cpp

Lines changed: 48 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -163,21 +163,13 @@ Renderer::~Renderer()
163163
Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& meshes)
164164
{
165165
InitializationData retval;
166-
167-
auto getInstances = [&retval](const auto& cpumesh) -> core::vector<ext::MitsubaLoader::IMeshMetadata::Instance>
166+
retval.globalMeta = meshes.getMetadata()->selfCast<const ext::MitsubaLoader::CMitsubaMetadata>();
167+
assert(retval.globalMeta);
168168
{
169-
auto* meta = cpumesh->getMetadata();
170-
assert(meta && core::strcmpi(meta->getLoaderName(), ext::MitsubaLoader::IMitsubaMetadata::LoaderName) == 0);
171-
const auto* meshmeta = static_cast<const ext::MitsubaLoader::IMeshMetadata*>(meta);
172-
retval.globalMeta = meshmeta->globalMetadata.get();
173-
assert(retval.globalMeta);
174-
175-
// WARNING !!!
176-
// all this instance-related things is a rework candidate since mitsuba loader supports instances
177-
// (all this metadata should be global, but meshbuffers has instanceCount correctly set
178-
// and globalDS with per-instance data (transform, normal matrix, instructions offsets, etc)
179-
return meshmeta->getInstances();
180-
};
169+
auto* glslMaterialBackendGlobalDS = retval.globalMeta->m_global.m_ds0.get();
170+
m_globalBackendDataDS = m_driver->getGPUObjectsFromAssets(&glslMaterialBackendGlobalDS,&glslMaterialBackendGlobalDS+1)->front();
171+
}
172+
181173
core::vector<CullData_t> cullData;
182174
core::vector<std::pair<core::smart_refctd_ptr<IGPUMeshBuffer>,uint32_t>> gpuMeshBuffers;
183175
{
@@ -208,38 +200,39 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
208200
};
209201
core::unordered_map<VisibilityBufferPipelineKey, core::smart_refctd_ptr<ICPURenderpassIndependentPipeline>, VisibilityBufferPipelineKeyHash> visibilityBufferFillPipelines;
210202

211-
meshesToProcess.reserve(contents.size());
212-
for (auto* it=contents.begin(); it!=contents.end(); it++)
213203
{
214-
auto cpumesh = static_cast<asset::ICPUMesh*>(it->get());
215-
meshesToProcess.push_back(cpumesh);
204+
meshesToProcess.reserve(contents.size());
216205

217-
const auto& instances = getInstances(cpumesh);
206+
uint32_t drawableCount = 0u;
207+
for (const auto& asset : contents)
208+
{
209+
auto cpumesh = static_cast<asset::ICPUMesh*>(asset.get());
210+
auto meshBuffers = cpumesh->getMeshBuffers();
211+
assert(!meshBuffers.empty());
218212

219-
auto meshBufferCount = cpumesh->getMeshBufferCount();
220-
assert(meshBufferCount);
213+
meshesToProcess.push_back(cpumesh);
221214

222-
const auto cullDataOffset = cullData.size();
223-
cullData.resize(cullDataOffset+instances.size()*meshBufferCount);
224-
for (auto i=0u; i<meshBufferCount; i++)
215+
drawableCount += meshBuffers.size()*retval.globalMeta->getAssetSpecificMetadata(cpumesh)->m_instances.size();
216+
}
217+
cullData.resize(drawableCount);
218+
}
219+
auto cullDataIt = cullData.begin();
220+
for (const auto& asset : contents)
221+
{
222+
auto cpumesh = static_cast<asset::ICPUMesh*>(asset.get());
223+
const auto* meta = retval.globalMeta->getAssetSpecificMetadata(cpumesh);
224+
const auto& instanceData = meta->m_instances;
225+
const auto& instanceAuxData = meta->m_instanceAuxData;
226+
227+
auto cullDataBaseBegin = cullDataIt;
228+
auto meshBuffers = cpumesh->getMeshBuffers();
229+
for (auto cpumb : meshBuffers)
225230
{
226-
// TODO: get rid of `getMeshBuffer` and `getMeshBufferCount`, just return a range as `getMeshBuffers`
227-
auto cpumb = cpumesh->getMeshBuffer(i);
228-
assert(cpumb->getInstanceCount()==instances.size());
231+
assert(cpumb->getInstanceCount()==instanceData.size());
229232

230233
// set up Visibility Buffer pipelines
231234
{
232235
auto oldPipeline = cpumb->getPipeline();
233-
234-
// if global SSBO with instruction streams not captured yet
235-
if (!m_globalBackendDataDS)
236-
{
237-
// a bit roundabout but oh well what can we do (global metadata needs to be more useful)
238-
auto* pipelinemeta = static_cast<ext::MitsubaLoader::CMitsubaPipelineMetadata*>(oldPipeline->getMetadata());
239-
auto* glslMaterialBackendGlobalDS = pipelinemeta->getDescriptorSet();
240-
m_globalBackendDataDS = m_driver->getGPUObjectsFromAssets(&glslMaterialBackendGlobalDS,&glslMaterialBackendGlobalDS+1)->front();
241-
}
242-
243236
auto vertexInputParams = oldPipeline->getVertexInputParams();
244237
const bool frontFaceIsCCW = oldPipeline->getRasterizationParams().frontFaceIsCCW;
245238
auto found = visibilityBufferFillPipelines.find(VisibilityBufferPipelineKey{ vertexInputParams,frontFaceIsCCW });
@@ -264,7 +257,7 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
264257
cpumb->setPipeline(std::move(newPipeline));
265258
}
266259

267-
CullData_t& baseCullData = cullData[cullDataOffset+i];
260+
CullData_t& baseCullData = *(cullDataIt++);
268261
{
269262
const auto aabbOriginal = cpumb->getBoundingBox();
270263
baseCullData.aabbMinEdge.x = aabbOriginal.MinEdge.X;
@@ -279,40 +272,39 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
279272

280273
meshBuffersToProcess.push_back(cpumb);
281274
}
282-
auto cullDataBaseBegin = cullData.begin()+cullDataOffset;
283-
auto cullDataBaseEnd = cullDataBaseBegin+meshBufferCount;
284-
285275

286276
// set up scene bounds and lights
287277
const auto aabbOriginal = cpumesh->getBoundingBox();
288-
for (auto j=0u; j<instances.size(); j++)
278+
for (auto j=0u; j<instanceData.size(); j++)
289279
{
290-
const auto& instance = instances[j];
280+
const auto& worldTform = instanceData.begin()[j].worldTform;
281+
const auto& aux = instanceAuxData.begin()[j];
282+
291283
ext::RadeonRays::MockSceneManager::ObjectData objectData;
292284
{
293-
objectData.tform = instance.tform;
285+
objectData.tform = worldTform;
294286
objectData.mesh = nullptr;
295-
objectData.instanceGUIDPerMeshBuffer.reserve(meshBufferCount);
296-
for (auto src=cullDataBaseBegin; src!=cullDataBaseEnd; src++)
287+
objectData.instanceGUIDPerMeshBuffer.reserve(meshBuffers.size());
288+
for (auto src=cullDataBaseBegin; src!=cullDataIt; src++)
297289
{
298-
auto dst = src+j*meshBufferCount;
290+
auto dst = src+j*meshBuffers.size();
299291
*dst = *src;
300292
dst->globalObjectID += j;
301293
objectData.instanceGUIDPerMeshBuffer.push_back(dst->globalObjectID);
302294
}
303295
}
304296
m_mock_smgr.m_objectData.push_back(std::move(objectData));
305297

306-
m_sceneBound.addInternalBox(core::transformBoxEx(aabbOriginal,instance.tform));
298+
m_sceneBound.addInternalBox(core::transformBoxEx(aabbOriginal,worldTform));
307299

308-
auto emitter = instance.emitter.front;
300+
auto emitter = aux.frontEmitter;
309301
if (emitter.type != ext::MitsubaLoader::CElementEmitter::Type::INVALID)
310302
{
311303
assert(emitter.type == ext::MitsubaLoader::CElementEmitter::Type::AREA);
312304

313-
SLight newLight(cpumesh->getBoundingBox(), instance.tform);
305+
SLight newLight(aabbOriginal,worldTform); // TODO: should be an OBB
314306

315-
const float weight = newLight.computeFluxBound(emitter.area.radiance) * emitter.area.samplingWeight;
307+
const float weight = newLight.computeFluxBound(emitter.area.radiance)*emitter.area.samplingWeight;
316308
if (weight <= FLT_MIN)
317309
continue;
318310

@@ -335,7 +327,7 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
335327
auto objectDataIt = m_mock_smgr.m_objectData.begin();
336328
for (auto i=0u; i<gpuMeshes->size(); i++)
337329
{
338-
const auto instanceCount = getInstances(meshesToProcess[i]).size();
330+
const auto instanceCount = retval.globalMeta->getAssetSpecificMetadata(meshesToProcess[i])->m_instances.size();
339331
for (size_t j=0u; j<instanceCount; j++)
340332
(objectDataIt++)->mesh = gpuMeshes->operator[](i);
341333
}
@@ -370,7 +362,7 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
370362
{
371363
std::copy(gpumb->getVertexBufferBindings(),gpumb->getVertexBufferBindings()+IGPUMeshBuffer::MAX_ATTR_BUF_BINDING_COUNT,call.vertexBindings);
372364
call.indexBuffer = core::smart_refctd_ptr(gpumb->getIndexBufferBinding().buffer);
373-
call.pipeline = core::smart_refctd_ptr<IGPURenderpassIndependentPipeline>(const_cast<IGPURenderpassIndependentPipeline*>(gpumb->getPipeline()));
365+
call.pipeline = core::smart_refctd_ptr<const IGPURenderpassIndependentPipeline>(gpumb->getPipeline());
374366
};
375367
initNewMDI(std::get<core::smart_refctd_ptr<IGPUMeshBuffer>>(gpuMeshBuffers.front()));
376368
call.mdiOffset = 0u;
@@ -475,7 +467,7 @@ void Renderer::initSceneNonAreaLights(Renderer::InitializationData& initData)
475467
{
476468
core::vectorSIMDf _envmapBaseColor;
477469
_envmapBaseColor.set(0.f,0.f,0.f,1.f);
478-
for (const auto& emitter : initData.globalMeta->emitters)
470+
for (const auto& emitter : initData.globalMeta->m_global.m_emitters)
479471
{
480472
float weight = 0.f;
481473
switch (emitter.type)
@@ -610,7 +602,7 @@ void Renderer::init(const SAssetBundle& meshes,
610602
// figure out the renderable size
611603
{
612604
m_staticViewData.imageDimensions = {m_driver->getScreenSize().Width,m_driver->getScreenSize().Height};
613-
const auto& sensors = initData.globalMeta->sensors;
605+
const auto& sensors = initData.globalMeta->m_global.m_sensors;
614606
if (sensors.size())
615607
{
616608
// just grab the first sensor
@@ -690,7 +682,7 @@ void Renderer::init(const SAssetBundle& meshes,
690682
core::smart_refctd_ptr(m_raygenDSLayout),
691683
nullptr
692684
);
693-
(std::ofstream("material_declarations.glsl") << "#define _NBL_EXT_MITSUBA_LOADER_VT_STORAGE_VIEW_COUNT " << initData.globalMeta->getVTStorageViewCount() << "\n" << initData.globalMeta->materialCompilerGLSL_declarations).close();
685+
(std::ofstream("material_declarations.glsl") << "#define _NBL_EXT_MITSUBA_LOADER_VT_STORAGE_VIEW_COUNT " << initData.globalMeta->m_global.getVTStorageViewCount() << "\n" << initData.globalMeta->m_global.m_materialCompilerGLSL_declarations).close();
694686
m_raygenPipeline = m_driver->createGPUComputePipeline(nullptr, core::smart_refctd_ptr(m_raygenPipelineLayout),gpuSpecializedShaderFromFile(m_assetManager,m_driver,"../raygen.comp"));
695687

696688
m_raygenDS = m_driver->createGPUDescriptorSet(core::smart_refctd_ptr(m_raygenDSLayout));

examples_tests/22.RaytracedAO/Renderer.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class Renderer : public nbl::core::IReferenceCounted, public nbl::core::Interfac
8383
nbl::core::vector<float> lightPDF;
8484
nbl::core::vector<uint32_t> lightCDF;
8585
};
86-
const nbl::ext::MitsubaLoader::CGlobalMitsubaMetadata* globalMeta = nullptr;
86+
const nbl::ext::MitsubaLoader::CMitsubaMetadata* globalMeta = nullptr;
8787
};
8888
InitializationData initSceneObjects(const nbl::asset::SAssetBundle& meshes);
8989
void initSceneNonAreaLights(InitializationData& initData);
@@ -134,9 +134,9 @@ class Renderer : public nbl::core::IReferenceCounted, public nbl::core::Interfac
134134
nbl::core::smart_refctd_ptr<nbl::video::IGPUBuffer> m_indirectDrawBuffers[2];
135135
struct MDICall
136136
{
137-
nbl::asset::SBufferBinding<nbl::video::IGPUBuffer> vertexBindings[nbl::video::IGPUMeshBuffer::MAX_ATTR_BUF_BINDING_COUNT];
138-
nbl::core::smart_refctd_ptr<nbl::video::IGPUBuffer> indexBuffer;
139-
nbl::core::smart_refctd_ptr<nbl::video::IGPURenderpassIndependentPipeline> pipeline;
137+
nbl::asset::SBufferBinding<const nbl::video::IGPUBuffer> vertexBindings[nbl::video::IGPUMeshBuffer::MAX_ATTR_BUF_BINDING_COUNT];
138+
nbl::core::smart_refctd_ptr<const nbl::video::IGPUBuffer> indexBuffer;
139+
nbl::core::smart_refctd_ptr<const nbl::video::IGPURenderpassIndependentPipeline> pipeline;
140140
uint32_t mdiOffset, mdiCount;
141141
};
142142
nbl::core::vector<MDICall> m_mdiDrawCalls;

examples_tests/22.RaytracedAO/main.cpp

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ int main()
3737

3838
//
3939
asset::SAssetBundle meshes;
40-
core::smart_refctd_ptr<ext::MitsubaLoader::CGlobalMitsubaMetadata> globalMeta;
40+
core::smart_refctd_ptr<const ext::MitsubaLoader::CMitsubaMetadata> globalMeta;
4141
{
4242
io::IFileSystem* fs = device->getFileSystem();
4343
asset::IAssetManager* am = device->getAssetManager();
@@ -106,15 +106,9 @@ int main()
106106
if (!contents.size())
107107
return 2;
108108

109-
auto firstmesh = *contents.begin();
110-
if (!firstmesh)
109+
globalMeta = core::smart_refctd_ptr<const ext::MitsubaLoader::CMitsubaMetadata>(meshes.getMetadata()->selfCast<const ext::MitsubaLoader::CMitsubaMetadata>());
110+
if (!globalMeta)
111111
return 3;
112-
113-
auto meta = firstmesh->getMetadata();
114-
if (!meta)
115-
return 4;
116-
assert(core::strcmpi(meta->getLoaderName(),ext::MitsubaLoader::IMitsubaMetadata::LoaderName) == 0);
117-
globalMeta = static_cast<ext::MitsubaLoader::IMeshMetadata*>(meta)->globalMetadata;
118112
}
119113

120114

@@ -126,9 +120,9 @@ int main()
126120
auto isOkSensorType = [](const ext::MitsubaLoader::CElementSensor& sensor) -> bool {
127121
return sensor.type == ext::MitsubaLoader::CElementSensor::Type::PERSPECTIVE || sensor.type == ext::MitsubaLoader::CElementSensor::Type::THINLENS;
128122
};
129-
if (globalMeta->sensors.size() && isOkSensorType(globalMeta->sensors.front()))
123+
if (globalMeta->m_global.m_sensors.size() && isOkSensorType(globalMeta->m_global.m_sensors.front()))
130124
{
131-
const auto& sensor = globalMeta->sensors.front();
125+
const auto& sensor = globalMeta->m_global.m_sensors.front();
132126
const auto& film = sensor.film;
133127

134128
// need to extract individual components

include/nbl/asset/utils/IMeshManipulator.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -499,7 +499,7 @@ class IMeshManipulator : public virtual core::IReferenceCounted
499499
break;
500500
}
501501

502-
const bool iota = cpumb->getIndexType()==EIT_UNKNOWN||!cpumb->getIndexBufferBinding()->buffer;
502+
const bool iota = cpumb->getIndexType()==EIT_UNKNOWN||!cpumb->getIndexBufferBinding().buffer;
503503
if (iota)
504504
iotaLength = core::max(cpumb->getIndexCount(),iotaLength);
505505
}
@@ -522,7 +522,7 @@ class IMeshManipulator : public virtual core::IReferenceCounted
522522
core::smart_refctd_ptr<ICPUBuffer> newIndexBuffer;
523523

524524
void* correctlyOffsetIndexBufferPtr;
525-
const bool iota = indexType==EIT_UNKNOWN||!cpumb->getIndexBufferBinding()->buffer;
525+
const bool iota = indexType==EIT_UNKNOWN||!cpumb->getIndexBufferBinding().buffer;
526526
if (iota)
527527
correctlyOffsetIndexBufferPtr = iotaUint32Buffer->getPointer();
528528
else

include/nbl/ext/RadeonRays/RadeonRays.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class Manager final : public core::IReferenceCounted
8383
assert(format==asset::EF_R32G32B32A32_SFLOAT||format==asset::EF_R32G32B32_SFLOAT);
8484

8585
assert(mb->getPipeline()->getPrimitiveAssemblyParams().primitiveType==EPT_TRIANGLE_LIST);
86-
assert(mb->getIndexBufferBinding()->buffer);
86+
assert(mb->getIndexBufferBinding().buffer);
8787
}
8888

8989
for (auto it=_begin; it!=_end; it++)

src/nbl/ext/RadeonRays/RadeonRays.cpp

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,11 @@ void Manager::makeShape(core::unordered_map<const asset::ICPUMeshBuffer*,::Radeo
8484
const auto indexCount = mb->getIndexCount();
8585
assert(indexCount>=3);
8686

87-
const int32_t vertexCount = mb->calcVertexCount();
87+
const int32_t vertexUpperBound = asset::IMeshManipulator::upperBoundVertexID(mb);
8888

8989
constexpr int32_t IndicesPerTriangle = 3;
9090
const auto posAttrID = mb->getPositionAttributeIx();
91-
found->second = rr->CreateMesh( reinterpret_cast<const float*>( mb->getAttribPointer(posAttrID)),vertexCount,
91+
found->second = rr->CreateMesh( reinterpret_cast<const float*>( mb->getAttribPointer(posAttrID)),vertexUpperBound,
9292
mb->getAttribStride(posAttrID),
9393
indices,sizeof(int32_t)*IndicesPerTriangle, // radeon rays understands index stride differently to me
9494
nullptr,indexCount/IndicesPerTriangle);
@@ -103,17 +103,18 @@ void Manager::makeInstance( NblInstanceRRInstanceCache& instanceCache, MockScene
103103

104104
const auto& objectData = mock_smgr->getObjectData(objectID);
105105
const auto& mesh = objectData.mesh;
106-
const auto mbCount = mesh->getMeshBufferCount();
107-
assert(mbCount==objectData.instanceGUIDPerMeshBuffer.size());
108-
assert(mbCount>0u);
106+
const auto meshBuffers = mesh->getMeshBuffers();
107+
assert(meshBuffers.size()==objectData.instanceGUIDPerMeshBuffer.size());
108+
assert(meshBuffers.size()>0u);
109109

110110
auto& gpuCache = shapeCache.m_gpuAssociative;
111111
bool notRefreshedAlready = true;
112112

113-
auto output = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<::RadeonRays::Shape*>>(mbCount);
114-
for (auto i=0; i<mbCount; i++)
113+
auto instanceGUIDIt = objectData.instanceGUIDPerMeshBuffer.begin();
114+
auto output = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<::RadeonRays::Shape*>>(meshBuffers.size());
115+
auto outputIt = output->begin();
116+
for (const auto& mb : meshBuffers)
115117
{
116-
const auto* mb = mesh->getMeshBuffer(i);
117118
auto found = gpuCache.find(mb);
118119
// refresh cpu cache from cpu cache if not found
119120
if (notRefreshedAlready && found==gpuCache.end())
@@ -130,12 +131,14 @@ void Manager::makeInstance( NblInstanceRRInstanceCache& instanceCache, MockScene
130131

131132
found = gpuCache.find(mb);
132133
}
133-
if (found==gpuCache.end())
134-
continue;
135-
136-
auto* instance = rr->CreateInstance(found->second);
137-
instance->SetId(objectData.instanceGUIDPerMeshBuffer[i]);
138-
output->operator[](i) = instance;
134+
if (found!=gpuCache.end())
135+
{
136+
auto* instance = rr->CreateInstance(found->second);
137+
instance->SetId(*instanceGUIDIt);
138+
*outputIt = instance;
139+
}
140+
instanceGUIDIt++;
141+
outputIt++;
139142
}
140143
instanceCache.insert({objectID,output});
141144
}

0 commit comments

Comments
 (0)