From 48e969aac70c1268e5e7b83877d9e9603a847ea5 Mon Sep 17 00:00:00 2001 From: walbourn_cp Date: Thu, 11 Sep 2014 15:26:14 -0700 Subject: [PATCH] Xbox One platform changes --- DirectXTex/DirectXTexConvert.cpp | 11 +++++++++++ DirectXTex/DirectXTexMipmaps.cpp | 27 +++++++++++++++++++++++++++ DirectXTex/DirectXTexResize.cpp | 16 ++++++++++++++++ DirectXTex/DirectXTexWIC.cpp | 26 ++++++++++++++++++++++++++ 4 files changed, 80 insertions(+) diff --git a/DirectXTex/DirectXTexConvert.cpp b/DirectXTex/DirectXTexConvert.cpp index 825e62f..24e6d55 100644 --- a/DirectXTex/DirectXTexConvert.cpp +++ b/DirectXTex/DirectXTexConvert.cpp @@ -3833,6 +3833,17 @@ static inline bool _UseWICConversion( _In_ DWORD filter, _In_ DXGI_FORMAT sforma return false; } +#if defined(_XBOX_ONE) && defined(_TITLE) + if ( sformat == DXGI_FORMAT_R16G16B16A16_FLOAT + || sformat == DXGI_FORMAT_R16_FLOAT + || tformat == DXGI_FORMAT_R16G16B16A16_FLOAT + || tformat == DXGI_FORMAT_R16_FLOAT ) + { + // Use non-WIC code paths as these conversions are not supported by Xbox One XDK + return false; + } +#endif + // Check for special cases switch ( sformat ) { diff --git a/DirectXTex/DirectXTexMipmaps.cpp b/DirectXTex/DirectXTexMipmaps.cpp index 23e7a62..3183a87 100644 --- a/DirectXTex/DirectXTexMipmaps.cpp +++ b/DirectXTex/DirectXTexMipmaps.cpp @@ -138,6 +138,17 @@ static HRESULT _EnsureWicBitmapPixelFormat( _In_ IWICImagingFactory* pWIC, _In_ { ComPtr converter; hr = pWIC->CreateFormatConverter( converter.GetAddressOf() ); + + if ( SUCCEEDED(hr) ) + { + BOOL canConvert = FALSE; + hr = converter->CanConvert( actualPixelFormat, desiredPixelFormat, &canConvert ); + if ( FAILED(hr) || !canConvert ) + { + return E_UNEXPECTED; + } + } + if ( SUCCEEDED(hr) ) { hr = converter->Initialize( src, desiredPixelFormat, _GetWICDither(filter), 0, 0, WICBitmapPaletteTypeCustom ); @@ -381,6 +392,15 @@ static bool _UseWICFiltering( _In_ DXGI_FORMAT format, _In_ DWORD filter ) return false; } +#if defined(_XBOX_ONE) && defined(_TITLE) + if ( format == DXGI_FORMAT_R16G16B16A16_FLOAT + || format == DXGI_FORMAT_R16_FLOAT ) + { + // Use non-WIC code paths as these conversions are not supported by Xbox One XDK + return false; + } +#endif + static_assert( TEX_FILTER_POINT == 0x100000, "TEX_FILTER_ flag values don't match TEX_FILTER_MASK" ); switch ( filter & TEX_FILTER_MASK ) @@ -530,6 +550,13 @@ static HRESULT _GenerateMipMapsUsingWIC( _In_ const Image& baseImage, _In_ DWORD if ( FAILED(hr) ) return hr; + BOOL canConvert = FALSE; + hr = FC->CanConvert( pfScaler, pfGUID, &canConvert ); + if ( FAILED(hr) || !canConvert ) + { + return E_UNEXPECTED; + } + hr = FC->Initialize( scaler.Get(), pfGUID, _GetWICDither( filter ), 0, 0, WICBitmapPaletteTypeCustom ); if ( FAILED(hr) ) return hr; diff --git a/DirectXTex/DirectXTexResize.cpp b/DirectXTex/DirectXTexResize.cpp index 1ecf3d4..3d53e55 100644 --- a/DirectXTex/DirectXTexResize.cpp +++ b/DirectXTex/DirectXTexResize.cpp @@ -101,6 +101,13 @@ static HRESULT _PerformResizeUsingWIC( _In_ const Image& srcImage, _In_ DWORD fi if ( FAILED(hr) ) return hr; + BOOL canConvert = FALSE; + hr = FC->CanConvert( pfScaler, pfGUID, &canConvert ); + if ( FAILED(hr) || !canConvert ) + { + return E_UNEXPECTED; + } + hr = FC->Initialize( scaler.Get(), pfGUID, _GetWICDither( filter ), 0, 0, WICBitmapPaletteTypeCustom ); if ( FAILED(hr) ) return hr; @@ -177,6 +184,15 @@ static bool _UseWICFiltering( _In_ DXGI_FORMAT format, _In_ DWORD filter ) return false; } +#if defined(_XBOX_ONE) && defined(_TITLE) + if ( format == DXGI_FORMAT_R16G16B16A16_FLOAT + || format == DXGI_FORMAT_R16_FLOAT ) + { + // Use non-WIC code paths as these conversions are not supported by Xbox One XDK + return false; + } +#endif + static_assert( TEX_FILTER_POINT == 0x100000, "TEX_FILTER_ flag values don't match TEX_FILTER_MASK" ); switch ( filter & TEX_FILTER_MASK ) diff --git a/DirectXTex/DirectXTexWIC.cpp b/DirectXTex/DirectXTexWIC.cpp index 6f30e33..a9eb18c 100644 --- a/DirectXTex/DirectXTexWIC.cpp +++ b/DirectXTex/DirectXTexWIC.cpp @@ -355,6 +355,18 @@ static HRESULT _DecodeSingleFrame( _In_ DWORD flags, _In_ const TexMetadata& met if ( FAILED(hr) ) return hr; + WICPixelFormatGUID pixelFormat; + hr = frame->GetPixelFormat( &pixelFormat ); + if ( FAILED(hr) ) + return hr; + + BOOL canConvert = FALSE; + hr = FC->CanConvert( pixelFormat, convertGUID, &canConvert ); + if ( FAILED(hr) || !canConvert ) + { + return E_UNEXPECTED; + } + hr = FC->Initialize( frame, convertGUID, _GetWICDither( flags ), 0, 0, WICBitmapPaletteTypeCustom ); if ( FAILED(hr) ) return hr; @@ -444,6 +456,13 @@ static HRESULT _DecodeMultiframe( _In_ DWORD flags, _In_ const TexMetadata& meta if ( FAILED(hr) ) return hr; + BOOL canConvert = FALSE; + hr = FC->CanConvert( sourceGUID, pfGuid, &canConvert ); + if ( FAILED(hr) || !canConvert ) + { + return E_UNEXPECTED; + } + hr = FC->Initialize( frame.Get(), pfGuid, _GetWICDither( flags ), 0, 0, WICBitmapPaletteTypeCustom ); if ( FAILED(hr) ) return hr; @@ -602,6 +621,13 @@ static HRESULT _EncodeImage( _In_ const Image& image, _In_ DWORD flags, _In_ REF if ( FAILED(hr) ) return hr; + BOOL canConvert = FALSE; + hr = FC->CanConvert( pfGuid, targetGuid, &canConvert ); + if ( FAILED(hr) || !canConvert ) + { + return E_UNEXPECTED; + } + hr = FC->Initialize( source.Get(), targetGuid, _GetWICDither( flags ), 0, 0, WICBitmapPaletteTypeCustom ); if ( FAILED(hr) ) return hr;