2010-06-18 Zhenyao Mo <zmo@google.com>
authoreric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 18 Jun 2010 15:14:10 +0000 (15:14 +0000)
committereric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 18 Jun 2010 15:14:10 +0000 (15:14 +0000)
        Reviewed by Dimitri Glazkov.

        Fix WebGLRenderingContext helper functions find{Texture/Renderbuffer/Buffer}
        https://bugs.webkit.org/show_bug.cgi?id=40176

        * fast/canvas/webgl/gl-object-get-calls-expected.txt: Test name == 0 cases, and test getVertexAttrib return original WebGLBuffer object.
        * fast/canvas/webgl/script-tests/gl-object-get-calls.js: Ditto.
2010-06-18  Zhenyao Mo  <zmo@google.com>

        Reviewed by Dimitri Glazkov.

        Fix WebGLRenderingContext helper functions find{Texture/Renderbuffer/Buffer}
        https://bugs.webkit.org/show_bug.cgi?id=40176

        * html/canvas/WebGLBuffer.cpp: Remove constructor with existing name.
        * html/canvas/WebGLBuffer.h: Ditto.
        * html/canvas/WebGLRenderingContext.cpp:
        (WebCore::WebGLRenderingContext::getVertexAttrib): Use findBuffer instead of creating a new WebGLBuffer.
        (WebCore::WebGLRenderingContext::findTexture): Deal with name == 0 case and return raw pointer.
        (WebCore::WebGLRenderingContext::findRenderbuffer): Ditto.
        (WebCore::WebGLRenderingContext::findBuffer): Find WebGLBuffer object using given name.
        * html/canvas/WebGLRenderingContext.h: Add findBuffer function declaration, change return type to raw pointer.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@61406 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/canvas/webgl/gl-object-get-calls-expected.txt
LayoutTests/fast/canvas/webgl/script-tests/gl-object-get-calls.js
WebCore/ChangeLog
WebCore/html/canvas/WebGLBuffer.cpp
WebCore/html/canvas/WebGLBuffer.h
WebCore/html/canvas/WebGLRenderingContext.cpp
WebCore/html/canvas/WebGLRenderingContext.h

index 9aa0dc259c9564158519de2b884824c29331a3b0..90011e00d1f04d4f04c676fc7aa5184f05bc27d0 100644 (file)
@@ -1,3 +1,13 @@
+2010-06-18  Zhenyao Mo  <zmo@google.com>
+
+        Reviewed by Dimitri Glazkov.
+
+        Fix WebGLRenderingContext helper functions find{Texture/Renderbuffer/Buffer}
+        https://bugs.webkit.org/show_bug.cgi?id=40176
+
+        * fast/canvas/webgl/gl-object-get-calls-expected.txt: Test name == 0 cases, and test getVertexAttrib return original WebGLBuffer object.
+        * fast/canvas/webgl/script-tests/gl-object-get-calls.js: Ditto.
+
 2010-06-18  Tony Gentilcore  <tonyg@chromium.org>
 
         Reviewed by David Levin.
index 2254d73920dc5dda2f4f6158c78515ff0bfe59b5..3bf6e35f839431b54bbf86542604c7a5a9a855d7 100644 (file)
@@ -69,7 +69,7 @@ PASS gl.getError() is 0
 PASS gl.getUniform(matProgram, mval2Loc) is [1, 2, 3, 4]
 PASS gl.getUniform(matProgram, mval3Loc) is [5, 6, 7, 8, 9, 10, 11, 12, 13]
 PASS gl.getUniform(matProgram, mval4Loc) is [14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
-PASS gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) is non-null.
+PASS gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) is buffer
 PASS gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_ENABLED) is true
 PASS gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_SIZE) is 4
 PASS (gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_STRIDE) == 0) || (gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_STRIDE) == 4 * gl.sizeInBytes(gl.FLOAT)) is true
@@ -78,6 +78,10 @@ PASS gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_NORMALIZED) is false
 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 gl.getError() is 0
+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.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) is null
+PASS gl.getError() is 0
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 6a3ee3c0b5270e43d46b7abdf15fbc8fff409aae..89d56b534112a1bf61949adba24ae295149cd2c5 100644 (file)
@@ -192,7 +192,7 @@ gl.bufferData(gl.ARRAY_BUFFER, array, gl.DYNAMIC_DRAW);
 // 1 for these tests instead.
 gl.enableVertexAttribArray(1);
 gl.vertexAttribPointer(1, 4, gl.FLOAT, false, 0, 0);
