[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

zmo at google.com zmo at google.com
Wed Dec 22 15:29:37 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit e305a676573d5468617115905255b4c7bd7203c8
Author: zmo at google.com <zmo at google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Nov 4 23:57:44 2010 +0000

    2010-11-03  Zhenyao Mo  <zmo at google.com>
    
            Reviewed by Kenneth Russell.
    
            renderbufferStorage(DEPTH_STENCIL) shouldn't generate an error
            https://bugs.webkit.org/show_bug.cgi?id=48891
    
            * html/canvas/WebGLFramebuffer.cpp:
            (WebCore::WebGLFramebuffer::isIncomplete): Considering the case where DEPTH_STENCIL is not supported.
            * html/canvas/WebGLRenderbuffer.cpp:
            (WebCore::WebGLRenderbuffer::WebGLRenderbuffer): Init added members.
            * html/canvas/WebGLRenderbuffer.h: Add members and accessor functions.
            (WebCore::WebGLRenderbuffer::setInternalFormat):
            (WebCore::WebGLRenderbuffer::setSize):
            (WebCore::WebGLRenderbuffer::getWidth):
            (WebCore::WebGLRenderbuffer::getHeight):
            (WebCore::WebGLRenderbuffer::setIsValid):
            (WebCore::WebGLRenderbuffer::isValid):
            * html/canvas/WebGLRenderingContext.cpp:
            (WebCore::WebGLRenderingContext::initializeNewContext): Check if packed_depth_stencil extension exists.
            (WebCore::WebGLRenderingContext::getRenderbufferParameter): Simulate the case for DEPTH_STENCIL where packed_depth_stencil is not supported.
            (WebCore::WebGLRenderingContext::renderbufferStorage): Bypass the call if packed_depth_stencil is not supported.
            * html/canvas/WebGLRenderingContext.h:
    2010-11-03  Zhenyao Mo  <zmo at google.com>
    
            Reviewed by Kenneth Russell.
    
            renderbufferStorage(DEPTH_STENCIL) shouldn't generate an error
            https://bugs.webkit.org/show_bug.cgi?id=48891
    
            * fast/canvas/webgl/framebuffer-object-attachment-expected.txt:
            * fast/canvas/webgl/framebuffer-object-attachment.html: Add the test cases for DEPTH_STENCIL renderbuffer.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@71367 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 9e8ef90..ceb581f 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,13 @@
+2010-11-03  Zhenyao Mo  <zmo at google.com>
+
+        Reviewed by Kenneth Russell.
+
+        renderbufferStorage(DEPTH_STENCIL) shouldn't generate an error
+        https://bugs.webkit.org/show_bug.cgi?id=48891
+
+        * fast/canvas/webgl/framebuffer-object-attachment-expected.txt:
+        * fast/canvas/webgl/framebuffer-object-attachment.html: Add the test cases for DEPTH_STENCIL renderbuffer.
+
 2010-11-04  Brian Weinstein  <bweinstein at apple.com>
 
         Rubber-stamped by Jon Honeycutt.
diff --git a/LayoutTests/fast/canvas/webgl/framebuffer-object-attachment-expected.txt b/LayoutTests/fast/canvas/webgl/framebuffer-object-attachment-expected.txt
index 96ffeba..9b1432c 100644
--- a/LayoutTests/fast/canvas/webgl/framebuffer-object-attachment-expected.txt
+++ b/LayoutTests/fast/canvas/webgl/framebuffer-object-attachment-expected.txt
@@ -5,103 +5,118 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 Create renderbuffers
 PASS gl = create3DContext() is non-null.
 PASS colorBuffer = gl.createRenderbuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 PASS depthBuffer = gl.createRenderbuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 PASS stencilBuffer = gl.createRenderbuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 PASS depthStencilBuffer = gl.createRenderbuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 Attach depth using DEPTH_ATTACHMENT
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 Attach depth using STENCIL_ATTACHMENT
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
-PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
-PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
+PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : 
+PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : 
 Attach depth using DEPTH_STENCIL_ATTACHMENT
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
-PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
-PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
+PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : 
+PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : 
 Attach stencil using STENCIL_ATTACHMENT
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 Attach stencil using DEPTH_ATTACHMENT
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
-PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
-PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
+PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : 
+PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : 
 Attach stencil using DEPTH_STENCIL_ATTACHMENT
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
-PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
-PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
+PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : 
+PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : 
 Attach depthStencil using DEPTH_STENCIL_ATTACHMENT
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 Attach depthStencil using DEPTH_ATTACHMENT
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
-PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
-PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
+PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : 
+PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : 
 Attach depthStencil using STENCIL_ATTACHMENT
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
-PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
-PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
+PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : 
+PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : 
 Attach depth, then stencil, causing conflict
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
+PASS getError was expected value: NO_ERROR : 
 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
 Attach stencil, then depth, causing conflict
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
+PASS getError was expected value: NO_ERROR : 
 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
 Attach depth, then depthStencil, causing conflict
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
+PASS getError was expected value: NO_ERROR : 
 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
 Attach depthStencil, then depth, causing conflict
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
+PASS getError was expected value: NO_ERROR : 
 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
 Attach stencil, then depthStencil, causing conflict
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
+PASS getError was expected value: NO_ERROR : 
 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
 Attach depthStencil, then stencil, causing conflict
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
+PASS getError was expected value: NO_ERROR : 
 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
 Attach color renderbuffer with internalformat == RGBA4
 PASS colorBuffer = gl.createRenderbuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 Attach color renderbuffer with internalformat == RGB5_A1
 PASS colorBuffer = gl.createRenderbuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 Attach color renderbuffer with internalformat == RGB565
 PASS colorBuffer = gl.createRenderbuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
 PASS fbo = gl.createFramebuffer() is non-null.
-PASS gl.getError() is gl.NO_ERROR
+PASS getError was expected value: NO_ERROR : 
+Create and attach depthStencil renderbuffer
+PASS depthStencilBuffer = gl.createRenderbuffer() is non-null.
+PASS getError was expected value: NO_ERROR : 
+PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_WIDTH) is width
+PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_HEIGHT) is height
+PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_INTERNAL_FORMAT) is gl.DEPTH_STENCIL
+PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_RED_SIZE) is 0
+PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_GREEN_SIZE) is 0
+PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_BLUE_SIZE) is 0
+PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_ALPHA_SIZE) is 0
+PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_DEPTH_SIZE) > 0 is true
+PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_STENCIL_SIZE) > 0 is true
+PASS getError was expected value: NO_ERROR : 
+PASS fbo = gl.createFramebuffer() is non-null.
+PASS getError was expected value: NO_ERROR : 
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/LayoutTests/fast/canvas/webgl/framebuffer-object-attachment.html b/LayoutTests/fast/canvas/webgl/framebuffer-object-attachment.html
index a7da17e..19e6037 100644
--- a/LayoutTests/fast/canvas/webgl/framebuffer-object-attachment.html
+++ b/LayoutTests/fast/canvas/webgl/framebuffer-object-attachment.html
@@ -25,13 +25,13 @@ function testAttachment(attachment, buffer, isConflicted)
     gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
     gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorBuffer);
     gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, buffer);
