@@ -62,6 +62,7 @@ class NBL_API IImage : public IDescriptor
62
62
public:
63
63
enum E_ASPECT_FLAGS : uint16_t
64
64
{
65
+ EAF_NONE = 0u ,
65
66
EAF_COLOR_BIT = 0x1u << 0u ,
66
67
EAF_DEPTH_BIT = 0x1u << 1u ,
67
68
EAF_STENCIL_BIT = 0x1u << 2u ,
@@ -122,7 +123,7 @@ class NBL_API IImage : public IDescriptor
122
123
};
123
124
enum E_USAGE_FLAGS : uint16_t
124
125
{
125
- EUF_NONE = 0x00000000 ,
126
+ EUF_NONE = 0x00000000 ,
126
127
EUF_TRANSFER_SRC_BIT = 0x00000001 ,
127
128
EUF_TRANSFER_DST_BIT = 0x00000002 ,
128
129
EUF_SAMPLED_BIT = 0x00000004 ,
@@ -136,15 +137,15 @@ class NBL_API IImage : public IDescriptor
136
137
};
137
138
struct SSubresourceRange
138
139
{
139
- E_ASPECT_FLAGS aspectMask = static_cast < E_ASPECT_FLAGS>( 0u ); // waits for vulkan
140
+ E_ASPECT_FLAGS aspectMask = E_ASPECT_FLAGS::EAF_NONE;
140
141
uint32_t baseMipLevel = 0u ;
141
142
uint32_t levelCount = 0u ;
142
143
uint32_t baseArrayLayer = 0u ;
143
144
uint32_t layerCount = 0u ;
144
145
};
145
146
struct SSubresourceLayers
146
147
{
147
- E_ASPECT_FLAGS aspectMask = static_cast < E_ASPECT_FLAGS>( 0u ); // waits for vulkan
148
+ E_ASPECT_FLAGS aspectMask = E_ASPECT_FLAGS::EAF_NONE;
148
149
uint32_t mipLevel = 0u ;
149
150
uint32_t baseArrayLayer = 0u ;
150
151
uint32_t layerCount = 0u ;
@@ -157,7 +158,7 @@ class NBL_API IImage : public IDescriptor
157
158
{
158
159
// TODO: more complex check of compatible aspects
159
160
// Image Extent must be a mutiple of texel block dims OR offset + extent = image subresourceDims
160
- // bufferOffset must be multiple of the compressed texel block size in bytes (matters in IGPU?)
161
+ // bufferOffset must be multiple of the compressed texel block size in bytes (matters in IGPU?)
161
162
// If planar subresource aspectMask should be PLANE_{0,1,2}
162
163
if (false )
163
164
return false ;
@@ -189,7 +190,7 @@ class NBL_API IImage : public IDescriptor
189
190
{
190
191
return info.convert3DTexelStridesTo1DByteStrides (getTexelStrides ());
191
192
}
192
- static inline uint64_t getLocalByteOffset (const core::vector3du32_SIMD& localXYZLayerOffset, const core::vector3du32_SIMD& byteStrides)
193
+ static inline uint64_t getLocalByteOffset (const core::vector3du32_SIMD& localXYZLayerOffset, const core::vector3du32_SIMD& byteStrides)
193
194
{
194
195
return core::dot (localXYZLayerOffset,byteStrides)[0 ];
195
196
}
@@ -198,7 +199,6 @@ class NBL_API IImage : public IDescriptor
198
199
return bufferOffset+getLocalByteOffset (localXYZLayerOffset,byteStrides);
199
200
}
200
201
201
-
202
202
size_t bufferOffset = 0ull ;
203
203
// setting this to different from 0 can fail an image copy on OpenGL
204
204
uint32_t bufferRowLength = 0u ;
@@ -242,7 +242,7 @@ class NBL_API IImage : public IDescriptor
242
242
VkExtent3D extent;
243
243
uint32_t mipLevels;
244
244
uint32_t arrayLayers;
245
- E_CREATE_FLAGS flags = ECF_NONE;
245
+ core::bitflag< E_CREATE_FLAGS> flags = ECF_NONE;
246
246
core::bitflag<E_USAGE_FLAGS> usage = EUF_NONE;
247
247
248
248
inline bool operator ==(const SCreationParams& rhs) const
@@ -257,7 +257,7 @@ class NBL_API IImage : public IDescriptor
257
257
extent!=rhs.extent ||
258
258
mipLevels!=rhs.mipLevels ||
259
259
arrayLayers!=rhs.arrayLayers ||
260
- flags!=rhs.flags ||
260
+ flags. value !=rhs.flags . value ||
261
261
usage.value !=rhs.usage .value ;
262
262
}
263
263
};
@@ -283,7 +283,12 @@ class NBL_API IImage : public IDescriptor
283
283
default :
284
284
break ;
285
285
}
286
- return 1u + uint32_t (floorf (log2 (float (maxSideLen))));
286
+ const uint32_t round = core::roundUpToPoT<uint32_t >(maxSideLen);
287
+ return core::findLSB (round);
288
+ }
289
+ inline static uint32_t calculateFullMipPyramidLevelCount (const VkExtent3D& extent, E_TYPE type)
290
+ {
291
+ return calculateMaxMipLevel (extent,type)+1u ;
287
292
}
288
293
289
294
// !
@@ -319,7 +324,7 @@ class NBL_API IImage : public IDescriptor
319
324
if (core::bitCount (static_cast <uint32_t >(_params.samples ))!=1u )
320
325
return false ;
321
326
322
- if (_params.flags & ECF_CUBE_COMPATIBLE_BIT)
327
+ if (_params.flags . hasFlags ( ECF_CUBE_COMPATIBLE_BIT) )
323
328
{
324
329
if (_params.type != ET_2D)
325
330
return false ;
@@ -330,28 +335,28 @@ class NBL_API IImage : public IDescriptor
330
335
if (_params.samples != ESCF_1_BIT)
331
336
return false ;
332
337
}
333
- if (( _params.flags & ECF_2D_ARRAY_COMPATIBLE_BIT) && _params.type != ET_3D)
338
+ if (_params.flags . hasFlags ( ECF_2D_ARRAY_COMPATIBLE_BIT) && _params.type != ET_3D)
334
339
return false ;
335
- if (( _params.flags & ECF_SPARSE_RESIDENCY_BIT) || ( _params.flags & ECF_SPARSE_ALIASED_BIT))
340
+ if (_params.flags . hasFlags ( ECF_SPARSE_RESIDENCY_BIT) || _params.flags . hasFlags ( ECF_SPARSE_ALIASED_BIT))
336
341
{
337
- if (!( _params.flags & ECF_SPARSE_BINDING_BIT))
342
+ if (!_params.flags . hasFlags ( ECF_SPARSE_BINDING_BIT))
338
343
return false ;
339
- if (_params.flags & ECF_PROTECTED_BIT)
344
+ if (_params.flags . hasFlags ( ECF_PROTECTED_BIT) )
340
345
return false ;
341
346
}
342
- if (( _params.flags & ECF_SPARSE_BINDING_BIT) && ( _params.flags & ECF_PROTECTED_BIT))
347
+ if (_params.flags . hasFlags ( ECF_SPARSE_BINDING_BIT) && _params.flags . hasFlags ( ECF_PROTECTED_BIT))
343
348
return false ;
344
- if (_params.flags & ECF_SPLIT_INSTANCE_BIND_REGIONS_BIT)
349
+ if (_params.flags . hasFlags ( ECF_SPLIT_INSTANCE_BIND_REGIONS_BIT) )
345
350
{
346
351
if (_params.mipLevels > 1u || _params.arrayLayers > 1u || _params.type != ET_2D)
347
352
return false ;
348
353
}
349
- if (_params.flags & ECF_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT)
354
+ if (_params.flags . hasFlags ( ECF_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT) )
350
355
{
351
- if (!isBlockCompressionFormat (_params.format ) || !( _params.flags & ECF_MUTABLE_FORMAT_BIT))
356
+ if (!isBlockCompressionFormat (_params.format ) || !_params.flags . hasFlags ( ECF_MUTABLE_FORMAT_BIT))
352
357
return false ;
353
358
}
354
- if (( _params.flags & ECF_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT) && (!isDepthOrStencilFormat (_params.format ) || _params.format == EF_S8_UINT))
359
+ if (_params.flags . hasFlags ( ECF_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT) && (!isDepthOrStencilFormat (_params.format ) || _params.format == EF_S8_UINT))
355
360
return false ;
356
361
357
362
if (_params.samples != ESCF_1_BIT && _params.type != ET_2D)
@@ -380,11 +385,11 @@ class NBL_API IImage : public IDescriptor
380
385
}
381
386
else
382
387
{
383
- if (!( _params.flags & ECF_ALIAS_BIT) && ( _params.flags & ECF_DISJOINT_BIT))
388
+ if (!_params.flags . hasFlags ( ECF_ALIAS_BIT) && _params.flags . hasFlags ( ECF_DISJOINT_BIT))
384
389
return false ;
385
390
}
386
391
387
- if (_params.mipLevels > calculateMaxMipLevel (_params.extent , _params.type ))
392
+ if (_params.mipLevels > calculateFullMipPyramidLevelCount (_params.extent , _params.type ))
388
393
return false ;
389
394
390
395
return true ;
@@ -538,7 +543,7 @@ class NBL_API IImage : public IDescriptor
538
543
EL_SHADING_RATE_OPTIMAL_NV = 1000164003 ,
539
544
EL_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT = 1000218000
540
545
};
541
- protected:
546
+ protected:
542
547
IImage (const SCreationParams& _params) : m_creationParams(_params), info(_params.format) {}
543
548
544
549
virtual ~IImage () {}
@@ -582,6 +587,9 @@ class NBL_API IImage : public IDescriptor
582
587
const auto & subresource = it->getDstSubresource ();
583
588
// if (!formatHasAspects(m_creationParams.format,subresource.aspectMask))
584
589
// return false;
590
+ // The aspectMask member of imageSubresource must only have a single bit set
591
+ if (!core::bitCount (static_cast <uint32_t >(subresource.aspectMask )) == 1u )
592
+ return false ;
585
593
if (subresource.mipLevel >= m_creationParams.mipLevels )
586
594
return false ;
587
595
if (subresource.baseArrayLayer +subresource.layerCount > m_creationParams.arrayLayers )
0 commit comments