Skip to content

Commit f4bf625

Browse files
Merge pull request #711 from Devsh-Graphics-Programming/FlattenRegionsStreamHashImageFilter
Flatten regions stream hash image filter
2 parents 0b55e03 + d07fddf commit f4bf625

24 files changed

+458
-117
lines changed

__init__.py

Whitespace-only changes.

examples_tests

Submodule examples_tests updated 81 files

include/nbl/asset/ICPUImage.h

Lines changed: 5 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
namespace nbl::asset
1515
{
1616

17-
class ICPUImage final : public IImage, public IPreHashed
17+
class NBL_API2 ICPUImage final : public IImage, public IPreHashed
1818
{
1919
public:
2020
inline static core::smart_refctd_ptr<ICPUImage> create(const SCreationParams& _params)
@@ -44,38 +44,7 @@ class ICPUImage final : public IImage, public IPreHashed
4444
// Having regions specififed to upload is optional!
4545
inline size_t getDependantCount() const override {return !missingContent()&&buffer ? 1:0;}
4646

47-
//!
48-
inline core::blake3_hash_t computeContentHash() const override
49-
{
50-
// TODO: Arek turn this into an image filter maybe?
51-
core::blake3_hasher hasher;
52-
for (auto m=0; m<m_creationParams.mipLevels; m++)
53-
{
54-
const auto blockInfo = getTexelBlockInfo();
55-
const auto mipExtentInBlocks = blockInfo.convertTexelsToBlocks(getMipSize(m));
56-
core::blake3_hasher levelHasher;
57-
if (missingContent())
58-
{
59-
const auto zeroLength = blockInfo.getBlockByteSize()*mipExtentInBlocks[0];
60-
auto zeroArray = std::make_unique<uint8_t[]>(zeroLength);
61-
for (auto l=0; l<m_creationParams.arrayLayers; l++)
62-
{
63-
// layers could be run in parallel
64-
core::blake3_hasher layerHasher;
65-
for (auto z=0; z<mipExtentInBlocks[2]; z++)
66-
for (auto y=0; y<mipExtentInBlocks[1]; y++)
67-
layerHasher.update(zeroArray.get(),zeroLength);
68-
levelHasher << static_cast<core::blake3_hash_t>(layerHasher);
69-
}
70-
}
71-
else
72-
{
73-
_NBL_TODO(); // TODO: Arek
74-
}
75-
levelHasher << static_cast<core::blake3_hash_t>(levelHasher);
76-
}
77-
return static_cast<core::blake3_hash_t>(hasher);
78-
}
47+
core::blake3_hash_t computeContentHash() const override;
7948

8049
inline bool missingContent() const override
8150
{
@@ -95,14 +64,14 @@ class ICPUImage final : public IImage, public IPreHashed
9564
}
9665
inline const auto* getBuffer() const { return buffer.get(); }
9766

98-
inline core::SRange<const IImage::SBufferCopy> getRegions() const
67+
inline std::span<const IImage::SBufferCopy> getRegions() const
9968
{
10069
if (regions)
10170
return {regions->begin(),regions->end()};
102-
return {nullptr,nullptr};
71+
return {};
10372
}
10473

105-
inline core::SRange<const IImage::SBufferCopy> getRegions(uint32_t mipLevel) const
74+
inline std::span<const IImage::SBufferCopy> getRegions(uint32_t mipLevel) const
10675
{
10776
const IImage::SBufferCopy dummy = { 0ull,0u,0u,{static_cast<E_ASPECT_FLAGS>(0u),mipLevel,0u,0u},{},{} };
10877
auto begin = std::lower_bound(regions->begin(),regions->end(),dummy,mip_order_t());

include/nbl/asset/IDescriptorSetLayout.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,6 @@ class IDescriptorSetLayout : public IDescriptorSetLayoutBase
467467
if ((b.type == IDescriptor::E_TYPE::ET_SAMPLER or b.type == IDescriptor::E_TYPE::ET_COMBINED_IMAGE_SAMPLER) and b.immutableSamplers)
468468
{
469469
const auto localOffset = m_immutableSamplerRedirect.getStorageOffset(typename CBindingRedirect::binding_number_t(b.binding)).data;
470-
assert(bool(localOffset));
471470

472471
auto* dst = m_immutableSamplers->begin() + localOffset;
473472
std::copy_n(b.immutableSamplers, b.count, dst);

include/nbl/asset/filters/CBasicImageFilterCommon.h

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -303,32 +303,28 @@ class CBasicImageFilterCommon
303303
template<class ExecutionPolicy, typename F, typename G>
304304
static inline void executePerRegion(ExecutionPolicy&& policy,
305305
const ICPUImage* image, F& f,
306-
const IImage::SBufferCopy* _begin,
307-
const IImage::SBufferCopy* _end,
306+
std::span<const IImage::SBufferCopy> regions,
308307
G& g)
309308
{
310-
for (auto it=_begin; it!=_end; it++)
309+
for(auto region : regions)
311310
{
312-
IImage::SBufferCopy region = *it;
313-
if (g(region,it))
311+
if (g(region,&region))
314312
executePerBlock<ExecutionPolicy,F>(std::forward<ExecutionPolicy>(policy),image,region,f);
315313
}
316314
}
317315
template<typename F, typename G>
318316
static inline void executePerRegion(const ICPUImage* image, F& f,
319-
const IImage::SBufferCopy* _begin,
320-
const IImage::SBufferCopy* _end,
317+
std::span<const IImage::SBufferCopy> regions,
321318
G& g)
322319
{
323-
return executePerRegion<const core::execution::sequenced_policy&,F,G>(core::execution::seq,image,f,_begin,_end,g);
320+
return executePerRegion<const core::execution::sequenced_policy&,F,G>(core::execution::seq,image,f,regions,g);
324321
}
325322
template<typename F>
326323
static inline void executePerRegion(const ICPUImage* image, F& f,
327-
const IImage::SBufferCopy* _begin,
328-
const IImage::SBufferCopy* _end)
324+
std::span<const IImage::SBufferCopy> regions)
329325
{
330326
default_region_functor_t voidFunctor;
331-
return executePerRegion<F,default_region_functor_t>(image,f,_begin,_end,voidFunctor);
327+
return executePerRegion<F,default_region_functor_t>(image,f,regions,voidFunctor);
332328
}
333329

334330
protected:

include/nbl/asset/filters/CBlitImageFilter.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ class CBlitImageFilter :
379379

380380
base_t::onEncode(outFormat, state, dstPix, sample, localOutPos, 0, 0, ChannelCount);
381381
};
382-
const core::SRange<const IImage::SBufferCopy> outRegions = outImg->getRegions(outMipLevel);
382+
const std::span<const IImage::SBufferCopy> outRegions = outImg->getRegions(outMipLevel);
383383
auto storeToImage = [policy,coverageSemantic,needsNormalization,outExtent,intermediateStorage,&sampler,outFormat,alphaRefValue,outData,intermediateStrides,alphaChannel,storeToTexel,outMipLevel,outOffset,outRegions,outImg,state](
384384
const core::rational<int64_t>& coverage, const int axis, const core::vectorSIMDu32& outOffsetLayer
385385
) -> void
@@ -445,7 +445,7 @@ class CBlitImageFilter :
445445
const ICPUImage::SSubresourceLayers subresource = {static_cast<IImage::E_ASPECT_FLAGS>(0u),outMipLevel,outOffsetLayer.w,1};
446446
const IImageFilter::IState::TexelRange range = {outOffset,outExtent};
447447
CBasicImageFilterCommon::clip_region_functor_t clip(subresource, range, outFormat);
448-
CBasicImageFilterCommon::executePerRegion(policy,outImg,scaleCoverage,outRegions.begin(),outRegions.end(),clip);
448+
CBasicImageFilterCommon::executePerRegion(policy,outImg,scaleCoverage,outRegions, clip);
449449
};
450450

451451
// process

include/nbl/asset/filters/CCopyImageFilter.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class CCopyImageFilter : public CImageFilter<CCopyImageFilter>, public CMatchedS
6868
const auto writeOffset = commonExecuteData.oit->getByteOffset(localOutPos,commonExecuteData.outByteStrides);
6969
memcpy(commonExecuteData.outData+writeOffset,commonExecuteData.inData+readBlockArrayOffset,commonExecuteData.outBlockByteSize);
7070
};
71-
CBasicImageFilterCommon::executePerRegion<ExecutionPolicy>(policy,commonExecuteData.inImg,copy,commonExecuteData.inRegions.begin(),commonExecuteData.inRegions.end(),clip);
71+
CBasicImageFilterCommon::executePerRegion<ExecutionPolicy>(policy,commonExecuteData.inImg,copy,commonExecuteData.inRegions,clip);
7272

