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 20 matching lines...) Expand all Loading... |
31 #include "core/html/HTMLCanvasElement.h" | 31 #include "core/html/HTMLCanvasElement.h" |
32 #include "core/html/HTMLImageElement.h" | 32 #include "core/html/HTMLImageElement.h" |
33 #include "core/html/HTMLVideoElement.h" | 33 #include "core/html/HTMLVideoElement.h" |
34 #include "core/html/ImageData.h" | 34 #include "core/html/ImageData.h" |
35 #include "core/html/canvas/CheckedInt.h" | 35 #include "core/html/canvas/CheckedInt.h" |
36 #include "core/html/canvas/EXTDrawBuffers.h" | 36 #include "core/html/canvas/EXTDrawBuffers.h" |
37 #include "core/html/canvas/EXTTextureFilterAnisotropic.h" | 37 #include "core/html/canvas/EXTTextureFilterAnisotropic.h" |
38 #include "core/html/canvas/OESElementIndexUint.h" | 38 #include "core/html/canvas/OESElementIndexUint.h" |
39 #include "core/html/canvas/OESStandardDerivatives.h" | 39 #include "core/html/canvas/OESStandardDerivatives.h" |
40 #include "core/html/canvas/OESTextureFloat.h" | 40 #include "core/html/canvas/OESTextureFloat.h" |
| 41 #include "core/html/canvas/OESTextureFloatLinear.h" |
41 #include "core/html/canvas/OESTextureHalfFloat.h" | 42 #include "core/html/canvas/OESTextureHalfFloat.h" |
| 43 #include "core/html/canvas/OESTextureHalfFloatLinear.h" |
42 #include "core/html/canvas/OESVertexArrayObject.h" | 44 #include "core/html/canvas/OESVertexArrayObject.h" |
43 #include "core/html/canvas/WebGLActiveInfo.h" | 45 #include "core/html/canvas/WebGLActiveInfo.h" |
44 #include "core/html/canvas/WebGLBuffer.h" | 46 #include "core/html/canvas/WebGLBuffer.h" |
45 #include "core/html/canvas/WebGLCompressedTextureATC.h" | 47 #include "core/html/canvas/WebGLCompressedTextureATC.h" |
46 #include "core/html/canvas/WebGLCompressedTexturePVRTC.h" | 48 #include "core/html/canvas/WebGLCompressedTexturePVRTC.h" |
47 #include "core/html/canvas/WebGLCompressedTextureS3TC.h" | 49 #include "core/html/canvas/WebGLCompressedTextureS3TC.h" |
48 #include "core/html/canvas/WebGLContextAttributes.h" | 50 #include "core/html/canvas/WebGLContextAttributes.h" |
49 #include "core/html/canvas/WebGLContextEvent.h" | 51 #include "core/html/canvas/WebGLContextEvent.h" |
50 #include "core/html/canvas/WebGLContextGroup.h" | 52 #include "core/html/canvas/WebGLContextGroup.h" |
51 #include "core/html/canvas/WebGLDebugRendererInfo.h" | 53 #include "core/html/canvas/WebGLDebugRendererInfo.h" |
(...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
627 m_maxColorAttachments = 0; | 629 m_maxColorAttachments = 0; |
628 | 630 |
629 m_backDrawBuffer = GraphicsContext3D::BACK; | 631 m_backDrawBuffer = GraphicsContext3D::BACK; |
630 | 632 |
631 m_defaultVertexArrayObject = WebGLVertexArrayObjectOES::create(this, WebGLVe
rtexArrayObjectOES::VaoTypeDefault); | 633 m_defaultVertexArrayObject = WebGLVertexArrayObjectOES::create(this, WebGLVe
rtexArrayObjectOES::VaoTypeDefault); |
632 addContextObject(m_defaultVertexArrayObject.get()); | 634 addContextObject(m_defaultVertexArrayObject.get()); |
633 m_boundVertexArrayObject = m_defaultVertexArrayObject; | 635 m_boundVertexArrayObject = m_defaultVertexArrayObject; |
634 | 636 |
635 m_vertexAttribValue.resize(m_maxVertexAttribs); | 637 m_vertexAttribValue.resize(m_maxVertexAttribs); |
636 | 638 |
637 if (!isGLES2NPOTStrict()) | 639 createFallbackBlackTextures1x1(); |
638 createFallbackBlackTextures1x1(); | |
639 | 640 |
640 IntSize canvasSize = clampedCanvasSize(); | 641 IntSize canvasSize = clampedCanvasSize(); |
641 m_drawingBuffer->reset(canvasSize); | 642 m_drawingBuffer->reset(canvasSize); |
642 | 643 |
643 m_context->viewport(0, 0, canvasSize.width(), canvasSize.height()); | 644 m_context->viewport(0, 0, canvasSize.width(), canvasSize.height()); |
644 m_context->scissor(0, 0, canvasSize.width(), canvasSize.height()); | 645 m_context->scissor(0, 0, canvasSize.width(), canvasSize.height()); |
645 | 646 |
646 m_context->setContextLostCallback(adoptPtr(new WebGLRenderingContextLostCall
back(this))); | 647 m_context->setContextLostCallback(adoptPtr(new WebGLRenderingContextLostCall
back(this))); |
647 m_context->setErrorMessageCallback(adoptPtr(new WebGLRenderingContextErrorMe
ssageCallback(this))); | 648 m_context->setErrorMessageCallback(adoptPtr(new WebGLRenderingContextErrorMe
ssageCallback(this))); |
648 | 649 |
(...skipping 1094 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1743 } | 1744 } |
1744 | 1745 |
1745 const char* reason = "framebuffer incomplete"; | 1746 const char* reason = "framebuffer incomplete"; |
1746 if (m_framebufferBinding && !m_framebufferBinding->onAccess(graphicsContext3
D(), &reason)) { | 1747 if (m_framebufferBinding && !m_framebufferBinding->onAccess(graphicsContext3
D(), &reason)) { |
1747 synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, "dra
wArrays", reason); | 1748 synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, "dra
wArrays", reason); |
1748 return; | 1749 return; |
1749 } | 1750 } |
1750 | 1751 |
1751 clearIfComposited(); | 1752 clearIfComposited(); |
1752 | 1753 |
1753 bool vertexAttrib0Simulated = false; | 1754 handleTextureCompleteness("drawArrays", true); |
1754 if (!isGLES2NPOTStrict()) | |
1755 handleNPOTTextures("drawArrays", true); | |
1756 m_context->drawArrays(mode, first, count); | 1755 m_context->drawArrays(mode, first, count); |
1757 if (!isGLES2NPOTStrict()) | 1756 handleTextureCompleteness("drawArrays", false); |
1758 handleNPOTTextures("drawArrays", false); | |
1759 markContextChanged(); | 1757 markContextChanged(); |
1760 } | 1758 } |
1761 | 1759 |
1762 void WebGLRenderingContext::drawElements(GC3Denum mode, GC3Dsizei count, GC3Denu
m type, long long offset, ExceptionCode& ec) | 1760 void WebGLRenderingContext::drawElements(GC3Denum mode, GC3Dsizei count, GC3Denu
m type, long long offset, ExceptionCode& ec) |
1763 { | 1761 { |
1764 UNUSED_PARAM(ec); | 1762 UNUSED_PARAM(ec); |
1765 | 1763 |
1766 if (isContextLost() || !validateDrawMode("drawElements", mode)) | 1764 if (isContextLost() || !validateDrawMode("drawElements", mode)) |
1767 return; | 1765 return; |
1768 | 1766 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1804 return; | 1802 return; |
1805 } | 1803 } |
1806 | 1804 |
1807 const char* reason = "framebuffer incomplete"; | 1805 const char* reason = "framebuffer incomplete"; |
1808 if (m_framebufferBinding && !m_framebufferBinding->onAccess(graphicsContext3
D(), &reason)) { | 1806 if (m_framebufferBinding && !m_framebufferBinding->onAccess(graphicsContext3
D(), &reason)) { |
1809 synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, "dra
wElements", reason); | 1807 synthesizeGLError(GraphicsContext3D::INVALID_FRAMEBUFFER_OPERATION, "dra
wElements", reason); |
1810 return; | 1808 return; |
1811 } | 1809 } |
1812 clearIfComposited(); | 1810 clearIfComposited(); |
1813 | 1811 |
1814 if (!isGLES2NPOTStrict()) | 1812 handleTextureCompleteness("drawElements", true); |
1815 handleNPOTTextures("drawElements", true); | |
1816 m_context->drawElements(mode, count, type, static_cast<GC3Dintptr>(offset)); | 1813 m_context->drawElements(mode, count, type, static_cast<GC3Dintptr>(offset)); |
1817 if (!isGLES2NPOTStrict()) | 1814 handleTextureCompleteness("drawElements", false); |
1818 handleNPOTTextures("drawElements", false); | |
1819 markContextChanged(); | 1815 markContextChanged(); |
1820 } | 1816 } |
1821 | 1817 |
1822 void WebGLRenderingContext::enable(GC3Denum cap) | 1818 void WebGLRenderingContext::enable(GC3Denum cap) |
1823 { | 1819 { |
1824 if (isContextLost() || !validateCapability("enable", cap)) | 1820 if (isContextLost() || !validateCapability("enable", cap)) |
1825 return; | 1821 return; |
1826 if (cap == GraphicsContext3D::STENCIL_TEST) { | 1822 if (cap == GraphicsContext3D::STENCIL_TEST) { |
1827 m_stencilEnabled = true; | 1823 m_stencilEnabled = true; |
1828 applyStencilTest(); | 1824 applyStencilTest(); |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2128 if (getExtensionIfMatch<WebGLCompressedTextureATC>(name, m_webglCompressedTe
xtureATC, webkitPrefix, extension)) | 2124 if (getExtensionIfMatch<WebGLCompressedTextureATC>(name, m_webglCompressedTe
xtureATC, webkitPrefix, extension)) |
2129 return extension; | 2125 return extension; |
2130 if (getExtensionIfMatch<WebGLCompressedTexturePVRTC>(name, m_webglCompressed
TexturePVRTC, webkitPrefix, extension)) | 2126 if (getExtensionIfMatch<WebGLCompressedTexturePVRTC>(name, m_webglCompressed
TexturePVRTC, webkitPrefix, extension)) |
2131 return extension; | 2127 return extension; |
2132 if (getExtensionIfMatch<WebGLCompressedTextureS3TC>(name, m_webglCompressedT
extureS3TC, bothPrefixes, extension)) | 2128 if (getExtensionIfMatch<WebGLCompressedTextureS3TC>(name, m_webglCompressedT
extureS3TC, bothPrefixes, extension)) |
2133 return extension; | 2129 return extension; |
2134 if (getExtensionIfMatch<WebGLDepthTexture>(name, m_webglDepthTexture, bothPr
efixes, extension)) | 2130 if (getExtensionIfMatch<WebGLDepthTexture>(name, m_webglDepthTexture, bothPr
efixes, extension)) |
2135 return extension; | 2131 return extension; |
2136 if (getExtensionIfMatch<EXTDrawBuffers>(name, m_extDrawBuffers, unprefixed,
extension)) | 2132 if (getExtensionIfMatch<EXTDrawBuffers>(name, m_extDrawBuffers, unprefixed,
extension)) |
2137 return extension; | 2133 return extension; |
| 2134 if (getExtensionIfMatch<OESTextureFloatLinear>(name, m_oesTextureFloatLinear
, unprefixed, extension)) |
| 2135 return extension; |
| 2136 if (getExtensionIfMatch<OESTextureHalfFloatLinear>(name, m_oesTextureHalfFlo
atLinear, unprefixed, extension)) |
| 2137 return extension; |
2138 if (allowPrivilegedExtensions()) { | 2138 if (allowPrivilegedExtensions()) { |
2139 if (getExtensionIfMatch<WebGLDebugRendererInfo>(name, m_webglDebugRender
erInfo, unprefixed, extension)) | 2139 if (getExtensionIfMatch<WebGLDebugRendererInfo>(name, m_webglDebugRender
erInfo, unprefixed, extension)) |
2140 return extension; | 2140 return extension; |
2141 if (getExtensionIfMatch<WebGLDebugShaders>(name, m_webglDebugShaders, un
prefixed, extension)) | 2141 if (getExtensionIfMatch<WebGLDebugShaders>(name, m_webglDebugShaders, un
prefixed, extension)) |
2142 return extension; | 2142 return extension; |
2143 } | 2143 } |
2144 | 2144 |
2145 return 0; | 2145 return 0; |
2146 } | 2146 } |
2147 | 2147 |
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2614 { | 2614 { |
2615 Vector<String> result; | 2615 Vector<String> result; |
2616 if (isContextLost()) | 2616 if (isContextLost()) |
2617 return result; | 2617 return result; |
2618 | 2618 |
2619 appendIfSupported<EXTDrawBuffers>(result, false); | 2619 appendIfSupported<EXTDrawBuffers>(result, false); |
2620 appendIfSupported<EXTTextureFilterAnisotropic>(result, true); | 2620 appendIfSupported<EXTTextureFilterAnisotropic>(result, true); |
2621 appendIfSupported<OESElementIndexUint>(result, false); | 2621 appendIfSupported<OESElementIndexUint>(result, false); |
2622 appendIfSupported<OESStandardDerivatives>(result, false); | 2622 appendIfSupported<OESStandardDerivatives>(result, false); |
2623 appendIfSupported<OESTextureFloat>(result, false); | 2623 appendIfSupported<OESTextureFloat>(result, false); |
| 2624 appendIfSupported<OESTextureFloatLinear>(result, false); |
| 2625 appendIfSupported<OESTextureHalfFloat>(result, false); |
| 2626 appendIfSupported<OESTextureHalfFloatLinear>(result, false); |
2624 appendIfSupported<OESVertexArrayObject>(result, false); | 2627 appendIfSupported<OESVertexArrayObject>(result, false); |
2625 appendIfSupported<WebGLCompressedTextureATC>(result, true); | 2628 appendIfSupported<WebGLCompressedTextureATC>(result, true); |
2626 appendIfSupported<WebGLCompressedTexturePVRTC>(result, true); | 2629 appendIfSupported<WebGLCompressedTexturePVRTC>(result, true); |
2627 appendIfSupported<WebGLCompressedTextureS3TC>(result, true); | 2630 appendIfSupported<WebGLCompressedTextureS3TC>(result, true); |
2628 appendIfSupported<WebGLDepthTexture>(result, true); | 2631 appendIfSupported<WebGLDepthTexture>(result, true); |
2629 appendIfSupported<WebGLLoseContext>(result, false); | 2632 appendIfSupported<WebGLLoseContext>(result, false); |
2630 | 2633 |
2631 if (allowPrivilegedExtensions()) { | 2634 if (allowPrivilegedExtensions()) { |
2632 appendIfSupported<WebGLDebugShaders>(result, false); | 2635 appendIfSupported<WebGLDebugShaders>(result, false); |
2633 appendIfSupported<WebGLDebugRendererInfo>(result, false); | 2636 appendIfSupported<WebGLDebugRendererInfo>(result, false); |
(...skipping 1708 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4342 case GraphicsContext3D::SCISSOR_BOX: | 4345 case GraphicsContext3D::SCISSOR_BOX: |
4343 case GraphicsContext3D::VIEWPORT: | 4346 case GraphicsContext3D::VIEWPORT: |
4344 length = 4; | 4347 length = 4; |
4345 break; | 4348 break; |
4346 default: | 4349 default: |
4347 notImplemented(); | 4350 notImplemented(); |
4348 } | 4351 } |
4349 return WebGLGetInfo(Int32Array::create(value, length)); | 4352 return WebGLGetInfo(Int32Array::create(value, length)); |
4350 } | 4353 } |
4351 | 4354 |
4352 void WebGLRenderingContext::handleNPOTTextures(const char* functionName, bool pr
epareToDraw) | 4355 void WebGLRenderingContext::handleTextureCompleteness(const char* functionName,
bool prepareToDraw) |
4353 { | 4356 { |
4354 // All calling functions check isContextLost, so a duplicate check is not ne
eded here. | 4357 // All calling functions check isContextLost, so a duplicate check is not ne
eded here. |
4355 bool resetActiveUnit = false; | 4358 bool resetActiveUnit = false; |
| 4359 WebGLTexture::TextureExtensionFlag flag = static_cast<WebGLTexture::TextureE
xtensionFlag>((m_oesTextureFloatLinear ? WebGLTexture::TextureFloatLinearExtensi
onEnabled : 0) |
| 4360 | (m_oesTextureHalfFloatLinear ? WebGLTexture::TextureHalfFloatLinearExt
ensionEnabled : 0)); |
4356 for (unsigned ii = 0; ii < m_textureUnits.size(); ++ii) { | 4361 for (unsigned ii = 0; ii < m_textureUnits.size(); ++ii) { |
4357 if ((m_textureUnits[ii].m_texture2DBinding && m_textureUnits[ii].m_textu
re2DBinding->needToUseBlackTexture()) | 4362 if ((m_textureUnits[ii].m_texture2DBinding.get() && m_textureUnits[ii].m
_texture2DBinding->needToUseBlackTexture(flag)) |
4358 || (m_textureUnits[ii].m_textureCubeMapBinding && m_textureUnits[ii]
.m_textureCubeMapBinding->needToUseBlackTexture())) { | 4363 || (m_textureUnits[ii].m_textureCubeMapBinding.get() && m_textureUni
ts[ii].m_textureCubeMapBinding->needToUseBlackTexture(flag))) { |
4359 if (ii != m_activeTextureUnit) { | 4364 if (ii != m_activeTextureUnit) { |
4360 m_context->activeTexture(ii); | 4365 m_context->activeTexture(ii); |
4361 resetActiveUnit = true; | 4366 resetActiveUnit = true; |
4362 } else if (resetActiveUnit) { | 4367 } else if (resetActiveUnit) { |
4363 m_context->activeTexture(ii); | 4368 m_context->activeTexture(ii); |
4364 resetActiveUnit = false; | 4369 resetActiveUnit = false; |
4365 } | 4370 } |
4366 WebGLTexture* tex2D; | 4371 WebGLTexture* tex2D; |
4367 WebGLTexture* texCubeMap; | 4372 WebGLTexture* texCubeMap; |
4368 if (prepareToDraw) { | 4373 if (prepareToDraw) { |
4369 String msg(String("texture bound to texture unit ") + String::nu
mber(ii) | 4374 String msg(String("texture bound to texture unit ") + String::nu
mber(ii) |
4370 + " is not renderable. It maybe non-power-of-2 and have inco
mpatible texture filtering or is not 'texture complete'"); | 4375 + " is not renderable. It maybe non-power-of-2 and have inco
mpatible texture filtering or is not 'texture complete'." |
| 4376 + " Or the texture is Float or Half Float type with linear f
iltering while OES_float_linear or OES_half_float_linear extension is not enable
d."); |
4371 printGLWarningToConsole(functionName, msg.utf8().data()); | 4377 printGLWarningToConsole(functionName, msg.utf8().data()); |
4372 tex2D = m_blackTexture2D.get(); | 4378 tex2D = m_blackTexture2D.get(); |
4373 texCubeMap = m_blackTextureCubeMap.get(); | 4379 texCubeMap = m_blackTextureCubeMap.get(); |
4374 } else { | 4380 } else { |
4375 tex2D = m_textureUnits[ii].m_texture2DBinding.get(); | 4381 tex2D = m_textureUnits[ii].m_texture2DBinding.get(); |
4376 texCubeMap = m_textureUnits[ii].m_textureCubeMapBinding.get(); | 4382 texCubeMap = m_textureUnits[ii].m_textureCubeMapBinding.get(); |
4377 } | 4383 } |
4378 if (m_textureUnits[ii].m_texture2DBinding && m_textureUnits[ii].m_te
xture2DBinding->needToUseBlackTexture()) | 4384 if (m_textureUnits[ii].m_texture2DBinding && m_textureUnits[ii].m_te
xture2DBinding->needToUseBlackTexture(flag)) |
4379 m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, objectOrZe
ro(tex2D)); | 4385 m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, objectOrZe
ro(tex2D)); |
4380 if (m_textureUnits[ii].m_textureCubeMapBinding && m_textureUnits[ii]
.m_textureCubeMapBinding->needToUseBlackTexture()) | 4386 if (m_textureUnits[ii].m_textureCubeMapBinding && m_textureUnits[ii]
.m_textureCubeMapBinding->needToUseBlackTexture(flag)) |
4381 m_context->bindTexture(GraphicsContext3D::TEXTURE_CUBE_MAP, obje
ctOrZero(texCubeMap)); | 4387 m_context->bindTexture(GraphicsContext3D::TEXTURE_CUBE_MAP, obje
ctOrZero(texCubeMap)); |
4382 } | 4388 } |
4383 } | 4389 } |
4384 if (resetActiveUnit) | 4390 if (resetActiveUnit) |
4385 m_context->activeTexture(m_activeTextureUnit); | 4391 m_context->activeTexture(m_activeTextureUnit); |
4386 } | 4392 } |
4387 | 4393 |
4388 void WebGLRenderingContext::createFallbackBlackTextures1x1() | 4394 void WebGLRenderingContext::createFallbackBlackTextures1x1() |
4389 { | 4395 { |
4390 // All calling functions check isContextLost, so a duplicate check is not ne
eded here. | 4396 // All calling functions check isContextLost, so a duplicate check is not ne
eded here. |
(...skipping 1095 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5486 | 5492 |
5487 void WebGLRenderingContext::multisamplingChanged(bool enabled) | 5493 void WebGLRenderingContext::multisamplingChanged(bool enabled) |
5488 { | 5494 { |
5489 if (m_multisamplingAllowed != enabled) { | 5495 if (m_multisamplingAllowed != enabled) { |
5490 m_multisamplingAllowed = enabled; | 5496 m_multisamplingAllowed = enabled; |
5491 forceLostContext(WebGLRenderingContext::AutoRecoverSyntheticLostContext)
; | 5497 forceLostContext(WebGLRenderingContext::AutoRecoverSyntheticLostContext)
; |
5492 } | 5498 } |
5493 } | 5499 } |
5494 | 5500 |
5495 } // namespace WebCore | 5501 } // namespace WebCore |
OLD | NEW |