blob: 27bf193713d1b71e609dbd428c2459b139d3a8a2 [file] [log] [blame]
Nicolas Capens0bac2852016-05-07 06:09:58 -04001// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
Nicolas Capensee16f0d2015-07-16 17:40:10 -04002//
Nicolas Capens0bac2852016-05-07 06:09:58 -04003// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
Nicolas Capensee16f0d2015-07-16 17:40:10 -04006//
Nicolas Capens0bac2852016-05-07 06:09:58 -04007// http://www.apache.org/licenses/LICENSE-2.0
Nicolas Capensee16f0d2015-07-16 17:40:10 -04008//
Nicolas Capens0bac2852016-05-07 06:09:58 -04009// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
Nicolas Capensee16f0d2015-07-16 17:40:10 -040014
15#ifndef D3D9_Capabilities_hpp
16#define D3D9_Capabilities_hpp
17
Nicolas Capensec0936c2016-05-18 12:32:02 -040018#include "Config.hpp"
Nicolas Capensec0936c2016-05-18 12:32:02 -040019
Nicolas Capensee16f0d2015-07-16 17:40:10 -040020#include <d3d9.h>
21
22namespace D3D9
23{
24 enum
25 {
26 D3DFMT_ATI1 = MAKEFOURCC('A', 'T', 'I', '1'),
27 D3DFMT_ATI2 = MAKEFOURCC('A', 'T', 'I', '2'),
28 D3DFMT_INST = MAKEFOURCC('I', 'N', 'S', 'T'),
29 D3DFMT_DF24 = MAKEFOURCC('D', 'F', '2', '4'),
30 D3DFMT_DF16 = MAKEFOURCC('D', 'F', '1', '6'),
31 D3DFMT_NULL = MAKEFOURCC('N', 'U', 'L', 'L'),
32 D3DFMT_GET4 = MAKEFOURCC('G', 'E', 'T', '4'),
33 D3DFMT_GET1 = MAKEFOURCC('G', 'E', 'T', '1'),
34 D3DFMT_NVDB = MAKEFOURCC('N', 'V', 'D', 'B'),
35 D3DFMT_A2M1 = MAKEFOURCC('A', '2', 'M', '1'),
36 D3DFMT_A2M0 = MAKEFOURCC('A', '2', 'M', '0'),
37 D3DFMT_ATOC = MAKEFOURCC('A', 'T', 'O', 'C'),
38 D3DFMT_INTZ = MAKEFOURCC('I', 'N', 'T', 'Z')
39 };
40
41 struct Capabilities
42 {
43 struct Surface
44 {
45 struct RenderTarget
46 {
47 static bool NULL_;
48 static bool R8G8B8;
49 static bool R5G6B5;
50 static bool X1R5G5B5;
51 static bool A1R5G5B5;
52 static bool A4R4G4B4;
53 static bool R3G3B2;
54 static bool A8R3G3B2;
55 static bool X4R4G4B4;
56 static bool A8R8G8B8;
57 static bool X8R8G8B8;
58 static bool A8B8G8R8;
59 static bool X8B8G8R8;
60 // Integer HDR formats
61 static bool G16R16;
62 static bool A2B10G10R10;
63 static bool A2R10G10B10;
64 static bool A16B16G16R16;
65 // Floating-point formats
66 static bool R16F;
67 static bool G16R16F;
68 static bool A16B16G16R16F;
69 static bool R32F;
70 static bool G32R32F;
71 static bool A32B32G32R32F;
72 };
73
74 struct DepthStencil
75 {
76 static bool D32;
77 static bool D24S8;
78 static bool D24X8;
79 static bool D16;
80 static bool D24FS8;
81 static bool D32F_LOCKABLE;
82 static bool DF24;
83 static bool DF16;
84 static bool INTZ;
85 };
86
87 static bool A8;
88 static bool R5G6B5;
89 static bool X1R5G5B5;
90 static bool A1R5G5B5;
91 static bool A4R4G4B4;
92 static bool R3G3B2;
93 static bool A8R3G3B2;
94 static bool X4R4G4B4;
95 static bool R8G8B8;
96 static bool X8R8G8B8;
97 static bool A8R8G8B8;
98 static bool A8B8G8R8;
99 static bool X8B8G8R8;
100 // Paletted formats
101 static bool P8;
102 static bool A8P8;
103 // Integer HDR formats
104 static bool G16R16;
105 static bool A2R10G10B10;
106 static bool A2B10G10R10;
107 static bool A16B16G16R16;
108 // Compressed formats
109 static bool DXT1;
110 static bool DXT2;
111 static bool DXT3;
112 static bool DXT4;
113 static bool DXT5;
114 static bool ATI1;
115 static bool ATI2;
116 // Floating-point formats
117 static bool R16F;
118 static bool G16R16F;
119 static bool A16B16G16R16F;
120 static bool R32F;
121 static bool G32R32F;
122 static bool A32B32G32R32F;
123 // Bump map formats
124 static bool V8U8;
125 static bool L6V5U5;
126 static bool X8L8V8U8;
127 static bool Q8W8V8U8;
128 static bool V16U16;
129 static bool A2W10V10U10;
130 static bool Q16W16V16U16;
131 // Luminance formats
132 static bool L8;
133 static bool A4L4;
134 static bool L16;
135 static bool A8L8;
136 // Depth Bounds Test
137 static bool NVDB;
138 // Transparency anti-aliasing
139 static bool ATOC;
140 };
141
142 struct Volume
143 {
144 static bool A8;
145 static bool R5G6B5;
146 static bool X1R5G5B5;
147 static bool A1R5G5B5;
148 static bool A4R4G4B4;
149 static bool R3G3B2;
150 static bool A8R3G3B2;
151 static bool X4R4G4B4;
152 static bool R8G8B8;
153 static bool X8R8G8B8;
154 static bool A8R8G8B8;
155 static bool A8B8G8R8;
156 static bool X8B8G8R8;
157 // Paletted formats
158 static bool P8;
159 static bool A8P8;
160 // Integer HDR formats
161 static bool G16R16;
162 static bool A2R10G10B10;
163 static bool A2B10G10R10;
164 static bool A16B16G16R16;
165 // Compressed formats
166 static bool DXT1;
167 static bool DXT2;
168 static bool DXT3;
169 static bool DXT4;
170 static bool DXT5;
171 static bool ATI1;
172 static bool ATI2;
173 // Floating-point formats
174 static bool R16F;
175 static bool G16R16F;
176 static bool A16B16G16R16F;
177 static bool R32F;
178 static bool G32R32F;
179 static bool A32B32G32R32F;
180 // Bump map formats
181 static bool V8U8;
182 static bool L6V5U5;
183 static bool X8L8V8U8;
184 static bool Q8W8V8U8;
185 static bool V16U16;
186 static bool A2W10V10U10;
187 static bool Q16W16V16U16;
188 // Luminance formats
189 static bool L8;
190 static bool A4L4;
191 static bool L16;
192 static bool A8L8;
193 };
194
195 struct CubeMap
196 {
197 struct RenderTarget
198 {
199 static bool NULL_;
200 static bool R8G8B8;
201 static bool R5G6B5;
202 static bool X1R5G5B5;
203 static bool A1R5G5B5;
204 static bool A4R4G4B4;
205 static bool R3G3B2;
206 static bool A8R3G3B2;
207 static bool X4R4G4B4;
208 static bool A8R8G8B8;
209 static bool X8R8G8B8;
210 static bool A8B8G8R8;
211 static bool X8B8G8R8;
212 // Integer HDR formats
213 static bool G16R16;
214 static bool A2B10G10R10;
215 static bool A2R10G10B10;
216 static bool A16B16G16R16;
217 // Floating-point formats
218 static bool R16F;
219 static bool G16R16F;
220 static bool A16B16G16R16F;
221 static bool R32F;
222 static bool G32R32F;
223 static bool A32B32G32R32F;
224 };
225
226 struct DepthStencil
227 {
228 static bool D32;
229 static bool D24S8;
230 static bool D24X8;
231 static bool D16;
232 static bool D24FS8;
233 static bool D32F_LOCKABLE;
234 static bool DF24;
235 static bool DF16;
236 static bool INTZ;
237 };
238
239 static bool A8;
240 static bool R5G6B5;
241 static bool X1R5G5B5;
242 static bool A1R5G5B5;
243 static bool A4R4G4B4;
244 static bool R3G3B2;
245 static bool A8R3G3B2;
246 static bool X4R4G4B4;
247 static bool R8G8B8;
248 static bool X8R8G8B8;
249 static bool A8R8G8B8;
250 static bool A8B8G8R8;
251 static bool X8B8G8R8;
252 // Paletted formats
253 static bool P8;
254 static bool A8P8;
255 // Integer HDR formats
256 static bool G16R16;
257 static bool A2R10G10B10;
258 static bool A2B10G10R10;
259 static bool A16B16G16R16;
260 // Compressed formats
261 static bool DXT1;
262 static bool DXT2;
263 static bool DXT3;
264 static bool DXT4;
265 static bool DXT5;
266 static bool ATI1;
267 static bool ATI2;
268 // Floating-point formats
269 static bool R16F;
270 static bool G16R16F;
271 static bool A16B16G16R16F;
272 static bool R32F;
273 static bool G32R32F;
274 static bool A32B32G32R32F;
275 // Bump map formats
276 static bool V8U8;
277 static bool L6V5U5;
278 static bool X8L8V8U8;
279 static bool Q8W8V8U8;
280 static bool V16U16;
281 static bool A2W10V10U10;
282 static bool Q16W16V16U16;
283 // Luminance formats
284 static bool L8;
285 static bool A4L4;
286 static bool L16;
287 static bool A8L8;
288 };
289
290 struct VolumeTexture
291 {
292 static bool A8;
293 static bool R5G6B5;
294 static bool X1R5G5B5;
295 static bool A1R5G5B5;
296 static bool A4R4G4B4;
297 static bool R3G3B2;
298 static bool A8R3G3B2;
299 static bool X4R4G4B4;
300 static bool R8G8B8;
301 static bool X8R8G8B8;
302 static bool A8R8G8B8;
303 static bool A8B8G8R8;
304 static bool X8B8G8R8;
305 // Paletted formats
306 static bool P8;
307 static bool A8P8;
308 // Integer HDR formats
309 static bool G16R16;
310 static bool A2R10G10B10;
311 static bool A2B10G10R10;
312 static bool A16B16G16R16;
313 // Compressed formats
314 static bool DXT1;
315 static bool DXT2;
316 static bool DXT3;
317 static bool DXT4;
318 static bool DXT5;
319 static bool ATI1;
320 static bool ATI2;
321 // Floating-point formats
322 static bool R16F;
323 static bool G16R16F;
324 static bool A16B16G16R16F;
325 static bool R32F;
326 static bool G32R32F;
327 static bool A32B32G32R32F;
328 // Bump map formats
329 static bool V8U8;
330 static bool L6V5U5;
331 static bool X8L8V8U8;
332 static bool Q8W8V8U8;
333 static bool V16U16;
334 static bool A2W10V10U10;
335 static bool Q16W16V16U16;
336 // Luminance formats
337 static bool L8;
338 static bool A4L4;
339 static bool L16;
340 static bool A8L8;
341 };
342
343 struct Texture
344 {
345 struct RenderTarget
346 {
347 static bool NULL_;
348 static bool R8G8B8;
349 static bool R5G6B5;
350 static bool X1R5G5B5;
351 static bool A1R5G5B5;
352 static bool A4R4G4B4;
353 static bool R3G3B2;
354 static bool A8R3G3B2;
355 static bool X4R4G4B4;
356 static bool A8R8G8B8;
357 static bool X8R8G8B8;
358 static bool A8B8G8R8;
359 static bool X8B8G8R8;
360 // Integer HDR formats
361 static bool G16R16;
362 static bool A2B10G10R10;
363 static bool A2R10G10B10;
364 static bool A16B16G16R16;
365 // Floating-point formats
366 static bool R16F;
367 static bool G16R16F;
368 static bool A16B16G16R16F;
369 static bool R32F;
370 static bool G32R32F;
371 static bool A32B32G32R32F;
372 };
373
374 struct DepthStencil
375 {
376 static bool D32;
377 static bool D24S8;
378 static bool D24X8;
379 static bool D16;
380 static bool D24FS8;
381 static bool D32F_LOCKABLE;
382 static bool DF24;
383 static bool DF16;
384 static bool INTZ;
385 };
386
387 static bool NULL_;
388 static bool A8;
389 static bool R5G6B5;
390 static bool X1R5G5B5;
391 static bool A1R5G5B5;
392 static bool A4R4G4B4;
393 static bool R3G3B2;
394 static bool A8R3G3B2;
395 static bool X4R4G4B4;
396 static bool R8G8B8;
397 static bool X8R8G8B8;
398 static bool A8R8G8B8;
399 static bool A8B8G8R8;
400 static bool X8B8G8R8;
401 // Paletted formats
402 static bool P8;
403 static bool A8P8;
404 // Integer HDR formats
405 static bool G16R16;
406 static bool A2R10G10B10;
407 static bool A2B10G10R10;
408 static bool A16B16G16R16;
409 // Compressed formats
410 static bool DXT1;
411 static bool DXT2;
412 static bool DXT3;
413 static bool DXT4;
414 static bool DXT5;
415 static bool ATI1;
416 static bool ATI2;
417 // Floating-point formats
418 static bool R16F;
419 static bool G16R16F;
420 static bool A16B16G16R16F;
421 static bool R32F;
422 static bool G32R32F;
423 static bool A32B32G32R32F;
424 // Bump map formats
425 static bool V8U8;
426 static bool L6V5U5;
427 static bool X8L8V8U8;
428 static bool Q8W8V8U8;
429 static bool V16U16;
430 static bool A2W10V10U10;
431 static bool Q16W16V16U16;
432 // Luminance formats
433 static bool L8;
434 static bool A4L4;
435 static bool L16;
436 static bool A8L8;
437 // Depth formats
438 static bool D32;
439 static bool D24S8;
440 static bool D24X8;
441 static bool D16;
442 static bool D24FS8;
443 static bool D32F_LOCKABLE;
444 static bool DF24;
445 static bool DF16;
446 static bool INTZ;
447 };
448
449 static bool isSRGBreadable(D3DFORMAT format);
450 static bool isSRGBwritable(D3DFORMAT format);
451 };
452
453 extern unsigned int pixelShaderVersionX;
454 extern unsigned int vertexShaderVersionX;
455
456 extern unsigned long pixelShaderArbitrarySwizzle;
457 extern unsigned long pixelShaderGradientInstructions;
458 extern unsigned long pixelShaderPredication;
459 extern unsigned long pixelShaderNoDependentReadLimit;
460 extern unsigned long pixelShaderNoTexInstructionLimit;
461
462 extern unsigned long pixelShaderDynamicFlowControlDepth;
463 extern unsigned long pixelShaderStaticFlowControlDepth;
464
465 extern unsigned long vertexShaderPredication;
466 extern unsigned long vertexShaderDynamicFlowControlDepth;
467
468 extern unsigned int textureMemory;
469 extern unsigned int maxAnisotropy;
Nicolas Capensec0936c2016-05-18 12:32:02 -0400470
471 enum
472 {
473 MAX_VERTEX_SHADER_CONST = 256,
474 MAX_PIXEL_SHADER_CONST = 224,
Nicolas Capensf0aef1a2016-05-18 14:44:21 -0400475 MAX_VERTEX_INPUTS = 16,
Nicolas Capensec0936c2016-05-18 12:32:02 -0400476 MAX_VERTEX_OUTPUTS = 12,
Nicolas Capens3b4c93f2016-05-18 12:51:37 -0400477 MAX_PIXEL_INPUTS = 10,
Nicolas Capensec0936c2016-05-18 12:32:02 -0400478 };
479
480 // Shader Model 3.0 requirements
Nicolas Capensa26bade2016-05-27 13:19:49 -0400481 static_assert(MAX_VERTEX_SHADER_CONST >= 256, "");
482 static_assert(MAX_PIXEL_SHADER_CONST == 224, "");
483 static_assert(MAX_VERTEX_INPUTS == 16, "");
484 static_assert(MAX_VERTEX_OUTPUTS == 12, "");
485 static_assert(MAX_PIXEL_INPUTS == 10, "");
Nicolas Capensec0936c2016-05-18 12:32:02 -0400486
487 // Back-end minimum requirements
Nicolas Capensa26bade2016-05-27 13:19:49 -0400488 static_assert(sw::VERTEX_UNIFORM_VECTORS >= MAX_VERTEX_SHADER_CONST, "");
489 static_assert(sw::FRAGMENT_UNIFORM_VECTORS >= MAX_PIXEL_SHADER_CONST, "");
490 static_assert(sw::MAX_VERTEX_INPUTS >= MAX_VERTEX_INPUTS, "");
491 static_assert(sw::MAX_VERTEX_OUTPUTS >= MAX_VERTEX_OUTPUTS, "");
492 static_assert(sw::MAX_FRAGMENT_INPUTS >= MAX_PIXEL_INPUTS, "");
Nicolas Capensee16f0d2015-07-16 17:40:10 -0400493}
494
495#endif // D3D9_Capabilities_hpp