7373
return true;
7474
};

include/nbl/asset/filters/CFillImageFilter.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ class CFillImageFilter : public CImageFilter<CFillImageFilter>
5151
state->fillValue.writeMemory(info,blockArrayOffset);
5252
};
5353
CBasicImageFilterCommon::clip_region_functor_t clip(state->subresource,state->outRange,params.format);
54-
const auto& regions = img->getRegions(state->subresource.mipLevel);
55-
CBasicImageFilterCommon::executePerRegion(std::forward<ExecutionPolicy>(policy),img,fill,regions.begin(),regions.end(),clip);
54+
auto regions = img->getRegions(state->subresource.mipLevel);
55+
CBasicImageFilterCommon::executePerRegion(std::forward<ExecutionPolicy>(policy),img,fill,regions,clip);
5656

5757
return true;
5858
}

include/nbl/asset/filters/CMatchedSizeInOutImageFilterCommon.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,8 @@ class CMatchedSizeInOutImageFilterCommon : public CBasicImageFilterCommon
165165
const uint32_t outBlockByteSize;
166166
const uint8_t* const inData;
167167
uint8_t* const outData;
168-
const core::SRange<const IImage::SBufferCopy> inRegions;
169-
const core::SRange<const IImage::SBufferCopy> outRegions;
168+
const std::span<const IImage::SBufferCopy> inRegions;
169+
const std::span<const IImage::SBufferCopy> outRegions;
170170
const IImage::SBufferCopy* oit; //!< oit is a current output handled region by commonExecute lambda. Notice that the lambda may execute executePerRegion a few times with different oits data since regions may overlap in a certain mipmap in an image!
171171
core::vectorSIMDu32 offsetDifferenceInBlocks;
172172
core::vectorSIMDu32 offsetDifferenceInTexels;
@@ -182,7 +182,8 @@ class CMatchedSizeInOutImageFilterCommon : public CBasicImageFilterCommon
182182
auto* const outImg = state->outImage;
183183
const ICPUImage::SCreationParams& inParams = inImg->getCreationParameters();
184184
const ICPUImage::SCreationParams& outParams = outImg->getCreationParameters();
185-
const core::SRange<const IImage::SBufferCopy> outRegions = outImg->getRegions(state->outMipLevel);
185+
const std::span<const IImage::SBufferCopy> outRegions = outImg->getRegions(state->outMipLevel);
186+
const std::span<const IImage::SBufferCopy> inRegions = inImg->getRegions(state->inMipLevel);
186187
CommonExecuteData commonExecuteData =
187188
{
188189
inImg,
@@ -195,16 +196,17 @@ class CMatchedSizeInOutImageFilterCommon : public CBasicImageFilterCommon
195196
getTexelOrBlockBytesize(outParams.format),
196197
reinterpret_cast<const uint8_t*>(inImg->getBuffer()->getPointer()),
197198
reinterpret_cast<uint8_t*>(outImg->getBuffer()->getPointer()),
198-
inImg->getRegions(state->inMipLevel),
199+
inRegions,
199200
outRegions,
200-
outRegions.begin(), {}, {}
201+
outRegions.data(), {}, {}
201202
};
202203

