From 10d8902e6c98097ad3bfe03cd65bcf72aaad4dea Mon Sep 17 00:00:00 2001 From: Chuck Walbourn Date: Thu, 28 Jul 2022 16:35:12 -0700 Subject: [PATCH] Change bool forceSRGB parameters for D3D interop to CREATETEX_FLAGS (#281) --- DirectXTex/DirectXTex.h | 16 +++++++++++---- DirectXTex/DirectXTex.inl | 1 + DirectXTex/DirectXTexD3D11.cpp | 36 ++++++++++++++++++++++++---------- DirectXTex/DirectXTexD3D12.cpp | 10 +++++++--- 4 files changed, 46 insertions(+), 17 deletions(-) diff --git a/DirectXTex/DirectXTex.h b/DirectXTex/DirectXTex.h index 1619c03..6ab0a45 100644 --- a/DirectXTex/DirectXTex.h +++ b/DirectXTex/DirectXTex.h @@ -857,6 +857,15 @@ namespace DirectX _Out_ size_t& required) noexcept; //--------------------------------------------------------------------------------- + // Direct3D interop + + enum CREATETEX_FLAGS : uint32_t + { + CREATETEX_DEFAULT = 0, + CREATETEX_FORCE_SRGB = 0x1, + CREATETEX_IGNORE_SRGB = 0x2, + }; + // Direct3D 11 functions #if defined(__d3d11_h__) || defined(__d3d11_x_h__) bool __cdecl IsSupportedTexture(_In_ ID3D11Device* pDevice, _In_ const TexMetadata& metadata) noexcept; @@ -871,18 +880,17 @@ namespace DirectX HRESULT __cdecl CreateTextureEx( _In_ ID3D11Device* pDevice, _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ D3D11_USAGE usage, _In_ unsigned int bindFlags, _In_ unsigned int cpuAccessFlags, _In_ unsigned int miscFlags, _In_ bool forceSRGB, + _In_ D3D11_USAGE usage, _In_ unsigned int bindFlags, _In_ unsigned int cpuAccessFlags, _In_ unsigned int miscFlags, _In_ CREATETEX_FLAGS flags, _Outptr_ ID3D11Resource** ppResource) noexcept; HRESULT __cdecl CreateShaderResourceViewEx( _In_ ID3D11Device* pDevice, _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ D3D11_USAGE usage, _In_ unsigned int bindFlags, _In_ unsigned int cpuAccessFlags, _In_ unsigned int miscFlags, _In_ bool forceSRGB, + _In_ D3D11_USAGE usage, _In_ unsigned int bindFlags, _In_ unsigned int cpuAccessFlags, _In_ unsigned int miscFlags, _In_ CREATETEX_FLAGS flags, _Outptr_ ID3D11ShaderResourceView** ppSRV) noexcept; HRESULT __cdecl CaptureTexture(_In_ ID3D11Device* pDevice, _In_ ID3D11DeviceContext* pContext, _In_ ID3D11Resource* pSource, _Out_ ScratchImage& result) noexcept; #endif - //--------------------------------------------------------------------------------- // Direct3D 12 functions #if defined(__d3d12_h__) || defined(__d3d12_x_h__) || defined(__XBOX_D3D12_X__) bool __cdecl IsSupportedTexture(_In_ ID3D12Device* pDevice, _In_ const TexMetadata& metadata) noexcept; @@ -893,7 +901,7 @@ namespace DirectX HRESULT __cdecl CreateTextureEx( _In_ ID3D12Device* pDevice, _In_ const TexMetadata& metadata, - _In_ D3D12_RESOURCE_FLAGS resFlags, _In_ bool forceSRGB, + _In_ D3D12_RESOURCE_FLAGS resFlags, _In_ CREATETEX_FLAGS flags, _Outptr_ ID3D12Resource** ppResource) noexcept; HRESULT __cdecl PrepareUpload( diff --git a/DirectXTex/DirectXTex.inl b/DirectXTex/DirectXTex.inl index 1ca81f9..7fef321 100644 --- a/DirectXTex/DirectXTex.inl +++ b/DirectXTex/DirectXTex.inl @@ -24,6 +24,7 @@ DEFINE_ENUM_FLAG_OPERATORS(TEX_PMALPHA_FLAGS); DEFINE_ENUM_FLAG_OPERATORS(TEX_COMPRESS_FLAGS); DEFINE_ENUM_FLAG_OPERATORS(CNMAP_FLAGS); DEFINE_ENUM_FLAG_OPERATORS(CMSE_FLAGS); +DEFINE_ENUM_FLAG_OPERATORS(CREATETEX_FLAGS); // WIC_FILTER modes match TEX_FILTER modes constexpr WIC_FLAGS operator|(WIC_FLAGS a, TEX_FILTER_FLAGS b) { return static_cast(static_cast(a) | static_cast(b & TEX_FILTER_MODE_MASK)); } diff --git a/DirectXTex/DirectXTexD3D11.cpp b/DirectXTex/DirectXTexD3D11.cpp index 735fc57..555e1ce 100644 --- a/DirectXTex/DirectXTexD3D11.cpp +++ b/DirectXTex/DirectXTexD3D11.cpp @@ -411,7 +411,7 @@ HRESULT DirectX::CreateTexture( { return CreateTextureEx( pDevice, srcImages, nimages, metadata, - D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, false, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, CREATETEX_DEFAULT, ppResource); } @@ -425,7 +425,7 @@ HRESULT DirectX::CreateTextureEx( unsigned int bindFlags, unsigned int cpuAccessFlags, unsigned int miscFlags, - bool forceSRGB, + CREATETEX_FLAGS flags, ID3D11Resource** ppResource) noexcept { if (!pDevice || !srcImages || !nimages || !ppResource) @@ -543,7 +543,15 @@ HRESULT DirectX::CreateTextureEx( // Create texture using static initialization data HRESULT hr = E_UNEXPECTED; - const DXGI_FORMAT tformat = (forceSRGB) ? MakeSRGB(metadata.format) : metadata.format; + DXGI_FORMAT format = metadata.format; + if (flags & CREATETEX_FORCE_SRGB) + { + format = MakeSRGB(format); + } + else if (flags & CREATETEX_IGNORE_SRGB) + { + format = MakeLinear(format); + } switch (metadata.dimension) { @@ -553,7 +561,7 @@ HRESULT DirectX::CreateTextureEx( desc.Width = static_cast(metadata.width); desc.MipLevels = static_cast(metadata.mipLevels); desc.ArraySize = static_cast(metadata.arraySize); - desc.Format = tformat; + desc.Format = format; desc.Usage = usage; desc.BindFlags = bindFlags; desc.CPUAccessFlags = cpuAccessFlags; @@ -570,7 +578,7 @@ HRESULT DirectX::CreateTextureEx( desc.Height = static_cast(metadata.height); desc.MipLevels = static_cast(metadata.mipLevels); desc.ArraySize = static_cast(metadata.arraySize); - desc.Format = tformat; + desc.Format = format; desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.Usage = usage; @@ -592,7 +600,7 @@ HRESULT DirectX::CreateTextureEx( desc.Height = static_cast(metadata.height); desc.Depth = static_cast(metadata.depth); desc.MipLevels = static_cast(metadata.mipLevels); - desc.Format = tformat; + desc.Format = format; desc.Usage = usage; desc.BindFlags = bindFlags; desc.CPUAccessFlags = cpuAccessFlags; @@ -620,7 +628,7 @@ HRESULT DirectX::CreateShaderResourceView( { return CreateShaderResourceViewEx( pDevice, srcImages, nimages, metadata, - D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, false, + D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, CREATETEX_DEFAULT, ppSRV); } @@ -634,7 +642,7 @@ HRESULT DirectX::CreateShaderResourceViewEx( unsigned int bindFlags, unsigned int cpuAccessFlags, unsigned int miscFlags, - bool forceSRGB, + CREATETEX_FLAGS flags, ID3D11ShaderResourceView** ppSRV) noexcept { if (!ppSRV) @@ -647,7 +655,7 @@ HRESULT DirectX::CreateShaderResourceViewEx( ComPtr resource; HRESULT hr = CreateTextureEx(pDevice, srcImages, nimages, metadata, - usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB, + usage, bindFlags, cpuAccessFlags, miscFlags, flags, resource.GetAddressOf()); if (FAILED(hr)) return hr; @@ -655,10 +663,18 @@ HRESULT DirectX::CreateShaderResourceViewEx( assert(resource); D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; - if (forceSRGB) + if (flags & CREATETEX_FORCE_SRGB) + { SRVDesc.Format = MakeSRGB(metadata.format); + } + else if (flags & CREATETEX_IGNORE_SRGB) + { + SRVDesc.Format = MakeLinear(metadata.format); + } else + { SRVDesc.Format = metadata.format; + } switch (metadata.dimension) { diff --git a/DirectXTex/DirectXTexD3D12.cpp b/DirectXTex/DirectXTexD3D12.cpp index 29a876a..9256193 100644 --- a/DirectXTex/DirectXTexD3D12.cpp +++ b/DirectXTex/DirectXTexD3D12.cpp @@ -440,7 +440,7 @@ HRESULT DirectX::CreateTexture( { return CreateTextureEx( pDevice, metadata, - D3D12_RESOURCE_FLAG_NONE, false, + D3D12_RESOURCE_FLAG_NONE, CREATETEX_DEFAULT, ppResource); } @@ -449,7 +449,7 @@ HRESULT DirectX::CreateTextureEx( ID3D12Device* pDevice, const TexMetadata& metadata, D3D12_RESOURCE_FLAGS resFlags, - bool forceSRGB, + CREATETEX_FLAGS flags, ID3D12Resource** ppResource) noexcept { if (!pDevice || !ppResource) @@ -465,10 +465,14 @@ HRESULT DirectX::CreateTextureEx( return E_INVALIDARG; DXGI_FORMAT format = metadata.format; - if (forceSRGB) + if (flags & CREATETEX_FORCE_SRGB) { format = MakeSRGB(format); } + else if (flags & CREATETEX_IGNORE_SRGB) + { + format = MakeLinear(format); + } D3D12_RESOURCE_DESC desc = {}; desc.Width = static_cast(metadata.width);