mirror of
https://github.com/microsoft/DirectXTex.git
synced 2025-07-13 13:40:14 +02:00
DirectXTex: partial typeless support for _LoadScanline
This commit is contained in:
parent
11cafa387d
commit
598fedaf35
@ -58,7 +58,7 @@ namespace DirectX
|
|||||||
bool IsPacked( _In_ DXGI_FORMAT fmt );
|
bool IsPacked( _In_ DXGI_FORMAT fmt );
|
||||||
bool IsVideo( _In_ DXGI_FORMAT fmt );
|
bool IsVideo( _In_ DXGI_FORMAT fmt );
|
||||||
bool IsSRGB( _In_ DXGI_FORMAT fmt );
|
bool IsSRGB( _In_ DXGI_FORMAT fmt );
|
||||||
bool IsTypeless( _In_ DXGI_FORMAT fmt );
|
bool IsTypeless( _In_ DXGI_FORMAT fmt, _In_ bool partialTypeless=true );
|
||||||
|
|
||||||
bool HasAlpha( _In_ DXGI_FORMAT fmt );
|
bool HasAlpha( _In_ DXGI_FORMAT fmt );
|
||||||
|
|
||||||
|
@ -127,7 +127,7 @@ inline bool IsSRGB( DXGI_FORMAT fmt )
|
|||||||
}
|
}
|
||||||
|
|
||||||
_Use_decl_annotations_
|
_Use_decl_annotations_
|
||||||
inline bool IsTypeless( DXGI_FORMAT fmt )
|
inline bool IsTypeless( DXGI_FORMAT fmt, bool partialTypeless )
|
||||||
{
|
{
|
||||||
switch( fmt )
|
switch( fmt )
|
||||||
{
|
{
|
||||||
@ -136,15 +136,11 @@ inline bool IsTypeless( DXGI_FORMAT fmt )
|
|||||||
case DXGI_FORMAT_R16G16B16A16_TYPELESS:
|
case DXGI_FORMAT_R16G16B16A16_TYPELESS:
|
||||||
case DXGI_FORMAT_R32G32_TYPELESS:
|
case DXGI_FORMAT_R32G32_TYPELESS:
|
||||||
case DXGI_FORMAT_R32G8X24_TYPELESS:
|
case DXGI_FORMAT_R32G8X24_TYPELESS:
|
||||||
case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
|
|
||||||
case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
|
|
||||||
case DXGI_FORMAT_R10G10B10A2_TYPELESS:
|
case DXGI_FORMAT_R10G10B10A2_TYPELESS:
|
||||||
case DXGI_FORMAT_R8G8B8A8_TYPELESS:
|
case DXGI_FORMAT_R8G8B8A8_TYPELESS:
|
||||||
case DXGI_FORMAT_R16G16_TYPELESS:
|
case DXGI_FORMAT_R16G16_TYPELESS:
|
||||||
case DXGI_FORMAT_R32_TYPELESS:
|
case DXGI_FORMAT_R32_TYPELESS:
|
||||||
case DXGI_FORMAT_R24G8_TYPELESS:
|
case DXGI_FORMAT_R24G8_TYPELESS:
|
||||||
case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
|
|
||||||
case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
|
|
||||||
case DXGI_FORMAT_R8G8_TYPELESS:
|
case DXGI_FORMAT_R8G8_TYPELESS:
|
||||||
case DXGI_FORMAT_R16_TYPELESS:
|
case DXGI_FORMAT_R16_TYPELESS:
|
||||||
case DXGI_FORMAT_R8_TYPELESS:
|
case DXGI_FORMAT_R8_TYPELESS:
|
||||||
@ -159,6 +155,12 @@ inline bool IsTypeless( DXGI_FORMAT fmt )
|
|||||||
case DXGI_FORMAT_BC7_TYPELESS:
|
case DXGI_FORMAT_BC7_TYPELESS:
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
|
||||||
|
case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
|
||||||
|
case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
|
||||||
|
case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
|
||||||
|
return partialTypeless;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -530,7 +530,7 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
|
|||||||
{
|
{
|
||||||
assert( pDestination && count > 0 && (((uintptr_t)pDestination & 0xF) == 0) );
|
assert( pDestination && count > 0 && (((uintptr_t)pDestination & 0xF) == 0) );
|
||||||
assert( pSource && size > 0 );
|
assert( pSource && size > 0 );
|
||||||
assert( IsValid(format) && !IsVideo(format) && !IsTypeless(format) && !IsCompressed(format) );
|
assert( IsValid(format) && !IsVideo(format) && !IsTypeless(format,false) && !IsCompressed(format) );
|
||||||
|
|
||||||
XMVECTOR* __restrict dPtr = pDestination;
|
XMVECTOR* __restrict dPtr = pDestination;
|
||||||
if ( !dPtr )
|
if ( !dPtr )
|
||||||
@ -601,6 +601,35 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
|
||||||
|
if ( size >= (sizeof(float)+sizeof(uint32_t)) )
|
||||||
|
{
|
||||||
|
const float * sPtr = reinterpret_cast<const float*>(pSource);
|
||||||
|
for( size_t icount = 0; icount < size; icount += (sizeof(float)+sizeof(uint32_t)) )
|
||||||
|
{
|
||||||
|
if ( dPtr >= ePtr ) break;
|
||||||
|
*(dPtr++) = XMVectorSet( sPtr[0], 0.f /* typeless component assumed zero */, 0.f, 1.f );
|
||||||
|
sPtr += 2;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
|
||||||
|
if ( size >= (sizeof(float)+sizeof(uint32_t)) )
|
||||||
|
{
|
||||||
|
const float * sPtr = reinterpret_cast<const float*>(pSource);
|
||||||
|
for( size_t icount = 0; icount < size; icount += (sizeof(float)+sizeof(uint32_t)) )
|
||||||
|
{
|
||||||
|
const uint8_t* pg8 = reinterpret_cast<const uint8_t*>( &sPtr[1] );
|
||||||
|
if ( dPtr >= ePtr ) break;
|
||||||
|
*(dPtr++) = XMVectorSet( 0.f /* typeless component assumed zero */, static_cast<float>( *pg8 ), 0.f, 1.f );
|
||||||
|
sPtr += 2;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
case DXGI_FORMAT_R10G10B10A2_UNORM:
|
case DXGI_FORMAT_R10G10B10A2_UNORM:
|
||||||
LOAD_SCANLINE( XMUDECN4, XMLoadUDecN4 );
|
LOAD_SCANLINE( XMUDECN4, XMLoadUDecN4 );
|
||||||
|
|
||||||
@ -726,6 +755,36 @@ bool _LoadScanline( XMVECTOR* pDestination, size_t count,
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
|
||||||
|
if ( size >= sizeof(uint32_t) )
|
||||||
|
{
|
||||||
|
const uint32_t * sPtr = reinterpret_cast<const uint32_t*>(pSource);
|
||||||
|
for( size_t icount = 0; icount < size; icount += sizeof(uint32_t) )
|
||||||
|
{
|
||||||
|
float r = static_cast<float>( *sPtr & 0xFFFFFF ) / 16777215.f;
|
||||||
|
++sPtr;
|
||||||
|
if ( dPtr >= ePtr ) break;
|
||||||
|
*(dPtr++) = XMVectorSet( r, 0.f /* typeless component assumed zero */, 0.f, 1.f );
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
|
||||||
|
if ( size >= sizeof(uint32_t) )
|
||||||
|
{
|
||||||
|
const uint32_t * sPtr = reinterpret_cast<const uint32_t*>(pSource);
|
||||||
|
for( size_t icount = 0; icount < size; icount += sizeof(uint32_t) )
|
||||||
|
{
|
||||||
|
float g = static_cast<float>( ( *sPtr & 0xFF000000 ) >> 24 );
|
||||||
|
++sPtr;
|
||||||
|
if ( dPtr >= ePtr ) break;
|
||||||
|
*(dPtr++) = XMVectorSet( 0.f /* typeless component assumed zero */, g, 0.f, 1.f );
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
case DXGI_FORMAT_R8G8_UNORM:
|
case DXGI_FORMAT_R8G8_UNORM:
|
||||||
LOAD_SCANLINE2( XMUBYTEN2, XMLoadUByteN2, g_XMIdentityR3 )
|
LOAD_SCANLINE2( XMUBYTEN2, XMLoadUByteN2, g_XMIdentityR3 )
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user