203204
const asset::TexelBlockInfo srcImageTexelBlockInfo(commonExecuteData.inFormat);
204205
const asset::TexelBlockInfo dstImageTexelBlockInfo(commonExecuteData.outFormat);
205206

206207
// iterate over output regions, then input cause read cache miss is faster
207-
for (; commonExecuteData.oit!=commonExecuteData.outRegions.end(); commonExecuteData.oit++)
208+
const auto endit = commonExecuteData.outRegions.data() + commonExecuteData.outRegions.size();
209+
for (; commonExecuteData.oit != endit; commonExecuteData.oit++)
208210
{
209211
IImage::SSubresourceLayers subresource = {static_cast<IImage::E_ASPECT_FLAGS>(0u),state->inMipLevel,state->inBaseLayer,state->layerCount};
210212
state_type::TexelRange range = {state->inOffset,state->extent};

include/nbl/asset/filters/CRegionBlockFunctorFilter.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ class CRegionBlockFunctorFilter : public CImageFilter<CRegionBlockFunctorFilter<
4444

4545
if (!state->regionIterator)
4646
return false;
47-
const auto& regions = state->image->getRegions();
48-
if (state->regionIterator<regions.begin() || state->regionIterator>=regions.end())
47+
auto regions = state->image->getRegions();
48+
if (state->regionIterator < regions.data() || state->regionIterator >= regions.data()+regions.size())
4949
return false;
5050

5151
return true;

0 commit comments

Comments
 (0)