Changeset 57018 in webkit


Ignore:
Timestamp:
Apr 2, 2010 1:03:02 PM (14 years ago)
Author:
eric@webkit.org
Message:

2010-04-02 Zhenyao Mo <zmo@google.com>

Reviewed by Eric Seidel.

Implement and test new framebuffer object attachment behavior.
https://bugs.webkit.org/show_bug.cgi?id=35611

  • fast/canvas/webgl/framebuffer-object-attachment-expected.txt: Added, test framebuffer object attachment behavior.
  • fast/canvas/webgl/framebuffer-object-attachment.html: Added, framebuffer object attachment behavior.
  • fast/canvas/webgl/script-tests/gl-object-get-calls.js: DEPTH_COMPONENT is no longer a valid input, use DEPTH_COMPONENT16 instead.
  • platform/mac-snowleopard/Skipped: The bot does not support EXT_packed_depth_stencil, skip the framebuffer-object-attachment.html test.

2010-04-02 Zhenyao Mo <zmo@google.com>

Reviewed by Eric Seidel.

Implement and test new framebuffer object attachment behavior.
https://bugs.webkit.org/show_bug.cgi?id=35611

Test: fast/canvas/webgl/framebuffer-object-attachment.html

  • html/canvas/WebGLFramebuffer.cpp: Keep track of attached stencil/depth renderbuffers in WebGLFramebuffer. (WebCore::WebGLFramebuffer::WebGLFramebuffer): (WebCore::WebGLFramebuffer::setIsAttached):
  • html/canvas/WebGLFramebuffer.h: Ditto. (WebCore::WebGLFramebuffer::isDepthAttached): (WebCore::WebGLFramebuffer::isStencilAttached): (WebCore::WebGLFramebuffer::isDepthStencilAttached):
  • html/canvas/WebGLRenderbuffer.cpp: Keep track of internalformat. (WebCore::WebGLRenderbuffer::WebGLRenderbuffer):
  • html/canvas/WebGLRenderbuffer.h: Ditto. (WebCore::WebGLRenderbuffer::setInternalformat): (WebCore::WebGLRenderbuffer::getInternalformat):
  • html/canvas/WebGLRenderingContext.cpp: (WebCore::WebGLRenderingContext::framebufferRenderbuffer): Detect stencil/depth buffer conflicts. (WebCore::WebGLRenderingContext::getFramebufferAttachmentParameter): Handling DEPTH_STENCIL case. (WebCore::WebGLRenderingContext::getRenderbufferParameter): Get correct WebGL internalformat. (WebCore::WebGLRenderingContext::renderbufferStorage): Detect illegal enums.
  • html/canvas/WebGLRenderingContext.idl: Add DEPTH_STENCIL enums.
  • platform/graphics/GraphicsContext3D.h: Add DEPTH_STENCIL enums. (WebCore::GraphicsContext3D::):
  • platform/graphics/mac/GraphicsContext3DMac.cpp: Map to correct DEPTH_STENCIL format. (WebCore::GraphicsContext3D::framebufferRenderbuffer): (WebCore::GraphicsContext3D::renderbufferStorage): (WebCore::GraphicsContext3D::getFramebufferAttachmentParameteriv):

2010-04-02 Zhenyao Mo <zmo@google.com>

Reviewed by Eric Seidel.

Implement and test new framebuffer object attachment behavior.
https://bugs.webkit.org/show_bug.cgi?id=35611

Test: fast/canvas/webgl/framebuffer-object-attachment.html

  • src/WebGraphicsContext3DDefaultImpl.cpp: Map to correct DEPTH_STENCIL format. (WebKit::WebGraphicsContext3DDefaultImpl::framebufferRenderbuffer): (WebKit::WebGraphicsContext3DDefaultImpl::getFramebufferAttachmentParameteriv): (WebKit::WebGraphicsContext3DDefaultImpl::renderbufferStorage):
