Skip to content

Commit f055c35

Browse files
Merge pull request #64 from Crisspl/spirv-optimizer
Asset restore, fixed ex18, CDerivativeMapCreator
2 parents 32fb5f3 + d5ac56a commit f055c35

35 files changed

+678
-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: 105 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,11 @@ 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
{
@@ -212,19 +215,19 @@ class IAssetManager : public core::IReferenceCounted, public core::QuitSignallin
212215
IAssetLoader::SAssetLoadContext ctx{params, _file};
213216

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

218221
const uint64_t levelFlags = params.cacheFlags >> ((uint64_t)_hierarchyLevel * 2ull);
219222

220-
SAssetBundle asset;
223+
SAssetBundle bundle;
221224
if ((levelFlags & IAssetLoader::ECF_DUPLICATE_TOP_LEVEL) != IAssetLoader::ECF_DUPLICATE_TOP_LEVEL)
222225
{
223226
auto found = findAssets(filename);
224227
if (found->size())
225228
return _override->chooseRelevantFromFound(found->begin(), found->end(), ctx, _hierarchyLevel);
226-
else if (!(asset = _override->handleSearchFail(filename, ctx, _hierarchyLevel)).getContents().empty())
227-
return asset;
229+
else if (!(bundle = _override->handleSearchFail(filename, ctx, _hierarchyLevel)).getContents().empty())
230+
return bundle;
228231
}
229232

230233
// if at this point, and after looking for an asset in cache, file is still nullptr, then return nullptr
@@ -235,41 +238,86 @@ class IAssetManager : public core::IReferenceCounted, public core::QuitSignallin
235238
// loaders associated with the file's extension tryout
236239
for (auto& loader : capableLoadersRng)
237240
{
238-
if (loader.second->isALoadableFileFormat(file) && !(asset = loader.second->loadAsset(file, params, _override, _hierarchyLevel)).getContents().empty())
241+
if (loader.second->isALoadableFileFormat(file) && !(bundle = loader.second->loadAsset(file, params, _override, _hierarchyLevel)).getContents().empty())
239242
break;
240243
}
241-
for (auto loaderItr = std::begin(m_loaders.vector); asset.getContents().empty() && loaderItr != std::end(m_loaders.vector); ++loaderItr) // all loaders tryout
244+
for (auto loaderItr = std::begin(m_loaders.vector); bundle.getContents().empty() && loaderItr != std::end(m_loaders.vector); ++loaderItr) // all loaders tryout
242245
{
243-
if ((*loaderItr)->isALoadableFileFormat(file) && !(asset = (*loaderItr)->loadAsset(file, params, _override, _hierarchyLevel)).getContents().empty())
246+
if ((*loaderItr)->isALoadableFileFormat(file) && !(bundle = (*loaderItr)->loadAsset(file, params, _override, _hierarchyLevel)).getContents().empty())
244247
break;
245248
}
246249

247-
if (!asset.getContents().empty() &&
250+
if (!bundle.getContents().empty() &&
248251
((levelFlags & IAssetLoader::ECF_DONT_CACHE_TOP_LEVEL) != IAssetLoader::ECF_DONT_CACHE_TOP_LEVEL) &&
249252
((levelFlags & IAssetLoader::ECF_DUPLICATE_TOP_LEVEL) != IAssetLoader::ECF_DUPLICATE_TOP_LEVEL))
250253
{
251-
_override->insertAssetIntoCache(asset, filename, ctx, _hierarchyLevel);
254+
_override->insertAssetIntoCache(bundle, filename, ctx, _hierarchyLevel);
252255
}
253-
else if (asset.getContents().empty())
256+
else if (bundle.getContents().empty())
254257
{
255258
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);
259+
bundle = _override->handleLoadFail(addToCache, file, filename, filename, ctx, _hierarchyLevel);
260+
if (!bundle.getContents().empty() && addToCache)
261+
_override->insertAssetIntoCache(bundle, filename, ctx, _hierarchyLevel);
262+
}
263+
264+
auto whole_bundle_not_dummy = [restoreLevels](const SAssetBundle& _b) {
265+
auto rng = _b.getContents();
266+
for (const auto& a : rng)
267+
if (a->isAnyDependencyDummy(restoreLevels))
268+
return false;
269+
return true;
270+
};
271+
if (bundle.getContents().empty() || whole_bundle_not_dummy(bundle))
272+
return bundle;
273+
274+
if (restoreLevels)
275+
{
276+
auto reloadParams = IAssetLoader::SAssetLoadParams(_params, true);
277+
{
278+
using flags_t = std::underlying_type_t<IAssetLoader::E_CACHING_FLAGS>;
279+
constexpr uint32_t bitdepth = sizeof(flags_t)*8u;
280+
const flags_t zeroOutMask = (~static_cast<flags_t>(0)) >> (bitdepth - 2u*(restoreLevels + _hierarchyLevel));
281+
flags_t reloadFlags = reloadParams.cacheFlags;
282+
reloadFlags &= zeroOutMask; // make sure we never pointlessy reload levels above (_restoreLevels+_hierLevel) in reload pass
283+
// set flags for levels [_hierLevel,_hierLevel+_restoreLevels) to dont look into cache and dont put into cache
284+
reloadFlags = core::bitfieldInsert<flags_t>(reloadFlags, IAssetLoader::ECF_DUPLICATE_REFERENCES, _hierarchyLevel*2u, restoreLevels*2u);
285+
reloadParams.cacheFlags = static_cast<IAssetLoader::E_CACHING_FLAGS>(reloadFlags);
286+
reloadParams.restoreLevels = 0u; // make sure it wont turn into infinite recursion
287+
}
288+
289+
auto reloadBundle = getAssetInHierarchy_impl<RestoreWholeBundle>(_file, _supposedFilename, reloadParams, _hierarchyLevel, _override);
290+
291+
if constexpr (!RestoreWholeBundle)
292+
{
293+
IAssetLoader::SAssetLoadContext ctx(params, file);
294+
auto asset = _override->chooseDefaultAsset(bundle, ctx);
295+
296+
auto newChosenAsset = _override->handleRestore(std::move(asset), bundle, reloadBundle, restoreLevels);
297+
if (!newChosenAsset || newChosenAsset->isAnyDependencyDummy(restoreLevels))
298+
return {};
299+
}
300+
else
301+
{
302+
_override->handleRestore(bundle, reloadBundle, restoreLevels);
303+
if (!whole_bundle_not_dummy(bundle))
304+
return {};
305+
}
259306
}
260307

261-
return asset;
308+
return bundle;
262309
}
263310
//TODO change name
264-
SAssetBundle getAssetInHierarchy(const std::string& _filePath, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
311+
template <bool RestoreWholeBundle>
312+
SAssetBundle getAssetInHierarchy_impl(const std::string& _filePath, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
265313
{
266314
IAssetLoader::SAssetLoadContext ctx(_params, nullptr);
267315

268316
std::string filePath = _filePath;
269317
_override->getLoadFilename(filePath, ctx, _hierarchyLevel);
270318
io::IReadFile* file = m_fileSystem->createAndOpenFile(filePath.c_str());
271319

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

274322
if (file)
275323
file->drop();
@@ -278,15 +326,52 @@ class IAssetManager : public core::IReferenceCounted, public core::QuitSignallin
278326
}
279327

280328
//TODO change name
281-
SAssetBundle getAssetInHierarchy(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
329+
template <bool RestoreWholeBundle>
330+
SAssetBundle getAssetInHierarchy_impl(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
282331
{
283-
return getAssetInHierarchy(_file, _supposedFilename, _params, _hierarchyLevel, &m_defaultLoaderOverride);
332+
return getAssetInHierarchy_impl<RestoreWholeBundle>(_file, _supposedFilename, _params, _hierarchyLevel, &m_defaultLoaderOverride);
284333
}
285334

286335
//TODO change name
336+
template <bool RestoreWholeBundle>
337+
SAssetBundle getAssetInHierarchy_impl(const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
338+
{
339+
return getAssetInHierarchy_impl<RestoreWholeBundle>(_filename, _params, _hierarchyLevel, &m_defaultLoaderOverride);
340+
}
341+
342+
343+
SAssetBundle getAssetInHierarchy(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
344+
{
345+
return getAssetInHierarchy_impl<false>(_file, _supposedFilename, _params, _hierarchyLevel, _override);
346+
}
347+
SAssetBundle getAssetInHierarchy(const std::string& _filePath, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
348+
{
349+
return getAssetInHierarchy_impl<false>(_filePath, _params, _hierarchyLevel, _override);
350+
}
351+
SAssetBundle getAssetInHierarchy(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
352+
{
353+
return getAssetInHierarchy_impl<false>(_file, _supposedFilename, _params, _hierarchyLevel);
354+
}
287355
SAssetBundle getAssetInHierarchy(const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
288356
{
289-
return getAssetInHierarchy(_filename, _params, _hierarchyLevel, &m_defaultLoaderOverride);
357+
return getAssetInHierarchy_impl<false>(_filename, _params, _hierarchyLevel);
358+
}
359+
360+
SAssetBundle getAssetInHierarchyWholeBundleRestore(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
361+
{
362+
return getAssetInHierarchy_impl<true>(_file, _supposedFilename, _params, _hierarchyLevel, _override);
363+
}
364+
SAssetBundle getAssetInHierarchyWholeBundleRestore(const std::string& _filePath, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
365+
{
366+
return getAssetInHierarchy_impl<true>(_filePath, _params, _hierarchyLevel, _override);
367+
}
368+
SAssetBundle getAssetInHierarchyWholeBundleRestore(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
369+
{
370+
return getAssetInHierarchy_impl<true>(_file, _supposedFilename, _params, _hierarchyLevel);
371+
}
372+
SAssetBundle getAssetInHierarchyWholeBundleRestore(const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
373+
{
374+
return getAssetInHierarchy_impl<true>(_filename, _params, _hierarchyLevel);
290375
}
291376

292377
public:
@@ -302,13 +387,11 @@ class IAssetManager : public core::IReferenceCounted, public core::QuitSignallin
302387
{
303388
return getAssetInHierarchy(_file, _supposedFilename, _params, 0u, _override);
304389
}
305-
306390
//TODO change name
307391
SAssetBundle getAsset(const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params)
308392
{
309393
return getAsset(_filename, _params, &m_defaultLoaderOverride);
310394
}
311-
312395
//TODO change name
313396
SAssetBundle getAsset(io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params)
314397
{

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

include/nbl/asset/ICPUDescriptorSetLayout.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,16 @@ class ICPUDescriptorSetLayout : public IDescriptorSetLayout<ICPUSampler>, public
106106
restoreFromDummy_impl_call((*m_samplers)[i].get(), (*other->m_samplers)[i].get(), _levelsBelow);
107107
}
108108

109+
bool isAnyDependencyDummy_impl(uint32_t _levelsBelow) const override
110+
{
111+
--_levelsBelow;
112+
if (m_samplers)
113+
for (uint32_t i = 0u; i < m_samplers->size(); ++i)
114+
if ((*m_samplers)[i]->isAnyDependencyDummy(_levelsBelow))
115+
return true;
116+
return false;
117+
}
118+
109119
virtual ~ICPUDescriptorSetLayout() = default;
110120
};
111121

include/nbl/asset/ICPUImage.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,12 @@ class ICPUImage final : public IImage, public IAsset
199199
restoreFromDummy_impl_call(buffer.get(), other->buffer.get(), _levelsBelow - 1u);
200200
}
201201

202+
bool isAnyDependencyDummy_impl(uint32_t _levelsBelow) const override
203+
{
204+
--_levelsBelow;
205+
return buffer->isAnyDependencyDummy(_levelsBelow);
206+
}
207+
202208
ICPUImage(SCreationParams&& _params) : IImage(std::move(_params))
203209
{
204210
}

include/nbl/asset/ICPUImageView.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,12 @@ class ICPUImageView final : public IImageView<ICPUImage>, public IAsset
9797
}
9898
}
9999

100+
bool isAnyDependencyDummy_impl(uint32_t _levelsBelow) const override
101+
{
102+
--_levelsBelow;
103+
return params.image->isAnyDependencyDummy(_levelsBelow);
104+
}
105+
100106
virtual ~ICPUImageView() = default;
101107
};
102108

0 commit comments

Comments
 (0)