mirror of
https://github.com/microsoft/DirectXTex.git
synced 2026-02-10 06:36:14 +01:00
Texconv: Now supports -tu and -tf options for coping with "TYPELESS" DDS files
DirectXTex: new 'typeless' DXGI utilities
This commit is contained in:
@@ -57,6 +57,9 @@ namespace DirectX
|
||||
size_t ComputeScanlines( _In_ DXGI_FORMAT fmt, _In_ size_t height );
|
||||
|
||||
DXGI_FORMAT MakeSRGB( _In_ DXGI_FORMAT fmt );
|
||||
DXGI_FORMAT MakeTypeless( _In_ DXGI_FORMAT fmt );
|
||||
DXGI_FORMAT MakeTypelessUNORM( _In_ DXGI_FORMAT fmt );
|
||||
DXGI_FORMAT MakeTypelessFLOAT( _In_ DXGI_FORMAT fmt );
|
||||
|
||||
//---------------------------------------------------------------------------------
|
||||
// Texture metadata
|
||||
@@ -191,6 +194,8 @@ namespace DirectX
|
||||
|
||||
void Release();
|
||||
|
||||
bool OverrideFormat( _In_ DXGI_FORMAT f );
|
||||
|
||||
const TexMetadata& GetMetadata() const { return _metadata; }
|
||||
const Image* GetImage(_In_ size_t mip, _In_ size_t item, _In_ size_t slice) const;
|
||||
|
||||
|
||||
@@ -594,6 +594,32 @@ void ScratchImage::Release()
|
||||
memset(&_metadata, 0, sizeof(_metadata));
|
||||
}
|
||||
|
||||
bool ScratchImage::OverrideFormat( DXGI_FORMAT f )
|
||||
{
|
||||
if ( !_image )
|
||||
return false;
|
||||
|
||||
if ( !IsValid( f ) || IsVideo( f ) )
|
||||
return false;
|
||||
|
||||
if ( ( BitsPerPixel( f ) != BitsPerPixel( _metadata.format ) )
|
||||
|| ( IsCompressed( f ) != IsCompressed( _metadata.format ) )
|
||||
|| ( IsPacked( f ) != IsPacked( _metadata.format ) ) )
|
||||
{
|
||||
// Can't change the effective pitch of the format this way
|
||||
return false;
|
||||
}
|
||||
|
||||
for( size_t index = 0; index < _nimages; ++index )
|
||||
{
|
||||
_image[ index ].format = f;
|
||||
}
|
||||
|
||||
_metadata.format = f;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const Image* ScratchImage::GetImage(size_t mip, size_t item, size_t slice) const
|
||||
{
|
||||
if ( mip >= _metadata.mipLevels )
|
||||
|
||||
@@ -434,6 +434,214 @@ DXGI_FORMAT MakeSRGB( _In_ DXGI_FORMAT fmt )
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------
|
||||
// Converts to a format to an equivalent TYPELESS format if available
|
||||
//-------------------------------------------------------------------------------------
|
||||
DXGI_FORMAT MakeTypeless( _In_ DXGI_FORMAT fmt )
|
||||
{
|
||||
switch( fmt )
|
||||
{
|
||||
case DXGI_FORMAT_R32G32B32A32_FLOAT:
|
||||
case DXGI_FORMAT_R32G32B32A32_UINT:
|
||||
case DXGI_FORMAT_R32G32B32A32_SINT:
|
||||
return DXGI_FORMAT_R32G32B32A32_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_R32G32B32_FLOAT:
|
||||
case DXGI_FORMAT_R32G32B32_UINT:
|
||||
case DXGI_FORMAT_R32G32B32_SINT:
|
||||
return DXGI_FORMAT_R32G32B32_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_R16G16B16A16_FLOAT:
|
||||
case DXGI_FORMAT_R16G16B16A16_UNORM:
|
||||
case DXGI_FORMAT_R16G16B16A16_UINT:
|
||||
case DXGI_FORMAT_R16G16B16A16_SNORM:
|
||||
case DXGI_FORMAT_R16G16B16A16_SINT:
|
||||
return DXGI_FORMAT_R16G16B16A16_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_R32G32_FLOAT:
|
||||
case DXGI_FORMAT_R32G32_UINT:
|
||||
case DXGI_FORMAT_R32G32_SINT:
|
||||
return DXGI_FORMAT_R32G32_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_R10G10B10A2_UNORM:
|
||||
case DXGI_FORMAT_R10G10B10A2_UINT:
|
||||
return DXGI_FORMAT_R10G10B10A2_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_R8G8B8A8_UNORM:
|
||||
case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
|
||||
case DXGI_FORMAT_R8G8B8A8_UINT:
|
||||
case DXGI_FORMAT_R8G8B8A8_SNORM:
|
||||
case DXGI_FORMAT_R8G8B8A8_SINT:
|
||||
return DXGI_FORMAT_R8G8B8A8_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_R16G16_FLOAT:
|
||||
case DXGI_FORMAT_R16G16_UNORM:
|
||||
case DXGI_FORMAT_R16G16_UINT:
|
||||
case DXGI_FORMAT_R16G16_SNORM:
|
||||
case DXGI_FORMAT_R16G16_SINT:
|
||||
return DXGI_FORMAT_R16G16_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_D32_FLOAT:
|
||||
case DXGI_FORMAT_R32_FLOAT:
|
||||
case DXGI_FORMAT_R32_UINT:
|
||||
case DXGI_FORMAT_R32_SINT:
|
||||
return DXGI_FORMAT_R32_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_R8G8_UNORM:
|
||||
case DXGI_FORMAT_R8G8_UINT:
|
||||
case DXGI_FORMAT_R8G8_SNORM:
|
||||
case DXGI_FORMAT_R8G8_SINT:
|
||||
return DXGI_FORMAT_R8G8_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_R16_FLOAT:
|
||||
case DXGI_FORMAT_D16_UNORM:
|
||||
case DXGI_FORMAT_R16_UNORM:
|
||||
case DXGI_FORMAT_R16_UINT:
|
||||
case DXGI_FORMAT_R16_SNORM:
|
||||
case DXGI_FORMAT_R16_SINT:
|
||||
return DXGI_FORMAT_R16_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_R8_UNORM:
|
||||
case DXGI_FORMAT_R8_UINT:
|
||||
case DXGI_FORMAT_R8_SNORM:
|
||||
case DXGI_FORMAT_R8_SINT:
|
||||
case DXGI_FORMAT_A8_UNORM:
|
||||
return DXGI_FORMAT_R8_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_BC1_UNORM:
|
||||
case DXGI_FORMAT_BC1_UNORM_SRGB:
|
||||
return DXGI_FORMAT_BC1_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_BC2_UNORM:
|
||||
case DXGI_FORMAT_BC2_UNORM_SRGB:
|
||||
return DXGI_FORMAT_BC2_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_BC3_UNORM:
|
||||
case DXGI_FORMAT_BC3_UNORM_SRGB:
|
||||
return DXGI_FORMAT_BC3_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_BC4_UNORM:
|
||||
case DXGI_FORMAT_BC4_SNORM:
|
||||
return DXGI_FORMAT_BC4_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_BC5_UNORM:
|
||||
case DXGI_FORMAT_BC5_SNORM:
|
||||
return DXGI_FORMAT_BC5_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_B8G8R8A8_UNORM:
|
||||
case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
|
||||
return DXGI_FORMAT_B8G8R8A8_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_B8G8R8X8_UNORM:
|
||||
case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
|
||||
return DXGI_FORMAT_B8G8R8X8_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_BC6H_UF16:
|
||||
case DXGI_FORMAT_BC6H_SF16:
|
||||
return DXGI_FORMAT_BC6H_TYPELESS;
|
||||
|
||||
case DXGI_FORMAT_BC7_UNORM:
|
||||
case DXGI_FORMAT_BC7_UNORM_SRGB:
|
||||
return DXGI_FORMAT_BC7_TYPELESS;
|
||||
|
||||
default:
|
||||
return fmt;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------
|
||||
// Converts to a TYPELESS format to an equivalent UNORM format if available
|
||||
//-------------------------------------------------------------------------------------
|
||||
DXGI_FORMAT MakeTypelessUNORM( _In_ DXGI_FORMAT fmt )
|
||||
{
|
||||
switch( fmt )
|
||||
{
|
||||
case DXGI_FORMAT_R16G16B16A16_TYPELESS:
|
||||
return DXGI_FORMAT_R16G16B16A16_UNORM;
|
||||
|
||||
case DXGI_FORMAT_R10G10B10A2_TYPELESS:
|
||||
return DXGI_FORMAT_R10G10B10A2_UNORM;
|
||||
|
||||
case DXGI_FORMAT_R8G8B8A8_TYPELESS:
|
||||
return DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||
|
||||
case DXGI_FORMAT_R16G16_TYPELESS:
|
||||
return DXGI_FORMAT_R16G16_UNORM;
|
||||
|
||||
case DXGI_FORMAT_R8G8_TYPELESS:
|
||||
return DXGI_FORMAT_R8G8_UNORM;
|
||||
|
||||
case DXGI_FORMAT_R16_TYPELESS:
|
||||
return DXGI_FORMAT_R16_UNORM;
|
||||
|
||||
case DXGI_FORMAT_R8_TYPELESS:
|
||||
return DXGI_FORMAT_R8_UNORM;
|
||||
|
||||
case DXGI_FORMAT_BC1_TYPELESS:
|
||||
return DXGI_FORMAT_BC1_UNORM;
|
||||
|
||||
case DXGI_FORMAT_BC2_TYPELESS:
|
||||
return DXGI_FORMAT_BC2_UNORM;
|
||||
|
||||
case DXGI_FORMAT_BC3_TYPELESS:
|
||||
return DXGI_FORMAT_BC3_UNORM;
|
||||
|
||||
case DXGI_FORMAT_BC4_TYPELESS:
|
||||
return DXGI_FORMAT_BC4_UNORM;
|
||||
|
||||
case DXGI_FORMAT_BC5_TYPELESS:
|
||||
return DXGI_FORMAT_BC5_UNORM;
|
||||
|
||||
case DXGI_FORMAT_B8G8R8A8_TYPELESS:
|
||||
return DXGI_FORMAT_B8G8R8A8_UNORM;
|
||||
|
||||
case DXGI_FORMAT_B8G8R8X8_TYPELESS:
|
||||
return DXGI_FORMAT_B8G8R8X8_UNORM;
|
||||
|
||||
case DXGI_FORMAT_BC7_TYPELESS:
|
||||
return DXGI_FORMAT_BC7_UNORM;
|
||||
|
||||
default:
|
||||
return fmt;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------
|
||||
// Converts to a TYPELESS format to an equivalent FLOAT format if available
|
||||
//-------------------------------------------------------------------------------------
|
||||
DXGI_FORMAT MakeTypelessFLOAT( _In_ DXGI_FORMAT fmt )
|
||||
{
|
||||
switch( fmt )
|
||||
{
|
||||
case DXGI_FORMAT_R32G32B32A32_TYPELESS:
|
||||
return DXGI_FORMAT_R32G32B32A32_FLOAT;
|
||||
|
||||
case DXGI_FORMAT_R32G32B32_TYPELESS:
|
||||
return DXGI_FORMAT_R32G32B32_FLOAT;
|
||||
|
||||
case DXGI_FORMAT_R16G16B16A16_TYPELESS:
|
||||
return DXGI_FORMAT_R16G16B16A16_FLOAT;
|
||||
|
||||
case DXGI_FORMAT_R32G32_TYPELESS:
|
||||
return DXGI_FORMAT_R32G32_FLOAT;
|
||||
|
||||
case DXGI_FORMAT_R16G16_TYPELESS:
|
||||
return DXGI_FORMAT_R16G16_FLOAT;
|
||||
|
||||
case DXGI_FORMAT_R32_TYPELESS:
|
||||
return DXGI_FORMAT_R32_FLOAT;
|
||||
|
||||
case DXGI_FORMAT_R16_TYPELESS:
|
||||
return DXGI_FORMAT_R16_FLOAT;
|
||||
|
||||
default:
|
||||
return fmt;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//=====================================================================================
|
||||
// TexMetadata
|
||||
//=====================================================================================
|
||||
|
||||
Reference in New Issue
Block a user