OLD | NEW |
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 7997 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8008 "invalid filter for integer format"); | 8008 "invalid filter for integer format"); |
8009 return; | 8009 return; |
8010 } | 8010 } |
8011 | 8011 |
8012 GLenum src_sized_format = | 8012 GLenum src_sized_format = |
8013 GLES2Util::ConvertToSizedFormat(src_internal_format, src_type); | 8013 GLES2Util::ConvertToSizedFormat(src_internal_format, src_type); |
8014 DCHECK(read_framebuffer || (is_feedback_loop != FeedbackLoopUnknown)); | 8014 DCHECK(read_framebuffer || (is_feedback_loop != FeedbackLoopUnknown)); |
8015 const Framebuffer::Attachment* read_buffer = | 8015 const Framebuffer::Attachment* read_buffer = |
8016 is_feedback_loop == FeedbackLoopUnknown ? | 8016 is_feedback_loop == FeedbackLoopUnknown ? |
8017 read_framebuffer->GetReadBufferAttachment() : nullptr; | 8017 read_framebuffer->GetReadBufferAttachment() : nullptr; |
| 8018 bool draw_buffer_has_image = false; |
8018 for (uint32_t ii = 0; ii < group_->max_draw_buffers(); ++ii) { | 8019 for (uint32_t ii = 0; ii < group_->max_draw_buffers(); ++ii) { |
8019 GLenum dst_format = GetBoundColorDrawBufferInternalFormat( | 8020 GLenum dst_format = GetBoundColorDrawBufferInternalFormat( |
8020 static_cast<GLint>(ii)); | 8021 static_cast<GLint>(ii)); |
8021 GLenum dst_type = GetBoundColorDrawBufferType(static_cast<GLint>(ii)); | 8022 GLenum dst_type = GetBoundColorDrawBufferType(static_cast<GLint>(ii)); |
8022 if (dst_format == 0) | 8023 if (dst_format == 0) |
8023 continue; | 8024 continue; |
| 8025 draw_buffer_has_image = true; |
8024 if (!src_internal_format) { | 8026 if (!src_internal_format) { |
8025 read_framebuffer_miss_image = true; | 8027 read_framebuffer_miss_image = true; |
8026 } | 8028 } |
8027 if (GetColorEncodingFromInternalFormat(dst_format) == GL_SRGB) | 8029 if (GetColorEncodingFromInternalFormat(dst_format) == GL_SRGB) |
8028 draw_buffers_has_srgb = true; | 8030 draw_buffers_has_srgb = true; |
8029 if (read_buffer_samples > 0 && | 8031 if (read_buffer_samples > 0 && |
8030 (src_sized_format != | 8032 (src_sized_format != |
8031 GLES2Util::ConvertToSizedFormat(dst_format, dst_type))) { | 8033 GLES2Util::ConvertToSizedFormat(dst_format, dst_type))) { |
8032 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, | 8034 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, |
8033 "src and dst formats differ for color"); | 8035 "src and dst formats differ for color"); |
(...skipping 16 matching lines...) Expand all Loading... |
8050 draw_framebuffer->GetAttachment(attachment); | 8052 draw_framebuffer->GetAttachment(attachment); |
8051 if (!draw_buffer || !read_buffer) { | 8053 if (!draw_buffer || !read_buffer) { |
8052 continue; | 8054 continue; |
8053 } | 8055 } |
8054 if (draw_buffer->IsSameAttachment(read_buffer)) { | 8056 if (draw_buffer->IsSameAttachment(read_buffer)) { |
8055 is_feedback_loop = FeedbackLoopTrue; | 8057 is_feedback_loop = FeedbackLoopTrue; |
8056 break; | 8058 break; |
8057 } | 8059 } |
8058 } | 8060 } |
8059 } | 8061 } |
| 8062 if (draw_framebuffer && !draw_buffer_has_image) |
| 8063 mask_blit &= ~GL_COLOR_BUFFER_BIT; |
8060 } | 8064 } |
8061 if (is_feedback_loop == FeedbackLoopTrue) { | 8065 if (is_feedback_loop == FeedbackLoopTrue) { |
8062 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, | 8066 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, |
8063 "source buffer and destination buffers are identical"); | 8067 "source buffer and destination buffers are identical"); |
8064 return; | 8068 return; |
8065 } | 8069 } |
8066 if (read_framebuffer_miss_image == true) { | 8070 if (read_framebuffer_miss_image == true) { |
8067 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, | 8071 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, func_name, |
8068 "The designated attachment point(s) in read framebuffer miss image"); | 8072 "The designated attachment point(s) in read framebuffer miss image"); |
8069 return; | 8073 return; |
(...skipping 11045 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19115 } | 19119 } |
19116 | 19120 |
19117 // Include the auto-generated part of this file. We split this because it means | 19121 // Include the auto-generated part of this file. We split this because it means |
19118 // we can easily edit the non-auto generated parts right here in this file | 19122 // we can easily edit the non-auto generated parts right here in this file |
19119 // instead of having to edit some template or the code generator. | 19123 // instead of having to edit some template or the code generator. |
19120 #include "base/macros.h" | 19124 #include "base/macros.h" |
19121 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 19125 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
19122 | 19126 |
19123 } // namespace gles2 | 19127 } // namespace gles2 |
19124 } // namespace gpu | 19128 } // namespace gpu |
OLD | NEW |