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.

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

mercurial