Changeset 71367 in webkit


Ignore:
Timestamp:
Nov 4, 2010 4:57:44 PM (13 years ago)
Author:
zmo@google.com
Message:

2010-11-03 Zhenyao Mo <zmo@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@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.
Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r71364 r71367  
     12010-11-03  Zhenyao Mo  <zmo@google.com>
     2
     3        Reviewed by Kenneth Russell.
     4
     5        renderbufferStorage(DEPTH_STENCIL) shouldn't generate an error
     6        https://bugs.webkit.org/show_bug.cgi?id=48891
     7
     8        * fast/canvas/webgl/framebuffer-object-attachment-expected.txt:
     9        * fast/canvas/webgl/framebuffer-object-attachment.html: Add the test cases for DEPTH_STENCIL renderbuffer.
     10
    1112010-11-04  Brian Weinstein  <bweinstein@apple.com>
    212
  • trunk/LayoutTests/fast/canvas/webgl/framebuffer-object-attachment-expected.txt

    r71190 r71367  
    66PASS gl = create3DContext() is non-null.
    77PASS colorBuffer = gl.createRenderbuffer() is non-null.
    8 PASS gl.getError() is gl.NO_ERROR
     8PASS getError was expected value: NO_ERROR :
    99PASS depthBuffer = gl.createRenderbuffer() is non-null.
    10 PASS gl.getError() is gl.NO_ERROR
     10PASS getError was expected value: NO_ERROR :
    1111PASS stencilBuffer = gl.createRenderbuffer() is non-null.
    12 PASS gl.getError() is gl.NO_ERROR
     12PASS getError was expected value: NO_ERROR :
    1313PASS depthStencilBuffer = gl.createRenderbuffer() is non-null.
    14 PASS gl.getError() is gl.NO_ERROR
     14PASS getError was expected value: NO_ERROR :
    1515Attach depth using DEPTH_ATTACHMENT
    1616PASS fbo = gl.createFramebuffer() is non-null.
    17 PASS gl.getError() is gl.NO_ERROR
     17PASS getError was expected value: NO_ERROR :
    1818Attach depth using STENCIL_ATTACHMENT
    1919PASS fbo = gl.createFramebuffer() is non-null.
    20 PASS gl.getError() is gl.NO_ERROR
     20PASS getError was expected value: NO_ERROR :
    2121PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
    22 PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
    23 PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
     22PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     23PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
    2424Attach depth using DEPTH_STENCIL_ATTACHMENT
    2525PASS fbo = gl.createFramebuffer() is non-null.
    26 PASS gl.getError() is gl.NO_ERROR
     26PASS getError was expected value: NO_ERROR :
    2727PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
    28 PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
    29 PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
     28PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     29PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
    3030Attach stencil using STENCIL_ATTACHMENT
    3131PASS fbo = gl.createFramebuffer() is non-null.
    32 PASS gl.getError() is gl.NO_ERROR
     32PASS getError was expected value: NO_ERROR :
    3333Attach stencil using DEPTH_ATTACHMENT
    3434PASS fbo = gl.createFramebuffer() is non-null.
    35 PASS gl.getError() is gl.NO_ERROR
     35PASS getError was expected value: NO_ERROR :
    3636PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
    37 PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
    38 PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
     37PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     38PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
    3939Attach stencil using DEPTH_STENCIL_ATTACHMENT
    4040PASS fbo = gl.createFramebuffer() is non-null.
    41 PASS gl.getError() is gl.NO_ERROR
     41PASS getError was expected value: NO_ERROR :
    4242PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
    43 PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
    44 PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
     43PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     44PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
    4545Attach depthStencil using DEPTH_STENCIL_ATTACHMENT
    4646PASS fbo = gl.createFramebuffer() is non-null.
    47 PASS gl.getError() is gl.NO_ERROR
     47PASS getError was expected value: NO_ERROR :
    4848Attach depthStencil using DEPTH_ATTACHMENT
    4949PASS fbo = gl.createFramebuffer() is non-null.
    50 PASS gl.getError() is gl.NO_ERROR
     50PASS getError was expected value: NO_ERROR :
    5151PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
    52 PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
    53 PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
     52PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     53PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
    5454Attach depthStencil using STENCIL_ATTACHMENT
    5555PASS fbo = gl.createFramebuffer() is non-null.
    56 PASS gl.getError() is gl.NO_ERROR
     56PASS getError was expected value: NO_ERROR :
    5757PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
    58 PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
    59 PASS gl.getError() is gl.INVALID_FRAMEBUFFER_OPERATION
     58PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     59PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
    6060Attach depth, then stencil, causing conflict
    6161PASS fbo = gl.createFramebuffer() is non-null.
    62 PASS gl.getError() is gl.NO_ERROR
    63 PASS gl.getError() is gl.NO_ERROR
     62PASS getError was expected value: NO_ERROR :
     63PASS getError was expected value: NO_ERROR :
    6464PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
    6565Attach stencil, then depth, causing conflict
    6666PASS fbo = gl.createFramebuffer() is non-null.
    67 PASS gl.getError() is gl.NO_ERROR
    68 PASS gl.getError() is gl.NO_ERROR
     67PASS getError was expected value: NO_ERROR :
     68PASS getError was expected value: NO_ERROR :
    6969PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
    7070Attach depth, then depthStencil, causing conflict
    7171PASS fbo = gl.createFramebuffer() is non-null.
    72 PASS gl.getError() is gl.NO_ERROR
    73 PASS gl.getError() is gl.NO_ERROR
     72PASS getError was expected value: NO_ERROR :
     73PASS getError was expected value: NO_ERROR :
    7474PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
    7575Attach depthStencil, then depth, causing conflict
    7676PASS fbo = gl.createFramebuffer() is non-null.
    77 PASS gl.getError() is gl.NO_ERROR
    78 PASS gl.getError() is gl.NO_ERROR
     77PASS getError was expected value: NO_ERROR :
     78PASS getError was expected value: NO_ERROR :
    7979PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
    8080Attach stencil, then depthStencil, causing conflict
    8181PASS fbo = gl.createFramebuffer() is non-null.
    82 PASS gl.getError() is gl.NO_ERROR
    83 PASS gl.getError() is gl.NO_ERROR
     82PASS getError was expected value: NO_ERROR :
     83PASS getError was expected value: NO_ERROR :
    8484PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
    8585Attach depthStencil, then stencil, causing conflict
    8686PASS fbo = gl.createFramebuffer() is non-null.
    87 PASS gl.getError() is gl.NO_ERROR
    88 PASS gl.getError() is gl.NO_ERROR
     87PASS getError was expected value: NO_ERROR :
     88PASS getError was expected value: NO_ERROR :
    8989PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
    9090Attach color renderbuffer with internalformat == RGBA4
    9191PASS colorBuffer = gl.createRenderbuffer() is non-null.
    92 PASS gl.getError() is gl.NO_ERROR
     92PASS getError was expected value: NO_ERROR :
    9393PASS fbo = gl.createFramebuffer() is non-null.
    94 PASS gl.getError() is gl.NO_ERROR
     94PASS getError was expected value: NO_ERROR :
    9595Attach color renderbuffer with internalformat == RGB5_A1
    9696PASS colorBuffer = gl.createRenderbuffer() is non-null.
    97 PASS gl.getError() is gl.NO_ERROR
     97PASS getError was expected value: NO_ERROR :
    9898PASS fbo = gl.createFramebuffer() is non-null.
    99 PASS gl.getError() is gl.NO_ERROR
     99PASS getError was expected value: NO_ERROR :
    100100Attach color renderbuffer with internalformat == RGB565
    101101PASS colorBuffer = gl.createRenderbuffer() is non-null.
    102 PASS gl.getError() is gl.NO_ERROR
     102PASS getError was expected value: NO_ERROR :
    103103PASS fbo = gl.createFramebuffer() is non-null.
    104 PASS gl.getError() is gl.NO_ERROR
     104PASS getError was expected value: NO_ERROR :
     105Create and attach depthStencil renderbuffer
     106PASS depthStencilBuffer = gl.createRenderbuffer() is non-null.
     107PASS getError was expected value: NO_ERROR :
     108PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_WIDTH) is width
     109PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_HEIGHT) is height
     110PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_INTERNAL_FORMAT) is gl.DEPTH_STENCIL
     111PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_RED_SIZE) is 0
     112PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_GREEN_SIZE) is 0
     113PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_BLUE_SIZE) is 0
     114PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_ALPHA_SIZE) is 0
     115PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_DEPTH_SIZE) > 0 is true
     116PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_STENCIL_SIZE) > 0 is true
     117PASS getError was expected value: NO_ERROR :
     118PASS fbo = gl.createFramebuffer() is non-null.
     119PASS getError was expected value: NO_ERROR :
    105120PASS successfullyParsed is true
    106121
  • trunk/LayoutTests/fast/canvas/webgl/framebuffer-object-attachment.html

    r71190 r71367  
    2626    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorBuffer);
    2727    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, buffer);
    28     shouldBe("gl.getError()", "gl.NO_ERROR");
     28    glErrorShouldBe(gl, gl.NO_ERROR);
    2929    if (isConflicted) {
    3030        shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_UNSUPPORTED");
    3131        gl.clear(gl.COLOR_BUFFER_BIT);
    32         shouldBe("gl.getError()", "gl.INVALID_FRAMEBUFFER_OPERATION");
     32        glErrorShouldBe(gl, gl.INVALID_FRAMEBUFFER_OPERATION);
    3333        gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(width * height * 4));
    34         shouldBe("gl.getError()", "gl.INVALID_FRAMEBUFFER_OPERATION");
     34        glErrorShouldBe(gl, gl.INVALID_FRAMEBUFFER_OPERATION);
    3535    }
    3636}
     
    4242    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorBuffer);
    4343    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment0, gl.RENDERBUFFER, buffer0);
    44     shouldBe("gl.getError()", "gl.NO_ERROR");
     44    glErrorShouldBe(gl, gl.NO_ERROR);
    4545    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment1, gl.RENDERBUFFER, buffer1);
    46     shouldBe("gl.getError()", "gl.NO_ERROR");
     46    glErrorShouldBe(gl, gl.NO_ERROR);
    4747    if (isConflicted)
    4848        shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_UNSUPPORTED");
     
    5454    gl.bindRenderbuffer(gl.RENDERBUFFER, colorBuffer);
    5555    gl.renderbufferStorage(gl.RENDERBUFFER, internalformat, width, height);
    56     shouldBe("gl.getError()", "gl.NO_ERROR");
     56    glErrorShouldBe(gl, gl.NO_ERROR);
    5757    testAttachment(gl.COLOR_ATTACHMENT0, colorBuffer, false);
     58}
     59
     60function testDepthStencilRenderbuffer()
     61{
     62    shouldBeNonNull("depthStencilBuffer = gl.createRenderbuffer()");
     63    gl.bindRenderbuffer(gl.RENDERBUFFER, depthStencilBuffer);
     64    gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height);
     65    glErrorShouldBe(gl, gl.NO_ERROR);
     66    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_WIDTH)", "width");
     67    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_HEIGHT)", "height");
     68    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_INTERNAL_FORMAT)", "gl.DEPTH_STENCIL");
     69    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_RED_SIZE)", "0");
     70    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_GREEN_SIZE)", "0");
     71    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_BLUE_SIZE)", "0");
     72    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_ALPHA_SIZE)", "0");
     73    shouldBeTrue("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_DEPTH_SIZE) > 0");
     74    shouldBeTrue("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_STENCIL_SIZE) > 0");
     75    glErrorShouldBe(gl, gl.NO_ERROR);
     76    testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, false);
    5877}
    5978
     
    6584gl.bindRenderbuffer(gl.RENDERBUFFER, colorBuffer);
    6685gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, width, height);
    67 shouldBe("gl.getError()", "gl.NO_ERROR");
     86glErrorShouldBe(gl, gl.NO_ERROR);
    6887shouldBeNonNull("depthBuffer = gl.createRenderbuffer()");
    6988gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer);
    7089gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height);
    71 shouldBe("gl.getError()", "gl.NO_ERROR");
     90glErrorShouldBe(gl, gl.NO_ERROR);
    7291shouldBeNonNull("stencilBuffer = gl.createRenderbuffer()");
    7392gl.bindRenderbuffer(gl.RENDERBUFFER, stencilBuffer);
    7493gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8, width, height);
    75 shouldBe("gl.getError()", "gl.NO_ERROR");
     94glErrorShouldBe(gl, gl.NO_ERROR);
    7695shouldBeNonNull("depthStencilBuffer = gl.createRenderbuffer()");
    7796gl.bindRenderbuffer(gl.RENDERBUFFER, depthStencilBuffer);
    7897gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height);
    79 shouldBe("gl.getError()", "gl.NO_ERROR");
     98glErrorShouldBe(gl, gl.NO_ERROR);
    8099
    81100debug("Attach depth using DEPTH_ATTACHMENT");
     
    120139testColorRenderbuffer(gl.RGB565);
    121140
     141debug("Create and attach depthStencil renderbuffer");
     142testDepthStencilRenderbuffer();
     143
    122144successfullyParsed = true;
    123145</script>
  • trunk/WebCore/ChangeLog

    r71366 r71367  
     12010-11-03  Zhenyao Mo  <zmo@google.com>
     2
     3        Reviewed by Kenneth Russell.
     4
     5        renderbufferStorage(DEPTH_STENCIL) shouldn't generate an error
     6        https://bugs.webkit.org/show_bug.cgi?id=48891
     7
     8        * html/canvas/WebGLFramebuffer.cpp:
     9        (WebCore::WebGLFramebuffer::isIncomplete): Considering the case where DEPTH_STENCIL is not supported.
     10        * html/canvas/WebGLRenderbuffer.cpp:
     11        (WebCore::WebGLRenderbuffer::WebGLRenderbuffer): Init added members.
     12        * html/canvas/WebGLRenderbuffer.h: Add members and accessor functions.
     13        (WebCore::WebGLRenderbuffer::setInternalFormat):
     14        (WebCore::WebGLRenderbuffer::setSize):
     15        (WebCore::WebGLRenderbuffer::getWidth):
     16        (WebCore::WebGLRenderbuffer::getHeight):
     17        (WebCore::WebGLRenderbuffer::setIsValid):
     18        (WebCore::WebGLRenderbuffer::isValid):
     19        * html/canvas/WebGLRenderingContext.cpp:
     20        (WebCore::WebGLRenderingContext::initializeNewContext): Check if packed_depth_stencil extension exists.
     21        (WebCore::WebGLRenderingContext::getRenderbufferParameter): Simulate the case for DEPTH_STENCIL where packed_depth_stencil is not supported.
     22        (WebCore::WebGLRenderingContext::renderbufferStorage): Bypass the call if packed_depth_stencil is not supported.
     23        * html/canvas/WebGLRenderingContext.h:
     24
    1252010-11-04  Kavita Kanetkar  <kkanetkar@chromium.org>
    226
  • trunk/WebCore/html/canvas/WebGLFramebuffer.cpp

    r71190 r71367  
    5858    }
    5959
     60    bool isValid(WebGLObject* attachedObject)
     61    {
     62        if (attachedObject && attachedObject->object() && attachedObject->isRenderbuffer()) {
     63            if (!(reinterpret_cast<WebGLRenderbuffer*>(attachedObject))->isValid())
     64                return false;
     65        }
     66        return true;
     67    }
     68
    6069} // anonymous namespace
    6170
     
    143152    }
    144153    if (isDepthStencilAttached()) {
    145         if (getInternalFormat(m_depthStencilAttachment.get()) != GraphicsContext3D::DEPTH_STENCIL)
     154        if (getInternalFormat(m_depthStencilAttachment.get()) != GraphicsContext3D::DEPTH_STENCIL
     155            || !isValid(m_depthStencilAttachment.get()))
    146156            return true;
    147157        count++;
  • trunk/WebCore/html/canvas/WebGLRenderbuffer.cpp

    r68424 r71367  
    4343    , m_internalFormat(GraphicsContext3D::RGBA4)
    4444    , m_initialized(false)
     45    , m_width(0)
     46    , m_height(0)
     47    , m_isValid(true)
    4548{
    4649    setObject(context()->graphicsContext3D()->createRenderbuffer());
  • trunk/WebCore/html/canvas/WebGLRenderbuffer.h

    r71190 r71367  
    4545        m_initialized = false;
    4646    }
     47    unsigned long getInternalFormat() const { return m_internalFormat; }
    4748
    48     unsigned long getInternalFormat() const { return m_internalFormat; }
     49    void setSize(unsigned long width, unsigned long height)
     50    {
     51        m_width = width;
     52        m_height = height;
     53    }
     54    unsigned long getWidth() const { return m_width; }
     55    unsigned long getHeight() const { return m_height; }
     56
     57    void setIsValid(bool isValid) { m_isValid = isValid; }
     58    bool isValid() const { return m_isValid; }
    4959
    5060    bool isInitialized() const { return m_initialized; }
     
    6171    unsigned long m_internalFormat;
    6272    bool m_initialized;
     73    unsigned long m_width, m_height;
     74    bool m_isValid; // This is only false if internalFormat is DEPTH_STENCIL and packed_depth_stencil is not supported.
    6375};
    6476
  • trunk/WebCore/html/canvas/WebGLRenderingContext.cpp

    r71291 r71367  
    3535#include "Console.h"
    3636#include "DOMWindow.h"
     37#include "Extensions3D.h"
    3738#include "FrameView.h"
    3839#include "HTMLCanvasElement.h"
     
    156157    if (!isGLES2Compliant())
    157158        initVertexAttrib0();
     159
     160    if (isGLES2Compliant())
     161        m_isDepthStencilSupported = m_context->getExtensions()->supports("GL_OES_packed_depth_stencil");
     162    else
     163        m_isDepthStencilSupported = m_context->getExtensions()->supports("GL_EXT_packed_depth_stencil");
     164
    158165    m_context->reshape(canvas()->width(), canvas()->height());
    159166    m_context->viewport(0, 0, canvas()->width(), canvas()->height());
     
    16521659        return WebGLGetInfo();
    16531660    }
     1661    if (!m_renderbufferBinding || !m_renderbufferBinding->object()) {
     1662        m_context->synthesizeGLError(GraphicsContext3D::INVALID_OPERATION);
     1663        return WebGLGetInfo();
     1664    }
     1665
     1666    if (m_renderbufferBinding->getInternalFormat() == GraphicsContext3D::DEPTH_STENCIL
     1667        && !m_renderbufferBinding->isValid()) {
     1668        ASSERT(!m_isDepthStencilSupported);
     1669        long value = 0;
     1670        switch (pname) {
     1671        case GraphicsContext3D::RENDERBUFFER_WIDTH:
     1672            value = static_cast<long>(m_renderbufferBinding->getWidth());
     1673            break;
     1674        case GraphicsContext3D::RENDERBUFFER_HEIGHT:
     1675            value = static_cast<long>(m_renderbufferBinding->getHeight());
     1676            break;
     1677        case GraphicsContext3D::RENDERBUFFER_RED_SIZE:
     1678        case GraphicsContext3D::RENDERBUFFER_GREEN_SIZE:
     1679        case GraphicsContext3D::RENDERBUFFER_BLUE_SIZE:
     1680        case GraphicsContext3D::RENDERBUFFER_ALPHA_SIZE:
     1681            value = 0;
     1682            break;
     1683        case GraphicsContext3D::RENDERBUFFER_DEPTH_SIZE:
     1684            value = 24;
     1685            break;
     1686        case GraphicsContext3D::RENDERBUFFER_STENCIL_SIZE:
     1687            value = 8;
     1688            break;
     1689        case GraphicsContext3D::RENDERBUFFER_INTERNAL_FORMAT:
     1690            return WebGLGetInfo(m_renderbufferBinding->getInternalFormat());
     1691        default:
     1692            m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM);
     1693            return WebGLGetInfo();
     1694        }
     1695        return WebGLGetInfo(value);
     1696    }
    16541697
    16551698    WebGLStateRestorer(this, false);
     
    16671710        return WebGLGetInfo(static_cast<long>(value));
    16681711    case GraphicsContext3D::RENDERBUFFER_INTERNAL_FORMAT:
    1669         if (!m_renderbufferBinding) {
    1670             m_context->synthesizeGLError(GraphicsContext3D::INVALID_OPERATION);
    1671             return WebGLGetInfo();
    1672         }
    16731712        return WebGLGetInfo(m_renderbufferBinding->getInternalFormat());
    16741713    default:
     
    21852224    if (isContextLost())
    21862225        return;
     2226    if (target != GraphicsContext3D::RENDERBUFFER) {
     2227        m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM);
     2228        return;
     2229    }
     2230    if (!m_renderbufferBinding || !m_renderbufferBinding->object()) {
     2231        m_context->synthesizeGLError(GraphicsContext3D::INVALID_OPERATION);
     2232        return;
     2233    }
    21872234    switch (internalformat) {
    21882235    case GraphicsContext3D::DEPTH_COMPONENT16:
     
    21912238    case GraphicsContext3D::RGB565:
    21922239    case GraphicsContext3D::STENCIL_INDEX8:
     2240        m_context->renderbufferStorage(target, internalformat, width, height);
     2241        m_renderbufferBinding->setInternalFormat(internalformat);
     2242        m_renderbufferBinding->setIsValid(true);
     2243        cleanupAfterGraphicsCall(false);
     2244        break;
    21932245    case GraphicsContext3D::DEPTH_STENCIL:
    2194         m_context->renderbufferStorage(target, internalformat, width, height);
    2195         if (m_renderbufferBinding)
    2196             m_renderbufferBinding->setInternalFormat(internalformat);
    2197         cleanupAfterGraphicsCall(false);
     2246        if (m_isDepthStencilSupported) {
     2247            m_context->renderbufferStorage(target, internalformat, width, height);
     2248            cleanupAfterGraphicsCall(false);
     2249        } else
     2250            m_renderbufferBinding->setSize(width, height);
     2251        m_renderbufferBinding->setIsValid(m_isDepthStencilSupported);
     2252        m_renderbufferBinding->setInternalFormat(internalformat);
    21982253        break;
    21992254    default:
  • trunk/WebCore/html/canvas/WebGLRenderingContext.h

    r71282 r71367  
    432432    unsigned long m_stencilFuncMask;
    433433
     434    bool m_isDepthStencilSupported;
     435
    434436    // Helpers for getParameter and others
    435437    WebGLGetInfo getBooleanParameter(unsigned long pname);
Note: See TracChangeset for help on using the changeset viewer.