gfx/angle/src/libGLESv2/renderer/renderer11_utils.cpp

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

michael@0 1 #include "precompiled.h"
michael@0 2 //
michael@0 3 // Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
michael@0 4 // Use of this source code is governed by a BSD-style license that can be
michael@0 5 // found in the LICENSE file.
michael@0 6 //
michael@0 7
michael@0 8 // renderer11_utils.cpp: Conversion functions and other utility routines
michael@0 9 // specific to the D3D11 renderer.
michael@0 10
michael@0 11 #include "libGLESv2/renderer/renderer11_utils.h"
michael@0 12
michael@0 13 #include "common/debug.h"
michael@0 14
michael@0 15 namespace gl_d3d11
michael@0 16 {
michael@0 17
michael@0 18 D3D11_BLEND ConvertBlendFunc(GLenum glBlend, bool isAlpha)
michael@0 19 {
michael@0 20 D3D11_BLEND d3dBlend = D3D11_BLEND_ZERO;
michael@0 21
michael@0 22 switch (glBlend)
michael@0 23 {
michael@0 24 case GL_ZERO: d3dBlend = D3D11_BLEND_ZERO; break;
michael@0 25 case GL_ONE: d3dBlend = D3D11_BLEND_ONE; break;
michael@0 26 case GL_SRC_COLOR: d3dBlend = (isAlpha ? D3D11_BLEND_SRC_ALPHA : D3D11_BLEND_SRC_COLOR); break;
michael@0 27 case GL_ONE_MINUS_SRC_COLOR: d3dBlend = (isAlpha ? D3D11_BLEND_INV_SRC_ALPHA : D3D11_BLEND_INV_SRC_COLOR); break;
michael@0 28 case GL_DST_COLOR: d3dBlend = (isAlpha ? D3D11_BLEND_DEST_ALPHA : D3D11_BLEND_DEST_COLOR); break;
michael@0 29 case GL_ONE_MINUS_DST_COLOR: d3dBlend = (isAlpha ? D3D11_BLEND_INV_DEST_ALPHA : D3D11_BLEND_INV_DEST_COLOR); break;
michael@0 30 case GL_SRC_ALPHA: d3dBlend = D3D11_BLEND_SRC_ALPHA; break;
michael@0 31 case GL_ONE_MINUS_SRC_ALPHA: d3dBlend = D3D11_BLEND_INV_SRC_ALPHA; break;
michael@0 32 case GL_DST_ALPHA: d3dBlend = D3D11_BLEND_DEST_ALPHA; break;
michael@0 33 case GL_ONE_MINUS_DST_ALPHA: d3dBlend = D3D11_BLEND_INV_DEST_ALPHA; break;
michael@0 34 case GL_CONSTANT_COLOR: d3dBlend = D3D11_BLEND_BLEND_FACTOR; break;
michael@0 35 case GL_ONE_MINUS_CONSTANT_COLOR: d3dBlend = D3D11_BLEND_INV_BLEND_FACTOR; break;
michael@0 36 case GL_CONSTANT_ALPHA: d3dBlend = D3D11_BLEND_BLEND_FACTOR; break;
michael@0 37 case GL_ONE_MINUS_CONSTANT_ALPHA: d3dBlend = D3D11_BLEND_INV_BLEND_FACTOR; break;
michael@0 38 case GL_SRC_ALPHA_SATURATE: d3dBlend = D3D11_BLEND_SRC_ALPHA_SAT; break;
michael@0 39 default: UNREACHABLE();
michael@0 40 }
michael@0 41
michael@0 42 return d3dBlend;
michael@0 43 }
michael@0 44
michael@0 45 D3D11_BLEND_OP ConvertBlendOp(GLenum glBlendOp)
michael@0 46 {
michael@0 47 D3D11_BLEND_OP d3dBlendOp = D3D11_BLEND_OP_ADD;
michael@0 48
michael@0 49 switch (glBlendOp)
michael@0 50 {
michael@0 51 case GL_FUNC_ADD: d3dBlendOp = D3D11_BLEND_OP_ADD; break;
michael@0 52 case GL_FUNC_SUBTRACT: d3dBlendOp = D3D11_BLEND_OP_SUBTRACT; break;
michael@0 53 case GL_FUNC_REVERSE_SUBTRACT: d3dBlendOp = D3D11_BLEND_OP_REV_SUBTRACT; break;
michael@0 54 default: UNREACHABLE();
michael@0 55 }
michael@0 56
michael@0 57 return d3dBlendOp;
michael@0 58 }
michael@0 59
michael@0 60 UINT8 ConvertColorMask(bool red, bool green, bool blue, bool alpha)
michael@0 61 {
michael@0 62 UINT8 mask = 0;
michael@0 63 if (red)
michael@0 64 {
michael@0 65 mask |= D3D11_COLOR_WRITE_ENABLE_RED;
michael@0 66 }
michael@0 67 if (green)
michael@0 68 {
michael@0 69 mask |= D3D11_COLOR_WRITE_ENABLE_GREEN;
michael@0 70 }
michael@0 71 if (blue)
michael@0 72 {
michael@0 73 mask |= D3D11_COLOR_WRITE_ENABLE_BLUE;
michael@0 74 }
michael@0 75 if (alpha)
michael@0 76 {
michael@0 77 mask |= D3D11_COLOR_WRITE_ENABLE_ALPHA;
michael@0 78 }
michael@0 79 return mask;
michael@0 80 }
michael@0 81
michael@0 82 D3D11_CULL_MODE ConvertCullMode(bool cullEnabled, GLenum cullMode)
michael@0 83 {
michael@0 84 D3D11_CULL_MODE cull = D3D11_CULL_NONE;
michael@0 85
michael@0 86 if (cullEnabled)
michael@0 87 {
michael@0 88 switch (cullMode)
michael@0 89 {
michael@0 90 case GL_FRONT: cull = D3D11_CULL_FRONT; break;
michael@0 91 case GL_BACK: cull = D3D11_CULL_BACK; break;
michael@0 92 case GL_FRONT_AND_BACK: cull = D3D11_CULL_NONE; break;
michael@0 93 default: UNREACHABLE();
michael@0 94 }
michael@0 95 }
michael@0 96 else
michael@0 97 {
michael@0 98 cull = D3D11_CULL_NONE;
michael@0 99 }
michael@0 100
michael@0 101 return cull;
michael@0 102 }
michael@0 103
michael@0 104 D3D11_COMPARISON_FUNC ConvertComparison(GLenum comparison)
michael@0 105 {
michael@0 106 D3D11_COMPARISON_FUNC d3dComp = D3D11_COMPARISON_NEVER;
michael@0 107 switch (comparison)
michael@0 108 {
michael@0 109 case GL_NEVER: d3dComp = D3D11_COMPARISON_NEVER; break;
michael@0 110 case GL_ALWAYS: d3dComp = D3D11_COMPARISON_ALWAYS; break;
michael@0 111 case GL_LESS: d3dComp = D3D11_COMPARISON_LESS; break;
michael@0 112 case GL_LEQUAL: d3dComp = D3D11_COMPARISON_LESS_EQUAL; break;
michael@0 113 case GL_EQUAL: d3dComp = D3D11_COMPARISON_EQUAL; break;
michael@0 114 case GL_GREATER: d3dComp = D3D11_COMPARISON_GREATER; break;
michael@0 115 case GL_GEQUAL: d3dComp = D3D11_COMPARISON_GREATER_EQUAL; break;
michael@0 116 case GL_NOTEQUAL: d3dComp = D3D11_COMPARISON_NOT_EQUAL; break;
michael@0 117 default: UNREACHABLE();
michael@0 118 }
michael@0 119
michael@0 120 return d3dComp;
michael@0 121 }
michael@0 122
michael@0 123 D3D11_DEPTH_WRITE_MASK ConvertDepthMask(bool depthWriteEnabled)
michael@0 124 {
michael@0 125 return depthWriteEnabled ? D3D11_DEPTH_WRITE_MASK_ALL : D3D11_DEPTH_WRITE_MASK_ZERO;
michael@0 126 }
michael@0 127
michael@0 128 UINT8 ConvertStencilMask(GLuint stencilmask)
michael@0 129 {
michael@0 130 return static_cast<UINT8>(stencilmask);
michael@0 131 }
michael@0 132
michael@0 133 D3D11_STENCIL_OP ConvertStencilOp(GLenum stencilOp)
michael@0 134 {
michael@0 135 D3D11_STENCIL_OP d3dStencilOp = D3D11_STENCIL_OP_KEEP;
michael@0 136
michael@0 137 switch (stencilOp)
michael@0 138 {
michael@0 139 case GL_ZERO: d3dStencilOp = D3D11_STENCIL_OP_ZERO; break;
michael@0 140 case GL_KEEP: d3dStencilOp = D3D11_STENCIL_OP_KEEP; break;
michael@0 141 case GL_REPLACE: d3dStencilOp = D3D11_STENCIL_OP_REPLACE; break;
michael@0 142 case GL_INCR: d3dStencilOp = D3D11_STENCIL_OP_INCR_SAT; break;
michael@0 143 case GL_DECR: d3dStencilOp = D3D11_STENCIL_OP_DECR_SAT; break;
michael@0 144 case GL_INVERT: d3dStencilOp = D3D11_STENCIL_OP_INVERT; break;
michael@0 145 case GL_INCR_WRAP: d3dStencilOp = D3D11_STENCIL_OP_INCR; break;
michael@0 146 case GL_DECR_WRAP: d3dStencilOp = D3D11_STENCIL_OP_DECR; break;
michael@0 147 default: UNREACHABLE();
michael@0 148 }
michael@0 149
michael@0 150 return d3dStencilOp;
michael@0 151 }
michael@0 152
michael@0 153 D3D11_FILTER ConvertFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy)
michael@0 154 {
michael@0 155 if (maxAnisotropy > 1.0f)
michael@0 156 {
michael@0 157 return D3D11_ENCODE_ANISOTROPIC_FILTER(false);
michael@0 158 }
michael@0 159 else
michael@0 160 {
michael@0 161 D3D11_FILTER_TYPE dxMin = D3D11_FILTER_TYPE_POINT;
michael@0 162 D3D11_FILTER_TYPE dxMip = D3D11_FILTER_TYPE_POINT;
michael@0 163 switch (minFilter)
michael@0 164 {
michael@0 165 case GL_NEAREST: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_POINT; break;
michael@0 166 case GL_LINEAR: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_POINT; break;
michael@0 167 case GL_NEAREST_MIPMAP_NEAREST: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_POINT; break;
michael@0 168 case GL_LINEAR_MIPMAP_NEAREST: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_POINT; break;
michael@0 169 case GL_NEAREST_MIPMAP_LINEAR: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_LINEAR; break;
michael@0 170 case GL_LINEAR_MIPMAP_LINEAR: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_LINEAR; break;
michael@0 171 default: UNREACHABLE();
michael@0 172 }
michael@0 173
michael@0 174 D3D11_FILTER_TYPE dxMag = D3D11_FILTER_TYPE_POINT;
michael@0 175 switch (magFilter)
michael@0 176 {
michael@0 177 case GL_NEAREST: dxMag = D3D11_FILTER_TYPE_POINT; break;
michael@0 178 case GL_LINEAR: dxMag = D3D11_FILTER_TYPE_LINEAR; break;
michael@0 179 default: UNREACHABLE();
michael@0 180 }
michael@0 181
michael@0 182 return D3D11_ENCODE_BASIC_FILTER(dxMin, dxMag, dxMip, false);
michael@0 183 }
michael@0 184 }
michael@0 185
michael@0 186 D3D11_TEXTURE_ADDRESS_MODE ConvertTextureWrap(GLenum wrap)
michael@0 187 {
michael@0 188 switch (wrap)
michael@0 189 {
michael@0 190 case GL_REPEAT: return D3D11_TEXTURE_ADDRESS_WRAP;
michael@0 191 case GL_CLAMP_TO_EDGE: return D3D11_TEXTURE_ADDRESS_CLAMP;
michael@0 192 case GL_MIRRORED_REPEAT: return D3D11_TEXTURE_ADDRESS_MIRROR;
michael@0 193 default: UNREACHABLE();
michael@0 194 }
michael@0 195
michael@0 196 return D3D11_TEXTURE_ADDRESS_WRAP;
michael@0 197 }
michael@0 198
michael@0 199 FLOAT ConvertMinLOD(GLenum minFilter, unsigned int lodOffset)
michael@0 200 {
michael@0 201 return (minFilter == GL_NEAREST || minFilter == GL_LINEAR) ? static_cast<float>(lodOffset) : -FLT_MAX;
michael@0 202 }
michael@0 203
michael@0 204 FLOAT ConvertMaxLOD(GLenum minFilter, unsigned int lodOffset)
michael@0 205 {
michael@0 206 return (minFilter == GL_NEAREST || minFilter == GL_LINEAR) ? static_cast<float>(lodOffset) : FLT_MAX;
michael@0 207 }
michael@0 208
michael@0 209 }
michael@0 210
michael@0 211 namespace d3d11_gl
michael@0 212 {
michael@0 213
michael@0 214 GLenum ConvertBackBufferFormat(DXGI_FORMAT format)
michael@0 215 {
michael@0 216 switch (format)
michael@0 217 {
michael@0 218 case DXGI_FORMAT_R8G8B8A8_UNORM: return GL_RGBA8_OES;
michael@0 219 case DXGI_FORMAT_B8G8R8A8_UNORM: return GL_BGRA8_EXT;
michael@0 220 default:
michael@0 221 UNREACHABLE();
michael@0 222 }
michael@0 223
michael@0 224 return GL_RGBA8_OES;
michael@0 225 }
michael@0 226
michael@0 227 GLenum ConvertDepthStencilFormat(DXGI_FORMAT format)
michael@0 228 {
michael@0 229 switch (format)
michael@0 230 {
michael@0 231 case DXGI_FORMAT_UNKNOWN: return GL_NONE;
michael@0 232 case DXGI_FORMAT_D16_UNORM: return GL_DEPTH_COMPONENT16;
michael@0 233 case DXGI_FORMAT_D24_UNORM_S8_UINT: return GL_DEPTH24_STENCIL8_OES;
michael@0 234 default:
michael@0 235 UNREACHABLE();
michael@0 236 }
michael@0 237
michael@0 238 return GL_DEPTH24_STENCIL8_OES;
michael@0 239 }
michael@0 240
michael@0 241 GLenum ConvertRenderbufferFormat(DXGI_FORMAT format)
michael@0 242 {
michael@0 243 switch (format)
michael@0 244 {
michael@0 245 case DXGI_FORMAT_B8G8R8A8_UNORM:
michael@0 246 return GL_BGRA8_EXT;
michael@0 247 case DXGI_FORMAT_R8G8B8A8_UNORM:
michael@0 248 return GL_RGBA8_OES;
michael@0 249 case DXGI_FORMAT_D16_UNORM:
michael@0 250 return GL_DEPTH_COMPONENT16;
michael@0 251 case DXGI_FORMAT_D24_UNORM_S8_UINT:
michael@0 252 return GL_DEPTH24_STENCIL8_OES;
michael@0 253 default:
michael@0 254 UNREACHABLE();
michael@0 255 }
michael@0 256
michael@0 257 return GL_RGBA8_OES;
michael@0 258 }
michael@0 259
michael@0 260 GLenum ConvertTextureInternalFormat(DXGI_FORMAT format)
michael@0 261 {
michael@0 262 switch (format)
michael@0 263 {
michael@0 264 case DXGI_FORMAT_R8G8B8A8_UNORM:
michael@0 265 return GL_RGBA8_OES;
michael@0 266 case DXGI_FORMAT_A8_UNORM:
michael@0 267 return GL_ALPHA8_EXT;
michael@0 268 case DXGI_FORMAT_BC1_UNORM:
michael@0 269 return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
michael@0 270 case DXGI_FORMAT_BC2_UNORM:
michael@0 271 return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
michael@0 272 case DXGI_FORMAT_BC3_UNORM:
michael@0 273 return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
michael@0 274 case DXGI_FORMAT_R32G32B32A32_FLOAT:
michael@0 275 return GL_RGBA32F_EXT;
michael@0 276 case DXGI_FORMAT_R32G32B32_FLOAT:
michael@0 277 return GL_RGB32F_EXT;
michael@0 278 case DXGI_FORMAT_R16G16B16A16_FLOAT:
michael@0 279 return GL_RGBA16F_EXT;
michael@0 280 case DXGI_FORMAT_B8G8R8A8_UNORM:
michael@0 281 return GL_BGRA8_EXT;
michael@0 282 case DXGI_FORMAT_R8_UNORM:
michael@0 283 return GL_R8_EXT;
michael@0 284 case DXGI_FORMAT_R8G8_UNORM:
michael@0 285 return GL_RG8_EXT;
michael@0 286 case DXGI_FORMAT_R16_FLOAT:
michael@0 287 return GL_R16F_EXT;
michael@0 288 case DXGI_FORMAT_R16G16_FLOAT:
michael@0 289 return GL_RG16F_EXT;
michael@0 290 case DXGI_FORMAT_D16_UNORM:
michael@0 291 return GL_DEPTH_COMPONENT16;
michael@0 292 case DXGI_FORMAT_D24_UNORM_S8_UINT:
michael@0 293 return GL_DEPTH24_STENCIL8_OES;
michael@0 294 case DXGI_FORMAT_UNKNOWN:
michael@0 295 return GL_NONE;
michael@0 296 default:
michael@0 297 UNREACHABLE();
michael@0 298 }
michael@0 299
michael@0 300 return GL_RGBA8_OES;
michael@0 301 }
michael@0 302
michael@0 303 }
michael@0 304
michael@0 305 namespace gl_d3d11
michael@0 306 {
michael@0 307
michael@0 308 DXGI_FORMAT ConvertRenderbufferFormat(GLenum format)
michael@0 309 {
michael@0 310 switch (format)
michael@0 311 {
michael@0 312 case GL_RGBA4:
michael@0 313 case GL_RGB5_A1:
michael@0 314 case GL_RGBA8_OES:
michael@0 315 case GL_RGB565:
michael@0 316 case GL_RGB8_OES:
michael@0 317 return DXGI_FORMAT_R8G8B8A8_UNORM;
michael@0 318 case GL_BGRA8_EXT:
michael@0 319 return DXGI_FORMAT_B8G8R8A8_UNORM;
michael@0 320 case GL_DEPTH_COMPONENT16:
michael@0 321 return DXGI_FORMAT_D16_UNORM;
michael@0 322 case GL_STENCIL_INDEX8:
michael@0 323 case GL_DEPTH24_STENCIL8_OES:
michael@0 324 return DXGI_FORMAT_D24_UNORM_S8_UINT;
michael@0 325 default:
michael@0 326 UNREACHABLE();
michael@0 327 }
michael@0 328
michael@0 329 return DXGI_FORMAT_R8G8B8A8_UNORM;
michael@0 330 }
michael@0 331
michael@0 332 DXGI_FORMAT ConvertTextureFormat(GLenum internalformat)
michael@0 333 {
michael@0 334 switch (internalformat)
michael@0 335 {
michael@0 336 case GL_RGB565:
michael@0 337 case GL_RGBA4:
michael@0 338 case GL_RGB5_A1:
michael@0 339 case GL_RGB8_OES:
michael@0 340 case GL_RGBA8_OES:
michael@0 341 case GL_LUMINANCE8_EXT:
michael@0 342 case GL_LUMINANCE8_ALPHA8_EXT:
michael@0 343 return DXGI_FORMAT_R8G8B8A8_UNORM;
michael@0 344 case GL_ALPHA8_EXT:
michael@0 345 return DXGI_FORMAT_A8_UNORM;
michael@0 346 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
michael@0 347 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
michael@0 348 return DXGI_FORMAT_BC1_UNORM;
michael@0 349 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
michael@0 350 return DXGI_FORMAT_BC2_UNORM;
michael@0 351 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
michael@0 352 return DXGI_FORMAT_BC3_UNORM;
michael@0 353 case GL_RGBA32F_EXT:
michael@0 354 case GL_ALPHA32F_EXT:
michael@0 355 case GL_LUMINANCE_ALPHA32F_EXT:
michael@0 356 return DXGI_FORMAT_R32G32B32A32_FLOAT;
michael@0 357 case GL_RGB32F_EXT:
michael@0 358 case GL_LUMINANCE32F_EXT:
michael@0 359 return DXGI_FORMAT_R32G32B32A32_FLOAT;
michael@0 360 case GL_RGBA16F_EXT:
michael@0 361 case GL_ALPHA16F_EXT:
michael@0 362 case GL_LUMINANCE_ALPHA16F_EXT:
michael@0 363 case GL_RGB16F_EXT:
michael@0 364 case GL_LUMINANCE16F_EXT:
michael@0 365 return DXGI_FORMAT_R16G16B16A16_FLOAT;
michael@0 366 case GL_BGRA8_EXT:
michael@0 367 return DXGI_FORMAT_B8G8R8A8_UNORM;
michael@0 368 case GL_R8_EXT:
michael@0 369 return DXGI_FORMAT_R8_UNORM;
michael@0 370 case GL_RG8_EXT:
michael@0 371 return DXGI_FORMAT_R8G8_UNORM;
michael@0 372 case GL_R16F_EXT:
michael@0 373 return DXGI_FORMAT_R16_FLOAT;
michael@0 374 case GL_RG16F_EXT:
michael@0 375 return DXGI_FORMAT_R16G16_FLOAT;
michael@0 376 case GL_DEPTH_COMPONENT16:
michael@0 377 return DXGI_FORMAT_D16_UNORM;
michael@0 378 case GL_DEPTH_COMPONENT32_OES:
michael@0 379 case GL_DEPTH24_STENCIL8_OES:
michael@0 380 return DXGI_FORMAT_D24_UNORM_S8_UINT;
michael@0 381 case GL_NONE:
michael@0 382 return DXGI_FORMAT_UNKNOWN;
michael@0 383 default:
michael@0 384 UNREACHABLE();
michael@0 385 }
michael@0 386
michael@0 387 return DXGI_FORMAT_R8G8B8A8_UNORM;
michael@0 388 }
michael@0 389
michael@0 390 }
michael@0 391
michael@0 392 namespace d3d11
michael@0 393 {
michael@0 394
michael@0 395 void SetPositionTexCoordVertex(PositionTexCoordVertex* vertex, float x, float y, float u, float v)
michael@0 396 {
michael@0 397 vertex->x = x;
michael@0 398 vertex->y = y;
michael@0 399 vertex->u = u;
michael@0 400 vertex->v = v;
michael@0 401 }
michael@0 402
michael@0 403 void SetPositionDepthColorVertex(PositionDepthColorVertex* vertex, float x, float y, float z,
michael@0 404 const gl::Color &color)
michael@0 405 {
michael@0 406 vertex->x = x;
michael@0 407 vertex->y = y;
michael@0 408 vertex->z = z;
michael@0 409 vertex->r = color.red;
michael@0 410 vertex->g = color.green;
michael@0 411 vertex->b = color.blue;
michael@0 412 vertex->a = color.alpha;
michael@0 413 }
michael@0 414
michael@0 415 size_t ComputePixelSizeBits(DXGI_FORMAT format)
michael@0 416 {
michael@0 417 switch (format)
michael@0 418 {
michael@0 419 case DXGI_FORMAT_R1_UNORM:
michael@0 420 return 1;
michael@0 421
michael@0 422 case DXGI_FORMAT_A8_UNORM:
michael@0 423 case DXGI_FORMAT_R8_SINT:
michael@0 424 case DXGI_FORMAT_R8_SNORM:
michael@0 425 case DXGI_FORMAT_R8_TYPELESS:
michael@0 426 case DXGI_FORMAT_R8_UINT:
michael@0 427 case DXGI_FORMAT_R8_UNORM:
michael@0 428 return 8;
michael@0 429
michael@0 430 case DXGI_FORMAT_B5G5R5A1_UNORM:
michael@0 431 case DXGI_FORMAT_B5G6R5_UNORM:
michael@0 432 case DXGI_FORMAT_D16_UNORM:
michael@0 433 case DXGI_FORMAT_R16_FLOAT:
michael@0 434 case DXGI_FORMAT_R16_SINT:
michael@0 435 case DXGI_FORMAT_R16_SNORM:
michael@0 436 case DXGI_FORMAT_R16_TYPELESS:
michael@0 437 case DXGI_FORMAT_R16_UINT:
michael@0 438 case DXGI_FORMAT_R16_UNORM:
michael@0 439 case DXGI_FORMAT_R8G8_SINT:
michael@0 440 case DXGI_FORMAT_R8G8_SNORM:
michael@0 441 case DXGI_FORMAT_R8G8_TYPELESS:
michael@0 442 case DXGI_FORMAT_R8G8_UINT:
michael@0 443 case DXGI_FORMAT_R8G8_UNORM:
michael@0 444 return 16;
michael@0 445
michael@0 446 case DXGI_FORMAT_B8G8R8X8_TYPELESS:
michael@0 447 case DXGI_FORMAT_B8G8R8X8_UNORM:
michael@0 448 case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
michael@0 449 case DXGI_FORMAT_D24_UNORM_S8_UINT:
michael@0 450 case DXGI_FORMAT_D32_FLOAT:
michael@0 451 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
michael@0 452 case DXGI_FORMAT_G8R8_G8B8_UNORM:
michael@0 453 case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
michael@0 454 case DXGI_FORMAT_R10G10B10A2_TYPELESS:
michael@0 455 case DXGI_FORMAT_R10G10B10A2_UINT:
michael@0 456 case DXGI_FORMAT_R10G10B10A2_UNORM:
michael@0 457 case DXGI_FORMAT_R11G11B10_FLOAT:
michael@0 458 case DXGI_FORMAT_R16G16_FLOAT:
michael@0 459 case DXGI_FORMAT_R16G16_SINT:
michael@0 460 case DXGI_FORMAT_R16G16_SNORM:
michael@0 461 case DXGI_FORMAT_R16G16_TYPELESS:
michael@0 462 case DXGI_FORMAT_R16G16_UINT:
michael@0 463 case DXGI_FORMAT_R16G16_UNORM:
michael@0 464 case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
michael@0 465 case DXGI_FORMAT_R24G8_TYPELESS:
michael@0 466 case DXGI_FORMAT_R32_FLOAT:
michael@0 467 case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
michael@0 468 case DXGI_FORMAT_R32_SINT:
michael@0 469 case DXGI_FORMAT_R32_TYPELESS:
michael@0 470 case DXGI_FORMAT_R32_UINT:
michael@0 471 case DXGI_FORMAT_R8G8_B8G8_UNORM:
michael@0 472 case DXGI_FORMAT_R8G8B8A8_SINT:
michael@0 473 case DXGI_FORMAT_R8G8B8A8_SNORM:
michael@0 474 case DXGI_FORMAT_R8G8B8A8_TYPELESS:
michael@0 475 case DXGI_FORMAT_R8G8B8A8_UINT:
michael@0 476 case DXGI_FORMAT_R8G8B8A8_UNORM:
michael@0 477 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
michael@0 478 case DXGI_FORMAT_B8G8R8A8_TYPELESS:
michael@0 479 case DXGI_FORMAT_B8G8R8A8_UNORM:
michael@0 480 case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
michael@0 481 case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
michael@0 482 case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
michael@0 483 case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
michael@0 484 return 32;
michael@0 485
michael@0 486 case DXGI_FORMAT_R16G16B16A16_FLOAT:
michael@0 487 case DXGI_FORMAT_R16G16B16A16_SINT:
michael@0 488 case DXGI_FORMAT_R16G16B16A16_SNORM:
michael@0 489 case DXGI_FORMAT_R16G16B16A16_TYPELESS:
michael@0 490 case DXGI_FORMAT_R16G16B16A16_UINT:
michael@0 491 case DXGI_FORMAT_R16G16B16A16_UNORM:
michael@0 492 case DXGI_FORMAT_R32G32_FLOAT:
michael@0 493 case DXGI_FORMAT_R32G32_SINT:
michael@0 494 case DXGI_FORMAT_R32G32_TYPELESS:
michael@0 495 case DXGI_FORMAT_R32G32_UINT:
michael@0 496 case DXGI_FORMAT_R32G8X24_TYPELESS:
michael@0 497 return 64;
michael@0 498
michael@0 499 case DXGI_FORMAT_R32G32B32_FLOAT:
michael@0 500 case DXGI_FORMAT_R32G32B32_SINT:
michael@0 501 case DXGI_FORMAT_R32G32B32_TYPELESS:
michael@0 502 case DXGI_FORMAT_R32G32B32_UINT:
michael@0 503 return 96;
michael@0 504
michael@0 505 case DXGI_FORMAT_R32G32B32A32_FLOAT:
michael@0 506 case DXGI_FORMAT_R32G32B32A32_SINT:
michael@0 507 case DXGI_FORMAT_R32G32B32A32_TYPELESS:
michael@0 508 case DXGI_FORMAT_R32G32B32A32_UINT:
michael@0 509 return 128;
michael@0 510
michael@0 511 case DXGI_FORMAT_BC1_TYPELESS:
michael@0 512 case DXGI_FORMAT_BC1_UNORM:
michael@0 513 case DXGI_FORMAT_BC1_UNORM_SRGB:
michael@0 514 case DXGI_FORMAT_BC4_SNORM:
michael@0 515 case DXGI_FORMAT_BC4_TYPELESS:
michael@0 516 case DXGI_FORMAT_BC4_UNORM:
michael@0 517 return 4;
michael@0 518
michael@0 519 case DXGI_FORMAT_BC2_TYPELESS:
michael@0 520 case DXGI_FORMAT_BC2_UNORM:
michael@0 521 case DXGI_FORMAT_BC2_UNORM_SRGB:
michael@0 522 case DXGI_FORMAT_BC3_TYPELESS:
michael@0 523 case DXGI_FORMAT_BC3_UNORM:
michael@0 524 case DXGI_FORMAT_BC3_UNORM_SRGB:
michael@0 525 case DXGI_FORMAT_BC5_SNORM:
michael@0 526 case DXGI_FORMAT_BC5_TYPELESS:
michael@0 527 case DXGI_FORMAT_BC5_UNORM:
michael@0 528 case DXGI_FORMAT_BC6H_SF16:
michael@0 529 case DXGI_FORMAT_BC6H_TYPELESS:
michael@0 530 case DXGI_FORMAT_BC6H_UF16:
michael@0 531 case DXGI_FORMAT_BC7_TYPELESS:
michael@0 532 case DXGI_FORMAT_BC7_UNORM:
michael@0 533 case DXGI_FORMAT_BC7_UNORM_SRGB:
michael@0 534 return 8;
michael@0 535
michael@0 536 default:
michael@0 537 return 0;
michael@0 538 }
michael@0 539 }
michael@0 540
michael@0 541 size_t ComputeBlockSizeBits(DXGI_FORMAT format)
michael@0 542 {
michael@0 543 switch (format)
michael@0 544 {
michael@0 545 case DXGI_FORMAT_BC1_TYPELESS:
michael@0 546 case DXGI_FORMAT_BC1_UNORM:
michael@0 547 case DXGI_FORMAT_BC1_UNORM_SRGB:
michael@0 548 case DXGI_FORMAT_BC4_SNORM:
michael@0 549 case DXGI_FORMAT_BC4_TYPELESS:
michael@0 550 case DXGI_FORMAT_BC4_UNORM:
michael@0 551 case DXGI_FORMAT_BC2_TYPELESS:
michael@0 552 case DXGI_FORMAT_BC2_UNORM:
michael@0 553 case DXGI_FORMAT_BC2_UNORM_SRGB:
michael@0 554 case DXGI_FORMAT_BC3_TYPELESS:
michael@0 555 case DXGI_FORMAT_BC3_UNORM:
michael@0 556 case DXGI_FORMAT_BC3_UNORM_SRGB:
michael@0 557 case DXGI_FORMAT_BC5_SNORM:
michael@0 558 case DXGI_FORMAT_BC5_TYPELESS:
michael@0 559 case DXGI_FORMAT_BC5_UNORM:
michael@0 560 case DXGI_FORMAT_BC6H_SF16:
michael@0 561 case DXGI_FORMAT_BC6H_TYPELESS:
michael@0 562 case DXGI_FORMAT_BC6H_UF16:
michael@0 563 case DXGI_FORMAT_BC7_TYPELESS:
michael@0 564 case DXGI_FORMAT_BC7_UNORM:
michael@0 565 case DXGI_FORMAT_BC7_UNORM_SRGB:
michael@0 566 return ComputePixelSizeBits(format) * 16;
michael@0 567 default:
michael@0 568 UNREACHABLE();
michael@0 569 return 0;
michael@0 570 }
michael@0 571 }
michael@0 572
michael@0 573 bool IsCompressed(DXGI_FORMAT format)
michael@0 574 {
michael@0 575 switch (format)
michael@0 576 {
michael@0 577 case DXGI_FORMAT_BC1_TYPELESS:
michael@0 578 case DXGI_FORMAT_BC1_UNORM:
michael@0 579 case DXGI_FORMAT_BC1_UNORM_SRGB:
michael@0 580 case DXGI_FORMAT_BC4_SNORM:
michael@0 581 case DXGI_FORMAT_BC4_TYPELESS:
michael@0 582 case DXGI_FORMAT_BC4_UNORM:
michael@0 583 case DXGI_FORMAT_BC2_TYPELESS:
michael@0 584 case DXGI_FORMAT_BC2_UNORM:
michael@0 585 case DXGI_FORMAT_BC2_UNORM_SRGB:
michael@0 586 case DXGI_FORMAT_BC3_TYPELESS:
michael@0 587 case DXGI_FORMAT_BC3_UNORM:
michael@0 588 case DXGI_FORMAT_BC3_UNORM_SRGB:
michael@0 589 case DXGI_FORMAT_BC5_SNORM:
michael@0 590 case DXGI_FORMAT_BC5_TYPELESS:
michael@0 591 case DXGI_FORMAT_BC5_UNORM:
michael@0 592 case DXGI_FORMAT_BC6H_SF16:
michael@0 593 case DXGI_FORMAT_BC6H_TYPELESS:
michael@0 594 case DXGI_FORMAT_BC6H_UF16:
michael@0 595 case DXGI_FORMAT_BC7_TYPELESS:
michael@0 596 case DXGI_FORMAT_BC7_UNORM:
michael@0 597 case DXGI_FORMAT_BC7_UNORM_SRGB:
michael@0 598 return true;
michael@0 599 case DXGI_FORMAT_UNKNOWN:
michael@0 600 UNREACHABLE();
michael@0 601 return false;
michael@0 602 default:
michael@0 603 return false;
michael@0 604 }
michael@0 605 }
michael@0 606
michael@0 607 unsigned int GetTextureFormatDimensionAlignment(DXGI_FORMAT format)
michael@0 608 {
michael@0 609 switch (format)
michael@0 610 {
michael@0 611 case DXGI_FORMAT_BC1_TYPELESS:
michael@0 612 case DXGI_FORMAT_BC1_UNORM:
michael@0 613 case DXGI_FORMAT_BC1_UNORM_SRGB:
michael@0 614 case DXGI_FORMAT_BC4_SNORM:
michael@0 615 case DXGI_FORMAT_BC4_TYPELESS:
michael@0 616 case DXGI_FORMAT_BC4_UNORM:
michael@0 617 case DXGI_FORMAT_BC2_TYPELESS:
michael@0 618 case DXGI_FORMAT_BC2_UNORM:
michael@0 619 case DXGI_FORMAT_BC2_UNORM_SRGB:
michael@0 620 case DXGI_FORMAT_BC3_TYPELESS:
michael@0 621 case DXGI_FORMAT_BC3_UNORM:
michael@0 622 case DXGI_FORMAT_BC3_UNORM_SRGB:
michael@0 623 case DXGI_FORMAT_BC5_SNORM:
michael@0 624 case DXGI_FORMAT_BC5_TYPELESS:
michael@0 625 case DXGI_FORMAT_BC5_UNORM:
michael@0 626 case DXGI_FORMAT_BC6H_SF16:
michael@0 627 case DXGI_FORMAT_BC6H_TYPELESS:
michael@0 628 case DXGI_FORMAT_BC6H_UF16:
michael@0 629 case DXGI_FORMAT_BC7_TYPELESS:
michael@0 630 case DXGI_FORMAT_BC7_UNORM:
michael@0 631 case DXGI_FORMAT_BC7_UNORM_SRGB:
michael@0 632 return 4;
michael@0 633 case DXGI_FORMAT_UNKNOWN:
michael@0 634 UNREACHABLE();
michael@0 635 return 1;
michael@0 636 default:
michael@0 637 return 1;
michael@0 638 }
michael@0 639 }
michael@0 640
michael@0 641 bool IsDepthStencilFormat(DXGI_FORMAT format)
michael@0 642 {
michael@0 643 switch (format)
michael@0 644 {
michael@0 645 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
michael@0 646 case DXGI_FORMAT_D32_FLOAT:
michael@0 647 case DXGI_FORMAT_D24_UNORM_S8_UINT:
michael@0 648 case DXGI_FORMAT_D16_UNORM:
michael@0 649 return true;
michael@0 650 default:
michael@0 651 return false;
michael@0 652 }
michael@0 653 }
michael@0 654
michael@0 655 DXGI_FORMAT GetDepthTextureFormat(DXGI_FORMAT format)
michael@0 656 {
michael@0 657 switch (format)
michael@0 658 {
michael@0 659 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: return DXGI_FORMAT_R32G8X24_TYPELESS;
michael@0 660 case DXGI_FORMAT_D32_FLOAT: return DXGI_FORMAT_R32_TYPELESS;
michael@0 661 case DXGI_FORMAT_D24_UNORM_S8_UINT: return DXGI_FORMAT_R24G8_TYPELESS;
michael@0 662 case DXGI_FORMAT_D16_UNORM: return DXGI_FORMAT_R16_TYPELESS;
michael@0 663 default: UNREACHABLE(); return DXGI_FORMAT_UNKNOWN;
michael@0 664 }
michael@0 665 }
michael@0 666
michael@0 667 DXGI_FORMAT GetDepthShaderResourceFormat(DXGI_FORMAT format)
michael@0 668 {
michael@0 669 switch (format)
michael@0 670 {
michael@0 671 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: return DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS;
michael@0 672 case DXGI_FORMAT_D32_FLOAT: return DXGI_FORMAT_R32_UINT;
michael@0 673 case DXGI_FORMAT_D24_UNORM_S8_UINT: return DXGI_FORMAT_R24_UNORM_X8_TYPELESS;
michael@0 674 case DXGI_FORMAT_D16_UNORM: return DXGI_FORMAT_R16_UNORM;
michael@0 675 default: UNREACHABLE(); return DXGI_FORMAT_UNKNOWN;
michael@0 676 }
michael@0 677 }
michael@0 678
michael@0 679 HRESULT SetDebugName(ID3D11DeviceChild *resource, const char *name)
michael@0 680 {
michael@0 681 #if defined(_DEBUG)
michael@0 682 return resource->SetPrivateData(WKPDID_D3DDebugObjectName, strlen(name), name);
michael@0 683 #else
michael@0 684 return S_OK;
michael@0 685 #endif
michael@0 686 }
michael@0 687
michael@0 688 }

mercurial