-    shouldBe("gl.getError()", "gl.NO_ERROR");
+    glErrorShouldBe(gl, gl.NO_ERROR);
     if (isConflicted) {
         shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_UNSUPPORTED");
         gl.clear(gl.COLOR_BUFFER_BIT);
-        shouldBe("gl.getError()", "gl.INVALID_FRAMEBUFFER_OPERATION");
+        glErrorShouldBe(gl, gl.INVALID_FRAMEBUFFER_OPERATION);
         gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(width * height * 4));
-        shouldBe("gl.getError()", "gl.INVALID_FRAMEBUFFER_OPERATION");
+        glErrorShouldBe(gl, gl.INVALID_FRAMEBUFFER_OPERATION);
     }
 }
 
@@ -41,9 +41,9 @@ function testAttachments(attachment0, buffer0, attachment1, buffer1, isConflicte
     gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
     gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorBuffer);
     gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment0, gl.RENDERBUFFER, buffer0);
-    shouldBe("gl.getError()", "gl.NO_ERROR");
+    glErrorShouldBe(gl, gl.NO_ERROR);
     gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment1, gl.RENDERBUFFER, buffer1);
-    shouldBe("gl.getError()", "gl.NO_ERROR");
+    glErrorShouldBe(gl, gl.NO_ERROR);
     if (isConflicted)
         shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_UNSUPPORTED");
 }
