Skip to content

Commit 75009e8

Browse files
Merge pull request #65 from Crisspl/spirv-optimizer
Asset Restore, Mitsuba Loader Fixes, CDerivativeMapCreator factored out
2 parents 4ac9c88 + a363f73 commit 75009e8

35 files changed

+692
-330
lines changed

examples_tests/18.MitsubaLoader/main.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -106,17 +106,18 @@ void main()
106106
107107
// "The sign of this computation is negated when the value of GL_CLIP_ORIGIN (the clip volume origin, set with glClipControl) is GL_UPPER_LEFT."
108108
const bool front = (!gl_FrontFacing) != (PC.camTformDeterminant*InstData.data[InstanceIndex].determinant < 0.0);
109-
nbl_glsl_MC_precomputed_t precomp = nbl_glsl_precomputeData(front);
109+
precomp = nbl_glsl_MC_precomputeData(front);
110+
material = nbl_glsl_MC_material_data_t_getOriented(InstData.data[InstanceIndex].material,precomp.frontface);
110111
#ifdef TEX_PREFETCH_STREAM
111-
nbl_glsl_runTexPrefetchStream(getTexPrefetchStream(precomp), UV, dUV);
112+
nbl_glsl_MC_runTexPrefetchStream(nbl_glsl_MC_oriented_material_t_getTexPrefetchStream(material), UV, dUV);
112113
#endif
113114
#ifdef NORM_PRECOMP_STREAM
114-
nbl_glsl_runNormalPrecompStream(getNormalPrecompStream(precomp), dUV, precomp);
115+
nbl_glsl_MC_runNormalPrecompStream(nbl_glsl_MC_oriented_material_t_getNormalPrecompStream(precomp), dUV, precomp);
115116
#endif
116117
117118
118-
nbl_glsl_IsotropicViewSurfaceInteraction inter;
119-
vec3 color = nbl_computeLighting(inter, dUV, precomp);
119+
nbl_glsl_AnisotropicViewSurfaceInteraction inter;
120+
vec3 color = nbl_computeLighting(inter, dUV);
120121
121122
OutColor = vec4(color, 1.0);
122123
}
@@ -212,8 +213,6 @@ int main()
212213

213214
auto serializedLoader = core::make_smart_refctd_ptr<nbl::ext::MitsubaLoader::CSerializedLoader>(am);
214215
auto mitsubaLoader = core::make_smart_refctd_ptr<nbl::ext::MitsubaLoader::CMitsubaLoader>(am,fs);
215-
serializedLoader->initialize();
216-
mitsubaLoader->initialize();
217216
am->addAssetLoader(std::move(serializedLoader));
218217
am->addAssetLoader(std::move(mitsubaLoader));
219218

@@ -323,6 +322,7 @@ int main()
323322

324323
video::IVideoDriver* driver = device->getVideoDriver();
325324
asset::IAssetManager* am = device->getAssetManager();
325+
io::IFileSystem* fs = device->getFileSystem();
326326

327327
// look out for this!!!
328328
// when added, CMitsubaLoader inserts its own include loader into GLSLCompiler

include/nbl/asset/IAsset.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ class IAsset : virtual public core::IReferenceCounted
177177
return false;
178178

179179
restoreFromDummy_impl(_other, _levelsBelow);
180+
isDummyObjectForCacheAliasing = false;
180181
return true;
181182
}
182183

@@ -203,6 +204,15 @@ class IAsset : virtual public core::IReferenceCounted
203204

204205
virtual bool canBeRestoredFrom(const IAsset* _other) const = 0;
205206

