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 <stdio.h> | 7 #include <stdio.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <list> | 10 #include <list> |
(...skipping 1163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1174 bool SetCapabilityState(GLenum cap, bool enabled); | 1174 bool SetCapabilityState(GLenum cap, bool enabled); |
1175 | 1175 |
1176 // Check that the currently bound framebuffers are valid. | 1176 // Check that the currently bound framebuffers are valid. |
1177 // Generates GL error if not. | 1177 // Generates GL error if not. |
1178 bool CheckBoundFramebuffersValid(const char* func_name); | 1178 bool CheckBoundFramebuffersValid(const char* func_name); |
1179 | 1179 |
1180 // Check that the currently bound read framebuffer has a color image | 1180 // Check that the currently bound read framebuffer has a color image |
1181 // attached. Generates GL error if not. | 1181 // attached. Generates GL error if not. |
1182 bool CheckBoundReadFramebufferColorAttachment(const char* func_name); | 1182 bool CheckBoundReadFramebufferColorAttachment(const char* func_name); |
1183 | 1183 |
1184 // Check that the currently bound read framebuffer's color image | |
1185 // isn't the target texture of the glCopyTex{Sub}Image2D. | |
1186 bool FormsTextureCopyingFeedbackLoop(TextureRef* texture, GLint level); | |
1187 | |
1184 // Check if a framebuffer meets our requirements. | 1188 // Check if a framebuffer meets our requirements. |
1185 bool CheckFramebufferValid( | 1189 bool CheckFramebufferValid( |
1186 Framebuffer* framebuffer, | 1190 Framebuffer* framebuffer, |
1187 GLenum target, | 1191 GLenum target, |
1188 const char* func_name); | 1192 const char* func_name); |
1189 | 1193 |
1190 // Checks if the current program exists and is valid. If not generates the | 1194 // Checks if the current program exists and is valid. If not generates the |
1191 // appropriate GL error. Returns true if the current program is in a usable | 1195 // appropriate GL error. Returns true if the current program is in a usable |
1192 // state. | 1196 // state. |
1193 bool CheckCurrentProgram(const char* function_name); | 1197 bool CheckCurrentProgram(const char* function_name); |
(...skipping 2031 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3225 if (!framebuffer) | 3229 if (!framebuffer) |
3226 return true; | 3230 return true; |
3227 if (framebuffer->GetAttachment(GL_COLOR_ATTACHMENT0) == NULL) { | 3231 if (framebuffer->GetAttachment(GL_COLOR_ATTACHMENT0) == NULL) { |
3228 LOCAL_SET_GL_ERROR( | 3232 LOCAL_SET_GL_ERROR( |
3229 GL_INVALID_OPERATION, func_name, "no color image attached"); | 3233 GL_INVALID_OPERATION, func_name, "no color image attached"); |
3230 return false; | 3234 return false; |
3231 } | 3235 } |
3232 return true; | 3236 return true; |
3233 } | 3237 } |
3234 | 3238 |
3239 bool GLES2DecoderImpl::FormsTextureCopyingFeedbackLoop( | |
3240 TextureRef* texture, GLint level) { | |
3241 Framebuffer* framebuffer = features().chromium_framebuffer_multisample ? | |
3242 framebuffer_state_.bound_read_framebuffer.get() : | |
3243 framebuffer_state_.bound_draw_framebuffer.get(); | |
3244 if (!framebuffer) | |
3245 return false; | |
3246 const Framebuffer::Attachment* attachment = framebuffer->GetAttachment( | |
3247 GL_COLOR_ATTACHMENT0); | |
3248 if (!attachment) | |
3249 return false; | |
3250 return attachment->FormsFeedbackLoop(texture, level); | |
3251 } | |
3252 | |
3235 gfx::Size GLES2DecoderImpl::GetBoundReadFrameBufferSize() { | 3253 gfx::Size GLES2DecoderImpl::GetBoundReadFrameBufferSize() { |
3236 Framebuffer* framebuffer = | 3254 Framebuffer* framebuffer = |
3237 GetFramebufferInfoForTarget(GL_READ_FRAMEBUFFER_EXT); | 3255 GetFramebufferInfoForTarget(GL_READ_FRAMEBUFFER_EXT); |
3238 if (framebuffer != NULL) { | 3256 if (framebuffer != NULL) { |
3239 const Framebuffer::Attachment* attachment = | 3257 const Framebuffer::Attachment* attachment = |
3240 framebuffer->GetAttachment(GL_COLOR_ATTACHMENT0); | 3258 framebuffer->GetAttachment(GL_COLOR_ATTACHMENT0); |
3241 if (attachment) { | 3259 if (attachment) { |
3242 return gfx::Size(attachment->width(), attachment->height()); | 3260 return gfx::Size(attachment->width(), attachment->height()); |
3243 } | 3261 } |
3244 return gfx::Size(0, 0); | 3262 return gfx::Size(0, 0); |
(...skipping 5343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
8588 | 8606 |
8589 if (!EnsureGPUMemoryAvailable(estimated_size)) { | 8607 if (!EnsureGPUMemoryAvailable(estimated_size)) { |
8590 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopyTexImage2D", "out of memory"); | 8608 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopyTexImage2D", "out of memory"); |
8591 return; | 8609 return; |
8592 } | 8610 } |
8593 | 8611 |
8594 if (!CheckBoundReadFramebufferColorAttachment("glCopyTexImage2D")) { | 8612 if (!CheckBoundReadFramebufferColorAttachment("glCopyTexImage2D")) { |
8595 return; | 8613 return; |
8596 } | 8614 } |
8597 | 8615 |
8616 if (FormsTextureCopyingFeedbackLoop(texture_ref, level)) { | |
8617 LOCAL_SET_GL_ERROR( | |
8618 GL_INVALID_OPERATION, "glCopyTexImage2D", "feedback loops"); | |
bajones
2014/10/13 22:22:09
I feel like the error message here and below could
Zhenyao Mo
2014/10/13 22:31:40
Done.
| |
8619 return; | |
8620 } | |
8621 | |
8598 if (!CheckBoundFramebuffersValid("glCopyTexImage2D")) { | 8622 if (!CheckBoundFramebuffersValid("glCopyTexImage2D")) { |
8599 return; | 8623 return; |
8600 } | 8624 } |
8601 | 8625 |
8602 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopyTexImage2D"); | 8626 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopyTexImage2D"); |
8603 ScopedResolvedFrameBufferBinder binder(this, false, true); | 8627 ScopedResolvedFrameBufferBinder binder(this, false, true); |
8604 gfx::Size size = GetBoundReadFrameBufferSize(); | 8628 gfx::Size size = GetBoundReadFrameBufferSize(); |
8605 | 8629 |
8606 if (texture->IsAttachedToFramebuffer()) { | 8630 if (texture->IsAttachedToFramebuffer()) { |
8607 framebuffer_state_.clear_state_dirty = true; | 8631 framebuffer_state_.clear_state_dirty = true; |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
8706 LOCAL_SET_GL_ERROR( | 8730 LOCAL_SET_GL_ERROR( |
8707 GL_INVALID_OPERATION, | 8731 GL_INVALID_OPERATION, |
8708 "glCopySubImage2D", "can not be used with depth or stencil textures"); | 8732 "glCopySubImage2D", "can not be used with depth or stencil textures"); |
8709 return; | 8733 return; |
8710 } | 8734 } |
8711 | 8735 |
8712 if (!CheckBoundReadFramebufferColorAttachment("glCopyTexSubImage2D")) { | 8736 if (!CheckBoundReadFramebufferColorAttachment("glCopyTexSubImage2D")) { |
8713 return; | 8737 return; |
8714 } | 8738 } |
8715 | 8739 |
8740 if (FormsTextureCopyingFeedbackLoop(texture_ref, level)) { | |
8741 LOCAL_SET_GL_ERROR( | |
8742 GL_INVALID_OPERATION, "glCopyTexSubImage2D", "feedback loops"); | |
8743 return; | |
8744 } | |
8745 | |
8716 if (!CheckBoundFramebuffersValid("glCopyTexSubImage2D")) { | 8746 if (!CheckBoundFramebuffersValid("glCopyTexSubImage2D")) { |
8717 return; | 8747 return; |
8718 } | 8748 } |
8719 | 8749 |
8720 ScopedResolvedFrameBufferBinder binder(this, false, true); | 8750 ScopedResolvedFrameBufferBinder binder(this, false, true); |
8721 gfx::Size size = GetBoundReadFrameBufferSize(); | 8751 gfx::Size size = GetBoundReadFrameBufferSize(); |
8722 GLint copyX = 0; | 8752 GLint copyX = 0; |
8723 GLint copyY = 0; | 8753 GLint copyY = 0; |
8724 GLint copyWidth = 0; | 8754 GLint copyWidth = 0; |
8725 GLint copyHeight = 0; | 8755 GLint copyHeight = 0; |
(...skipping 2423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11149 } | 11179 } |
11150 } | 11180 } |
11151 | 11181 |
11152 // Include the auto-generated part of this file. We split this because it means | 11182 // Include the auto-generated part of this file. We split this because it means |
11153 // we can easily edit the non-auto generated parts right here in this file | 11183 // we can easily edit the non-auto generated parts right here in this file |
11154 // instead of having to edit some template or the code generator. | 11184 // instead of having to edit some template or the code generator. |
11155 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 11185 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
11156 | 11186 |
11157 } // namespace gles2 | 11187 } // namespace gles2 |
11158 } // namespace gpu | 11188 } // namespace gpu |
OLD | NEW |