1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/angle/src/libGLESv2/renderer/renderer11_utils.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,688 @@ 1.4 +#include "precompiled.h" 1.5 +// 1.6 +// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. 1.7 +// Use of this source code is governed by a BSD-style license that can be 1.8 +// found in the LICENSE file. 1.9 +// 1.10 + 1.11 +// renderer11_utils.cpp: Conversion functions and other utility routines 1.12 +// specific to the D3D11 renderer. 1.13 + 1.14 +#include "libGLESv2/renderer/renderer11_utils.h" 1.15 + 1.16 +#include "common/debug.h" 1.17 + 1.18 +namespace gl_d3d11 1.19 +{ 1.20 + 1.21 +D3D11_BLEND ConvertBlendFunc(GLenum glBlend, bool isAlpha) 1.22 +{ 1.23 + D3D11_BLEND d3dBlend = D3D11_BLEND_ZERO; 1.24 + 1.25 + switch (glBlend) 1.26 + { 1.27 + case GL_ZERO: d3dBlend = D3D11_BLEND_ZERO; break; 1.28 + case GL_ONE: d3dBlend = D3D11_BLEND_ONE; break; 1.29 + case GL_SRC_COLOR: d3dBlend = (isAlpha ? D3D11_BLEND_SRC_ALPHA : D3D11_BLEND_SRC_COLOR); break; 1.30 + case GL_ONE_MINUS_SRC_COLOR: d3dBlend = (isAlpha ? D3D11_BLEND_INV_SRC_ALPHA : D3D11_BLEND_INV_SRC_COLOR); break; 1.31 + case GL_DST_COLOR: d3dBlend = (isAlpha ? D3D11_BLEND_DEST_ALPHA : D3D11_BLEND_DEST_COLOR); break; 1.32 + case GL_ONE_MINUS_DST_COLOR: d3dBlend = (isAlpha ? D3D11_BLEND_INV_DEST_ALPHA : D3D11_BLEND_INV_DEST_COLOR); break; 1.33 + case GL_SRC_ALPHA: d3dBlend = D3D11_BLEND_SRC_ALPHA; break; 1.34 + case GL_ONE_MINUS_SRC_ALPHA: d3dBlend = D3D11_BLEND_INV_SRC_ALPHA; break; 1.35 + case GL_DST_ALPHA: d3dBlend = D3D11_BLEND_DEST_ALPHA; break; 1.36 + case GL_ONE_MINUS_DST_ALPHA: d3dBlend = D3D11_BLEND_INV_DEST_ALPHA; break; 1.37 + case GL_CONSTANT_COLOR: d3dBlend = D3D11_BLEND_BLEND_FACTOR; break; 1.38 + case GL_ONE_MINUS_CONSTANT_COLOR: d3dBlend = D3D11_BLEND_INV_BLEND_FACTOR; break; 1.39 + case GL_CONSTANT_ALPHA: d3dBlend = D3D11_BLEND_BLEND_FACTOR; break; 1.40 + case GL_ONE_MINUS_CONSTANT_ALPHA: d3dBlend = D3D11_BLEND_INV_BLEND_FACTOR; break; 1.41 + case GL_SRC_ALPHA_SATURATE: d3dBlend = D3D11_BLEND_SRC_ALPHA_SAT; break; 1.42 + default: UNREACHABLE(); 1.43 + } 1.44 + 1.45 + return d3dBlend; 1.46 +} 1.47 + 1.48 +D3D11_BLEND_OP ConvertBlendOp(GLenum glBlendOp) 1.49 +{ 1.50 + D3D11_BLEND_OP d3dBlendOp = D3D11_BLEND_OP_ADD; 1.51 + 1.52 + switch (glBlendOp) 1.53 + { 1.54 + case GL_FUNC_ADD: d3dBlendOp = D3D11_BLEND_OP_ADD; break; 1.55 + case GL_FUNC_SUBTRACT: d3dBlendOp = D3D11_BLEND_OP_SUBTRACT; break; 1.56 + case GL_FUNC_REVERSE_SUBTRACT: d3dBlendOp = D3D11_BLEND_OP_REV_SUBTRACT; break; 1.57 + default: UNREACHABLE(); 1.58 + } 1.59 + 1.60 + return d3dBlendOp; 1.61 +} 1.62 + 1.63 +UINT8 ConvertColorMask(bool red, bool green, bool blue, bool alpha) 1.64 +{ 1.65 + UINT8 mask = 0; 1.66 + if (red) 1.67 + { 1.68 + mask |= D3D11_COLOR_WRITE_ENABLE_RED; 1.69 + } 1.70 + if (green) 1.71 + { 1.72 + mask |= D3D11_COLOR_WRITE_ENABLE_GREEN; 1.73 + } 1.74 + if (blue) 1.75 + { 1.76 + mask |= D3D11_COLOR_WRITE_ENABLE_BLUE; 1.77 + } 1.78 + if (alpha) 1.79 + { 1.80 + mask |= D3D11_COLOR_WRITE_ENABLE_ALPHA; 1.81 + } 1.82 + return mask; 1.83 +} 1.84 + 1.85 +D3D11_CULL_MODE ConvertCullMode(bool cullEnabled, GLenum cullMode) 1.86 +{ 1.87 + D3D11_CULL_MODE cull = D3D11_CULL_NONE; 1.88 + 1.89 + if (cullEnabled) 1.90 + { 1.91 + switch (cullMode) 1.92 + { 1.93 + case GL_FRONT: cull = D3D11_CULL_FRONT; break; 1.94 + case GL_BACK: cull = D3D11_CULL_BACK; break; 1.95 + case GL_FRONT_AND_BACK: cull = D3D11_CULL_NONE; break; 1.96 + default: UNREACHABLE(); 1.97 + } 1.98 + } 1.99 + else 1.100 + { 1.101 + cull = D3D11_CULL_NONE; 1.102 + } 1.103 + 1.104 + return cull; 1.105 +} 1.106 + 1.107 +D3D11_COMPARISON_FUNC ConvertComparison(GLenum comparison) 1.108 +{ 1.109 + D3D11_COMPARISON_FUNC d3dComp = D3D11_COMPARISON_NEVER; 1.110 + switch (comparison) 1.111 + { 1.112 + case GL_NEVER: d3dComp = D3D11_COMPARISON_NEVER; break; 1.113 + case GL_ALWAYS: d3dComp = D3D11_COMPARISON_ALWAYS; break; 1.114 + case GL_LESS: d3dComp = D3D11_COMPARISON_LESS; break; 1.115 + case GL_LEQUAL: d3dComp = D3D11_COMPARISON_LESS_EQUAL; break; 1.116 + case GL_EQUAL: d3dComp = D3D11_COMPARISON_EQUAL; break; 1.117 + case GL_GREATER: d3dComp = D3D11_COMPARISON_GREATER; break; 1.118 + case GL_GEQUAL: d3dComp = D3D11_COMPARISON_GREATER_EQUAL; break; 1.119 + case GL_NOTEQUAL: d3dComp = D3D11_COMPARISON_NOT_EQUAL; break; 1.120 + default: UNREACHABLE(); 1.121 + } 1.122 + 1.123 + return d3dComp; 1.124 +} 1.125 + 1.126 +D3D11_DEPTH_WRITE_MASK ConvertDepthMask(bool depthWriteEnabled) 1.127 +{ 1.128 + return depthWriteEnabled ? D3D11_DEPTH_WRITE_MASK_ALL : D3D11_DEPTH_WRITE_MASK_ZERO; 1.129 +} 1.130 + 1.131 +UINT8 ConvertStencilMask(GLuint stencilmask) 1.132 +{ 1.133 + return static_cast<UINT8>(stencilmask); 1.134 +} 1.135 + 1.136 +D3D11_STENCIL_OP ConvertStencilOp(GLenum stencilOp) 1.137 +{ 1.138 + D3D11_STENCIL_OP d3dStencilOp = D3D11_STENCIL_OP_KEEP; 1.139 + 1.140 + switch (stencilOp) 1.141 + { 1.142 + case GL_ZERO: d3dStencilOp = D3D11_STENCIL_OP_ZERO; break; 1.143 + case GL_KEEP: d3dStencilOp = D3D11_STENCIL_OP_KEEP; break; 1.144 + case GL_REPLACE: d3dStencilOp = D3D11_STENCIL_OP_REPLACE; break; 1.145 + case GL_INCR: d3dStencilOp = D3D11_STENCIL_OP_INCR_SAT; break; 1.146 + case GL_DECR: d3dStencilOp = D3D11_STENCIL_OP_DECR_SAT; break; 1.147 + case GL_INVERT: d3dStencilOp = D3D11_STENCIL_OP_INVERT; break; 1.148 + case GL_INCR_WRAP: d3dStencilOp = D3D11_STENCIL_OP_INCR; break; 1.149 + case GL_DECR_WRAP: d3dStencilOp = D3D11_STENCIL_OP_DECR; break; 1.150 + default: UNREACHABLE(); 1.151 + } 1.152 + 1.153 + return d3dStencilOp; 1.154 +} 1.155 + 1.156 +D3D11_FILTER ConvertFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy) 1.157 +{ 1.158 + if (maxAnisotropy > 1.0f) 1.159 + { 1.160 + return D3D11_ENCODE_ANISOTROPIC_FILTER(false); 1.161 + } 1.162 + else 1.163 + { 1.164 + D3D11_FILTER_TYPE dxMin = D3D11_FILTER_TYPE_POINT; 1.165 + D3D11_FILTER_TYPE dxMip = D3D11_FILTER_TYPE_POINT; 1.166 + switch (minFilter) 1.167 + { 1.168 + case GL_NEAREST: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_POINT; break; 1.169 + case GL_LINEAR: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_POINT; break; 1.170 + case GL_NEAREST_MIPMAP_NEAREST: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_POINT; break; 1.171 + case GL_LINEAR_MIPMAP_NEAREST: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_POINT; break; 1.172 + case GL_NEAREST_MIPMAP_LINEAR: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_LINEAR; break; 1.173 + case GL_LINEAR_MIPMAP_LINEAR: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_LINEAR; break; 1.174 + default: UNREACHABLE(); 1.175 + } 1.176 + 1.177 + D3D11_FILTER_TYPE dxMag = D3D11_FILTER_TYPE_POINT; 1.178 + switch (magFilter) 1.179 + { 1.180 + case GL_NEAREST: dxMag = D3D11_FILTER_TYPE_POINT; break; 1.181 + case GL_LINEAR: dxMag = D3D11_FILTER_TYPE_LINEAR; break; 1.182 + default: UNREACHABLE(); 1.183 + } 1.184 + 1.185 + return D3D11_ENCODE_BASIC_FILTER(dxMin, dxMag, dxMip, false); 1.186 + } 1.187 +} 1.188 + 1.189 +D3D11_TEXTURE_ADDRESS_MODE ConvertTextureWrap(GLenum wrap) 1.190 +{ 1.191 + switch (wrap) 1.192 + { 1.193 + case GL_REPEAT: return D3D11_TEXTURE_ADDRESS_WRAP; 1.194 + case GL_CLAMP_TO_EDGE: return D3D11_TEXTURE_ADDRESS_CLAMP; 1.195 + case GL_MIRRORED_REPEAT: return D3D11_TEXTURE_ADDRESS_MIRROR; 1.196 + default: UNREACHABLE(); 1.197 + } 1.198 + 1.199 + return D3D11_TEXTURE_ADDRESS_WRAP; 1.200 +} 1.201 + 1.202 +FLOAT ConvertMinLOD(GLenum minFilter, unsigned int lodOffset) 1.203 +{ 1.204 + return (minFilter == GL_NEAREST || minFilter == GL_LINEAR) ? static_cast<float>(lodOffset) : -FLT_MAX; 1.205 +} 1.206 + 1.207 +FLOAT ConvertMaxLOD(GLenum minFilter, unsigned int lodOffset) 1.208 +{ 1.209 + return (minFilter == GL_NEAREST || minFilter == GL_LINEAR) ? static_cast<float>(lodOffset) : FLT_MAX; 1.210 +} 1.211 + 1.212 +} 1.213 + 1.214 +namespace d3d11_gl 1.215 +{ 1.216 + 1.217 +GLenum ConvertBackBufferFormat(DXGI_FORMAT format) 1.218 +{ 1.219 + switch (format) 1.220 + { 1.221 + case DXGI_FORMAT_R8G8B8A8_UNORM: return GL_RGBA8_OES; 1.222 + case DXGI_FORMAT_B8G8R8A8_UNORM: return GL_BGRA8_EXT; 1.223 + default: 1.224 + UNREACHABLE(); 1.225 + } 1.226 + 1.227 + return GL_RGBA8_OES; 1.228 +} 1.229 + 1.230 +GLenum ConvertDepthStencilFormat(DXGI_FORMAT format) 1.231 +{ 1.232 + switch (format) 1.233 + { 1.234 + case DXGI_FORMAT_UNKNOWN: return GL_NONE; 1.235 + case DXGI_FORMAT_D16_UNORM: return GL_DEPTH_COMPONENT16; 1.236 + case DXGI_FORMAT_D24_UNORM_S8_UINT: return GL_DEPTH24_STENCIL8_OES; 1.237 + default: 1.238 + UNREACHABLE(); 1.239 + } 1.240 + 1.241 + return GL_DEPTH24_STENCIL8_OES; 1.242 +} 1.243 + 1.244 +GLenum ConvertRenderbufferFormat(DXGI_FORMAT format) 1.245 +{ 1.246 + switch (format) 1.247 + { 1.248 + case DXGI_FORMAT_B8G8R8A8_UNORM: 1.249 + return GL_BGRA8_EXT; 1.250 + case DXGI_FORMAT_R8G8B8A8_UNORM: 1.251 + return GL_RGBA8_OES; 1.252 + case DXGI_FORMAT_D16_UNORM: 1.253 + return GL_DEPTH_COMPONENT16; 1.254 + case DXGI_FORMAT_D24_UNORM_S8_UINT: 1.255 + return GL_DEPTH24_STENCIL8_OES; 1.256 + default: 1.257 + UNREACHABLE(); 1.258 + } 1.259 + 1.260 + return GL_RGBA8_OES; 1.261 +} 1.262 + 1.263 +GLenum ConvertTextureInternalFormat(DXGI_FORMAT format) 1.264 +{ 1.265 + switch (format) 1.266 + { 1.267 + case DXGI_FORMAT_R8G8B8A8_UNORM: 1.268 + return GL_RGBA8_OES; 1.269 + case DXGI_FORMAT_A8_UNORM: 1.270 + return GL_ALPHA8_EXT; 1.271 + case DXGI_FORMAT_BC1_UNORM: 1.272 + return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; 1.273 + case DXGI_FORMAT_BC2_UNORM: 1.274 + return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE; 1.275 + case DXGI_FORMAT_BC3_UNORM: 1.276 + return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE; 1.277 + case DXGI_FORMAT_R32G32B32A32_FLOAT: 1.278 + return GL_RGBA32F_EXT; 1.279 + case DXGI_FORMAT_R32G32B32_FLOAT: 1.280 + return GL_RGB32F_EXT; 1.281 + case DXGI_FORMAT_R16G16B16A16_FLOAT: 1.282 + return GL_RGBA16F_EXT; 1.283 + case DXGI_FORMAT_B8G8R8A8_UNORM: 1.284 + return GL_BGRA8_EXT; 1.285 + case DXGI_FORMAT_R8_UNORM: 1.286 + return GL_R8_EXT; 1.287 + case DXGI_FORMAT_R8G8_UNORM: 1.288 + return GL_RG8_EXT; 1.289 + case DXGI_FORMAT_R16_FLOAT: 1.290 + return GL_R16F_EXT; 1.291 + case DXGI_FORMAT_R16G16_FLOAT: 1.292 + return GL_RG16F_EXT; 1.293 + case DXGI_FORMAT_D16_UNORM: 1.294 + return GL_DEPTH_COMPONENT16; 1.295 + case DXGI_FORMAT_D24_UNORM_S8_UINT: 1.296 + return GL_DEPTH24_STENCIL8_OES; 1.297 + case DXGI_FORMAT_UNKNOWN: 1.298 + return GL_NONE; 1.299 + default: 1.300 + UNREACHABLE(); 1.301 + } 1.302 + 1.303 + return GL_RGBA8_OES; 1.304 +} 1.305 + 1.306 +} 1.307 + 1.308 +namespace gl_d3d11 1.309 +{ 1.310 + 1.311 +DXGI_FORMAT ConvertRenderbufferFormat(GLenum format) 1.312 +{ 1.313 + switch (format) 1.314 + { 1.315 + case GL_RGBA4: 1.316 + case GL_RGB5_A1: 1.317 + case GL_RGBA8_OES: 1.318 + case GL_RGB565: 1.319 + case GL_RGB8_OES: 1.320 + return DXGI_FORMAT_R8G8B8A8_UNORM; 1.321 + case GL_BGRA8_EXT: 1.322 + return DXGI_FORMAT_B8G8R8A8_UNORM; 1.323 + case GL_DEPTH_COMPONENT16: 1.324 + return DXGI_FORMAT_D16_UNORM; 1.325 + case GL_STENCIL_INDEX8: 1.326 + case GL_DEPTH24_STENCIL8_OES: 1.327 + return DXGI_FORMAT_D24_UNORM_S8_UINT; 1.328 + default: 1.329 + UNREACHABLE(); 1.330 + } 1.331 + 1.332 + return DXGI_FORMAT_R8G8B8A8_UNORM; 1.333 +} 1.334 + 1.335 +DXGI_FORMAT ConvertTextureFormat(GLenum internalformat) 1.336 +{ 1.337 + switch (internalformat) 1.338 + { 1.339 + case GL_RGB565: 1.340 + case GL_RGBA4: 1.341 + case GL_RGB5_A1: 1.342 + case GL_RGB8_OES: 1.343 + case GL_RGBA8_OES: 1.344 + case GL_LUMINANCE8_EXT: 1.345 + case GL_LUMINANCE8_ALPHA8_EXT: 1.346 + return DXGI_FORMAT_R8G8B8A8_UNORM; 1.347 + case GL_ALPHA8_EXT: 1.348 + return DXGI_FORMAT_A8_UNORM; 1.349 + case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 1.350 + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 1.351 + return DXGI_FORMAT_BC1_UNORM; 1.352 + case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE: 1.353 + return DXGI_FORMAT_BC2_UNORM; 1.354 + case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE: 1.355 + return DXGI_FORMAT_BC3_UNORM; 1.356 + case GL_RGBA32F_EXT: 1.357 + case GL_ALPHA32F_EXT: 1.358 + case GL_LUMINANCE_ALPHA32F_EXT: 1.359 + return DXGI_FORMAT_R32G32B32A32_FLOAT; 1.360 + case GL_RGB32F_EXT: 1.361 + case GL_LUMINANCE32F_EXT: 1.362 + return DXGI_FORMAT_R32G32B32A32_FLOAT; 1.363 + case GL_RGBA16F_EXT: 1.364 + case GL_ALPHA16F_EXT: 1.365 + case GL_LUMINANCE_ALPHA16F_EXT: 1.366 + case GL_RGB16F_EXT: 1.367 + case GL_LUMINANCE16F_EXT: 1.368 + return DXGI_FORMAT_R16G16B16A16_FLOAT; 1.369 + case GL_BGRA8_EXT: 1.370 + return DXGI_FORMAT_B8G8R8A8_UNORM; 1.371 + case GL_R8_EXT: 1.372 + return DXGI_FORMAT_R8_UNORM; 1.373 + case GL_RG8_EXT: 1.374 + return DXGI_FORMAT_R8G8_UNORM; 1.375 + case GL_R16F_EXT: 1.376 + return DXGI_FORMAT_R16_FLOAT; 1.377 + case GL_RG16F_EXT: 1.378 + return DXGI_FORMAT_R16G16_FLOAT; 1.379 + case GL_DEPTH_COMPONENT16: 1.380 + return DXGI_FORMAT_D16_UNORM; 1.381 + case GL_DEPTH_COMPONENT32_OES: 1.382 + case GL_DEPTH24_STENCIL8_OES: 1.383 + return DXGI_FORMAT_D24_UNORM_S8_UINT; 1.384 + case GL_NONE: 1.385 + return DXGI_FORMAT_UNKNOWN; 1.386 + default: 1.387 + UNREACHABLE(); 1.388 + } 1.389 + 1.390 + return DXGI_FORMAT_R8G8B8A8_UNORM; 1.391 +} 1.392 + 1.393 +} 1.394 + 1.395 +namespace d3d11 1.396 +{ 1.397 + 1.398 +void SetPositionTexCoordVertex(PositionTexCoordVertex* vertex, float x, float y, float u, float v) 1.399 +{ 1.400 + vertex->x = x; 1.401 + vertex->y = y; 1.402 + vertex->u = u; 1.403 + vertex->v = v; 1.404 +} 1.405 + 1.406 +void SetPositionDepthColorVertex(PositionDepthColorVertex* vertex, float x, float y, float z, 1.407 + const gl::Color &color) 1.408 +{ 1.409 + vertex->x = x; 1.410 + vertex->y = y; 1.411 + vertex->z = z; 1.412 + vertex->r = color.red; 1.413 + vertex->g = color.green; 1.414 + vertex->b = color.blue; 1.415 + vertex->a = color.alpha; 1.416 +} 1.417 + 1.418 +size_t ComputePixelSizeBits(DXGI_FORMAT format) 1.419 +{ 1.420 + switch (format) 1.421 + { 1.422 + case DXGI_FORMAT_R1_UNORM: 1.423 + return 1; 1.424 + 1.425 + case DXGI_FORMAT_A8_UNORM: 1.426 + case DXGI_FORMAT_R8_SINT: 1.427 + case DXGI_FORMAT_R8_SNORM: 1.428 + case DXGI_FORMAT_R8_TYPELESS: 1.429 + case DXGI_FORMAT_R8_UINT: 1.430 + case DXGI_FORMAT_R8_UNORM: 1.431 + return 8; 1.432 + 1.433 + case DXGI_FORMAT_B5G5R5A1_UNORM: 1.434 + case DXGI_FORMAT_B5G6R5_UNORM: 1.435 + case DXGI_FORMAT_D16_UNORM: 1.436 + case DXGI_FORMAT_R16_FLOAT: 1.437 + case DXGI_FORMAT_R16_SINT: 1.438 + case DXGI_FORMAT_R16_SNORM: 1.439 + case DXGI_FORMAT_R16_TYPELESS: 1.440 + case DXGI_FORMAT_R16_UINT: 1.441 + case DXGI_FORMAT_R16_UNORM: 1.442 + case DXGI_FORMAT_R8G8_SINT: 1.443 + case DXGI_FORMAT_R8G8_SNORM: 1.444 + case DXGI_FORMAT_R8G8_TYPELESS: 1.445 + case DXGI_FORMAT_R8G8_UINT: 1.446 + case DXGI_FORMAT_R8G8_UNORM: 1.447 + return 16; 1.448 + 1.449 + case DXGI_FORMAT_B8G8R8X8_TYPELESS: 1.450 + case DXGI_FORMAT_B8G8R8X8_UNORM: 1.451 + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: 1.452 + case DXGI_FORMAT_D24_UNORM_S8_UINT: 1.453 + case DXGI_FORMAT_D32_FLOAT: 1.454 + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: 1.455 + case DXGI_FORMAT_G8R8_G8B8_UNORM: 1.456 + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: 1.457 + case DXGI_FORMAT_R10G10B10A2_TYPELESS: 1.458 + case DXGI_FORMAT_R10G10B10A2_UINT: 1.459 + case DXGI_FORMAT_R10G10B10A2_UNORM: 1.460 + case DXGI_FORMAT_R11G11B10_FLOAT: 1.461 + case DXGI_FORMAT_R16G16_FLOAT: 1.462 + case DXGI_FORMAT_R16G16_SINT: 1.463 + case DXGI_FORMAT_R16G16_SNORM: 1.464 + case DXGI_FORMAT_R16G16_TYPELESS: 1.465 + case DXGI_FORMAT_R16G16_UINT: 1.466 + case DXGI_FORMAT_R16G16_UNORM: 1.467 + case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: 1.468 + case DXGI_FORMAT_R24G8_TYPELESS: 1.469 + case DXGI_FORMAT_R32_FLOAT: 1.470 + case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: 1.471 + case DXGI_FORMAT_R32_SINT: 1.472 + case DXGI_FORMAT_R32_TYPELESS: 1.473 + case DXGI_FORMAT_R32_UINT: 1.474 + case DXGI_FORMAT_R8G8_B8G8_UNORM: 1.475 + case DXGI_FORMAT_R8G8B8A8_SINT: 1.476 + case DXGI_FORMAT_R8G8B8A8_SNORM: 1.477 + case DXGI_FORMAT_R8G8B8A8_TYPELESS: 1.478 + case DXGI_FORMAT_R8G8B8A8_UINT: 1.479 + case DXGI_FORMAT_R8G8B8A8_UNORM: 1.480 + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: 1.481 + case DXGI_FORMAT_B8G8R8A8_TYPELESS: 1.482 + case DXGI_FORMAT_B8G8R8A8_UNORM: 1.483 + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: 1.484 + case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: 1.485 + case DXGI_FORMAT_X24_TYPELESS_G8_UINT: 1.486 + case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: 1.487 + return 32; 1.488 + 1.489 + case DXGI_FORMAT_R16G16B16A16_FLOAT: 1.490 + case DXGI_FORMAT_R16G16B16A16_SINT: 1.491 + case DXGI_FORMAT_R16G16B16A16_SNORM: 1.492 + case DXGI_FORMAT_R16G16B16A16_TYPELESS: 1.493 + case DXGI_FORMAT_R16G16B16A16_UINT: 1.494 + case DXGI_FORMAT_R16G16B16A16_UNORM: 1.495 + case DXGI_FORMAT_R32G32_FLOAT: 1.496 + case DXGI_FORMAT_R32G32_SINT: 1.497 + case DXGI_FORMAT_R32G32_TYPELESS: 1.498 + case DXGI_FORMAT_R32G32_UINT: 1.499 + case DXGI_FORMAT_R32G8X24_TYPELESS: 1.500 + return 64; 1.501 + 1.502 + case DXGI_FORMAT_R32G32B32_FLOAT: 1.503 + case DXGI_FORMAT_R32G32B32_SINT: 1.504 + case DXGI_FORMAT_R32G32B32_TYPELESS: 1.505 + case DXGI_FORMAT_R32G32B32_UINT: 1.506 + return 96; 1.507 + 1.508 + case DXGI_FORMAT_R32G32B32A32_FLOAT: 1.509 + case DXGI_FORMAT_R32G32B32A32_SINT: 1.510 + case DXGI_FORMAT_R32G32B32A32_TYPELESS: 1.511 + case DXGI_FORMAT_R32G32B32A32_UINT: 1.512 + return 128; 1.513 + 1.514 + case DXGI_FORMAT_BC1_TYPELESS: 1.515 + case DXGI_FORMAT_BC1_UNORM: 1.516 + case DXGI_FORMAT_BC1_UNORM_SRGB: 1.517 + case DXGI_FORMAT_BC4_SNORM: 1.518 + case DXGI_FORMAT_BC4_TYPELESS: 1.519 + case DXGI_FORMAT_BC4_UNORM: 1.520 + return 4; 1.521 + 1.522 + case DXGI_FORMAT_BC2_TYPELESS: 1.523 + case DXGI_FORMAT_BC2_UNORM: 1.524 + case DXGI_FORMAT_BC2_UNORM_SRGB: 1.525 + case DXGI_FORMAT_BC3_TYPELESS: 1.526 + case DXGI_FORMAT_BC3_UNORM: 1.527 + case DXGI_FORMAT_BC3_UNORM_SRGB: 1.528 + case DXGI_FORMAT_BC5_SNORM: 1.529 + case DXGI_FORMAT_BC5_TYPELESS: 1.530 + case DXGI_FORMAT_BC5_UNORM: 1.531 + case DXGI_FORMAT_BC6H_SF16: 1.532 + case DXGI_FORMAT_BC6H_TYPELESS: 1.533 + case DXGI_FORMAT_BC6H_UF16: 1.534 + case DXGI_FORMAT_BC7_TYPELESS: 1.535 + case DXGI_FORMAT_BC7_UNORM: 1.536 + case DXGI_FORMAT_BC7_UNORM_SRGB: 1.537 + return 8; 1.538 + 1.539 + default: 1.540 + return 0; 1.541 + } 1.542 +} 1.543 + 1.544 +size_t ComputeBlockSizeBits(DXGI_FORMAT format) 1.545 +{ 1.546 + switch (format) 1.547 + { 1.548 + case DXGI_FORMAT_BC1_TYPELESS: 1.549 + case DXGI_FORMAT_BC1_UNORM: 1.550 + case DXGI_FORMAT_BC1_UNORM_SRGB: 1.551 + case DXGI_FORMAT_BC4_SNORM: 1.552 + case DXGI_FORMAT_BC4_TYPELESS: 1.553 + case DXGI_FORMAT_BC4_UNORM: 1.554 + case DXGI_FORMAT_BC2_TYPELESS: 1.555 + case DXGI_FORMAT_BC2_UNORM: 1.556 + case DXGI_FORMAT_BC2_UNORM_SRGB: 1.557 + case DXGI_FORMAT_BC3_TYPELESS: 1.558 + case DXGI_FORMAT_BC3_UNORM: 1.559 + case DXGI_FORMAT_BC3_UNORM_SRGB: 1.560 + case DXGI_FORMAT_BC5_SNORM: 1.561 + case DXGI_FORMAT_BC5_TYPELESS: 1.562 + case DXGI_FORMAT_BC5_UNORM: 1.563 + case DXGI_FORMAT_BC6H_SF16: 1.564 + case DXGI_FORMAT_BC6H_TYPELESS: 1.565 + case DXGI_FORMAT_BC6H_UF16: 1.566 + case DXGI_FORMAT_BC7_TYPELESS: 1.567 + case DXGI_FORMAT_BC7_UNORM: 1.568 + case DXGI_FORMAT_BC7_UNORM_SRGB: 1.569 + return ComputePixelSizeBits(format) * 16; 1.570 + default: 1.571 + UNREACHABLE(); 1.572 + return 0; 1.573 + } 1.574 +} 1.575 + 1.576 +bool IsCompressed(DXGI_FORMAT format) 1.577 +{ 1.578 + switch (format) 1.579 + { 1.580 + case DXGI_FORMAT_BC1_TYPELESS: 1.581 + case DXGI_FORMAT_BC1_UNORM: 1.582 + case DXGI_FORMAT_BC1_UNORM_SRGB: 1.583 + case DXGI_FORMAT_BC4_SNORM: 1.584 + case DXGI_FORMAT_BC4_TYPELESS: 1.585 + case DXGI_FORMAT_BC4_UNORM: 1.586 + case DXGI_FORMAT_BC2_TYPELESS: 1.587 + case DXGI_FORMAT_BC2_UNORM: 1.588 + case DXGI_FORMAT_BC2_UNORM_SRGB: 1.589 + case DXGI_FORMAT_BC3_TYPELESS: 1.590 + case DXGI_FORMAT_BC3_UNORM: 1.591 + case DXGI_FORMAT_BC3_UNORM_SRGB: 1.592 + case DXGI_FORMAT_BC5_SNORM: 1.593 + case DXGI_FORMAT_BC5_TYPELESS: 1.594 + case DXGI_FORMAT_BC5_UNORM: 1.595 + case DXGI_FORMAT_BC6H_SF16: 1.596 + case DXGI_FORMAT_BC6H_TYPELESS: 1.597 + case DXGI_FORMAT_BC6H_UF16: 1.598 + case DXGI_FORMAT_BC7_TYPELESS: 1.599 + case DXGI_FORMAT_BC7_UNORM: 1.600 + case DXGI_FORMAT_BC7_UNORM_SRGB: 1.601 + return true; 1.602 + case DXGI_FORMAT_UNKNOWN: 1.603 + UNREACHABLE(); 1.604 + return false; 1.605 + default: 1.606 + return false; 1.607 + } 1.608 +} 1.609 + 1.610 +unsigned int GetTextureFormatDimensionAlignment(DXGI_FORMAT format) 1.611 +{ 1.612 + switch (format) 1.613 + { 1.614 + case DXGI_FORMAT_BC1_TYPELESS: 1.615 + case DXGI_FORMAT_BC1_UNORM: 1.616 + case DXGI_FORMAT_BC1_UNORM_SRGB: 1.617 + case DXGI_FORMAT_BC4_SNORM: 1.618 + case DXGI_FORMAT_BC4_TYPELESS: 1.619 + case DXGI_FORMAT_BC4_UNORM: 1.620 + case DXGI_FORMAT_BC2_TYPELESS: 1.621 + case DXGI_FORMAT_BC2_UNORM: 1.622 + case DXGI_FORMAT_BC2_UNORM_SRGB: 1.623 + case DXGI_FORMAT_BC3_TYPELESS: 1.624 + case DXGI_FORMAT_BC3_UNORM: 1.625 + case DXGI_FORMAT_BC3_UNORM_SRGB: 1.626 + case DXGI_FORMAT_BC5_SNORM: 1.627 + case DXGI_FORMAT_BC5_TYPELESS: 1.628 + case DXGI_FORMAT_BC5_UNORM: 1.629 + case DXGI_FORMAT_BC6H_SF16: 1.630 + case DXGI_FORMAT_BC6H_TYPELESS: 1.631 + case DXGI_FORMAT_BC6H_UF16: 1.632 + case DXGI_FORMAT_BC7_TYPELESS: 1.633 + case DXGI_FORMAT_BC7_UNORM: 1.634 + case DXGI_FORMAT_BC7_UNORM_SRGB: 1.635 + return 4; 1.636 + case DXGI_FORMAT_UNKNOWN: 1.637 + UNREACHABLE(); 1.638 + return 1; 1.639 + default: 1.640 + return 1; 1.641 + } 1.642 +} 1.643 + 1.644 +bool IsDepthStencilFormat(DXGI_FORMAT format) 1.645 +{ 1.646 + switch (format) 1.647 + { 1.648 + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: 1.649 + case DXGI_FORMAT_D32_FLOAT: 1.650 + case DXGI_FORMAT_D24_UNORM_S8_UINT: 1.651 + case DXGI_FORMAT_D16_UNORM: 1.652 + return true; 1.653 + default: 1.654 + return false; 1.655 + } 1.656 +} 1.657 + 1.658 +DXGI_FORMAT GetDepthTextureFormat(DXGI_FORMAT format) 1.659 +{ 1.660 + switch (format) 1.661 + { 1.662 + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: return DXGI_FORMAT_R32G8X24_TYPELESS; 1.663 + case DXGI_FORMAT_D32_FLOAT: return DXGI_FORMAT_R32_TYPELESS; 1.664 + case DXGI_FORMAT_D24_UNORM_S8_UINT: return DXGI_FORMAT_R24G8_TYPELESS; 1.665 + case DXGI_FORMAT_D16_UNORM: return DXGI_FORMAT_R16_TYPELESS; 1.666 + default: UNREACHABLE(); return DXGI_FORMAT_UNKNOWN; 1.667 + } 1.668 +} 1.669 + 1.670 +DXGI_FORMAT GetDepthShaderResourceFormat(DXGI_FORMAT format) 1.671 +{ 1.672 + switch (format) 1.673 + { 1.674 + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: return DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS; 1.675 + case DXGI_FORMAT_D32_FLOAT: return DXGI_FORMAT_R32_UINT; 1.676 + case DXGI_FORMAT_D24_UNORM_S8_UINT: return DXGI_FORMAT_R24_UNORM_X8_TYPELESS; 1.677 + case DXGI_FORMAT_D16_UNORM: return DXGI_FORMAT_R16_UNORM; 1.678 + default: UNREACHABLE(); return DXGI_FORMAT_UNKNOWN; 1.679 + } 1.680 +} 1.681 + 1.682 +HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name) 1.683 +{ 1.684 +#if defined(_DEBUG) 1.685 + return resource->SetPrivateData(WKPDID_D3DDebugObjectName, strlen(name), name); 1.686 +#else 1.687 + return S_OK; 1.688 +#endif 1.689 +} 1.690 + 1.691 +}