Changeset 102697 in webkit


Ignore:
Timestamp:
Dec 13, 2011 12:53:17 PM (12 years ago)
Author:
zmo@google.com
Message:

Implement GLES2 CheckFramebufferStatus() behavior
https://bugs.webkit.org/show_bug.cgi?id=74228

Reviewed by Kenneth Russell.

Source/WebCore:

  • html/canvas/WebGLFramebuffer.cpp:

(WebCore::WebGLFramebuffer::getColorBufferWidth): Add ColorBuffer to the function name - this is more accurate.
(WebCore::WebGLFramebuffer::getColorBufferHeight): Ditto.
(WebCore::WebGLFramebuffer::checkStatus): Implement full semantics of GLES2 glCheckFramebufferStatus().
(WebCore::WebGLFramebuffer::onAccess): Call checkStatus().

  • html/canvas/WebGLFramebuffer.h:
  • html/canvas/WebGLRenderingContext.cpp:

(WebCore::WebGLRenderingContext::checkFramebufferStatus): Call checkStatus().
(WebCore::WebGLRenderingContext::getFramebufferAttachmentParameter): No longer check framebuffer status.
(WebCore::WebGLRenderingContext::getBoundFramebufferWidth): Call getColorBufferWidth.
(WebCore::WebGLRenderingContext::getBoundFramebufferHeight): Call getColorBufferHeight.

LayoutTests:

  • fast/canvas/webgl/framebuffer-object-attachment-expected.txt:
  • fast/canvas/webgl/framebuffer-object-attachment.html: sync with khronos side, the whole file
  • fast/canvas/webgl/resources/webgl-test.js: synced with khronos side, two listed functions

