| 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 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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) | 529 , m_context(context.get()) |
| 530 , m_drawingBuffer(0) | 530 , m_drawingBuffer(0) |
| 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) | 559 if (!m_drawingBuffer) |
| 560 return; | 560 return; |
| 561 | 561 |
| 562 m_drawingBuffer->bind(); | 562 m_drawingBuffer->bind(); |
| 563 setupFlags(); | 563 setupFlags(); |
| 564 initializeNewContext(); | 564 initializeNewContext(); |
| 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, }; |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 753 } | 753 } |
| 754 | 754 |
| 755 void WebGLRenderingContext::destroyContext() | 755 void WebGLRenderingContext::destroyContext() |
| 756 { | 756 { |
| 757 m_contextLost = true; | 757 m_contextLost = true; |
| 758 | 758 |
| 759 if (!m_context) { | 759 if (!m_context) { |
| 760 ASSERT(!m_drawingBuffer); | 760 ASSERT(!m_drawingBuffer); |
| 761 return; | 761 return; |
| 762 } | 762 } |
| 763 // The drawing buffer holds a context reference. It must also be destroyed | |
| 764 // in order for the context to be released. | |
| 765 ASSERT(m_drawingBuffer); | |
| 766 m_drawingBuffer.clear(); | |
| 767 | 763 |
| 768 m_extensionsUtil.clear(); | 764 m_extensionsUtil.clear(); |
| 769 | 765 |
| 770 m_context->setContextLostCallback(0); | 766 m_context->setContextLostCallback(0); |
| 771 m_context->setErrorMessageCallback(0); | 767 m_context->setErrorMessageCallback(0); |
| 772 m_context.clear(); | 768 m_context = 0; |
| 769 |
| 770 ASSERT(m_drawingBuffer); |
| 771 m_drawingBuffer->releaseResources(); |
| 772 m_drawingBuffer.clear(); |
| 773 } | 773 } |
| 774 | 774 |
| 775 void WebGLRenderingContext::markContextChanged() | 775 void WebGLRenderingContext::markContextChanged() |
| 776 { | 776 { |
| 777 if (m_framebufferBinding || isContextLost()) | 777 if (m_framebufferBinding || isContextLost()) |
| 778 return; | 778 return; |
| 779 | 779 |
| 780 m_drawingBuffer->markContentsChanged(); | 780 m_drawingBuffer->markContentsChanged(); |
| 781 | 781 |
| 782 m_layerCleared = false; | 782 m_layerCleared = false; |
| (...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1307 | 1307 |
| 1308 void WebGLRenderingContext::clear(GLbitfield mask) | 1308 void WebGLRenderingContext::clear(GLbitfield mask) |
| 1309 { | 1309 { |
| 1310 if (isContextLost()) | 1310 if (isContextLost()) |
| 1311 return; | 1311 return; |
| 1312 if (mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_B
IT)) { | 1312 if (mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_B
IT)) { |
| 1313 synthesizeGLError(GL_INVALID_VALUE, "clear", "invalid mask"); | 1313 synthesizeGLError(GL_INVALID_VALUE, "clear", "invalid mask"); |
| 1314 return; | 1314 return; |
| 1315 } | 1315 } |
| 1316 const char* reason = "framebuffer incomplete"; | 1316 const char* reason = "framebuffer incomplete"; |
| 1317 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context.get(),
&reason)) { | 1317 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context, &reas
on)) { |
| 1318 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "clear", reason); | 1318 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "clear", reason); |
| 1319 return; | 1319 return; |
| 1320 } | 1320 } |
| 1321 if (!clearIfComposited(mask)) | 1321 if (!clearIfComposited(mask)) |
| 1322 m_context->clear(mask); | 1322 m_context->clear(mask); |
| 1323 markContextChanged(); | 1323 markContextChanged(); |
| 1324 } | 1324 } |
| 1325 | 1325 |
| 1326 void WebGLRenderingContext::clearColor(GLfloat r, GLfloat g, GLfloat b, GLfloat
a) | 1326 void WebGLRenderingContext::clearColor(GLfloat r, GLfloat g, GLfloat b, GLfloat
a) |
| 1327 { | 1327 { |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1461 return; | 1461 return; |
| 1462 if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFra
mebufferColorFormat())) { | 1462 if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFra
mebufferColorFormat())) { |
| 1463 synthesizeGLError(GL_INVALID_OPERATION, "copyTexImage2D", "framebuffer i
s incompatible format"); | 1463 synthesizeGLError(GL_INVALID_OPERATION, "copyTexImage2D", "framebuffer i
s incompatible format"); |
| 1464 return; | 1464 return; |
| 1465 } | 1465 } |
| 1466 if (!isGLES2NPOTStrict() && level && WebGLTexture::isNPOT(width, height)) { | 1466 if (!isGLES2NPOTStrict() && level && WebGLTexture::isNPOT(width, height)) { |
| 1467 synthesizeGLError(GL_INVALID_VALUE, "copyTexImage2D", "level > 0 not pow
er of 2"); | 1467 synthesizeGLError(GL_INVALID_VALUE, "copyTexImage2D", "level > 0 not pow
er of 2"); |
| 1468 return; | 1468 return; |
| 1469 } | 1469 } |
| 1470 const char* reason = "framebuffer incomplete"; | 1470 const char* reason = "framebuffer incomplete"; |
| 1471 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context.get(),
&reason)) { | 1471 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context, &reas
on)) { |
| 1472 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "copyTexImage2D", re
ason); | 1472 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "copyTexImage2D", re
ason); |
| 1473 return; | 1473 return; |
| 1474 } | 1474 } |
| 1475 clearIfComposited(); | 1475 clearIfComposited(); |
| 1476 ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding
.get()); | 1476 ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding
.get()); |
| 1477 m_context->copyTexImage2D(target, level, internalformat, x, y, width, height
, border); | 1477 m_context->copyTexImage2D(target, level, internalformat, x, y, width, height
, border); |
| 1478 // FIXME: if the framebuffer is not complete, none of the below should be ex
ecuted. | 1478 // FIXME: if the framebuffer is not complete, none of the below should be ex
ecuted. |
| 1479 tex->setLevelInfo(target, level, internalformat, width, height, GL_UNSIGNED_
BYTE); | 1479 tex->setLevelInfo(target, level, internalformat, width, height, GL_UNSIGNED_
BYTE); |
| 1480 } | 1480 } |
| 1481 | 1481 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1504 return; | 1504 return; |
| 1505 } | 1505 } |
| 1506 GLenum internalformat = tex->getInternalFormat(target, level); | 1506 GLenum internalformat = tex->getInternalFormat(target, level); |
| 1507 if (!validateSettableTexFormat("copyTexSubImage2D", internalformat)) | 1507 if (!validateSettableTexFormat("copyTexSubImage2D", internalformat)) |
| 1508 return; | 1508 return; |
| 1509 if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFra
mebufferColorFormat())) { | 1509 if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFra
mebufferColorFormat())) { |
| 1510 synthesizeGLError(GL_INVALID_OPERATION, "copyTexSubImage2D", "framebuffe
r is incompatible format"); | 1510 synthesizeGLError(GL_INVALID_OPERATION, "copyTexSubImage2D", "framebuffe
r is incompatible format"); |
| 1511 return; | 1511 return; |
| 1512 } | 1512 } |
| 1513 const char* reason = "framebuffer incomplete"; | 1513 const char* reason = "framebuffer incomplete"; |
| 1514 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context.get(),
&reason)) { | 1514 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context, &reas
on)) { |
| 1515 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "copyTexSubImage2D",
reason); | 1515 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "copyTexSubImage2D",
reason); |
| 1516 return; | 1516 return; |
| 1517 } | 1517 } |
| 1518 clearIfComposited(); | 1518 clearIfComposited(); |
| 1519 ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding
.get()); | 1519 ScopedDrawingBufferBinder binder(m_drawingBuffer.get(), m_framebufferBinding
.get()); |
| 1520 m_context->copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, h
eight); | 1520 m_context->copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, h
eight); |
| 1521 } | 1521 } |
| 1522 | 1522 |
| 1523 PassRefPtr<WebGLBuffer> WebGLRenderingContext::createBuffer() | 1523 PassRefPtr<WebGLBuffer> WebGLRenderingContext::createBuffer() |
| 1524 { | 1524 { |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1611 { | 1611 { |
| 1612 if (isContextLost() || !object) | 1612 if (isContextLost() || !object) |
| 1613 return false; | 1613 return false; |
| 1614 if (!object->validate(contextGroup(), this)) { | 1614 if (!object->validate(contextGroup(), this)) { |
| 1615 synthesizeGLError(GL_INVALID_OPERATION, "delete", "object does not belon
g to this context"); | 1615 synthesizeGLError(GL_INVALID_OPERATION, "delete", "object does not belon
g to this context"); |
| 1616 return false; | 1616 return false; |
| 1617 } | 1617 } |
| 1618 if (object->object()) { | 1618 if (object->object()) { |
| 1619 // We need to pass in context here because we want | 1619 // We need to pass in context here because we want |
| 1620 // things in this context unbound. | 1620 // things in this context unbound. |
| 1621 object->deleteObject(m_context.get()); | 1621 object->deleteObject(m_context); |
| 1622 } | 1622 } |
| 1623 return true; | 1623 return true; |
| 1624 } | 1624 } |
| 1625 | 1625 |
| 1626 void WebGLRenderingContext::deleteBuffer(WebGLBuffer* buffer) | 1626 void WebGLRenderingContext::deleteBuffer(WebGLBuffer* buffer) |
| 1627 { | 1627 { |
| 1628 if (!deleteObject(buffer)) | 1628 if (!deleteObject(buffer)) |
| 1629 return; | 1629 return; |
| 1630 if (m_boundArrayBuffer == buffer) | 1630 if (m_boundArrayBuffer == buffer) |
| 1631 m_boundArrayBuffer = 0; | 1631 m_boundArrayBuffer = 0; |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1724 | 1724 |
| 1725 void WebGLRenderingContext::detachShader(WebGLProgram* program, WebGLShader* sha
der) | 1725 void WebGLRenderingContext::detachShader(WebGLProgram* program, WebGLShader* sha
der) |
| 1726 { | 1726 { |
| 1727 if (isContextLost() || !validateWebGLObject("detachShader", program) || !val
idateWebGLObject("detachShader", shader)) | 1727 if (isContextLost() || !validateWebGLObject("detachShader", program) || !val
idateWebGLObject("detachShader", shader)) |
| 1728 return; | 1728 return; |
| 1729 if (!program->detachShader(shader)) { | 1729 if (!program->detachShader(shader)) { |
| 1730 synthesizeGLError(GL_INVALID_OPERATION, "detachShader", "shader not atta
ched"); | 1730 synthesizeGLError(GL_INVALID_OPERATION, "detachShader", "shader not atta
ched"); |
| 1731 return; | 1731 return; |
| 1732 } | 1732 } |
| 1733 m_context->detachShader(objectOrZero(program), objectOrZero(shader)); | 1733 m_context->detachShader(objectOrZero(program), objectOrZero(shader)); |
| 1734 shader->onDetached(m_context.get()); | 1734 shader->onDetached(m_context); |
| 1735 } | 1735 } |
| 1736 | 1736 |
| 1737 void WebGLRenderingContext::disable(GLenum cap) | 1737 void WebGLRenderingContext::disable(GLenum cap) |
| 1738 { | 1738 { |
| 1739 if (isContextLost() || !validateCapability("disable", cap)) | 1739 if (isContextLost() || !validateCapability("disable", cap)) |
| 1740 return; | 1740 return; |
| 1741 if (cap == GL_STENCIL_TEST) { | 1741 if (cap == GL_STENCIL_TEST) { |
| 1742 m_stencilEnabled = false; | 1742 m_stencilEnabled = false; |
| 1743 applyStencilTest(); | 1743 applyStencilTest(); |
| 1744 return; | 1744 return; |
| (...skipping 1320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3065 if (format != GL_RGBA || type != GL_UNSIGNED_BYTE) { | 3065 if (format != GL_RGBA || type != GL_UNSIGNED_BYTE) { |
| 3066 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "format not RGBA o
r type not UNSIGNED_BYTE"); | 3066 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "format not RGBA o
r type not UNSIGNED_BYTE"); |
| 3067 return; | 3067 return; |
| 3068 } | 3068 } |
| 3069 // Validate array type against pixel type. | 3069 // Validate array type against pixel type. |
| 3070 if (pixels->type() != ArrayBufferView::TypeUint8) { | 3070 if (pixels->type() != ArrayBufferView::TypeUint8) { |
| 3071 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "ArrayBufferView n
ot Uint8Array"); | 3071 synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "ArrayBufferView n
ot Uint8Array"); |
| 3072 return; | 3072 return; |
| 3073 } | 3073 } |
| 3074 const char* reason = "framebuffer incomplete"; | 3074 const char* reason = "framebuffer incomplete"; |
| 3075 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context.get(),
&reason)) { | 3075 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context, &reas
on)) { |
| 3076 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "readPixels", reason
); | 3076 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, "readPixels", reason
); |
| 3077 return; | 3077 return; |
| 3078 } | 3078 } |
| 3079 // Calculate array size, taking into consideration of PACK_ALIGNMENT. | 3079 // Calculate array size, taking into consideration of PACK_ALIGNMENT. |
| 3080 unsigned totalBytesRequired = 0; | 3080 unsigned totalBytesRequired = 0; |
| 3081 unsigned padding = 0; | 3081 unsigned padding = 0; |
| 3082 GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, w
idth, height, m_packAlignment, &totalBytesRequired, &padding); | 3082 GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, w
idth, height, m_packAlignment, &totalBytesRequired, &padding); |
| 3083 if (error != GL_NO_ERROR) { | 3083 if (error != GL_NO_ERROR) { |
| 3084 synthesizeGLError(error, "readPixels", "invalid dimensions"); | 3084 synthesizeGLError(error, "readPixels", "invalid dimensions"); |
| 3085 return; | 3085 return; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3129 return; | 3129 return; |
| 3130 switch (internalformat) { | 3130 switch (internalformat) { |
| 3131 case GL_DEPTH_COMPONENT16: | 3131 case GL_DEPTH_COMPONENT16: |
| 3132 case GL_RGBA4: | 3132 case GL_RGBA4: |
| 3133 case GL_RGB5_A1: | 3133 case GL_RGB5_A1: |
| 3134 case GL_RGB565: | 3134 case GL_RGB565: |
| 3135 case GL_STENCIL_INDEX8: | 3135 case GL_STENCIL_INDEX8: |
| 3136 m_context->renderbufferStorage(target, internalformat, width, height); | 3136 m_context->renderbufferStorage(target, internalformat, width, height); |
| 3137 m_renderbufferBinding->setInternalFormat(internalformat); | 3137 m_renderbufferBinding->setInternalFormat(internalformat); |
| 3138 m_renderbufferBinding->setSize(width, height); | 3138 m_renderbufferBinding->setSize(width, height); |
| 3139 m_renderbufferBinding->deleteEmulatedStencilBuffer(m_context.get()); | 3139 m_renderbufferBinding->deleteEmulatedStencilBuffer(m_context); |
| 3140 break; | 3140 break; |
| 3141 case GL_DEPTH_STENCIL_OES: | 3141 case GL_DEPTH_STENCIL_OES: |
| 3142 if (isDepthStencilSupported()) { | 3142 if (isDepthStencilSupported()) { |
| 3143 m_context->renderbufferStorage(target, GL_DEPTH24_STENCIL8_OES, widt
h, height); | 3143 m_context->renderbufferStorage(target, GL_DEPTH24_STENCIL8_OES, widt
h, height); |
| 3144 } else { | 3144 } else { |
| 3145 WebGLRenderbuffer* emulatedStencilBuffer = ensureEmulatedStencilBuff
er(target, m_renderbufferBinding.get()); | 3145 WebGLRenderbuffer* emulatedStencilBuffer = ensureEmulatedStencilBuff
er(target, m_renderbufferBinding.get()); |
| 3146 if (!emulatedStencilBuffer) { | 3146 if (!emulatedStencilBuffer) { |
| 3147 synthesizeGLError(GL_OUT_OF_MEMORY, "renderbufferStorage", "out
of memory"); | 3147 synthesizeGLError(GL_OUT_OF_MEMORY, "renderbufferStorage", "out
of memory"); |
| 3148 return; | 3148 return; |
| 3149 } | 3149 } |
| (...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3458 { | 3458 { |
| 3459 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)) | 3459 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)) |
| 3460 return; | 3460 return; |
| 3461 | 3461 |
| 3462 WebGLTexture* texture = validateTextureBinding("texImage2D", target, true); | 3462 WebGLTexture* texture = validateTextureBinding("texImage2D", target, true); |
| 3463 // If possible, copy from the canvas element directly to the texture | 3463 // If possible, copy from the canvas element directly to the texture |
| 3464 // via the GPU, without a read-back to system memory. | 3464 // via the GPU, without a read-back to system memory. |
| 3465 if (GL_TEXTURE_2D == target && texture) { | 3465 if (GL_TEXTURE_2D == target && texture) { |
| 3466 if (!canvas->is3D()) { | 3466 if (!canvas->is3D()) { |
| 3467 ImageBuffer* buffer = canvas->buffer(); | 3467 ImageBuffer* buffer = canvas->buffer(); |
| 3468 if (buffer && buffer->copyToPlatformTexture(m_context.get(), texture
->object(), internalformat, type, | 3468 if (buffer && buffer->copyToPlatformTexture(m_context, texture->obje
ct(), internalformat, type, |
| 3469 level, m_unpackPremultiplyAlpha, m_unpackFlipY)) { | 3469 level, m_unpackPremultiplyAlpha, m_unpackFlipY)) { |
| 3470 texture->setLevelInfo(target, level, internalformat, canvas->wid
th(), canvas->height(), type); | 3470 texture->setLevelInfo(target, level, internalformat, canvas->wid
th(), canvas->height(), type); |
| 3471 return; | 3471 return; |
| 3472 } | 3472 } |
| 3473 } else { | 3473 } else { |
| 3474 WebGLRenderingContext* gl = toWebGLRenderingContext(canvas->renderin
gContext()); | 3474 WebGLRenderingContext* gl = toWebGLRenderingContext(canvas->renderin
gContext()); |
| 3475 if (gl && gl->m_drawingBuffer->copyToPlatformTexture(m_context.get()
, texture->object(), internalformat, type, | 3475 if (gl && gl->m_drawingBuffer->copyToPlatformTexture(m_context, text
ure->object(), internalformat, type, |
| 3476 level, m_unpackPremultiplyAlpha, m_unpackFlipY)) { | 3476 level, m_unpackPremultiplyAlpha, m_unpackFlipY)) { |
| 3477 texture->setLevelInfo(target, level, internalformat, canvas->wid
th(), canvas->height(), type); | 3477 texture->setLevelInfo(target, level, internalformat, canvas->wid
th(), canvas->height(), type); |
| 3478 return; | 3478 return; |
| 3479 } | 3479 } |
| 3480 } | 3480 } |
| 3481 } | 3481 } |
| 3482 | 3482 |
| 3483 RefPtr<ImageData> imageData = canvas->getImageData(); | 3483 RefPtr<ImageData> imageData = canvas->getImageData(); |
| 3484 if (imageData) | 3484 if (imageData) |
| 3485 texImage2D(target, level, internalformat, format, type, imageData.get(),
exceptionState); | 3485 texImage2D(target, level, internalformat, format, type, imageData.get(),
exceptionState); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 3505 GLenum format, GLenum type, HTMLVideoElement* video, ExceptionState& excepti
onState) | 3505 GLenum format, GLenum type, HTMLVideoElement* video, ExceptionState& excepti
onState) |
| 3506 { | 3506 { |
| 3507 if (isContextLost() || !validateHTMLVideoElement("texImage2D", video, except
ionState) | 3507 if (isContextLost() || !validateHTMLVideoElement("texImage2D", video, except
ionState) |
| 3508 || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceHTMLVideoEleme
nt, target, level, internalformat, video->videoWidth(), video->videoHeight(), 0,
format, type, 0, 0)) | 3508 || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceHTMLVideoEleme
nt, target, level, internalformat, video->videoWidth(), video->videoHeight(), 0,
format, type, 0, 0)) |
| 3509 return; | 3509 return; |
| 3510 | 3510 |
| 3511 // Go through the fast path doing a GPU-GPU textures copy without a readback
to system memory if possible. | 3511 // Go through the fast path doing a GPU-GPU textures copy without a readback
to system memory if possible. |
| 3512 // Otherwise, it will fall back to the normal SW path. | 3512 // Otherwise, it will fall back to the normal SW path. |
| 3513 WebGLTexture* texture = validateTextureBinding("texImage2D", target, true); | 3513 WebGLTexture* texture = validateTextureBinding("texImage2D", target, true); |
| 3514 if (GL_TEXTURE_2D == target && texture) { | 3514 if (GL_TEXTURE_2D == target && texture) { |
| 3515 if (video->copyVideoTextureToPlatformTexture(m_context.get(), texture->o
bject(), level, type, internalformat, m_unpackPremultiplyAlpha, m_unpackFlipY))
{ | 3515 if (video->copyVideoTextureToPlatformTexture(m_context, texture->object(
), level, type, internalformat, m_unpackPremultiplyAlpha, m_unpackFlipY)) { |
| 3516 texture->setLevelInfo(target, level, internalformat, video->videoWid
th(), video->videoHeight(), type); | 3516 texture->setLevelInfo(target, level, internalformat, video->videoWid
th(), video->videoHeight(), type); |
| 3517 return; | 3517 return; |
| 3518 } | 3518 } |
| 3519 } | 3519 } |
| 3520 | 3520 |
| 3521 // Normal pure SW path. | 3521 // Normal pure SW path. |
| 3522 RefPtr<Image> image = videoFrameToImage(video, ImageBuffer::fastCopyImageMod
e()); | 3522 RefPtr<Image> image = videoFrameToImage(video, ImageBuffer::fastCopyImageMod
e()); |
| 3523 if (!image) | 3523 if (!image) |
| 3524 return; | 3524 return; |
| 3525 texImage2DImpl(target, level, internalformat, format, type, image.get(), Web
GLImageConversion::HtmlDomVideo, m_unpackFlipY, m_unpackPremultiplyAlpha, except
ionState); | 3525 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 Loading... |
| 3999 if (!checkObjectToBeBound("useProgram", program, deleted)) | 3999 if (!checkObjectToBeBound("useProgram", program, deleted)) |
| 4000 return; | 4000 return; |
| 4001 if (deleted) | 4001 if (deleted) |
| 4002 program = 0; | 4002 program = 0; |
| 4003 if (program && !program->linkStatus()) { | 4003 if (program && !program->linkStatus()) { |
| 4004 synthesizeGLError(GL_INVALID_OPERATION, "useProgram", "program not valid
"); | 4004 synthesizeGLError(GL_INVALID_OPERATION, "useProgram", "program not valid
"); |
| 4005 return; | 4005 return; |
| 4006 } | 4006 } |
| 4007 if (m_currentProgram != program) { | 4007 if (m_currentProgram != program) { |
| 4008 if (m_currentProgram) | 4008 if (m_currentProgram) |
| 4009 m_currentProgram->onDetached(m_context.get()); | 4009 m_currentProgram->onDetached(m_context); |
| 4010 m_currentProgram = program; | 4010 m_currentProgram = program; |
| 4011 m_context->useProgram(objectOrZero(program)); | 4011 m_context->useProgram(objectOrZero(program)); |
| 4012 if (program) | 4012 if (program) |
| 4013 program->onAttached(); | 4013 program->onAttached(); |
| 4014 } | 4014 } |
| 4015 } | 4015 } |
| 4016 | 4016 |
| 4017 void WebGLRenderingContext::validateProgram(WebGLProgram* program) | 4017 void WebGLRenderingContext::validateProgram(WebGLProgram* program) |
| 4018 { | 4018 { |
| 4019 if (isContextLost() || !validateWebGLObject("validateProgram", program)) | 4019 if (isContextLost() || !validateWebGLObject("validateProgram", program)) |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4219 } | 4219 } |
| 4220 | 4220 |
| 4221 blink::WebLayer* WebGLRenderingContext::platformLayer() const | 4221 blink::WebLayer* WebGLRenderingContext::platformLayer() const |
| 4222 { | 4222 { |
| 4223 return isContextLost() ? 0 : m_drawingBuffer->platformLayer(); | 4223 return isContextLost() ? 0 : m_drawingBuffer->platformLayer(); |
| 4224 } | 4224 } |
| 4225 | 4225 |
| 4226 Extensions3DUtil* WebGLRenderingContext::extensionsUtil() | 4226 Extensions3DUtil* WebGLRenderingContext::extensionsUtil() |
| 4227 { | 4227 { |
| 4228 if (!m_extensionsUtil) | 4228 if (!m_extensionsUtil) |
| 4229 m_extensionsUtil = adoptPtr(new Extensions3DUtil(m_context.get())); | 4229 m_extensionsUtil = adoptPtr(new Extensions3DUtil(m_context)); |
| 4230 return m_extensionsUtil.get(); | 4230 return m_extensionsUtil.get(); |
| 4231 } | 4231 } |
| 4232 | 4232 |
| 4233 void WebGLRenderingContext::removeSharedObject(WebGLSharedObject* object) | 4233 void WebGLRenderingContext::removeSharedObject(WebGLSharedObject* object) |
| 4234 { | 4234 { |
| 4235 m_contextGroup->removeObject(object); | 4235 m_contextGroup->removeObject(object); |
| 4236 } | 4236 } |
| 4237 | 4237 |
| 4238 void WebGLRenderingContext::addSharedObject(WebGLSharedObject* object) | 4238 void WebGLRenderingContext::addSharedObject(WebGLSharedObject* object) |
| 4239 { | 4239 { |
| (...skipping 968 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5208 if (!count) { | 5208 if (!count) { |
| 5209 markContextChanged(); | 5209 markContextChanged(); |
| 5210 return false; | 5210 return false; |
| 5211 } | 5211 } |
| 5212 | 5212 |
| 5213 if (!validateRenderingState(functionName)) { | 5213 if (!validateRenderingState(functionName)) { |
| 5214 return false; | 5214 return false; |
| 5215 } | 5215 } |
| 5216 | 5216 |
| 5217 const char* reason = "framebuffer incomplete"; | 5217 const char* reason = "framebuffer incomplete"; |
| 5218 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context.get(),
&reason)) { | 5218 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context, &reas
on)) { |
| 5219 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason
); | 5219 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason
); |
| 5220 return false; | 5220 return false; |
| 5221 } | 5221 } |
| 5222 | 5222 |
| 5223 return true; | 5223 return true; |
| 5224 } | 5224 } |
| 5225 | 5225 |
| 5226 bool WebGLRenderingContext::validateDrawElements(const char* functionName, GLenu
m mode, GLsizei count, GLenum type, long long offset) | 5226 bool WebGLRenderingContext::validateDrawElements(const char* functionName, GLenu
m mode, GLsizei count, GLenum type, long long offset) |
| 5227 { | 5227 { |
| 5228 if (isContextLost() || !validateDrawMode(functionName, mode)) | 5228 if (isContextLost() || !validateDrawMode(functionName, mode)) |
| (...skipping 29 matching lines...) Expand all Loading... |
| 5258 if (!m_boundVertexArrayObject->boundElementArrayBuffer()) { | 5258 if (!m_boundVertexArrayObject->boundElementArrayBuffer()) { |
| 5259 synthesizeGLError(GL_INVALID_OPERATION, functionName, "no ELEMENT_ARRAY_
BUFFER bound"); | 5259 synthesizeGLError(GL_INVALID_OPERATION, functionName, "no ELEMENT_ARRAY_
BUFFER bound"); |
| 5260 return false; | 5260 return false; |
| 5261 } | 5261 } |
| 5262 | 5262 |
| 5263 if (!validateRenderingState(functionName)) { | 5263 if (!validateRenderingState(functionName)) { |
| 5264 return false; | 5264 return false; |
| 5265 } | 5265 } |
| 5266 | 5266 |
| 5267 const char* reason = "framebuffer incomplete"; | 5267 const char* reason = "framebuffer incomplete"; |
| 5268 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context.get(),
&reason)) { | 5268 if (m_framebufferBinding && !m_framebufferBinding->onAccess(m_context, &reas
on)) { |
| 5269 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason
); | 5269 synthesizeGLError(GL_INVALID_FRAMEBUFFER_OPERATION, functionName, reason
); |
| 5270 return false; | 5270 return false; |
| 5271 } | 5271 } |
| 5272 | 5272 |
| 5273 return true; | 5273 return true; |
| 5274 } | 5274 } |
| 5275 | 5275 |
| 5276 // Helper function to validate draw*Instanced calls | 5276 // Helper function to validate draw*Instanced calls |
| 5277 bool WebGLRenderingContext::validateDrawInstanced(const char* functionName, GLsi
zei primcount) | 5277 bool WebGLRenderingContext::validateDrawInstanced(const char* functionName, GLsi
zei primcount) |
| 5278 { | 5278 { |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5398 return; | 5398 return; |
| 5399 | 5399 |
| 5400 Settings* settings = frame->settings(); | 5400 Settings* settings = frame->settings(); |
| 5401 | 5401 |
| 5402 if (!frame->loader().client()->allowWebGL(settings && settings->webGLEnabled
())) | 5402 if (!frame->loader().client()->allowWebGL(settings && settings->webGLEnabled
())) |
| 5403 return; | 5403 return; |
| 5404 | 5404 |
| 5405 blink::WebGraphicsContext3D::Attributes attributes = m_requestedAttributes->
attributes(canvas()->document().topDocument()->url().string(), settings); | 5405 blink::WebGraphicsContext3D::Attributes attributes = m_requestedAttributes->
attributes(canvas()->document().topDocument()->url().string(), settings); |
| 5406 OwnPtr<blink::WebGraphicsContext3D> context = adoptPtr(blink::Platform::curr
ent()->createOffscreenGraphicsContext3D(attributes)); | 5406 OwnPtr<blink::WebGraphicsContext3D> context = adoptPtr(blink::Platform::curr
ent()->createOffscreenGraphicsContext3D(attributes)); |
| 5407 | 5407 |
| 5408 ASSERT(!m_drawingBuffer); |
| 5408 if (context) { | 5409 if (context) { |
| 5409 RefPtr<WebGLRenderingContextEvictionManager> contextEvictionManager = ad
optRef(new WebGLRenderingContextEvictionManager()); | 5410 RefPtr<WebGLRenderingContextEvictionManager> contextEvictionManager = ad
optRef(new WebGLRenderingContextEvictionManager()); |
| 5410 DrawingBuffer::PreserveDrawingBuffer preserve = m_requestedAttributes->p
reserveDrawingBuffer() ? DrawingBuffer::Preserve : DrawingBuffer::Discard; | 5411 DrawingBuffer::PreserveDrawingBuffer preserve = m_requestedAttributes->p
reserveDrawingBuffer() ? DrawingBuffer::Preserve : DrawingBuffer::Discard; |
| 5411 m_drawingBuffer = DrawingBuffer::create(context.get(), clampedCanvasSize
(), preserve, contextEvictionManager.release()); | 5412 m_drawingBuffer = DrawingBuffer::create(context.release(), clampedCanvas
Size(), preserve, contextEvictionManager.release()); |
| 5412 } | 5413 } |
| 5413 | 5414 |
| 5414 bool failToRestore = !context || !m_drawingBuffer; | 5415 bool failToRestore = !m_drawingBuffer; |
| 5415 if (failToRestore) { | 5416 if (failToRestore) { |
| 5416 if (m_contextLostMode == RealLostContext) { | 5417 if (m_contextLostMode == RealLostContext) { |
| 5417 m_restoreTimer.startOneShot(secondsBetweenRestoreAttempts); | 5418 m_restoreTimer.startOneShot(secondsBetweenRestoreAttempts); |
| 5418 } else { | 5419 } else { |
| 5419 // This likely shouldn't happen but is the best way to report it to
the WebGL app. | 5420 // This likely shouldn't happen but is the best way to report it to
the WebGL app. |
| 5420 synthesizeGLError(GL_INVALID_OPERATION, "", "error restoring context
"); | 5421 synthesizeGLError(GL_INVALID_OPERATION, "", "error restoring context
"); |
| 5421 } | 5422 } |
| 5422 return; | 5423 return; |
| 5423 } | 5424 } |
| 5424 | 5425 |
| 5425 m_drawingBuffer->bind(); | 5426 m_drawingBuffer->bind(); |
| 5426 | 5427 |
| 5427 m_lostContextErrors.clear(); | 5428 m_lostContextErrors.clear(); |
| 5428 | 5429 |
| 5429 m_context = context.release(); | 5430 m_context = m_drawingBuffer->context(); |
| 5430 m_contextLost = false; | 5431 m_contextLost = false; |
| 5431 | 5432 |
| 5432 setupFlags(); | 5433 setupFlags(); |
| 5433 initializeNewContext(); | 5434 initializeNewContext(); |
| 5434 canvas()->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglconte
xtrestored, false, true, "")); | 5435 canvas()->dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglconte
xtrestored, false, true, "")); |
| 5435 } | 5436 } |
| 5436 | 5437 |
| 5437 String WebGLRenderingContext::ensureNotNull(const String& text) const | 5438 String WebGLRenderingContext::ensureNotNull(const String& text) const |
| 5438 { | 5439 { |
| 5439 if (text.isNull()) | 5440 if (text.isNull()) |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5621 if (m_textureUnits[i].m_texture2DBinding | 5622 if (m_textureUnits[i].m_texture2DBinding |
| 5622 || m_textureUnits[i].m_textureCubeMapBinding) { | 5623 || m_textureUnits[i].m_textureCubeMapBinding) { |
| 5623 m_onePlusMaxNonDefaultTextureUnit = i + 1; | 5624 m_onePlusMaxNonDefaultTextureUnit = i + 1; |
| 5624 return; | 5625 return; |
| 5625 } | 5626 } |
| 5626 } | 5627 } |
| 5627 m_onePlusMaxNonDefaultTextureUnit = 0; | 5628 m_onePlusMaxNonDefaultTextureUnit = 0; |
| 5628 } | 5629 } |
| 5629 | 5630 |
| 5630 } // namespace WebCore | 5631 } // namespace WebCore |
| OLD | NEW |