mirror of
https://github.com/microsoft/DirectXTex.git
synced 2025-07-09 11:40:14 +02:00
DirectXTex/DirectXTK: Extra validation and typeless handling for capturing MSAA textures
This commit is contained in:
parent
1425425b35
commit
42e9ba96a3
@ -683,12 +683,32 @@ HRESULT CaptureTexture( ID3D11Device* pDevice, ID3D11DeviceContext* pContext, ID
|
|||||||
|
|
||||||
assert( pTemp.Get() );
|
assert( pTemp.Get() );
|
||||||
|
|
||||||
|
DXGI_FORMAT fmt = desc.Format;
|
||||||
|
if ( IsTypeless(fmt) )
|
||||||
|
{
|
||||||
|
// Assume a UNORM if it exists otherwise use FLOAT
|
||||||
|
fmt = MakeTypelessUNORM( fmt );
|
||||||
|
fmt = MakeTypelessFLOAT( fmt );
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT support = 0;
|
||||||
|
hr = pDevice->CheckFormatSupport( fmt, &support );
|
||||||
|
if ( FAILED(hr) )
|
||||||
|
break;
|
||||||
|
|
||||||
|
if ( !(support & D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE) )
|
||||||
|
{
|
||||||
|
hr = E_FAIL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
for( UINT item = 0; item < desc.ArraySize; ++item )
|
for( UINT item = 0; item < desc.ArraySize; ++item )
|
||||||
{
|
{
|
||||||
for( UINT level = 0; level < desc.MipLevels; ++level )
|
for( UINT level = 0; level < desc.MipLevels; ++level )
|
||||||
{
|
{
|
||||||
UINT index = D3D11CalcSubresource( level, item, desc.MipLevels );
|
UINT index = D3D11CalcSubresource( level, item, desc.MipLevels );
|
||||||
pContext->ResolveSubresource( pTemp.Get(), index, pSource, index, desc.Format );
|
|
||||||
|
pContext->ResolveSubresource( pTemp.Get(), index, pSource, index, fmt );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -490,6 +490,36 @@ static void GetSurfaceInfo( _In_ size_t width,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
static DXGI_FORMAT EnsureNotTypeless( DXGI_FORMAT fmt )
|
||||||
|
{
|
||||||
|
// Assumes UNORM or FLOAT; doesn't use UINT or SINT
|
||||||
|
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_UNORM;
|
||||||
|
case DXGI_FORMAT_R32G32_TYPELESS: return DXGI_FORMAT_R32G32_FLOAT;
|
||||||
|
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_R32_TYPELESS: return DXGI_FORMAT_R32_FLOAT;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
static HRESULT CaptureTexture( _In_ ID3D11DeviceContext* pContext,
|
static HRESULT CaptureTexture( _In_ ID3D11DeviceContext* pContext,
|
||||||
_In_ ID3D11Resource* pSource,
|
_In_ ID3D11Resource* pSource,
|
||||||
@ -530,12 +560,22 @@ static HRESULT CaptureTexture( _In_ ID3D11DeviceContext* pContext,
|
|||||||
|
|
||||||
assert( pTemp.Get() );
|
assert( pTemp.Get() );
|
||||||
|
|
||||||
|
DXGI_FORMAT fmt = EnsureNotTypeless( desc.Format );
|
||||||
|
|
||||||
|
UINT support = 0;
|
||||||
|
hr = d3dDevice->CheckFormatSupport( fmt, &support );
|
||||||
|
if ( FAILED(hr) )
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
if ( !(support & D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE) )
|
||||||
|
return E_FAIL;
|
||||||
|
|
||||||
for( UINT item = 0; item < desc.ArraySize; ++item )
|
for( UINT item = 0; item < desc.ArraySize; ++item )
|
||||||
{
|
{
|
||||||
for( UINT level = 0; level < desc.MipLevels; ++level )
|
for( UINT level = 0; level < desc.MipLevels; ++level )
|
||||||
{
|
{
|
||||||
UINT index = D3D11CalcSubresource( level, item, desc.MipLevels );
|
UINT index = D3D11CalcSubresource( level, item, desc.MipLevels );
|
||||||
pContext->ResolveSubresource( pTemp.Get(), index, pSource, index, desc.Format );
|
pContext->ResolveSubresource( pTemp.Get(), index, pSource, index, fmt );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user