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

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

Issue 1120953002: WebGL 2: add read/write framebuffer binding points to related APIs (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: addressed kbr@'s and bajones@'s feedback Created 5 years, 7 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 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 } 216 }
217 break; 217 break;
218 } 218 }
219 } 219 }
220 220
221 namespace { 221 namespace {
222 222
223 class ScopedDrawingBufferBinder { 223 class ScopedDrawingBufferBinder {
224 STACK_ALLOCATED(); 224 STACK_ALLOCATED();
225 public: 225 public:
226 ScopedDrawingBufferBinder(DrawingBuffer* drawingBuffer, WebGLFramebuffer * framebufferBinding) 226 ScopedDrawingBufferBinder(DrawingBuffer* drawingBuffer, WebGLFramebuffer * framebufferBinding, GLenum target)
227 : m_drawingBuffer(drawingBuffer) 227 : m_drawingBuffer(drawingBuffer)
228 , m_framebufferBinding(framebufferBinding) 228 , m_framebufferBinding(framebufferBinding)
229 , m_target(target)
229 { 230 {
230 // Commit DrawingBuffer if needed (e.g., for multisampling) 231 // Commit DrawingBuffer if needed (e.g., for multisampling)
231 if (!m_framebufferBinding && m_drawingBuffer) 232 if (!m_framebufferBinding && m_drawingBuffer)
232 m_drawingBuffer->commit(); 233 m_drawingBuffer->commit(m_target);
233 } 234 }
234 235
235 ~ScopedDrawingBufferBinder() 236 ~ScopedDrawingBufferBinder()
236 { 237 {
237 // Restore DrawingBuffer if needed 238 // Restore DrawingBuffer if needed
238 if (!m_framebufferBinding && m_drawingBuffer) 239 if (!m_framebufferBinding && m_drawingBuffer)
239 m_drawingBuffer->bind(); 240 m_drawingBuffer->bind(m_target);
240 } 241 }
241 242
242 private: 243 private:
243 DrawingBuffer* m_drawingBuffer; 244 DrawingBuffer* m_drawingBuffer;
244 RawPtrWillBeMember<WebGLFramebuffer> m_framebufferBinding; 245 RawPtrWillBeMember<WebGLFramebuffer> m_framebufferBinding;
246 GLenum m_target;
245 }; 247 };
246 248
247 GLint clamp(GLint value, GLint min, GLint max) 249 GLint clamp(GLint value, GLint min, GLint max)
248 { 250 {
249 if (value < min) 251 if (value < min)
250 value = min; 252 value = min;
251 if (value > max) 253 if (value > max)
252 value = max; 254 value = max;
253 return value; 255 return value;
254 } 256 }
(...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after
866 canvas()->clearCopiedImage(); 868 canvas()->clearCopiedImage();
867 layoutBox->contentChanged(changeType); 869 layoutBox->contentChanged(changeType);
868 } else { 870 } else {
869 if (!m_markedCanvasDirty) { 871 if (!m_markedCanvasDirty) {
870 m_markedCanvasDirty = true; 872 m_markedCanvasDirty = true;
871 canvas()->didDraw(FloatRect(FloatPoint(0, 0), clampedCanvasSize())); 873 canvas()->didDraw(FloatRect(FloatPoint(0, 0), clampedCanvasSize()));
872 } 874 }
873 } 875 }
874 } 876 }
875 877
878 GLenum WebGLRenderingContextBase::getDrawFramebufferTarget()
879 {
880 return GL_FRAMEBUFFER;
881 }
882
876 WebGLRenderingContextBase::HowToClear WebGLRenderingContextBase::clearIfComposit ed(GLbitfield mask) 883 WebGLRenderingContextBase::HowToClear WebGLRenderingContextBase::clearIfComposit ed(GLbitfield mask)
877 { 884 {
878 if (isContextLost()) 885 if (isContextLost())
879 return Skipped; 886 return Skipped;
880 887
881 if (!drawingBuffer()->bufferClearNeeded() || (mask && m_framebufferBinding)) 888 if (!drawingBuffer()->bufferClearNeeded() || (mask && m_framebufferBinding))
882 return Skipped; 889 return Skipped;
883 890
884 Nullable<WebGLContextAttributes> contextAttributes; 891 Nullable<WebGLContextAttributes> contextAttributes;
885 getContextAttributes(contextAttributes); 892 getContextAttributes(contextAttributes);
(...skipping 24 matching lines...) Expand all
910 } 917 }
911 if (contextAttributes.get().stencil()) { 918 if (contextAttributes.get().stencil()) {
912 if (combinedClear && (mask & GL_STENCIL_BUFFER_BIT)) 919 if (combinedClear && (mask & GL_STENCIL_BUFFER_BIT))
913 webContext()->clearStencil(m_clearStencil & m_stencilMask); 920 webContext()->clearStencil(m_clearStencil & m_stencilMask);
914 else 921 else
915 webContext()->clearStencil(0); 922 webContext()->clearStencil(0);
916 clearMask |= GL_STENCIL_BUFFER_BIT; 923 clearMask |= GL_STENCIL_BUFFER_BIT;
917 webContext()->stencilMaskSeparate(GL_FRONT, 0xFFFFFFFF); 924 webContext()->stencilMaskSeparate(GL_FRONT, 0xFFFFFFFF);
918 } 925 }
919 926
920 drawingBuffer()->clearFramebuffers(clearMask); 927 GLenum target = getDrawFramebufferTarget();
928 drawingBuffer()->clearFramebuffers(target, clearMask);
921 929
922 restoreStateAfterClear(); 930 restoreStateAfterClear();
923 if (m_framebufferBinding) 931 if (m_framebufferBinding) {
924 webContext()->bindFramebuffer(GL_FRAMEBUFFER, objectOrZero(m_framebuffer Binding.get())); 932 webContext()->bindFramebuffer(target, objectOrZero(m_framebufferBinding. get()));
933 }
925 drawingBuffer()->setBufferClearNeeded(false); 934 drawingBuffer()->setBufferClearNeeded(false);
926 935
927 return combinedClear ? CombinedClear : JustClear; 936 return combinedClear ? CombinedClear : JustClear;
928 } 937 }
929 938
930 void WebGLRenderingContextBase::restoreStateAfterClear() 939 void WebGLRenderingContextBase::restoreStateAfterClear()
931 { 940 {
932 if (isContextLost()) 941 if (isContextLost())
933 return; 942 return;
934 943
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1019 width = clamp(width, 1, maxWidth); 1028 width = clamp(width, 1, maxWidth);
1020 height = clamp(height, 1, maxHeight); 1029 height = clamp(height, 1, maxHeight);
1021 1030
1022 // We don't have to mark the canvas as dirty, since the newly created image buffer will also start off 1031 // We don't have to mark the canvas as dirty, since the newly created image buffer will also start off
1023 // clear (and this matches what reshape will do). 1032 // clear (and this matches what reshape will do).
1024 drawingBuffer()->reset(IntSize(width, height)); 1033 drawingBuffer()->reset(IntSize(width, height));
1025 restoreStateAfterClear(); 1034 restoreStateAfterClear();
1026 1035
1027 webContext()->bindTexture(GL_TEXTURE_2D, objectOrZero(m_textureUnits[m_activ eTextureUnit].m_texture2DBinding.get())); 1036 webContext()->bindTexture(GL_TEXTURE_2D, objectOrZero(m_textureUnits[m_activ eTextureUnit].m_texture2DBinding.get()));
1028 webContext()->bindRenderbuffer(GL_RENDERBUFFER, objectOrZero(m_renderbufferB inding.get())); 1037 webContext()->bindRenderbuffer(GL_RENDERBUFFER, objectOrZero(m_renderbufferB inding.get()));
1029 if (m_framebufferBinding) 1038 if (isWebGL2OrHigher()) {
1039 // In GLES 3.0, bindFramebuffer(GL_FRAMEBUFFER, buffer1) = bindBuffer(GL_REA D_FRAMEBUFFER, buffer1) +
1040 // bindFramebuffer(GL_DRAW_FRAMEBUFFER, buffer1)
1041 if (m_framebufferBinding)
1042 webContext()->bindFramebuffer(GL_DRAW_FRAMEBUFFER, objectOrZero(m_fr amebufferBinding.get()));
1043 WebGLFramebuffer* readFramebufferBinding = getFramebufferBinding(GL_READ _FRAMEBUFFER);
1044 if (readFramebufferBinding)
1045 webContext()->bindFramebuffer(GL_READ_FRAMEBUFFER, objectOrZero(read FramebufferBinding));
1046 } else if (m_framebufferBinding) {
1030 webContext()->bindFramebuffer(GL_FRAMEBUFFER, objectOrZero(m_framebuffer Binding.get())); 1047 webContext()->bindFramebuffer(GL_FRAMEBUFFER, objectOrZero(m_framebuffer Binding.get()));
1048 }
1031 } 1049 }
1032 1050
1033 int WebGLRenderingContextBase::drawingBufferWidth() const 1051 int WebGLRenderingContextBase::drawingBufferWidth() const
1034 { 1052 {
1035 return isContextLost() ? 0 : drawingBuffer()->size().width(); 1053 return isContextLost() ? 0 : drawingBuffer()->size().width();
1036 } 1054 }
1037 1055
1038 int WebGLRenderingContextBase::drawingBufferHeight() const 1056 int WebGLRenderingContextBase::drawingBufferHeight() const
1039 { 1057 {
1040 return isContextLost() ? 0 : drawingBuffer()->size().height(); 1058 return isContextLost() ? 0 : drawingBuffer()->size().height();
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
1368 1386
1369 bool WebGLRenderingContextBase::validateFramebufferTarget(GLenum target) 1387 bool WebGLRenderingContextBase::validateFramebufferTarget(GLenum target)
1370 { 1388 {
1371 if (target == GL_FRAMEBUFFER) 1389 if (target == GL_FRAMEBUFFER)
1372 return true; 1390 return true;
1373 return false; 1391 return false;
1374 } 1392 }
1375 1393
1376 WebGLFramebuffer* WebGLRenderingContextBase::getFramebufferBinding(GLenum target ) 1394 WebGLFramebuffer* WebGLRenderingContextBase::getFramebufferBinding(GLenum target )
1377 { 1395 {
1378 return m_framebufferBinding.get(); 1396 if (target == GL_FRAMEBUFFER)
1397 return m_framebufferBinding.get();
1398 return nullptr;
1379 } 1399 }
1380 1400
1381 GLenum WebGLRenderingContextBase::checkFramebufferStatus(GLenum target) 1401 GLenum WebGLRenderingContextBase::checkFramebufferStatus(GLenum target)
1382 { 1402 {
1383 if (isContextLost()) 1403 if (isContextLost())
1384 return GL_FRAMEBUFFER_UNSUPPORTED; 1404 return GL_FRAMEBUFFER_UNSUPPORTED;
1385 if (!validateFramebufferTarget(target)) { 1405 if (!validateFramebufferTarget(target)) {
1386 synthesizeGLError(GL_INVALID_ENUM, "checkFramebufferStatus", "invalid ta rget"); 1406 synthesizeGLError(GL_INVALID_ENUM, "checkFramebufferStatus", "invalid ta rget");
1387 return 0; 1407 return 0;
1388 } 1408 }
1389 if (!getFramebufferBinding(target) || !getFramebufferBinding(target)->object ()) 1409 WebGLFramebuffer* framebufferBinding = getFramebufferBinding(target);
1410 if (!framebufferBinding || !framebufferBinding->object())
1390 return GL_FRAMEBUFFER_COMPLETE; 1411 return GL_FRAMEBUFFER_COMPLETE;
1391 const char* reason = "framebuffer incomplete"; 1412 const char* reason = "framebuffer incomplete";
1392 GLenum result = m_framebufferBinding->checkStatus(&reason); 1413 GLenum result = framebufferBinding->checkStatus(&reason, target);
1393 if (result != GL_FRAMEBUFFER_COMPLETE) { 1414 if (result != GL_FRAMEBUFFER_COMPLETE) {
1394 emitGLWarning("checkFramebufferStatus", reason); 1415 emitGLWarning("checkFramebufferStatus", reason);
1395 return result; 1416 return result;
1396 } 1417 }
1397 result = webContext()->checkFramebufferStatus(target); 1418 result = webContext()->checkFramebufferStatus(target);
1398 return result; 1419 return result;
1399 } 1420 }
1400 1421
1401 void WebGLRenderingContextBase::clear(GLbitfield mask) 1422 void WebGLRenderingContextBase::clear(GLbitfield mask)
1402 { 1423 {
1403 if (isContextLost()) 1424 if (isContextLost())
1404 return; 1425 return;
1405 if (mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_B IT)) { 1426 if (mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_B IT)) {
1406 synthesizeGLError(GL_INVALID_VALUE, "clear", "invalid mask"); 1427 synthesizeGLError(GL_INVALID_VALUE, "clear", "invalid mask");
1407 return; 1428 return;
1408 } 1429 }
1409 const char* reason = "framebuffer incomplete"; 1430 const char* reason = "framebuffer incomplete";
1410 if (m_framebufferBinding && !m_framebufferBinding->onAccess(webContext(), &r eason)) { 1431 if (m_framebufferBinding && !m_framebufferBinding->onAccess(webContext(), GL _FRAMEBUFFER, &reason)) {
1411 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "clear", reason); 1432 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "clear", reason);
1412 return; 1433 return;
1413 } 1434 }
1414 if (clearIfComposited(mask) != CombinedClear) 1435 if (clearIfComposited(mask) != CombinedClear)
1415 webContext()->clear(mask); 1436 webContext()->clear(mask);
1416 markContextChanged(CanvasChanged); 1437 markContextChanged(CanvasChanged);
1417 } 1438 }
1418 1439
1419 void WebGLRenderingContextBase::clearColor(GLfloat r, GLfloat g, GLfloat b, GLfl oat a) 1440 void WebGLRenderingContextBase::clearColor(GLfloat r, GLfloat g, GLfloat b, GLfl oat a)
1420 { 1441 {
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
1561 } 1582 }
1562 if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFra mebufferColorFormat())) { 1583 if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFra mebufferColorFormat())) {
1563 synthesizeGLError(GL_INVALID_OPERATION, "copyTexImage2D", "framebuffer i s incompatible format"); 1584 synthesizeGLError(GL_INVALID_OPERATION, "copyTexImage2D", "framebuffer i s incompatible format");
1564 return; 1585 return;
1565 } 1586 }
1566 if (isNPOTStrict() && level && WebGLTexture::isNPOT(width, height)) { 1587 if (isNPOTStrict() && level && WebGLTexture::isNPOT(width, height)) {
1567 synthesizeGLError(GL_INVALID_VALUE, "copyTexImage2D", "level > 0 not pow er of 2"); 1588 synthesizeGLError(GL_INVALID_VALUE, "copyTexImage2D", "level > 0 not pow er of 2");
1568 return; 1589 return;
1569 } 1590 }
1570 const char* reason = "framebuffer incomplete"; 1591 const char* reason = "framebuffer incomplete";
1571 if (m_framebufferBinding && !m_framebufferBinding->onAccess(webContext(), &r eason)) { 1592 if ((m_framebufferBinding && !m_framebufferBinding->onAccess(webContext(), G L_FRAMEBUFFER, &reason))
1593 || (getFramebufferBinding(GL_READ_FRAMEBUFFER) && !getFramebufferBinding (GL_READ_FRAMEBUFFER)->onAccess(webContext(), GL_READ_FRAMEBUFFER, &reason))) {
1572 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "copyTexImage2D", re ason); 1594 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "copyTexImage2D", re ason);
1573 return; 1595 return;
1574 } 1596 }
1575 clearIfComposited(); 1597 clearIfComposited();
1576 ScopedDrawingBufferBinder binder(drawingBuffer(), m_framebufferBinding.get() ); 1598 ScopedDrawingBufferBinder binder(drawingBuffer(), m_framebufferBinding.get() , GL_FRAMEBUFFER);
1599 if (isWebGL2OrHigher())
1600 ScopedDrawingBufferBinder readBinder(drawingBuffer(), getFramebufferBind ing(GL_READ_FRAMEBUFFER), GL_READ_FRAMEBUFFER);
1577 webContext()->copyTexImage2D(target, level, internalformat, x, y, width, hei ght, border); 1601 webContext()->copyTexImage2D(target, level, internalformat, x, y, width, hei ght, border);
1578 // FIXME: if the framebuffer is not complete, none of the below should be ex ecuted. 1602 // FIXME: if the framebuffer is not complete, none of the below should be ex ecuted.
1579 tex->setLevelInfo(target, level, internalformat, width, height, 1, GL_UNSIGN ED_BYTE); 1603 tex->setLevelInfo(target, level, internalformat, width, height, 1, GL_UNSIGN ED_BYTE);
1580 } 1604 }
1581 1605
1582 void WebGLRenderingContextBase::copyTexSubImage2D(GLenum target, GLint level, GL int xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) 1606 void WebGLRenderingContextBase::copyTexSubImage2D(GLenum target, GLint level, GL int xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1583 { 1607 {
1584 if (isContextLost()) 1608 if (isContextLost())
1585 return; 1609 return;
1586 if (!validateTexFuncLevel("copyTexSubImage2D", target, level)) 1610 if (!validateTexFuncLevel("copyTexSubImage2D", target, level))
(...skipping 17 matching lines...) Expand all
1604 return; 1628 return;
1605 } 1629 }
1606 GLenum internalformat = tex->getInternalFormat(target, level); 1630 GLenum internalformat = tex->getInternalFormat(target, level);
1607 if (!validateSettableTexFormat("copyTexSubImage2D", internalformat)) 1631 if (!validateSettableTexFormat("copyTexSubImage2D", internalformat))
1608 return; 1632 return;
1609 if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFra mebufferColorFormat())) { 1633 if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFra mebufferColorFormat())) {
1610 synthesizeGLError(GL_INVALID_OPERATION, "copyTexSubImage2D", "framebuffe r is incompatible format"); 1634 synthesizeGLError(GL_INVALID_OPERATION, "copyTexSubImage2D", "framebuffe r is incompatible format");
1611 return; 1635 return;
1612 } 1636 }
1613 const char* reason = "framebuffer incomplete"; 1637 const char* reason = "framebuffer incomplete";
1614 if (m_framebufferBinding && !m_framebufferBinding->onAccess(webContext(), &r eason)) { 1638 if ((m_framebufferBinding && !m_framebufferBinding->onAccess(webContext(), G L_FRAMEBUFFER, &reason))
1639 || (getFramebufferBinding(GL_READ_FRAMEBUFFER) && !getFramebufferBinding (GL_READ_FRAMEBUFFER)->onAccess(webContext(), GL_READ_FRAMEBUFFER, &reason))) {
1615 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "copyTexSubImage2D", reason); 1640 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "copyTexSubImage2D", reason);
1616 return; 1641 return;
1617 } 1642 }
1618 clearIfComposited(); 1643 clearIfComposited();
1619 ScopedDrawingBufferBinder binder(drawingBuffer(), m_framebufferBinding.get() ); 1644 ScopedDrawingBufferBinder binder(drawingBuffer(), m_framebufferBinding.get() , GL_FRAMEBUFFER);
1645 if (isWebGL2OrHigher())
1646 ScopedDrawingBufferBinder readBinder(drawingBuffer(), getFramebufferBind ing(GL_READ_FRAMEBUFFER), GL_READ_FRAMEBUFFER);
1620 webContext()->copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width , height); 1647 webContext()->copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width , height);
1621 } 1648 }
1622 1649
1623 PassRefPtrWillBeRawPtr<WebGLBuffer> WebGLRenderingContextBase::createBuffer() 1650 PassRefPtrWillBeRawPtr<WebGLBuffer> WebGLRenderingContextBase::createBuffer()
1624 { 1651 {
1625 if (isContextLost()) 1652 if (isContextLost())
1626 return nullptr; 1653 return nullptr;
1627 RefPtrWillBeRawPtr<WebGLBuffer> o = WebGLBuffer::create(this); 1654 RefPtrWillBeRawPtr<WebGLBuffer> o = WebGLBuffer::create(this);
1628 addSharedObject(o.get()); 1655 addSharedObject(o.get());
1629 return o.release(); 1656 return o.release();
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
1732 1759
1733 m_boundVertexArrayObject->unbindBuffer(buffer); 1760 m_boundVertexArrayObject->unbindBuffer(buffer);
1734 } 1761 }
1735 1762
1736 void WebGLRenderingContextBase::deleteFramebuffer(WebGLFramebuffer* framebuffer) 1763 void WebGLRenderingContextBase::deleteFramebuffer(WebGLFramebuffer* framebuffer)
1737 { 1764 {
1738 if (!deleteObject(framebuffer)) 1765 if (!deleteObject(framebuffer))
1739 return; 1766 return;
1740 if (framebuffer == m_framebufferBinding) { 1767 if (framebuffer == m_framebufferBinding) {
1741 m_framebufferBinding = nullptr; 1768 m_framebufferBinding = nullptr;
1742 drawingBuffer()->setFramebufferBinding(0); 1769 drawingBuffer()->setFramebufferBinding(GL_FRAMEBUFFER, 0);
1743 // Have to call bindFramebuffer here to bind back to internal fbo. 1770 // Have to call drawingBuffer()->bind() here to bind back to internal fb o.
1744 drawingBuffer()->bind(); 1771 drawingBuffer()->bind();
1745 } 1772 }
1746 } 1773 }
1747 1774
1748 void WebGLRenderingContextBase::deleteProgram(WebGLProgram* program) 1775 void WebGLRenderingContextBase::deleteProgram(WebGLProgram* program)
1749 { 1776 {
1750 deleteObject(program); 1777 deleteObject(program);
1751 // We don't reset m_currentProgram to 0 here because the deletion of the 1778 // We don't reset m_currentProgram to 0 here because the deletion of the
1752 // current program is delayed. 1779 // current program is delayed.
1753 } 1780 }
1754 1781
1755 void WebGLRenderingContextBase::deleteRenderbuffer(WebGLRenderbuffer* renderbuff er) 1782 void WebGLRenderingContextBase::deleteRenderbuffer(WebGLRenderbuffer* renderbuff er)
1756 { 1783 {
1757 if (!deleteObject(renderbuffer)) 1784 if (!deleteObject(renderbuffer))
1758 return; 1785 return;
1759 if (renderbuffer == m_renderbufferBinding) 1786 if (renderbuffer == m_renderbufferBinding)
1760 m_renderbufferBinding = nullptr; 1787 m_renderbufferBinding = nullptr;
1761 if (m_framebufferBinding) 1788 if (m_framebufferBinding)
1762 m_framebufferBinding->removeAttachmentFromBoundFramebuffer(renderbuffer) ; 1789 m_framebufferBinding->removeAttachmentFromBoundFramebuffer(renderbuffer, GL_FRAMEBUFFER);
1790 if (getFramebufferBinding(GL_READ_FRAMEBUFFER))
1791 getFramebufferBinding(GL_READ_FRAMEBUFFER)->removeAttachmentFromBoundFra mebuffer(renderbuffer, GL_READ_FRAMEBUFFER);
1763 } 1792 }
1764 1793
1765 void WebGLRenderingContextBase::deleteShader(WebGLShader* shader) 1794 void WebGLRenderingContextBase::deleteShader(WebGLShader* shader)
1766 { 1795 {
1767 deleteObject(shader); 1796 deleteObject(shader);
1768 } 1797 }
1769 1798
1770 void WebGLRenderingContextBase::deleteTexture(WebGLTexture* texture) 1799 void WebGLRenderingContextBase::deleteTexture(WebGLTexture* texture)
1771 { 1800 {
1772 if (!deleteObject(texture)) 1801 if (!deleteObject(texture))
(...skipping 16 matching lines...) Expand all
1789 m_textureUnits[i].m_texture3DBinding = nullptr; 1818 m_textureUnits[i].m_texture3DBinding = nullptr;
1790 maxBoundTextureIndex = i; 1819 maxBoundTextureIndex = i;
1791 } 1820 }
1792 if (texture == m_textureUnits[i].m_texture2DArrayBinding) { 1821 if (texture == m_textureUnits[i].m_texture2DArrayBinding) {
1793 m_textureUnits[i].m_texture2DArrayBinding = nullptr; 1822 m_textureUnits[i].m_texture2DArrayBinding = nullptr;
1794 maxBoundTextureIndex = i; 1823 maxBoundTextureIndex = i;
1795 } 1824 }
1796 } 1825 }
1797 } 1826 }
1798 if (m_framebufferBinding) 1827 if (m_framebufferBinding)
1799 m_framebufferBinding->removeAttachmentFromBoundFramebuffer(texture); 1828 m_framebufferBinding->removeAttachmentFromBoundFramebuffer(texture, GL_F RAMEBUFFER);
1829 if (getFramebufferBinding(GL_READ_FRAMEBUFFER))
1830 getFramebufferBinding(GL_READ_FRAMEBUFFER)->removeAttachmentFromBoundFra mebuffer(texture, GL_READ_FRAMEBUFFER);
1800 1831
1801 // If the deleted was bound to the the current maximum index, trace backward s to find the new max texture index 1832 // If the deleted was bound to the the current maximum index, trace backward s to find the new max texture index
1802 if (m_onePlusMaxNonDefaultTextureUnit == static_cast<unsigned long>(maxBound TextureIndex + 1)) { 1833 if (m_onePlusMaxNonDefaultTextureUnit == static_cast<unsigned long>(maxBound TextureIndex + 1)) {
1803 findNewMaxNonDefaultTextureUnit(); 1834 findNewMaxNonDefaultTextureUnit();
1804 } 1835 }
1805 } 1836 }
1806 1837
1807 void WebGLRenderingContextBase::depthFunc(GLenum func) 1838 void WebGLRenderingContextBase::depthFunc(GLenum func)
1808 { 1839 {
1809 if (isContextLost()) 1840 if (isContextLost())
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
2009 synthesizeGLError(GL_INVALID_ENUM, "framebufferRenderbuffer", "invalid t arget"); 2040 synthesizeGLError(GL_INVALID_ENUM, "framebufferRenderbuffer", "invalid t arget");
2010 return; 2041 return;
2011 } 2042 }
2012 if (buffer && !buffer->validate(contextGroup(), this)) { 2043 if (buffer && !buffer->validate(contextGroup(), this)) {
2013 synthesizeGLError(GL_INVALID_OPERATION, "framebufferRenderbuffer", "no b uffer or buffer not from this context"); 2044 synthesizeGLError(GL_INVALID_OPERATION, "framebufferRenderbuffer", "no b uffer or buffer not from this context");
2014 return; 2045 return;
2015 } 2046 }
2016 // Don't allow the default framebuffer to be mutated; all current 2047 // Don't allow the default framebuffer to be mutated; all current
2017 // implementations use an FBO internally in place of the default 2048 // implementations use an FBO internally in place of the default
2018 // FBO. 2049 // FBO.
2019 if (!m_framebufferBinding || !m_framebufferBinding->object()) { 2050 WebGLFramebuffer* framebufferBinding = getFramebufferBinding(target);
2051 if (!framebufferBinding || !framebufferBinding->object()) {
2020 synthesizeGLError(GL_INVALID_OPERATION, "framebufferRenderbuffer", "no f ramebuffer bound"); 2052 synthesizeGLError(GL_INVALID_OPERATION, "framebufferRenderbuffer", "no f ramebuffer bound");
2021 return; 2053 return;
2022 } 2054 }
2023 Platform3DObject bufferObject = objectOrZero(buffer); 2055 Platform3DObject bufferObject = objectOrZero(buffer);
2024 switch (attachment) { 2056 switch (attachment) {
2025 case GC3D_DEPTH_STENCIL_ATTACHMENT_WEBGL: 2057 case GC3D_DEPTH_STENCIL_ATTACHMENT_WEBGL:
2026 if (isDepthStencilSupported() || !buffer) { 2058 if (isDepthStencilSupported() || !buffer) {
2027 webContext()->framebufferRenderbuffer(target, GL_DEPTH_ATTACHMENT, r enderbuffertarget, bufferObject); 2059 webContext()->framebufferRenderbuffer(target, GL_DEPTH_ATTACHMENT, r enderbuffertarget, bufferObject);
2028 webContext()->framebufferRenderbuffer(target, GL_STENCIL_ATTACHMENT, renderbuffertarget, bufferObject); 2060 webContext()->framebufferRenderbuffer(target, GL_STENCIL_ATTACHMENT, renderbuffertarget, bufferObject);
2029 } else { 2061 } else {
2030 WebGLRenderbuffer* emulatedStencilBuffer = ensureEmulatedStencilBuff er(renderbuffertarget, buffer); 2062 WebGLRenderbuffer* emulatedStencilBuffer = ensureEmulatedStencilBuff er(renderbuffertarget, buffer);
2031 if (!emulatedStencilBuffer) { 2063 if (!emulatedStencilBuffer) {
2032 synthesizeGLError(GL_OUT_OF_MEMORY, "framebufferRenderbuffer", " out of memory"); 2064 synthesizeGLError(GL_OUT_OF_MEMORY, "framebufferRenderbuffer", " out of memory");
2033 return; 2065 return;
2034 } 2066 }
2035 webContext()->framebufferRenderbuffer(target, GL_DEPTH_ATTACHMENT, r enderbuffertarget, bufferObject); 2067 webContext()->framebufferRenderbuffer(target, GL_DEPTH_ATTACHMENT, r enderbuffertarget, bufferObject);
2036 webContext()->framebufferRenderbuffer(target, GL_STENCIL_ATTACHMENT, renderbuffertarget, objectOrZero(emulatedStencilBuffer)); 2068 webContext()->framebufferRenderbuffer(target, GL_STENCIL_ATTACHMENT, renderbuffertarget, objectOrZero(emulatedStencilBuffer));
2037 } 2069 }
2038 break; 2070 break;
2039 default: 2071 default:
2040 webContext()->framebufferRenderbuffer(target, attachment, renderbufferta rget, bufferObject); 2072 webContext()->framebufferRenderbuffer(target, attachment, renderbufferta rget, bufferObject);
2041 } 2073 }
2042 m_framebufferBinding->setAttachmentForBoundFramebuffer(attachment, buffer); 2074 framebufferBinding->setAttachmentForBoundFramebuffer(target, attachment, buf fer);
2043 applyStencilTest(); 2075 applyStencilTest();
2044 } 2076 }
2045 2077
2046 void WebGLRenderingContextBase::framebufferTexture2D(GLenum target, GLenum attac hment, GLenum textarget, WebGLTexture* texture, GLint level) 2078 void WebGLRenderingContextBase::framebufferTexture2D(GLenum target, GLenum attac hment, GLenum textarget, WebGLTexture* texture, GLint level)
2047 { 2079 {
2048 if (isContextLost() || !validateFramebufferFuncParameters("framebufferTextur e2D", target, attachment)) 2080 if (isContextLost() || !validateFramebufferFuncParameters("framebufferTextur e2D", target, attachment))
2049 return; 2081 return;
2050 if (level) { 2082 if (level) {
2051 synthesizeGLError(GL_INVALID_VALUE, "framebufferTexture2D", "level not 0 "); 2083 synthesizeGLError(GL_INVALID_VALUE, "framebufferTexture2D", "level not 0 ");
2052 return; 2084 return;
2053 } 2085 }
2054 if (texture && !texture->validate(contextGroup(), this)) { 2086 if (texture && !texture->validate(contextGroup(), this)) {
2055 synthesizeGLError(GL_INVALID_OPERATION, "framebufferTexture2D", "no text ure or texture not from this context"); 2087 synthesizeGLError(GL_INVALID_OPERATION, "framebufferTexture2D", "no text ure or texture not from this context");
2056 return; 2088 return;
2057 } 2089 }
2058 // Don't allow the default framebuffer to be mutated; all current 2090 // Don't allow the default framebuffer to be mutated; all current
2059 // implementations use an FBO internally in place of the default 2091 // implementations use an FBO internally in place of the default
2060 // FBO. 2092 // FBO.
2061 if (!m_framebufferBinding || !m_framebufferBinding->object()) { 2093 WebGLFramebuffer* framebufferBinding = getFramebufferBinding(target);
2094 if (!framebufferBinding || !framebufferBinding->object()) {
2062 synthesizeGLError(GL_INVALID_OPERATION, "framebufferTexture2D", "no fram ebuffer bound"); 2095 synthesizeGLError(GL_INVALID_OPERATION, "framebufferTexture2D", "no fram ebuffer bound");
2063 return; 2096 return;
2064 } 2097 }
2065 Platform3DObject textureObject = objectOrZero(texture); 2098 Platform3DObject textureObject = objectOrZero(texture);
2066 switch (attachment) { 2099 switch (attachment) {
2067 case GC3D_DEPTH_STENCIL_ATTACHMENT_WEBGL: 2100 case GC3D_DEPTH_STENCIL_ATTACHMENT_WEBGL:
2068 webContext()->framebufferTexture2D(target, GL_DEPTH_ATTACHMENT, textarge t, textureObject, level); 2101 webContext()->framebufferTexture2D(target, GL_DEPTH_ATTACHMENT, textarge t, textureObject, level);
2069 webContext()->framebufferTexture2D(target, GL_STENCIL_ATTACHMENT, textar get, textureObject, level); 2102 webContext()->framebufferTexture2D(target, GL_STENCIL_ATTACHMENT, textar get, textureObject, level);
2070 break; 2103 break;
2071 case GL_DEPTH_ATTACHMENT:
2072 webContext()->framebufferTexture2D(target, attachment, textarget, textur eObject, level);
2073 break;
2074 case GL_STENCIL_ATTACHMENT:
2075 webContext()->framebufferTexture2D(target, attachment, textarget, textur eObject, level);
2076 break;
2077 default: 2104 default:
2078 webContext()->framebufferTexture2D(target, attachment, textarget, textur eObject, level); 2105 webContext()->framebufferTexture2D(target, attachment, textarget, textur eObject, level);
2079 } 2106 }
2080 m_framebufferBinding->setAttachmentForBoundFramebuffer(attachment, textarget , texture, level); 2107 framebufferBinding->setAttachmentForBoundFramebuffer(target, attachment, tex target, texture, level);
2081 applyStencilTest(); 2108 applyStencilTest();
2082 } 2109 }
2083 2110
2084 void WebGLRenderingContextBase::frontFace(GLenum mode) 2111 void WebGLRenderingContextBase::frontFace(GLenum mode)
2085 { 2112 {
2086 if (isContextLost()) 2113 if (isContextLost())
2087 return; 2114 return;
2088 switch (mode) { 2115 switch (mode) {
2089 case GL_CW: 2116 case GL_CW:
2090 case GL_CCW: 2117 case GL_CCW:
(...skipping 1233 matching lines...) Expand 10 before | Expand all | Expand 10 after
3324 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "format/type n ot RGBA/UNSIGNED_BYTE or implementation-defined values"); 3351 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "format/type n ot RGBA/UNSIGNED_BYTE or implementation-defined values");
3325 return; 3352 return;
3326 } 3353 }
3327 } 3354 }
3328 // Validate array type against pixel type. 3355 // Validate array type against pixel type.
3329 if (pixels->type() != expectedViewType) { 3356 if (pixels->type() != expectedViewType) {
3330 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "ArrayBufferView w as the wrong type for the pixel format"); 3357 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "ArrayBufferView w as the wrong type for the pixel format");
3331 return; 3358 return;
3332 } 3359 }
3333 const char* reason = "framebuffer incomplete"; 3360 const char* reason = "framebuffer incomplete";
3334 if (m_framebufferBinding && !m_framebufferBinding->onAccess(webContext(), &r eason)) { 3361 GLenum target = isWebGL2OrHigher() ? GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER;
3362 WebGLFramebuffer* readFramebufferBinding = getFramebufferBinding(target);
3363 if (readFramebufferBinding && !readFramebufferBinding->onAccess(webContext() , target, &reason)) {
3335 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "readPixels", reason ); 3364 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "readPixels", reason );
3336 return; 3365 return;
3337 } 3366 }
3338 // Calculate array size, taking into consideration of PACK_ALIGNMENT. 3367 // Calculate array size, taking into consideration of PACK_ALIGNMENT.
3339 unsigned totalBytesRequired = 0; 3368 unsigned totalBytesRequired = 0;
3340 unsigned padding = 0; 3369 unsigned padding = 0;
3341 GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, w idth, height, m_packAlignment, &totalBytesRequired, &padding); 3370 GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, w idth, height, m_packAlignment, &totalBytesRequired, &padding);
3342 if (error != GL_NO_ERROR) { 3371 if (error != GL_NO_ERROR) {
3343 synthesizeGLError(error, "readPixels", "invalid dimensions"); 3372 synthesizeGLError(error, "readPixels", "invalid dimensions");
3344 return; 3373 return;
3345 } 3374 }
3346 if (pixels->byteLength() < totalBytesRequired) { 3375 if (pixels->byteLength() < totalBytesRequired) {
3347 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "ArrayBufferView n ot large enough for dimensions"); 3376 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "ArrayBufferView n ot large enough for dimensions");
3348 return; 3377 return;
3349 } 3378 }
3350 3379
3351 clearIfComposited(); 3380 clearIfComposited();
3352 void* data = pixels->baseAddress(); 3381 void* data = pixels->baseAddress();
3353 3382
3354 { 3383 {
3355 ScopedDrawingBufferBinder binder(drawingBuffer(), m_framebufferBinding.g et()); 3384 ScopedDrawingBufferBinder binder(drawingBuffer(), readFramebufferBinding , target);
3356 webContext()->readPixels(x, y, width, height, format, type, data); 3385 webContext()->readPixels(x, y, width, height, format, type, data);
3357 } 3386 }
3358 3387
3359 #if OS(MACOSX) 3388 #if OS(MACOSX)
3360 // FIXME: remove this section when GL driver bug on Mac is fixed, i.e., 3389 // FIXME: remove this section when GL driver bug on Mac is fixed, i.e.,
3361 // when alpha is off, readPixels should set alpha to 255 instead of 0. 3390 // when alpha is off, readPixels should set alpha to 255 instead of 0.
3362 if (!m_framebufferBinding && !drawingBuffer()->getActualAttributes().alpha) { 3391 if (!readFramebufferBinding && !drawingBuffer()->getActualAttributes().alpha ) {
3363 unsigned char* pixels = reinterpret_cast<unsigned char*>(data); 3392 unsigned char* pixels = reinterpret_cast<unsigned char*>(data);
3364 for (GLsizei iy = 0; iy < height; ++iy) { 3393 for (GLsizei iy = 0; iy < height; ++iy) {
3365 for (GLsizei ix = 0; ix < width; ++ix) { 3394 for (GLsizei ix = 0; ix < width; ++ix) {
3366 pixels[3] = 255; 3395 pixels[3] = 255;
3367 pixels += 4; 3396 pixels += 4;
3368 } 3397 }
3369 pixels += padding; 3398 pixels += padding;
3370 } 3399 }
3371 } 3400 }
3372 #endif 3401 #endif
(...skipping 1247 matching lines...) Expand 10 before | Expand all | Expand 10 after
4620 4649
4621 if (mode == RealLostContext) { 4650 if (mode == RealLostContext) {
4622 // Inform the embedder that a lost context was received. In response, th e embedder might 4651 // Inform the embedder that a lost context was received. In response, th e embedder might
4623 // decide to take action such as asking the user for permission to use W ebGL again. 4652 // decide to take action such as asking the user for permission to use W ebGL again.
4624 if (LocalFrame* frame = canvas()->document().frame()) 4653 if (LocalFrame* frame = canvas()->document().frame())
4625 frame->loader().client()->didLoseWebGLContext(webContext()->getGraph icsResetStatusARB()); 4654 frame->loader().client()->didLoseWebGLContext(webContext()->getGraph icsResetStatusARB());
4626 } 4655 }
4627 4656
4628 // Make absolutely sure we do not refer to an already-deleted texture or fra mebuffer. 4657 // Make absolutely sure we do not refer to an already-deleted texture or fra mebuffer.
4629 drawingBuffer()->setTexture2DBinding(0); 4658 drawingBuffer()->setTexture2DBinding(0);
4630 drawingBuffer()->setFramebufferBinding(0); 4659 drawingBuffer()->setFramebufferBinding(GL_FRAMEBUFFER, 0);
4631 4660
4632 detachAndRemoveAllObjects(); 4661 detachAndRemoveAllObjects();
4633 4662
4634 // Lose all the extensions. 4663 // Lose all the extensions.
4635 for (size_t i = 0; i < m_extensions.size(); ++i) { 4664 for (size_t i = 0; i < m_extensions.size(); ++i) {
4636 ExtensionTracker* tracker = m_extensions[i].get(); 4665 ExtensionTracker* tracker = m_extensions[i].get();
4637 tracker->loseExtension(); 4666 tracker->loseExtension();
4638 } 4667 }
4639 4668
4640 for (size_t i = 0; i < WebGLExtensionNameCount; ++i) 4669 for (size_t i = 0; i < WebGLExtensionNameCount; ++i)
(...skipping 1074 matching lines...) Expand 10 before | Expand all | Expand 10 after
5715 if (!count) { 5744 if (!count) {
5716 markContextChanged(CanvasChanged); 5745 markContextChanged(CanvasChanged);
5717 return false; 5746 return false;
5718 } 5747 }
5719 5748
5720 if (!validateRenderingState(functionName)) { 5749 if (!validateRenderingState(functionName)) {
5721 return false; 5750 return false;
5722 } 5751 }
5723 5752
5724 const char* reason = "framebuffer incomplete"; 5753 const char* reason = "framebuffer incomplete";
5725 if (m_framebufferBinding && !m_framebufferBinding->onAccess(webContext(), &r eason)) { 5754 if (m_framebufferBinding && !m_framebufferBinding->onAccess(webContext(), GL _FRAMEBUFFER, &reason)) {
5726 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason ); 5755 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason );
5727 return false; 5756 return false;
5728 } 5757 }
5729 5758
5730 return true; 5759 return true;
5731 } 5760 }
5732 5761
5733 bool WebGLRenderingContextBase::validateDrawElements(const char* functionName, G Lenum mode, GLsizei count, GLenum type, long long offset) 5762 bool WebGLRenderingContextBase::validateDrawElements(const char* functionName, G Lenum mode, GLsizei count, GLenum type, long long offset)
5734 { 5763 {
5735 if (isContextLost() || !validateDrawMode(functionName, mode)) 5764 if (isContextLost() || !validateDrawMode(functionName, mode))
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
5767 if (!m_boundVertexArrayObject->boundElementArrayBuffer()) { 5796 if (!m_boundVertexArrayObject->boundElementArrayBuffer()) {
5768 synthesizeGLError(GL_INVALID_OPERATION, functionName, "no ELEMENT_ARRAY_ BUFFER bound"); 5797 synthesizeGLError(GL_INVALID_OPERATION, functionName, "no ELEMENT_ARRAY_ BUFFER bound");
5769 return false; 5798 return false;
5770 } 5799 }
5771 5800
5772 if (!validateRenderingState(functionName)) { 5801 if (!validateRenderingState(functionName)) {
5773 return false; 5802 return false;
5774 } 5803 }
5775 5804
5776 const char* reason = "framebuffer incomplete"; 5805 const char* reason = "framebuffer incomplete";
5777 if (m_framebufferBinding && !m_framebufferBinding->onAccess(webContext(), &r eason)) { 5806 if (m_framebufferBinding && !m_framebufferBinding->onAccess(webContext(), GL _FRAMEBUFFER, &reason)) {
5778 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason ); 5807 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason );
5779 return false; 5808 return false;
5780 } 5809 }
5781 5810
5782 return true; 5811 return true;
5783 } 5812 }
5784 5813
5785 // Helper function to validate draw*Instanced calls 5814 // Helper function to validate draw*Instanced calls
5786 bool WebGLRenderingContextBase::validateDrawInstanced(const char* functionName, GLsizei primcount) 5815 bool WebGLRenderingContextBase::validateDrawInstanced(const char* functionName, GLsizei primcount)
5787 { 5816 {
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
6107 6136
6108 void WebGLRenderingContextBase::setFramebuffer(GLenum target, WebGLFramebuffer* buffer) 6137 void WebGLRenderingContextBase::setFramebuffer(GLenum target, WebGLFramebuffer* buffer)
6109 { 6138 {
6110 if (buffer) 6139 if (buffer)
6111 buffer->setHasEverBeenBound(); 6140 buffer->setHasEverBeenBound();
6112 6141
6113 if (target == GL_FRAMEBUFFER || target == GL_DRAW_FRAMEBUFFER) { 6142 if (target == GL_FRAMEBUFFER || target == GL_DRAW_FRAMEBUFFER) {
6114 m_framebufferBinding = buffer; 6143 m_framebufferBinding = buffer;
6115 applyStencilTest(); 6144 applyStencilTest();
6116 } 6145 }
6117 drawingBuffer()->setFramebufferBinding(objectOrZero(m_framebufferBinding.get ())); 6146 drawingBuffer()->setFramebufferBinding(target, objectOrZero(getFramebufferBi nding(target)));
6118 6147
6119 if (!buffer) { 6148 if (!buffer) {
6120 // Instead of binding fb 0, bind the drawing buffer. 6149 // Instead of binding fb 0, bind the drawing buffer.
6121 drawingBuffer()->bind(target); 6150 drawingBuffer()->bind(target);
6122 } else { 6151 } else {
6123 webContext()->bindFramebuffer(target, buffer->object()); 6152 webContext()->bindFramebuffer(target, buffer->object());
6124 } 6153 }
6125 } 6154 }
6126 6155
6127 void WebGLRenderingContextBase::restoreCurrentFramebuffer() 6156 void WebGLRenderingContextBase::restoreCurrentFramebuffer()
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
6224 return m_sharedWebGraphicsContext3D ? m_sharedWebGraphicsContext3D->drawingB uffer() : 0; 6253 return m_sharedWebGraphicsContext3D ? m_sharedWebGraphicsContext3D->drawingB uffer() : 0;
6225 } 6254 }
6226 #else 6255 #else
6227 DrawingBuffer* WebGLRenderingContextBase::drawingBuffer() const 6256 DrawingBuffer* WebGLRenderingContextBase::drawingBuffer() const
6228 { 6257 {
6229 return m_drawingBuffer.get(); 6258 return m_drawingBuffer.get();
6230 } 6259 }
6231 #endif 6260 #endif
6232 6261
6233 } // namespace blink 6262 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698