@ -169,23 +169,6 @@ template <u32 GOB_EXTENT>
return Common : : DivCeil ( AdjustMipSize ( size , level ) , block_size ) ;
}
[[nodiscard]] constexpr std : : pair < int , int > Samples ( int num_samples ) {
switch ( num_samples ) {
case 1 :
return { 1 , 1 } ;
case 2 :
return { 2 , 1 } ;
case 4 :
return { 2 , 2 } ;
case 8 :
return { 4 , 2 } ;
case 16 :
return { 4 , 4 } ;
}
UNREACHABLE_MSG ( " Invalid number of samples={} " , num_samples ) ;
return { 1 , 1 } ;
}
[[nodiscard]] constexpr Extent2D DefaultBlockSize ( PixelFormat format ) {
return { DefaultBlockWidth ( format ) , DefaultBlockHeight ( format ) } ;
}
@ -283,14 +266,13 @@ template <u32 GOB_EXTENT>
}
[[nodiscard]] constexpr LevelInfo MakeLevelInfo ( PixelFormat format , Extent3D size , Extent3D block ,
u32 num_samples , u32 tile_width_spacing ) {
const auto [ samples_x , samples_y ] = Samples ( num_samples ) ;
u32 tile_width_spacing ) {
const u32 bytes_per_block = BytesPerBlock ( format ) ;
return {
. size =
{
. width = size . width * samples_x ,
. height = size . height * samples_y ,
. width = size . width ,
. height = size . height ,
. depth = size . depth ,
} ,
. block = block ,
@ -301,14 +283,12 @@ template <u32 GOB_EXTENT>
}
[[nodiscard]] constexpr LevelInfo MakeLevelInfo ( const ImageInfo & info ) {
return MakeLevelInfo ( info . format , info . size , info . block , info . num_samples ,
info . tile_width_spacing ) ;
return MakeLevelInfo ( info . format , info . size , info . block , info . tile_width_spacing ) ;
}
[[nodiscard]] constexpr u32 CalculateLevelOffset ( PixelFormat format , Extent3D size , Extent3D block ,
u32 num_samples , u32 tile_width_spacing ,
u32 level ) {
const LevelInfo info = MakeLevelInfo ( format , size , block , num_samples , tile_width_spacing ) ;
u32 tile_width_spacing , u32 level ) {
const LevelInfo info = MakeLevelInfo ( format , size , block , tile_width_spacing ) ;
u32 offset = 0 ;
for ( u32 current_level = 0 ; current_level < level ; + + current_level ) {
offset + = CalculateLevelSize ( info , current_level ) ;
@ -645,8 +625,8 @@ u32 CalculateLayerStride(const ImageInfo& info) noexcept {
u32 CalculateLayerSize ( const ImageInfo & info ) noexcept {
ASSERT ( info . type ! = ImageType : : Linear ) ;
return CalculateLevelOffset ( info . format , info . size , info . block , info . num_samples ,
info . tile_width_spacing , info . resources . levels ) ;
return CalculateLevelOffset ( info . format , info . size , info . block , info . tile_width_spacing ,
info . resources . levels ) ;
}
LevelArray CalculateMipLevelOffsets ( const ImageInfo & info ) noexcept {
@ -1195,37 +1175,37 @@ static_assert(CalculateLevelSize(LevelInfo{{1920, 1080, 1}, {0, 2, 0}, {1, 1}, 2
0x7f8000 ) ;
static_assert ( CalculateLevelSize ( LevelInfo { { 32 , 32 , 1 } , { 0 , 0 , 4 } , { 1 , 1 } , 4 , 0 } , 0 ) = = 0x4000 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : R8_SINT , { 1920 , 1080 , 1 } , { 0 , 2 , 0 } , 1 , 0 , 7 ) = =
static_assert ( CalculateLevelOffset ( PixelFormat : : R8_SINT , { 1920 , 1080 , 1 } , { 0 , 2 , 0 } , 0 , 7 ) = =
0x2afc00 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : ASTC_2D_12X12_UNORM , { 8192 , 4096 , 1 } , { 0 , 2 , 0 } , 1 ,
0 , 12 ) = = 0x50d200 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 1 , 0 ,
0 ) = = 0 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 1 , 0 ,
1 ) = = 0x400000 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 1 , 0 ,
2 ) = = 0x500000 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 1 , 0 ,
3 ) = = 0x540000 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 1 , 0 ,
4 ) = = 0x550000 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 1 , 0 ,
5 ) = = 0x554000 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 1 , 0 ,
6 ) = = 0x555000 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 1 , 0 ,
7 ) = = 0x555400 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 1 , 0 ,
8 ) = = 0x555600 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 1 , 0 ,
9 ) = = 0x555800 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : ASTC_2D_12X12_UNORM , { 8192 , 4096 , 1 } , { 0 , 2 , 0 } , 0 ,
12 ) = = 0x50d200 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 0 , 0 ) = =
0 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 0 , 1 ) = =
0x400000 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 0 , 2 ) = =
0x500000 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 0 , 3 ) = =
0x540000 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 0 , 4 ) = =
0x550000 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 0 , 5 ) = =
0x554000 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 0 , 6 ) = =
0x555000 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 0 , 7 ) = =
0x555400 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 0 , 8 ) = =
0x555600 ) ;
static_assert ( CalculateLevelOffset ( PixelFormat : : A8B8G8R8_UNORM , { 1024 , 1024 , 1 } , { 0 , 4 , 0 } , 0 , 9 ) = =
0x555800 ) ;
constexpr u32 ValidateLayerSize ( PixelFormat format , u32 width , u32 height , u32 block_height ,
u32 tile_width_spacing , u32 level ) {
const Extent3D size { width , height , 1 } ;
const Extent3D block { 0 , block_height , 0 } ;
const u32 offset = CalculateLevelOffset ( format , size , block , 1 , tile_width_spacing , level ) ;
const u32 offset = CalculateLevelOffset ( format , size , block , tile_width_spacing , level ) ;
return AlignLayerSize ( offset , size , block , DefaultBlockHeight ( format ) , tile_width_spacing ) ;
}