-shouldBeNonNull('gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)');
+shouldBe('gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)', 'buffer');
 shouldBe('gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_ENABLED)', 'true');
 shouldBe('gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_SIZE)', '4');
 shouldBe('(gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_STRIDE) == 0) || (gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_STRIDE) == 4 * gl.sizeInBytes(gl.FLOAT))', 'true');
@@ -204,4 +204,13 @@ gl.vertexAttrib4f(1, 5, 6, 7, 8);
 shouldBe('gl.getVertexAttrib(1, gl.CURRENT_VERTEX_ATTRIB)', '[5, 6, 7, 8]');
 shouldBe('gl.getError()', '0');
 
+// Test cases where name == 0
+gl.deleteTexture(texture);
+shouldBeNull('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)');
+gl.deleteRenderbuffer(renderbuffer);
+shouldBeNull('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)');
+gl.deleteBuffer(buffer);
+shouldBeNull('gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)');
+shouldBe('gl.getError()', '0');
+
 successfullyParsed = true;
index 249535f4433f9ac976654f94fe5f0b258f3d2bd3..4e515dc13082a9915d78f32ba36ccdf35e6acce6 100644 (file)
@@ -1,3 +1,19 @@
+2010-06-18  Zhenyao Mo  <zmo@google.com>
+
+        Reviewed by Dimitri Glazkov.
+
+        Fix WebGLRenderingContext helper functions find{Texture/Renderbuffer/Buffer}
+        https://bugs.webkit.org/show_bug.cgi?id=40176
+
+        * html/canvas/WebGLBuffer.cpp: Remove constructor with existing name.
+        * html/canvas/WebGLBuffer.h: Ditto.
+        * html/canvas/WebGLRenderingContext.cpp:
+        (WebCore::WebGLRenderingContext::getVertexAttrib): Use findBuffer instead of creating a new WebGLBuffer.
+        (WebCore::WebGLRenderingContext::findTexture): Deal with name == 0 case and return raw pointer.
+        (WebCore::WebGLRenderingContext::findRenderbuffer): Ditto.
+        (WebCore::WebGLRenderingContext::findBuffer): Find WebGLBuffer object using given name.
+        * html/canvas/WebGLRenderingContext.h: Add findBuffer function declaration, change return type to raw pointer.
+
 2010-06-18  Tony Gentilcore  <tonyg@chromium.org>
 
         Reviewed by David Levin.
index 192967ed89386e29107f5ec789b700abb702b809..8790b1af2002aeec5205673afba0e624e538d856 100644 (file)
@@ -37,11 +37,6 @@ PassRefPtr<WebGLBuffer> WebGLBuffer::create(WebGLRenderingContext* ctx)
     return adoptRef(new WebGLBuffer(ctx));
 }
 
-PassRefPtr<WebGLBuffer> WebGLBuffer::create(WebGLRenderingContext* ctx, Platform3DObject obj)
-{
-    return adoptRef(new WebGLBuffer(ctx, obj));
-}
-
 WebGLBuffer::WebGLBuffer(WebGLRenderingContext* ctx)
     : CanvasObject(ctx)
     , m_elementArrayBufferByteLength(0)
@@ -52,14 +47,6 @@ WebGLBuffer::WebGLBuffer(WebGLRenderingContext* ctx)
     clearCachedMaxIndices();
 }
 
