Diff
Modified: trunk/LayoutTests/ChangeLog (90179 => 90180)
--- trunk/LayoutTests/ChangeLog 2011-06-30 23:20:13 UTC (rev 90179)
+++ trunk/LayoutTests/ChangeLog 2011-06-30 23:24:26 UTC (rev 90180)
@@ -1,3 +1,16 @@
+2011-06-30 Zhenyao Mo <z...@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-27 Diego Gonzalez <diego...@webkit.org>
Reviewed by Antonio Gomes.
Modified: trunk/LayoutTests/fast/canvas/webgl/gl-object-get-calls-expected.txt (90179 => 90180)
--- trunk/LayoutTests/fast/canvas/webgl/gl-object-get-calls-expected.txt 2011-06-30 23:20:13 UTC (rev 90179)
+++ trunk/LayoutTests/fast/canvas/webgl/gl-object-get-calls-expected.txt 2011-06-30 23:24:26 UTC (rev 90180)
@@ -82,8 +82,8 @@
PASS gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_ENABLED) is false
PASS gl.getVertexAttrib(1, gl.CURRENT_VERTEX_ATTRIB) is [5, 6, 7, 8]
PASS getError was expected value: NO_ERROR :
-PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) is null
-PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) is null
+PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) is gl.NONE
+PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) is gl.NONE
PASS gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) is null
PASS getError was expected value: NO_ERROR :
PASS successfullyParsed is true
Modified: trunk/LayoutTests/fast/canvas/webgl/gl-object-get-calls.html (90179 => 90180)
--- trunk/LayoutTests/fast/canvas/webgl/gl-object-get-calls.html 2011-06-30 23:20:13 UTC (rev 90179)
+++ trunk/LayoutTests/fast/canvas/webgl/gl-object-get-calls.html 2011-06-30 23:24:26 UTC (rev 90180)
@@ -1,5 +1,7 @@
+<!DOCTYPE html>
<html>
<head>
+<meta charset="utf-8">
<link rel="stylesheet" href=""
<script src=""
<script src=""
@@ -235,9 +237,9 @@
// Test cases where name == 0
gl.deleteTexture(texture);
-shouldBeNull('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)');
+shouldBe('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)', 'gl.NONE');
gl.deleteRenderbuffer(renderbuffer);
-shouldBeNull('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)');
+shouldBe('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)', 'gl.NONE');
gl.deleteBuffer(buffer);
shouldBeNull('gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)');
glErrorShouldBe(gl, gl.NO_ERROR);
Modified: trunk/LayoutTests/fast/canvas/webgl/object-deletion-behaviour-expected.txt (90179 => 90180)
--- trunk/LayoutTests/fast/canvas/webgl/object-deletion-behaviour-expected.txt 2011-06-30 23:20:13 UTC (rev 90179)
+++ trunk/LayoutTests/fast/canvas/webgl/object-deletion-behaviour-expected.txt 2011-06-30 23:24:26 UTC (rev 90180)
@@ -33,7 +33,8 @@
PASS gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0) was expected value: NO_ERROR.
PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) is tex
PASS gl.deleteTexture(tex) was expected value: NO_ERROR.
-PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) is null
+PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) is gl.NONE
+PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) was expected value: INVALID_ENUM.
PASS gl.isTexture(tex) is false
PASS gl.getParameter(gl.TEXTURE_BINDING_2D) is null
PASS gl.bindTexture(gl.TEXTURE_2D, tex) was expected value: NO_ERROR.
@@ -52,7 +53,8 @@
PASS gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo) was expected value: NO_ERROR.
PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) is rbo
PASS gl.deleteRenderbuffer(rbo) was expected value: NO_ERROR.
-PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) is null
+PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) is gl.NONE
+PASS gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) was expected value: INVALID_ENUM.
PASS gl.isRenderbuffer(rbo) is false
PASS gl.getParameter(gl.RENDERBUFFER_BINDING) is null
PASS gl.bindRenderbuffer(gl.RENDERBUFFER, rbo) was expected value: NO_ERROR.
Modified: trunk/LayoutTests/fast/canvas/webgl/object-deletion-behaviour.html (90179 => 90180)
--- trunk/LayoutTests/fast/canvas/webgl/object-deletion-behaviour.html 2011-06-30 23:20:13 UTC (rev 90179)
+++ trunk/LayoutTests/fast/canvas/webgl/object-deletion-behaviour.html 2011-06-30 23:24:26 UTC (rev 90180)
@@ -1,5 +1,7 @@
+<!DOCTYPE html>
<html>
<head>
+<meta charset="utf-8">
<link rel="stylesheet" href=""
<script src=""
<script src=""
@@ -59,7 +61,8 @@
shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteTexture(tex)");
// Deleting a texture bound to the currently-bound fbo is the same as
// detaching the textue from fbo first, then delete the texture.
-shouldBeNull("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)");
+shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.NONE");
+shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)");
shouldBeFalse("gl.isTexture(tex)");
shouldBeNull("gl.getParameter(gl.TEXTURE_BINDING_2D)");
shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, tex)");
@@ -85,7 +88,8 @@
shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteRenderbuffer(rbo)");
// Deleting a renderbuffer bound to the currently-bound fbo is the same as
// detaching the renderbuffer from fbo first, then delete the renderbuffer.
-shouldBeNull("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)");
+shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.NONE");
+shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)");
shouldBeFalse("gl.isRenderbuffer(rbo)");
shouldBeNull("gl.getParameter(gl.RENDERBUFFER_BINDING)");
shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)");
Modified: trunk/LayoutTests/fast/canvas/webgl/program-test.html (90179 => 90180)
--- trunk/LayoutTests/fast/canvas/webgl/program-test.html 2011-06-30 23:20:13 UTC (rev 90179)
+++ trunk/LayoutTests/fast/canvas/webgl/program-test.html 2011-06-30 23:24:26 UTC (rev 90180)
@@ -1,8 +1,7 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
+<!DOCTYPE html>
<html>
<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<meta charset="utf-8">
<title>WebGL Program Compiling/Linking Conformance Test</title>
<link rel="stylesheet" href=""
<script src="" type="text/_javascript_"></script>
@@ -30,7 +29,33 @@
gl.clearColor(0.0, 0.0, 0.0, 0.0);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
+ function doArraysHaveSameContents(a, b) {
+ var flags = [];
+ function hasUnusedValue(a, value) {
+ for (var ii = 0; ii < a.length; ++ii) {
+ if (a[ii] === value && !flags[ii]) {
+ flags[ii] = true;
+ return true;
+ }
+ }
+ return false;
+ }
+ try {
+ if (a.length !== b.length) {
+ return false;
+ }
+ for (var ii = 0; ii < a.length; ii++) {
+ if (!hasUnusedValue(b, a[ii])) {
+ return false;
+ }
+ }
+ } catch (ex) {
+ return false;
+ }
+ return true;
+ }
+
/////// Check compileShader() /////////////////////////////
var vs = gl.createShader(gl.VERTEX_SHADER);
@@ -55,14 +80,14 @@
"bad vertex shader should fail to compile");
var fs = gl.createShader(gl.FRAGMENT_SHADER);
- gl.shaderSource(fs, "#ifdef GL_ES\nprecision mediump float;\n#endif\n varying vec4 vColor; void main() { gl_FragColor = vColor; }");
+ gl.shaderSource(fs, "precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor; }");
gl.compileShader(fs);
assertMsg(gl.getShaderParameter(fs, gl.COMPILE_STATUS) == true,
"good fragment shader should compile");
var fs2 = gl.createShader(gl.FRAGMENT_SHADER);
- gl.shaderSource(fs2, "#ifdef GL_ES\nprecision mediump float;\n#endif\n varying vec4 vColor; void main() { gl_FragColor = vColor * 0.5; }");
+ gl.shaderSource(fs2, "precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor * 0.5; }");
gl.compileShader(fs2);
assertMsg(gl.getShaderParameter(fs2, gl.COMPILE_STATUS) == true,
@@ -131,7 +156,7 @@
gl.detachShader(prog, shaders_to_detach[i]);
if(gl.getError() != gl.NO_ERROR)
assertMsg(false, "unexpected error in detachShader()");
- assertMsg(areArraysEqual(gl.getAttachedShaders(prog), expected_shaders), errmsg);
+ assertMsg(doArraysHaveSameContents(gl.getAttachedShaders(prog), expected_shaders), errmsg);
}
checkGetAttachedShaders([], [], [], "getAttachedShaders should return an empty list by default");
checkGetAttachedShaders([fs], [], [fs], "attaching a single shader should give the expected list");
@@ -242,7 +267,7 @@
glErrorShouldBe(gl, gl.NO_ERROR, "The current program shouldn't be deleted");
var fs3 = gl.createShader(gl.FRAGMENT_SHADER);
- gl.shaderSource(fs3, "#ifdef GL_ES\nprecision mediump float;\n#endif\n varying vec4 vColor; void main() { gl_FragColor = vColor; }");
+ gl.shaderSource(fs3, "precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor; }");
gl.compileShader(fs3);
assertMsg(gl.getShaderParameter(fs3, gl.COMPILE_STATUS) == true,
@@ -253,7 +278,7 @@
glErrorShouldBe(gl, gl.INVALID_VALUE, "an unattached shader should be deleted immediately");
fs3 = gl.createShader(gl.FRAGMENT_SHADER);
- gl.shaderSource(fs3, "#ifdef GL_ES\nprecision mediump float;\n#endif\n varying vec4 vColor; void main() { gl_FragColor = vColor; }");
+ gl.shaderSource(fs3, "precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor; }");
gl.compileShader(fs3);
assertMsg(gl.getShaderParameter(fs3, gl.COMPILE_STATUS) == true,
Modified: trunk/Source/WebCore/ChangeLog (90179 => 90180)
--- trunk/Source/WebCore/ChangeLog 2011-06-30 23:20:13 UTC (rev 90179)
+++ trunk/Source/WebCore/ChangeLog 2011-06-30 23:24:26 UTC (rev 90180)
@@ -1,3 +1,16 @@
+2011-06-30 Zhenyao Mo <z...@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:
+
2011-06-30 Rafael Brandao <rafael.l...@openbossa.org>
Reviewed by Andreas Kling.
Modified: trunk/Source/WebCore/html/canvas/WebGLObject.cpp (90179 => 90180)
--- trunk/Source/WebCore/html/canvas/WebGLObject.cpp 2011-06-30 23:20:13 UTC (rev 90179)
+++ trunk/Source/WebCore/html/canvas/WebGLObject.cpp 2011-06-30 23:24:26 UTC (rev 90180)
@@ -66,6 +66,16 @@
}
}
+void WebGLObject::detachContext()
+{
+ m_attachmentCount = 0; // Make sure OpenGL resource is deleted.
+ if (m_context) {
+ deleteObject();
+ m_context->removeObject(this);
+ m_context = 0;
+ }
}
+}
+
#endif // ENABLE(WEBGL)
Modified: trunk/Source/WebCore/html/canvas/WebGLObject.h (90179 => 90180)
--- trunk/Source/WebCore/html/canvas/WebGLObject.h 2011-06-30 23:20:13 UTC (rev 90179)
+++ trunk/Source/WebCore/html/canvas/WebGLObject.h 2011-06-30 23:24:26 UTC (rev 90180)
@@ -46,12 +46,7 @@
// FIXME: revisit this when resource sharing between contexts are implemented.
void deleteObject();
- void detachContext()
- {
- m_attachmentCount = 0; // Make sure OpenGL resource is deleted.
- deleteObject();
- m_context = 0;
- }
+ void detachContext();
WebGLRenderingContext* context() const { return m_context; }
Modified: trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp (90179 => 90180)
--- trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp 2011-06-30 23:20:13 UTC (rev 90179)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp 2011-06-30 23:24:26 UTC (rev 90180)
@@ -1918,23 +1918,15 @@
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;
}
@@ -2028,46 +2020,51 @@
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_framebufferBinding->isIncomplete(false)) {
m_context->synthesizeGLError(GraphicsContext3D::INVALID_OPERATION);
return WebGLGetInfo();
}
- if (pname != GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) {
- WebGLStateRestorer(this, false);
- GC3Dint value = 0;
- m_context->getFramebufferAttachmentParameteriv(target, attachment, pname, &value);
+ WebGLObject* object = m_framebufferBinding->getAttachment(attachment);
+ if (!object) {
if (pname == GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)
- return WebGLGetInfo(static_cast<unsigned int>(value));
- return WebGLGetInfo(value);
+ return WebGLGetInfo(GraphicsContext3D::NONE);
+ // OpenGL ES 2.0 specifies INVALID_ENUM in this case, while desktop GL
+ // specifies INVALID_OPERATION.
+ m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM);
+ return WebGLGetInfo();
}
- WebGLStateRestorer(this, false);
- GC3Dint type = 0;
- m_context->getFramebufferAttachmentParameteriv(target, attachment, GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &type);
- if (!type)
- return WebGLGetInfo();
- GC3Dint value = 0;
- m_context->getFramebufferAttachmentParameteriv(target, attachment, GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &value);
- switch (type) {
- case GraphicsContext3D::RENDERBUFFER:
- return WebGLGetInfo(PassRefPtr<WebGLRenderbuffer>(findRenderbuffer(static_cast<Platform3DObject>(value))));
- case GraphicsContext3D::TEXTURE:
- return WebGLGetInfo(PassRefPtr<WebGLTexture>(findTexture(static_cast<Platform3DObject>(value))));
- default:
- // FIXME: raise exception?
- return WebGLGetInfo();
+ ASSERT(object->isTexture() || object->isRenderbuffer());
+ if (object->isTexture()) {
+ switch (pname) {
+ case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
+ return WebGLGetInfo(GraphicsContext3D::TEXTURE);
+ case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
+ return WebGLGetInfo(PassRefPtr<WebGLTexture>(reinterpret_cast<WebGLTexture*>(object)));
+ case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
+ case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
+ {
+ WebGLStateRestorer(this, false);
+ GC3Dint value = 0;
+ m_context->getFramebufferAttachmentParameteriv(target, attachment, pname, &value);
+ return WebGLGetInfo(value);
+ }
+ default:
+ m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM);
+ return WebGLGetInfo();
+ }
+ } else {
+ switch (pname) {
+ case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
+ return WebGLGetInfo(GraphicsContext3D::RENDERBUFFER);
+ case GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
+ return WebGLGetInfo(PassRefPtr<WebGLRenderbuffer>(reinterpret_cast<WebGLRenderbuffer*>(object)));
+ default:
+ m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM);
+ return WebGLGetInfo();
+ }
}
}
@@ -3991,61 +3988,12 @@
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)
{
GC3Dboolean value = 0;
Modified: trunk/Source/WebCore/html/canvas/WebGLRenderingContext.h (90179 => 90180)
--- trunk/Source/WebCore/html/canvas/WebGLRenderingContext.h 2011-06-30 23:20:13 UTC (rev 90179)
+++ trunk/Source/WebCore/html/canvas/WebGLRenderingContext.h 2011-06-30 23:24:26 UTC (rev 90180)
@@ -306,10 +306,6 @@
void addObject(WebGLObject*);
void detachAndRemoveAllObjects();
- WebGLTexture* findTexture(Platform3DObject);
- WebGLRenderbuffer* findRenderbuffer(Platform3DObject);
- WebGLBuffer* findBuffer(Platform3DObject);
- WebGLShader* findShader(Platform3DObject);
void markContextChanged();
void cleanupAfterGraphicsCall(bool changed)
@@ -364,7 +360,7 @@
bool m_needsUpdate;
bool m_markedCanvasDirty;
- HashSet<RefPtr<WebGLObject> > m_canvasObjects;
+ HashSet<WebGLObject*> m_canvasObjects;
// List of bound VBO's. Used to maintain info about sizes for ARRAY_BUFFER and stored values for ELEMENT_ARRAY_BUFFER
RefPtr<WebGLBuffer> m_boundArrayBuffer;