Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(620)

Side by Side Diff: third_party/WebKit/Source/modules/webgl/WebGLFramebuffer.cpp

Issue 1549393002: (reland)WebGL 2: generate appropriate error for different dimensions of images attached to fbo (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: addressed zmo@'s feedback: mark draw-buffers.html as failed, will update the test expectation later Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/WebKit/Source/modules/webgl/WebGLFramebuffer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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;
49 GLenum format() const override; 50 GLenum format() const override;
50 GLenum type() const override; 51 GLenum type() const override;
51 bool isCubeComplete() const override; 52 bool isCubeComplete() const override;
52 WebGLSharedObject* object() const override; 53 WebGLSharedObject* object() const override;
53 bool isSharedObject(WebGLSharedObject*) const override; 54 bool isSharedObject(WebGLSharedObject*) const override;
54 bool valid() const override; 55 bool valid() const override;
55 void onDetached(WebGraphicsContext3D*) override; 56 void onDetached(WebGraphicsContext3D*) override;
56 void attach(WebGraphicsContext3D*, GLenum target, GLenum attachment) overrid e; 57 void attach(WebGraphicsContext3D*, GLenum target, GLenum attachment) overrid e;
57 void unattach(WebGraphicsContext3D*, GLenum target, GLenum attachment) overr ide; 58 void unattach(WebGraphicsContext3D*, GLenum target, GLenum attachment) overr ide;
58 59
(...skipping 19 matching lines...) Expand all
78 GLsizei WebGLRenderbufferAttachment::width() const 79 GLsizei WebGLRenderbufferAttachment::width() const
79 { 80 {
80 return m_renderbuffer->width(); 81 return m_renderbuffer->width();
81 } 82 }
82 83
83 GLsizei WebGLRenderbufferAttachment::height() const 84 GLsizei WebGLRenderbufferAttachment::height() const
84 { 85 {
85 return m_renderbuffer->height(); 86 return m_renderbuffer->height();
86 } 87 }
87 88
89 GLsizei WebGLRenderbufferAttachment::depth() const
90 {
91 return 1;
92 }
93
88 GLenum WebGLRenderbufferAttachment::format() const 94 GLenum WebGLRenderbufferAttachment::format() const
89 { 95 {
90 GLenum format = m_renderbuffer->internalFormat(); 96 GLenum format = m_renderbuffer->internalFormat();
91 if (format == GL_DEPTH_STENCIL_OES 97 if (format == GL_DEPTH_STENCIL_OES
92 && m_renderbuffer->emulatedStencilBuffer() 98 && m_renderbuffer->emulatedStencilBuffer()
93 && m_renderbuffer->emulatedStencilBuffer()->internalFormat() != GL_STENC IL_INDEX8) { 99 && m_renderbuffer->emulatedStencilBuffer()->internalFormat() != GL_STENC IL_INDEX8) {
94 return 0; 100 return 0;
95 } 101 }
96 return format; 102 return format;
97 } 103 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 static WebGLFramebuffer::WebGLAttachment* create(WebGLTexture*, GLenum targe t, GLint level, GLint layer); 159 static WebGLFramebuffer::WebGLAttachment* create(WebGLTexture*, GLenum targe t, GLint level, GLint layer);
154 160
155 DECLARE_VIRTUAL_TRACE(); 161 DECLARE_VIRTUAL_TRACE();
156 162
157 private: 163 private:
158 WebGLTextureAttachment(WebGLTexture*, GLenum target, GLint level, GLint laye r); 164 WebGLTextureAttachment(WebGLTexture*, GLenum target, GLint level, GLint laye r);
159 WebGLTextureAttachment() { } 165 WebGLTextureAttachment() { }
160 166
161 GLsizei width() const override; 167 GLsizei width() const override;
162 GLsizei height() const override; 168 GLsizei height() const override;
169 GLsizei depth() const override;
163 GLenum format() const override; 170 GLenum format() const override;
164 GLenum type() const override; 171 GLenum type() const override;
165 bool isCubeComplete() const override; 172 bool isCubeComplete() const override;
166 WebGLSharedObject* object() const override; 173 WebGLSharedObject* object() const override;
167 bool isSharedObject(WebGLSharedObject*) const override; 174 bool isSharedObject(WebGLSharedObject*) const override;
168 bool valid() const override; 175 bool valid() const override;
169 void onDetached(WebGraphicsContext3D*) override; 176 void onDetached(WebGraphicsContext3D*) override;
170 void attach(WebGraphicsContext3D*, GLenum target, GLenum attachment) overrid e; 177 void attach(WebGraphicsContext3D*, GLenum target, GLenum attachment) overrid e;
171 void unattach(WebGraphicsContext3D*, GLenum target, GLenum attachment) overr ide; 178 void unattach(WebGraphicsContext3D*, GLenum target, GLenum attachment) overr ide;
172 179
(...skipping 25 matching lines...) Expand all
198 GLsizei WebGLTextureAttachment::width() const 205 GLsizei WebGLTextureAttachment::width() const
199 { 206 {
200 return m_texture->getWidth(m_target, m_level); 207 return m_texture->getWidth(m_target, m_level);
201 } 208 }
202 209
203 GLsizei WebGLTextureAttachment::height() const 210 GLsizei WebGLTextureAttachment::height() const
204 { 211 {
205 return m_texture->getHeight(m_target, m_level); 212 return m_texture->getHeight(m_target, m_level);
206 } 213 }
207 214
215 GLsizei WebGLTextureAttachment::depth() const
216 {
217 return m_texture->getDepth(m_target, m_level);
218 }
219
208 GLenum WebGLTextureAttachment::format() const 220 GLenum WebGLTextureAttachment::format() const
209 { 221 {
210 return m_texture->getInternalFormat(m_target, m_level); 222 return m_texture->getInternalFormat(m_target, m_level);
211 } 223 }
212 224
213 WebGLSharedObject* WebGLTextureAttachment::object() const 225 WebGLSharedObject* WebGLTextureAttachment::object() const
214 { 226 {
215 return m_texture->object() ? m_texture.get() : 0; 227 return m_texture->object() ? m_texture.get() : 0;
216 } 228 }
217 229
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 return 0; 544 return 0;
533 WebGLAttachment* attachment = getAttachment(GL_COLOR_ATTACHMENT0); 545 WebGLAttachment* attachment = getAttachment(GL_COLOR_ATTACHMENT0);
534 if (!attachment) 546 if (!attachment)
535 return 0; 547 return 0;
536 return attachment->format(); 548 return attachment->format();
537 } 549 }
538 550
539 GLenum WebGLFramebuffer::checkStatus(const char** reason) const 551 GLenum WebGLFramebuffer::checkStatus(const char** reason) const
540 { 552 {
541 unsigned count = 0; 553 unsigned count = 0;
542 GLsizei width = 0, height = 0; 554 GLsizei width = 0, height = 0, depth = 0;
543 WebGLAttachment* depthAttachment = nullptr; 555 WebGLAttachment* depthAttachment = nullptr;
544 WebGLAttachment* stencilAttachment = nullptr; 556 WebGLAttachment* stencilAttachment = nullptr;
545 WebGLAttachment* depthStencilAttachment = nullptr; 557 WebGLAttachment* depthStencilAttachment = nullptr;
546 bool isWebGL2OrHigher = context()->isWebGL2OrHigher(); 558 bool isWebGL2OrHigher = context()->isWebGL2OrHigher();
547 for (const auto& it : m_attachments) { 559 for (const auto& it : m_attachments) {
548 WebGLAttachment* attachment = it.value.get(); 560 WebGLAttachment* attachment = it.value.get();
549 if (!isAttachmentComplete(attachment, it.key, reason)) 561 if (!isAttachmentComplete(attachment, it.key, reason))
550 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; 562 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
551 if (!attachment->valid()) { 563 if (!attachment->valid()) {
552 *reason = "attachment is not valid"; 564 *reason = "attachment is not valid";
553 return GL_FRAMEBUFFER_UNSUPPORTED; 565 return GL_FRAMEBUFFER_UNSUPPORTED;
554 } 566 }
555 if (!attachment->format()) { 567 if (!attachment->format()) {
556 *reason = "attachment is an unsupported format"; 568 *reason = "attachment is an unsupported format";
557 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; 569 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
558 } 570 }
559 switch (it.key) { 571 switch (it.key) {
560 case GL_DEPTH_ATTACHMENT: 572 case GL_DEPTH_ATTACHMENT:
561 depthAttachment = attachment; 573 depthAttachment = attachment;
562 break; 574 break;
563 case GL_STENCIL_ATTACHMENT: 575 case GL_STENCIL_ATTACHMENT:
564 stencilAttachment = attachment; 576 stencilAttachment = attachment;
565 break; 577 break;
566 case GL_DEPTH_STENCIL_ATTACHMENT: 578 case GL_DEPTH_STENCIL_ATTACHMENT:
567 depthStencilAttachment = attachment; 579 depthStencilAttachment = attachment;
568 break; 580 break;
569 } 581 }
570 if (!isWebGL2OrHigher) { 582 // Note: In GLES 3, images for a framebuffer need not to have the same d imensions to be framebuffer complete.
571 if (!count) { 583 // However, in Direct3D 11, on top of which OpenGL ES 3 behavior is emul ated in Windows, all render targets
572 width = attachment->width(); 584 // must have the same size in all dimensions. In order to have consisten t WebGL 2 behaviors across platforms,
573 height = attachment->height(); 585 // we generate FRAMEBUFFER_INCOMPLETE_DIMENSIONS in this situation.
574 } else { 586 if (!count) {
575 if (width != attachment->width() || height != attachment->height ()) { 587 width = attachment->width();
576 *reason = "attachments do not have the same dimensions"; 588 height = attachment->height();
577 return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS; 589 depth = attachment->depth();
578 } 590 } else {
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;
579 } 594 }
580 } 595 }
581 ++count; 596 ++count;
582 } 597 }
583 if (!count) { 598 if (!count) {
584 *reason = "no attachments"; 599 *reason = "no attachments";
585 return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; 600 return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
586 } 601 }
587 // WebGL 1 specific: no conflicting DEPTH/STENCIL/DEPTH_STENCIL attachments. 602 // WebGL 1 specific: no conflicting DEPTH/STENCIL/DEPTH_STENCIL attachments.
588 if (!isWebGL2OrHigher 603 if (!isWebGL2OrHigher
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
695 return true; 710 return true;
696 } 711 }
697 712
698 DEFINE_TRACE(WebGLFramebuffer) 713 DEFINE_TRACE(WebGLFramebuffer)
699 { 714 {
700 visitor->trace(m_attachments); 715 visitor->trace(m_attachments);
701 WebGLContextObject::trace(visitor); 716 WebGLContextObject::trace(visitor);
702 } 717 }
703 718
704 } 719 }
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/modules/webgl/WebGLFramebuffer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698