-WebGLBuffer::WebGLBuffer(WebGLRenderingContext* ctx, Platform3DObject obj)
-    : CanvasObject(ctx)
-    , m_nextAvailableCacheEntry(0)
-{
-    setObject(obj, false);
-    clearCachedMaxIndices();
-}
-
 void WebGLBuffer::_deleteObject(Platform3DObject object)
 {
     context()->graphicsContext3D()->deleteBuffer(object);
index feaadbb67860de89cff594c0905711258d920e71..bd9f1905e64b6bc7167f693b9b0428f54ece28c5 100644 (file)
@@ -39,10 +39,6 @@ namespace WebCore {
         virtual ~WebGLBuffer() { deleteObject(); }
         
         static PassRefPtr<WebGLBuffer> create(WebGLRenderingContext*);
-        
-        // For querying previously created objects via e.g. getFramebufferAttachmentParameter
-        // FIXME: should consider canonicalizing these objects
-        static PassRefPtr<WebGLBuffer> create(WebGLRenderingContext*, Platform3DObject);
 
         bool associateBufferData(unsigned long target, int size);
         bool associateBufferData(unsigned long target, ArrayBufferView* array);
@@ -59,8 +55,7 @@ namespace WebCore {
 
     protected:
         WebGLBuffer(WebGLRenderingContext*);
-        WebGLBuffer(WebGLRenderingContext*, Platform3DObject obj);
-        
+
         virtual void _deleteObject(Platform3DObject o);
     
     private:
index 6d01547fed8d2e715109fcf0bfd909e0e8e47a98..30b6bdb011a0e5125368b912c1bb37a912de0849 100644 (file)
@@ -1116,9 +1116,9 @@ WebGLGetInfo WebGLRenderingContext::getFramebufferAttachmentParameter(unsigned l
         m_context->getFramebufferAttachmentParameteriv(target, attachment, GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &value);
         switch (type) {
         case GraphicsContext3D::RENDERBUFFER:
-            return WebGLGetInfo(findRenderbuffer(static_cast<Platform3DObject>(value)));
+            return WebGLGetInfo(PassRefPtr<WebGLRenderbuffer>(findRenderbuffer(static_cast<Platform3DObject>(value))));
         case GraphicsContext3D::TEXTURE:
-            return WebGLGetInfo(findTexture(static_cast<Platform3DObject>(value)));
+            return WebGLGetInfo(PassRefPtr<WebGLTexture>(findTexture(static_cast<Platform3DObject>(value))));
         default:
             // FIXME: raise exception?
             return WebGLGetInfo();
@@ -1601,11 +1601,7 @@ WebGLGetInfo WebGLRenderingContext::getVertexAttrib(unsigned long index, unsigne
     case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: {
         int name = 0;
         m_context->getVertexAttribiv(index, pname, &name);
-        if (name == 0)
-            return WebGLGetInfo();
-        RefPtr<WebGLBuffer> tmp = WebGLBuffer::create(this, name);
-        addObject(tmp.get());
-        return WebGLGetInfo(PassRefPtr<WebGLBuffer>(tmp));
+        return WebGLGetInfo(PassRefPtr<WebGLBuffer>(findBuffer(static_cast<Platform3DObject>(name))));
     }
     case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_ENABLED:
     case GraphicsContext3D::VERTEX_ATTRIB_ARRAY_NORMALIZED: {
@@ -3140,26 +3136,38 @@ void WebGLRenderingContext::detachAndRemoveAllObjects()
     m_canvasObjects.clear();
 }
 
-PassRefPtr<WebGLTexture> WebGLRenderingContext::findTexture(Platform3DObject obj)
+WebGLTexture* WebGLRenderingContext::findTexture(Platform3DObject obj)
 {
+    if (!obj)
+        return 0;
     HashSet<RefPtr<CanvasObject> >::iterator pend = m_canvasObjects.end();
     for (HashSet<RefPtr<CanvasObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) {
-        if ((*it)->isTexture() && (*it)->object() == obj) {
-            RefPtr<WebGLTexture> tex = reinterpret_cast<WebGLTexture*>((*it).get());
-            return tex.release();
-        }
+        if ((*it)->isTexture() && (*it)->object() == obj)
+            return reinterpret_cast<WebGLTexture*>((*it).get());
     }
     return 0;
 }
 
-PassRefPtr<WebGLRenderbuffer> WebGLRenderingContext::findRenderbuffer(Platform3DObject obj)
+WebGLRenderbuffer* WebGLRenderingContext::findRenderbuffer(Platform3DObject obj)
 {
+    if (!obj)
+        return 0;
     HashSet<RefPtr<CanvasObject> >::iterator pend = m_canvasObjects.end();
     for (HashSet<RefPtr<CanvasObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) {
-        if ((*it)->isRenderbuffer() && (*it)->object() == obj) {
-            RefPtr<WebGLRenderbuffer> buffer = reinterpret_cast<WebGLRenderbuffer*>((*it).get());
-            return buffer.release();
-        }
+        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<CanvasObject> >::iterator pend = m_canvasObjects.end();
+    for (HashSet<RefPtr<CanvasObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) {
+        if ((*it)->isBuffer() && (*it)->object() == obj)
+            return reinterpret_cast<WebGLBuffer*>((*it).get());
     }
     return 0;
 }
index 0122dfd0e91c00069b8f049d0b88f888b11946f3..d05d60bbf357393eb5b7406d4b0a8eec65034a55 100644 (file)
@@ -315,8 +315,9 @@ class WebKitCSSMatrix;
 
         void addObject(CanvasObject*);
         void detachAndRemoveAllObjects();
-        PassRefPtr<WebGLTexture> findTexture(Platform3DObject);
-        PassRefPtr<WebGLRenderbuffer> findRenderbuffer(Platform3DObject);
+        WebGLTexture* findTexture(Platform3DObject);
+        WebGLRenderbuffer* findRenderbuffer(Platform3DObject);
+        WebGLBuffer* findBuffer(Platform3DObject);
 
         void markContextChanged();
         void cleanupAfterGraphicsCall(bool changed)