Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(439)

Side by Side Diff: Source/core/html/canvas/WebGLRenderingContext.cpp

Issue 163773007: WebGL: Transfer ownership of WebGraphicsContext3D from WebGLRenderingContext to DrawingBuffer. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@correct_webgl_destroy
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009 Apple Inc. All rights reserved. 2 * Copyright (C) 2009 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after
508 return nullptr; 508 return nullptr;
509 } 509 }
510 510
511 Extensions3DUtil extensionsUtil(context.get()); 511 Extensions3DUtil extensionsUtil(context.get());
512 if (extensionsUtil.supportsExtension("GL_EXT_debug_marker")) 512 if (extensionsUtil.supportsExtension("GL_EXT_debug_marker"))
513 context->pushGroupMarkerEXT("WebGLRenderingContext"); 513 context->pushGroupMarkerEXT("WebGLRenderingContext");
514 514
515 OwnPtr<WebGLRenderingContext> renderingContext = adoptPtr(new WebGLRendering Context(canvas, context.release(), attrs)); 515 OwnPtr<WebGLRenderingContext> renderingContext = adoptPtr(new WebGLRendering Context(canvas, context.release(), attrs));
516 renderingContext->suspendIfNeeded(); 516 renderingContext->suspendIfNeeded();
517 517
518 if (renderingContext->m_drawingBuffer->isZeroSized()) { 518 if (!renderingContext->m_drawingBuffer) {
519 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcon textcreationerror, false, true, "Could not create a WebGL context.")); 519 canvas->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcon textcreationerror, false, true, "Could not create a WebGL context."));
520 return nullptr; 520 return nullptr;
521 } 521 }
522 522
523 return renderingContext.release(); 523 return renderingContext.release();
524 } 524 }
525 525
526 WebGLRenderingContext::WebGLRenderingContext(HTMLCanvasElement* passedCanvas, Pa ssOwnPtr<blink::WebGraphicsContext3D> context, WebGLContextAttributes* requested Attributes) 526 WebGLRenderingContext::WebGLRenderingContext(HTMLCanvasElement* passedCanvas, Pa ssOwnPtr<blink::WebGraphicsContext3D> context, WebGLContextAttributes* requested Attributes)
527 : CanvasRenderingContext(passedCanvas) 527 : CanvasRenderingContext(passedCanvas)
528 , ActiveDOMObject(&passedCanvas->document()) 528 , ActiveDOMObject(&passedCanvas->document())
529 , m_context(context)
530 , m_drawingBuffer(0) 529 , m_drawingBuffer(0)
530 , m_context(context.get())
531 , m_dispatchContextLostEventTimer(this, &WebGLRenderingContext::dispatchCont extLostEvent) 531 , m_dispatchContextLostEventTimer(this, &WebGLRenderingContext::dispatchCont extLostEvent)
532 , m_restoreAllowed(false) 532 , m_restoreAllowed(false)
533 , m_restoreTimer(this, &WebGLRenderingContext::maybeRestoreContext) 533 , m_restoreTimer(this, &WebGLRenderingContext::maybeRestoreContext)
534 , m_generatedImageCache(4) 534 , m_generatedImageCache(4)
535 , m_contextLost(false) 535 , m_contextLost(false)
536 , m_contextLostMode(SyntheticLostContext) 536 , m_contextLostMode(SyntheticLostContext)
537 , m_requestedAttributes(requestedAttributes->clone()) 537 , m_requestedAttributes(requestedAttributes->clone())
538 , m_synthesizedErrorsToConsole(true) 538 , m_synthesizedErrorsToConsole(true)
539 , m_numGLErrorsToConsoleAllowed(maxGLErrorsAllowedToConsole) 539 , m_numGLErrorsToConsoleAllowed(maxGLErrorsAllowedToConsole)
540 , m_multisamplingAllowed(false) 540 , m_multisamplingAllowed(false)
541 , m_multisamplingObserverRegistered(false) 541 , m_multisamplingObserverRegistered(false)
542 , m_onePlusMaxEnabledAttribIndex(0) 542 , m_onePlusMaxEnabledAttribIndex(0)
543 , m_onePlusMaxNonDefaultTextureUnit(0) 543 , m_onePlusMaxNonDefaultTextureUnit(0)
544 { 544 {
545 ASSERT(m_context); 545 ASSERT(m_context);
546 ScriptWrappable::init(this); 546 ScriptWrappable::init(this);
547 547
548 m_contextGroup = WebGLContextGroup::create(); 548 m_contextGroup = WebGLContextGroup::create();
549 m_contextGroup->addContext(this); 549 m_contextGroup->addContext(this);
550 550
551 m_maxViewportDims[0] = m_maxViewportDims[1] = 0; 551 m_maxViewportDims[0] = m_maxViewportDims[1] = 0;
552 m_context->getIntegerv(GL_MAX_VIEWPORT_DIMS, m_maxViewportDims); 552 m_context->getIntegerv(GL_MAX_VIEWPORT_DIMS, m_maxViewportDims);
553 553
554 RefPtr<WebGLRenderingContextEvictionManager> contextEvictionManager = adoptR ef(new WebGLRenderingContextEvictionManager()); 554 RefPtr<WebGLRenderingContextEvictionManager> contextEvictionManager = adoptR ef(new WebGLRenderingContextEvictionManager());
555 555
556 // Create the DrawingBuffer and initialize the platform layer. 556 // Create the DrawingBuffer and initialize the platform layer.
557 DrawingBuffer::PreserveDrawingBuffer preserve = requestedAttributes->preserv eDrawingBuffer() ? DrawingBuffer::Preserve : DrawingBuffer::Discard; 557 DrawingBuffer::PreserveDrawingBuffer preserve = requestedAttributes->preserv eDrawingBuffer() ? DrawingBuffer::Preserve : DrawingBuffer::Discard;
558 m_drawingBuffer = DrawingBuffer::create(m_context.get(), clampedCanvasSize() , preserve, contextEvictionManager.release()); 558 m_drawingBuffer = DrawingBuffer::create(context, clampedCanvasSize(), preser ve, contextEvictionManager.release());
559 if (!m_drawingBuffer)
560 return;
559 561
560 if (!m_drawingBuffer->isZeroSized()) { 562 m_drawingBuffer->bind();
561 m_drawingBuffer->bind(); 563 setupFlags();
562 setupFlags(); 564 initializeNewContext();
563 initializeNewContext();
564 }
565 565
566 // Register extensions. 566 // Register extensions.
567 static const char* const webkitPrefix[] = { "WEBKIT_", 0, }; 567 static const char* const webkitPrefix[] = { "WEBKIT_", 0, };
568 static const char* const bothPrefixes[] = { "", "WEBKIT_", 0, }; 568 static const char* const bothPrefixes[] = { "", "WEBKIT_", 0, };
569 569
570 registerExtension<ANGLEInstancedArrays>(m_angleInstancedArrays); 570 registerExtension<ANGLEInstancedArrays>(m_angleInstancedArrays);
571 registerExtension<EXTTextureFilterAnisotropic>(m_extTextureFilterAnisotropic , ApprovedExtension, bothPrefixes); 571 registerExtension<EXTTextureFilterAnisotropic>(m_extTextureFilterAnisotropic , ApprovedExtension, bothPrefixes);
572 registerExtension<OESElementIndexUint>(m_oesElementIndexUint); 572 registerExtension<OESElementIndexUint>(m_oesElementIndexUint);
573 registerExtension<OESStandardDerivatives>(m_oesStandardDerivatives); 573 registerExtension<OESStandardDerivatives>(m_oesStandardDerivatives);
574 registerExtension<OESTextureFloat>(m_oesTextureFloat); 574 registerExtension<OESTextureFloat>(m_oesTextureFloat);
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 m_backDrawBuffer = GL_BACK; 648 m_backDrawBuffer = GL_BACK;
649 649
650 m_defaultVertexArrayObject = WebGLVertexArrayObjectOES::create(this, WebGLVe rtexArrayObjectOES::VaoTypeDefault); 650 m_defaultVertexArrayObject = WebGLVertexArrayObjectOES::create(this, WebGLVe rtexArrayObjectOES::VaoTypeDefault);
651 addContextObject(m_defaultVertexArrayObject.get()); 651 addContextObject(m_defaultVertexArrayObject.get());
652 m_boundVertexArrayObject = m_defaultVertexArrayObject; 652 m_boundVertexArrayObject = m_defaultVertexArrayObject;
653 653
654 m_vertexAttribValue.resize(m_maxVertexAttribs); 654 m_vertexAttribValue.resize(m_maxVertexAttribs);
655 655
656 createFallbackBlackTextures1x1(); 656 createFallbackBlackTextures1x1();
657 657
658 m_drawingBuffer->reset(clampedCanvasSize());
659
660 m_context->viewport(0, 0, drawingBufferWidth(), drawingBufferHeight()); 658 m_context->viewport(0, 0, drawingBufferWidth(), drawingBufferHeight());
661 m_context->scissor(0, 0, drawingBufferWidth(), drawingBufferHeight()); 659 m_context->scissor(0, 0, drawingBufferWidth(), drawingBufferHeight());
662 660
663 m_contextLostCallbackAdapter = adoptPtr(new WebGLRenderingContextLostCallbac k(this)); 661 m_contextLostCallbackAdapter = adoptPtr(new WebGLRenderingContextLostCallbac k(this));
664 m_errorMessageCallbackAdapter = adoptPtr(new WebGLRenderingContextErrorMessa geCallback(this)); 662 m_errorMessageCallbackAdapter = adoptPtr(new WebGLRenderingContextErrorMessa geCallback(this));
665 663
666 m_context->setContextLostCallback(m_contextLostCallbackAdapter.get()); 664 m_context->setContextLostCallback(m_contextLostCallbackAdapter.get());
667 m_context->setErrorMessageCallback(m_errorMessageCallbackAdapter.get()); 665 m_context->setErrorMessageCallback(m_errorMessageCallbackAdapter.get());
668 666
669 // This ensures that the context has a valid "lastFlushID" and won't be mist akenly identified as the "least recently used" context. 667 // This ensures that the context has a valid "lastFlushID" and won't be mist akenly identified as the "least recently used" context.
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
750 page->removeMultisamplingChangedObserver(this); 748 page->removeMultisamplingChangedObserver(this);
751 } 749 }
752 750
753 willDestroyContext(this); 751 willDestroyContext(this);
754 } 752 }
755 753
756 void WebGLRenderingContext::destroyContext() 754 void WebGLRenderingContext::destroyContext()
757 { 755 {
758 m_contextLost = true; 756 m_contextLost = true;
759 757
760 // The drawing buffer holds a context reference. It must also be destroyed 758 if (!m_context) {
761 // in order for the context to be released. 759 ASSERT(!m_drawingBuffer);
762 m_drawingBuffer->releaseResources(); 760 return;
761 }
763 762
764 m_extensionsUtil.clear(); 763 m_extensionsUtil.clear();
765 764
766 if (m_context) { 765 m_context->setContextLostCallback(0);
767 m_context->setContextLostCallback(0); 766 m_context->setErrorMessageCallback(0);
768 m_context->setErrorMessageCallback(0); 767 m_context = 0;
769 m_context.clear(); 768
770 } 769 ASSERT(m_drawingBuffer);
770 m_drawingBuffer.clear();
771 } 771 }
772 772
773 void WebGLRenderingContext::markContextChanged() 773 void WebGLRenderingContext::markContextChanged()
774 { 774 {
775 if (m_framebufferBinding || isContextLost()) 775 if (m_framebufferBinding || isContextLost())
776 return; 776 return;
777 777
778 m_drawingBuffer->markContentsChanged(); 778 m_drawingBuffer->markContentsChanged();
779 779
780 m_layerCleared = false; 780 m_layerCleared = false;
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
952 restoreStateAfterClear(); 952 restoreStateAfterClear();
953 953
954 m_context->bindTexture(GL_TEXTURE_2D, objectOrZero(m_textureUnits[m_activeTe xtureUnit].m_texture2DBinding.get())); 954 m_context->bindTexture(GL_TEXTURE_2D, objectOrZero(m_textureUnits[m_activeTe xtureUnit].m_texture2DBinding.get()));
955 m_context->bindRenderbuffer(GL_RENDERBUFFER, objectOrZero(m_renderbufferBind ing.get())); 955 m_context->bindRenderbuffer(GL_RENDERBUFFER, objectOrZero(m_renderbufferBind ing.get()));
956 if (m_framebufferBinding) 956 if (m_framebufferBinding)
957 m_context->bindFramebuffer(GL_FRAMEBUFFER, objectOrZero(m_framebufferBin ding.get())); 957 m_context->bindFramebuffer(GL_FRAMEBUFFER, objectOrZero(m_framebufferBin ding.get()));
958 } 958 }
959 959
960 int WebGLRenderingContext::drawingBufferWidth() const 960 int WebGLRenderingContext::drawingBufferWidth() const
961 { 961 {
962 return m_drawingBuffer->size().width(); 962 return isContextLost() ? 0 : m_drawingBuffer->size().width();
963 } 963 }
964 964
965 int WebGLRenderingContext::drawingBufferHeight() const 965 int WebGLRenderingContext::drawingBufferHeight() const
966 { 966 {
967 return m_drawingBuffer->size().height(); 967 return isContextLost() ? 0 : m_drawingBuffer->size().height();
968 } 968 }
969 969
970 unsigned WebGLRenderingContext::sizeInBytes(GLenum type) 970 unsigned WebGLRenderingContext::sizeInBytes(GLenum type)
971 { 971 {
972 switch (type) { 972 switch (type) {
973 case GL_BYTE: 973 case GL_BYTE:
974 return sizeof(GLbyte); 974 return sizeof(GLbyte);
975 case GL_UNSIGNED_BYTE: 975 case GL_UNSIGNED_BYTE:
976 return sizeof(GLubyte); 976 return sizeof(GLubyte);
977 case GL_SHORT: 977 case GL_SHORT:
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
1305 1305
1306 void WebGLRenderingContext::clear(GLbitfield mask) 1306 void WebGLRenderingContext::clear(GLbitfield mask)
1307 { 1307 {
1308 if (isContextLost()) 1308 if (isContextLost())
1309 return; 1309 return;
1310 if (mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_B IT)) { 1310 if (mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_B IT)) {
1311 synthesizeGLError(GL_INVALID_VALUE, "clear", "invalid mask"); 1311 synthesizeGLError(GL_INVALID_VALUE, "clear", "invalid mask");
1312 return; 1312 return;
1313 } 1313 }
1314 const char* reason = "framebuffer incomplete"; 1314 const char* reason = "framebuffer incomplete";
1315 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context.get(), &reason)) { 1315 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context, &reas on)) {
1316 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "clear", reason); 1316 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "clear", reason);
1317 return; 1317 return;
1318 } 1318 }
1319 if (!clearIfComposited(mask)) 1319 if (!clearIfComposited(mask))
1320 m_context->clear(mask); 1320 m_context->clear(mask);
1321 markContextChanged(); 1321 markContextChanged();
1322 } 1322 }
1323 1323
1324 void WebGLRenderingContext::clearColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a) 1324 void WebGLRenderingContext::clearColor(GLfloat r, GLfloat g, GLfloat b, GLfloat a)
1325 { 1325 {
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
1459 return; 1459 return;
1460 if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFra mebufferColorFormat())) { 1460 if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFra mebufferColorFormat())) {
1461 synthesizeGLError(GL_INVALID_OPERATION, "copyTexImage2D", "framebuffer i s incompatible format"); 1461 synthesizeGLError(GL_INVALID_OPERATION, "copyTexImage2D", "framebuffer i s incompatible format");
1462 return; 1462 return;
1463 } 1463 }
1464 if (!isGLES2NPOTStrict() && level && WebGLTexture::isNPOT(width, height)) { 1464 if (!isGLES2NPOTStrict() && level && WebGLTexture::isNPOT(width, height)) {
1465 synthesizeGLError(GL_INVALID_VALUE, "copyTexImage2D", "level > 0 not pow er of 2"); 1465 synthesizeGLError(GL_INVALID_VALUE, "copyTexImage2D", "level > 0 not pow er of 2");
1466 return; 1466 return;
1467 } 1467 }
1468 const char* reason = "framebuffer incomplete"; 1468 const char* reason = "framebuffer incomplete";
1469 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context.get(), &reason)) { 1469 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context, &reas on)) {
1470 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "copyTexImage2D", re ason); 1470 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "copyTexImage2D", re ason);
1471 return; 1471 return;
1472 } 1472 }
1473 clearIfComposited(); 1473 clearIfComposited();
1474 ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding .get()); 1474 ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding .get());
1475 m_context->copyTexImage2D(target, level, internalformat, x, y, width, height , border); 1475 m_context->copyTexImage2D(target, level, internalformat, x, y, width, height , border);
1476 // FIXME: if the framebuffer is not complete, none of the below should be ex ecuted. 1476 // FIXME: if the framebuffer is not complete, none of the below should be ex ecuted.
1477 tex->setLevelInfo(target, level, internalformat, width, height, GL_UNSIGNED_ BYTE); 1477 tex->setLevelInfo(target, level, internalformat, width, height, GL_UNSIGNED_ BYTE);
1478 } 1478 }
1479 1479
(...skipping 22 matching lines...) Expand all
1502 return; 1502 return;
1503 } 1503 }
1504 GLenum internalformat = tex->getInternalFormat(target, level); 1504 GLenum internalformat = tex->getInternalFormat(target, level);
1505 if (!validateSettableTexFormat("copyTexSubImage2D", internalformat)) 1505 if (!validateSettableTexFormat("copyTexSubImage2D", internalformat))
1506 return; 1506 return;
1507 if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFra mebufferColorFormat())) { 1507 if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFra mebufferColorFormat())) {
1508 synthesizeGLError(GL_INVALID_OPERATION, "copyTexSubImage2D", "framebuffe r is incompatible format"); 1508 synthesizeGLError(GL_INVALID_OPERATION, "copyTexSubImage2D", "framebuffe r is incompatible format");
1509 return; 1509 return;
1510 } 1510 }
1511 const char* reason = "framebuffer incomplete"; 1511 const char* reason = "framebuffer incomplete";
1512 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context.get(), &reason)) { 1512 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context, &reas on)) {
1513 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "copyTexSubImage2D", reason); 1513 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "copyTexSubImage2D", reason);
1514 return; 1514 return;
1515 } 1515 }
1516 clearIfComposited(); 1516 clearIfComposited();
1517 ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding .get()); 1517 ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding .get());
1518 m_context->copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, h eight); 1518 m_context->copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, h eight);
1519 } 1519 }
1520 1520
1521 PassRefPtr<WebGLBuffer> WebGLRenderingContext::createBuffer() 1521 PassRefPtr<WebGLBuffer> WebGLRenderingContext::createBuffer()
1522 { 1522 {
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1609 { 1609 {
1610 if (isContextLost() || !object) 1610 if (isContextLost() || !object)
1611 return false; 1611 return false;
1612 if (!object->validate(contextGroup(), this)) { 1612 if (!object->validate(contextGroup(), this)) {
1613 synthesizeGLError(GL_INVALID_OPERATION, "delete", "object does not belon g to this context"); 1613 synthesizeGLError(GL_INVALID_OPERATION, "delete", "object does not belon g to this context");
1614 return false; 1614 return false;
1615 } 1615 }
1616 if (object->object()) { 1616 if (object->object()) {
1617 // We need to pass in context here because we want 1617 // We need to pass in context here because we want
1618 // things in this context unbound. 1618 // things in this context unbound.
1619 object->deleteObject(m_context.get()); 1619 object->deleteObject(m_context);
1620 } 1620 }
1621 return true; 1621 return true;
1622 } 1622 }
1623 1623
1624 void WebGLRenderingContext::deleteBuffer(WebGLBuffer* buffer) 1624 void WebGLRenderingContext::deleteBuffer(WebGLBuffer* buffer)
1625 { 1625 {
1626 if (!deleteObject(buffer)) 1626 if (!deleteObject(buffer))
1627 return; 1627 return;
1628 if (m_boundArrayBuffer == buffer) 1628 if (m_boundArrayBuffer == buffer)
1629 m_boundArrayBuffer = 0; 1629 m_boundArrayBuffer = 0;
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1722 1722
1723 void WebGLRenderingContext::detachShader(WebGLProgram* program, WebGLShader* sha der) 1723 void WebGLRenderingContext::detachShader(WebGLProgram* program, WebGLShader* sha der)
1724 { 1724 {
1725 if (isContextLost() || !validateWebGLObject("detachShader", program) || !val idateWebGLObject("detachShader", shader)) 1725 if (isContextLost() || !validateWebGLObject("detachShader", program) || !val idateWebGLObject("detachShader", shader))
1726 return; 1726 return;
1727 if (!program->detachShader(shader)) { 1727 if (!program->detachShader(shader)) {
1728 synthesizeGLError(GL_INVALID_OPERATION, "detachShader", "shader not atta ched"); 1728 synthesizeGLError(GL_INVALID_OPERATION, "detachShader", "shader not atta ched");
1729 return; 1729 return;
1730 } 1730 }
1731 m_context->detachShader(objectOrZero(program), objectOrZero(shader)); 1731 m_context->detachShader(objectOrZero(program), objectOrZero(shader));
1732 shader->onDetached(m_context.get()); 1732 shader->onDetached(m_context);
1733 } 1733 }
1734 1734
1735 void WebGLRenderingContext::disable(GLenum cap) 1735 void WebGLRenderingContext::disable(GLenum cap)
1736 { 1736 {
1737 if (isContextLost() || !validateCapability("disable", cap)) 1737 if (isContextLost() || !validateCapability("disable", cap))
1738 return; 1738 return;
1739 if (cap == GL_STENCIL_TEST) { 1739 if (cap == GL_STENCIL_TEST) {
1740 m_stencilEnabled = false; 1740 m_stencilEnabled = false;
1741 applyStencilTest(); 1741 applyStencilTest();
1742 return; 1742 return;
(...skipping 1153 matching lines...) Expand 10 before | Expand all | Expand 10 after
2896 { 2896 {
2897 if (!buffer || isContextLost()) 2897 if (!buffer || isContextLost())
2898 return 0; 2898 return 0;
2899 2899
2900 if (!buffer->hasEverBeenBound()) 2900 if (!buffer->hasEverBeenBound())
2901 return 0; 2901 return 0;
2902 2902
2903 return m_context->isBuffer(buffer->object()); 2903 return m_context->isBuffer(buffer->object());
2904 } 2904 }
2905 2905
2906 bool WebGLRenderingContext::isContextLost() 2906 bool WebGLRenderingContext::isContextLost() const
2907 { 2907 {
2908 return m_contextLost; 2908 return m_contextLost;
2909 } 2909 }
2910 2910
2911 GLboolean WebGLRenderingContext::isEnabled(GLenum cap) 2911 GLboolean WebGLRenderingContext::isEnabled(GLenum cap)
2912 { 2912 {
2913 if (isContextLost() || !validateCapability("isEnabled", cap)) 2913 if (isContextLost() || !validateCapability("isEnabled", cap))
2914 return 0; 2914 return 0;
2915 if (cap == GL_STENCIL_TEST) 2915 if (cap == GL_STENCIL_TEST)
2916 return m_stencilEnabled; 2916 return m_stencilEnabled;
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
3063 if (format != GL_RGBA || type != GL_UNSIGNED_BYTE) { 3063 if (format != GL_RGBA || type != GL_UNSIGNED_BYTE) {
3064 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "format not RGBA o r type not UNSIGNED_BYTE"); 3064 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "format not RGBA o r type not UNSIGNED_BYTE");
3065 return; 3065 return;
3066 } 3066 }
3067 // Validate array type against pixel type. 3067 // Validate array type against pixel type.
3068 if (pixels->type() != ArrayBufferView::TypeUint8) { 3068 if (pixels->type() != ArrayBufferView::TypeUint8) {
3069 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "ArrayBufferView n ot Uint8Array"); 3069 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "ArrayBufferView n ot Uint8Array");
3070 return; 3070 return;
3071 } 3071 }
3072 const char* reason = "framebuffer incomplete"; 3072 const char* reason = "framebuffer incomplete";
3073 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context.get(), &reason)) { 3073 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context, &reas on)) {
3074 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "readPixels", reason ); 3074 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "readPixels", reason );
3075 return; 3075 return;
3076 } 3076 }
3077 // Calculate array size, taking into consideration of PACK_ALIGNMENT. 3077 // Calculate array size, taking into consideration of PACK_ALIGNMENT.
3078 unsigned totalBytesRequired = 0; 3078 unsigned totalBytesRequired = 0;
3079 unsigned padding = 0; 3079 unsigned padding = 0;
3080 GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, w idth, height, m_packAlignment, &totalBytesRequired, &padding); 3080 GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, w idth, height, m_packAlignment, &totalBytesRequired, &padding);
3081 if (error != GL_NO_ERROR) { 3081 if (error != GL_NO_ERROR) {
3082 synthesizeGLError(error, "readPixels", "invalid dimensions"); 3082 synthesizeGLError(error, "readPixels", "invalid dimensions");
3083 return; 3083 return;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
3127 return; 3127 return;
3128 switch (internalformat) { 3128 switch (internalformat) {
3129 case GL_DEPTH_COMPONENT16: 3129 case GL_DEPTH_COMPONENT16:
3130 case GL_RGBA4: 3130 case GL_RGBA4:
3131 case GL_RGB5_A1: 3131 case GL_RGB5_A1:
3132 case GL_RGB565: 3132 case GL_RGB565:
3133 case GL_STENCIL_INDEX8: 3133 case GL_STENCIL_INDEX8:
3134 m_context->renderbufferStorage(target, internalformat, width, height); 3134 m_context->renderbufferStorage(target, internalformat, width, height);
3135 m_renderbufferBinding->setInternalFormat(internalformat); 3135 m_renderbufferBinding->setInternalFormat(internalformat);
3136 m_renderbufferBinding->setSize(width, height); 3136 m_renderbufferBinding->setSize(width, height);
3137 m_renderbufferBinding->deleteEmulatedStencilBuffer(m_context.get()); 3137 m_renderbufferBinding->deleteEmulatedStencilBuffer(m_context);
3138 break; 3138 break;
3139 case GL_DEPTH_STENCIL_OES: 3139 case GL_DEPTH_STENCIL_OES:
3140 if (isDepthStencilSupported()) { 3140 if (isDepthStencilSupported()) {
3141 m_context->renderbufferStorage(target, GL_DEPTH24_STENCIL8_OES, widt h, height); 3141 m_context->renderbufferStorage(target, GL_DEPTH24_STENCIL8_OES, widt h, height);
3142 } else { 3142 } else {
3143 WebGLRenderbuffer* emulatedStencilBuffer = ensureEmulatedStencilBuff er(target, m_renderbufferBinding.get()); 3143 WebGLRenderbuffer* emulatedStencilBuffer = ensureEmulatedStencilBuff er(target, m_renderbufferBinding.get());
3144 if (!emulatedStencilBuffer) { 3144 if (!emulatedStencilBuffer) {
3145 synthesizeGLError(GL_OUT_OF_MEMORY, "renderbufferStorage", "out of memory"); 3145 synthesizeGLError(GL_OUT_OF_MEMORY, "renderbufferStorage", "out of memory");
3146 return; 3146 return;
3147 } 3147 }
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
3456 { 3456 {
3457 if (isContextLost() || !validateHTMLCanvasElement("texImage2D", canvas, exce ptionState) || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceHTMLCanvas Element, target, level, internalformat, canvas->width(), canvas->height(), 0, fo rmat, type, 0, 0)) 3457 if (isContextLost() || !validateHTMLCanvasElement("texImage2D", canvas, exce ptionState) || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceHTMLCanvas Element, target, level, internalformat, canvas->width(), canvas->height(), 0, fo rmat, type, 0, 0))
3458 return; 3458 return;
3459 3459
3460 WebGLTexture* texture = validateTextureBinding("texImage2D", target, true); 3460 WebGLTexture* texture = validateTextureBinding("texImage2D", target, true);
3461 // If possible, copy from the canvas element directly to the texture 3461 // If possible, copy from the canvas element directly to the texture
3462 // via the GPU, without a read-back to system memory. 3462 // via the GPU, without a read-back to system memory.
3463 if (GL_TEXTURE_2D == target && texture) { 3463 if (GL_TEXTURE_2D == target && texture) {
3464 if (!canvas->is3D()) { 3464 if (!canvas->is3D()) {
3465 ImageBuffer* buffer = canvas->buffer(); 3465 ImageBuffer* buffer = canvas->buffer();
3466 if (buffer && buffer->copyToPlatformTexture(m_context.get(), texture ->object(), internalformat, type, 3466 if (buffer && buffer->copyToPlatformTexture(m_context, texture->obje ct(), internalformat, type,
3467 level, m_unpackPremultiplyAlpha, m_unpackFlipY)) { 3467 level, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
3468 texture->setLevelInfo(target, level, internalformat, canvas->wid th(), canvas->height(), type); 3468 texture->setLevelInfo(target, level, internalformat, canvas->wid th(), canvas->height(), type);
3469 return; 3469 return;
3470 } 3470 }
3471 } else { 3471 } else {
3472 WebGLRenderingContext* gl = toWebGLRenderingContext(canvas->renderin gContext()); 3472 WebGLRenderingContext* gl = toWebGLRenderingContext(canvas->renderin gContext());
3473 if (gl && gl->m_drawingBuffer->copyToPlatformTexture(m_context.get() , texture->object(), internalformat, type, 3473 if (gl && gl->m_drawingBuffer->copyToPlatformTexture(m_context, text ure->object(), internalformat, type,
3474 level, m_unpackPremultiplyAlpha, m_unpackFlipY)) { 3474 level, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
3475 texture->setLevelInfo(target, level, internalformat, canvas->wid th(), canvas->height(), type); 3475 texture->setLevelInfo(target, level, internalformat, canvas->wid th(), canvas->height(), type);
3476 return; 3476 return;
3477 } 3477 }
3478 } 3478 }
3479 } 3479 }
3480 3480
3481 RefPtr<ImageData> imageData = canvas->getImageData(); 3481 RefPtr<ImageData> imageData = canvas->getImageData();
3482 if (imageData) 3482 if (imageData)
3483 texImage2D(target, level, internalformat, format, type, imageData.get(), exceptionState); 3483 texImage2D(target, level, internalformat, format, type, imageData.get(), exceptionState);
(...skipping 19 matching lines...) Expand all
3503 GLenum format, GLenum type, HTMLVideoElement* video, ExceptionState& excepti onState) 3503 GLenum format, GLenum type, HTMLVideoElement* video, ExceptionState& excepti onState)
3504 { 3504 {
3505 if (isContextLost() || !validateHTMLVideoElement("texImage2D", video, except ionState) 3505 if (isContextLost() || !validateHTMLVideoElement("texImage2D", video, except ionState)
3506 || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceHTMLVideoEleme nt, target, level, internalformat, video->videoWidth(), video->videoHeight(), 0, format, type, 0, 0)) 3506 || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceHTMLVideoEleme nt, target, level, internalformat, video->videoWidth(), video->videoHeight(), 0, format, type, 0, 0))
3507 return; 3507 return;
3508 3508
3509 // Go through the fast path doing a GPU-GPU textures copy without a readback to system memory if possible. 3509 // Go through the fast path doing a GPU-GPU textures copy without a readback to system memory if possible.
3510 // Otherwise, it will fall back to the normal SW path. 3510 // Otherwise, it will fall back to the normal SW path.
3511 WebGLTexture* texture = validateTextureBinding("texImage2D", target, true); 3511 WebGLTexture* texture = validateTextureBinding("texImage2D", target, true);
3512 if (GL_TEXTURE_2D == target && texture) { 3512 if (GL_TEXTURE_2D == target && texture) {
3513 if (video->copyVideoTextureToPlatformTexture(m_context.get(), texture->o bject(), level, type, internalformat, m_unpackPremultiplyAlpha, m_unpackFlipY)) { 3513 if (video->copyVideoTextureToPlatformTexture(m_context, texture->object( ), level, type, internalformat, m_unpackPremultiplyAlpha, m_unpackFlipY)) {
3514 texture->setLevelInfo(target, level, internalformat, video->videoWid th(), video->videoHeight(), type); 3514 texture->setLevelInfo(target, level, internalformat, video->videoWid th(), video->videoHeight(), type);
3515 return; 3515 return;
3516 } 3516 }
3517 } 3517 }
3518 3518
3519 // Normal pure SW path. 3519 // Normal pure SW path.
3520 RefPtr<Image> image = videoFrameToImage(video, ImageBuffer::fastCopyImageMod e()); 3520 RefPtr<Image> image = videoFrameToImage(video, ImageBuffer::fastCopyImageMod e());
3521 if (!image) 3521 if (!image)
3522 return; 3522 return;
3523 texImage2DImpl(target, level, internalformat, format, type, image.get(), Web GLImageConversion::HtmlDomVideo, m_unpackFlipY, m_unpackPremultiplyAlpha, except ionState); 3523 texImage2DImpl(target, level, internalformat, format, type, image.get(), Web GLImageConversion::HtmlDomVideo, m_unpackFlipY, m_unpackPremultiplyAlpha, except ionState);
(...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after
3997 if (!checkObjectToBeBound("useProgram", program, deleted)) 3997 if (!checkObjectToBeBound("useProgram", program, deleted))
3998 return; 3998 return;
3999 if (deleted) 3999 if (deleted)
4000 program = 0; 4000 program = 0;
4001 if (program && !program->linkStatus()) { 4001 if (program && !program->linkStatus()) {
4002 synthesizeGLError(GL_INVALID_OPERATION, "useProgram", "program not valid "); 4002 synthesizeGLError(GL_INVALID_OPERATION, "useProgram", "program not valid ");
4003 return; 4003 return;
4004 } 4004 }
4005 if (m_currentProgram != program) { 4005 if (m_currentProgram != program) {
4006 if (m_currentProgram) 4006 if (m_currentProgram)
4007 m_currentProgram->onDetached(m_context.get()); 4007 m_currentProgram->onDetached(m_context);
4008 m_currentProgram = program; 4008 m_currentProgram = program;
4009 m_context->useProgram(objectOrZero(program)); 4009 m_context->useProgram(objectOrZero(program));
4010 if (program) 4010 if (program)
4011 program->onAttached(); 4011 program->onAttached();
4012 } 4012 }
4013 } 4013 }
4014 4014
4015 void WebGLRenderingContext::validateProgram(WebGLProgram* program) 4015 void WebGLRenderingContext::validateProgram(WebGLProgram* program)
4016 { 4016 {
4017 if (isContextLost() || !validateWebGLObject("validateProgram", program)) 4017 if (isContextLost() || !validateWebGLObject("validateProgram", program))
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
4211 synthesizeGLError(GL_INVALID_OPERATION, "restoreContext", "context r estoration not allowed"); 4211 synthesizeGLError(GL_INVALID_OPERATION, "restoreContext", "context r estoration not allowed");
4212 return; 4212 return;
4213 } 4213 }
4214 4214
4215 if (!m_restoreTimer.isActive()) 4215 if (!m_restoreTimer.isActive())
4216 m_restoreTimer.startOneShot(0); 4216 m_restoreTimer.startOneShot(0);
4217 } 4217 }
4218 4218
4219 blink::WebLayer* WebGLRenderingContext::platformLayer() const 4219 blink::WebLayer* WebGLRenderingContext::platformLayer() const
4220 { 4220 {
4221 return m_drawingBuffer->platformLayer(); 4221 return isContextLost() ? 0 : m_drawingBuffer->platformLayer();
4222 } 4222 }
4223 4223
4224 Extensions3DUtil* WebGLRenderingContext::extensionsUtil() 4224 Extensions3DUtil* WebGLRenderingContext::extensionsUtil()
4225 { 4225 {
4226 if (!m_extensionsUtil) 4226 if (!m_extensionsUtil)
4227 m_extensionsUtil = adoptPtr(new Extensions3DUtil(m_context.get())); 4227 m_extensionsUtil = adoptPtr(new Extensions3DUtil(m_context));
4228 return m_extensionsUtil.get(); 4228 return m_extensionsUtil.get();
4229 } 4229 }
4230 4230
4231 void WebGLRenderingContext::removeSharedObject(WebGLSharedObject* object) 4231 void WebGLRenderingContext::removeSharedObject(WebGLSharedObject* object)
4232 { 4232 {
4233 m_contextGroup->removeObject(object); 4233 m_contextGroup->removeObject(object);
4234 } 4234 }
4235 4235
4236 void WebGLRenderingContext::addSharedObject(WebGLSharedObject* object) 4236 void WebGLRenderingContext::addSharedObject(WebGLSharedObject* object)
4237 { 4237 {
(...skipping 954 matching lines...) Expand 10 before | Expand all | Expand 10 after
5192 if (!count) { 5192 if (!count) {
5193 markContextChanged(); 5193 markContextChanged();
5194 return false; 5194 return false;
5195 } 5195 }
5196 5196
5197 if (!validateRenderingState(functionName)) { 5197 if (!validateRenderingState(functionName)) {
5198 return false; 5198 return false;
5199 } 5199 }
5200 5200
5201 const char* reason = "framebuffer incomplete"; 5201 const char* reason = "framebuffer incomplete";
5202 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context.get(), &reason)) { 5202 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context, &reas on)) {
5203 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason ); 5203 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason );
5204 return false; 5204 return false;
5205 } 5205 }
5206 5206
5207 return true; 5207 return true;
5208 } 5208 }
5209 5209
5210 bool WebGLRenderingContext::validateDrawElements(const char* functionName, GLenu m mode, GLsizei count, GLenum type, long long offset) 5210 bool WebGLRenderingContext::validateDrawElements(const char* functionName, GLenu m mode, GLsizei count, GLenum type, long long offset)
5211 { 5211 {
5212 if (isContextLost() || !validateDrawMode(functionName, mode)) 5212 if (isContextLost() || !validateDrawMode(functionName, mode))
(...skipping 29 matching lines...) Expand all
5242 if (!m_boundVertexArrayObject->boundElementArrayBuffer()) { 5242 if (!m_boundVertexArrayObject->boundElementArrayBuffer()) {
5243 synthesizeGLError(GL_INVALID_OPERATION, functionName, "no ELEMENT_ARRAY_ BUFFER bound"); 5243 synthesizeGLError(GL_INVALID_OPERATION, functionName, "no ELEMENT_ARRAY_ BUFFER bound");
5244 return false; 5244 return false;
5245 } 5245 }
5246 5246
5247 if (!validateRenderingState(functionName)) { 5247 if (!validateRenderingState(functionName)) {
5248 return false; 5248 return false;
5249 } 5249 }
5250 5250
5251 const char* reason = "framebuffer incomplete"; 5251 const char* reason = "framebuffer incomplete";
5252 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context.get(), &reason)) { 5252 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context, &reas on)) {
5253 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason ); 5253 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason );
5254 return false; 5254 return false;
5255 } 5255 }
5256 5256
5257 return true; 5257 return true;
5258 } 5258 }
5259 5259
5260 // Helper function to validate draw*Instanced calls 5260 // Helper function to validate draw*Instanced calls
5261 bool WebGLRenderingContext::validateDrawInstanced(const char* functionName, GLsi zei primcount) 5261 bool WebGLRenderingContext::validateDrawInstanced(const char* functionName, GLsi zei primcount)
5262 { 5262 {
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
5381 if (!frame) 5381 if (!frame)
5382 return; 5382 return;
5383 5383
5384 Settings* settings = frame->settings(); 5384 Settings* settings = frame->settings();
5385 5385
5386 if (!frame->loader().client()->allowWebGL(settings && settings->webGLEnabled ())) 5386 if (!frame->loader().client()->allowWebGL(settings && settings->webGLEnabled ()))
5387 return; 5387 return;
5388 5388
5389 blink::WebGraphicsContext3D::Attributes attributes = m_requestedAttributes-> attributes(canvas()->document().topDocument()->url().string(), settings); 5389 blink::WebGraphicsContext3D::Attributes attributes = m_requestedAttributes-> attributes(canvas()->document().topDocument()->url().string(), settings);
5390 OwnPtr<blink::WebGraphicsContext3D> context = adoptPtr(blink::Platform::curr ent()->createOffscreenGraphicsContext3D(attributes)); 5390 OwnPtr<blink::WebGraphicsContext3D> context = adoptPtr(blink::Platform::curr ent()->createOffscreenGraphicsContext3D(attributes));
5391 if (!context) { 5391
5392 ASSERT(!m_drawingBuffer);
5393 if (context) {
5394 RefPtr<WebGLRenderingContextEvictionManager> contextEvictionManager = ad optRef(new WebGLRenderingContextEvictionManager());
5395 DrawingBuffer::PreserveDrawingBuffer preserve = m_requestedAttributes->p reserveDrawingBuffer() ? DrawingBuffer::Preserve : DrawingBuffer::Discard;
5396 m_drawingBuffer = DrawingBuffer::create(context.release(), clampedCanvas Size(), preserve, contextEvictionManager.release());
5397 }
5398
5399 bool failToRestore = !m_drawingBuffer;
5400 if (failToRestore) {
5392 if (m_contextLostMode == RealLostContext) { 5401 if (m_contextLostMode == RealLostContext) {
5393 m_restoreTimer.startOneShot(secondsBetweenRestoreAttempts); 5402 m_restoreTimer.startOneShot(secondsBetweenRestoreAttempts);
5394 } else { 5403 } else {
5395 // This likely shouldn't happen but is the best way to report it to the WebGL app. 5404 // This likely shouldn't happen but is the best way to report it to the WebGL app.
5396 synthesizeGLError(GL_INVALID_OPERATION, "", "error restoring context "); 5405 synthesizeGLError(GL_INVALID_OPERATION, "", "error restoring context ");
5397 } 5406 }
5398 return; 5407 return;
5399 } 5408 }
5400 5409
5401 RefPtr<WebGLRenderingContextEvictionManager> contextEvictionManager = adoptR ef(new WebGLRenderingContextEvictionManager());
5402
5403 // Construct a new drawing buffer with the new WebGraphicsContext3D.
5404 m_drawingBuffer->releaseResources();
5405 DrawingBuffer::PreserveDrawingBuffer preserve = m_requestedAttributes->prese rveDrawingBuffer() ? DrawingBuffer::Preserve : DrawingBuffer::Discard;
5406 m_drawingBuffer = DrawingBuffer::create(context.get(), clampedCanvasSize(), preserve, contextEvictionManager.release());
5407
5408 if (m_drawingBuffer->isZeroSized())
5409 return;
5410
5411 m_drawingBuffer->bind(); 5410 m_drawingBuffer->bind();
5412 5411
5413 m_lostContextErrors.clear(); 5412 m_lostContextErrors.clear();
5414 5413
5415 m_context = context.release(); 5414 m_context = m_drawingBuffer->context();
5416 m_contextLost = false; 5415 m_contextLost = false;
5417 5416
5418 setupFlags(); 5417 setupFlags();
5419 initializeNewContext(); 5418 initializeNewContext();
5420 canvas()->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglconte xtrestored, false, true, "")); 5419 canvas()->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglconte xtrestored, false, true, ""));
5421 } 5420 }
5422 5421
5423 String WebGLRenderingContext::ensureNotNull(const String& text) const 5422 String WebGLRenderingContext::ensureNotNull(const String& text) const
5424 { 5423 {
5425 if (text.isNull()) 5424 if (text.isNull())
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
5607 if (m_textureUnits[i].m_texture2DBinding 5606 if (m_textureUnits[i].m_texture2DBinding
5608 || m_textureUnits[i].m_textureCubeMapBinding) { 5607 || m_textureUnits[i].m_textureCubeMapBinding) {
5609 m_onePlusMaxNonDefaultTextureUnit = i + 1; 5608 m_onePlusMaxNonDefaultTextureUnit = i + 1;
5610 return; 5609 return;
5611 } 5610 }
5612 } 5611 }
5613 m_onePlusMaxNonDefaultTextureUnit = 0; 5612 m_onePlusMaxNonDefaultTextureUnit = 0;
5614 } 5613 }
5615 5614
5616 } // namespace WebCore 5615 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698