Location:
trunk
Files:
2 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r57015 r57018  
     12010-04-02  Zhenyao Mo  <zmo@google.com>
     2
     3        Reviewed by Eric Seidel.
     4
     5        Implement and test new framebuffer object attachment behavior.
     6        https://bugs.webkit.org/show_bug.cgi?id=35611
     7
     8        * fast/canvas/webgl/framebuffer-object-attachment-expected.txt: Added, test framebuffer object attachment behavior.
     9        * fast/canvas/webgl/framebuffer-object-attachment.html: Added, framebuffer object attachment behavior.
     10        * fast/canvas/webgl/script-tests/gl-object-get-calls.js: DEPTH_COMPONENT is no longer a valid input, use DEPTH_COMPONENT16 instead.
     11        * platform/mac-snowleopard/Skipped: The bot does not support EXT_packed_depth_stencil, skip the framebuffer-object-attachment.html test.
     12
    1132010-04-02  Zhenyao Mo  <zmo@google.com>
    214
  • trunk/LayoutTests/fast/canvas/webgl/script-tests/gl-object-get-calls.js

    r51537 r57018  
    5353gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);
    5454shouldBe('gl.getError()', '0');
    55 gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT, 2, 2);
     55gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, 2, 2);
    5656shouldBe('gl.getError()', '0');
    5757gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, renderbuffer);
  • trunk/LayoutTests/platform/mac-snowleopard/Skipped

    r56605 r57018  
    114114# Color bitmap fonts not supported on Snow Leopard
    115115platform/mac/fonts/color-bitmap.html
     116
     117# Snow Leopard bot does not support EXT_packed_depth_stencil, which is required by WebGL.
     118# https://bugs.webkit.org/show_bug.cgi?id=36925
     119fast/canvas/webgl/framebuffer-object-attachment.html
  • trunk/WebCore/ChangeLog

    r57013 r57018  
     12010-04-02  Zhenyao Mo  <zmo@google.com>
     2
     3        Reviewed by Eric Seidel.
     4
     5        Implement and test new framebuffer object attachment behavior.
     6        https://bugs.webkit.org/show_bug.cgi?id=35611
     7
     8        Test: fast/canvas/webgl/framebuffer-object-attachment.html
     9
     10        * html/canvas/WebGLFramebuffer.cpp: Keep track of attached stencil/depth renderbuffers in WebGLFramebuffer.
     11        (WebCore::WebGLFramebuffer::WebGLFramebuffer):
     12        (WebCore::WebGLFramebuffer::setIsAttached):
     13        * html/canvas/WebGLFramebuffer.h: Ditto.
     14        (WebCore::WebGLFramebuffer::isDepthAttached):
     15        (WebCore::WebGLFramebuffer::isStencilAttached):
     16        (WebCore::WebGLFramebuffer::isDepthStencilAttached):
     17        * html/canvas/WebGLRenderbuffer.cpp: Keep track of internalformat.
     18        (WebCore::WebGLRenderbuffer::WebGLRenderbuffer):
     19        * html/canvas/WebGLRenderbuffer.h: Ditto.
     20        (WebCore::WebGLRenderbuffer::setInternalformat):
     21        (WebCore::WebGLRenderbuffer::getInternalformat):
     22        * html/canvas/WebGLRenderingContext.cpp:
     23        (WebCore::WebGLRenderingContext::framebufferRenderbuffer): Detect stencil/depth buffer conflicts.
     24        (WebCore::WebGLRenderingContext::getFramebufferAttachmentParameter): Handling DEPTH_STENCIL case.
     25        (WebCore::WebGLRenderingContext::getRenderbufferParameter): Get correct WebGL internalformat.
     26        (WebCore::WebGLRenderingContext::renderbufferStorage): Detect illegal enums.
     27        * html/canvas/WebGLRenderingContext.idl: Add DEPTH_STENCIL enums.
     28        * platform/graphics/GraphicsContext3D.h: Add DEPTH_STENCIL enums.
     29        (WebCore::GraphicsContext3D::):
     30        * platform/graphics/mac/GraphicsContext3DMac.cpp: Map to correct DEPTH_STENCIL format.
     31        (WebCore::GraphicsContext3D::framebufferRenderbuffer):
     32        (WebCore::GraphicsContext3D::renderbufferStorage):
     33        (WebCore::GraphicsContext3D::getFramebufferAttachmentParameteriv):
     34
    1352010-04-02  Kent Tamura  <tkent@chromium.org>
    236
  • trunk/WebCore/html/canvas/WebGLFramebuffer.cpp

    r50725 r57018  
    4040WebGLFramebuffer::WebGLFramebuffer(WebGLRenderingContext* ctx)
    4141    : CanvasObject(ctx)
     42    , m_isDepthAttached(false)
     43    , m_isStencilAttached(false)
     44    , m_isDepthStencilAttached(false)
    4245{
    4346    setObject(context()->graphicsContext3D()->createFramebuffer());
     47}
     48
     49void WebGLFramebuffer::setIsAttached(unsigned long attachment, bool isAttached)
     50{
     51    switch (attachment) {
     52    case GraphicsContext3D::DEPTH_ATTACHMENT:
     53        m_isDepthAttached = isAttached;
     54        break;
     55    case GraphicsContext3D::STENCIL_ATTACHMENT:
     56        m_isStencilAttached = isAttached;
     57        break;
     58    case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT:
     59        m_isDepthStencilAttached = isAttached;
     60        break;
     61    }
    4462}
    4563
  • trunk/WebCore/html/canvas/WebGLFramebuffer.h

    r50725 r57018  
    4040        static PassRefPtr<WebGLFramebuffer> create(WebGLRenderingContext*);
    4141       
     42        void setIsAttached(unsigned long attachment, bool isAttached);
     43
     44        bool isDepthAttached() const { return m_isDepthAttached; }
     45        bool isStencilAttached() const { return m_isStencilAttached; }
     46        bool isDepthStencilAttached() const { return m_isDepthStencilAttached; }
     47
    4248    protected:
    4349        WebGLFramebuffer(WebGLRenderingContext*);
    4450       
    4551        virtual void _deleteObject(Platform3DObject);
     52
     53      private:
     54        bool m_isDepthAttached;
     55        bool m_isStencilAttached;
     56        bool m_isDepthStencilAttached;
    4657    };
    4758   
  • trunk/WebCore/html/canvas/WebGLRenderbuffer.cpp

    r51348 r57018  
    4545WebGLRenderbuffer::WebGLRenderbuffer(WebGLRenderingContext* ctx)
    4646    : CanvasObject(ctx)
     47    , m_internalformat(GraphicsContext3D::RGBA4)
    4748{
    4849    setObject(context()->graphicsContext3D()->createRenderbuffer());
     
    5152WebGLRenderbuffer::WebGLRenderbuffer(WebGLRenderingContext* ctx, Platform3DObject obj)
    5253    : CanvasObject(ctx)
     54    , m_internalformat(GraphicsContext3D::RGBA4)
    5355{
    5456    setObject(obj, false);
  • trunk/WebCore/html/canvas/WebGLRenderbuffer.h

    r51348 r57018  
    4444        static PassRefPtr<WebGLRenderbuffer> create(WebGLRenderingContext*, Platform3DObject renderbuffer);
    4545
     46        void setInternalformat(unsigned long internalformat) { m_internalformat = internalformat; }
     47        unsigned long getInternalformat() const { return m_internalformat; }
     48
    4649    protected:
    4750        WebGLRenderbuffer(WebGLRenderingContext*);
     
    4952       
    5053        virtual void _deleteObject(Platform3DObject);
     54
     55      private:
     56        unsigned long m_internalformat;
    5157    };
    5258   
  • trunk/WebCore/html/canvas/WebGLRenderingContext.cpp

    r55514 r57018  
    791791        return;
    792792    }
     793    if (buffer->object()) {
     794        bool isConflicted = false;
     795        bool isDepthOrStencil = true;
     796        switch (attachment) {
     797        case GraphicsContext3D::DEPTH_ATTACHMENT:
     798            if (m_framebufferBinding->isDepthStencilAttached() || m_framebufferBinding->isStencilAttached())
     799                isConflicted = true;
     800            if (buffer->getInternalformat() != GraphicsContext3D::DEPTH_COMPONENT16)
     801                isConflicted = true;
     802            break;
     803        case GraphicsContext3D::STENCIL_ATTACHMENT:
     804            if (m_framebufferBinding->isDepthStencilAttached() || m_framebufferBinding->isDepthAttached())
     805                isConflicted = true;
     806            if (buffer->getInternalformat() != GraphicsContext3D::STENCIL_INDEX8)
     807                isConflicted = true;
     808            break;
     809        case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT:
     810            if (m_framebufferBinding->isDepthAttached() || m_framebufferBinding->isStencilAttached())
     811                isConflicted = true;
     812            if (buffer->getInternalformat() != GraphicsContext3D::DEPTH_STENCIL)
     813                isConflicted = true;
     814            break;
     815        default:
     816            isDepthOrStencil = false;
     817        }
     818        if (isConflicted) {
     819            m_context->synthesizeGLError(GraphicsContext3D::INVALID_OPERATION);
     820            return;
     821        }
     822        if (isDepthOrStencil)
     823            m_framebufferBinding->setIsAttached(attachment, true);
     824    } else { // Detach
     825        switch (attachment) {
     826        case GraphicsContext3D::DEPTH_ATTACHMENT:
     827        case GraphicsContext3D::STENCIL_ATTACHMENT:
     828        case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT:
     829            m_framebufferBinding->setIsAttached(attachment, false);
     830        }
     831    }
    793832    m_context->framebufferRenderbuffer(target, attachment, renderbuffertarget, buffer);
    794833    cleanupAfterGraphicsCall(false);
     
    898937        || (attachment != GraphicsContext3D::COLOR_ATTACHMENT0
    899938            && attachment != GraphicsContext3D::DEPTH_ATTACHMENT
    900             && attachment != GraphicsContext3D::STENCIL_ATTACHMENT)
     939            && attachment != GraphicsContext3D::STENCIL_ATTACHMENT
     940            && attachment != GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT)
    901941        || (pname != GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
    902942            && pname != GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
     
    11771217        return WebGLGetInfo(static_cast<long>(value));
    11781218    case GraphicsContext3D::RENDERBUFFER_INTERNAL_FORMAT:
    1179         m_context->getRenderbufferParameteriv(target, pname, &value);
    1180         return WebGLGetInfo(static_cast<unsigned long>(value));
     1219        if (!m_renderbufferBinding) {
     1220            m_context->synthesizeGLError(GraphicsContext3D::INVALID_OPERATION);
     1221            return WebGLGetInfo();
     1222        }
     1223        return WebGLGetInfo(m_renderbufferBinding->getInternalformat());
    11811224    default:
    11821225        m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM);
     
    15601603void WebGLRenderingContext::renderbufferStorage(unsigned long target, unsigned long internalformat, unsigned long width, unsigned long height)
    15611604{
    1562     m_context->renderbufferStorage(target, internalformat, width, height);
    1563     cleanupAfterGraphicsCall(false);
     1605    switch (internalformat) {
     1606    case GraphicsContext3D::DEPTH_COMPONENT16:
     1607    case GraphicsContext3D::RGBA4:
     1608    case GraphicsContext3D::RGB5_A1:
     1609    case GraphicsContext3D::RGB565:
     1610    case GraphicsContext3D::STENCIL_INDEX8:
     1611    case GraphicsContext3D::DEPTH_STENCIL:
     1612        m_context->renderbufferStorage(target, internalformat, width, height);
     1613        if (m_renderbufferBinding)
     1614            m_renderbufferBinding->setInternalformat(internalformat);
     1615        cleanupAfterGraphicsCall(false);
     1616        break;
     1617    default:
     1618        m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM);
     1619    }
    15641620}
    15651621
  • trunk/WebCore/html/canvas/WebGLRenderingContext.idl

    r53238 r57018  
    424424        const unsigned int STENCIL_INDEX                  = 0x1901;
    425425        const unsigned int STENCIL_INDEX8                 = 0x8D48;
     426        const unsigned int DEPTH_STENCIL                  = 0x84F9;
    426427
    427428        const unsigned int RENDERBUFFER_WIDTH             = 0x8D42;
     
    443444        const unsigned int DEPTH_ATTACHMENT               = 0x8D00;
    444445        const unsigned int STENCIL_ATTACHMENT             = 0x8D20;
     446        const unsigned int DEPTH_STENCIL_ATTACHMENT       = 0x821A;
    445447
    446448        const unsigned int NONE                           = 0;
  • trunk/WebCore/platform/graphics/GraphicsContext3D.h

    r56872 r57018  
    363363            STENCIL_INDEX = 0x1901,
    364364            STENCIL_INDEX8 = 0x8D48,
     365            DEPTH_STENCIL = 0x84F9,
    365366            RENDERBUFFER_WIDTH = 0x8D42,
    366367            RENDERBUFFER_HEIGHT = 0x8D43,
     
    379380            DEPTH_ATTACHMENT = 0x8D00,
    380381            STENCIL_ATTACHMENT = 0x8D20,
     382            DEPTH_STENCIL_ATTACHMENT = 0x821A,
    381383            NONE = 0,
    382384            FRAMEBUFFER_COMPLETE = 0x8CD5,
  • trunk/WebCore/platform/graphics/mac/GraphicsContext3DMac.cpp

    r56872 r57018  
    592592{
    593593    ensureContext(m_contextObj);
    594     ::glFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, buffer ? (GLuint) buffer->object() : 0);
     594    GLuint renderbuffer = (buffer ? (GLuint) buffer->object() : 0);
     595    if (attachment == DEPTH_STENCIL_ATTACHMENT) {
     596        ::glFramebufferRenderbufferEXT(target, DEPTH_ATTACHMENT, renderbuffertarget, renderbuffer);
     597        ::glFramebufferRenderbufferEXT(target, STENCIL_ATTACHMENT, renderbuffertarget, renderbuffer);
     598    } else
     599        ::glFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer);
    595600}
    596601
     
    823828{
    824829    ensureContext(m_contextObj);
     830    if (internalformat == DEPTH_STENCIL)
     831        internalformat = GL_DEPTH24_STENCIL8_EXT;
     832    else if (internalformat == DEPTH_COMPONENT16)
     833        internalformat = GL_DEPTH_COMPONENT;
    825834    ::glRenderbufferStorageEXT(target, internalformat, width, height);
    826835}
     
    11181127{
    11191128    ensureContext(m_contextObj);
     1129    if (attachment == DEPTH_STENCIL_ATTACHMENT)
     1130        attachment = DEPTH_ATTACHMENT; // Or STENCIL_ATTACHMENT, either works.
    11201131    ::glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, value);
    11211132}
  • trunk/WebKit/chromium/ChangeLog

    r57014 r57018  
     12010-04-02  Zhenyao Mo  <zmo@google.com>
     2
     3        Reviewed by Eric Seidel.
     4
     5        Implement and test new framebuffer object attachment behavior.
     6        https://bugs.webkit.org/show_bug.cgi?id=35611
     7
     8        Test: fast/canvas/webgl/framebuffer-object-attachment.html
     9
     10        * src/WebGraphicsContext3DDefaultImpl.cpp: Map to correct DEPTH_STENCIL format.
     11        (WebKit::WebGraphicsContext3DDefaultImpl::framebufferRenderbuffer):
     12        (WebKit::WebGraphicsContext3DDefaultImpl::getFramebufferAttachmentParameteriv):
     13        (WebKit::WebGraphicsContext3DDefaultImpl::renderbufferStorage):
     14
    1152010-04-02  Jay Civelli  <jcivelli@chromium.org>
    216
  • trunk/WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.cpp

    r56880 r57018  
    886886DELEGATE_TO_GL(flush, Flush)
    887887
    888 DELEGATE_TO_GL_4(framebufferRenderbuffer, FramebufferRenderbufferEXT, unsigned long, unsigned long, unsigned long, WebGLId)
     888void WebGraphicsContext3DDefaultImpl::framebufferRenderbuffer(unsigned long target, unsigned long attachment,
     889                                                              unsigned long renderbuffertarget, WebGLId buffer)
     890{
     891    makeContextCurrent();
     892    if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
     893        glFramebufferRenderbufferEXT(target, GL_DEPTH_ATTACHMENT, renderbuffertarget, buffer);
     894        glFramebufferRenderbufferEXT(target, GL_STENCIL_ATTACHMENT, renderbuffertarget, buffer);
     895    } else
     896        glFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, buffer);
     897}
    889898
    890899DELEGATE_TO_GL_5(framebufferTexture2D, FramebufferTexture2DEXT, unsigned long, unsigned long, unsigned long, WebGLId, long)
     
    986995DELEGATE_TO_GL_2(getFloatv, GetFloatv, unsigned long, float*)
    987996
    988 DELEGATE_TO_GL_4(getFramebufferAttachmentParameteriv, GetFramebufferAttachmentParameterivEXT, unsigned long, unsigned long, unsigned long, int*)
     997void WebGraphicsContext3DDefaultImpl::getFramebufferAttachmentParameteriv(unsigned long target, unsigned long attachment,
     998                                                                          unsigned long pname, int* value)
     999{
     1000    makeContextCurrent();
     1001    if (attachment == GL_DEPTH_STENCIL_ATTACHMENT)
     1002        attachment = GL_DEPTH_ATTACHMENT; // Or GL_STENCIL_ATTACHMENT, either works.
     1003    glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, value);
     1004}
    9891005
    9901006DELEGATE_TO_GL_2(getIntegerv, GetIntegerv, unsigned long, int*)
     
    11341150}
    11351151
    1136 DELEGATE_TO_GL_4(renderbufferStorage, RenderbufferStorageEXT, unsigned long, unsigned long, unsigned long, unsigned long)
     1152void WebGraphicsContext3DDefaultImpl::renderbufferStorage(unsigned long target,
     1153                                                          unsigned long internalformat,
     1154                                                          unsigned long width,
     1155                                                          unsigned long height)
     1156{
     1157    makeContextCurrent();
     1158    if (internalformat == GL_DEPTH_STENCIL)
     1159        internalformat = GL_DEPTH24_STENCIL8_EXT;
     1160    else if (internalformat == GL_DEPTH_COMPONENT16)
     1161        internalformat = GL_DEPTH_COMPONENT;
     1162    glRenderbufferStorageEXT(target, internalformat, width, height);
     1163}
    11371164
    11381165DELEGATE_TO_GL_2(sampleCoverage, SampleCoverage, double, bool)
Note: See TracChangeset for help on using the changeset viewer.