(shouldGenerateGLError):
(glErrorShouldBe):

  • platform/chromium/test_expectations.txt: Mark framebuffer-object-*.html as failing due to mesa lib bug.
Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r102690 r102697  
     12011-12-09  Zhenyao Mo  <zmo@google.com>
     2
     3        Implement GLES2 CheckFramebufferStatus() behavior
     4        https://bugs.webkit.org/show_bug.cgi?id=74228
     5
     6        Reviewed by Kenneth Russell.
     7
     8        * fast/canvas/webgl/framebuffer-object-attachment-expected.txt:
     9        * fast/canvas/webgl/framebuffer-object-attachment.html: sync with khronos side, the whole file
     10        * fast/canvas/webgl/resources/webgl-test.js: synced with khronos side, two listed functions
     11        (shouldGenerateGLError):
     12        (glErrorShouldBe):
     13        * platform/chromium/test_expectations.txt: Mark framebuffer-object-*.html as failing due to mesa lib bug.
     14
    1152011-12-12  Robert Hogan  <robert@webkit.org>
    216
  • trunk/LayoutTests/fast/canvas/webgl/framebuffer-object-attachment-expected.txt

    r71367 r102697  
    33On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
    44
     5
     6Dimensions 0 x 0
    57Create renderbuffers
    68PASS gl = create3DContext() is non-null.
     
    1618PASS fbo = gl.createFramebuffer() is non-null.
    1719PASS getError was expected value: NO_ERROR :
     20PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     21PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     22PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
    1823Attach depth using STENCIL_ATTACHMENT
    1924PASS fbo = gl.createFramebuffer() is non-null.
    2025PASS getError was expected value: NO_ERROR :
    21 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
     26PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
    2227PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
    2328PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     
    2530PASS fbo = gl.createFramebuffer() is non-null.
    2631PASS getError was expected value: NO_ERROR :
    27 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
     32PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
    2833PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
    2934PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     
    3136PASS fbo = gl.createFramebuffer() is non-null.
    3237PASS getError was expected value: NO_ERROR :
     38PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     39PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     40PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
    3341Attach stencil using DEPTH_ATTACHMENT
    3442PASS fbo = gl.createFramebuffer() is non-null.
    3543PASS getError was expected value: NO_ERROR :
    36 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
     44PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
    3745PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
    3846PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     
    4048PASS fbo = gl.createFramebuffer() is non-null.
    4149PASS getError was expected value: NO_ERROR :
    42 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
     50PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
    4351PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
    4452PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     
    4654PASS fbo = gl.createFramebuffer() is non-null.
    4755PASS getError was expected value: NO_ERROR :
     56PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     57PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     58PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
    4859Attach depthStencil using DEPTH_ATTACHMENT
    4960PASS fbo = gl.createFramebuffer() is non-null.
    5061PASS getError was expected value: NO_ERROR :
    51 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
     62PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
    5263PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
    5364PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     
    5566PASS fbo = gl.createFramebuffer() is non-null.
    5667PASS getError was expected value: NO_ERROR :
    57 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
     68PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
    5869PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
    5970PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     
    6273PASS getError was expected value: NO_ERROR :
    6374PASS getError was expected value: NO_ERROR :
    64 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
     75PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
    6576Attach stencil, then depth, causing conflict
    6677PASS fbo = gl.createFramebuffer() is non-null.
    6778PASS getError was expected value: NO_ERROR :
    6879PASS getError was expected value: NO_ERROR :
    69 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
     80PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
    7081Attach depth, then depthStencil, causing conflict
    7182PASS fbo = gl.createFramebuffer() is non-null.
    7283PASS getError was expected value: NO_ERROR :
    7384PASS getError was expected value: NO_ERROR :
    74 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
     85PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
    7586Attach depthStencil, then depth, causing conflict
    7687PASS fbo = gl.createFramebuffer() is non-null.
    7788PASS getError was expected value: NO_ERROR :
    7889PASS getError was expected value: NO_ERROR :
    79 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
     90PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
    8091Attach stencil, then depthStencil, causing conflict
    8192PASS fbo = gl.createFramebuffer() is non-null.
    8293PASS getError was expected value: NO_ERROR :
    8394PASS getError was expected value: NO_ERROR :
    84 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
     95PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
    8596Attach depthStencil, then stencil, causing conflict
    8697PASS fbo = gl.createFramebuffer() is non-null.
    8798PASS getError was expected value: NO_ERROR :
    8899PASS getError was expected value: NO_ERROR :
    89 PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_UNSUPPORTED
     100PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
    90101Attach color renderbuffer with internalformat == RGBA4
    91102PASS colorBuffer = gl.createRenderbuffer() is non-null.
     
    93104PASS fbo = gl.createFramebuffer() is non-null.
    94105PASS getError was expected value: NO_ERROR :
     106PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     107PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     108PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
    95109Attach color renderbuffer with internalformat == RGB5_A1
    96110PASS colorBuffer = gl.createRenderbuffer() is non-null.
     
    98112PASS fbo = gl.createFramebuffer() is non-null.
    99113PASS getError was expected value: NO_ERROR :
     114PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     115PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     116PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
    100117Attach color renderbuffer with internalformat == RGB565
    101118PASS colorBuffer = gl.createRenderbuffer() is non-null.
     
    103120PASS fbo = gl.createFramebuffer() is non-null.
    104121PASS getError was expected value: NO_ERROR :
     122PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     123PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     124PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     125Create and attach depthStencil renderbuffer
     126PASS depthStencilBuffer = gl.createRenderbuffer() is non-null.
     127PASS getError was expected value: NO_ERROR :
     128PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_WIDTH) is width
     129PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_HEIGHT) is height
     130PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_INTERNAL_FORMAT) is gl.DEPTH_STENCIL
     131PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_RED_SIZE) is 0
     132PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_GREEN_SIZE) is 0
     133PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_BLUE_SIZE) is 0
     134PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_ALPHA_SIZE) is 0
     135PASS getError was expected value: NO_ERROR :
     136PASS fbo = gl.createFramebuffer() is non-null.
     137PASS getError was expected value: NO_ERROR :
     138PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     139PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     140PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     141
     142Dimensions 0 x 2
     143Create renderbuffers
     144PASS gl = create3DContext() is non-null.
     145PASS colorBuffer = gl.createRenderbuffer() is non-null.
     146PASS getError was expected value: NO_ERROR :
     147PASS depthBuffer = gl.createRenderbuffer() is non-null.
     148PASS getError was expected value: NO_ERROR :
     149PASS stencilBuffer = gl.createRenderbuffer() is non-null.
     150PASS getError was expected value: NO_ERROR :
     151PASS depthStencilBuffer = gl.createRenderbuffer() is non-null.
     152PASS getError was expected value: NO_ERROR :
     153Attach depth using DEPTH_ATTACHMENT
     154PASS fbo = gl.createFramebuffer() is non-null.
     155PASS getError was expected value: NO_ERROR :
     156PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     157PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     158PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     159Attach depth using STENCIL_ATTACHMENT
     160PASS fbo = gl.createFramebuffer() is non-null.
     161PASS getError was expected value: NO_ERROR :
     162PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     163PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     164PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     165Attach depth using DEPTH_STENCIL_ATTACHMENT
     166PASS fbo = gl.createFramebuffer() is non-null.
     167PASS getError was expected value: NO_ERROR :
     168PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     169PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     170PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     171Attach stencil using STENCIL_ATTACHMENT
     172PASS fbo = gl.createFramebuffer() is non-null.
     173PASS getError was expected value: NO_ERROR :
     174PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     175PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     176PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     177Attach stencil using DEPTH_ATTACHMENT
     178PASS fbo = gl.createFramebuffer() is non-null.
     179PASS getError was expected value: NO_ERROR :
     180PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     181PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     182PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     183Attach stencil using DEPTH_STENCIL_ATTACHMENT
     184PASS fbo = gl.createFramebuffer() is non-null.
     185PASS getError was expected value: NO_ERROR :
     186PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     187PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     188PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     189Attach depthStencil using DEPTH_STENCIL_ATTACHMENT
     190PASS fbo = gl.createFramebuffer() is non-null.
     191PASS getError was expected value: NO_ERROR :
     192PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     193PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     194PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     195Attach depthStencil using DEPTH_ATTACHMENT
     196PASS fbo = gl.createFramebuffer() is non-null.
     197PASS getError was expected value: NO_ERROR :
     198PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     199PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     200PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     201Attach depthStencil using STENCIL_ATTACHMENT
     202PASS fbo = gl.createFramebuffer() is non-null.
     203PASS getError was expected value: NO_ERROR :
     204PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     205PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     206PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     207Attach depth, then stencil, causing conflict
     208PASS fbo = gl.createFramebuffer() is non-null.
     209PASS getError was expected value: NO_ERROR :
     210PASS getError was expected value: NO_ERROR :
     211PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     212Attach stencil, then depth, causing conflict
     213PASS fbo = gl.createFramebuffer() is non-null.
     214PASS getError was expected value: NO_ERROR :
     215PASS getError was expected value: NO_ERROR :
     216PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     217Attach depth, then depthStencil, causing conflict
     218PASS fbo = gl.createFramebuffer() is non-null.
     219PASS getError was expected value: NO_ERROR :
     220PASS getError was expected value: NO_ERROR :
     221PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     222Attach depthStencil, then depth, causing conflict
     223PASS fbo = gl.createFramebuffer() is non-null.
     224PASS getError was expected value: NO_ERROR :
     225PASS getError was expected value: NO_ERROR :
     226PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     227Attach stencil, then depthStencil, causing conflict
     228PASS fbo = gl.createFramebuffer() is non-null.
     229PASS getError was expected value: NO_ERROR :
     230PASS getError was expected value: NO_ERROR :
     231PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     232Attach depthStencil, then stencil, causing conflict
     233PASS fbo = gl.createFramebuffer() is non-null.
     234PASS getError was expected value: NO_ERROR :
     235PASS getError was expected value: NO_ERROR :
     236PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     237Attach color renderbuffer with internalformat == RGBA4
     238PASS colorBuffer = gl.createRenderbuffer() is non-null.
     239PASS getError was expected value: NO_ERROR :
     240PASS fbo = gl.createFramebuffer() is non-null.
     241PASS getError was expected value: NO_ERROR :
     242PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     243PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     244PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     245Attach color renderbuffer with internalformat == RGB5_A1
     246PASS colorBuffer = gl.createRenderbuffer() is non-null.
     247PASS getError was expected value: NO_ERROR :
     248PASS fbo = gl.createFramebuffer() is non-null.
     249PASS getError was expected value: NO_ERROR :
     250PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     251PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     252PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     253Attach color renderbuffer with internalformat == RGB565
     254PASS colorBuffer = gl.createRenderbuffer() is non-null.
     255PASS getError was expected value: NO_ERROR :
     256PASS fbo = gl.createFramebuffer() is non-null.
     257PASS getError was expected value: NO_ERROR :
     258PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     259PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     260PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     261Create and attach depthStencil renderbuffer
     262PASS depthStencilBuffer = gl.createRenderbuffer() is non-null.
     263PASS getError was expected value: NO_ERROR :
     264PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_WIDTH) is width
     265PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_INTERNAL_FORMAT) is gl.DEPTH_STENCIL
     266PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_RED_SIZE) is 0
     267PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_GREEN_SIZE) is 0
     268PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_BLUE_SIZE) is 0
     269PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_ALPHA_SIZE) is 0
     270PASS getError was expected value: NO_ERROR :
     271PASS fbo = gl.createFramebuffer() is non-null.
     272PASS getError was expected value: NO_ERROR :
     273PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     274PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     275PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     276
     277Dimensions 2 x 0
     278Create renderbuffers
     279PASS gl = create3DContext() is non-null.
     280PASS colorBuffer = gl.createRenderbuffer() is non-null.
     281PASS getError was expected value: NO_ERROR :
     282PASS depthBuffer = gl.createRenderbuffer() is non-null.
     283PASS getError was expected value: NO_ERROR :
     284PASS stencilBuffer = gl.createRenderbuffer() is non-null.
     285PASS getError was expected value: NO_ERROR :
     286PASS depthStencilBuffer = gl.createRenderbuffer() is non-null.
     287PASS getError was expected value: NO_ERROR :
     288Attach depth using DEPTH_ATTACHMENT
     289PASS fbo = gl.createFramebuffer() is non-null.
     290PASS getError was expected value: NO_ERROR :
     291PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     292PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     293PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     294Attach depth using STENCIL_ATTACHMENT
     295PASS fbo = gl.createFramebuffer() is non-null.
     296PASS getError was expected value: NO_ERROR :
     297PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     298PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     299PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     300Attach depth using DEPTH_STENCIL_ATTACHMENT
     301PASS fbo = gl.createFramebuffer() is non-null.
     302PASS getError was expected value: NO_ERROR :
     303PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     304PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     305PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     306Attach stencil using STENCIL_ATTACHMENT
     307PASS fbo = gl.createFramebuffer() is non-null.
     308PASS getError was expected value: NO_ERROR :
     309PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     310PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     311PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     312Attach stencil using DEPTH_ATTACHMENT
     313PASS fbo = gl.createFramebuffer() is non-null.
     314PASS getError was expected value: NO_ERROR :
     315PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     316PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     317PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     318Attach stencil using DEPTH_STENCIL_ATTACHMENT
     319PASS fbo = gl.createFramebuffer() is non-null.
     320PASS getError was expected value: NO_ERROR :
     321PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     322PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     323PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     324Attach depthStencil using DEPTH_STENCIL_ATTACHMENT
     325PASS fbo = gl.createFramebuffer() is non-null.
     326PASS getError was expected value: NO_ERROR :
     327PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     328PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     329PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     330Attach depthStencil using DEPTH_ATTACHMENT
     331PASS fbo = gl.createFramebuffer() is non-null.
     332PASS getError was expected value: NO_ERROR :
     333PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     334PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     335PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     336Attach depthStencil using STENCIL_ATTACHMENT
     337PASS fbo = gl.createFramebuffer() is non-null.
     338PASS getError was expected value: NO_ERROR :
     339PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     340PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     341PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     342Attach depth, then stencil, causing conflict
     343PASS fbo = gl.createFramebuffer() is non-null.
     344PASS getError was expected value: NO_ERROR :
     345PASS getError was expected value: NO_ERROR :
     346PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     347Attach stencil, then depth, causing conflict
     348PASS fbo = gl.createFramebuffer() is non-null.
     349PASS getError was expected value: NO_ERROR :
     350PASS getError was expected value: NO_ERROR :
     351PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     352Attach depth, then depthStencil, causing conflict
     353PASS fbo = gl.createFramebuffer() is non-null.
     354PASS getError was expected value: NO_ERROR :
     355PASS getError was expected value: NO_ERROR :
     356PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     357Attach depthStencil, then depth, causing conflict
     358PASS fbo = gl.createFramebuffer() is non-null.
     359PASS getError was expected value: NO_ERROR :
     360PASS getError was expected value: NO_ERROR :
     361PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     362Attach stencil, then depthStencil, causing conflict
     363PASS fbo = gl.createFramebuffer() is non-null.
     364PASS getError was expected value: NO_ERROR :
     365PASS getError was expected value: NO_ERROR :
     366PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     367Attach depthStencil, then stencil, causing conflict
     368PASS fbo = gl.createFramebuffer() is non-null.
     369PASS getError was expected value: NO_ERROR :
     370PASS getError was expected value: NO_ERROR :
     371PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     372Attach color renderbuffer with internalformat == RGBA4
     373PASS colorBuffer = gl.createRenderbuffer() is non-null.
     374PASS getError was expected value: NO_ERROR :
     375PASS fbo = gl.createFramebuffer() is non-null.
     376PASS getError was expected value: NO_ERROR :
     377PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     378PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     379PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     380Attach color renderbuffer with internalformat == RGB5_A1
     381PASS colorBuffer = gl.createRenderbuffer() is non-null.
     382PASS getError was expected value: NO_ERROR :
     383PASS fbo = gl.createFramebuffer() is non-null.
     384PASS getError was expected value: NO_ERROR :
     385PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     386PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     387PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     388Attach color renderbuffer with internalformat == RGB565
     389PASS colorBuffer = gl.createRenderbuffer() is non-null.
     390PASS getError was expected value: NO_ERROR :
     391PASS fbo = gl.createFramebuffer() is non-null.
     392PASS getError was expected value: NO_ERROR :
     393PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     394PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     395PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     396Create and attach depthStencil renderbuffer
     397PASS depthStencilBuffer = gl.createRenderbuffer() is non-null.
     398PASS getError was expected value: NO_ERROR :
     399PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_HEIGHT) is height
     400PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_INTERNAL_FORMAT) is gl.DEPTH_STENCIL
     401PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_RED_SIZE) is 0
     402PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_GREEN_SIZE) is 0
     403PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_BLUE_SIZE) is 0
     404PASS gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_ALPHA_SIZE) is 0
     405PASS getError was expected value: NO_ERROR :
     406PASS fbo = gl.createFramebuffer() is non-null.
     407PASS getError was expected value: NO_ERROR :
     408PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     409PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     410PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     411
     412Dimensions 2 x 2
     413Create renderbuffers
     414PASS gl = create3DContext() is non-null.
     415PASS colorBuffer = gl.createRenderbuffer() is non-null.
     416PASS getError was expected value: NO_ERROR :
     417PASS depthBuffer = gl.createRenderbuffer() is non-null.
     418PASS getError was expected value: NO_ERROR :
     419PASS stencilBuffer = gl.createRenderbuffer() is non-null.
     420PASS getError was expected value: NO_ERROR :
     421PASS depthStencilBuffer = gl.createRenderbuffer() is non-null.
     422PASS getError was expected value: NO_ERROR :
     423Attach depth using DEPTH_ATTACHMENT
     424PASS fbo = gl.createFramebuffer() is non-null.
     425PASS getError was expected value: NO_ERROR :
     426PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36053
     427Attach depth using STENCIL_ATTACHMENT
     428PASS fbo = gl.createFramebuffer() is non-null.
     429PASS getError was expected value: NO_ERROR :
     430PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     431PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     432PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     433Attach depth using DEPTH_STENCIL_ATTACHMENT
     434PASS fbo = gl.createFramebuffer() is non-null.
     435PASS getError was expected value: NO_ERROR :
     436PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     437PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     438PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     439Attach stencil using STENCIL_ATTACHMENT
     440PASS fbo = gl.createFramebuffer() is non-null.
     441PASS getError was expected value: NO_ERROR :
     442PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36061
     443Attach stencil using DEPTH_ATTACHMENT
     444PASS fbo = gl.createFramebuffer() is non-null.
     445PASS getError was expected value: NO_ERROR :
     446PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     447PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     448PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     449Attach stencil using DEPTH_STENCIL_ATTACHMENT
     450PASS fbo = gl.createFramebuffer() is non-null.
     451PASS getError was expected value: NO_ERROR :
     452PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     453PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     454PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     455Attach depthStencil using DEPTH_STENCIL_ATTACHMENT
     456PASS fbo = gl.createFramebuffer() is non-null.
     457PASS getError was expected value: NO_ERROR :
     458PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36053
     459Attach depthStencil using DEPTH_ATTACHMENT
     460PASS fbo = gl.createFramebuffer() is non-null.
     461PASS getError was expected value: NO_ERROR :
     462PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     463PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     464PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     465Attach depthStencil using STENCIL_ATTACHMENT
     466PASS fbo = gl.createFramebuffer() is non-null.
     467PASS getError was expected value: NO_ERROR :
     468PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36054
     469PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     470PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION :
     471Attach depth, then stencil, causing conflict
     472PASS fbo = gl.createFramebuffer() is non-null.
     473PASS getError was expected value: NO_ERROR :
     474PASS getError was expected value: NO_ERROR :
     475PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36061
     476Attach stencil, then depth, causing conflict
     477PASS fbo = gl.createFramebuffer() is non-null.
     478PASS getError was expected value: NO_ERROR :
     479PASS getError was expected value: NO_ERROR :
     480PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36061
     481Attach depth, then depthStencil, causing conflict
     482PASS fbo = gl.createFramebuffer() is non-null.
     483PASS getError was expected value: NO_ERROR :
     484PASS getError was expected value: NO_ERROR :
     485PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36061
     486Attach depthStencil, then depth, causing conflict
     487PASS fbo = gl.createFramebuffer() is non-null.
     488PASS getError was expected value: NO_ERROR :
     489PASS getError was expected value: NO_ERROR :
     490PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36061
     491Attach stencil, then depthStencil, causing conflict
     492PASS fbo = gl.createFramebuffer() is non-null.
     493PASS getError was expected value: NO_ERROR :
     494PASS getError was expected value: NO_ERROR :
     495PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36061
     496Attach depthStencil, then stencil, causing conflict
     497PASS fbo = gl.createFramebuffer() is non-null.
     498PASS getError was expected value: NO_ERROR :
     499PASS getError was expected value: NO_ERROR :
     500PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36061
     501Attach color renderbuffer with internalformat == RGBA4
     502PASS colorBuffer = gl.createRenderbuffer() is non-null.
     503PASS getError was expected value: NO_ERROR :
     504PASS fbo = gl.createFramebuffer() is non-null.
     505PASS getError was expected value: NO_ERROR :
     506PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36053
     507Attach color renderbuffer with internalformat == RGB5_A1
     508PASS colorBuffer = gl.createRenderbuffer() is non-null.
     509PASS getError was expected value: NO_ERROR :
     510PASS fbo = gl.createFramebuffer() is non-null.
     511PASS getError was expected value: NO_ERROR :
     512PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36053
     513Attach color renderbuffer with internalformat == RGB565
     514PASS colorBuffer = gl.createRenderbuffer() is non-null.
     515PASS getError was expected value: NO_ERROR :
     516PASS fbo = gl.createFramebuffer() is non-null.
     517PASS getError was expected value: NO_ERROR :
     518PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36053
    105519Create and attach depthStencil renderbuffer
    106520PASS depthStencilBuffer = gl.createRenderbuffer() is non-null.
     
    118532PASS fbo = gl.createFramebuffer() is non-null.
    119533PASS getError was expected value: NO_ERROR :
     534PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned 36053
     535PASS fbo = gl.createFramebuffer() is non-null.
     536PASS colorBuffer = gl.createRenderbuffer() is non-null.
     537PASS depthBuffer = gl.createRenderbuffer() is non-null.
     538PASS getError was expected value: NO_ERROR :
     539
     540Attachments of different sizes should be FRAMEBUFFER_INCOMPLETE_DIMENSIONS (OpenGL ES 2.0 4.4.5)
     541PASS fbo = gl.createFramebuffer() is non-null.
     542PASS colorBuffer = gl.createRenderbuffer() is non-null.
     543PASS depthBuffer = gl.createRenderbuffer() is non-null.
     544PASS getError was expected value: NO_ERROR :
     545PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_COMPLETE was FRAMEBUFFER_COMPLETE
     546PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_INCOMPLETE_DIMENSIONS was FRAMEBUFFER_INCOMPLETE_DIMENSIONS or FRAMEBUFFER_UNSUPPORTED
     547PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_COMPLETE was FRAMEBUFFER_COMPLETE
     548PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_INCOMPLETE_DIMENSIONS was FRAMEBUFFER_INCOMPLETE_DIMENSIONS or FRAMEBUFFER_UNSUPPORTED
     549PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_COMPLETE was FRAMEBUFFER_COMPLETE
     550PASS getError was expected value: NO_ERROR :
     551PASS getError was expected value: NO_ERROR :
     552PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_INCOMPLETE_DIMENSIONS was FRAMEBUFFER_INCOMPLETE_DIMENSIONS or FRAMEBUFFER_UNSUPPORTED
     553PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_COMPLETE was FRAMEBUFFER_COMPLETE
     554PASS getError was expected value: NO_ERROR :
     555PASS fbo = gl.createFramebuffer() is non-null.
     556PASS colorBuffer = gl.createRenderbuffer() is non-null.
     557PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_COMPLETE was FRAMEBUFFER_COMPLETE
     558
     559Wrong storage type for type of attachment be FRAMEBUFFER_INCOMPLETE_ATTACHMENT (OpenGL ES 2.0 4.4.5)
     560PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_INCOMPLETE_ATTACHMENT was FRAMEBUFFER_INCOMPLETE_ATTACHMENT or FRAMEBUFFER_UNSUPPORTED
     561PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_COMPLETE was FRAMEBUFFER_COMPLETE
     562
     5630 size attachment should be FRAMEBUFFER_INCOMPLETE_ATTACHMENT (OpenGL ES 2.0 4.4.5)
     564PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_INCOMPLETE_ATTACHMENT was FRAMEBUFFER_INCOMPLETE_ATTACHMENT or FRAMEBUFFER_UNSUPPORTED
     565PASS getError was expected value: NO_ERROR :
     566
     567No attachments should be INCOMPLETE_FRAMEBUFFER_MISSING_ATTACHMENT (OpenGL ES 2.0 4.4.5)
     568PASS fbo = gl.createFramebuffer() is non-null.
     569PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT was FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT or FRAMEBUFFER_UNSUPPORTED
     570PASS colorBuffer = gl.createRenderbuffer() is non-null.
     571PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_COMPLETE was FRAMEBUFFER_COMPLETE
     572PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT was FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT or FRAMEBUFFER_UNSUPPORTED
     573PASS getError was expected value: NO_ERROR :
     574
     575Test drawing or reading from an incomplete framebuffer
     576PASS fbo = gl.createFramebuffer() is non-null.
     577PASS colorBuffer = gl.createRenderbuffer() is non-null.
     578PASS depthBuffer = gl.createRenderbuffer() is non-null.
     579PASS getError was expected value: NO_ERROR :
     580PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_COMPLETE was FRAMEBUFFER_COMPLETE
     581PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_INCOMPLETE_DIMENSIONS was FRAMEBUFFER_INCOMPLETE_DIMENSIONS or FRAMEBUFFER_UNSUPPORTED
     582
     583Drawing or reading from an incomplete framebuffer should generate INVALID_FRAMEBUFFER_OPERATION
     584PASS getError was expected value: NO_ERROR :
     585PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : drawArrays with incomplete framebuffer
     586PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : readPixels from incomplete framebuffer
     587PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : copyTexImage2D from incomplete framebuffer
     588PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : copyTexSubImage2D from incomplete framebuffer
     589PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : clear with incomplete framebuffer
     590PASS fbo2 = gl.createFramebuffer() is non-null.
     591PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT was FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT or FRAMEBUFFER_UNSUPPORTED
     592
     593Drawing or reading from an incomplete framebuffer should generate INVALID_FRAMEBUFFER_OPERATION
     594PASS getError was expected value: NO_ERROR :
     595PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : drawArrays with incomplete framebuffer
     596PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : readPixels from incomplete framebuffer
     597PASS getError was expected value: INVALID_OPERATION : copyTexImage2D from incomplete framebuffer
     598PASS getError was expected value: INVALID_OPERATION : copyTexSubImage2D from incomplete framebuffer
     599PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : clear with incomplete framebuffer
     600PASS colorBuffer = gl.createRenderbuffer() is non-null.
     601
     602Drawing or reading from an incomplete framebuffer should generate INVALID_FRAMEBUFFER_OPERATION
     603PASS getError was expected value: NO_ERROR :
     604PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : drawArrays with incomplete framebuffer
     605PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : readPixels from incomplete framebuffer
     606PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : copyTexImage2D from incomplete framebuffer
     607PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : copyTexSubImage2D from incomplete framebuffer
     608PASS getError was expected value: INVALID_FRAMEBUFFER_OPERATION : clear with incomplete framebuffer
    120609PASS successfullyParsed is true
    121610
  • trunk/LayoutTests/fast/canvas/webgl/framebuffer-object-attachment.html

    r98407 r102697  
     1<!DOCTYPE html>
    12<html>
    23<head>
     4<meta charset="utf-8">
    35<script src="../../js/resources/js-test-pre.js"></script>
    46<script src="resources/webgl-test.js"></script>
     7<script src="resources/webgl-test-utils.js"></script>
    58</head>
    69<body>
     
    912
    1013<script>
    11 
     14var wtu = WebGLTestUtils;
    1215var gl;
    1316var fbo;
     
    1619var depthStencilBuffer;
    1720var colorBuffer;
    18 var width = 2;
    19 var height = 2;
    20 
    21 function testAttachment(attachment, buffer, isConflicted)
     21var width;
     22var height;
     23
     24const ALLOW_COMPLETE              = 0x01;
     25const ALLOW_UNSUPPORTED           = 0x02;
     26const ALLOW_INCOMPLETE_ATTACHMENT = 0x04;
     27
     28function checkFramebufferForAllowedStatuses(allowedStatuses)
     29{
     30    // If the framebuffer is in an error state for multiple reasons,
     31    // we can't guarantee which one will be reported.
     32    var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
     33    var statusAllowed = ((allowedStatuses & ALLOW_COMPLETE) && (status == gl.FRAMEBUFFER_COMPLETE)) ||
     34                        ((allowedStatuses & ALLOW_UNSUPPORTED) && (status == gl.FRAMEBUFFER_UNSUPPORTED)) ||
     35                        ((allowedStatuses & ALLOW_INCOMPLETE_ATTACHMENT) && (status == gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT));
     36    var msg = "gl.checkFramebufferStatus(gl.FRAMEBUFFER) returned " + status;
     37    if (statusAllowed)
     38        testPassed(msg);
     39    else
     40        testFailed(msg);
     41}
     42
     43function testAttachment(attachment, buffer, allowedStatuses)
    2244{
    2345    shouldBeNonNull("fbo = gl.createFramebuffer()");
     
    2648    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, buffer);
    2749    glErrorShouldBe(gl, gl.NO_ERROR);
    28     if (isConflicted) {
    29         shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_UNSUPPORTED");
     50    checkFramebufferForAllowedStatuses(allowedStatuses);
     51    if ((allowedStatuses & ALLOW_COMPLETE) == 0) {
    3052        gl.clear(gl.COLOR_BUFFER_BIT);
    3153        glErrorShouldBe(gl, gl.INVALID_FRAMEBUFFER_OPERATION);
     
    3355        glErrorShouldBe(gl, gl.INVALID_FRAMEBUFFER_OPERATION);
    3456    }
    35 }
    36 
    37 function testAttachments(attachment0, buffer0, attachment1, buffer1, isConflicted)
     57    gl.deleteFramebuffer(fbo);
     58}
     59
     60function testAttachments(attachment0, buffer0, attachment1, buffer1, allowedStatuses)
    3861{
    3962    shouldBeNonNull("fbo = gl.createFramebuffer()");
     
    4467    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment1, gl.RENDERBUFFER, buffer1);
    4568    glErrorShouldBe(gl, gl.NO_ERROR);
    46     if (isConflicted)
    47         shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_UNSUPPORTED");
    48 }
    49 
    50 function testColorRenderbuffer(internalformat)
     69    checkFramebufferForAllowedStatuses(allowedStatuses);
     70    gl.deleteFramebuffer(fbo);
     71}
     72
     73function testColorRenderbuffer(internalformat, allowedStatuses)
    5174{
    5275    shouldBeNonNull("colorBuffer = gl.createRenderbuffer()");
     
    5477    gl.renderbufferStorage(gl.RENDERBUFFER, internalformat, width, height);
    5578    glErrorShouldBe(gl, gl.NO_ERROR);
    56     testAttachment(gl.COLOR_ATTACHMENT0, colorBuffer, false);
    57 }
    58 
    59 function testDepthStencilRenderbuffer()
     79    testAttachment(gl.COLOR_ATTACHMENT0, colorBuffer, allowedStatuses);
     80}
     81
     82function testDepthStencilRenderbuffer(allowedStatuses)
    6083{
    6184    shouldBeNonNull("depthStencilBuffer = gl.createRenderbuffer()");
     
    6386    gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height);
    6487    glErrorShouldBe(gl, gl.NO_ERROR);
    65     shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_WIDTH)", "width");
    66     shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_HEIGHT)", "height");
     88
     89    // OpenGL itself doesn't seem to guarantee that e.g. a 2 x 0
     90    // renderbuffer will report 2 for its width when queried.
     91    if (!(height == 0 && width > 0))
     92        shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_WIDTH)", "width");
     93    if (!(width == 0 && height > 0))
     94        shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_HEIGHT)", "height");
    6795    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_INTERNAL_FORMAT)", "gl.DEPTH_STENCIL");
    6896    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_RED_SIZE)", "0");
     
    7098    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_BLUE_SIZE)", "0");
    7199    shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_ALPHA_SIZE)", "0");
    72     shouldBeTrue("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_DEPTH_SIZE) > 0");
    73     shouldBeTrue("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_STENCIL_SIZE) > 0");
    74     glErrorShouldBe(gl, gl.NO_ERROR);
    75     testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, false);
     100    // Avoid verifying these for zero-sized renderbuffers for the time
     101    // being since it appears that even OpenGL doesn't guarantee them.
     102    if (width > 0 && height > 0) {
     103        shouldBeTrue("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_DEPTH_SIZE) > 0");
     104        shouldBeTrue("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_STENCIL_SIZE) > 0");
     105    }
     106    glErrorShouldBe(gl, gl.NO_ERROR);
     107    testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, allowedStatuses);
    76108}
    77109
    78110description("Test framebuffer object attachment behaviors");
    79111
    80 debug("Create renderbuffers");
    81 shouldBeNonNull("gl = create3DContext()");
    82 shouldBeNonNull("colorBuffer = gl.createRenderbuffer()");
    83 gl.bindRenderbuffer(gl.RENDERBUFFER, colorBuffer);
    84 gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, width, height);
    85 glErrorShouldBe(gl, gl.NO_ERROR);
    86 shouldBeNonNull("depthBuffer = gl.createRenderbuffer()");
    87 gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer);
    88 gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height);
    89 glErrorShouldBe(gl, gl.NO_ERROR);
    90 shouldBeNonNull("stencilBuffer = gl.createRenderbuffer()");
    91 gl.bindRenderbuffer(gl.RENDERBUFFER, stencilBuffer);
    92 gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8, width, height);
    93 glErrorShouldBe(gl, gl.NO_ERROR);
    94 shouldBeNonNull("depthStencilBuffer = gl.createRenderbuffer()");
    95 gl.bindRenderbuffer(gl.RENDERBUFFER, depthStencilBuffer);
    96 gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height);
    97 glErrorShouldBe(gl, gl.NO_ERROR);
    98 
    99 debug("Attach depth using DEPTH_ATTACHMENT");
    100 testAttachment(gl.DEPTH_ATTACHMENT, depthBuffer, false);
    101 debug("Attach depth using STENCIL_ATTACHMENT");
    102 testAttachment(gl.STENCIL_ATTACHMENT, depthBuffer, true);
    103 debug("Attach depth using DEPTH_STENCIL_ATTACHMENT");
    104 testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthBuffer, true);
    105 debug("Attach stencil using STENCIL_ATTACHMENT");
    106 testAttachment(gl.STENCIL_ATTACHMENT, stencilBuffer, false);
    107 debug("Attach stencil using DEPTH_ATTACHMENT");
    108 testAttachment(gl.DEPTH_ATTACHMENT, stencilBuffer, true);
    109 debug("Attach stencil using DEPTH_STENCIL_ATTACHMENT");
    110 testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, stencilBuffer, true);
    111 debug("Attach depthStencil using DEPTH_STENCIL_ATTACHMENT");
    112 testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, false);
    113 debug("Attach depthStencil using DEPTH_ATTACHMENT");
    114 testAttachment(gl.DEPTH_ATTACHMENT, depthStencilBuffer, true);
    115 debug("Attach depthStencil using STENCIL_ATTACHMENT");
    116 testAttachment(gl.STENCIL_ATTACHMENT, depthStencilBuffer, true);
    117 
    118 debug("Attach depth, then stencil, causing conflict");
    119 testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.STENCIL_ATTACHMENT, stencilBuffer, true);
    120 debug("Attach stencil, then depth, causing conflict");
    121 testAttachments(gl.STENCIL_ATTACHMENT, stencilBuffer, gl.DEPTH_ATTACHMENT, depthBuffer, true);
    122 debug("Attach depth, then depthStencil, causing conflict");
    123 testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, true);
    124 debug("Attach depthStencil, then depth, causing conflict");
    125 testAttachments(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, gl.DEPTH_ATTACHMENT, depthBuffer, true);
    126 debug("Attach stencil, then depthStencil, causing conflict");
    127 testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, true);
    128 debug("Attach depthStencil, then stencil, causing conflict");
    129 testAttachments(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, gl.STENCIL_ATTACHMENT, stencilBuffer, true);
    130 
    131 debug("Attach color renderbuffer with internalformat == RGBA4");
    132 testColorRenderbuffer(gl.RGBA4);
    133 
    134 debug("Attach color renderbuffer with internalformat == RGB5_A1");
    135 testColorRenderbuffer(gl.RGB5_A1);
    136 
    137 debug("Attach color renderbuffer with internalformat == RGB565");
    138 testColorRenderbuffer(gl.RGB565);
    139 
    140 debug("Create and attach depthStencil renderbuffer");
    141 testDepthStencilRenderbuffer();
     112for (width = 0; width <= 2; width += 2)
     113{
     114    for (height = 0; height <= 2; height += 2)
     115    {
     116        debug("");
     117        debug("Dimensions " + width + " x " + height);
     118
     119        debug("Create renderbuffers");
     120        shouldBeNonNull("gl = create3DContext()");
     121        shouldBeNonNull("colorBuffer = gl.createRenderbuffer()");
     122        gl.bindRenderbuffer(gl.RENDERBUFFER, colorBuffer);
     123        gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, width, height);
     124        glErrorShouldBe(gl, gl.NO_ERROR);
     125        shouldBeNonNull("depthBuffer = gl.createRenderbuffer()");
     126        gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer);
     127        gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height);
     128        glErrorShouldBe(gl, gl.NO_ERROR);
     129        shouldBeNonNull("stencilBuffer = gl.createRenderbuffer()");
     130        gl.bindRenderbuffer(gl.RENDERBUFFER, stencilBuffer);
     131        gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8, width, height);
     132        glErrorShouldBe(gl, gl.NO_ERROR);
     133        shouldBeNonNull("depthStencilBuffer = gl.createRenderbuffer()");
     134        gl.bindRenderbuffer(gl.RENDERBUFFER, depthStencilBuffer);
     135        gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height);
     136        glErrorShouldBe(gl, gl.NO_ERROR);
     137
     138        var allowedStatusForGoodCase
     139            = (width == 0 || height == 0) ? ALLOW_INCOMPLETE_ATTACHMENT : ALLOW_COMPLETE;
     140
     141        // some cases involving stencil seem to be implementation-dependent
     142        var allowedStatusForImplDependentCase = allowedStatusForGoodCase | ALLOW_UNSUPPORTED;
     143
     144        debug("Attach depth using DEPTH_ATTACHMENT");
     145        testAttachment(gl.DEPTH_ATTACHMENT, depthBuffer, allowedStatusForGoodCase);
     146        debug("Attach depth using STENCIL_ATTACHMENT");
     147        testAttachment(gl.STENCIL_ATTACHMENT, depthBuffer, ALLOW_INCOMPLETE_ATTACHMENT);
     148        debug("Attach depth using DEPTH_STENCIL_ATTACHMENT");
     149        testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthBuffer, ALLOW_INCOMPLETE_ATTACHMENT);
     150        debug("Attach stencil using STENCIL_ATTACHMENT");
     151        testAttachment(gl.STENCIL_ATTACHMENT, stencilBuffer, allowedStatusForImplDependentCase);
     152        debug("Attach stencil using DEPTH_ATTACHMENT");
     153        testAttachment(gl.DEPTH_ATTACHMENT, stencilBuffer, ALLOW_INCOMPLETE_ATTACHMENT);
     154        debug("Attach stencil using DEPTH_STENCIL_ATTACHMENT");
     155        testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, stencilBuffer, ALLOW_INCOMPLETE_ATTACHMENT);
     156        debug("Attach depthStencil using DEPTH_STENCIL_ATTACHMENT");
     157        testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, allowedStatusForGoodCase);
     158        debug("Attach depthStencil using DEPTH_ATTACHMENT");
     159        testAttachment(gl.DEPTH_ATTACHMENT, depthStencilBuffer, ALLOW_INCOMPLETE_ATTACHMENT);
     160        debug("Attach depthStencil using STENCIL_ATTACHMENT");
     161        testAttachment(gl.STENCIL_ATTACHMENT, depthStencilBuffer, ALLOW_INCOMPLETE_ATTACHMENT);
     162
     163        var allowedStatusForConflictedAttachment
     164            = (width == 0 || height == 0) ? ALLOW_UNSUPPORTED | ALLOW_INCOMPLETE_ATTACHMENT
     165                                          : ALLOW_UNSUPPORTED;
     166
     167        debug("Attach depth, then stencil, causing conflict");
     168        testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.STENCIL_ATTACHMENT, stencilBuffer, allowedStatusForConflictedAttachment);
     169        debug("Attach stencil, then depth, causing conflict");
     170        testAttachments(gl.STENCIL_ATTACHMENT, stencilBuffer, gl.DEPTH_ATTACHMENT, depthBuffer, allowedStatusForConflictedAttachment);
     171        debug("Attach depth, then depthStencil, causing conflict");
     172        testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, allowedStatusForConflictedAttachment);
     173        debug("Attach depthStencil, then depth, causing conflict");
     174        testAttachments(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, gl.DEPTH_ATTACHMENT, depthBuffer, allowedStatusForConflictedAttachment);
     175        debug("Attach stencil, then depthStencil, causing conflict");
     176        testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, allowedStatusForConflictedAttachment);
     177        debug("Attach depthStencil, then stencil, causing conflict");
     178        testAttachments(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, gl.STENCIL_ATTACHMENT, stencilBuffer, allowedStatusForConflictedAttachment);
     179
     180        debug("Attach color renderbuffer with internalformat == RGBA4");
     181        testColorRenderbuffer(gl.RGBA4, allowedStatusForGoodCase);
     182
     183        debug("Attach color renderbuffer with internalformat == RGB5_A1");
     184        testColorRenderbuffer(gl.RGB5_A1, allowedStatusForGoodCase);
     185
     186        debug("Attach color renderbuffer with internalformat == RGB565");
     187        testColorRenderbuffer(gl.RGB565, allowedStatusForGoodCase);
     188
     189        debug("Create and attach depthStencil renderbuffer");
     190        testDepthStencilRenderbuffer(allowedStatusForGoodCase);
     191    }
     192}
     193
     194// Determine if we can attach both color and depth or color and depth_stencil
     195var depthFormat;
     196var depthAttachment;
     197
     198function checkValidColorDepthCombination() {
     199    shouldBeNonNull("fbo = gl.createFramebuffer()");
     200    gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
     201    shouldBeNonNull("colorBuffer = gl.createRenderbuffer()");
     202    gl.bindRenderbuffer(gl.RENDERBUFFER, colorBuffer);
     203    gl.framebufferRenderbuffer(
     204        gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorBuffer);
     205    gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16);
     206
     207    shouldBeNonNull("depthBuffer = gl.createRenderbuffer()");
     208    gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer);
     209
     210    return tryDepth(gl.DEPTH_COMPONENT16, gl.DEPTH_ATTACHMENT) || tryDepth(gl.DEPTH_STENCIL, gl.DEPTH_STENCIL_ATTACHMENT);
     211
     212    function tryDepth(try_format, try_attachment) {
     213        if (depthAttachment) {
     214            // If we've tried once unattach the old one.
     215            gl.framebufferRenderbuffer(
     216                gl.FRAMEBUFFER, depthAttachment, gl.RENDERBUFFER, null);
     217        }
     218        depthFormat = try_format;
     219        depthAttachment = try_attachment;
     220        gl.framebufferRenderbuffer(
     221            gl.FRAMEBUFFER, depthAttachment, gl.RENDERBUFFER, depthBuffer);
     222        gl.renderbufferStorage(gl.RENDERBUFFER, depthFormat, 16, 16);
     223        glErrorShouldBe(gl, gl.NO_ERROR);
     224        return gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE;
     225    }
     226}
     227
     228if (checkValidColorDepthCombination()) {
     229    testFramebufferIncompleteDimensions();
     230    testFramebufferIncompleteAttachment();
     231    testFramebufferIncompleteMissingAttachment();
     232    testUsingIncompleteFramebuffer();
     233}
     234
     235function checkFramebuffer(expected) {
     236    var actual = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
     237    var msg = "gl.checkFramebufferStatus(gl.FRAMEBUFFER) should be " + wtu.glEnumToString(gl, expected) + " was " + wtu.glEnumToString(gl, actual);
     238    if (expected != gl.FRAMEBUFFER_COMPLETE) {
     239        msg += " or FRAMEBUFFER_UNSUPPORTED";
     240    }
     241    if (actual == expected ||
     242        (expected != gl.FRAMEBUFFER_COMPLETE &&
     243         actual == gl.FRAMBUFFER_UNSUPPORTED)) {
     244        testPassed(msg);
     245    } else {
     246        testFailed(msg);
     247    }
     248}
     249
     250function testUsingIncompleteFramebuffer() {
     251    debug("");
     252    debug("Test drawing or reading from an incomplete framebuffer");
     253    var program = wtu.setupTexturedQuad(gl);
     254    var tex = gl.createTexture();
     255    wtu.fillTexture(gl, tex, 1, 1, [0,255,0,255]);
     256
     257    shouldBeNonNull("fbo = gl.createFramebuffer()");
     258    gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
     259    shouldBeNonNull("colorBuffer = gl.createRenderbuffer()");
     260    gl.bindRenderbuffer(gl.RENDERBUFFER, colorBuffer);
     261    gl.framebufferRenderbuffer(
     262        gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorBuffer);
     263    gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16);
     264
     265    shouldBeNonNull("depthBuffer = gl.createRenderbuffer()");
     266    gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer);
     267    gl.framebufferRenderbuffer(
     268        gl.FRAMEBUFFER, depthAttachment, gl.RENDERBUFFER, depthBuffer);
     269    gl.renderbufferStorage(gl.RENDERBUFFER, depthFormat, 16, 16);
     270    glErrorShouldBe(gl, gl.NO_ERROR);
     271    checkFramebuffer(gl.FRAMEBUFFER_COMPLETE);
     272
     273    // We pick this combination because it works on desktop OpenGL but should not work on OpenGL ES 2.0
     274    gl.renderbufferStorage(gl.RENDERBUFFER, depthFormat, 32, 16);
     275    checkFramebuffer(gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS);
     276    debug("");
     277    debug("Drawing or reading from an incomplete framebuffer should generate INVALID_FRAMEBUFFER_OPERATION");
     278    testRenderingAndReading();
     279
     280    shouldBeNonNull("fbo2 = gl.createFramebuffer()");
     281    gl.bindFramebuffer(gl.FRAMEBUFFER, fbo2);
     282    checkFramebuffer(gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT);
     283    debug("");
     284    debug("Drawing or reading from an incomplete framebuffer should generate INVALID_FRAMEBUFFER_OPERATION");
     285    testRenderingAndReading();
     286
     287    shouldBeNonNull("colorBuffer = gl.createRenderbuffer()");
     288    gl.bindRenderbuffer(gl.RENDERBUFFER, colorBuffer);
     289    gl.framebufferRenderbuffer(
     290        gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorBuffer);
     291    gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 0, 0);
     292    debug("");
     293    debug("Drawing or reading from an incomplete framebuffer should generate INVALID_FRAMEBUFFER_OPERATION");
     294    testRenderingAndReading();
     295
     296    function testRenderingAndReading() {
     297        glErrorShouldBe(gl, gl.NO_ERROR);
     298        wtu.drawQuad(gl);
     299        glErrorShouldBe(gl, gl.INVALID_FRAMEBUFFER_OPERATION, "drawArrays with incomplete framebuffer");
     300        gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(4));
     301        glErrorShouldBe(gl, gl.INVALID_FRAMEBUFFER_OPERATION, "readPixels from incomplete framebuffer");
     302        // copyTexImage and copyTexSubImage can be either INVALID_FRAMEBUFFER_OPERATION because
     303        // the framebuffer is invalid OR INVALID_OPERATION because in the case of no attachments
     304        // the framebuffer is not of a compatible type.
     305        gl.copyTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
     306        glErrorShouldBe(gl, [gl.INVALID_FRAMEBUFFER_OPERATION, gl.INVALID_OPERATION], "copyTexImage2D from incomplete framebuffer");
     307        gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 0, 0, 1, 1, 0);
     308        glErrorShouldBe(gl, [gl.INVALID_FRAMEBUFFER_OPERATION, gl.INVALID_OPERATION], "copyTexSubImage2D from incomplete framebuffer");
     309        gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
     310        glErrorShouldBe(gl, gl.INVALID_FRAMEBUFFER_OPERATION, "clear with incomplete framebuffer");
     311    }
     312}
     313
     314function testFramebufferIncompleteAttachment() {
     315    shouldBeNonNull("fbo = gl.createFramebuffer()");
     316    gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
     317    shouldBeNonNull("colorBuffer = gl.createRenderbuffer()");
     318    gl.bindRenderbuffer(gl.RENDERBUFFER, colorBuffer);
     319    gl.framebufferRenderbuffer(
     320        gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorBuffer);
     321    gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16);
     322    checkFramebuffer(gl.FRAMEBUFFER_COMPLETE);
     323
     324    debug("");
     325    debug("Wrong storage type for type of attachment be FRAMEBUFFER_INCOMPLETE_ATTACHMENT (OpenGL ES 2.0 4.4.5)");
     326    gl.renderbufferStorage(gl.RENDERBUFFER, depthFormat, 16, 16);
     327    checkFramebuffer(gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT);
     328
     329    gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16);
     330    checkFramebuffer(gl.FRAMEBUFFER_COMPLETE);
     331
     332    debug("");
     333    debug("0 size attachment should be FRAMEBUFFER_INCOMPLETE_ATTACHMENT (OpenGL ES 2.0 4.4.5)");
     334    gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 0, 0);
     335    checkFramebuffer(gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT);
     336
     337    glErrorShouldBe(gl, gl.NO_ERROR);
     338}
     339
     340function testFramebufferIncompleteMissingAttachment() {
     341    debug("");
     342    debug("No attachments should be INCOMPLETE_FRAMEBUFFER_MISSING_ATTACHMENT (OpenGL ES 2.0 4.4.5)");
     343    shouldBeNonNull("fbo = gl.createFramebuffer()");
     344    gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
     345    checkFramebuffer(gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT);
     346
     347    shouldBeNonNull("colorBuffer = gl.createRenderbuffer()");
     348    gl.bindRenderbuffer(gl.RENDERBUFFER, colorBuffer);
     349    gl.framebufferRenderbuffer(
     350        gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorBuffer);
     351    gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16);
     352    checkFramebuffer(gl.FRAMEBUFFER_COMPLETE);
     353
     354    gl.framebufferRenderbuffer(
     355        gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
     356    checkFramebuffer(gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT);
     357
     358    glErrorShouldBe(gl, gl.NO_ERROR);
     359}
     360
     361function testFramebufferIncompleteDimensions() {
     362    debug("");
     363    debug("Attachments of different sizes should be FRAMEBUFFER_INCOMPLETE_DIMENSIONS (OpenGL ES 2.0 4.4.5)");
     364
     365    shouldBeNonNull("fbo = gl.createFramebuffer()");
     366    gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
     367    shouldBeNonNull("colorBuffer = gl.createRenderbuffer()");
     368    gl.bindRenderbuffer(gl.RENDERBUFFER, colorBuffer);
     369    gl.framebufferRenderbuffer(
     370        gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorBuffer);
     371    gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16);
     372
     373    shouldBeNonNull("depthBuffer = gl.createRenderbuffer()");
     374    gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer);
     375    gl.framebufferRenderbuffer(
     376        gl.FRAMEBUFFER, depthAttachment, gl.RENDERBUFFER, depthBuffer);
     377    gl.renderbufferStorage(gl.RENDERBUFFER, depthFormat, 16, 16);
     378    glErrorShouldBe(gl, gl.NO_ERROR);
     379    checkFramebuffer(gl.FRAMEBUFFER_COMPLETE);
     380
     381    gl.renderbufferStorage(gl.RENDERBUFFER, depthFormat, 32, 16);
     382    checkFramebuffer(gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS);
     383    gl.renderbufferStorage(gl.RENDERBUFFER, depthFormat, 16, 16);
     384    checkFramebuffer(gl.FRAMEBUFFER_COMPLETE);
     385    gl.bindRenderbuffer(gl.RENDERBUFFER, colorBuffer);
     386    gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 32);
     387    checkFramebuffer(gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS);
     388    gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16);
     389    checkFramebuffer(gl.FRAMEBUFFER_COMPLETE);
     390    glErrorShouldBe(gl, gl.NO_ERROR);
     391
     392    var tex = gl.createTexture();
     393    gl.bindTexture(gl.TEXTURE_2D, tex);
     394    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
     395    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);
     396    glErrorShouldBe(gl, gl.NO_ERROR);
     397    if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE) {
     398        return;
     399    }
     400
     401    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 32, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
     402    checkFramebuffer(gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS);
     403    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
     404    checkFramebuffer(gl.FRAMEBUFFER_COMPLETE);
     405
     406    glErrorShouldBe(gl, gl.NO_ERROR);
     407}
     408
     409successfullyParsed = true;
    142410</script>
    143411
  • trunk/LayoutTests/fast/canvas/webgl/resources/webgl-test.js

    r98407 r102697  
    124124}
    125125
    126 function shouldGenerateGLError(ctx, glError, evalStr) {
     126// Pass undefined for glError to test that it at least throws some error
     127function shouldGenerateGLError(ctx, glErrors, evalStr) {
     128  if (!glErrors.length) {
     129    glErrors = [glErrors];
     130  }
    127131  var exception;
    128132  try {
     
    135139  } else {
    136140    var err = ctx.getError();
    137     if (err != glError) {
    138       testFailed(evalStr + " expected: " + getGLErrorAsString(ctx, glError) + ". Was " + getGLErrorAsString(ctx, err) + ".");
     141    if (glErrors.indexOf(err) < 0) {
     142      var errStrs = [];
     143      for (var ii = 0; ii < glErrors.length; ++ii) {
     144        errStrs.push(getGLErrorAsString(ctx, glErrors[ii]));
     145      }
     146      testFailed(evalStr + " expected: " + errStrs.join(" or ") + ". Was " + getGLErrorAsString(ctx, err) + ".");
    139147    } else {
    140       testPassed(evalStr + " generated expected GL error: " + getGLErrorAsString(ctx, glError) + ".");
     148      testPassed(evalStr + " generated expected GL error: " + getGLErrorAsString(ctx, err) + ".");
    141149    }
    142150  }
     
    146154 * Tests that the first error GL returns is the specified error.
    147155 * @param {!WebGLContext} gl The WebGLContext to use.
    148  * @param {number} glError The expected gl error.
     156 * @param {number|!Array.<number>} glError The expected gl
     157 *        error. Multiple errors can be passed in using an
     158 *        array.
    149159 * @param {string} opt_msg Optional additional message.
    150160 */
    151 function glErrorShouldBe(gl, glError, opt_msg) {
     161function glErrorShouldBe(gl, glErrors, opt_msg) {
     162  if (!glErrors.length) {
     163    glErrors = [glErrors];
     164  }
    152165  opt_msg = opt_msg || "";
    153166  var err = gl.getError();
    154   if (err != glError) {
    155     testFailed("getError expected: " + getGLErrorAsString(gl, glError) +
    156                ". Was " + getGLErrorAsString(gl, err) + " : " + opt_msg);
     167  var ndx = glErrors.indexOf(err);
     168  if (ndx < 0) {
     169    if (glErrors.length == 1) {
     170      testFailed("getError expected: " + getGLErrorAsString(gl, glErrors[0]) +
     171                 ". Was " + getGLErrorAsString(gl, err) + " : " + opt_msg);
     172    } else {
     173      var errs = [];
     174      for (var ii = 0; ii < glErrors.length; ++ii) {
     175        errs.push(getGLErrorAsString(gl, glErrors[ii]));
     176      }
     177      testFailed("getError expected one of: [" + errs.join(", ") +
     178                 "]. Was " + getGLErrorAsString(gl, err) + " : " + opt_msg);
     179    }
    157180  } else {
    158181    testPassed("getError was expected value: " +
    159                 getGLErrorAsString(gl, glError) + " : " + opt_msg);
     182                getGLErrorAsString(gl, err) + " : " + opt_msg);
    160183  }
    161184};
  • trunk/LayoutTests/platform/chromium/test_expectations.txt

    r102682 r102697  
    23302330
    23312331// These three failures are due to Mesa bugs
     2332BUGWEBGL : fast/canvas/webgl/framebuffer-object-attachment.html = TEXT
    23322333BUGWEBGL : fast/canvas/webgl/gl-uniform-arrays.html = TIMEOUT TEXT
    23332334BUGWEBGL : fast/canvas/webgl/point-size.html = TEXT
  • trunk/Source/WebCore/ChangeLog

    r102696 r102697  
     12011-12-09  Zhenyao Mo  <zmo@google.com>
     2
     3        Implement GLES2 CheckFramebufferStatus() behavior
     4        https://bugs.webkit.org/show_bug.cgi?id=74228
     5
     6        Reviewed by Kenneth Russell.
     7
     8        * html/canvas/WebGLFramebuffer.cpp:
     9        (WebCore::WebGLFramebuffer::getColorBufferWidth): Add ColorBuffer to the function name - this is more accurate.
     10        (WebCore::WebGLFramebuffer::getColorBufferHeight): Ditto.
     11        (WebCore::WebGLFramebuffer::checkStatus): Implement full semantics of GLES2 glCheckFramebufferStatus().
     12        (WebCore::WebGLFramebuffer::onAccess): Call checkStatus().
     13        * html/canvas/WebGLFramebuffer.h:
     14        * html/canvas/WebGLRenderingContext.cpp:
     15        (WebCore::WebGLRenderingContext::checkFramebufferStatus): Call checkStatus().
     16        (WebCore::WebGLRenderingContext::getFramebufferAttachmentParameter): No longer check framebuffer status.
     17        (WebCore::WebGLRenderingContext::getBoundFramebufferWidth): Call getColorBufferWidth.
     18        (WebCore::WebGLRenderingContext::getBoundFramebufferHeight): Call getColorBufferHeight.
     19
    1202011-12-13  James Simonsen  <simonjam@chromium.org>
    221
  • trunk/Source/WebCore/html/canvas/WebGLFramebuffer.cpp

    r95901 r102697  
    3636namespace {
    3737
    38     // This function is only for depth/stencil/depth_stencil attachment.
    39     // Currently we assume these attachments are all renderbuffers.
    40     GC3Denum getInternalFormat(WebGLObject* buffer)
    41     {
    42         ASSERT(buffer && buffer->isRenderbuffer());
    43         return (reinterpret_cast<WebGLRenderbuffer*>(buffer))->getInternalFormat();
     38    bool isAttachmentComplete(WebGLObject* attachedObject, GC3Denum attachment)
     39    {
     40        ASSERT(attachedObject && attachedObject->object());
     41        ASSERT(attachedObject->isRenderbuffer());
     42        WebGLRenderbuffer* buffer = reinterpret_cast<WebGLRenderbuffer*>(attachedObject);
     43        switch (attachment) {
     44        case GraphicsContext3D::DEPTH_ATTACHMENT:
     45            if (buffer->getInternalFormat() != GraphicsContext3D::DEPTH_COMPONENT16)
     46                return false;
     47            break;
     48        case GraphicsContext3D::STENCIL_ATTACHMENT:
     49            if (buffer->getInternalFormat() != GraphicsContext3D::STENCIL_INDEX8)
     50                return false;
     51            break;
     52        case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT:
     53            if (buffer->getInternalFormat() != GraphicsContext3D::DEPTH_STENCIL)
     54                return false;
     55            break;
     56        default:
     57            ASSERT_NOT_REACHED();
     58            return false;
     59        }
     60        if (!buffer->getWidth() || !buffer->getHeight())
     61            return false;
     62        return true;
     63    }
     64
     65    GC3Dsizei getImageWidth(WebGLObject* attachedObject)
     66    {
     67        ASSERT(attachedObject && attachedObject->object());
     68        ASSERT(attachedObject->isRenderbuffer());
     69        WebGLRenderbuffer* buffer = reinterpret_cast<WebGLRenderbuffer*>(attachedObject);
     70        return buffer->getWidth();
     71    }
     72
     73    GC3Dsizei getImageHeight(WebGLObject* attachedObject)
     74    {
     75        ASSERT(attachedObject && attachedObject->object());
     76        ASSERT(attachedObject->isRenderbuffer());
     77        WebGLRenderbuffer* buffer = reinterpret_cast<WebGLRenderbuffer*>(attachedObject);
     78        return buffer->getHeight();
    4479    }
    4580
     
    169204}
    170205
    171 GC3Dsizei WebGLFramebuffer::getWidth() const
     206GC3Dsizei WebGLFramebuffer::getColorBufferWidth() const
    172207{
    173208    if (!object() || !isColorAttached())
     
    181216}
    182217
    183 GC3Dsizei WebGLFramebuffer::getHeight() const
     218GC3Dsizei WebGLFramebuffer::getColorBufferHeight() const
    184219{
    185220    if (!object() || !isColorAttached())
     
    214249}
    215250
    216 bool WebGLFramebuffer::isIncomplete(bool checkInternalFormat) const
     251GC3Denum WebGLFramebuffer::checkStatus() const
    217252{
    218253    unsigned int count = 0;
     254    GC3Dsizei width = 0, height = 0;
    219255    if (isDepthAttached()) {
    220         if (checkInternalFormat && getInternalFormat(m_depthAttachment.get()) != GraphicsContext3D::DEPTH_COMPONENT16)
    221             return true;
     256        if (!isAttachmentComplete(m_depthAttachment.get(), GraphicsContext3D::DEPTH_ATTACHMENT))
     257            return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
     258        width = getImageWidth(m_depthAttachment.get());
     259        height = getImageHeight(m_depthAttachment.get());
    222260        count++;
    223261    }
    224262    if (isStencilAttached()) {
    225         if (checkInternalFormat && getInternalFormat(m_stencilAttachment.get()) != GraphicsContext3D::STENCIL_INDEX8)
    226             return true;
     263        if (!isAttachmentComplete(m_stencilAttachment.get(), GraphicsContext3D::STENCIL_ATTACHMENT))
     264            return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
     265        if (!count) {
     266            width = getImageWidth(m_stencilAttachment.get());
     267            height = getImageHeight(m_stencilAttachment.get());
     268        } else {
     269            if (width != getImageWidth(m_stencilAttachment.get()) || height != getImageHeight(m_stencilAttachment.get()))
     270                return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
     271        }
    227272        count++;
    228273    }
    229274    if (isDepthStencilAttached()) {
    230         if (checkInternalFormat && getInternalFormat(m_depthStencilAttachment.get()) != GraphicsContext3D::DEPTH_STENCIL)
    231             return true;
     275        if (!isAttachmentComplete(m_depthStencilAttachment.get(), GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT))
     276            return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
    232277        if (!isValid(m_depthStencilAttachment.get()))
    233             return true;
     278            return GraphicsContext3D::FRAMEBUFFER_UNSUPPORTED;
     279        if (!count) {
     280            width = getImageWidth(m_depthStencilAttachment.get());
     281            height = getImageHeight(m_depthStencilAttachment.get());
     282        } else {
     283            if (width != getImageWidth(m_depthStencilAttachment.get()) || height != getImageHeight(m_depthStencilAttachment.get()))
     284                return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
     285        }
    234286        count++;
    235287    }
     288    // WebGL specific: no conflicting DEPTH/STENCIL/DEPTH_STENCIL attachments.
    236289    if (count > 1)
    237         return true;
    238     return false;
     290        return GraphicsContext3D::FRAMEBUFFER_UNSUPPORTED;
     291    if (isColorAttached()) {
     292        // FIXME: if color buffer is texture, is ALPHA, LUMINANCE or LUMINANCE_ALPHA valid?
     293        if (!getColorBufferFormat())
     294            return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
     295        if (!count) {
     296            if (!getColorBufferWidth() || !getColorBufferHeight())
     297                return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
     298        } else {
     299            if (width != getColorBufferWidth() || height != getColorBufferHeight())
     300                return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
     301        }
     302    } else {
     303        if (!count)
     304            return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
     305    }
     306    return GraphicsContext3D::FRAMEBUFFER_COMPLETE;
    239307}
    240308
    241309bool WebGLFramebuffer::onAccess(bool needToInitializeRenderbuffers)
    242310{
    243     if (isIncomplete(true))
     311    if (checkStatus() != GraphicsContext3D::FRAMEBUFFER_COMPLETE)
    244312        return false;
    245313    if (needToInitializeRenderbuffers)
  • trunk/Source/WebCore/html/canvas/WebGLFramebuffer.h

    r95901 r102697  
    5050
    5151    GC3Denum getColorBufferFormat() const;
    52     GC3Dsizei getWidth() const;
    53     GC3Dsizei getHeight() const;
     52    GC3Dsizei getColorBufferWidth() const;
     53    GC3Dsizei getColorBufferHeight() const;
    5454
    5555    // This should always be called before drawArray, drawElements, clear,
     
    6161    bool onAccess(bool needToInitializeRenderbuffers);
    6262
    63     // Return false does not mean COMPLETE, might still be INCOMPLETE.
    64     bool isIncomplete(bool checkInternalFormat) const;
     63    // Software version of glCheckFramebufferStatus(), except that when
     64    // FRAMEBUFFER_COMPLETE is returned, it is still possible for
     65    // glCheckFramebufferStatus() to return FRAMEBUFFER_UNSUPPORTED,
     66    // depending on hardware implementation.
     67    GC3Denum checkStatus() const;
    6568
    6669    bool hasEverBeenBound() const { return object() && m_hasEverBeenBound; }
  • trunk/Source/WebCore/html/canvas/WebGLRenderingContext.cpp

    r102430 r102697  
    10931093    if (!m_framebufferBinding || !m_framebufferBinding->object())
    10941094        return GraphicsContext3D::FRAMEBUFFER_COMPLETE;
    1095     if (m_framebufferBinding->isIncomplete(true))
    1096         return GraphicsContext3D::FRAMEBUFFER_UNSUPPORTED;
    1097     unsigned long result = m_context->checkFramebufferStatus(target);
     1095    GC3Denum result = m_framebufferBinding->checkStatus();
     1096    if (result != GraphicsContext3D::FRAMEBUFFER_COMPLETE)
     1097        return result;
     1098    result = m_context->checkFramebufferStatus(target);
    10981099    cleanupAfterGraphicsCall(false);
    10991100    return result;
     
    21602161        return WebGLGetInfo();
    21612162
    2162     if (!m_framebufferBinding || !m_framebufferBinding->object() || m_framebufferBinding->isIncomplete(false)) {
     2163    if (!m_framebufferBinding || !m_framebufferBinding->object()) {
    21632164        m_context->synthesizeGLError(GraphicsContext3D::INVALID_OPERATION);
    21642165        return WebGLGetInfo();
     
    43094310{
    43104311    if (m_framebufferBinding && m_framebufferBinding->object())
    4311         return m_framebufferBinding->getWidth();
     4312        return m_framebufferBinding->getColorBufferWidth();
    43124313    return m_drawingBuffer ? m_drawingBuffer->size().width() : m_context->getInternalFramebufferSize().width();
    43134314}
     
    43164317{
    43174318    if (m_framebufferBinding && m_framebufferBinding->object())
    4318         return m_framebufferBinding->getHeight();
     4319        return m_framebufferBinding->getColorBufferHeight();
    43194320    return m_drawingBuffer ? m_drawingBuffer->size().height() : m_context->getInternalFramebufferSize().height();
    43204321}
Note: See TracChangeset for help on using the changeset viewer.