]> git.cworth.org Git - apitrace/blob - retrace/dxgistate.cpp
Remove the last helper for the old incomplete attrib_list support.
[apitrace] / retrace / dxgistate.cpp
1 /**************************************************************************
2  *
3  * Copyright 2013 VMware, Inc.
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  *
24  **************************************************************************/
25
26
27 #include <assert.h>
28
29 #include "image.hpp"
30
31 #include "dxgistate.hpp"
32
33 #ifdef __MINGW32__
34 #define nullptr NULL
35 #endif
36 #include "DirectXTex.h"
37
38
39 namespace d3dstate {
40
41
42 static DXGI_FORMAT
43 ChooseConversionFormat(DXGI_FORMAT Format)
44 {
45     switch (Format) {
46
47     // Float
48     case DXGI_FORMAT_R32G32B32A32_FLOAT:
49     case DXGI_FORMAT_R32G32B32_FLOAT:
50     case DXGI_FORMAT_R16G16B16A16_FLOAT:
51     case DXGI_FORMAT_R32G32_FLOAT:
52     case DXGI_FORMAT_R11G11B10_FLOAT:
53     case DXGI_FORMAT_R16G16_FLOAT:
54     case DXGI_FORMAT_R32_FLOAT:
55     case DXGI_FORMAT_R16_FLOAT:
56     case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
57     case DXGI_FORMAT_BC6H_UF16:
58     case DXGI_FORMAT_BC6H_SF16:
59         return DXGI_FORMAT_R8G8B8A8_UNORM;
60
61     // Unsigned normalized
62     case DXGI_FORMAT_R16G16B16A16_UNORM:
63     case DXGI_FORMAT_R10G10B10A2_UNORM:
64     case DXGI_FORMAT_R8G8B8A8_UNORM:
65     case DXGI_FORMAT_R16G16_UNORM:
66     case DXGI_FORMAT_R8G8_UNORM:
67     case DXGI_FORMAT_R16_UNORM:
68     case DXGI_FORMAT_R8_UNORM:
69     case DXGI_FORMAT_A8_UNORM:
70     case DXGI_FORMAT_R1_UNORM:
71     case DXGI_FORMAT_R8G8_B8G8_UNORM:
72     case DXGI_FORMAT_G8R8_G8B8_UNORM:
73     case DXGI_FORMAT_BC1_UNORM:
74     case DXGI_FORMAT_BC2_UNORM:
75     case DXGI_FORMAT_BC3_UNORM:
76     case DXGI_FORMAT_BC4_UNORM:
77     case DXGI_FORMAT_BC5_UNORM:
78     case DXGI_FORMAT_B5G6R5_UNORM:
79     case DXGI_FORMAT_B5G5R5A1_UNORM:
80     case DXGI_FORMAT_B8G8R8A8_UNORM:
81     case DXGI_FORMAT_B8G8R8X8_UNORM:
82     case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
83     case DXGI_FORMAT_BC7_UNORM:
84         return DXGI_FORMAT_R8G8B8A8_UNORM;
85
86     // SRGB
87     case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
88     case DXGI_FORMAT_BC1_UNORM_SRGB:
89     case DXGI_FORMAT_BC2_UNORM_SRGB:
90     case DXGI_FORMAT_BC3_UNORM_SRGB:
91     case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
92     case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
93     case DXGI_FORMAT_BC7_UNORM_SRGB:
94         return DXGI_FORMAT_R8G8B8A8_UNORM;
95
96     // Signed normalized
97     case DXGI_FORMAT_R16G16B16A16_SNORM:
98     case DXGI_FORMAT_R8G8B8A8_SNORM:
99     case DXGI_FORMAT_R16G16_SNORM:
100     case DXGI_FORMAT_R8G8_SNORM:
101     case DXGI_FORMAT_R16_SNORM:
102     case DXGI_FORMAT_R8_SNORM:
103     case DXGI_FORMAT_BC4_SNORM:
104     case DXGI_FORMAT_BC5_SNORM:
105         return DXGI_FORMAT_R8G8B8A8_SNORM;
106
107     // Unsigned
108     case DXGI_FORMAT_R32G32B32A32_UINT:
109     case DXGI_FORMAT_R32G32B32_UINT:
110     case DXGI_FORMAT_R16G16B16A16_UINT:
111     case DXGI_FORMAT_R32G32_UINT:
112     case DXGI_FORMAT_R10G10B10A2_UINT:
113     case DXGI_FORMAT_R8G8B8A8_UINT:
114     case DXGI_FORMAT_R16G16_UINT:
115     case DXGI_FORMAT_R32_UINT:
116     case DXGI_FORMAT_R8G8_UINT:
117     case DXGI_FORMAT_R16_UINT:
118     case DXGI_FORMAT_R8_UINT:
119         return DXGI_FORMAT_R8G8B8A8_UINT;
120
121     // Signed
122     case DXGI_FORMAT_R32G32B32A32_SINT:
123     case DXGI_FORMAT_R32G32B32_SINT:
124     case DXGI_FORMAT_R16G16B16A16_SINT:
125     case DXGI_FORMAT_R32G32_SINT:
126     case DXGI_FORMAT_R8G8B8A8_SINT:
127     case DXGI_FORMAT_R16G16_SINT:
128     case DXGI_FORMAT_R32_SINT:
129     case DXGI_FORMAT_R8G8_SINT:
130     case DXGI_FORMAT_R16_SINT:
131     case DXGI_FORMAT_R8_SINT:
132         return DXGI_FORMAT_R8G8B8A8_SINT;
133
134     // Depth
135     case DXGI_FORMAT_D32_FLOAT:
136     case DXGI_FORMAT_D24_UNORM_S8_UINT:
137     case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
138     case DXGI_FORMAT_D16_UNORM:
139         return DXGI_FORMAT_R8G8B8A8_UNORM;
140
141     // Typeless
142     case DXGI_FORMAT_UNKNOWN:
143     case DXGI_FORMAT_R32G32B32A32_TYPELESS:
144     case DXGI_FORMAT_R32G32B32_TYPELESS:
145     case DXGI_FORMAT_R16G16B16A16_TYPELESS:
146     case DXGI_FORMAT_R32G32_TYPELESS:
147     case DXGI_FORMAT_R32G8X24_TYPELESS:
148     case DXGI_FORMAT_R10G10B10A2_TYPELESS:
149     case DXGI_FORMAT_R8G8B8A8_TYPELESS:
150     case DXGI_FORMAT_R16G16_TYPELESS:
151     case DXGI_FORMAT_R32_TYPELESS:
152     case DXGI_FORMAT_R8G8_TYPELESS:
153     case DXGI_FORMAT_R16_TYPELESS:
154     case DXGI_FORMAT_R8_TYPELESS:
155     case DXGI_FORMAT_BC1_TYPELESS:
156     case DXGI_FORMAT_BC2_TYPELESS:
157     case DXGI_FORMAT_BC3_TYPELESS:
158     case DXGI_FORMAT_BC4_TYPELESS:
159     case DXGI_FORMAT_BC5_TYPELESS:
160     case DXGI_FORMAT_B8G8R8A8_TYPELESS:
161     case DXGI_FORMAT_B8G8R8X8_TYPELESS:
162     case DXGI_FORMAT_BC6H_TYPELESS:
163     case DXGI_FORMAT_BC7_TYPELESS:
164     case DXGI_FORMAT_R24G8_TYPELESS:
165     case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
166     case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
167     case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
168     case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
169         return DXGI_FORMAT_UNKNOWN;
170
171     default:
172         return DXGI_FORMAT_R8G8B8A8_UNORM;
173     }
174 }
175
176
177 /**
178  * Convert between DXGI formats.
179  *
180  */
181 HRESULT
182 ConvertFormat(DXGI_FORMAT SrcFormat,
183               void *SrcData,
184               UINT SrcPitch,
185               DXGI_FORMAT DstFormat,
186               void *DstData,
187               UINT DstPitch,
188               UINT Width, UINT Height)
189 {
190     HRESULT hr;
191
192     DirectX::Image SrcImage;
193     DirectX::Image DstImage;
194
195     SrcImage.width = Width;
196     SrcImage.height = Height;
197     SrcImage.format = SrcFormat;
198     SrcImage.rowPitch = SrcPitch;
199     SrcImage.slicePitch = Height * SrcPitch;
200     SrcImage.pixels = (uint8_t*)SrcData;
201
202     DstImage.width = Width;
203     DstImage.height = Height;
204     DstImage.format = DstFormat;
205     DstImage.rowPitch = DstPitch;
206     DstImage.slicePitch = Height * DstPitch;
207     DstImage.pixels = (uint8_t*)DstData;
208
209     DirectX::Rect rect(0, 0, Width, Height);
210
211     hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
212     assert(SUCCEEDED(hr));
213     if (FAILED(hr)) {
214         return hr;
215     }
216
217     if (SrcFormat != DstFormat) {
218         DirectX::ScratchImage ScratchImage;
219         ScratchImage.Initialize2D(DstFormat, Width, Height, 1, 1);
220
221         hr = DirectX::Convert(SrcImage, DstFormat, DirectX::TEX_FILTER_DEFAULT, 0.0f, ScratchImage);
222         if (SUCCEEDED(hr)) {
223             hr = CopyRectangle(*ScratchImage.GetImage(0, 0, 0), rect, DstImage, DirectX::TEX_FILTER_DEFAULT, 0, 0);
224         }
225     } else {
226         hr = CopyRectangle(SrcImage, rect, DstImage, DirectX::TEX_FILTER_DEFAULT, 0, 0);
227     }
228
229     return hr;
230 }
231
232
233 image::Image *
234 ConvertImage(DXGI_FORMAT SrcFormat,
235              void *SrcData,
236              UINT SrcPitch,
237              UINT Width, UINT Height)
238 {
239
240     DXGI_FORMAT DstFormat = ChooseConversionFormat(SrcFormat);
241     if (DstFormat == DXGI_FORMAT_UNKNOWN) {
242         return NULL;
243     }
244
245     image::Image *image = new image::Image(Width, Height, 4);
246     if (!image) {
247         return NULL;
248     }
249     assert(image->stride() > 0);
250
251     HRESULT hr;
252     hr = ConvertFormat(SrcFormat,
253                        SrcData, SrcPitch,
254                        DstFormat,
255                        image->start(), image->stride(),
256                        Width, Height);
257     if (FAILED(hr)) {
258         delete image;
259         image = NULL;
260     }
261
262     return image;
263 }
264
265 } /* namespace d3dstate */