| OLD | NEW |
| 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 699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 710 commitStartTime, | 710 commitStartTime, |
| 711 drawingBuffer()->contextProvider()->isSoftwareRendering()); | 711 drawingBuffer()->contextProvider()->isSoftwareRendering()); |
| 712 } | 712 } |
| 713 | 713 |
| 714 PassRefPtr<Image> WebGLRenderingContextBase::getImage( | 714 PassRefPtr<Image> WebGLRenderingContextBase::getImage( |
| 715 AccelerationHint hint, | 715 AccelerationHint hint, |
| 716 SnapshotReason reason) const { | 716 SnapshotReason reason) const { |
| 717 if (!drawingBuffer()) | 717 if (!drawingBuffer()) |
| 718 return nullptr; | 718 return nullptr; |
| 719 | 719 |
| 720 drawingBuffer()->commit(); | 720 drawingBuffer()->resolveAndBindForReadAndDraw(); |
| 721 IntSize size = clampedCanvasSize(); | 721 IntSize size = clampedCanvasSize(); |
| 722 OpacityMode opacityMode = | 722 OpacityMode opacityMode = |
| 723 creationAttributes().hasAlpha() ? NonOpaque : Opaque; | 723 creationAttributes().hasAlpha() ? NonOpaque : Opaque; |
| 724 std::unique_ptr<AcceleratedImageBufferSurface> surface = | 724 std::unique_ptr<AcceleratedImageBufferSurface> surface = |
| 725 wrapUnique(new AcceleratedImageBufferSurface(size, opacityMode)); | 725 wrapUnique(new AcceleratedImageBufferSurface(size, opacityMode)); |
| 726 if (!surface->isValid()) | 726 if (!surface->isValid()) |
| 727 return nullptr; | 727 return nullptr; |
| 728 std::unique_ptr<ImageBuffer> buffer = ImageBuffer::create(std::move(surface)); | 728 std::unique_ptr<ImageBuffer> buffer = ImageBuffer::create(std::move(surface)); |
| 729 if (!buffer->copyRenderingResultsFromDrawingBuffer(drawingBuffer(), | 729 if (!buffer->copyRenderingResultsFromDrawingBuffer(drawingBuffer(), |
| 730 BackBuffer)) { | 730 BackBuffer)) { |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1054 : DrawingBuffer::Discard; | 1054 : DrawingBuffer::Discard; |
| 1055 DrawingBuffer::WebGLVersion webGLVersion = DrawingBuffer::WebGL1; | 1055 DrawingBuffer::WebGLVersion webGLVersion = DrawingBuffer::WebGL1; |
| 1056 if (version() == 1) { | 1056 if (version() == 1) { |
| 1057 webGLVersion = DrawingBuffer::WebGL1; | 1057 webGLVersion = DrawingBuffer::WebGL1; |
| 1058 } else if (version() == 2) { | 1058 } else if (version() == 2) { |
| 1059 webGLVersion = DrawingBuffer::WebGL2; | 1059 webGLVersion = DrawingBuffer::WebGL2; |
| 1060 } else { | 1060 } else { |
| 1061 NOTREACHED(); | 1061 NOTREACHED(); |
| 1062 } | 1062 } |
| 1063 return DrawingBuffer::create( | 1063 return DrawingBuffer::create( |
| 1064 std::move(contextProvider), clampedCanvasSize(), premultipliedAlpha, | 1064 std::move(contextProvider), this, clampedCanvasSize(), premultipliedAlpha, |
| 1065 wantAlphaChannel, wantDepthBuffer, wantStencilBuffer, wantAntialiasing, | 1065 wantAlphaChannel, wantDepthBuffer, wantStencilBuffer, wantAntialiasing, |
| 1066 preserve, webGLVersion, chromiumImageUsage); | 1066 preserve, webGLVersion, chromiumImageUsage); |
| 1067 } | 1067 } |
| 1068 | 1068 |
| 1069 void WebGLRenderingContextBase::initializeNewContext() { | 1069 void WebGLRenderingContextBase::initializeNewContext() { |
| 1070 ASSERT(!isContextLost()); | 1070 ASSERT(!isContextLost()); |
| 1071 ASSERT(drawingBuffer()); | 1071 ASSERT(drawingBuffer()); |
| 1072 | 1072 |
| 1073 m_markedCanvasDirty = false; | 1073 m_markedCanvasDirty = false; |
| 1074 m_activeTextureUnit = 0; | 1074 m_activeTextureUnit = 0; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1085 m_stencilEnabled = false; | 1085 m_stencilEnabled = false; |
| 1086 m_stencilMask = 0xFFFFFFFF; | 1086 m_stencilMask = 0xFFFFFFFF; |
| 1087 m_stencilMaskBack = 0xFFFFFFFF; | 1087 m_stencilMaskBack = 0xFFFFFFFF; |
| 1088 m_stencilFuncRef = 0; | 1088 m_stencilFuncRef = 0; |
| 1089 m_stencilFuncRefBack = 0; | 1089 m_stencilFuncRefBack = 0; |
| 1090 m_stencilFuncMask = 0xFFFFFFFF; | 1090 m_stencilFuncMask = 0xFFFFFFFF; |
| 1091 m_stencilFuncMaskBack = 0xFFFFFFFF; | 1091 m_stencilFuncMaskBack = 0xFFFFFFFF; |
| 1092 m_numGLErrorsToConsoleAllowed = maxGLErrorsAllowedToConsole; | 1092 m_numGLErrorsToConsoleAllowed = maxGLErrorsAllowedToConsole; |
| 1093 | 1093 |
| 1094 m_clearColor[0] = m_clearColor[1] = m_clearColor[2] = m_clearColor[3] = 0; | 1094 m_clearColor[0] = m_clearColor[1] = m_clearColor[2] = m_clearColor[3] = 0; |
| 1095 drawingBuffer()->setClearColor(m_clearColor); | |
| 1096 m_scissorEnabled = false; | 1095 m_scissorEnabled = false; |
| 1097 m_clearDepth = 1; | 1096 m_clearDepth = 1; |
| 1098 m_clearStencil = 0; | 1097 m_clearStencil = 0; |
| 1099 m_colorMask[0] = m_colorMask[1] = m_colorMask[2] = m_colorMask[3] = true; | 1098 m_colorMask[0] = m_colorMask[1] = m_colorMask[2] = m_colorMask[3] = true; |
| 1100 drawingBuffer()->setColorMask(m_colorMask); | |
| 1101 | 1099 |
| 1102 GLint numCombinedTextureImageUnits = 0; | 1100 GLint numCombinedTextureImageUnits = 0; |
| 1103 contextGL()->GetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, | 1101 contextGL()->GetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, |
| 1104 &numCombinedTextureImageUnits); | 1102 &numCombinedTextureImageUnits); |
| 1105 m_textureUnits.clear(); | 1103 m_textureUnits.clear(); |
| 1106 m_textureUnits.resize(numCombinedTextureImageUnits); | 1104 m_textureUnits.resize(numCombinedTextureImageUnits); |
| 1107 | 1105 |
| 1108 GLint numVertexAttribs = 0; | 1106 GLint numVertexAttribs = 0; |
| 1109 contextGL()->GetIntegerv(GL_MAX_VERTEX_ATTRIBS, &numVertexAttribs); | 1107 contextGL()->GetIntegerv(GL_MAX_VERTEX_ATTRIBS, &numVertexAttribs); |
| 1110 m_maxVertexAttribs = numVertexAttribs; | 1108 m_maxVertexAttribs = numVertexAttribs; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1195 kSupportedFormatsES2); | 1193 kSupportedFormatsES2); |
| 1196 m_supportedFormats.clear(); | 1194 m_supportedFormats.clear(); |
| 1197 ADD_VALUES_TO_SET(m_supportedFormats, kSupportedFormatsES2); | 1195 ADD_VALUES_TO_SET(m_supportedFormats, kSupportedFormatsES2); |
| 1198 m_supportedTexImageSourceFormats.clear(); | 1196 m_supportedTexImageSourceFormats.clear(); |
| 1199 ADD_VALUES_TO_SET(m_supportedTexImageSourceFormats, kSupportedFormatsES2); | 1197 ADD_VALUES_TO_SET(m_supportedTexImageSourceFormats, kSupportedFormatsES2); |
| 1200 m_supportedTypes.clear(); | 1198 m_supportedTypes.clear(); |
| 1201 ADD_VALUES_TO_SET(m_supportedTypes, kSupportedTypesES2); | 1199 ADD_VALUES_TO_SET(m_supportedTypes, kSupportedTypesES2); |
| 1202 m_supportedTexImageSourceTypes.clear(); | 1200 m_supportedTexImageSourceTypes.clear(); |
| 1203 ADD_VALUES_TO_SET(m_supportedTexImageSourceTypes, kSupportedTypesES2); | 1201 ADD_VALUES_TO_SET(m_supportedTexImageSourceTypes, kSupportedTypesES2); |
| 1204 | 1202 |
| 1203 // The DrawingBuffer was unable to store the state that dirtied when it was |
| 1204 // initialized. Restore it now. |
| 1205 drawingBuffer()->restoreAllState(); |
| 1205 activateContext(this); | 1206 activateContext(this); |
| 1206 } | 1207 } |
| 1207 | 1208 |
| 1208 void WebGLRenderingContextBase::setupFlags() { | 1209 void WebGLRenderingContextBase::setupFlags() { |
| 1209 ASSERT(drawingBuffer()); | 1210 ASSERT(drawingBuffer()); |
| 1210 if (canvas()) { | 1211 if (canvas()) { |
| 1211 if (Page* p = canvas()->document().page()) { | 1212 if (Page* p = canvas()->document().page()) { |
| 1212 m_synthesizedErrorsToConsole = | 1213 m_synthesizedErrorsToConsole = |
| 1213 p->settings().webGLErrorsToConsoleEnabled(); | 1214 p->settings().webGLErrorsToConsoleEnabled(); |
| 1214 } | 1215 } |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1377 contextGL()->ClearStencil(0); | 1378 contextGL()->ClearStencil(0); |
| 1378 clearMask |= GL_STENCIL_BUFFER_BIT; | 1379 clearMask |= GL_STENCIL_BUFFER_BIT; |
| 1379 contextGL()->StencilMaskSeparate(GL_FRONT, 0xFFFFFFFF); | 1380 contextGL()->StencilMaskSeparate(GL_FRONT, 0xFFFFFFFF); |
| 1380 } | 1381 } |
| 1381 | 1382 |
| 1382 contextGL()->ColorMask( | 1383 contextGL()->ColorMask( |
| 1383 true, true, true, | 1384 true, true, true, |
| 1384 !drawingBuffer()->defaultBufferRequiresAlphaChannelToBePreserved()); | 1385 !drawingBuffer()->defaultBufferRequiresAlphaChannelToBePreserved()); |
| 1385 drawingBuffer()->clearFramebuffers(clearMask); | 1386 drawingBuffer()->clearFramebuffers(clearMask); |
| 1386 | 1387 |
| 1387 restoreStateAfterClear(); | 1388 // Call the DrawingBufferClient method to restore scissor test, mask, and |
| 1388 drawingBuffer()->restoreFramebufferBindings(); | 1389 // clear values, because we dirtied them above. |
| 1390 DrawingBufferClientRestoreScissorTest(); |
| 1391 DrawingBufferClientRestoreMaskAndClearValues(); |
| 1392 |
| 1389 drawingBuffer()->setBufferClearNeeded(false); | 1393 drawingBuffer()->setBufferClearNeeded(false); |
| 1390 | 1394 |
| 1391 return combinedClear ? CombinedClear : JustClear; | 1395 return combinedClear ? CombinedClear : JustClear; |
| 1392 } | 1396 } |
| 1393 | 1397 |
| 1394 void WebGLRenderingContextBase::restoreScissorEnabled() { | 1398 void WebGLRenderingContextBase::restoreScissorEnabled() { |
| 1395 if (isContextLost()) | 1399 if (isContextLost()) |
| 1396 return; | 1400 return; |
| 1397 | 1401 |
| 1398 if (m_scissorEnabled) { | 1402 if (m_scissorEnabled) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1411 } | 1415 } |
| 1412 | 1416 |
| 1413 void WebGLRenderingContextBase::restoreClearColor() { | 1417 void WebGLRenderingContextBase::restoreClearColor() { |
| 1414 if (isContextLost()) | 1418 if (isContextLost()) |
| 1415 return; | 1419 return; |
| 1416 | 1420 |
| 1417 contextGL()->ClearColor(m_clearColor[0], m_clearColor[1], m_clearColor[2], | 1421 contextGL()->ClearColor(m_clearColor[0], m_clearColor[1], m_clearColor[2], |
| 1418 m_clearColor[3]); | 1422 m_clearColor[3]); |
| 1419 } | 1423 } |
| 1420 | 1424 |
| 1421 void WebGLRenderingContextBase::restoreClearDepthf() { | |
| 1422 if (isContextLost()) | |
| 1423 return; | |
| 1424 | |
| 1425 contextGL()->ClearDepthf(m_clearDepth); | |
| 1426 } | |
| 1427 | |
| 1428 void WebGLRenderingContextBase::restoreClearStencil() { | |
| 1429 if (isContextLost()) | |
| 1430 return; | |
| 1431 | |
| 1432 contextGL()->ClearStencil(m_clearStencil); | |
| 1433 } | |
| 1434 | |
| 1435 void WebGLRenderingContextBase::restoreStencilMaskSeparate() { | |
| 1436 if (isContextLost()) | |
| 1437 return; | |
| 1438 | |
| 1439 contextGL()->StencilMaskSeparate(GL_FRONT, m_stencilMask); | |
| 1440 } | |
| 1441 | |
| 1442 void WebGLRenderingContextBase::restoreColorMask() { | 1425 void WebGLRenderingContextBase::restoreColorMask() { |
| 1443 if (isContextLost()) | 1426 if (isContextLost()) |
| 1444 return; | 1427 return; |
| 1445 | 1428 |
| 1446 contextGL()->ColorMask(m_colorMask[0], m_colorMask[1], m_colorMask[2], | 1429 contextGL()->ColorMask(m_colorMask[0], m_colorMask[1], m_colorMask[2], |
| 1447 m_colorMask[3]); | 1430 m_colorMask[3]); |
| 1448 } | 1431 } |
| 1449 | 1432 |
| 1450 void WebGLRenderingContextBase::restoreDepthMask() { | |
| 1451 if (isContextLost()) | |
| 1452 return; | |
| 1453 | |
| 1454 contextGL()->DepthMask(m_depthMask); | |
| 1455 } | |
| 1456 | |
| 1457 void WebGLRenderingContextBase::restoreStateAfterClear() { | |
| 1458 // Restore clear-related state items back to what the context had set. | |
| 1459 restoreScissorEnabled(); | |
| 1460 restoreClearColor(); | |
| 1461 restoreColorMask(); | |
| 1462 restoreClearDepthf(); | |
| 1463 restoreClearStencil(); | |
| 1464 restoreStencilMaskSeparate(); | |
| 1465 restoreDepthMask(); | |
| 1466 } | |
| 1467 | |
| 1468 void WebGLRenderingContextBase::markLayerComposited() { | 1433 void WebGLRenderingContextBase::markLayerComposited() { |
| 1469 if (!isContextLost()) | 1434 if (!isContextLost()) |
| 1470 drawingBuffer()->setBufferClearNeeded(true); | 1435 drawingBuffer()->setBufferClearNeeded(true); |
| 1471 } | 1436 } |
| 1472 | 1437 |
| 1473 void WebGLRenderingContextBase::setIsHidden(bool hidden) { | 1438 void WebGLRenderingContextBase::setIsHidden(bool hidden) { |
| 1474 m_isHidden = hidden; | 1439 m_isHidden = hidden; |
| 1475 if (drawingBuffer()) | 1440 if (drawingBuffer()) |
| 1476 drawingBuffer()->setIsHidden(hidden); | 1441 drawingBuffer()->setIsHidden(hidden); |
| 1477 | 1442 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1493 | 1458 |
| 1494 canvas()->clearCopiedImage(); | 1459 canvas()->clearCopiedImage(); |
| 1495 m_markedCanvasDirty = false; | 1460 m_markedCanvasDirty = false; |
| 1496 | 1461 |
| 1497 if (!canvas()->buffer()) | 1462 if (!canvas()->buffer()) |
| 1498 return false; | 1463 return false; |
| 1499 | 1464 |
| 1500 ScopedTexture2DRestorer restorer(this); | 1465 ScopedTexture2DRestorer restorer(this); |
| 1501 ScopedFramebufferRestorer fboRestorer(this); | 1466 ScopedFramebufferRestorer fboRestorer(this); |
| 1502 | 1467 |
| 1503 drawingBuffer()->commit(); | 1468 drawingBuffer()->resolveAndBindForReadAndDraw(); |
| 1504 if (!canvas()->buffer()->copyRenderingResultsFromDrawingBuffer( | 1469 if (!canvas()->buffer()->copyRenderingResultsFromDrawingBuffer( |
| 1505 drawingBuffer(), sourceBuffer)) { | 1470 drawingBuffer(), sourceBuffer)) { |
| 1506 // Currently, copyRenderingResultsFromDrawingBuffer is expected to always | 1471 // Currently, copyRenderingResultsFromDrawingBuffer is expected to always |
| 1507 // succeed because cases where canvas()-buffer() is not accelerated are | 1472 // succeed because cases where canvas()-buffer() is not accelerated are |
| 1508 // handle before reaching this point. If that assumption ever stops holding | 1473 // handle before reaching this point. If that assumption ever stops holding |
| 1509 // true, we may need to implement a fallback right here. | 1474 // true, we may need to implement a fallback right here. |
| 1510 ASSERT_NOT_REACHED(); | 1475 ASSERT_NOT_REACHED(); |
| 1511 return false; | 1476 return false; |
| 1512 } | 1477 } |
| 1513 | 1478 |
| 1514 return true; | 1479 return true; |
| 1515 } | 1480 } |
| 1516 | 1481 |
| 1517 ImageData* WebGLRenderingContextBase::paintRenderingResultsToImageData( | 1482 ImageData* WebGLRenderingContextBase::paintRenderingResultsToImageData( |
| 1518 SourceDrawingBuffer sourceBuffer) { | 1483 SourceDrawingBuffer sourceBuffer) { |
| 1519 if (isContextLost()) | 1484 if (isContextLost()) |
| 1520 return nullptr; | 1485 return nullptr; |
| 1521 if (creationAttributes().premultipliedAlpha()) | 1486 if (creationAttributes().premultipliedAlpha()) |
| 1522 return nullptr; | 1487 return nullptr; |
| 1523 | 1488 |
| 1524 clearIfComposited(); | 1489 clearIfComposited(); |
| 1525 drawingBuffer()->commit(); | 1490 drawingBuffer()->resolveAndBindForReadAndDraw(); |
| 1526 ScopedFramebufferRestorer restorer(this); | 1491 ScopedFramebufferRestorer restorer(this); |
| 1527 int width, height; | 1492 int width, height; |
| 1528 WTF::ArrayBufferContents contents; | 1493 WTF::ArrayBufferContents contents; |
| 1529 if (!drawingBuffer()->paintRenderingResultsToImageData( | 1494 if (!drawingBuffer()->paintRenderingResultsToImageData( |
| 1530 width, height, sourceBuffer, contents)) | 1495 width, height, sourceBuffer, contents)) |
| 1531 return nullptr; | 1496 return nullptr; |
| 1532 DOMArrayBuffer* imageDataPixels = DOMArrayBuffer::create(contents); | 1497 DOMArrayBuffer* imageDataPixels = DOMArrayBuffer::create(contents); |
| 1533 | 1498 |
| 1534 return ImageData::create( | 1499 return ImageData::create( |
| 1535 IntSize(width, height), | 1500 IntSize(width, height), |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1563 // If we've exceeded the area limit scale the buffer down, preserving | 1528 // If we've exceeded the area limit scale the buffer down, preserving |
| 1564 // ascpect ratio, until it fits. | 1529 // ascpect ratio, until it fits. |
| 1565 float scaleFactor = | 1530 float scaleFactor = |
| 1566 sqrtf(static_cast<float>(maxArea) / static_cast<float>(currentArea)); | 1531 sqrtf(static_cast<float>(maxArea) / static_cast<float>(currentArea)); |
| 1567 width = std::max(1, static_cast<int>(width * scaleFactor)); | 1532 width = std::max(1, static_cast<int>(width * scaleFactor)); |
| 1568 height = std::max(1, static_cast<int>(height * scaleFactor)); | 1533 height = std::max(1, static_cast<int>(height * scaleFactor)); |
| 1569 } | 1534 } |
| 1570 | 1535 |
| 1571 // We don't have to mark the canvas as dirty, since the newly created image | 1536 // We don't have to mark the canvas as dirty, since the newly created image |
| 1572 // buffer will also start off clear (and this matches what reshape will do). | 1537 // buffer will also start off clear (and this matches what reshape will do). |
| 1573 drawingBuffer()->reset(IntSize(width, height)); | 1538 drawingBuffer()->resize(IntSize(width, height)); |
| 1574 restoreStateAfterClear(); | |
| 1575 | |
| 1576 contextGL()->BindTexture( | |
| 1577 GL_TEXTURE_2D, | |
| 1578 objectOrZero( | |
| 1579 m_textureUnits[m_activeTextureUnit].m_texture2DBinding.get())); | |
| 1580 contextGL()->BindRenderbuffer(GL_RENDERBUFFER, | |
| 1581 objectOrZero(m_renderbufferBinding.get())); | |
| 1582 drawingBuffer()->restoreFramebufferBindings(); | |
| 1583 drawingBuffer()->restorePixelUnpackBufferBindings(); | |
| 1584 } | 1539 } |
| 1585 | 1540 |
| 1586 int WebGLRenderingContextBase::drawingBufferWidth() const { | 1541 int WebGLRenderingContextBase::drawingBufferWidth() const { |
| 1587 return isContextLost() ? 0 : drawingBuffer()->size().width(); | 1542 return isContextLost() ? 0 : drawingBuffer()->size().width(); |
| 1588 } | 1543 } |
| 1589 | 1544 |
| 1590 int WebGLRenderingContextBase::drawingBufferHeight() const { | 1545 int WebGLRenderingContextBase::drawingBufferHeight() const { |
| 1591 return isContextLost() ? 0 : drawingBuffer()->size().height(); | 1546 return isContextLost() ? 0 : drawingBuffer()->size().height(); |
| 1592 } | 1547 } |
| 1593 | 1548 |
| 1594 void WebGLRenderingContextBase::activeTexture(GLenum texture) { | 1549 void WebGLRenderingContextBase::activeTexture(GLenum texture) { |
| 1595 if (isContextLost()) | 1550 if (isContextLost()) |
| 1596 return; | 1551 return; |
| 1597 if (texture - GL_TEXTURE0 >= m_textureUnits.size()) { | 1552 if (texture - GL_TEXTURE0 >= m_textureUnits.size()) { |
| 1598 synthesizeGLError(GL_INVALID_ENUM, "activeTexture", | 1553 synthesizeGLError(GL_INVALID_ENUM, "activeTexture", |
| 1599 "texture unit out of range"); | 1554 "texture unit out of range"); |
| 1600 return; | 1555 return; |
| 1601 } | 1556 } |
| 1602 m_activeTextureUnit = texture - GL_TEXTURE0; | 1557 m_activeTextureUnit = texture - GL_TEXTURE0; |
| 1603 contextGL()->ActiveTexture(texture); | 1558 contextGL()->ActiveTexture(texture); |
| 1604 | |
| 1605 drawingBuffer()->setActiveTextureUnit(texture); | |
| 1606 } | 1559 } |
| 1607 | 1560 |
| 1608 void WebGLRenderingContextBase::attachShader(WebGLProgram* program, | 1561 void WebGLRenderingContextBase::attachShader(WebGLProgram* program, |
| 1609 WebGLShader* shader) { | 1562 WebGLShader* shader) { |
| 1610 if (isContextLost() || !validateWebGLObject("attachShader", program) || | 1563 if (isContextLost() || !validateWebGLObject("attachShader", program) || |
| 1611 !validateWebGLObject("attachShader", shader)) | 1564 !validateWebGLObject("attachShader", shader)) |
| 1612 return; | 1565 return; |
| 1613 if (!program->attachShader(shader)) { | 1566 if (!program->attachShader(shader)) { |
| 1614 synthesizeGLError(GL_INVALID_OPERATION, "attachShader", | 1567 synthesizeGLError(GL_INVALID_OPERATION, "attachShader", |
| 1615 "shader attachment already has shader"); | 1568 "shader attachment already has shader"); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1687 bool deleted; | 1640 bool deleted; |
| 1688 if (!checkObjectToBeBound("bindBuffer", buffer, deleted)) | 1641 if (!checkObjectToBeBound("bindBuffer", buffer, deleted)) |
| 1689 return; | 1642 return; |
| 1690 if (deleted) { | 1643 if (deleted) { |
| 1691 synthesizeGLError(GL_INVALID_OPERATION, "bindBuffer", | 1644 synthesizeGLError(GL_INVALID_OPERATION, "bindBuffer", |
| 1692 "attempt to bind a deleted buffer"); | 1645 "attempt to bind a deleted buffer"); |
| 1693 return; | 1646 return; |
| 1694 } | 1647 } |
| 1695 if (!validateAndUpdateBufferBindTarget("bindBuffer", target, buffer)) | 1648 if (!validateAndUpdateBufferBindTarget("bindBuffer", target, buffer)) |
| 1696 return; | 1649 return; |
| 1697 | |
| 1698 if (target == GL_PIXEL_UNPACK_BUFFER) { | |
| 1699 drawingBuffer()->setPixelUnpackBufferBinding(objectOrZero(buffer)); | |
| 1700 } | |
| 1701 contextGL()->BindBuffer(target, objectOrZero(buffer)); | 1650 contextGL()->BindBuffer(target, objectOrZero(buffer)); |
| 1702 } | 1651 } |
| 1703 | 1652 |
| 1704 void WebGLRenderingContextBase::bindFramebuffer(GLenum target, | 1653 void WebGLRenderingContextBase::bindFramebuffer(GLenum target, |
| 1705 WebGLFramebuffer* buffer) { | 1654 WebGLFramebuffer* buffer) { |
| 1706 bool deleted; | 1655 bool deleted; |
| 1707 if (!checkObjectToBeBound("bindFramebuffer", buffer, deleted)) | 1656 if (!checkObjectToBeBound("bindFramebuffer", buffer, deleted)) |
| 1708 return; | 1657 return; |
| 1709 if (deleted) { | 1658 if (deleted) { |
| 1710 synthesizeGLError(GL_INVALID_OPERATION, "bindFramebuffer", | 1659 synthesizeGLError(GL_INVALID_OPERATION, "bindFramebuffer", |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1730 synthesizeGLError(GL_INVALID_OPERATION, "bindRenderbuffer", | 1679 synthesizeGLError(GL_INVALID_OPERATION, "bindRenderbuffer", |
| 1731 "attempt to bind a deleted renderbuffer"); | 1680 "attempt to bind a deleted renderbuffer"); |
| 1732 return; | 1681 return; |
| 1733 } | 1682 } |
| 1734 if (target != GL_RENDERBUFFER) { | 1683 if (target != GL_RENDERBUFFER) { |
| 1735 synthesizeGLError(GL_INVALID_ENUM, "bindRenderbuffer", "invalid target"); | 1684 synthesizeGLError(GL_INVALID_ENUM, "bindRenderbuffer", "invalid target"); |
| 1736 return; | 1685 return; |
| 1737 } | 1686 } |
| 1738 m_renderbufferBinding = renderBuffer; | 1687 m_renderbufferBinding = renderBuffer; |
| 1739 contextGL()->BindRenderbuffer(target, objectOrZero(renderBuffer)); | 1688 contextGL()->BindRenderbuffer(target, objectOrZero(renderBuffer)); |
| 1740 | |
| 1741 drawingBuffer()->setRenderbufferBinding(objectOrZero(renderBuffer)); | |
| 1742 | |
| 1743 if (renderBuffer) | 1689 if (renderBuffer) |
| 1744 renderBuffer->setHasEverBeenBound(); | 1690 renderBuffer->setHasEverBeenBound(); |
| 1745 } | 1691 } |
| 1746 | 1692 |
| 1747 void WebGLRenderingContextBase::bindTexture(GLenum target, | 1693 void WebGLRenderingContextBase::bindTexture(GLenum target, |
| 1748 WebGLTexture* texture) { | 1694 WebGLTexture* texture) { |
| 1749 bool deleted; | 1695 bool deleted; |
| 1750 if (!checkObjectToBeBound("bindTexture", texture, deleted)) | 1696 if (!checkObjectToBeBound("bindTexture", texture, deleted)) |
| 1751 return; | 1697 return; |
| 1752 if (deleted) { | 1698 if (deleted) { |
| 1753 synthesizeGLError(GL_INVALID_OPERATION, "bindTexture", | 1699 synthesizeGLError(GL_INVALID_OPERATION, "bindTexture", |
| 1754 "attempt to bind a deleted texture"); | 1700 "attempt to bind a deleted texture"); |
| 1755 return; | 1701 return; |
| 1756 } | 1702 } |
| 1757 if (texture && texture->getTarget() && texture->getTarget() != target) { | 1703 if (texture && texture->getTarget() && texture->getTarget() != target) { |
| 1758 synthesizeGLError(GL_INVALID_OPERATION, "bindTexture", | 1704 synthesizeGLError(GL_INVALID_OPERATION, "bindTexture", |
| 1759 "textures can not be used with multiple targets"); | 1705 "textures can not be used with multiple targets"); |
| 1760 return; | 1706 return; |
| 1761 } | 1707 } |
| 1762 | 1708 |
| 1763 if (target == GL_TEXTURE_2D) { | 1709 if (target == GL_TEXTURE_2D) { |
| 1764 m_textureUnits[m_activeTextureUnit].m_texture2DBinding = | 1710 m_textureUnits[m_activeTextureUnit].m_texture2DBinding = |
| 1765 TraceWrapperMember<WebGLTexture>(this, texture); | 1711 TraceWrapperMember<WebGLTexture>(this, texture); |
| 1766 | |
| 1767 if (!m_activeTextureUnit) | |
| 1768 drawingBuffer()->setTexture2DBinding(objectOrZero(texture)); | |
| 1769 } else if (target == GL_TEXTURE_CUBE_MAP) { | 1712 } else if (target == GL_TEXTURE_CUBE_MAP) { |
| 1770 m_textureUnits[m_activeTextureUnit].m_textureCubeMapBinding = | 1713 m_textureUnits[m_activeTextureUnit].m_textureCubeMapBinding = |
| 1771 TraceWrapperMember<WebGLTexture>(this, texture); | 1714 TraceWrapperMember<WebGLTexture>(this, texture); |
| 1772 } else if (isWebGL2OrHigher() && target == GL_TEXTURE_2D_ARRAY) { | 1715 } else if (isWebGL2OrHigher() && target == GL_TEXTURE_2D_ARRAY) { |
| 1773 m_textureUnits[m_activeTextureUnit].m_texture2DArrayBinding = | 1716 m_textureUnits[m_activeTextureUnit].m_texture2DArrayBinding = |
| 1774 TraceWrapperMember<WebGLTexture>(this, texture); | 1717 TraceWrapperMember<WebGLTexture>(this, texture); |
| 1775 } else if (isWebGL2OrHigher() && target == GL_TEXTURE_3D) { | 1718 } else if (isWebGL2OrHigher() && target == GL_TEXTURE_3D) { |
| 1776 m_textureUnits[m_activeTextureUnit].m_texture3DBinding = | 1719 m_textureUnits[m_activeTextureUnit].m_texture3DBinding = |
| 1777 TraceWrapperMember<WebGLTexture>(this, texture); | 1720 TraceWrapperMember<WebGLTexture>(this, texture); |
| 1778 } else { | 1721 } else { |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2023 if (std::isnan(g)) | 1966 if (std::isnan(g)) |
| 2024 g = 0; | 1967 g = 0; |
| 2025 if (std::isnan(b)) | 1968 if (std::isnan(b)) |
| 2026 b = 0; | 1969 b = 0; |
| 2027 if (std::isnan(a)) | 1970 if (std::isnan(a)) |
| 2028 a = 1; | 1971 a = 1; |
| 2029 m_clearColor[0] = r; | 1972 m_clearColor[0] = r; |
| 2030 m_clearColor[1] = g; | 1973 m_clearColor[1] = g; |
| 2031 m_clearColor[2] = b; | 1974 m_clearColor[2] = b; |
| 2032 m_clearColor[3] = a; | 1975 m_clearColor[3] = a; |
| 2033 drawingBuffer()->setClearColor(m_clearColor); | |
| 2034 contextGL()->ClearColor(r, g, b, a); | 1976 contextGL()->ClearColor(r, g, b, a); |
| 2035 } | 1977 } |
| 2036 | 1978 |
| 2037 void WebGLRenderingContextBase::clearDepth(GLfloat depth) { | 1979 void WebGLRenderingContextBase::clearDepth(GLfloat depth) { |
| 2038 if (isContextLost()) | 1980 if (isContextLost()) |
| 2039 return; | 1981 return; |
| 2040 m_clearDepth = depth; | 1982 m_clearDepth = depth; |
| 2041 contextGL()->ClearDepthf(depth); | 1983 contextGL()->ClearDepthf(depth); |
| 2042 } | 1984 } |
| 2043 | 1985 |
| 2044 void WebGLRenderingContextBase::clearStencil(GLint s) { | 1986 void WebGLRenderingContextBase::clearStencil(GLint s) { |
| 2045 if (isContextLost()) | 1987 if (isContextLost()) |
| 2046 return; | 1988 return; |
| 2047 m_clearStencil = s; | 1989 m_clearStencil = s; |
| 2048 contextGL()->ClearStencil(s); | 1990 contextGL()->ClearStencil(s); |
| 2049 } | 1991 } |
| 2050 | 1992 |
| 2051 void WebGLRenderingContextBase::colorMask(GLboolean red, | 1993 void WebGLRenderingContextBase::colorMask(GLboolean red, |
| 2052 GLboolean green, | 1994 GLboolean green, |
| 2053 GLboolean blue, | 1995 GLboolean blue, |
| 2054 GLboolean alpha) { | 1996 GLboolean alpha) { |
| 2055 if (isContextLost()) | 1997 if (isContextLost()) |
| 2056 return; | 1998 return; |
| 2057 m_colorMask[0] = red; | 1999 m_colorMask[0] = red; |
| 2058 m_colorMask[1] = green; | 2000 m_colorMask[1] = green; |
| 2059 m_colorMask[2] = blue; | 2001 m_colorMask[2] = blue; |
| 2060 m_colorMask[3] = alpha; | 2002 m_colorMask[3] = alpha; |
| 2061 drawingBuffer()->setColorMask(m_colorMask); | |
| 2062 contextGL()->ColorMask(red, green, blue, alpha); | 2003 contextGL()->ColorMask(red, green, blue, alpha); |
| 2063 } | 2004 } |
| 2064 | 2005 |
| 2065 void WebGLRenderingContextBase::compileShader(WebGLShader* shader) { | 2006 void WebGLRenderingContextBase::compileShader(WebGLShader* shader) { |
| 2066 if (isContextLost() || !validateWebGLObject("compileShader", shader)) | 2007 if (isContextLost() || !validateWebGLObject("compileShader", shader)) |
| 2067 return; | 2008 return; |
| 2068 contextGL()->CompileShader(objectOrZero(shader)); | 2009 contextGL()->CompileShader(objectOrZero(shader)); |
| 2069 } | 2010 } |
| 2070 | 2011 |
| 2071 void WebGLRenderingContextBase::compressedTexImage2D(GLenum target, | 2012 void WebGLRenderingContextBase::compressedTexImage2D(GLenum target, |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2262 } | 2203 } |
| 2263 if (object->hasObject()) { | 2204 if (object->hasObject()) { |
| 2264 // We need to pass in context here because we want | 2205 // We need to pass in context here because we want |
| 2265 // things in this context unbound. | 2206 // things in this context unbound. |
| 2266 object->deleteObject(contextGL()); | 2207 object->deleteObject(contextGL()); |
| 2267 } | 2208 } |
| 2268 return true; | 2209 return true; |
| 2269 } | 2210 } |
| 2270 | 2211 |
| 2271 void WebGLRenderingContextBase::deleteBuffer(WebGLBuffer* buffer) { | 2212 void WebGLRenderingContextBase::deleteBuffer(WebGLBuffer* buffer) { |
| 2272 GLuint bufferName = objectOrZero(buffer); | |
| 2273 if (!deleteObject(buffer)) | 2213 if (!deleteObject(buffer)) |
| 2274 return; | 2214 return; |
| 2275 drawingBuffer()->notifyBufferDeleted(bufferName); | |
| 2276 removeBoundBuffer(buffer); | 2215 removeBoundBuffer(buffer); |
| 2277 } | 2216 } |
| 2278 | 2217 |
| 2279 void WebGLRenderingContextBase::deleteFramebuffer( | 2218 void WebGLRenderingContextBase::deleteFramebuffer( |
| 2280 WebGLFramebuffer* framebuffer) { | 2219 WebGLFramebuffer* framebuffer) { |
| 2281 if (!deleteObject(framebuffer)) | 2220 if (!deleteObject(framebuffer)) |
| 2282 return; | 2221 return; |
| 2283 if (framebuffer == m_framebufferBinding) { | 2222 if (framebuffer == m_framebufferBinding) { |
| 2284 m_framebufferBinding = nullptr; | 2223 m_framebufferBinding = nullptr; |
| 2285 drawingBuffer()->setFramebufferBinding(GL_FRAMEBUFFER, 0); | |
| 2286 // Have to call drawingBuffer()->bind() here to bind back to internal fbo. | 2224 // Have to call drawingBuffer()->bind() here to bind back to internal fbo. |
| 2287 drawingBuffer()->bind(GL_FRAMEBUFFER); | 2225 drawingBuffer()->bind(GL_FRAMEBUFFER); |
| 2288 } | 2226 } |
| 2289 } | 2227 } |
| 2290 | 2228 |
| 2291 void WebGLRenderingContextBase::deleteProgram(WebGLProgram* program) { | 2229 void WebGLRenderingContextBase::deleteProgram(WebGLProgram* program) { |
| 2292 deleteObject(program); | 2230 deleteObject(program); |
| 2293 // We don't reset m_currentProgram to 0 here because the deletion of the | 2231 // We don't reset m_currentProgram to 0 here because the deletion of the |
| 2294 // current program is delayed. | 2232 // current program is delayed. |
| 2295 } | 2233 } |
| 2296 | 2234 |
| 2297 void WebGLRenderingContextBase::deleteRenderbuffer( | 2235 void WebGLRenderingContextBase::deleteRenderbuffer( |
| 2298 WebGLRenderbuffer* renderbuffer) { | 2236 WebGLRenderbuffer* renderbuffer) { |
| 2299 if (!deleteObject(renderbuffer)) | 2237 if (!deleteObject(renderbuffer)) |
| 2300 return; | 2238 return; |
| 2301 if (renderbuffer == m_renderbufferBinding) { | 2239 if (renderbuffer == m_renderbufferBinding) { |
| 2302 m_renderbufferBinding = nullptr; | 2240 m_renderbufferBinding = nullptr; |
| 2303 drawingBuffer()->setRenderbufferBinding(0); | |
| 2304 } | 2241 } |
| 2305 if (m_framebufferBinding) | 2242 if (m_framebufferBinding) |
| 2306 m_framebufferBinding->removeAttachmentFromBoundFramebuffer(GL_FRAMEBUFFER, | 2243 m_framebufferBinding->removeAttachmentFromBoundFramebuffer(GL_FRAMEBUFFER, |
| 2307 renderbuffer); | 2244 renderbuffer); |
| 2308 if (getFramebufferBinding(GL_READ_FRAMEBUFFER)) | 2245 if (getFramebufferBinding(GL_READ_FRAMEBUFFER)) |
| 2309 getFramebufferBinding(GL_READ_FRAMEBUFFER) | 2246 getFramebufferBinding(GL_READ_FRAMEBUFFER) |
| 2310 ->removeAttachmentFromBoundFramebuffer(GL_READ_FRAMEBUFFER, | 2247 ->removeAttachmentFromBoundFramebuffer(GL_READ_FRAMEBUFFER, |
| 2311 renderbuffer); | 2248 renderbuffer); |
| 2312 } | 2249 } |
| 2313 | 2250 |
| 2314 void WebGLRenderingContextBase::deleteShader(WebGLShader* shader) { | 2251 void WebGLRenderingContextBase::deleteShader(WebGLShader* shader) { |
| 2315 deleteObject(shader); | 2252 deleteObject(shader); |
| 2316 } | 2253 } |
| 2317 | 2254 |
| 2318 void WebGLRenderingContextBase::deleteTexture(WebGLTexture* texture) { | 2255 void WebGLRenderingContextBase::deleteTexture(WebGLTexture* texture) { |
| 2319 if (!deleteObject(texture)) | 2256 if (!deleteObject(texture)) |
| 2320 return; | 2257 return; |
| 2321 | 2258 |
| 2322 int maxBoundTextureIndex = -1; | 2259 int maxBoundTextureIndex = -1; |
| 2323 for (size_t i = 0; i < m_onePlusMaxNonDefaultTextureUnit; ++i) { | 2260 for (size_t i = 0; i < m_onePlusMaxNonDefaultTextureUnit; ++i) { |
| 2324 if (texture == m_textureUnits[i].m_texture2DBinding) { | 2261 if (texture == m_textureUnits[i].m_texture2DBinding) { |
| 2325 m_textureUnits[i].m_texture2DBinding = nullptr; | 2262 m_textureUnits[i].m_texture2DBinding = nullptr; |
| 2326 maxBoundTextureIndex = i; | 2263 maxBoundTextureIndex = i; |
| 2327 if (!i) | |
| 2328 drawingBuffer()->setTexture2DBinding(0); | |
| 2329 } | 2264 } |
| 2330 if (texture == m_textureUnits[i].m_textureCubeMapBinding) { | 2265 if (texture == m_textureUnits[i].m_textureCubeMapBinding) { |
| 2331 m_textureUnits[i].m_textureCubeMapBinding = nullptr; | 2266 m_textureUnits[i].m_textureCubeMapBinding = nullptr; |
| 2332 maxBoundTextureIndex = i; | 2267 maxBoundTextureIndex = i; |
| 2333 } | 2268 } |
| 2334 if (isWebGL2OrHigher()) { | 2269 if (isWebGL2OrHigher()) { |
| 2335 if (texture == m_textureUnits[i].m_texture3DBinding) { | 2270 if (texture == m_textureUnits[i].m_texture3DBinding) { |
| 2336 m_textureUnits[i].m_texture3DBinding = nullptr; | 2271 m_textureUnits[i].m_texture3DBinding = nullptr; |
| 2337 maxBoundTextureIndex = i; | 2272 maxBoundTextureIndex = i; |
| 2338 } | 2273 } |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2396 } | 2331 } |
| 2397 | 2332 |
| 2398 void WebGLRenderingContextBase::disable(GLenum cap) { | 2333 void WebGLRenderingContextBase::disable(GLenum cap) { |
| 2399 if (isContextLost() || !validateCapability("disable", cap)) | 2334 if (isContextLost() || !validateCapability("disable", cap)) |
| 2400 return; | 2335 return; |
| 2401 if (cap == GL_STENCIL_TEST) { | 2336 if (cap == GL_STENCIL_TEST) { |
| 2402 m_stencilEnabled = false; | 2337 m_stencilEnabled = false; |
| 2403 applyStencilTest(); | 2338 applyStencilTest(); |
| 2404 return; | 2339 return; |
| 2405 } | 2340 } |
| 2406 if (cap == GL_SCISSOR_TEST) { | 2341 if (cap == GL_SCISSOR_TEST) |
| 2407 m_scissorEnabled = false; | 2342 m_scissorEnabled = false; |
| 2408 drawingBuffer()->setScissorEnabled(m_scissorEnabled); | |
| 2409 } | |
| 2410 contextGL()->Disable(cap); | 2343 contextGL()->Disable(cap); |
| 2411 } | 2344 } |
| 2412 | 2345 |
| 2413 void WebGLRenderingContextBase::disableVertexAttribArray(GLuint index) { | 2346 void WebGLRenderingContextBase::disableVertexAttribArray(GLuint index) { |
| 2414 if (isContextLost()) | 2347 if (isContextLost()) |
| 2415 return; | 2348 return; |
| 2416 if (index >= m_maxVertexAttribs) { | 2349 if (index >= m_maxVertexAttribs) { |
| 2417 synthesizeGLError(GL_INVALID_VALUE, "disableVertexAttribArray", | 2350 synthesizeGLError(GL_INVALID_VALUE, "disableVertexAttribArray", |
| 2418 "index out of range"); | 2351 "index out of range"); |
| 2419 return; | 2352 return; |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2535 } | 2468 } |
| 2536 | 2469 |
| 2537 void WebGLRenderingContextBase::enable(GLenum cap) { | 2470 void WebGLRenderingContextBase::enable(GLenum cap) { |
| 2538 if (isContextLost() || !validateCapability("enable", cap)) | 2471 if (isContextLost() || !validateCapability("enable", cap)) |
| 2539 return; | 2472 return; |
| 2540 if (cap == GL_STENCIL_TEST) { | 2473 if (cap == GL_STENCIL_TEST) { |
| 2541 m_stencilEnabled = true; | 2474 m_stencilEnabled = true; |
| 2542 applyStencilTest(); | 2475 applyStencilTest(); |
| 2543 return; | 2476 return; |
| 2544 } | 2477 } |
| 2545 if (cap == GL_SCISSOR_TEST) { | 2478 if (cap == GL_SCISSOR_TEST) |
| 2546 m_scissorEnabled = true; | 2479 m_scissorEnabled = true; |
| 2547 drawingBuffer()->setScissorEnabled(m_scissorEnabled); | |
| 2548 } | |
| 2549 contextGL()->Enable(cap); | 2480 contextGL()->Enable(cap); |
| 2550 } | 2481 } |
| 2551 | 2482 |
| 2552 void WebGLRenderingContextBase::enableVertexAttribArray(GLuint index) { | 2483 void WebGLRenderingContextBase::enableVertexAttribArray(GLuint index) { |
| 2553 if (isContextLost()) | 2484 if (isContextLost()) |
| 2554 return; | 2485 return; |
| 2555 if (index >= m_maxVertexAttribs) { | 2486 if (index >= m_maxVertexAttribs) { |
| 2556 synthesizeGLError(GL_INVALID_VALUE, "enableVertexAttribArray", | 2487 synthesizeGLError(GL_INVALID_VALUE, "enableVertexAttribArray", |
| 2557 "index out of range"); | 2488 "index out of range"); |
| 2558 return; | 2489 return; |
| (...skipping 1380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3939 GL_INVALID_VALUE, "pixelStorei", | 3870 GL_INVALID_VALUE, "pixelStorei", |
| 3940 "invalid parameter for UNPACK_COLORSPACE_CONVERSION_WEBGL"); | 3871 "invalid parameter for UNPACK_COLORSPACE_CONVERSION_WEBGL"); |
| 3941 return; | 3872 return; |
| 3942 } | 3873 } |
| 3943 break; | 3874 break; |
| 3944 case GL_PACK_ALIGNMENT: | 3875 case GL_PACK_ALIGNMENT: |
| 3945 case GL_UNPACK_ALIGNMENT: | 3876 case GL_UNPACK_ALIGNMENT: |
| 3946 if (param == 1 || param == 2 || param == 4 || param == 8) { | 3877 if (param == 1 || param == 2 || param == 4 || param == 8) { |
| 3947 if (pname == GL_PACK_ALIGNMENT) { | 3878 if (pname == GL_PACK_ALIGNMENT) { |
| 3948 m_packAlignment = param; | 3879 m_packAlignment = param; |
| 3949 drawingBuffer()->setPackAlignment(param); | |
| 3950 } else { // GL_UNPACK_ALIGNMENT: | 3880 } else { // GL_UNPACK_ALIGNMENT: |
| 3951 m_unpackAlignment = param; | 3881 m_unpackAlignment = param; |
| 3952 } | 3882 } |
| 3953 contextGL()->PixelStorei(pname, param); | 3883 contextGL()->PixelStorei(pname, param); |
| 3954 } else { | 3884 } else { |
| 3955 synthesizeGLError(GL_INVALID_VALUE, "pixelStorei", | 3885 synthesizeGLError(GL_INVALID_VALUE, "pixelStorei", |
| 3956 "invalid parameter for alignment"); | 3886 "invalid parameter for alignment"); |
| 3957 return; | 3887 return; |
| 3958 } | 3888 } |
| 3959 break; | 3889 break; |
| (...skipping 1998 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5958 void WebGLRenderingContextBase::loseContextImpl( | 5888 void WebGLRenderingContextBase::loseContextImpl( |
| 5959 WebGLRenderingContextBase::LostContextMode mode, | 5889 WebGLRenderingContextBase::LostContextMode mode, |
| 5960 AutoRecoveryMethod autoRecoveryMethod) { | 5890 AutoRecoveryMethod autoRecoveryMethod) { |
| 5961 if (isContextLost()) | 5891 if (isContextLost()) |
| 5962 return; | 5892 return; |
| 5963 | 5893 |
| 5964 m_contextLostMode = mode; | 5894 m_contextLostMode = mode; |
| 5965 ASSERT(m_contextLostMode != NotLostContext); | 5895 ASSERT(m_contextLostMode != NotLostContext); |
| 5966 m_autoRecoveryMethod = autoRecoveryMethod; | 5896 m_autoRecoveryMethod = autoRecoveryMethod; |
| 5967 | 5897 |
| 5968 // Make absolutely sure we do not refer to an already-deleted texture or | |
| 5969 // framebuffer. | |
| 5970 drawingBuffer()->setTexture2DBinding(0); | |
| 5971 drawingBuffer()->setFramebufferBinding(GL_FRAMEBUFFER, 0); | |
| 5972 drawingBuffer()->setRenderbufferBinding(0); | |
| 5973 | |
| 5974 detachAndRemoveAllObjects(); | 5898 detachAndRemoveAllObjects(); |
| 5975 | 5899 |
| 5976 // Lose all the extensions. | 5900 // Lose all the extensions. |
| 5977 for (size_t i = 0; i < m_extensions.size(); ++i) { | 5901 for (size_t i = 0; i < m_extensions.size(); ++i) { |
| 5978 ExtensionTracker* tracker = m_extensions[i]; | 5902 ExtensionTracker* tracker = m_extensions[i]; |
| 5979 tracker->loseExtension(false); | 5903 tracker->loseExtension(false); |
| 5980 } | 5904 } |
| 5981 | 5905 |
| 5982 for (size_t i = 0; i < WebGLExtensionNameCount; ++i) | 5906 for (size_t i = 0; i < WebGLExtensionNameCount; ++i) |
| 5983 m_extensionEnabled[i] = false; | 5907 m_extensionEnabled[i] = false; |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6120 } | 6044 } |
| 6121 } | 6045 } |
| 6122 | 6046 |
| 6123 void WebGLRenderingContextBase::stop() { | 6047 void WebGLRenderingContextBase::stop() { |
| 6124 if (!isContextLost()) { | 6048 if (!isContextLost()) { |
| 6125 // Never attempt to restore the context because the page is being torn down. | 6049 // Never attempt to restore the context because the page is being torn down. |
| 6126 forceLostContext(SyntheticLostContext, Manual); | 6050 forceLostContext(SyntheticLostContext, Manual); |
| 6127 } | 6051 } |
| 6128 } | 6052 } |
| 6129 | 6053 |
| 6054 bool WebGLRenderingContextBase::DrawingBufferClientIsBoundForDraw() { |
| 6055 return !m_framebufferBinding; |
| 6056 } |
| 6057 |
| 6058 void WebGLRenderingContextBase::DrawingBufferClientRestoreScissorTest() { |
| 6059 if (!contextGL()) |
| 6060 return; |
| 6061 if (m_scissorEnabled) |
| 6062 contextGL()->Enable(GL_SCISSOR_TEST); |
| 6063 else |
| 6064 contextGL()->Disable(GL_SCISSOR_TEST); |
| 6065 } |
| 6066 |
| 6067 void WebGLRenderingContextBase::DrawingBufferClientRestoreMaskAndClearValues() { |
| 6068 if (!contextGL()) |
| 6069 return; |
| 6070 contextGL()->ColorMask(m_colorMask[0], m_colorMask[1], m_colorMask[2], |
| 6071 m_colorMask[3]); |
| 6072 contextGL()->DepthMask(m_depthMask); |
| 6073 contextGL()->StencilMaskSeparate(GL_FRONT, m_stencilMask); |
| 6074 |
| 6075 contextGL()->ClearColor(m_clearColor[0], m_clearColor[1], m_clearColor[2], |
| 6076 m_clearColor[3]); |
| 6077 contextGL()->ClearDepthf(m_clearDepth); |
| 6078 contextGL()->ClearStencil(m_clearStencil); |
| 6079 } |
| 6080 |
| 6081 void WebGLRenderingContextBase::DrawingBufferClientRestorePixelPackAlignment() { |
| 6082 if (!contextGL()) |
| 6083 return; |
| 6084 contextGL()->PixelStorei(GL_PACK_ALIGNMENT, m_packAlignment); |
| 6085 } |
| 6086 |
| 6087 void WebGLRenderingContextBase::DrawingBufferClientRestoreTexture2DBinding() { |
| 6088 if (!contextGL()) |
| 6089 return; |
| 6090 restoreCurrentTexture2D(); |
| 6091 } |
| 6092 |
| 6093 void WebGLRenderingContextBase:: |
| 6094 DrawingBufferClientRestoreRenderbufferBinding() { |
| 6095 if (!contextGL()) |
| 6096 return; |
| 6097 contextGL()->BindRenderbuffer(GL_RENDERBUFFER, |
| 6098 objectOrZero(m_renderbufferBinding.get())); |
| 6099 } |
| 6100 |
| 6101 void WebGLRenderingContextBase::DrawingBufferClientRestoreFramebufferBinding() { |
| 6102 if (!contextGL()) |
| 6103 return; |
| 6104 restoreCurrentFramebuffer(); |
| 6105 } |
| 6106 |
| 6107 void WebGLRenderingContextBase:: |
| 6108 DrawingBufferClientRestorePixelUnpackBufferBinding() {} |
| 6109 |
| 6130 ScriptValue WebGLRenderingContextBase::getBooleanParameter( | 6110 ScriptValue WebGLRenderingContextBase::getBooleanParameter( |
| 6131 ScriptState* scriptState, | 6111 ScriptState* scriptState, |
| 6132 GLenum pname) { | 6112 GLenum pname) { |
| 6133 GLboolean value = 0; | 6113 GLboolean value = 0; |
| 6134 if (!isContextLost()) | 6114 if (!isContextLost()) |
| 6135 contextGL()->GetBooleanv(pname, &value); | 6115 contextGL()->GetBooleanv(pname, &value); |
| 6136 return WebGLAny(scriptState, static_cast<bool>(value)); | 6116 return WebGLAny(scriptState, static_cast<bool>(value)); |
| 6137 } | 6117 } |
| 6138 | 6118 |
| 6139 ScriptValue WebGLRenderingContextBase::getBooleanArrayParameter( | 6119 ScriptValue WebGLRenderingContextBase::getBooleanArrayParameter( |
| (...skipping 1273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7413 | 7393 |
| 7414 void WebGLRenderingContextBase::setFramebuffer(GLenum target, | 7394 void WebGLRenderingContextBase::setFramebuffer(GLenum target, |
| 7415 WebGLFramebuffer* buffer) { | 7395 WebGLFramebuffer* buffer) { |
| 7416 if (buffer) | 7396 if (buffer) |
| 7417 buffer->setHasEverBeenBound(); | 7397 buffer->setHasEverBeenBound(); |
| 7418 | 7398 |
| 7419 if (target == GL_FRAMEBUFFER || target == GL_DRAW_FRAMEBUFFER) { | 7399 if (target == GL_FRAMEBUFFER || target == GL_DRAW_FRAMEBUFFER) { |
| 7420 m_framebufferBinding = buffer; | 7400 m_framebufferBinding = buffer; |
| 7421 applyStencilTest(); | 7401 applyStencilTest(); |
| 7422 } | 7402 } |
| 7423 drawingBuffer()->setFramebufferBinding( | |
| 7424 target, objectOrZero(getFramebufferBinding(target))); | |
| 7425 | |
| 7426 if (!buffer) { | 7403 if (!buffer) { |
| 7427 // Instead of binding fb 0, bind the drawing buffer. | 7404 // Instead of binding fb 0, bind the drawing buffer. |
| 7428 drawingBuffer()->bind(target); | 7405 drawingBuffer()->bind(target); |
| 7429 } else { | 7406 } else { |
| 7430 contextGL()->BindFramebuffer(target, buffer->object()); | 7407 contextGL()->BindFramebuffer(target, buffer->object()); |
| 7431 } | 7408 } |
| 7432 } | 7409 } |
| 7433 | 7410 |
| 7434 void WebGLRenderingContextBase::restoreCurrentFramebuffer() { | 7411 void WebGLRenderingContextBase::restoreCurrentFramebuffer() { |
| 7435 bindFramebuffer(GL_FRAMEBUFFER, m_framebufferBinding.get()); | 7412 bindFramebuffer(GL_FRAMEBUFFER, m_framebufferBinding.get()); |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7545 | 7522 |
| 7546 void WebGLRenderingContextBase::getHTMLOrOffscreenCanvas( | 7523 void WebGLRenderingContextBase::getHTMLOrOffscreenCanvas( |
| 7547 HTMLCanvasElementOrOffscreenCanvas& result) const { | 7524 HTMLCanvasElementOrOffscreenCanvas& result) const { |
| 7548 if (canvas()) | 7525 if (canvas()) |
| 7549 result.setHTMLCanvasElement(canvas()); | 7526 result.setHTMLCanvasElement(canvas()); |
| 7550 else | 7527 else |
| 7551 result.setOffscreenCanvas(getOffscreenCanvas()); | 7528 result.setOffscreenCanvas(getOffscreenCanvas()); |
| 7552 } | 7529 } |
| 7553 | 7530 |
| 7554 } // namespace blink | 7531 } // namespace blink |
| OLD | NEW |