| 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 1335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1346 void RestoreClearState(); | 1346 void RestoreClearState(); |
| 1347 | 1347 |
| 1348 // Remembers the state of some capabilities. | 1348 // Remembers the state of some capabilities. |
| 1349 // Returns: true if glEnable/glDisable should actually be called. | 1349 // Returns: true if glEnable/glDisable should actually be called. |
| 1350 bool SetCapabilityState(GLenum cap, bool enabled); | 1350 bool SetCapabilityState(GLenum cap, bool enabled); |
| 1351 | 1351 |
| 1352 // Infer color encoding from internalformat | 1352 // Infer color encoding from internalformat |
| 1353 static GLint GetColorEncodingFromInternalFormat(GLenum internalformat); | 1353 static GLint GetColorEncodingFromInternalFormat(GLenum internalformat); |
| 1354 | 1354 |
| 1355 // Check that the currently bound read framebuffer's color image | 1355 // Check that the currently bound read framebuffer's color image |
| 1356 // isn't the target texture of the glCopyTex{Sub}Image2D. | 1356 // isn't the target texture of the glCopyTex{Sub}Image{2D|3D}. |
| 1357 bool FormsTextureCopyingFeedbackLoop(TextureRef* texture, GLint level); | 1357 bool FormsTextureCopyingFeedbackLoop( |
| 1358 TextureRef* texture, |
| 1359 GLint level, |
| 1360 GLint layer); |
| 1358 | 1361 |
| 1359 // Check if a framebuffer meets our requirements. | 1362 // Check if a framebuffer meets our requirements. |
| 1360 // Generates |gl_error| if the framebuffer is incomplete. | 1363 // Generates |gl_error| if the framebuffer is incomplete. |
| 1361 bool CheckFramebufferValid( | 1364 bool CheckFramebufferValid( |
| 1362 Framebuffer* framebuffer, | 1365 Framebuffer* framebuffer, |
| 1363 GLenum target, | 1366 GLenum target, |
| 1364 GLenum gl_error, | 1367 GLenum gl_error, |
| 1365 const char* func_name); | 1368 const char* func_name); |
| 1366 | 1369 |
| 1367 bool CheckBoundDrawFramebufferValid(const char* func_name); | 1370 bool CheckBoundDrawFramebufferValid(const char* func_name); |
| (...skipping 2912 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4280 case GL_SRGB_ALPHA_EXT: | 4283 case GL_SRGB_ALPHA_EXT: |
| 4281 case GL_SRGB8: | 4284 case GL_SRGB8: |
| 4282 case GL_SRGB8_ALPHA8: | 4285 case GL_SRGB8_ALPHA8: |
| 4283 return GL_SRGB; | 4286 return GL_SRGB; |
| 4284 default: | 4287 default: |
| 4285 return GL_LINEAR; | 4288 return GL_LINEAR; |
| 4286 } | 4289 } |
| 4287 } | 4290 } |
| 4288 | 4291 |
| 4289 bool GLES2DecoderImpl::FormsTextureCopyingFeedbackLoop( | 4292 bool GLES2DecoderImpl::FormsTextureCopyingFeedbackLoop( |
| 4290 TextureRef* texture, GLint level) { | 4293 TextureRef* texture, GLint level, GLint layer) { |
| 4291 Framebuffer* framebuffer = features().chromium_framebuffer_multisample ? | 4294 Framebuffer* framebuffer = features().chromium_framebuffer_multisample ? |
| 4292 framebuffer_state_.bound_read_framebuffer.get() : | 4295 framebuffer_state_.bound_read_framebuffer.get() : |
| 4293 framebuffer_state_.bound_draw_framebuffer.get(); | 4296 framebuffer_state_.bound_draw_framebuffer.get(); |
| 4294 if (!framebuffer) | 4297 if (!framebuffer) |
| 4295 return false; | 4298 return false; |
| 4296 const Framebuffer::Attachment* attachment = framebuffer->GetAttachment( | 4299 const Framebuffer::Attachment* attachment = |
| 4297 GL_COLOR_ATTACHMENT0); | 4300 framebuffer->GetReadBufferAttachment(); |
| 4298 if (!attachment) | 4301 if (!attachment) |
| 4299 return false; | 4302 return false; |
| 4300 return attachment->FormsFeedbackLoop(texture, level); | 4303 return attachment->FormsFeedbackLoop(texture, level, layer); |
| 4301 } | 4304 } |
| 4302 | 4305 |
| 4303 gfx::Size GLES2DecoderImpl::GetBoundReadFrameBufferSize() { | 4306 gfx::Size GLES2DecoderImpl::GetBoundReadFrameBufferSize() { |
| 4304 Framebuffer* framebuffer = | 4307 Framebuffer* framebuffer = |
| 4305 GetFramebufferInfoForTarget(GL_READ_FRAMEBUFFER_EXT); | 4308 GetFramebufferInfoForTarget(GL_READ_FRAMEBUFFER_EXT); |
| 4306 if (framebuffer != NULL) { | 4309 if (framebuffer != NULL) { |
| 4307 const Framebuffer::Attachment* attachment = | 4310 const Framebuffer::Attachment* attachment = |
| 4308 framebuffer->GetReadBufferAttachment(); | 4311 framebuffer->GetReadBufferAttachment(); |
| 4309 if (attachment) { | 4312 if (attachment) { |
| 4310 return gfx::Size(attachment->width(), attachment->height()); | 4313 return gfx::Size(attachment->width(), attachment->height()); |
| (...skipping 8694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13005 state_.unpack_alignment, &pixels_size, NULL, NULL)) { | 13008 state_.unpack_alignment, &pixels_size, NULL, NULL)) { |
| 13006 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, func_name, "dimensions too large"); | 13009 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, func_name, "dimensions too large"); |
| 13007 return; | 13010 return; |
| 13008 } | 13011 } |
| 13009 | 13012 |
| 13010 if (!EnsureGPUMemoryAvailable(pixels_size)) { | 13013 if (!EnsureGPUMemoryAvailable(pixels_size)) { |
| 13011 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, func_name, "out of memory"); | 13014 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, func_name, "out of memory"); |
| 13012 return; | 13015 return; |
| 13013 } | 13016 } |
| 13014 | 13017 |
| 13015 if (FormsTextureCopyingFeedbackLoop(texture_ref, level)) { | 13018 if (FormsTextureCopyingFeedbackLoop(texture_ref, level, 0)) { |
| 13016 LOCAL_SET_GL_ERROR( | 13019 LOCAL_SET_GL_ERROR( |
| 13017 GL_INVALID_OPERATION, | 13020 GL_INVALID_OPERATION, |
| 13018 func_name, "source and destination textures are the same"); | 13021 func_name, "source and destination textures are the same"); |
| 13019 return; | 13022 return; |
| 13020 } | 13023 } |
| 13021 | 13024 |
| 13022 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER(func_name); | 13025 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER(func_name); |
| 13023 ScopedResolvedFrameBufferBinder binder(this, false, true); | 13026 ScopedResolvedFrameBufferBinder binder(this, false, true); |
| 13024 gfx::Size size = GetBoundReadFrameBufferSize(); | 13027 gfx::Size size = GetBoundReadFrameBufferSize(); |
| 13025 | 13028 |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13179 return; | 13182 return; |
| 13180 } | 13183 } |
| 13181 | 13184 |
| 13182 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); | 13185 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); |
| 13183 GLenum read_type = GetBoundReadFrameBufferTextureType(); | 13186 GLenum read_type = GetBoundReadFrameBufferTextureType(); |
| 13184 if (!ValidateCopyTexFormat(func_name, internal_format, | 13187 if (!ValidateCopyTexFormat(func_name, internal_format, |
| 13185 read_format, read_type)) { | 13188 read_format, read_type)) { |
| 13186 return; | 13189 return; |
| 13187 } | 13190 } |
| 13188 | 13191 |
| 13189 if (FormsTextureCopyingFeedbackLoop(texture_ref, level)) { | 13192 if (FormsTextureCopyingFeedbackLoop(texture_ref, level, 0)) { |
| 13190 LOCAL_SET_GL_ERROR( | 13193 LOCAL_SET_GL_ERROR( |
| 13191 GL_INVALID_OPERATION, | 13194 GL_INVALID_OPERATION, |
| 13192 func_name, "source and destination textures are the same"); | 13195 func_name, "source and destination textures are the same"); |
| 13193 return; | 13196 return; |
| 13194 } | 13197 } |
| 13195 | 13198 |
| 13196 ScopedResolvedFrameBufferBinder binder(this, false, true); | 13199 ScopedResolvedFrameBufferBinder binder(this, false, true); |
| 13197 gfx::Size size = GetBoundReadFrameBufferSize(); | 13200 gfx::Size size = GetBoundReadFrameBufferSize(); |
| 13198 GLint copyX = 0; | 13201 GLint copyX = 0; |
| 13199 GLint copyY = 0; | 13202 GLint copyY = 0; |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13286 return; | 13289 return; |
| 13287 } | 13290 } |
| 13288 | 13291 |
| 13289 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); | 13292 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); |
| 13290 GLenum read_type = GetBoundReadFrameBufferTextureType(); | 13293 GLenum read_type = GetBoundReadFrameBufferTextureType(); |
| 13291 if (!ValidateCopyTexFormat(func_name, internal_format, | 13294 if (!ValidateCopyTexFormat(func_name, internal_format, |
| 13292 read_format, read_type)) { | 13295 read_format, read_type)) { |
| 13293 return; | 13296 return; |
| 13294 } | 13297 } |
| 13295 | 13298 |
| 13296 // TODO(yunchao): Follow-up CLs are necessary. For instance, feedback loop | 13299 if (FormsTextureCopyingFeedbackLoop(texture_ref, level, zoffset)) { |
| 13297 // detection, emulation of unsized formats in core profile, clear the 3d | 13300 LOCAL_SET_GL_ERROR( |
| 13298 // textures if it is uncleared, out-of-bounds reading, etc. | 13301 GL_INVALID_OPERATION, |
| 13302 func_name, "source and destination textures are the same"); |
| 13303 return; |
| 13304 } |
| 13305 |
| 13306 // TODO(yunchao): Follow-up CLs are necessary. For instance: |
| 13307 // 1. emulation of unsized formats in core profile |
| 13308 // 2. clear the 3d textures if it is uncleared. |
| 13309 // 3. out-of-bounds reading, etc. |
| 13299 | 13310 |
| 13300 glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, | 13311 glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, |
| 13301 height); | 13312 height); |
| 13302 | 13313 |
| 13303 // This may be a slow command. Exit command processing to allow for | 13314 // This may be a slow command. Exit command processing to allow for |
| 13304 // context preemption and GPU watchdog checks. | 13315 // context preemption and GPU watchdog checks. |
| 13305 ExitCommandProcessingEarly(); | 13316 ExitCommandProcessingEarly(); |
| 13306 } | 13317 } |
| 13307 | 13318 |
| 13308 error::Error GLES2DecoderImpl::HandleTexSubImage2D(uint32_t immediate_data_size, | 13319 error::Error GLES2DecoderImpl::HandleTexSubImage2D(uint32_t immediate_data_size, |
| (...skipping 4444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17753 } | 17764 } |
| 17754 | 17765 |
| 17755 // Include the auto-generated part of this file. We split this because it means | 17766 // Include the auto-generated part of this file. We split this because it means |
| 17756 // we can easily edit the non-auto generated parts right here in this file | 17767 // we can easily edit the non-auto generated parts right here in this file |
| 17757 // instead of having to edit some template or the code generator. | 17768 // instead of having to edit some template or the code generator. |
| 17758 #include "base/macros.h" | 17769 #include "base/macros.h" |
| 17759 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 17770 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 17760 | 17771 |
| 17761 } // namespace gles2 | 17772 } // namespace gles2 |
| 17762 } // namespace gpu | 17773 } // namespace gpu |
| OLD | NEW |