@@ -53,10 +53,29 @@ function testColorRenderbuffer(internalformat)
     shouldBeNonNull("colorBuffer = gl.createRenderbuffer()");
     gl.bindRenderbuffer(gl.RENDERBUFFER, colorBuffer);
     gl.renderbufferStorage(gl.RENDERBUFFER, internalformat, width, height);
-    shouldBe("gl.getError()", "gl.NO_ERROR");
+    glErrorShouldBe(gl, gl.NO_ERROR);
     testAttachment(gl.COLOR_ATTACHMENT0, colorBuffer, false);
 }
 
+function testDepthStencilRenderbuffer()
+{
+    shouldBeNonNull("depthStencilBuffer = gl.createRenderbuffer()");
+    gl.bindRenderbuffer(gl.RENDERBUFFER, depthStencilBuffer);
+    gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height);
+    glErrorShouldBe(gl, gl.NO_ERROR);
+    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_WIDTH)", "width");
+    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_HEIGHT)", "height");
+    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_INTERNAL_FORMAT)", "gl.DEPTH_STENCIL");
+    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_RED_SIZE)", "0");
+    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_GREEN_SIZE)", "0");
+    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_BLUE_SIZE)", "0");
+    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_ALPHA_SIZE)", "0");
+    shouldBeTrue("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_DEPTH_SIZE) > 0");
+    shouldBeTrue("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_STENCIL_SIZE) > 0");
+    glErrorShouldBe(gl, gl.NO_ERROR);
+    testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, false);
+}
+
 description("Test framebuffer object attachment behaviors");
 
 debug("Create renderbuffers");
@@ -64,19 +83,19 @@ shouldBeNonNull("gl = create3DContext()");
 shouldBeNonNull("colorBuffer = gl.createRenderbuffer()");
 gl.bindRenderbuffer(gl.RENDERBUFFER, colorBuffer);
 gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, width, height);
-shouldBe("gl.getError()", "gl.NO_ERROR");
+glErrorShouldBe(gl, gl.NO_ERROR);
 shouldBeNonNull("depthBuffer = gl.createRenderbuffer()");
 gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer);
 gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height);
-shouldBe("gl.getError()", "gl.NO_ERROR");
+glErrorShouldBe(gl, gl.NO_ERROR);
 shouldBeNonNull("stencilBuffer = gl.createRenderbuffer()");
 gl.bindRenderbuffer(gl.RENDERBUFFER, stencilBuffer);
 gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8, width, height);
-shouldBe("gl.getError()", "gl.NO_ERROR");
+glErrorShouldBe(gl, gl.NO_ERROR);
 shouldBeNonNull("depthStencilBuffer = gl.createRenderbuffer()");
 gl.bindRenderbuffer(gl.RENDERBUFFER, depthStencilBuffer);
 gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height);
-shouldBe("gl.getError()", "gl.NO_ERROR");
+glErrorShouldBe(gl, gl.NO_ERROR);
 
 debug("Attach depth using DEPTH_ATTACHMENT");
 testAttachment(gl.DEPTH_ATTACHMENT, depthBuffer, false);
@@ -119,6 +138,9 @@ testColorRenderbuffer(gl.RGB5_A1);
 debug("Attach color renderbuffer with internalformat == RGB565");
 testColorRenderbuffer(gl.RGB565);
 
