Nicolas Capens | 0bac285 | 2016-05-07 06:09:58 -0400 | [diff] [blame] | 1 | // Copyright 2016 The SwiftShader Authors. All Rights Reserved. |
Nicolas Capens | ee16f0d | 2015-07-16 17:40:10 -0400 | [diff] [blame] | 2 | // |
Nicolas Capens | 0bac285 | 2016-05-07 06:09:58 -0400 | [diff] [blame] | 3 | // 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 Capens | ee16f0d | 2015-07-16 17:40:10 -0400 | [diff] [blame] | 6 | // |
Nicolas Capens | 0bac285 | 2016-05-07 06:09:58 -0400 | [diff] [blame] | 7 | // http://www.apache.org/licenses/LICENSE-2.0 |
Nicolas Capens | ee16f0d | 2015-07-16 17:40:10 -0400 | [diff] [blame] | 8 | // |
Nicolas Capens | 0bac285 | 2016-05-07 06:09:58 -0400 | [diff] [blame] | 9 | // 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 Capens | ee16f0d | 2015-07-16 17:40:10 -0400 | [diff] [blame] | 14 | |
| 15 | #ifndef D3D9_Capabilities_hpp |
| 16 | #define D3D9_Capabilities_hpp |
| 17 | |
Nicolas Capens | ec0936c | 2016-05-18 12:32:02 -0400 | [diff] [blame] | 18 | #include "Config.hpp" |
Nicolas Capens | ec0936c | 2016-05-18 12:32:02 -0400 | [diff] [blame] | 19 | |
Nicolas Capens | ee16f0d | 2015-07-16 17:40:10 -0400 | [diff] [blame] | 20 | #include <d3d9.h> |
| 21 | |
| 22 | namespace 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 Capens | ec0936c | 2016-05-18 12:32:02 -0400 | [diff] [blame] | 470 | |
| 471 | enum |
| 472 | { |
| 473 | MAX_VERTEX_SHADER_CONST = 256, |
| 474 | MAX_PIXEL_SHADER_CONST = 224, |
Nicolas Capens | f0aef1a | 2016-05-18 14:44:21 -0400 | [diff] [blame] | 475 | MAX_VERTEX_INPUTS = 16, |
Nicolas Capens | ec0936c | 2016-05-18 12:32:02 -0400 | [diff] [blame] | 476 | MAX_VERTEX_OUTPUTS = 12, |
Nicolas Capens | 3b4c93f | 2016-05-18 12:51:37 -0400 | [diff] [blame] | 477 | MAX_PIXEL_INPUTS = 10, |
Nicolas Capens | ec0936c | 2016-05-18 12:32:02 -0400 | [diff] [blame] | 478 | }; |
| 479 | |
| 480 | // Shader Model 3.0 requirements |
Nicolas Capens | a26bade | 2016-05-27 13:19:49 -0400 | [diff] [blame] | 481 | 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 Capens | ec0936c | 2016-05-18 12:32:02 -0400 | [diff] [blame] | 486 | |
| 487 | // Back-end minimum requirements |
Nicolas Capens | a26bade | 2016-05-27 13:19:49 -0400 | [diff] [blame] | 488 | 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 Capens | ee16f0d | 2015-07-16 17:40:10 -0400 | [diff] [blame] | 493 | } |
| 494 | |
| 495 | #endif // D3D9_Capabilities_hpp |