tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

WebGLContextUtils.cpp (18382B)


      1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 #include "WebGLContextUtils.h"
      7 
      8 #include "GLContext.h"
      9 #include "HostWebGLContext.h"
     10 #include "WebGLBuffer.h"
     11 #include "WebGLContext.h"
     12 #include "WebGLExtensions.h"
     13 #include "WebGLFramebuffer.h"
     14 #include "WebGLProgram.h"
     15 #include "WebGLTexture.h"
     16 #include "WebGLVertexArray.h"
     17 #include "js/Warnings.h"  // JS::WarnASCII
     18 #include "jsapi.h"
     19 #include "mozilla/Preferences.h"
     20 #include "mozilla/Sprintf.h"
     21 #include "mozilla/dom/ScriptSettings.h"
     22 #include "mozilla/gfx/Logging.h"
     23 #include "nsPrintfCString.h"
     24 #include "nsServiceManagerUtils.h"
     25 
     26 namespace mozilla {
     27 
     28 TexTarget TexImageTargetToTexTarget(TexImageTarget texImageTarget) {
     29  switch (texImageTarget.get()) {
     30    case LOCAL_GL_TEXTURE_CUBE_MAP_POSITIVE_X:
     31    case LOCAL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
     32    case LOCAL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
     33    case LOCAL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
     34    case LOCAL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
     35    case LOCAL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
     36      return LOCAL_GL_TEXTURE_CUBE_MAP;
     37 
     38    default:
     39      return texImageTarget.get();
     40  }
     41 }
     42 
     43 /*static*/ const char* WebGLContext::ErrorName(GLenum error) {
     44  switch (error) {
     45    case LOCAL_GL_INVALID_ENUM:
     46      return "INVALID_ENUM";
     47    case LOCAL_GL_INVALID_OPERATION:
     48      return "INVALID_OPERATION";
     49    case LOCAL_GL_INVALID_VALUE:
     50      return "INVALID_VALUE";
     51    case LOCAL_GL_OUT_OF_MEMORY:
     52      return "OUT_OF_MEMORY";
     53    case LOCAL_GL_INVALID_FRAMEBUFFER_OPERATION:
     54      return "INVALID_FRAMEBUFFER_OPERATION";
     55    case LOCAL_GL_NO_ERROR:
     56      return "NO_ERROR";
     57    default:
     58      MOZ_ASSERT(false);
     59      return "[unknown WebGL error]";
     60  }
     61 }
     62 
     63 // This version is fallible and will return nullptr if unrecognized.
     64 const char* GetEnumName(const GLenum val, const char* const defaultRet) {
     65  switch (val) {
     66    case 0:  // AKA NONE, POINTS
     67      return "0";
     68 
     69 #define XX(x)        \
     70  case LOCAL_GL_##x: \
     71    return #x;
     72 
     73      XX(ACTIVE_UNIFORM_BLOCKS)
     74      XX(ALPHA)
     75      XX(ALREADY_SIGNALED)
     76      XX(ANY_SAMPLES_PASSED)
     77      XX(ANY_SAMPLES_PASSED_CONSERVATIVE)
     78      XX(BLUE)
     79      XX(BYTE)
     80      XX(COLOR)
     81      XX(COLOR_ATTACHMENT0)
     82      XX(COLOR_ATTACHMENT1)
     83      XX(COLOR_ATTACHMENT10)
     84      XX(COLOR_ATTACHMENT11)
     85      XX(COLOR_ATTACHMENT12)
     86      XX(COLOR_ATTACHMENT13)
     87      XX(COLOR_ATTACHMENT14)
     88      XX(COLOR_ATTACHMENT15)
     89      XX(COLOR_ATTACHMENT2)
     90      XX(COLOR_ATTACHMENT3)
     91      XX(COLOR_ATTACHMENT4)
     92      XX(COLOR_ATTACHMENT5)
     93      XX(COLOR_ATTACHMENT6)
     94      XX(COLOR_ATTACHMENT7)
     95      XX(COLOR_ATTACHMENT8)
     96      XX(COLOR_ATTACHMENT9)
     97      XX(COMPARE_REF_TO_TEXTURE)
     98      XX(COMPRESSED_R11_EAC)
     99      XX(COMPRESSED_RG11_EAC)
    100      XX(COMPRESSED_RGB8_ETC2)
    101      XX(COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2)
    102      XX(COMPRESSED_RGBA8_ETC2_EAC)
    103      XX(COMPRESSED_RGBA_PVRTC_2BPPV1)
    104      XX(COMPRESSED_RGBA_PVRTC_4BPPV1)
    105      XX(COMPRESSED_RGBA_S3TC_DXT1_EXT)
    106      XX(COMPRESSED_RGBA_S3TC_DXT3_EXT)
    107      XX(COMPRESSED_RGBA_S3TC_DXT5_EXT)
    108      XX(COMPRESSED_RGB_PVRTC_2BPPV1)
    109      XX(COMPRESSED_RGB_PVRTC_4BPPV1)
    110      XX(COMPRESSED_RGB_S3TC_DXT1_EXT)
    111      XX(COMPRESSED_SIGNED_R11_EAC)
    112      XX(COMPRESSED_SIGNED_RG11_EAC)
    113      XX(COMPRESSED_SRGB8_ALPHA8_ETC2_EAC)
    114      XX(COMPRESSED_SRGB8_ETC2)
    115      XX(COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2)
    116      XX(CONDITION_SATISFIED)
    117      XX(COPY_READ_BUFFER)
    118      XX(COPY_WRITE_BUFFER)
    119      XX(CURRENT_QUERY)
    120      XX(DEPTH)
    121      XX(DEPTH24_STENCIL8)
    122      XX(DEPTH32F_STENCIL8)
    123      XX(DEPTH_ATTACHMENT)
    124      XX(DEPTH_COMPONENT)
    125      XX(DEPTH_COMPONENT16)
    126      XX(DEPTH_COMPONENT24)
    127      XX(DEPTH_COMPONENT32)
    128      XX(DEPTH_COMPONENT32F)
    129      XX(DEPTH_STENCIL)
    130      XX(DEPTH_STENCIL_ATTACHMENT)
    131      XX(DRAW_BUFFER0)
    132      XX(DRAW_BUFFER1)
    133      XX(DRAW_BUFFER10)
    134      XX(DRAW_BUFFER11)
    135      XX(DRAW_BUFFER12)
    136      XX(DRAW_BUFFER13)
    137      XX(DRAW_BUFFER14)
    138      XX(DRAW_BUFFER15)
    139      XX(DRAW_BUFFER2)
    140      XX(DRAW_BUFFER3)
    141      XX(DRAW_BUFFER4)
    142      XX(DRAW_BUFFER5)
    143      XX(DRAW_BUFFER6)
    144      XX(DRAW_BUFFER7)
    145      XX(DRAW_BUFFER8)
    146      XX(DRAW_BUFFER9)
    147      XX(DRAW_FRAMEBUFFER)
    148      XX(DRAW_FRAMEBUFFER_BINDING)
    149      XX(DYNAMIC_COPY)
    150      XX(DYNAMIC_READ)
    151      XX(ETC1_RGB8_OES)
    152      XX(FLOAT)
    153      XX(FLOAT_32_UNSIGNED_INT_24_8_REV)
    154      XX(FLOAT_MAT2x3)
    155      XX(FLOAT_MAT2x4)
    156      XX(FLOAT_MAT3x2)
    157      XX(FLOAT_MAT3x4)
    158      XX(FLOAT_MAT4x2)
    159      XX(FLOAT_MAT4x3)
    160      XX(FRAGMENT_SHADER_DERIVATIVE_HINT)
    161      XX(FRAMEBUFFER)
    162      XX(FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE)
    163      XX(FRAMEBUFFER_ATTACHMENT_BLUE_SIZE)
    164      XX(FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING)
    165      XX(FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE)
    166      XX(FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE)
    167      XX(FRAMEBUFFER_ATTACHMENT_GREEN_SIZE)
    168      XX(FRAMEBUFFER_ATTACHMENT_RED_SIZE)
    169      XX(FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE)
    170      XX(FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER)
    171      XX(FRAMEBUFFER_DEFAULT)
    172      XX(FRAMEBUFFER_INCOMPLETE_MULTISAMPLE)
    173      XX(GREEN)
    174      XX(HALF_FLOAT)
    175      XX(INT)
    176      XX(INTERLEAVED_ATTRIBS)
    177      XX(INT_2_10_10_10_REV)
    178      XX(INT_SAMPLER_2D)
    179      XX(INT_SAMPLER_2D_ARRAY)
    180      XX(INT_SAMPLER_3D)
    181      XX(INT_SAMPLER_CUBE)
    182      XX(LUMINANCE)
    183      XX(LUMINANCE_ALPHA)
    184      XX(MAX)
    185      XX(MAX_3D_TEXTURE_SIZE)
    186      XX(MAX_ARRAY_TEXTURE_LAYERS)
    187      XX(MAX_COLOR_ATTACHMENTS)
    188      XX(MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS)
    189      XX(MAX_COMBINED_UNIFORM_BLOCKS)
    190      XX(MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS)
    191      XX(MAX_DRAW_BUFFERS)
    192      XX(MAX_ELEMENTS_INDICES)
    193      XX(MAX_ELEMENTS_VERTICES)
    194      XX(MAX_ELEMENT_INDEX)
    195      XX(MAX_FRAGMENT_INPUT_COMPONENTS)
    196      XX(MAX_FRAGMENT_UNIFORM_BLOCKS)
    197      XX(MAX_FRAGMENT_UNIFORM_COMPONENTS)
    198      XX(MAX_PROGRAM_TEXEL_OFFSET)
    199      XX(MAX_SAMPLES)
    200      XX(MAX_SERVER_WAIT_TIMEOUT)
    201      XX(MAX_TEXTURE_LOD_BIAS)
    202      XX(MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS)
    203      XX(MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS)
    204      XX(MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS)
    205      XX(MAX_UNIFORM_BLOCK_SIZE)
    206      XX(MAX_UNIFORM_BUFFER_BINDINGS)
    207      XX(MAX_VARYING_COMPONENTS)
    208      XX(MAX_VERTEX_OUTPUT_COMPONENTS)
    209      XX(MAX_VERTEX_UNIFORM_BLOCKS)
    210      XX(MAX_VERTEX_UNIFORM_COMPONENTS)
    211      XX(MIN)
    212      XX(MIN_PROGRAM_TEXEL_OFFSET)
    213      XX(NUM_SAMPLE_COUNTS)
    214      XX(OBJECT_TYPE)
    215      XX(PACK_ROW_LENGTH)
    216      XX(PACK_SKIP_PIXELS)
    217      XX(PACK_SKIP_ROWS)
    218      XX(PIXEL_PACK_BUFFER)
    219      XX(PIXEL_PACK_BUFFER_BINDING)
    220      XX(PIXEL_UNPACK_BUFFER)
    221      XX(PIXEL_UNPACK_BUFFER_BINDING)
    222      XX(PRIMITIVE_RESTART_FIXED_INDEX)
    223      XX(QUERY_RESULT)
    224      XX(QUERY_RESULT_AVAILABLE)
    225      XX(R11F_G11F_B10F)
    226      XX(R16F)
    227      XX(R16I)
    228      XX(R16UI)
    229      XX(R32F)
    230      XX(R32I)
    231      XX(R32UI)
    232      XX(R8)
    233      XX(R8I)
    234      XX(R8UI)
    235      XX(R8_SNORM)
    236      XX(RASTERIZER_DISCARD)
    237      XX(READ_BUFFER)
    238      XX(READ_FRAMEBUFFER)
    239      XX(READ_FRAMEBUFFER_BINDING)
    240      XX(RED)
    241      XX(RED_INTEGER)
    242      XX(RENDERBUFFER_SAMPLES)
    243      XX(RG)
    244      XX(RG16F)
    245      XX(RG16I)
    246      XX(RG16UI)
    247      XX(RG32F)
    248      XX(RG32I)
    249      XX(RG32UI)
    250      XX(RG8)
    251      XX(RG8I)
    252      XX(RG8UI)
    253      XX(RG8_SNORM)
    254      XX(RGB)
    255      XX(RGB10_A2)
    256      XX(RGB10_A2UI)
    257      XX(RGB16F)
    258      XX(RGB16I)
    259      XX(RGB16UI)
    260      XX(RGB32F)
    261      XX(RGB32I)
    262      XX(RGB32UI)
    263      XX(RGB8)
    264      XX(RGB8I)
    265      XX(RGB8UI)
    266      XX(RGB8_SNORM)
    267      XX(RGB9_E5)
    268      XX(RGBA)
    269      XX(RGBA16F)
    270      XX(RGBA16I)
    271      XX(RGBA16UI)
    272      XX(RGBA32F)
    273      XX(RGBA32I)
    274      XX(RGBA32UI)
    275      XX(RGBA8)
    276      XX(RGBA8I)
    277      XX(RGBA8UI)
    278      XX(RGBA8_SNORM)
    279      XX(RGBA_INTEGER)
    280      XX(RGB_INTEGER)
    281      XX(RG_INTEGER)
    282      XX(SAMPLER_2D)
    283      XX(SAMPLER_2D_ARRAY)
    284      XX(SAMPLER_2D_ARRAY_SHADOW)
    285      XX(SAMPLER_2D_SHADOW)
    286      XX(SAMPLER_3D)
    287      XX(SAMPLER_BINDING)
    288      XX(SAMPLER_CUBE)
    289      XX(SAMPLER_CUBE_SHADOW)
    290      XX(SEPARATE_ATTRIBS)
    291      XX(SHORT)
    292      XX(SIGNALED)
    293      XX(SIGNED_NORMALIZED)
    294      XX(SRGB)
    295      XX(SRGB8)
    296      XX(SRGB8_ALPHA8)
    297      XX(SRGB_ALPHA)
    298      XX(STATIC_COPY)
    299      XX(STATIC_READ)
    300      XX(STENCIL)
    301      XX(STREAM_COPY)
    302      XX(STREAM_READ)
    303      XX(SYNC_CONDITION)
    304      XX(SYNC_FENCE)
    305      XX(SYNC_FLAGS)
    306      XX(SYNC_GPU_COMMANDS_COMPLETE)
    307      XX(SYNC_STATUS)
    308      XX(TEXTURE_2D)
    309      XX(TEXTURE_2D_ARRAY)
    310      XX(TEXTURE_3D)
    311      XX(TEXTURE_BASE_LEVEL)
    312      XX(TEXTURE_BINDING_2D_ARRAY)
    313      XX(TEXTURE_BINDING_3D)
    314      XX(TEXTURE_COMPARE_FUNC)
    315      XX(TEXTURE_COMPARE_MODE)
    316      XX(TEXTURE_CUBE_MAP)
    317      XX(TEXTURE_CUBE_MAP_NEGATIVE_X)
    318      XX(TEXTURE_CUBE_MAP_NEGATIVE_Y)
    319      XX(TEXTURE_CUBE_MAP_NEGATIVE_Z)
    320      XX(TEXTURE_CUBE_MAP_POSITIVE_X)
    321      XX(TEXTURE_CUBE_MAP_POSITIVE_Y)
    322      XX(TEXTURE_CUBE_MAP_POSITIVE_Z)
    323      XX(TEXTURE_IMMUTABLE_FORMAT)
    324      XX(TEXTURE_IMMUTABLE_LEVELS)
    325      XX(TEXTURE_MAX_LEVEL)
    326      XX(TEXTURE_MAX_LOD)
    327      XX(TEXTURE_MIN_LOD)
    328      XX(TEXTURE_SWIZZLE_A)
    329      XX(TEXTURE_SWIZZLE_B)
    330      XX(TEXTURE_SWIZZLE_G)
    331      XX(TEXTURE_SWIZZLE_R)
    332      XX(TEXTURE_WRAP_R)
    333      XX(TIMEOUT_EXPIRED)
    334      XX(TRANSFORM_FEEDBACK)
    335      XX(TRANSFORM_FEEDBACK_ACTIVE)
    336      XX(TRANSFORM_FEEDBACK_BINDING)
    337      XX(TRANSFORM_FEEDBACK_BUFFER)
    338      XX(TRANSFORM_FEEDBACK_BUFFER_BINDING)
    339      XX(TRANSFORM_FEEDBACK_BUFFER_MODE)
    340      XX(TRANSFORM_FEEDBACK_BUFFER_SIZE)
    341      XX(TRANSFORM_FEEDBACK_BUFFER_START)
    342      XX(TRANSFORM_FEEDBACK_PAUSED)
    343      XX(TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN)
    344      XX(TRANSFORM_FEEDBACK_VARYINGS)
    345      XX(UNIFORM_ARRAY_STRIDE)
    346      XX(UNIFORM_BLOCK_ACTIVE_UNIFORMS)
    347      XX(UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES)
    348      XX(UNIFORM_BLOCK_BINDING)
    349      XX(UNIFORM_BLOCK_DATA_SIZE)
    350      XX(UNIFORM_BLOCK_INDEX)
    351      XX(UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER)
    352      XX(UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER)
    353      XX(UNIFORM_BUFFER)
    354      XX(UNIFORM_BUFFER_BINDING)
    355      XX(UNIFORM_BUFFER_OFFSET_ALIGNMENT)
    356      XX(UNIFORM_BUFFER_SIZE)
    357      XX(UNIFORM_BUFFER_START)
    358      XX(UNIFORM_IS_ROW_MAJOR)
    359      XX(UNIFORM_MATRIX_STRIDE)
    360      XX(UNIFORM_OFFSET)
    361      XX(UNIFORM_SIZE)
    362      XX(UNIFORM_TYPE)
    363      XX(UNPACK_IMAGE_HEIGHT)
    364      XX(UNPACK_ROW_LENGTH)
    365      XX(UNPACK_SKIP_IMAGES)
    366      XX(UNPACK_SKIP_PIXELS)
    367      XX(UNPACK_SKIP_ROWS)
    368      XX(UNSIGNALED)
    369      XX(UNSIGNED_BYTE)
    370      XX(UNSIGNED_INT)
    371      XX(UNSIGNED_INT_10F_11F_11F_REV)
    372      XX(UNSIGNED_INT_24_8)
    373      XX(UNSIGNED_INT_2_10_10_10_REV)
    374      XX(UNSIGNED_INT_5_9_9_9_REV)
    375      XX(UNSIGNED_INT_SAMPLER_2D)
    376      XX(UNSIGNED_INT_SAMPLER_2D_ARRAY)
    377      XX(UNSIGNED_INT_SAMPLER_3D)
    378      XX(UNSIGNED_INT_SAMPLER_CUBE)
    379      XX(UNSIGNED_INT_VEC2)
    380      XX(UNSIGNED_INT_VEC3)
    381      XX(UNSIGNED_INT_VEC4)
    382      XX(UNSIGNED_NORMALIZED)
    383      XX(UNSIGNED_SHORT)
    384      XX(UNSIGNED_SHORT_4_4_4_4)
    385      XX(UNSIGNED_SHORT_5_5_5_1)
    386      XX(UNSIGNED_SHORT_5_6_5)
    387      XX(VERTEX_ARRAY_BINDING)
    388      XX(VERTEX_ATTRIB_ARRAY_DIVISOR)
    389      XX(VERTEX_ATTRIB_ARRAY_INTEGER)
    390      XX(WAIT_FAILED)
    391 
    392 #undef XX
    393  }
    394 
    395  return defaultRet;
    396 }
    397 
    398 /*static*/
    399 void WebGLContext::EnumName(GLenum val, nsCString* out_name) {
    400  const char* name = GetEnumName(val, nullptr);
    401  if (name) {
    402    *out_name = name;
    403    return;
    404  }
    405 
    406  *out_name = nsPrintfCString("<enum 0x%04x>", val);
    407 }
    408 
    409 std::string EnumString(const GLenum val) {
    410  const char* name = GetEnumName(val, nullptr);
    411  if (name) {
    412    return name;
    413  }
    414 
    415  const nsPrintfCString hex("<enum 0x%04x>", val);
    416  return hex.BeginReading();
    417 }
    418 
    419 void WebGLContext::ErrorInvalidEnumArg(const char* const argName,
    420                                       const GLenum val) const {
    421  const auto info = nsPrintfCString("Bad `%s`", argName);
    422  ErrorInvalidEnumInfo(info.BeginReading(), val);
    423 }
    424 
    425 void WebGLContext::ErrorInvalidEnumInfo(const char* const info,
    426                                        const GLenum enumValue) const {
    427  nsCString name;
    428  EnumName(enumValue, &name);
    429 
    430  const char* hint = "";
    431  if (!enumValue) {
    432    hint = " (Did you typo `gl.SOMETHINGG` and pass `undefined`?)";
    433  }
    434 
    435  ErrorInvalidEnum("%s: Invalid enum value %s%s", info, name.BeginReading(),
    436                   hint);
    437 }
    438 
    439 #ifdef DEBUG
    440 // For NaNs, etc.
    441 static bool IsCacheCorrect(float cached, float actual) {
    442  if (std::isnan(cached)) {
    443    // GL is allowed to do anything it wants for NaNs, so if we're shadowing
    444    // a NaN, then whatever `actual` is might be correct.
    445    return true;
    446  }
    447 
    448  return cached == actual;
    449 }
    450 
    451 void AssertUintParamCorrect(gl::GLContext* gl, GLenum pname, GLuint shadow) {
    452  GLuint val = 0;
    453  gl->GetUIntegerv(pname, &val);
    454  if (val != shadow) {
    455    printf_stderr("Failed 0x%04x shadow: Cached 0x%x/%u, should be 0x%x/%u.\n",
    456                  pname, shadow, shadow, val, val);
    457    MOZ_ASSERT(false, "Bad cached value.");
    458  }
    459 }
    460 
    461 void AssertMaskedUintParamCorrect(gl::GLContext* gl, GLenum pname, GLuint mask,
    462                                  GLuint shadow) {
    463  GLuint val = 0;
    464  gl->GetUIntegerv(pname, &val);
    465 
    466  const GLuint valMasked = val & mask;
    467  const GLuint shadowMasked = shadow & mask;
    468 
    469  if (valMasked != shadowMasked) {
    470    printf_stderr("Failed 0x%04x shadow: Cached 0x%x/%u, should be 0x%x/%u.\n",
    471                  pname, shadowMasked, shadowMasked, valMasked, valMasked);
    472    MOZ_ASSERT(false, "Bad cached value.");
    473  }
    474 }
    475 #else
    476 void AssertUintParamCorrect(gl::GLContext*, GLenum, GLuint) {}
    477 #endif
    478 
    479 void WebGLContext::AssertCachedBindings() const {
    480 #ifdef DEBUG
    481  gl::GLContext::LocalErrorScope errorScope(*gl);
    482 
    483  GLint stencilBits = 0;
    484  if (GetStencilBits(&stencilBits)) {  // Depends on current draw framebuffer.
    485    const GLuint stencilRefMask = (1 << stencilBits) - 1;
    486 
    487    AssertMaskedUintParamCorrect(gl, LOCAL_GL_STENCIL_REF, stencilRefMask,
    488                                 mStencilRefFront);
    489    AssertMaskedUintParamCorrect(gl, LOCAL_GL_STENCIL_BACK_REF, stencilRefMask,
    490                                 mStencilRefBack);
    491  }
    492 
    493  // Program
    494  GLuint bound = mCurrentProgram ? mCurrentProgram->mGLName : 0;
    495  AssertUintParamCorrect(gl, LOCAL_GL_CURRENT_PROGRAM, bound);
    496 
    497  // Buffers
    498  bound = mBoundArrayBuffer ? mBoundArrayBuffer->mGLName : 0;
    499  AssertUintParamCorrect(gl, LOCAL_GL_ARRAY_BUFFER_BINDING, bound);
    500 
    501  MOZ_ASSERT(mBoundVertexArray);
    502  WebGLBuffer* curBuff = mBoundVertexArray->mElementArrayBuffer;
    503  bound = curBuff ? curBuff->mGLName : 0;
    504  AssertUintParamCorrect(gl, LOCAL_GL_ELEMENT_ARRAY_BUFFER_BINDING, bound);
    505 
    506  MOZ_ASSERT(!gl::GLContext::IsBadCallError(errorScope.GetError()));
    507 #endif
    508 
    509  // We do not check the renderbuffer binding, because we never rely on it
    510  // matching.
    511 }
    512 
    513 void WebGLContext::AssertCachedGlobalState() const {
    514 #ifdef DEBUG
    515  gl::GLContext::LocalErrorScope errorScope(*gl);
    516 
    517  ////////////////
    518 
    519  // Draw state
    520  MOZ_ASSERT(gl->fIsEnabled(LOCAL_GL_DITHER) == mDitherEnabled);
    521  MOZ_ASSERT_IF(IsWebGL2(), gl->fIsEnabled(LOCAL_GL_RASTERIZER_DISCARD) ==
    522                                mRasterizerDiscardEnabled);
    523  MOZ_ASSERT(gl->fIsEnabled(LOCAL_GL_SCISSOR_TEST) == mScissorTestEnabled);
    524 
    525  // Cannot trivially check COLOR_CLEAR_VALUE, since in old GL versions glGet
    526  // may clamp based on whether the current framebuffer is floating-point or
    527  // not. This also means COLOR_CLEAR_VALUE save+restore is dangerous!
    528 
    529  realGLboolean depthWriteMask = 0;
    530  gl->fGetBooleanv(LOCAL_GL_DEPTH_WRITEMASK, &depthWriteMask);
    531  MOZ_ASSERT(depthWriteMask == mDepthWriteMask);
    532 
    533  GLfloat depthClearValue = 0.0f;
    534  gl->fGetFloatv(LOCAL_GL_DEPTH_CLEAR_VALUE, &depthClearValue);
    535  MOZ_ASSERT(IsCacheCorrect(mDepthClearValue, depthClearValue));
    536 
    537  const int maxStencilBits = 8;
    538  const GLuint maxStencilBitsMask = (1 << maxStencilBits) - 1;
    539  AssertMaskedUintParamCorrect(gl, LOCAL_GL_STENCIL_CLEAR_VALUE,
    540                               maxStencilBitsMask, mStencilClearValue);
    541 
    542  // GLES 3.0.4, $4.1.4, p177:
    543  //   [...] the front and back stencil mask are both set to the value `2^s -
    544  //   1`, where `s` is greater than or equal to the number of bits in the
    545  //   deepest stencil buffer supported by the GL implementation.
    546  AssertMaskedUintParamCorrect(gl, LOCAL_GL_STENCIL_VALUE_MASK,
    547                               maxStencilBitsMask, mStencilValueMaskFront);
    548  AssertMaskedUintParamCorrect(gl, LOCAL_GL_STENCIL_BACK_VALUE_MASK,
    549                               maxStencilBitsMask, mStencilValueMaskBack);
    550 
    551  AssertMaskedUintParamCorrect(gl, LOCAL_GL_STENCIL_WRITEMASK,
    552                               maxStencilBitsMask, mStencilWriteMaskFront);
    553  AssertMaskedUintParamCorrect(gl, LOCAL_GL_STENCIL_BACK_WRITEMASK,
    554                               maxStencilBitsMask, mStencilWriteMaskBack);
    555 
    556  // Viewport
    557  GLint int4[4] = {0, 0, 0, 0};
    558  gl->fGetIntegerv(LOCAL_GL_VIEWPORT, int4);
    559  MOZ_ASSERT(int4[0] == mViewportX && int4[1] == mViewportY &&
    560             int4[2] == mViewportWidth && int4[3] == mViewportHeight);
    561 
    562  MOZ_ASSERT(!gl::GLContext::IsBadCallError(errorScope.GetError()));
    563 #endif
    564 }
    565 
    566 const char* InfoFrom(WebGLTexImageFunc func, WebGLTexDimensions dims) {
    567  switch (dims) {
    568    case WebGLTexDimensions::Tex2D:
    569      switch (func) {
    570        case WebGLTexImageFunc::TexImage:
    571          return "texImage2D";
    572        case WebGLTexImageFunc::TexSubImage:
    573          return "texSubImage2D";
    574        case WebGLTexImageFunc::CopyTexImage:
    575          return "copyTexImage2D";
    576        case WebGLTexImageFunc::CopyTexSubImage:
    577          return "copyTexSubImage2D";
    578        case WebGLTexImageFunc::CompTexImage:
    579          return "compressedTexImage2D";
    580        case WebGLTexImageFunc::CompTexSubImage:
    581          return "compressedTexSubImage2D";
    582        default:
    583          MOZ_CRASH("GFX: invalid 2D TexDimensions");
    584      }
    585    case WebGLTexDimensions::Tex3D:
    586      switch (func) {
    587        case WebGLTexImageFunc::TexImage:
    588          return "texImage3D";
    589        case WebGLTexImageFunc::TexSubImage:
    590          return "texSubImage3D";
    591        case WebGLTexImageFunc::CopyTexSubImage:
    592          return "copyTexSubImage3D";
    593        case WebGLTexImageFunc::CompTexSubImage:
    594          return "compressedTexSubImage3D";
    595        default:
    596          MOZ_CRASH("GFX: invalid 3D TexDimensions");
    597      }
    598    default:
    599      MOZ_CRASH("GFX: invalid TexDimensions");
    600  }
    601 }
    602 
    603 ////
    604 
    605 }  // namespace mozilla