+debug("Create and attach depthStencil renderbuffer");
+testDepthStencilRenderbuffer();
+
 successfullyParsed = true;
 </script>
 
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 208d9ef..8387935 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,27 @@
+2010-11-03  Zhenyao Mo  <zmo at google.com>
+
+        Reviewed by Kenneth Russell.
+
+        renderbufferStorage(DEPTH_STENCIL) shouldn't generate an error
+        https://bugs.webkit.org/show_bug.cgi?id=48891
+
+        * html/canvas/WebGLFramebuffer.cpp:
+        (WebCore::WebGLFramebuffer::isIncomplete): Considering the case where DEPTH_STENCIL is not supported.
+        * html/canvas/WebGLRenderbuffer.cpp:
+        (WebCore::WebGLRenderbuffer::WebGLRenderbuffer): Init added members.
+        * html/canvas/WebGLRenderbuffer.h: Add members and accessor functions.
+        (WebCore::WebGLRenderbuffer::setInternalFormat): 
+        (WebCore::WebGLRenderbuffer::setSize):
+        (WebCore::WebGLRenderbuffer::getWidth):
+        (WebCore::WebGLRenderbuffer::getHeight):
+        (WebCore::WebGLRenderbuffer::setIsValid):
+        (WebCore::WebGLRenderbuffer::isValid):
+        * html/canvas/WebGLRenderingContext.cpp:
+        (WebCore::WebGLRenderingContext::initializeNewContext): Check if packed_depth_stencil extension exists.
+        (WebCore::WebGLRenderingContext::getRenderbufferParameter): Simulate the case for DEPTH_STENCIL where packed_depth_stencil is not supported.
+        (WebCore::WebGLRenderingContext::renderbufferStorage): Bypass the call if packed_depth_stencil is not supported.
+        * html/canvas/WebGLRenderingContext.h:
+
 2010-11-04  Kavita Kanetkar  <kkanetkar at chromium.org>
 
         Reviewed by Adam Barth.
diff --git a/WebCore/html/canvas/WebGLFramebuffer.cpp b/WebCore/html/canvas/WebGLFramebuffer.cpp
index 787b181..76a4675 100644
--- a/WebCore/html/canvas/WebGLFramebuffer.cpp
+++ b/WebCore/html/canvas/WebGLFramebuffer.cpp
@@ -57,6 +57,15 @@ namespace {
             (reinterpret_cast<WebGLRenderbuffer*>(attachedObject))->setInitialized();
     }
 
+    bool isValid(WebGLObject* attachedObject)
+    {
+        if (attachedObject && attachedObject->object() && attachedObject->isRenderbuffer()) {
+            if (!(reinterpret_cast<WebGLRenderbuffer*>(attachedObject))->isValid())
+                return false;
+        }
+        return true;
+    }
+
 } // anonymous namespace
 
 PassRefPtr<WebGLFramebuffer> WebGLFramebuffer::create(WebGLRenderingContext* ctx)
@@ -142,7 +151,8 @@ bool WebGLFramebuffer::isIncomplete() const
         count++;
     }
     if (isDepthStencilAttached()) {
-        if (getInternalFormat(m_depthStencilAttachment.get()) != GraphicsContext3D::DEPTH_STENCIL)
+        if (getInternalFormat(m_depthStencilAttachment.get()) != GraphicsContext3D::DEPTH_STENCIL
+            || !isValid(m_depthStencilAttachment.get()))
             return true;
         count++;
     }
diff --git a/WebCore/html/canvas/WebGLRenderbuffer.cpp b/WebCore/html/canvas/WebGLRenderbuffer.cpp
index 4772873..b9efd47 100644
--- a/WebCore/html/canvas/WebGLRenderbuffer.cpp
+++ b/WebCore/html/canvas/WebGLRenderbuffer.cpp
@@ -42,6 +42,9 @@ WebGLRenderbuffer::WebGLRenderbuffer(WebGLRenderingContext* ctx)
     : WebGLObject(ctx)
     , m_internalFormat(GraphicsContext3D::RGBA4)
     , m_initialized(false)
