| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 static WebGLFramebuffer::WebGLAttachment* create(WebGLRenderbuffer*); | 39 static WebGLFramebuffer::WebGLAttachment* create(WebGLRenderbuffer*); |
| 40 | 40 |
| 41 DECLARE_VIRTUAL_TRACE(); | 41 DECLARE_VIRTUAL_TRACE(); |
| 42 | 42 |
| 43 private: | 43 private: |
| 44 explicit WebGLRenderbufferAttachment(WebGLRenderbuffer*); | 44 explicit WebGLRenderbufferAttachment(WebGLRenderbuffer*); |
| 45 WebGLRenderbufferAttachment() { } | 45 WebGLRenderbufferAttachment() { } |
| 46 | 46 |
| 47 GLsizei width() const override; | 47 GLsizei width() const override; |
| 48 GLsizei height() const override; | 48 GLsizei height() const override; |
| 49 GLsizei depth() const override; | |
| 50 GLenum format() const override; | 49 GLenum format() const override; |
| 51 GLenum type() const override; | 50 GLenum type() const override; |
| 52 bool isCubeComplete() const override; | 51 bool isCubeComplete() const override; |
| 53 WebGLSharedObject* object() const override; | 52 WebGLSharedObject* object() const override; |
| 54 bool isSharedObject(WebGLSharedObject*) const override; | 53 bool isSharedObject(WebGLSharedObject*) const override; |
| 55 bool valid() const override; | 54 bool valid() const override; |
| 56 void onDetached(WebGraphicsContext3D*) override; | 55 void onDetached(WebGraphicsContext3D*) override; |
| 57 void attach(WebGraphicsContext3D*, GLenum target, GLenum attachment) overrid
e; | 56 void attach(WebGraphicsContext3D*, GLenum target, GLenum attachment) overrid
e; |
| 58 void unattach(WebGraphicsContext3D*, GLenum target, GLenum attachment) overr
ide; | 57 void unattach(WebGraphicsContext3D*, GLenum target, GLenum attachment) overr
ide; |
| 59 | 58 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 79 GLsizei WebGLRenderbufferAttachment::width() const | 78 GLsizei WebGLRenderbufferAttachment::width() const |
| 80 { | 79 { |
| 81 return m_renderbuffer->width(); | 80 return m_renderbuffer->width(); |
| 82 } | 81 } |
| 83 | 82 |
| 84 GLsizei WebGLRenderbufferAttachment::height() const | 83 GLsizei WebGLRenderbufferAttachment::height() const |
| 85 { | 84 { |
| 86 return m_renderbuffer->height(); | 85 return m_renderbuffer->height(); |
| 87 } | 86 } |
| 88 | 87 |
| 89 GLsizei WebGLRenderbufferAttachment::depth() const | |
| 90 { | |
| 91 return 1; | |
| 92 } | |
| 93 | |
| 94 GLenum WebGLRenderbufferAttachment::format() const | 88 GLenum WebGLRenderbufferAttachment::format() const |
| 95 { | 89 { |
| 96 GLenum format = m_renderbuffer->internalFormat(); | 90 GLenum format = m_renderbuffer->internalFormat(); |
| 97 if (format == GL_DEPTH_STENCIL_OES | 91 if (format == GL_DEPTH_STENCIL_OES |
| 98 && m_renderbuffer->emulatedStencilBuffer() | 92 && m_renderbuffer->emulatedStencilBuffer() |
| 99 && m_renderbuffer->emulatedStencilBuffer()->internalFormat() != GL_STENC
IL_INDEX8) { | 93 && m_renderbuffer->emulatedStencilBuffer()->internalFormat() != GL_STENC
IL_INDEX8) { |
| 100 return 0; | 94 return 0; |
| 101 } | 95 } |
| 102 return format; | 96 return format; |
| 103 } | 97 } |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 static WebGLFramebuffer::WebGLAttachment* create(WebGLTexture*, GLenum targe
t, GLint level, GLint layer); | 153 static WebGLFramebuffer::WebGLAttachment* create(WebGLTexture*, GLenum targe
t, GLint level, GLint layer); |
| 160 | 154 |
| 161 DECLARE_VIRTUAL_TRACE(); | 155 DECLARE_VIRTUAL_TRACE(); |
| 162 | 156 |
| 163 private: | 157 private: |
| 164 WebGLTextureAttachment(WebGLTexture*, GLenum target, GLint level, GLint laye
r); | 158 WebGLTextureAttachment(WebGLTexture*, GLenum target, GLint level, GLint laye
r); |
| 165 WebGLTextureAttachment() { } | 159 WebGLTextureAttachment() { } |
| 166 | 160 |
| 167 GLsizei width() const override; | 161 GLsizei width() const override; |
| 168 GLsizei height() const override; | 162 GLsizei height() const override; |
| 169 GLsizei depth() const override; | |
| 170 GLenum format() const override; | 163 GLenum format() const override; |
| 171 GLenum type() const override; | 164 GLenum type() const override; |
| 172 bool isCubeComplete() const override; | 165 bool isCubeComplete() const override; |
| 173 WebGLSharedObject* object() const override; | 166 WebGLSharedObject* object() const override; |
| 174 bool isSharedObject(WebGLSharedObject*) const override; | 167 bool isSharedObject(WebGLSharedObject*) const override; |
| 175 bool valid() const override; | 168 bool valid() const override; |
| 176 void onDetached(WebGraphicsContext3D*) override; | 169 void onDetached(WebGraphicsContext3D*) override; |
| 177 void attach(WebGraphicsContext3D*, GLenum target, GLenum attachment) overrid
e; | 170 void attach(WebGraphicsContext3D*, GLenum target, GLenum attachment) overrid
e; |
| 178 void unattach(WebGraphicsContext3D*, GLenum target, GLenum attachment) overr
ide; | 171 void unattach(WebGraphicsContext3D*, GLenum target, GLenum attachment) overr
ide; |
| 179 | 172 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 205 GLsizei WebGLTextureAttachment::width() const | 198 GLsizei WebGLTextureAttachment::width() const |
| 206 { | 199 { |
| 207 return m_texture->getWidth(m_target, m_level); | 200 return m_texture->getWidth(m_target, m_level); |
| 208 } | 201 } |
| 209 | 202 |
| 210 GLsizei WebGLTextureAttachment::height() const | 203 GLsizei WebGLTextureAttachment::height() const |
| 211 { | 204 { |
| 212 return m_texture->getHeight(m_target, m_level); | 205 return m_texture->getHeight(m_target, m_level); |
| 213 } | 206 } |
| 214 | 207 |
| 215 GLsizei WebGLTextureAttachment::depth() const | |
| 216 { | |
| 217 return m_texture->getDepth(m_target, m_level); | |
| 218 } | |
| 219 | |
| 220 GLenum WebGLTextureAttachment::format() const | 208 GLenum WebGLTextureAttachment::format() const |
| 221 { | 209 { |
| 222 return m_texture->getInternalFormat(m_target, m_level); | 210 return m_texture->getInternalFormat(m_target, m_level); |
| 223 } | 211 } |
| 224 | 212 |
| 225 WebGLSharedObject* WebGLTextureAttachment::object() const | 213 WebGLSharedObject* WebGLTextureAttachment::object() const |
| 226 { | 214 { |
| 227 return m_texture->object() ? m_texture.get() : 0; | 215 return m_texture->object() ? m_texture.get() : 0; |
| 228 } | 216 } |
| 229 | 217 |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 544 return 0; | 532 return 0; |
| 545 WebGLAttachment* attachment = getAttachment(GL_COLOR_ATTACHMENT0); | 533 WebGLAttachment* attachment = getAttachment(GL_COLOR_ATTACHMENT0); |
| 546 if (!attachment) | 534 if (!attachment) |
| 547 return 0; | 535 return 0; |
| 548 return attachment->format(); | 536 return attachment->format(); |
| 549 } | 537 } |
| 550 | 538 |
| 551 GLenum WebGLFramebuffer::checkStatus(const char** reason) const | 539 GLenum WebGLFramebuffer::checkStatus(const char** reason) const |
| 552 { | 540 { |
| 553 unsigned count = 0; | 541 unsigned count = 0; |
| 554 GLsizei width = 0, height = 0, depth = 0; | 542 GLsizei width = 0, height = 0; |
| 555 WebGLAttachment* depthAttachment = nullptr; | 543 WebGLAttachment* depthAttachment = nullptr; |
| 556 WebGLAttachment* stencilAttachment = nullptr; | 544 WebGLAttachment* stencilAttachment = nullptr; |
| 557 WebGLAttachment* depthStencilAttachment = nullptr; | 545 WebGLAttachment* depthStencilAttachment = nullptr; |
| 558 bool isWebGL2OrHigher = context()->isWebGL2OrHigher(); | 546 bool isWebGL2OrHigher = context()->isWebGL2OrHigher(); |
| 559 for (const auto& it : m_attachments) { | 547 for (const auto& it : m_attachments) { |
| 560 WebGLAttachment* attachment = it.value.get(); | 548 WebGLAttachment* attachment = it.value.get(); |
| 561 if (!isAttachmentComplete(attachment, it.key, reason)) | 549 if (!isAttachmentComplete(attachment, it.key, reason)) |
| 562 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; | 550 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; |
| 563 if (!attachment->valid()) { | 551 if (!attachment->valid()) { |
| 564 *reason = "attachment is not valid"; | 552 *reason = "attachment is not valid"; |
| 565 return GL_FRAMEBUFFER_UNSUPPORTED; | 553 return GL_FRAMEBUFFER_UNSUPPORTED; |
| 566 } | 554 } |
| 567 if (!attachment->format()) { | 555 if (!attachment->format()) { |
| 568 *reason = "attachment is an unsupported format"; | 556 *reason = "attachment is an unsupported format"; |
| 569 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; | 557 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; |
| 570 } | 558 } |
| 571 switch (it.key) { | 559 switch (it.key) { |
| 572 case GL_DEPTH_ATTACHMENT: | 560 case GL_DEPTH_ATTACHMENT: |
| 573 depthAttachment = attachment; | 561 depthAttachment = attachment; |
| 574 break; | 562 break; |
| 575 case GL_STENCIL_ATTACHMENT: | 563 case GL_STENCIL_ATTACHMENT: |
| 576 stencilAttachment = attachment; | 564 stencilAttachment = attachment; |
| 577 break; | 565 break; |
| 578 case GL_DEPTH_STENCIL_ATTACHMENT: | 566 case GL_DEPTH_STENCIL_ATTACHMENT: |
| 579 depthStencilAttachment = attachment; | 567 depthStencilAttachment = attachment; |
| 580 break; | 568 break; |
| 581 } | 569 } |
| 582 // Note: In GLES 3, images for a framebuffer need not to have the same d
imensions to be framebuffer complete. | 570 if (!isWebGL2OrHigher) { |
| 583 // However, in Direct3D 11, on top of which OpenGL ES 3 behavior is emul
ated in Windows, all render targets | 571 if (!count) { |
| 584 // must have the same size in all dimensions. In order to have consisten
t WebGL 2 behaviors across platforms, | 572 width = attachment->width(); |
| 585 // we generate FRAMEBUFFER_INCOMPLETE_DIMENSIONS in this situation. | 573 height = attachment->height(); |
| 586 if (!count) { | 574 } else { |
| 587 width = attachment->width(); | 575 if (width != attachment->width() || height != attachment->height
()) { |
| 588 height = attachment->height(); | 576 *reason = "attachments do not have the same dimensions"; |
| 589 depth = attachment->depth(); | 577 return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS; |
| 590 } else { | 578 } |
| 591 if (width != attachment->width() || height != attachment->height() |
| depth != attachment->depth()) { | |
| 592 *reason = "attachments do not have the same dimensions"; | |
| 593 return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS; | |
| 594 } | 579 } |
| 595 } | 580 } |
| 596 ++count; | 581 ++count; |
| 597 } | 582 } |
| 598 if (!count) { | 583 if (!count) { |
| 599 *reason = "no attachments"; | 584 *reason = "no attachments"; |
| 600 return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; | 585 return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; |
| 601 } | 586 } |
| 602 // WebGL 1 specific: no conflicting DEPTH/STENCIL/DEPTH_STENCIL attachments. | 587 // WebGL 1 specific: no conflicting DEPTH/STENCIL/DEPTH_STENCIL attachments. |
| 603 if (!isWebGL2OrHigher | 588 if (!isWebGL2OrHigher |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 710 return true; | 695 return true; |
| 711 } | 696 } |
| 712 | 697 |
| 713 DEFINE_TRACE(WebGLFramebuffer) | 698 DEFINE_TRACE(WebGLFramebuffer) |
| 714 { | 699 { |
| 715 visitor->trace(m_attachments); | 700 visitor->trace(m_attachments); |
| 716 WebGLContextObject::trace(visitor); | 701 WebGLContextObject::trace(visitor); |
| 717 } | 702 } |
| 718 | 703 |
| 719 } | 704 } |
| OLD | NEW |