207+
// returns if `this` is dummy or any of its dependencies up to `_levelsBelow` levels below
208+
bool isAnyDependencyDummy(uint32_t _levelsBelow = ~0u) const
209+
{
210+
if (isADummyObjectForCache())
211+
return true;
212+
213+
return _levelsBelow ? isAnyDependencyDummy_impl(_levelsBelow) : false;
214+
}
215+
206216
protected:
207217
inline static void restoreFromDummy_impl_call(IAsset* _this_child, IAsset* _other_child, uint32_t _levelsBelow)
208218
{
@@ -211,6 +221,9 @@ class IAsset : virtual public core::IReferenceCounted
211221

212222
virtual void restoreFromDummy_impl(IAsset* _other, uint32_t _levelsBelow) = 0;
213223

224+
// returns if any of `this`'s up to `_levelsBelow` levels below is dummy
225+
virtual bool isAnyDependencyDummy_impl(uint32_t _levelsBelow) const { return false; }
226+
214227
inline void clone_common(IAsset* _clone) const
215228
{
216229
assert(!isDummyObjectForCacheAliasing);

include/nbl/asset/IAssetManager.h

Lines changed: 132 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -201,30 +201,40 @@ class IAssetManager : public core::IReferenceCounted, public core::QuitSignallin
201201
@see IAssetLoader
202202
@see SAssetBundle
203203
*/
204-
SAssetBundle getAssetInHierarchy(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
204+
template <bool RestoreWholeBundle>
205+
SAssetBundle getAssetInHierarchy_impl(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
205206
{
207+
const uint32_t restoreLevels = (_hierarchyLevel >= _params.restoreLevels) ? 0u : (_params.restoreLevels - _hierarchyLevel);
208+
206209
IAssetLoader::SAssetLoadParams params(_params);
207210
if (params.meshManipulatorOverride == nullptr)
208211
{
209212
params.meshManipulatorOverride = m_meshManipulator.get();
210213
}
214+
if (restoreLevels)
215+
{
216+
using flags_t = std::underlying_type_t<IAssetLoader::E_CACHING_FLAGS>;
217+
flags_t mask = ~static_cast<flags_t>(0);
218+
mask = core::bitfieldInsert<flags_t>(mask, IAssetLoader::ECF_DONT_CACHE_REFERENCES, 2u*_hierarchyLevel, 2u*restoreLevels);
219+
params.cacheFlags = static_cast<IAssetLoader::E_CACHING_FLAGS>(params.cacheFlags & mask);
220+
}
211221

212222
IAssetLoader::SAssetLoadContext ctx{params, _file};
213223

214224
std::string filename = _file ? _file->getFileName().c_str() : _supposedFilename;
215-
io::IReadFile* file = _override->getLoadFile(_file, filename, ctx, _hierarchyLevel);
225+
io::IReadFile* file = _override->getLoadFile(_file, filename, ctx, _hierarchyLevel); // WARNING: mem-leak possibility: _override should return smart_ptr<IReadFile> (TODO, inspect this)
216226
filename = file ? file->getFileName().c_str() : _supposedFilename;
217227

218228
const uint64_t levelFlags = params.cacheFlags >> ((uint64_t)_hierarchyLevel * 2ull);
219229

220-
SAssetBundle asset;
230+
SAssetBundle bundle;
221231
if ((levelFlags & IAssetLoader::ECF_DUPLICATE_TOP_LEVEL) != IAssetLoader::ECF_DUPLICATE_TOP_LEVEL)
222232
{
223233
auto found = findAssets(filename);
224234
if (found->size())
225235
return _override->chooseRelevantFromFound(found->begin(), found->end(), ctx, _hierarchyLevel);
226-
else if (!(asset = _override->handleSearchFail(filename, ctx, _hierarchyLevel)).getContents().empty())
227-
return asset;
236+
else if (!(bundle = _override->handleSearchFail(filename, ctx, _hierarchyLevel)).getContents().empty())
237+
return bundle;
228238
}
229239

230240
// if at this point, and after looking for an asset in cache, file is still nullptr, then return nullptr
@@ -235,41 +245,86 @@ class IAssetManager : public core::IReferenceCounted, public core::QuitSignallin
235245
// loaders associated with the file's extension tryout
236246
for (auto& loader : capableLoadersRng)
237247
{
238-
if (loader.second->isALoadableFileFormat(file) && !(asset = loader.second->loadAsset(file, params, _override, _hierarchyLevel)).getContents().empty())
248+
if (loader.second->isALoadableFileFormat(file) && !(bundle = loader.second->loadAsset(file, params, _override, _hierarchyLevel)).getContents().empty())
239249
break;
240250
}
241-
for (auto loaderItr = std::begin(m_loaders.vector); asset.getContents().empty() && loaderItr != std::end(m_loaders.vector); ++loaderItr) // all loaders tryout
251+
for (auto loaderItr = std::begin(m_loaders.vector); bundle.getContents().empty() && loaderItr != std::end(m_loaders.vector); ++loaderItr) // all loaders tryout
242252
{
243-
if ((*loaderItr)->isALoadableFileFormat(file) && !(asset = (*loaderItr)->loadAsset(file, params, _override, _hierarchyLevel)).getContents().empty())
253+
if ((*loaderItr)->isALoadableFileFormat(file) && !(bundle = (*loaderItr)->loadAsset(file, params, _override, _hierarchyLevel)).getContents().empty())
244254
break;
245255
}
246256

247-
if (!asset.getContents().empty() &&
257+
if (!bundle.getContents().empty() &&
248258
((levelFlags & IAssetLoader::ECF_DONT_CACHE_TOP_LEVEL) != IAssetLoader::ECF_DONT_CACHE_TOP_LEVEL) &&
249259
((levelFlags & IAssetLoader::ECF_DUPLICATE_TOP_LEVEL) != IAssetLoader::ECF_DUPLICATE_TOP_LEVEL))
250260
{
251-
_override->insertAssetIntoCache(asset, filename, ctx, _hierarchyLevel);
261+
_override->insertAssetIntoCache(bundle, filename, ctx, _hierarchyLevel);
252262
}
253-
else if (asset.getContents().empty())
263+
else if (bundle.getContents().empty())
254264
{
255265
bool addToCache;
256-
asset = _override->handleLoadFail(addToCache, file, filename, filename, ctx, _hierarchyLevel);
257-
if (!asset.getContents().empty() && addToCache)
258-
_override->insertAssetIntoCache(asset, filename, ctx, _hierarchyLevel);
266+
bundle = _override->handleLoadFail(addToCache, file, filename, filename, ctx, _hierarchyLevel);
267+
if (!bundle.getContents().empty() && addToCache)
268+
_override->insertAssetIntoCache(bundle, filename, ctx, _hierarchyLevel);
269+
}
270+
271+
auto whole_bundle_not_dummy = [restoreLevels](const SAssetBundle& _b) {
272+
auto rng = _b.getContents();
273+
for (const auto& a : rng)
274+
if (a->isAnyDependencyDummy(restoreLevels))
275+
return false;
276+
return true;
277+
};
278+
if (bundle.getContents().empty() || whole_bundle_not_dummy(bundle))
279+
return bundle;
280+
281+
if (restoreLevels)
282+
{
283+
auto reloadParams = _params;
284+
{
285+
using flags_t = std::underlying_type_t<IAssetLoader::E_CACHING_FLAGS>;
286+
constexpr uint32_t bitdepth = sizeof(flags_t)*8u;
287+
const flags_t zeroOutMask = (~static_cast<flags_t>(0)) >> (bitdepth - 2u*(restoreLevels + _hierarchyLevel));
288+
flags_t reloadFlags = reloadParams.cacheFlags;
289+
reloadFlags &= zeroOutMask; // make sure we never pointlessy reload levels above (_restoreLevels+_hierLevel) in reload pass
290+
// set flags for levels [_hierLevel,_hierLevel+_restoreLevels) to dont look into cache and dont put into cache
291+
reloadFlags = core::bitfieldInsert<flags_t>(reloadFlags, IAssetLoader::ECF_DUPLICATE_REFERENCES, _hierarchyLevel*2u, restoreLevels*2u);
292+
reloadParams.cacheFlags = static_cast<IAssetLoader::E_CACHING_FLAGS>(reloadFlags);
293+
294+
reloadParams.restoreLevels = 0u; // make sure it wont turn into infinite recursion
295+
reloadParams.reload = true; // TODO (consider): alternative to this flag: another method in override just to let user choose asset for restore
296+
}
297+
298+
auto reloadBundle = getAssetInHierarchy_impl<RestoreWholeBundle>(_file, _supposedFilename, reloadParams, _hierarchyLevel, _override);
299+
300+
if constexpr (RestoreWholeBundle)
301+
{
302+
IAssetLoader::SAssetLoadContext ctx(params, file);
303+
auto asset = _override->chooseDefaultAsset(bundle, ctx);
304+
305+
// user responsible for checking if assets he wanted to be restored are in fact restored
306+
_override->handleRestore(std::move(asset), bundle, reloadBundle, restoreLevels);
307+
}
308+
else
309+
{
310+
// user responsible for checking if assets he wanted to be restored are in fact restored
311+
_override->handleRestore(bundle, reloadBundle, restoreLevels);
312+
}
259313
}
260314

261-
return asset;
315+
return bundle;
262316
}
263317
//TODO change name
264-
SAssetBundle getAssetInHierarchy(const std::string& _filePath, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
318+
template <bool RestoreWholeBundle>
319+
SAssetBundle getAssetInHierarchy_impl(const std::string& _filePath, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
265320
{
266321
IAssetLoader::SAssetLoadContext ctx(_params, nullptr);
267322

268323
std::string filePath = _filePath;
269324
_override->getLoadFilename(filePath, ctx, _hierarchyLevel);
270325
io::IReadFile* file = m_fileSystem->createAndOpenFile(filePath.c_str());
271326

272-
SAssetBundle asset = getAssetInHierarchy(file, _filePath, _params, _hierarchyLevel, _override);
327+
SAssetBundle asset = getAssetInHierarchy_impl<RestoreWholeBundle>(file, _filePath, _params, _hierarchyLevel, _override);
273328

274329
if (file)
275330
file->drop();
@@ -278,15 +333,52 @@ class IAssetManager : public core::IReferenceCounted, public core::QuitSignallin
278333
}
279334

280335
//TODO change name
281-
SAssetBundle getAssetInHierarchy(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
336+
template <bool RestoreWholeBundle>
337+
SAssetBundle getAssetInHierarchy_impl(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
282338
{
283-
return getAssetInHierarchy(_file, _supposedFilename, _params, _hierarchyLevel, &m_defaultLoaderOverride);
339+
return getAssetInHierarchy_impl<RestoreWholeBundle>(_file, _supposedFilename, _params, _hierarchyLevel, &m_defaultLoaderOverride);
284340
}
285341

286342
//TODO change name
343+
template <bool RestoreWholeBundle>
344+
SAssetBundle getAssetInHierarchy_impl(const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
345+
{
346+
return getAssetInHierarchy_impl<RestoreWholeBundle>(_filename, _params, _hierarchyLevel, &m_defaultLoaderOverride);
347+
}
348+
349+
350+
SAssetBundle getAssetInHierarchy(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
351+
{
352+
return getAssetInHierarchy_impl<false>(_file, _supposedFilename, _params, _hierarchyLevel, _override);
353+
}
354+
SAssetBundle getAssetInHierarchy(const std::string& _filePath, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
355+
{
356+
return getAssetInHierarchy_impl<false>(_filePath, _params, _hierarchyLevel, _override);
357+
}
358+
SAssetBundle getAssetInHierarchy(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
359+
{
360+
return getAssetInHierarchy_impl<false>(_file, _supposedFilename, _params, _hierarchyLevel);
361+
}
287362
SAssetBundle getAssetInHierarchy(const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
288363
{
289-
return getAssetInHierarchy(_filename, _params, _hierarchyLevel, &m_defaultLoaderOverride);
364+
return getAssetInHierarchy_impl<false>(_filename, _params, _hierarchyLevel);
365+
}
366+
367+
SAssetBundle getAssetInHierarchyWholeBundleRestore(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
368+
{
369+
return getAssetInHierarchy_impl<true>(_file, _supposedFilename, _params, _hierarchyLevel, _override);
370+
}
371+
SAssetBundle getAssetInHierarchyWholeBundleRestore(const std::string& _filePath, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
372+
{
373+
return getAssetInHierarchy_impl<true>(_filePath, _params, _hierarchyLevel, _override);
374+
}
375+
SAssetBundle getAssetInHierarchyWholeBundleRestore(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
376+
{
377+
return getAssetInHierarchy_impl<true>(_file, _supposedFilename, _params, _hierarchyLevel);
378+
}
379+
SAssetBundle getAssetInHierarchyWholeBundleRestore(const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
380+
{
381+
return getAssetInHierarchy_impl<true>(_filename, _params, _hierarchyLevel);
290382
}
291383

292384
public:
@@ -302,19 +394,37 @@ class IAssetManager : public core::IReferenceCounted, public core::QuitSignallin
302394
{
303395
return getAssetInHierarchy(_file, _supposedFilename, _params, 0u, _override);
304396
}
305-
306397
//TODO change name
307398
SAssetBundle getAsset(const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params)
308399
{
309400
return getAsset(_filename, _params, &m_defaultLoaderOverride);
310401
}
311-
312402
//TODO change name
313403
SAssetBundle getAsset(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params)
314404
{
315405
return getAsset(_file, _supposedFilename, _params, &m_defaultLoaderOverride);
316406
}
317407

408+
SAssetBundle getAssetWholeBundleRestore(const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, IAssetLoader::IAssetLoaderOverride* _override)
409+
{
410+
return getAssetInHierarchyWholeBundleRestore(_filename, _params, 0u, _override);
411+
}
412+
//TODO change name
413+
SAssetBundle getAssetWholeBundleRestore(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, IAssetLoader::IAssetLoaderOverride* _override)
414+
{
415+
return getAssetInHierarchyWholeBundleRestore(_file, _supposedFilename, _params, 0u, _override);
416+
}
417+
//TODO change name
418+
SAssetBundle getAssetWholeBundleRestore(const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params)
419+
{
420+
return getAssetWholeBundleRestore(_filename, _params, &m_defaultLoaderOverride);
421+
}
422+
//TODO change name
423+
SAssetBundle getAssetWholeBundleRestore(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params)
424+
{
425+
return getAssetWholeBundleRestore(_file, _supposedFilename, _params, &m_defaultLoaderOverride);
426+
}
427+
318428
//TODO change name
319429
//! Check whether Assets exist in cache using a key and optionally their types
320430
/*

include/nbl/asset/ICPUBufferView.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ class ICPUBufferView : public IBufferView<ICPUBuffer>, public IAsset
9090
}
9191
}
9292

93+
bool isAnyDependencyDummy_impl(uint32_t _levelsBelow) const override
94+
{
95+
return m_buffer->isAnyDependencyDummy(_levelsBelow-1u);
96+
}
97+
9398
virtual ~ICPUBufferView() = default;
9499
};
95100

include/nbl/asset/ICPUComputePipeline.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ class ICPUComputePipeline : public IComputePipeline<ICPUSpecializedShader, ICPUP
9696
}
9797
}
9898

99+
bool isAnyDependencyDummy_impl(uint32_t _levelsBelow) const override
100+
{
101+
--_levelsBelow;
102+
return m_shader->isAnyDependencyDummy(_levelsBelow) || m_layout->isAnyDependencyDummy(_levelsBelow);
103+
}
104+
99105
virtual ~ICPUComputePipeline() = default;
100106
};
101107

include/nbl/asset/ICPUDescriptorSet.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,38 @@ class ICPUDescriptorSet final : public IDescriptorSet<ICPUDescriptorSetLayout>,
238238
}
239239
}
240240

241+
bool isAnyDependencyDummy_impl(uint32_t _levelsBelow) const override
242+
{
243+
--_levelsBelow;
244+
if (m_layout->isAnyDependencyDummy(_levelsBelow))
245+
return true;
246+
for (auto it = m_descriptors->begin(); it != m_descriptors->end(); it++)
247+
{
248+
auto descriptor = it->desc.get();
249+
if (!descriptor)
250+
continue;
251+
252+
switch (descriptor->getTypeCategory())
253+
{
254+
case IDescriptor::EC_BUFFER:
255+
if (static_cast<ICPUBuffer*>(descriptor)->isAnyDependencyDummy(_levelsBelow))
256+
return true;
257+
break;
258+
case IDescriptor::EC_IMAGE:
259+
if (static_cast<ICPUImageView*>(descriptor)->isAnyDependencyDummy(_levelsBelow))
260+
return true;
261+
if (it->image.sampler && it->image.sampler->isAnyDependencyDummy(_levelsBelow))
262+
return true;
263+
break;
264+
case IDescriptor::EC_BUFFER_VIEW:
265+
if (static_cast<ICPUBufferView*>(descriptor)->isAnyDependencyDummy(_levelsBelow))
266+
return true;
267+
break;
268+
}
269+
}
270+
return false;
271+
}
272+
241273
virtual ~ICPUDescriptorSet() = default;
242274
};
243275

0 commit comments

Comments
 (0)