+    , m_width(0)
+    , m_height(0)
+    , m_isValid(true)
 {
     setObject(context()->graphicsContext3D()->createRenderbuffer());
 }
diff --git a/WebCore/html/canvas/WebGLRenderbuffer.h b/WebCore/html/canvas/WebGLRenderbuffer.h
index cfa26d3..9a23ca5 100644
--- a/WebCore/html/canvas/WebGLRenderbuffer.h
+++ b/WebCore/html/canvas/WebGLRenderbuffer.h
@@ -44,9 +44,19 @@ public:
         m_internalFormat = internalformat;
         m_initialized = false;
     }
-
     unsigned long getInternalFormat() const { return m_internalFormat; }
 
+    void setSize(unsigned long width, unsigned long height)
+    {
+        m_width = width;
+        m_height = height;
+    }
+    unsigned long getWidth() const { return m_width; }
+    unsigned long getHeight() const { return m_height; }
+
+    void setIsValid(bool isValid) { m_isValid = isValid; }
+    bool isValid() const { return m_isValid; }
+
     bool isInitialized() const { return m_initialized; }
     void setInitialized() { m_initialized = true; }
 
@@ -60,6 +70,8 @@ private:
 
     unsigned long m_internalFormat;
     bool m_initialized;
+    unsigned long m_width, m_height;
+    bool m_isValid; // This is only false if internalFormat is DEPTH_STENCIL and packed_depth_stencil is not supported.
 };
 
 } // namespace WebCore
diff --git a/WebCore/html/canvas/WebGLRenderingContext.cpp b/WebCore/html/canvas/WebGLRenderingContext.cpp
index f53f009..5936fe7 100644
--- a/WebCore/html/canvas/WebGLRenderingContext.cpp
+++ b/WebCore/html/canvas/WebGLRenderingContext.cpp
@@ -34,6 +34,7 @@
 #include "CheckedInt.h"
 #include "Console.h"
 #include "DOMWindow.h"
+#include "Extensions3D.h"
 #include "FrameView.h"
 #include "HTMLCanvasElement.h"
 #include "HTMLImageElement.h"
@@ -155,6 +156,12 @@ void WebGLRenderingContext::initializeNewContext()
         createFallbackBlackTextures1x1();
     if (!isGLES2Compliant())
         initVertexAttrib0();
+
+    if (isGLES2Compliant())
+        m_isDepthStencilSupported = m_context->getExtensions()->supports("GL_OES_packed_depth_stencil");
+    else
+        m_isDepthStencilSupported = m_context->getExtensions()->supports("GL_EXT_packed_depth_stencil");
+
     m_context->reshape(canvas()->width(), canvas()->height());
     m_context->viewport(0, 0, canvas()->width(), canvas()->height());
 }
@@ -1651,6 +1658,42 @@ WebGLGetInfo WebGLRenderingContext::getRenderbufferParameter(unsigned long targe
         m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM);
         return WebGLGetInfo();
     }
+    if (!m_renderbufferBinding || !m_renderbufferBinding->object()) {
+        m_context->synthesizeGLError(GraphicsContext3D::INVALID_OPERATION);
+        return WebGLGetInfo();
+    }
+
+    if (m_renderbufferBinding->getInternalFormat() == GraphicsContext3D::DEPTH_STENCIL
+        && !m_renderbufferBinding->isValid()) {
+        ASSERT(!m_isDepthStencilSupported);
+        long value = 0;
+        switch (pname) {
+        case GraphicsContext3D::RENDERBUFFER_WIDTH:
+            value = static_cast<long>(m_renderbufferBinding->getWidth());
+            break;
+        case GraphicsContext3D::RENDERBUFFER_HEIGHT:
+            value = static_cast<long>(m_renderbufferBinding->getHeight());
+            break;
+        case GraphicsContext3D::RENDERBUFFER_RED_SIZE:
+        case GraphicsContext3D::RENDERBUFFER_GREEN_SIZE:
+        case GraphicsContext3D::RENDERBUFFER_BLUE_SIZE:
+        case GraphicsContext3D::RENDERBUFFER_ALPHA_SIZE:
+            value = 0;
+            break;
+        case GraphicsContext3D::RENDERBUFFER_DEPTH_SIZE:
+            value = 24;
+            break;
+        case GraphicsContext3D::RENDERBUFFER_STENCIL_SIZE:
+            value = 8;
+            break;
+        case GraphicsContext3D::RENDERBUFFER_INTERNAL_FORMAT:
+            return WebGLGetInfo(m_renderbufferBinding->getInternalFormat());
+        default:
+            m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM);
+            return WebGLGetInfo();
+        }
+        return WebGLGetInfo(value);
+    }
 
     WebGLStateRestorer(this, false);
     int value = 0;
