diff options
author | Zhenyao Mo <zmo@google.com> | 2011-06-30 23:24:26 +0000 |
---|---|---|
committer | Steve Kondik <shade@chemlab.org> | 2013-01-20 18:38:32 -0800 |
commit | 4da5f26c019971a319dda77e4bfe6480c269bdf1 (patch) | |
tree | 2ccf19cbab0dddbd80f45d3397526a571ce5b0d3 /Source/WebCore/html/canvas/WebGLRenderingContext.cpp | |
parent | c018655c37a1da5d7e1f9dc94d0467130cf630f1 (diff) | |
download | external_webkit-4da5f26c019971a319dda77e4bfe6480c269bdf1.zip external_webkit-4da5f26c019971a319dda77e4bfe6480c269bdf1.tar.gz external_webkit-4da5f26c019971a319dda77e4bfe6480c269bdf1.tar.bz2 |
Improve WebGL object lifetime management in WebGLRenderingContext
2011-06-30 Zhenyao Mo <zmo@google.com>
Reviewed by Kenneth Russell.
Improve WebGL object lifetime management in WebGLRenderingContext
https://bugs.webkit.org/show_bug.cgi?id=63635
* fast/canvas/webgl/gl-object-get-calls-expected.txt:
* fast/canvas/webgl/gl-object-get-calls.html: Fix a bug so getFramebufferAtatchmentParameter generates an error if nothing is attached and something other than TYPE is queried.
* fast/canvas/webgl/object-deletion-behaviour-expected.txt:
* fast/canvas/webgl/object-deletion-behaviour.html: Ditto.
* fast/canvas/webgl/program-test.html: Fix the test so the order of shaders returned by getAttachedShaders doesn't matter.
2011-06-30 Zhenyao Mo <zmo@google.com>
Reviewed by Kenneth Russell.
Improve WebGL object lifetime management in WebGLRenderingContext
https://bugs.webkit.org/show_bug.cgi?id=63635
* html/canvas/WebGLRenderingContext.cpp:
(WebCore::WebGLRenderingContext::getAttachedShaders): Use cached objects instead of querying the underlying GL.
(WebCore::WebGLRenderingContext::getFramebufferAttachmentParameter): Ditto.
(WebCore::WebGLRenderingContext::detachAndRemoveAllObjects): Multiple loop because objects might be removed from the table within an iteration.
* html/canvas/WebGLRenderingContext.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@90180 268f45cc-cd09-0410-ab3c-d52691b4dbfc
CRs-fixed: 407009
(cherry-picked from commit 2dbba5d5facb2c0c57a37eb0cf3958bae0f697fa)
Change-Id: I2cb88cc5790452c18f6e58420cc7b063c9ffce26
Diffstat (limited to 'Source/WebCore/html/canvas/WebGLRenderingContext.cpp')
-rw-r--r-- | Source/WebCore/html/canvas/WebGLRenderingContext.cpp | 89 |
1 files changed, 11 insertions, 78 deletions
diff --git a/Source/WebCore/html/canvas/WebGLRenderingContext.cpp b/Source/WebCore/html/canvas/WebGLRenderingContext.cpp index 30a88fa..7e7bfe3 100644 --- a/Source/WebCore/html/canvas/WebGLRenderingContext.cpp +++ b/Source/WebCore/html/canvas/WebGLRenderingContext.cpp @@ -1929,23 +1929,15 @@ bool WebGLRenderingContext::getAttachedShaders(WebGLProgram* program, Vector<Web shaderObjects.clear(); if (isContextLost() || !validateWebGLObject(program)) return false; - GC3Dint numShaders = 0; - m_context->getProgramiv(objectOrZero(program), GraphicsContext3D::ATTACHED_SHADERS, &numShaders); - if (numShaders) { - OwnArrayPtr<Platform3DObject> shaders = adoptArrayPtr(new Platform3DObject[numShaders]); - GC3Dsizei count = 0; - m_context->getAttachedShaders(objectOrZero(program), numShaders, &count, shaders.get()); - if (count != numShaders) - return false; - shaderObjects.resize(numShaders); - for (GC3Dint ii = 0; ii < numShaders; ++ii) { - WebGLShader* shader = findShader(shaders[ii]); - if (!shader) { - shaderObjects.clear(); - return false; - } - shaderObjects[ii] = shader; - } + + const GC3Denum shaderType[] = { + GraphicsContext3D::VERTEX_SHADER, + GraphicsContext3D::FRAGMENT_SHADER + }; + for (unsigned i = 0; i < sizeof(shaderType) / sizeof(GC3Denum); ++i) { + WebGLShader* shader = program->getAttachedShader(shaderType[i]); + if (shader) + shaderObjects.append(shader); } return true; } @@ -2047,16 +2039,6 @@ WebGLGetInfo WebGLRenderingContext::getFramebufferAttachmentParameter(GC3Denum t UNUSED_PARAM(ec); if (isContextLost() || !validateFramebufferFuncParameters(target, attachment)) return WebGLGetInfo(); - switch (pname) { - case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: - case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: - case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: - case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: - break; - default: - m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM); - return WebGLGetInfo(); - } if (!m_framebufferBinding || !m_framebufferBinding->object()) { m_context->synthesizeGLError(GraphicsContext3D::INVALID_OPERATION); @@ -4123,59 +4105,10 @@ void WebGLRenderingContext::addObject(WebGLObject* object) void WebGLRenderingContext::detachAndRemoveAllObjects() { - HashSet<RefPtr<WebGLObject> >::iterator pend = m_canvasObjects.end(); - for (HashSet<RefPtr<WebGLObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) + while (m_canvasObjects.size() > 0) { + HashSet<WebGLObject*>::iterator it = m_canvasObjects.begin(); (*it)->detachContext(); - - m_canvasObjects.clear(); -} - -WebGLTexture* WebGLRenderingContext::findTexture(Platform3DObject obj) -{ - if (!obj) - return 0; - HashSet<RefPtr<WebGLObject> >::iterator pend = m_canvasObjects.end(); - for (HashSet<RefPtr<WebGLObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) { - if ((*it)->isTexture() && (*it)->object() == obj) - return reinterpret_cast<WebGLTexture*>((*it).get()); - } - return 0; -} - -WebGLRenderbuffer* WebGLRenderingContext::findRenderbuffer(Platform3DObject obj) -{ - if (!obj) - return 0; - HashSet<RefPtr<WebGLObject> >::iterator pend = m_canvasObjects.end(); - for (HashSet<RefPtr<WebGLObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) { - if ((*it)->isRenderbuffer() && (*it)->object() == obj) - return reinterpret_cast<WebGLRenderbuffer*>((*it).get()); - } - return 0; -} - -WebGLBuffer* WebGLRenderingContext::findBuffer(Platform3DObject obj) -{ - if (!obj) - return 0; - HashSet<RefPtr<WebGLObject> >::iterator pend = m_canvasObjects.end(); - for (HashSet<RefPtr<WebGLObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) { - if ((*it)->isBuffer() && (*it)->object() == obj) - return reinterpret_cast<WebGLBuffer*>((*it).get()); } - return 0; -} - -WebGLShader* WebGLRenderingContext::findShader(Platform3DObject obj) -{ - if (!obj) - return 0; - HashSet<RefPtr<WebGLObject> >::iterator pend = m_canvasObjects.end(); - for (HashSet<RefPtr<WebGLObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) { - if ((*it)->isShader() && (*it)->object() == obj) - return reinterpret_cast<WebGLShader*>((*it).get()); - } - return 0; } WebGLGetInfo WebGLRenderingContext::getBooleanParameter(GC3Denum pname) |