Skip to content

Commit 18d7433

Browse files
get radeon rays and ex 22 to compile
1 parent 3c621d8 commit 18d7433

File tree

3 files changed

+57
-71
lines changed

3 files changed

+57
-71
lines changed

22.RaytracedAO/Renderer.cpp

+48-56
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));

22.RaytracedAO/Renderer.h

+4-4
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;

22.RaytracedAO/main.cpp

+5-11
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

0 commit comments

Comments
 (0)