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