From 6323465f1f3d7e2c4c150bad36312e656bb971ac Mon Sep 17 00:00:00 2001 From: walbourn_cp Date: Tue, 30 Apr 2013 15:25:26 -0700 Subject: [PATCH] DirectXTex: Special-case optimization when doing RGBA 32bpp resize or 2D mipmap generation --- DirectXTex/DirectXTexMipmaps.cpp | 4 ++-- DirectXTex/DirectXTexP.h | 2 +- DirectXTex/DirectXTexResize.cpp | 4 ++-- DirectXTex/DirectXTexUtil.cpp | 14 ++++++++++++-- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/DirectXTex/DirectXTexMipmaps.cpp b/DirectXTex/DirectXTexMipmaps.cpp index f81e1f3..8e71253 100644 --- a/DirectXTex/DirectXTexMipmaps.cpp +++ b/DirectXTex/DirectXTexMipmaps.cpp @@ -867,7 +867,7 @@ HRESULT GenerateMipMaps( const Image& baseImage, DWORD filter, size_t levels, Sc case TEX_FILTER_CUBIC: { WICPixelFormatGUID pfGUID; - if ( _DXGIToWIC( baseImage.format, pfGUID ) ) + if ( _DXGIToWIC( baseImage.format, pfGUID, true ) ) { // Case 1: Base image format is supported by Windows Imaging Component HRESULT hr = (baseImage.height > 1 || !allow1D) @@ -932,7 +932,7 @@ HRESULT GenerateMipMaps( const Image* srcImages, size_t nimages, const TexMetada case TEX_FILTER_CUBIC: { WICPixelFormatGUID pfGUID; - if ( _DXGIToWIC( metadata.format, pfGUID ) ) + if ( _DXGIToWIC( metadata.format, pfGUID, true ) ) { // Case 1: Base image format is supported by Windows Imaging Component TexMetadata mdata2 = metadata; diff --git a/DirectXTex/DirectXTexP.h b/DirectXTex/DirectXTexP.h index 5a71e06..e3bc170 100644 --- a/DirectXTex/DirectXTexP.h +++ b/DirectXTex/DirectXTexP.h @@ -65,7 +65,7 @@ namespace DirectX //--------------------------------------------------------------------------------- // WIC helper functions DXGI_FORMAT _WICToDXGI( _In_ const GUID& guid ); - bool _DXGIToWIC( _In_ DXGI_FORMAT format, _Out_ GUID& guid ); + bool _DXGIToWIC( _In_ DXGI_FORMAT format, _Out_ GUID& guid, _In_ bool ignoreRGBvsBGR = false ); DWORD _CheckWICColorSpace( _In_ const GUID& sourceGUID, _In_ const GUID& targetGUID ); diff --git a/DirectXTex/DirectXTexResize.cpp b/DirectXTex/DirectXTexResize.cpp index 0991f09..b87f3ed 100644 --- a/DirectXTex/DirectXTexResize.cpp +++ b/DirectXTex/DirectXTexResize.cpp @@ -193,7 +193,7 @@ HRESULT Resize( const Image& srcImage, size_t width, size_t height, DWORD filter // WIC only supports CLAMP WICPixelFormatGUID pfGUID; - if ( _DXGIToWIC( srcImage.format, pfGUID ) ) + if ( _DXGIToWIC( srcImage.format, pfGUID, true ) ) { // Case 1: Source format is supported by Windows Imaging Component hr = _PerformResizeUsingWIC( srcImage, filter, pfGUID, *rimage ); @@ -238,7 +238,7 @@ HRESULT Resize( const Image* srcImages, size_t nimages, const TexMetadata& metad return hr; WICPixelFormatGUID pfGUID; - bool wicpf = _DXGIToWIC( metadata.format, pfGUID ); + bool wicpf = _DXGIToWIC( metadata.format, pfGUID, true ); switch ( metadata.dimension ) { diff --git a/DirectXTex/DirectXTexUtil.cpp b/DirectXTex/DirectXTexUtil.cpp index 5c5b18b..46d002f 100644 --- a/DirectXTex/DirectXTexUtil.cpp +++ b/DirectXTex/DirectXTexUtil.cpp @@ -82,12 +82,22 @@ DXGI_FORMAT _WICToDXGI( const GUID& guid ) } _Use_decl_annotations_ -bool _DXGIToWIC( DXGI_FORMAT format, GUID& guid ) +bool _DXGIToWIC( DXGI_FORMAT format, GUID& guid, bool ignoreRGBvsBGR ) { switch( format ) { + case DXGI_FORMAT_R8G8B8A8_UNORM: case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - memcpy( &guid, &GUID_WICPixelFormat32bppRGBA, sizeof(GUID) ); + if ( ignoreRGBvsBGR ) + { + // If we are not doing conversion so don't really care about BGR vs RGB color-order, + // we can use the canonical WIC 32bppBGRA format which avoids an extra format conversion when using the WIC scaler + memcpy( &guid, &GUID_WICPixelFormat32bppBGRA, sizeof(GUID) ); + } + else + { + memcpy( &guid, &GUID_WICPixelFormat32bppRGBA, sizeof(GUID) ); + } return true; case DXGI_FORMAT_D32_FLOAT: