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

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 2347063002: Fix crash in DoBlitFramebufferCHROMIUM (Closed)
Patch Set: Created 4 years, 3 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 | « no previous file | gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
6 6
7 #include <limits.h> 7 #include <limits.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 #include <stdio.h> 10 #include <stdio.h>
(...skipping 7549 matching lines...) Expand 10 before | Expand all | Expand 10 after
7560 Framebuffer* draw_framebuffer = 7560 Framebuffer* draw_framebuffer =
7561 framebuffer_state_.bound_draw_framebuffer.get(); 7561 framebuffer_state_.bound_draw_framebuffer.get();
7562 // If both read framebuffer and draw framebuffer are default framebuffer, 7562 // If both read framebuffer and draw framebuffer are default framebuffer,
7563 // They always have identical image. Otherwise, if one of read framebuffer 7563 // They always have identical image. Otherwise, if one of read framebuffer
7564 // and draw framebuffe is default framebuffer, but the other is fbo, they 7564 // and draw framebuffe is default framebuffer, but the other is fbo, they
7565 // always have no identical image. 7565 // always have no identical image.
7566 if (!read_framebuffer && !draw_framebuffer) { 7566 if (!read_framebuffer && !draw_framebuffer) {
7567 is_feedback_loop = FeedbackLoopTrue; 7567 is_feedback_loop = FeedbackLoopTrue;
7568 } else if (!read_framebuffer || !draw_framebuffer) { 7568 } else if (!read_framebuffer || !draw_framebuffer) {
7569 is_feedback_loop = FeedbackLoopFalse; 7569 is_feedback_loop = FeedbackLoopFalse;
7570 } 7570 } else {
7571 if ((mask & GL_DEPTH_BUFFER_BIT) != 0) { 7571 DCHECK(read_framebuffer && draw_framebuffer);
7572 const Framebuffer::Attachment* depth_buffer_read = 7572 if ((mask & GL_DEPTH_BUFFER_BIT) != 0) {
7573 read_framebuffer->GetAttachment(GL_DEPTH_ATTACHMENT); 7573 const Framebuffer::Attachment* depth_buffer_read =
7574 const Framebuffer::Attachment* depth_buffer_draw = 7574 read_framebuffer->GetAttachment(GL_DEPTH_ATTACHMENT);
7575 draw_framebuffer->GetAttachment(GL_DEPTH_ATTACHMENT); 7575 const Framebuffer::Attachment* depth_buffer_draw =
7576 if (depth_buffer_draw && 7576 draw_framebuffer->GetAttachment(GL_DEPTH_ATTACHMENT);
7577 depth_buffer_draw->IsSameAttachment(depth_buffer_read)) { 7577 if (depth_buffer_draw &&
7578 is_feedback_loop = FeedbackLoopTrue; 7578 depth_buffer_draw->IsSameAttachment(depth_buffer_read)) {
7579 is_feedback_loop = FeedbackLoopTrue;
7580 }
7579 } 7581 }
7580 } 7582 if ((mask & GL_STENCIL_BUFFER_BIT) != 0) {
7581 if ((mask & GL_STENCIL_BUFFER_BIT) != 0) { 7583 const Framebuffer::Attachment* stencil_buffer_read =
7582 const Framebuffer::Attachment* stencil_buffer_read = 7584 read_framebuffer->GetAttachment(GL_STENCIL_ATTACHMENT);
7583 read_framebuffer->GetAttachment(GL_STENCIL_ATTACHMENT); 7585 const Framebuffer::Attachment* stencil_buffer_draw =
7584 const Framebuffer::Attachment* stencil_buffer_draw = 7586 draw_framebuffer->GetAttachment(GL_STENCIL_ATTACHMENT);
7585 draw_framebuffer->GetAttachment(GL_STENCIL_ATTACHMENT); 7587 if (stencil_buffer_draw &&
7586 if (stencil_buffer_draw && 7588 stencil_buffer_draw->IsSameAttachment(stencil_buffer_read)) {
7587 stencil_buffer_draw->IsSameAttachment(stencil_buffer_read)) { 7589 is_feedback_loop = FeedbackLoopTrue;
7588 is_feedback_loop = FeedbackLoopTrue; 7590 }
7589 } 7591 }
7590 } 7592 }
7591 7593
7592 GLenum src_format = GetBoundReadFramebufferInternalFormat(); 7594 GLenum src_format = GetBoundReadFramebufferInternalFormat();
7593 GLenum src_type = GetBoundReadFramebufferTextureType(); 7595 GLenum src_type = GetBoundReadFramebufferTextureType();
7594 7596
7595 if ((mask & GL_COLOR_BUFFER_BIT) != 0) { 7597 if ((mask & GL_COLOR_BUFFER_BIT) != 0) {
7596 bool is_src_signed_int = GLES2Util::IsSignedIntegerFormat(src_format); 7598 bool is_src_signed_int = GLES2Util::IsSignedIntegerFormat(src_format);
7597 bool is_src_unsigned_int = GLES2Util::IsUnsignedIntegerFormat(src_format); 7599 bool is_src_unsigned_int = GLES2Util::IsUnsignedIntegerFormat(src_format);
7598 DCHECK(!is_src_signed_int || !is_src_unsigned_int); 7600 DCHECK(!is_src_signed_int || !is_src_unsigned_int);
7599 7601
7600 if ((is_src_signed_int || is_src_unsigned_int) && filter == GL_LINEAR) { 7602 if ((is_src_signed_int || is_src_unsigned_int) && filter == GL_LINEAR) {
7601 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, 7603 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name,
7602 "invalid filter for integer format"); 7604 "invalid filter for integer format");
7603 return; 7605 return;
7604 } 7606 }
7605 7607
7606 GLenum src_sized_format = 7608 GLenum src_sized_format =
7607 GLES2Util::ConvertToSizedFormat(src_format, src_type); 7609 GLES2Util::ConvertToSizedFormat(src_format, src_type);
7610 DCHECK(read_framebuffer || (is_feedback_loop != FeedbackLoopUnknown));
7608 const Framebuffer::Attachment* read_buffer = 7611 const Framebuffer::Attachment* read_buffer =
7609 is_feedback_loop == FeedbackLoopUnknown ? 7612 is_feedback_loop == FeedbackLoopUnknown ?
7610 read_framebuffer->GetReadBufferAttachment() : nullptr; 7613 read_framebuffer->GetReadBufferAttachment() : nullptr;
7611 for (uint32_t ii = 0; ii < group_->max_draw_buffers(); ++ii) { 7614 for (uint32_t ii = 0; ii < group_->max_draw_buffers(); ++ii) {
7612 GLenum dst_format = GetBoundColorDrawBufferInternalFormat( 7615 GLenum dst_format = GetBoundColorDrawBufferInternalFormat(
7613 static_cast<GLint>(ii)); 7616 static_cast<GLint>(ii));
7614 GLenum dst_type = GetBoundColorDrawBufferType(static_cast<GLint>(ii)); 7617 GLenum dst_type = GetBoundColorDrawBufferType(static_cast<GLint>(ii));
7615 if (dst_format == 0) 7618 if (dst_format == 0)
7616 continue; 7619 continue;
7617 if (read_buffer_samples > 0 && 7620 if (read_buffer_samples > 0 &&
7618 (src_sized_format != 7621 (src_sized_format !=
7619 GLES2Util::ConvertToSizedFormat(dst_format, dst_type))) { 7622 GLES2Util::ConvertToSizedFormat(dst_format, dst_type))) {
7620 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, 7623 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name,
7621 "src and dst formats differ for color"); 7624 "src and dst formats differ for color");
7622 return; 7625 return;
7623 } 7626 }
7624 bool is_dst_signed_int = GLES2Util::IsSignedIntegerFormat(dst_format); 7627 bool is_dst_signed_int = GLES2Util::IsSignedIntegerFormat(dst_format);
7625 bool is_dst_unsigned_int = GLES2Util::IsUnsignedIntegerFormat(dst_format); 7628 bool is_dst_unsigned_int = GLES2Util::IsUnsignedIntegerFormat(dst_format);
7626 DCHECK(!is_dst_signed_int || !is_dst_unsigned_int); 7629 DCHECK(!is_dst_signed_int || !is_dst_unsigned_int);
7627 if (is_src_signed_int != is_dst_signed_int || 7630 if (is_src_signed_int != is_dst_signed_int ||
7628 is_src_unsigned_int != is_dst_unsigned_int) { 7631 is_src_unsigned_int != is_dst_unsigned_int) {
7629 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, 7632 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name,
7630 "incompatible src/dst color formats"); 7633 "incompatible src/dst color formats");
7631 return; 7634 return;
7632 } 7635 }
7633 // Check whether draw buffers have identical color image with read buffer 7636 // Check whether draw buffers have identical color image with read buffer
7634 if (is_feedback_loop == FeedbackLoopUnknown) { 7637 if (is_feedback_loop == FeedbackLoopUnknown) {
7635 GLenum attachment = static_cast<GLenum>(GL_COLOR_ATTACHMENT0 + ii); 7638 GLenum attachment = static_cast<GLenum>(GL_COLOR_ATTACHMENT0 + ii);
7639 DCHECK(draw_framebuffer);
7636 const Framebuffer::Attachment* draw_buffer = 7640 const Framebuffer::Attachment* draw_buffer =
7637 draw_framebuffer->GetAttachment(attachment); 7641 draw_framebuffer->GetAttachment(attachment);
7638 if (!draw_buffer) { 7642 if (!draw_buffer) {
7639 continue; 7643 continue;
7640 } 7644 }
7641 if (draw_buffer->IsSameAttachment(read_buffer)) { 7645 if (draw_buffer->IsSameAttachment(read_buffer)) {
7642 is_feedback_loop = FeedbackLoopTrue; 7646 is_feedback_loop = FeedbackLoopTrue;
7643 break; 7647 break;
7644 } 7648 }
7645 } 7649 }
(...skipping 10324 matching lines...) Expand 10 before | Expand all | Expand 10 after
17970 } 17974 }
17971 17975
17972 // Include the auto-generated part of this file. We split this because it means 17976 // Include the auto-generated part of this file. We split this because it means
17973 // we can easily edit the non-auto generated parts right here in this file 17977 // we can easily edit the non-auto generated parts right here in this file
17974 // instead of having to edit some template or the code generator. 17978 // instead of having to edit some template or the code generator.
17975 #include "base/macros.h" 17979 #include "base/macros.h"
17976 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 17980 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
17977 17981
17978 } // namespace gles2 17982 } // namespace gles2
17979 } // namespace gpu 17983 } // namespace gpu
OLDNEW
« no previous file with comments | « no previous file | gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698