@@ -1666,10 +1709,6 @@ WebGLGetInfo WebGLRenderingContext::getRenderbufferParameter(unsigned long targe
         m_context->getRenderbufferParameteriv(target, pname, &value);
         return WebGLGetInfo(static_cast<long>(value));
     case GraphicsContext3D::RENDERBUFFER_INTERNAL_FORMAT:
-        if (!m_renderbufferBinding) {
-            m_context->synthesizeGLError(GraphicsContext3D::INVALID_OPERATION);
-            return WebGLGetInfo();
-        }
         return WebGLGetInfo(m_renderbufferBinding->getInternalFormat());
     default:
         m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM);
@@ -2184,18 +2223,34 @@ void WebGLRenderingContext::renderbufferStorage(unsigned long target, unsigned l
 {
     if (isContextLost())
         return;
+    if (target != GraphicsContext3D::RENDERBUFFER) {
+        m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM);
+        return;
+    }
+    if (!m_renderbufferBinding || !m_renderbufferBinding->object()) {
+        m_context->synthesizeGLError(GraphicsContext3D::INVALID_OPERATION);
+        return;
+    }
     switch (internalformat) {
     case GraphicsContext3D::DEPTH_COMPONENT16:
     case GraphicsContext3D::RGBA4:
     case GraphicsContext3D::RGB5_A1:
     case GraphicsContext3D::RGB565:
     case GraphicsContext3D::STENCIL_INDEX8:
-    case GraphicsContext3D::DEPTH_STENCIL:
         m_context->renderbufferStorage(target, internalformat, width, height);
-        if (m_renderbufferBinding)
-            m_renderbufferBinding->setInternalFormat(internalformat);
+        m_renderbufferBinding->setInternalFormat(internalformat);
+        m_renderbufferBinding->setIsValid(true);
         cleanupAfterGraphicsCall(false);
         break;
+    case GraphicsContext3D::DEPTH_STENCIL:
+        if (m_isDepthStencilSupported) {
+            m_context->renderbufferStorage(target, internalformat, width, height);
+            cleanupAfterGraphicsCall(false);
+        } else
+            m_renderbufferBinding->setSize(width, height);
+        m_renderbufferBinding->setIsValid(m_isDepthStencilSupported);
+        m_renderbufferBinding->setInternalFormat(internalformat);
+        break;
     default:
         m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM);
     }
diff --git a/WebCore/html/canvas/WebGLRenderingContext.h b/WebCore/html/canvas/WebGLRenderingContext.h
index 912a2ef..99d2c79 100644
--- a/WebCore/html/canvas/WebGLRenderingContext.h
+++ b/WebCore/html/canvas/WebGLRenderingContext.h
@@ -431,6 +431,8 @@ public:
     long m_stencilFuncRef; // Note that this is the user specified value, not the internal clamped value.
     unsigned long m_stencilFuncMask;
 
+    bool m_isDepthStencilSupported;
+
     // Helpers for getParameter and others
     WebGLGetInfo getBooleanParameter(unsigned long pname);
     WebGLGetInfo getBooleanArrayParameter(unsigned long pname);

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list