@ -125,6 +125,75 @@ enum class SurfaceTarget {
TextureCubeArray ,
TextureCubeArray ,
} ;
} ;
constexpr std : : array < u32 , MaxPixelFormat > compression_factor_table = { {
1 , / / ABGR8U
1 , / / ABGR8S
1 , / / ABGR8UI
1 , / / B5G6R5U
1 , / / A2B10G10R10U
1 , / / A1B5G5R5U
1 , / / R8U
1 , / / R8UI
1 , / / RGBA16F
1 , / / RGBA16U
1 , / / RGBA16UI
1 , / / R11FG11FB10F
1 , / / RGBA32UI
4 , / / DXT1
4 , / / DXT23
4 , / / DXT45
4 , / / DXN1
4 , / / DXN2UNORM
4 , / / DXN2SNORM
4 , / / BC7U
4 , / / BC6H_UF16
4 , / / BC6H_SF16
4 , / / ASTC_2D_4X4
1 , / / G8R8U
1 , / / G8R8S
1 , / / BGRA8
1 , / / RGBA32F
1 , / / RG32F
1 , / / R32F
1 , / / R16F
1 , / / R16U
1 , / / R16S
1 , / / R16UI
1 , / / R16I
1 , / / RG16
1 , / / RG16F
1 , / / RG16UI
1 , / / RG16I
1 , / / RG16S
1 , / / RGB32F
1 , / / RGBA8_SRGB
1 , / / RG8U
1 , / / RG8S
1 , / / RG32UI
1 , / / R32UI
4 , / / ASTC_2D_8X8
4 , / / ASTC_2D_8X5
4 , / / ASTC_2D_5X4
1 , / / BGRA8_SRGB
4 , / / DXT1_SRGB
4 , / / DXT23_SRGB
4 , / / DXT45_SRGB
4 , / / BC7U_SRGB
4 , / / ASTC_2D_4X4_SRGB
4 , / / ASTC_2D_8X8_SRGB
4 , / / ASTC_2D_8X5_SRGB
4 , / / ASTC_2D_5X4_SRGB
4 , / / ASTC_2D_5X5
4 , / / ASTC_2D_5X5_SRGB
4 , / / ASTC_2D_10X8
4 , / / ASTC_2D_10X8_SRGB
1 , / / Z32F
1 , / / Z16
1 , / / Z24S8
1 , / / S8Z24
1 , / / Z32FS8
} } ;
/**
/**
* Gets the compression factor for the specified PixelFormat . This applies to just the
* Gets the compression factor for the specified PixelFormat . This applies to just the
* " compressed width " and " compressed height " , not the overall compression factor of a
* " compressed width " and " compressed height " , not the overall compression factor of a
@ -135,304 +204,237 @@ static constexpr u32 GetCompressionFactor(PixelFormat format) {
if ( format = = PixelFormat : : Invalid )
if ( format = = PixelFormat : : Invalid )
return 0 ;
return 0 ;
constexpr std : : array < u32 , MaxPixelFormat > compression_factor_table = { {
1 , / / ABGR8U
1 , / / ABGR8S
1 , / / ABGR8UI
1 , / / B5G6R5U
1 , / / A2B10G10R10U
1 , / / A1B5G5R5U
1 , / / R8U
1 , / / R8UI
1 , / / RGBA16F
1 , / / RGBA16U
1 , / / RGBA16UI
1 , / / R11FG11FB10F
1 , / / RGBA32UI
4 , / / DXT1
4 , / / DXT23
4 , / / DXT45
4 , / / DXN1
4 , / / DXN2UNORM
4 , / / DXN2SNORM
4 , / / BC7U
4 , / / BC6H_UF16
4 , / / BC6H_SF16
4 , / / ASTC_2D_4X4
1 , / / G8R8U
1 , / / G8R8S
1 , / / BGRA8
1 , / / RGBA32F
1 , / / RG32F
1 , / / R32F
1 , / / R16F
1 , / / R16U
1 , / / R16S
1 , / / R16UI
1 , / / R16I
1 , / / RG16
1 , / / RG16F
1 , / / RG16UI
1 , / / RG16I
1 , / / RG16S
1 , / / RGB32F
1 , / / RGBA8_SRGB
1 , / / RG8U
1 , / / RG8S
1 , / / RG32UI
1 , / / R32UI
4 , / / ASTC_2D_8X8
4 , / / ASTC_2D_8X5
4 , / / ASTC_2D_5X4
1 , / / BGRA8_SRGB
4 , / / DXT1_SRGB
4 , / / DXT23_SRGB
4 , / / DXT45_SRGB
4 , / / BC7U_SRGB
4 , / / ASTC_2D_4X4_SRGB
4 , / / ASTC_2D_8X8_SRGB
4 , / / ASTC_2D_8X5_SRGB
4 , / / ASTC_2D_5X4_SRGB
4 , / / ASTC_2D_5X5
4 , / / ASTC_2D_5X5_SRGB
4 , / / ASTC_2D_10X8
4 , / / ASTC_2D_10X8_SRGB
1 , / / Z32F
1 , / / Z16
1 , / / Z24S8
1 , / / S8Z24
1 , / / Z32FS8
} } ;
ASSERT ( static_cast < std : : size_t > ( format ) < compression_factor_table . size ( ) ) ;
ASSERT ( static_cast < std : : size_t > ( format ) < compression_factor_table . size ( ) ) ;
return compression_factor_table [ static_cast < std : : size_t > ( format ) ] ;
return compression_factor_table [ static_cast < std : : size_t > ( format ) ] ;
}
}
constexpr std : : array < u32 , MaxPixelFormat > block_width_table = { {
1 , / / ABGR8U
1 , / / ABGR8S
1 , / / ABGR8UI
1 , / / B5G6R5U
1 , / / A2B10G10R10U
1 , / / A1B5G5R5U
1 , / / R8U
1 , / / R8UI
1 , / / RGBA16F
1 , / / RGBA16U
1 , / / RGBA16UI
1 , / / R11FG11FB10F
1 , / / RGBA32UI
4 , / / DXT1
4 , / / DXT23
4 , / / DXT45
4 , / / DXN1
4 , / / DXN2UNORM
4 , / / DXN2SNORM
4 , / / BC7U
4 , / / BC6H_UF16
4 , / / BC6H_SF16
4 , / / ASTC_2D_4X4
1 , / / G8R8U
1 , / / G8R8S
1 , / / BGRA8
1 , / / RGBA32F
1 , / / RG32F
1 , / / R32F
1 , / / R16F
1 , / / R16U
1 , / / R16S
1 , / / R16UI
1 , / / R16I
1 , / / RG16
1 , / / RG16F
1 , / / RG16UI
1 , / / RG16I
1 , / / RG16S
1 , / / RGB32F
1 , / / RGBA8_SRGB
1 , / / RG8U
1 , / / RG8S
1 , / / RG32UI
1 , / / R32UI
8 , / / ASTC_2D_8X8
8 , / / ASTC_2D_8X5
5 , / / ASTC_2D_5X4
1 , / / BGRA8_SRGB
4 , / / DXT1_SRGB
4 , / / DXT23_SRGB
4 , / / DXT45_SRGB
4 , / / BC7U_SRGB
4 , / / ASTC_2D_4X4_SRGB
8 , / / ASTC_2D_8X8_SRGB
8 , / / ASTC_2D_8X5_SRGB
5 , / / ASTC_2D_5X4_SRGB
5 , / / ASTC_2D_5X5
5 , / / ASTC_2D_5X5_SRGB
10 , / / ASTC_2D_10X8
10 , / / ASTC_2D_10X8_SRGB
1 , / / Z32F
1 , / / Z16
1 , / / Z24S8
1 , / / S8Z24
1 , / / Z32FS8
} } ;
static constexpr u32 GetDefaultBlockWidth ( PixelFormat format ) {
static constexpr u32 GetDefaultBlockWidth ( PixelFormat format ) {
if ( format = = PixelFormat : : Invalid )
if ( format = = PixelFormat : : Invalid )
return 0 ;
return 0 ;
constexpr std : : array < u32 , MaxPixelFormat > block_width_table = { {
1 , / / ABGR8U
1 , / / ABGR8S
1 , / / ABGR8UI
1 , / / B5G6R5U
1 , / / A2B10G10R10U
1 , / / A1B5G5R5U
1 , / / R8U
1 , / / R8UI
1 , / / RGBA16F
1 , / / RGBA16U
1 , / / RGBA16UI
1 , / / R11FG11FB10F
1 , / / RGBA32UI
4 , / / DXT1
4 , / / DXT23
4 , / / DXT45
4 , / / DXN1
4 , / / DXN2UNORM
4 , / / DXN2SNORM
4 , / / BC7U
4 , / / BC6H_UF16
4 , / / BC6H_SF16
4 , / / ASTC_2D_4X4
1 , / / G8R8U
1 , / / G8R8S
1 , / / BGRA8
1 , / / RGBA32F
1 , / / RG32F
1 , / / R32F
1 , / / R16F
1 , / / R16U
1 , / / R16S
1 , / / R16UI
1 , / / R16I
1 , / / RG16
1 , / / RG16F
1 , / / RG16UI
1 , / / RG16I
1 , / / RG16S
1 , / / RGB32F
1 , / / RGBA8_SRGB
1 , / / RG8U
1 , / / RG8S
1 , / / RG32UI
1 , / / R32UI
8 , / / ASTC_2D_8X8
8 , / / ASTC_2D_8X5
5 , / / ASTC_2D_5X4
1 , / / BGRA8_SRGB
4 , / / DXT1_SRGB
4 , / / DXT23_SRGB
4 , / / DXT45_SRGB
4 , / / BC7U_SRGB
4 , / / ASTC_2D_4X4_SRGB
8 , / / ASTC_2D_8X8_SRGB
8 , / / ASTC_2D_8X5_SRGB
5 , / / ASTC_2D_5X4_SRGB
5 , / / ASTC_2D_5X5
5 , / / ASTC_2D_5X5_SRGB
10 , / / ASTC_2D_10X8
10 , / / ASTC_2D_10X8_SRGB
1 , / / Z32F
1 , / / Z16
1 , / / Z24S8
1 , / / S8Z24
1 , / / Z32FS8
} } ;
ASSERT ( static_cast < std : : size_t > ( format ) < block_width_table . size ( ) ) ;
ASSERT ( static_cast < std : : size_t > ( format ) < block_width_table . size ( ) ) ;
return block_width_table [ static_cast < std : : size_t > ( format ) ] ;
return block_width_table [ static_cast < std : : size_t > ( format ) ] ;
}
}
constexpr std : : array < u32 , MaxPixelFormat > block_height_table = { {
1 , / / ABGR8U
1 , / / ABGR8S
1 , / / ABGR8UI
1 , / / B5G6R5U
1 , / / A2B10G10R10U
1 , / / A1B5G5R5U
1 , / / R8U
1 , / / R8UI
1 , / / RGBA16F
1 , / / RGBA16U
1 , / / RGBA16UI
1 , / / R11FG11FB10F
1 , / / RGBA32UI
4 , / / DXT1
4 , / / DXT23
4 , / / DXT45
4 , / / DXN1
4 , / / DXN2UNORM
4 , / / DXN2SNORM
4 , / / BC7U
4 , / / BC6H_UF16
4 , / / BC6H_SF16
4 , / / ASTC_2D_4X4
1 , / / G8R8U
1 , / / G8R8S
1 , / / BGRA8
1 , / / RGBA32F
1 , / / RG32F
1 , / / R32F
1 , / / R16F
1 , / / R16U
1 , / / R16S
1 , / / R16UI
1 , / / R16I
1 , / / RG16
1 , / / RG16F
1 , / / RG16UI
1 , / / RG16I
1 , / / RG16S
1 , / / RGB32F
1 , / / RGBA8_SRGB
1 , / / RG8U
1 , / / RG8S
1 , / / RG32UI
1 , / / R32UI
8 , / / ASTC_2D_8X8
5 , / / ASTC_2D_8X5
4 , / / ASTC_2D_5X4
1 , / / BGRA8_SRGB
4 , / / DXT1_SRGB
4 , / / DXT23_SRGB
4 , / / DXT45_SRGB
4 , / / BC7U_SRGB
4 , / / ASTC_2D_4X4_SRGB
8 , / / ASTC_2D_8X8_SRGB
5 , / / ASTC_2D_8X5_SRGB
4 , / / ASTC_2D_5X4_SRGB
5 , / / ASTC_2D_5X5
5 , / / ASTC_2D_5X5_SRGB
8 , / / ASTC_2D_10X8
8 , / / ASTC_2D_10X8_SRGB
1 , / / Z32F
1 , / / Z16
1 , / / Z24S8
1 , / / S8Z24
1 , / / Z32FS8
} } ;
static constexpr u32 GetDefaultBlockHeight ( PixelFormat format ) {
static constexpr u32 GetDefaultBlockHeight ( PixelFormat format ) {
if ( format = = PixelFormat : : Invalid )
if ( format = = PixelFormat : : Invalid )
return 0 ;
return 0 ;
constexpr std : : array < u32 , MaxPixelFormat > block_height_table = { {
1 , / / ABGR8U
1 , / / ABGR8S
1 , / / ABGR8UI
1 , / / B5G6R5U
1 , / / A2B10G10R10U
1 , / / A1B5G5R5U
1 , / / R8U
1 , / / R8UI
1 , / / RGBA16F
1 , / / RGBA16U
1 , / / RGBA16UI
1 , / / R11FG11FB10F
1 , / / RGBA32UI
4 , / / DXT1
4 , / / DXT23
4 , / / DXT45
4 , / / DXN1
4 , / / DXN2UNORM
4 , / / DXN2SNORM
4 , / / BC7U
4 , / / BC6H_UF16
4 , / / BC6H_SF16
4 , / / ASTC_2D_4X4
1 , / / G8R8U
1 , / / G8R8S
1 , / / BGRA8
1 , / / RGBA32F
1 , / / RG32F
1 , / / R32F
1 , / / R16F
1 , / / R16U
1 , / / R16S
1 , / / R16UI
1 , / / R16I
1 , / / RG16
1 , / / RG16F
1 , / / RG16UI
1 , / / RG16I
1 , / / RG16S
1 , / / RGB32F
1 , / / RGBA8_SRGB
1 , / / RG8U
1 , / / RG8S
1 , / / RG32UI
1 , / / R32UI
8 , / / ASTC_2D_8X8
5 , / / ASTC_2D_8X5
4 , / / ASTC_2D_5X4
1 , / / BGRA8_SRGB
4 , / / DXT1_SRGB
4 , / / DXT23_SRGB
4 , / / DXT45_SRGB
4 , / / BC7U_SRGB
4 , / / ASTC_2D_4X4_SRGB
8 , / / ASTC_2D_8X8_SRGB
5 , / / ASTC_2D_8X5_SRGB
4 , / / ASTC_2D_5X4_SRGB
5 , / / ASTC_2D_5X5
5 , / / ASTC_2D_5X5_SRGB
8 , / / ASTC_2D_10X8
8 , / / ASTC_2D_10X8_SRGB
1 , / / Z32F
1 , / / Z16
1 , / / Z24S8
1 , / / S8Z24
1 , / / Z32FS8
} } ;
ASSERT ( static_cast < std : : size_t > ( format ) < block_height_table . size ( ) ) ;
ASSERT ( static_cast < std : : size_t > ( format ) < block_height_table . size ( ) ) ;
return block_height_table [ static_cast < std : : size_t > ( format ) ] ;
return block_height_table [ static_cast < std : : size_t > ( format ) ] ;
}
}
constexpr std : : array < u32 , MaxPixelFormat > bpp_table = { {
32 , / / ABGR8U
32 , / / ABGR8S
32 , / / ABGR8UI
16 , / / B5G6R5U
32 , / / A2B10G10R10U
16 , / / A1B5G5R5U
8 , / / R8U
8 , / / R8UI
64 , / / RGBA16F
64 , / / RGBA16U
64 , / / RGBA16UI
32 , / / R11FG11FB10F
128 , / / RGBA32UI
64 , / / DXT1
128 , / / DXT23
128 , / / DXT45
64 , / / DXN1
128 , / / DXN2UNORM
128 , / / DXN2SNORM
128 , / / BC7U
128 , / / BC6H_UF16
128 , / / BC6H_SF16
128 , / / ASTC_2D_4X4
16 , / / G8R8U
16 , / / G8R8S
32 , / / BGRA8
128 , / / RGBA32F
64 , / / RG32F
32 , / / R32F
16 , / / R16F
16 , / / R16U
16 , / / R16S
16 , / / R16UI
16 , / / R16I
32 , / / RG16
32 , / / RG16F
32 , / / RG16UI
32 , / / RG16I
32 , / / RG16S
96 , / / RGB32F
32 , / / RGBA8_SRGB
16 , / / RG8U
16 , / / RG8S
64 , / / RG32UI
32 , / / R32UI
128 , / / ASTC_2D_8X8
128 , / / ASTC_2D_8X5
128 , / / ASTC_2D_5X4
32 , / / BGRA8_SRGB
64 , / / DXT1_SRGB
128 , / / DXT23_SRGB
128 , / / DXT45_SRGB
128 , / / BC7U
128 , / / ASTC_2D_4X4_SRGB
128 , / / ASTC_2D_8X8_SRGB
128 , / / ASTC_2D_8X5_SRGB
128 , / / ASTC_2D_5X4_SRGB
128 , / / ASTC_2D_5X5
128 , / / ASTC_2D_5X5_SRGB
128 , / / ASTC_2D_10X8
128 , / / ASTC_2D_10X8_SRGB
32 , / / Z32F
16 , / / Z16
32 , / / Z24S8
32 , / / S8Z24
64 , / / Z32FS8
} } ;
static constexpr u32 GetFormatBpp ( PixelFormat format ) {
static constexpr u32 GetFormatBpp ( PixelFormat format ) {
if ( format = = PixelFormat : : Invalid )
if ( format = = PixelFormat : : Invalid )
return 0 ;
return 0 ;
constexpr std : : array < u32 , MaxPixelFormat > bpp_table = { {
32 , / / ABGR8U
32 , / / ABGR8S
32 , / / ABGR8UI
16 , / / B5G6R5U
32 , / / A2B10G10R10U
16 , / / A1B5G5R5U
8 , / / R8U
8 , / / R8UI
64 , / / RGBA16F
64 , / / RGBA16U
64 , / / RGBA16UI
32 , / / R11FG11FB10F
128 , / / RGBA32UI
64 , / / DXT1
128 , / / DXT23
128 , / / DXT45
64 , / / DXN1
128 , / / DXN2UNORM
128 , / / DXN2SNORM
128 , / / BC7U
128 , / / BC6H_UF16
128 , / / BC6H_SF16
128 , / / ASTC_2D_4X4
16 , / / G8R8U
16 , / / G8R8S
32 , / / BGRA8
128 , / / RGBA32F
64 , / / RG32F
32 , / / R32F
16 , / / R16F
16 , / / R16U
16 , / / R16S
16 , / / R16UI
16 , / / R16I
32 , / / RG16
32 , / / RG16F
32 , / / RG16UI
32 , / / RG16I
32 , / / RG16S
96 , / / RGB32F
32 , / / RGBA8_SRGB
16 , / / RG8U
16 , / / RG8S
64 , / / RG32UI
32 , / / R32UI
128 , / / ASTC_2D_8X8
128 , / / ASTC_2D_8X5
128 , / / ASTC_2D_5X4
32 , / / BGRA8_SRGB
64 , / / DXT1_SRGB
128 , / / DXT23_SRGB
128 , / / DXT45_SRGB
128 , / / BC7U
128 , / / ASTC_2D_4X4_SRGB
128 , / / ASTC_2D_8X8_SRGB
128 , / / ASTC_2D_8X5_SRGB
128 , / / ASTC_2D_5X4_SRGB
128 , / / ASTC_2D_5X5
128 , / / ASTC_2D_5X5_SRGB
128 , / / ASTC_2D_10X8
128 , / / ASTC_2D_10X8_SRGB
32 , / / Z32F
16 , / / Z16
32 , / / Z24S8
32 , / / S8Z24
64 , / / Z32FS8
} } ;
ASSERT ( static_cast < std : : size_t > ( format ) < bpp_table . size ( ) ) ;
ASSERT ( static_cast < std : : size_t > ( format ) < bpp_table . size ( ) ) ;
return bpp_table [ static_cast < std : : size_t > ( format ) ] ;
return bpp_table [ static_cast < std : : size_t > ( format ) ] ;
}
}