20
20
namespace DirectX
21
21
{
22
22
23
+ inline static DWORD _GetSRGBFlags ( _In_ DWORD compress )
24
+ {
25
+ static_assert ( TEX_COMPRESS_SRGB_IN == TEX_FILTER_SRGB_IN, " TEX_COMPRESS_SRGB* should match TEX_FILTER_SRGB*" );
26
+ static_assert ( TEX_COMPRESS_SRGB_OUT == TEX_FILTER_SRGB_OUT, " TEX_COMPRESS_SRGB* should match TEX_FILTER_SRGB*" );
27
+ static_assert ( TEX_COMPRESS_SRGB == TEX_FILTER_SRGB, " TEX_COMPRESS_SRGB* should match TEX_FILTER_SRGB*" );
28
+ return ( compress & TEX_COMPRESS_SRGB );
29
+ }
30
+
31
+
23
32
// -------------------------------------------------------------------------------------
24
33
// Converts to R8G8B8A8_UNORM or R8G8B8A8_UNORM_SRGB doing any conversion logic needed
25
34
// -------------------------------------------------------------------------------------
26
- static HRESULT _ConvertToRGBA32 ( _In_ const Image& srcImage, _In_ ScratchImage& image, bool srgb )
35
+ static HRESULT _ConvertToRGBA32 ( _In_ const Image& srcImage, _In_ ScratchImage& image, bool srgb, _In_ DWORD filter )
27
36
{
28
37
if ( !srcImage.pixels )
29
38
return E_POINTER;
@@ -64,7 +73,7 @@ static HRESULT _ConvertToRGBA32( _In_ const Image& srcImage, _In_ ScratchImage&
64
73
return E_FAIL;
65
74
}
66
75
67
- _ConvertScanline ( scanline.get (), srcImage.width , format, srcImage.format , 0 );
76
+ _ConvertScanline ( scanline.get (), srcImage.width , format, srcImage.format , filter );
68
77
69
78
if ( !_StoreScanline ( pDest, img->rowPitch , format, scanline.get (), srcImage.width ) )
70
79
{
@@ -83,7 +92,7 @@ static HRESULT _ConvertToRGBA32( _In_ const Image& srcImage, _In_ ScratchImage&
83
92
// -------------------------------------------------------------------------------------
84
93
// Converts to DXGI_FORMAT_R32G32B32A32_FLOAT doing any conversion logic needed
85
94
// -------------------------------------------------------------------------------------
86
- static HRESULT _ConvertToRGBAF32 ( const Image& srcImage, ScratchImage& image )
95
+ static HRESULT _ConvertToRGBAF32 ( const Image& srcImage, ScratchImage& image, _In_ DWORD filter )
87
96
{
88
97
if ( !srcImage.pixels )
89
98
return E_POINTER;
@@ -115,7 +124,7 @@ static HRESULT _ConvertToRGBAF32( const Image& srcImage, ScratchImage& image )
115
124
return E_FAIL;
116
125
}
117
126
118
- _ConvertScanline ( reinterpret_cast <XMVECTOR*>(pDest), srcImage.width , DXGI_FORMAT_R32G32B32A32_FLOAT, srcImage.format , 0 );
127
+ _ConvertScanline ( reinterpret_cast <XMVECTOR*>(pDest), srcImage.width , DXGI_FORMAT_R32G32B32A32_FLOAT, srcImage.format , filter );
119
128
120
129
pSrc += srcImage.rowPitch ;
121
130
pDest += img->rowPitch ;
@@ -128,7 +137,7 @@ static HRESULT _ConvertToRGBAF32( const Image& srcImage, ScratchImage& image )
128
137
// -------------------------------------------------------------------------------------
129
138
// Compress using GPU, converting to the proper input format for the shader if needed
130
139
// -------------------------------------------------------------------------------------
131
- inline static HRESULT _GPUCompress ( _In_ GPUCompressBC* gpubc, _In_ const Image& srcImage, _In_ const Image& destImage )
140
+ inline static HRESULT _GPUCompress ( _In_ GPUCompressBC* gpubc, _In_ const Image& srcImage, _In_ const Image& destImage, _In_ DWORD compress )
132
141
{
133
142
if ( !gpubc )
134
143
return E_POINTER;
@@ -148,18 +157,20 @@ inline static HRESULT _GPUCompress( _In_ GPUCompressBC* gpubc, _In_ const Image&
148
157
ScratchImage image;
149
158
HRESULT hr;
150
159
160
+ DWORD srgb = _GetSRGBFlags ( compress );
161
+
151
162
switch ( format )
152
163
{
153
164
case DXGI_FORMAT_R8G8B8A8_UNORM:
154
- hr = _ConvertToRGBA32 ( srcImage, image, false );
165
+ hr = _ConvertToRGBA32 ( srcImage, image, false , srgb );
155
166
break ;
156
167
157
168
case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
158
- hr = _ConvertToRGBA32 ( srcImage, image, true );
169
+ hr = _ConvertToRGBA32 ( srcImage, image, true , srgb );
159
170
break ;
160
171
161
172
case DXGI_FORMAT_R32G32B32A32_FLOAT:
162
- hr = _ConvertToRGBAF32 ( srcImage, image );
173
+ hr = _ConvertToRGBAF32 ( srcImage, image, srgb );
163
174
break ;
164
175
165
176
default :
@@ -187,7 +198,7 @@ inline static HRESULT _GPUCompress( _In_ GPUCompressBC* gpubc, _In_ const Image&
187
198
// Compression
188
199
// -------------------------------------------------------------------------------------
189
200
_Use_decl_annotations_
190
- HRESULT Compress ( ID3D11Device* pDevice, const Image& srcImage, DXGI_FORMAT format, ScratchImage& image )
201
+ HRESULT Compress ( ID3D11Device* pDevice, const Image& srcImage, DXGI_FORMAT format, DWORD compress, ScratchImage& image )
191
202
{
192
203
if ( !pDevice || IsCompressed (srcImage.format ) || !IsCompressed (format) || IsTypeless (format) )
193
204
return E_INVALIDARG;
@@ -217,7 +228,7 @@ HRESULT Compress( ID3D11Device* pDevice, const Image& srcImage, DXGI_FORMAT form
217
228
return E_POINTER;
218
229
}
219
230
220
- hr = _GPUCompress ( gpubc.get (), srcImage, *img );
231
+ hr = _GPUCompress ( gpubc.get (), srcImage, *img, compress );
221
232
if ( FAILED (hr) )
222
233
image.Release ();
223
234
@@ -226,7 +237,7 @@ HRESULT Compress( ID3D11Device* pDevice, const Image& srcImage, DXGI_FORMAT form
226
237
227
238
_Use_decl_annotations_
228
239
HRESULT Compress ( ID3D11Device* pDevice, const Image* srcImages, size_t nimages, const TexMetadata& metadata,
229
- DXGI_FORMAT format, ScratchImage& cImages )
240
+ DXGI_FORMAT format, DWORD compress, ScratchImage& cImages )
230
241
{
231
242
if ( !pDevice || !srcImages || !nimages )
232
243
return E_INVALIDARG;
@@ -302,7 +313,7 @@ HRESULT Compress( ID3D11Device* pDevice, const Image* srcImages, size_t nimages,
302
313
return E_FAIL;
303
314
}
304
315
305
- hr = _GPUCompress ( gpubc.get (), src, dest[ index ] );
316
+ hr = _GPUCompress ( gpubc.get (), src, dest[ index ], compress );
306
317
if ( FAILED (hr) )
307
318
{
308
319
cImages.Release ();
@@ -353,7 +364,7 @@ HRESULT Compress( ID3D11Device* pDevice, const Image* srcImages, size_t nimages,
353
364
return E_FAIL;
354
365
}
355
366
356
- hr = _GPUCompress ( gpubc.get (), src, dest[ index ] );
367
+ hr = _GPUCompress ( gpubc.get (), src, dest[ index ], compress );
357
368
if ( FAILED (hr) )
358
369
{
359
370
cImages.Release ();
0 commit comments