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 2111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2122 } | 2122 } |
2123 | 2123 |
2124 bool BackTexture::AllocateStorage( | 2124 bool BackTexture::AllocateStorage( |
2125 const gfx::Size& size, GLenum format, bool zero) { | 2125 const gfx::Size& size, GLenum format, bool zero) { |
2126 DCHECK_NE(id_, 0u); | 2126 DCHECK_NE(id_, 0u); |
2127 ScopedGLErrorSuppressor suppressor("BackTexture::AllocateStorage", | 2127 ScopedGLErrorSuppressor suppressor("BackTexture::AllocateStorage", |
2128 state_->GetErrorState()); | 2128 state_->GetErrorState()); |
2129 ScopedTextureBinder binder(state_, id_, GL_TEXTURE_2D); | 2129 ScopedTextureBinder binder(state_, id_, GL_TEXTURE_2D); |
2130 uint32 image_size = 0; | 2130 uint32 image_size = 0; |
2131 GLES2Util::ComputeImageDataSizes( | 2131 GLES2Util::ComputeImageDataSizes( |
2132 size.width(), size.height(), format, GL_UNSIGNED_BYTE, 8, &image_size, | 2132 size.width(), size.height(), 1, format, GL_UNSIGNED_BYTE, 8, &image_size, |
2133 NULL, NULL); | 2133 NULL, NULL); |
2134 | 2134 |
2135 if (!memory_tracker_.EnsureGPUMemoryAvailable(image_size)) { | 2135 if (!memory_tracker_.EnsureGPUMemoryAvailable(image_size)) { |
2136 return false; | 2136 return false; |
2137 } | 2137 } |
2138 | 2138 |
2139 scoped_ptr<char[]> zero_data; | 2139 scoped_ptr<char[]> zero_data; |
2140 if (zero) { | 2140 if (zero) { |
2141 zero_data.reset(new char[image_size]); | 2141 zero_data.reset(new char[image_size]); |
2142 memset(zero_data.get(), 0, image_size); | 2142 memset(zero_data.get(), 0, image_size); |
(...skipping 5532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7675 result = GetSharedMemoryAs<Result*>( | 7675 result = GetSharedMemoryAs<Result*>( |
7676 c.result_shm_id, c.result_shm_offset, sizeof(*result)); | 7676 c.result_shm_id, c.result_shm_offset, sizeof(*result)); |
7677 if (!result) { | 7677 if (!result) { |
7678 if (buffer != 0) { | 7678 if (buffer != 0) { |
7679 glDeleteBuffersARB(1, &buffer); | 7679 glDeleteBuffersARB(1, &buffer); |
7680 } | 7680 } |
7681 return; | 7681 return; |
7682 } | 7682 } |
7683 } | 7683 } |
7684 GLES2Util::ComputeImageDataSizes( | 7684 GLES2Util::ComputeImageDataSizes( |
7685 width, height, format, type, state_.pack_alignment, &pixels_size, | 7685 width, height, 1, format, type, state_.pack_alignment, &pixels_size, |
7686 NULL, NULL); | 7686 NULL, NULL); |
7687 void* pixels = GetSharedMemoryAs<void*>( | 7687 void* pixels = GetSharedMemoryAs<void*>( |
7688 c.pixels_shm_id, c.pixels_shm_offset, pixels_size); | 7688 c.pixels_shm_id, c.pixels_shm_offset, pixels_size); |
7689 if (!pixels) { | 7689 if (!pixels) { |
7690 if (buffer != 0) { | 7690 if (buffer != 0) { |
7691 glDeleteBuffersARB(1, &buffer); | 7691 glDeleteBuffersARB(1, &buffer); |
7692 } | 7692 } |
7693 return; | 7693 return; |
7694 } | 7694 } |
7695 | 7695 |
(...skipping 26 matching lines...) Expand all Loading... |
7722 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); | 7722 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); |
7723 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format); | 7723 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format); |
7724 if ((channels_exist & 0x0008) == 0 && | 7724 if ((channels_exist & 0x0008) == 0 && |
7725 workarounds().clear_alpha_in_readpixels) { | 7725 workarounds().clear_alpha_in_readpixels) { |
7726 // Set the alpha to 255 because some drivers are buggy in this regard. | 7726 // Set the alpha to 255 because some drivers are buggy in this regard. |
7727 uint32 temp_size; | 7727 uint32 temp_size; |
7728 | 7728 |
7729 uint32 unpadded_row_size; | 7729 uint32 unpadded_row_size; |
7730 uint32 padded_row_size; | 7730 uint32 padded_row_size; |
7731 if (!GLES2Util::ComputeImageDataSizes( | 7731 if (!GLES2Util::ComputeImageDataSizes( |
7732 width, 2, format, type, state_.pack_alignment, &temp_size, | 7732 width, 2, 1, format, type, state_.pack_alignment, &temp_size, |
7733 &unpadded_row_size, &padded_row_size)) { | 7733 &unpadded_row_size, &padded_row_size)) { |
7734 return; | 7734 return; |
7735 } | 7735 } |
7736 | 7736 |
7737 uint32 channel_count = 0; | 7737 uint32 channel_count = 0; |
7738 uint32 alpha_channel = 0; | 7738 uint32 alpha_channel = 0; |
7739 switch (format) { | 7739 switch (format) { |
7740 case GL_RGBA: | 7740 case GL_RGBA: |
7741 case GL_BGRA_EXT: | 7741 case GL_BGRA_EXT: |
7742 channel_count = 4; | 7742 channel_count = 4; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7785 GLenum format = c.format; | 7785 GLenum format = c.format; |
7786 GLenum type = c.type; | 7786 GLenum type = c.type; |
7787 GLboolean async = static_cast<GLboolean>(c.async); | 7787 GLboolean async = static_cast<GLboolean>(c.async); |
7788 if (width < 0 || height < 0) { | 7788 if (width < 0 || height < 0) { |
7789 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glReadPixels", "dimensions < 0"); | 7789 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glReadPixels", "dimensions < 0"); |
7790 return error::kNoError; | 7790 return error::kNoError; |
7791 } | 7791 } |
7792 typedef cmds::ReadPixels::Result Result; | 7792 typedef cmds::ReadPixels::Result Result; |
7793 uint32 pixels_size; | 7793 uint32 pixels_size; |
7794 if (!GLES2Util::ComputeImageDataSizes( | 7794 if (!GLES2Util::ComputeImageDataSizes( |
7795 width, height, format, type, state_.pack_alignment, &pixels_size, | 7795 width, height, 1, format, type, state_.pack_alignment, &pixels_size, |
7796 NULL, NULL)) { | 7796 NULL, NULL)) { |
7797 return error::kOutOfBounds; | 7797 return error::kOutOfBounds; |
7798 } | 7798 } |
7799 void* pixels = GetSharedMemoryAs<void*>( | 7799 void* pixels = GetSharedMemoryAs<void*>( |
7800 c.pixels_shm_id, c.pixels_shm_offset, pixels_size); | 7800 c.pixels_shm_id, c.pixels_shm_offset, pixels_size); |
7801 if (!pixels) { | 7801 if (!pixels) { |
7802 return error::kOutOfBounds; | 7802 return error::kOutOfBounds; |
7803 } | 7803 } |
7804 Result* result = NULL; | 7804 Result* result = NULL; |
7805 if (c.result_shm_id != 0) { | 7805 if (c.result_shm_id != 0) { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7861 | 7861 |
7862 ScopedResolvedFrameBufferBinder binder(this, false, true); | 7862 ScopedResolvedFrameBufferBinder binder(this, false, true); |
7863 | 7863 |
7864 if (x < 0 || y < 0 || max_x > max_size.width() || max_y > max_size.height()) { | 7864 if (x < 0 || y < 0 || max_x > max_size.width() || max_y > max_size.height()) { |
7865 // The user requested an out of range area. Get the results 1 line | 7865 // The user requested an out of range area. Get the results 1 line |
7866 // at a time. | 7866 // at a time. |
7867 uint32 temp_size; | 7867 uint32 temp_size; |
7868 uint32 unpadded_row_size; | 7868 uint32 unpadded_row_size; |
7869 uint32 padded_row_size; | 7869 uint32 padded_row_size; |
7870 if (!GLES2Util::ComputeImageDataSizes( | 7870 if (!GLES2Util::ComputeImageDataSizes( |
7871 width, 2, format, type, state_.pack_alignment, &temp_size, | 7871 width, 2, 1, format, type, state_.pack_alignment, &temp_size, |
7872 &unpadded_row_size, &padded_row_size)) { | 7872 &unpadded_row_size, &padded_row_size)) { |
7873 LOCAL_SET_GL_ERROR( | 7873 LOCAL_SET_GL_ERROR( |
7874 GL_INVALID_VALUE, "glReadPixels", "dimensions out of range"); | 7874 GL_INVALID_VALUE, "glReadPixels", "dimensions out of range"); |
7875 return error::kNoError; | 7875 return error::kNoError; |
7876 } | 7876 } |
7877 | 7877 |
7878 GLint dest_x_offset = std::max(-x, 0); | 7878 GLint dest_x_offset = std::max(-x, 0); |
7879 uint32 dest_row_offset; | 7879 uint32 dest_row_offset; |
7880 if (!GLES2Util::ComputeImageDataSizes( | 7880 if (!GLES2Util::ComputeImageDataSizes( |
7881 dest_x_offset, 1, format, type, state_.pack_alignment, &dest_row_offset, | 7881 dest_x_offset, 1, 1, format, type, state_.pack_alignment, |
7882 NULL, NULL)) { | 7882 &dest_row_offset, NULL, NULL)) { |
7883 LOCAL_SET_GL_ERROR( | 7883 LOCAL_SET_GL_ERROR( |
7884 GL_INVALID_VALUE, "glReadPixels", "dimensions out of range"); | 7884 GL_INVALID_VALUE, "glReadPixels", "dimensions out of range"); |
7885 return error::kNoError; | 7885 return error::kNoError; |
7886 } | 7886 } |
7887 | 7887 |
7888 // Copy each row into the larger dest rect. | 7888 // Copy each row into the larger dest rect. |
7889 int8* dst = static_cast<int8*>(pixels); | 7889 int8* dst = static_cast<int8*>(pixels); |
7890 GLint read_x = std::max(0, x); | 7890 GLint read_x = std::max(0, x); |
7891 GLint read_end_x = std::max(0, std::min(max_size.width(), max_x)); | 7891 GLint read_end_x = std::max(0, std::min(max_size.width(), max_x)); |
7892 GLint read_width = read_end_x - read_x; | 7892 GLint read_width = read_end_x - read_x; |
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8314 framebuffer ? framebuffer->service_id() : GetBackbufferServiceId(); | 8314 framebuffer ? framebuffer->service_id() : GetBackbufferServiceId(); |
8315 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fb_service_id); | 8315 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fb_service_id); |
8316 return true; | 8316 return true; |
8317 } | 8317 } |
8318 | 8318 |
8319 static const uint32 kMaxZeroSize = 1024 * 1024 * 4; | 8319 static const uint32 kMaxZeroSize = 1024 * 1024 * 4; |
8320 | 8320 |
8321 uint32 size; | 8321 uint32 size; |
8322 uint32 padded_row_size; | 8322 uint32 padded_row_size; |
8323 if (!GLES2Util::ComputeImageDataSizes( | 8323 if (!GLES2Util::ComputeImageDataSizes( |
8324 width, height, format, type, state_.unpack_alignment, &size, | 8324 width, height, 1, format, type, state_.unpack_alignment, &size, |
8325 NULL, &padded_row_size)) { | 8325 NULL, &padded_row_size)) { |
8326 return false; | 8326 return false; |
8327 } | 8327 } |
8328 | 8328 |
8329 TRACE_EVENT1("gpu", "GLES2DecoderImpl::ClearLevel", "size", size); | 8329 TRACE_EVENT1("gpu", "GLES2DecoderImpl::ClearLevel", "size", size); |
8330 | 8330 |
8331 int tile_height; | 8331 int tile_height; |
8332 | 8332 |
8333 if (size > kMaxZeroSize) { | 8333 if (size > kMaxZeroSize) { |
8334 if (kMaxZeroSize < padded_row_size) { | 8334 if (kMaxZeroSize < padded_row_size) { |
8335 // That'd be an awfully large texture. | 8335 // That'd be an awfully large texture. |
8336 return false; | 8336 return false; |
8337 } | 8337 } |
8338 // We should never have a large total size with a zero row size. | 8338 // We should never have a large total size with a zero row size. |
8339 DCHECK_GT(padded_row_size, 0U); | 8339 DCHECK_GT(padded_row_size, 0U); |
8340 tile_height = kMaxZeroSize / padded_row_size; | 8340 tile_height = kMaxZeroSize / padded_row_size; |
8341 if (!GLES2Util::ComputeImageDataSizes( | 8341 if (!GLES2Util::ComputeImageDataSizes( |
8342 width, tile_height, format, type, state_.unpack_alignment, &size, | 8342 width, tile_height, 1, format, type, state_.unpack_alignment, &size, |
8343 NULL, NULL)) { | 8343 NULL, NULL)) { |
8344 return false; | 8344 return false; |
8345 } | 8345 } |
8346 } else { | 8346 } else { |
8347 tile_height = height; | 8347 tile_height = height; |
8348 } | 8348 } |
8349 | 8349 |
8350 // Assumes the size has already been checked. | 8350 // Assumes the size has already been checked. |
8351 scoped_ptr<char[]> zero(new char[size]); | 8351 scoped_ptr<char[]> zero(new char[size]); |
8352 memset(zero.get(), 0, size); | 8352 memset(zero.get(), 0, size); |
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8768 GLenum internal_format = static_cast<GLenum>(c.internalformat); | 8768 GLenum internal_format = static_cast<GLenum>(c.internalformat); |
8769 GLsizei width = static_cast<GLsizei>(c.width); | 8769 GLsizei width = static_cast<GLsizei>(c.width); |
8770 GLsizei height = static_cast<GLsizei>(c.height); | 8770 GLsizei height = static_cast<GLsizei>(c.height); |
8771 GLint border = static_cast<GLint>(c.border); | 8771 GLint border = static_cast<GLint>(c.border); |
8772 GLenum format = static_cast<GLenum>(c.format); | 8772 GLenum format = static_cast<GLenum>(c.format); |
8773 GLenum type = static_cast<GLenum>(c.type); | 8773 GLenum type = static_cast<GLenum>(c.type); |
8774 uint32 pixels_shm_id = static_cast<uint32>(c.pixels_shm_id); | 8774 uint32 pixels_shm_id = static_cast<uint32>(c.pixels_shm_id); |
8775 uint32 pixels_shm_offset = static_cast<uint32>(c.pixels_shm_offset); | 8775 uint32 pixels_shm_offset = static_cast<uint32>(c.pixels_shm_offset); |
8776 uint32 pixels_size; | 8776 uint32 pixels_size; |
8777 if (!GLES2Util::ComputeImageDataSizes( | 8777 if (!GLES2Util::ComputeImageDataSizes( |
8778 width, height, format, type, state_.unpack_alignment, &pixels_size, NULL, | 8778 width, height, 1, format, type, state_.unpack_alignment, &pixels_size, |
8779 NULL)) { | 8779 NULL, NULL)) { |
8780 return error::kOutOfBounds; | 8780 return error::kOutOfBounds; |
8781 } | 8781 } |
8782 const void* pixels = NULL; | 8782 const void* pixels = NULL; |
8783 if (pixels_shm_id != 0 || pixels_shm_offset != 0) { | 8783 if (pixels_shm_id != 0 || pixels_shm_offset != 0) { |
8784 pixels = GetSharedMemoryAs<const void*>( | 8784 pixels = GetSharedMemoryAs<const void*>( |
8785 pixels_shm_id, pixels_shm_offset, pixels_size); | 8785 pixels_shm_id, pixels_shm_offset, pixels_size); |
8786 if (!pixels) { | 8786 if (!pixels) { |
8787 return error::kOutOfBounds; | 8787 return error::kOutOfBounds; |
8788 } | 8788 } |
8789 } | 8789 } |
8790 | 8790 |
8791 TextureManager::DoTextImage2DArguments args = { | 8791 TextureManager::DoTextImage2DArguments args = { |
8792 target, level, internal_format, width, height, border, format, type, | 8792 target, level, internal_format, width, height, border, format, type, |
8793 pixels, pixels_size}; | 8793 pixels, pixels_size}; |
8794 texture_manager()->ValidateAndDoTexImage2D( | 8794 texture_manager()->ValidateAndDoTexImage2D( |
8795 &texture_state_, &state_, &framebuffer_state_, args); | 8795 &texture_state_, &state_, &framebuffer_state_, args); |
8796 | 8796 |
8797 // This may be a slow command. Exit command processing to allow for | 8797 // This may be a slow command. Exit command processing to allow for |
8798 // context preemption and GPU watchdog checks. | 8798 // context preemption and GPU watchdog checks. |
8799 ExitCommandProcessingEarly(); | 8799 ExitCommandProcessingEarly(); |
8800 return error::kNoError; | 8800 return error::kNoError; |
8801 } | 8801 } |
8802 | 8802 |
| 8803 error::Error GLES2DecoderImpl::HandleTexImage3D(uint32 immediate_data_size, |
| 8804 const void* cmd_data) { |
| 8805 // TODO(zmo): Unsafe ES3 API. |
| 8806 if (!unsafe_es3_apis_enabled()) |
| 8807 return error::kUnknownCommand; |
| 8808 |
| 8809 const gles2::cmds::TexImage3D& c = |
| 8810 *static_cast<const gles2::cmds::TexImage3D*>(cmd_data); |
| 8811 TRACE_EVENT2("gpu", "GLES2DecoderImpl::HandleTexImage3D", |
| 8812 "widthXheight", c.width * c.height, "depth", c.depth); |
| 8813 GLenum target = static_cast<GLenum>(c.target); |
| 8814 GLint level = static_cast<GLint>(c.level); |
| 8815 GLenum internal_format = static_cast<GLenum>(c.internalformat); |
| 8816 GLsizei width = static_cast<GLsizei>(c.width); |
| 8817 GLsizei height = static_cast<GLsizei>(c.height); |
| 8818 GLsizei depth = static_cast<GLsizei>(c.depth); |
| 8819 GLint border = static_cast<GLint>(c.border); |
| 8820 GLenum format = static_cast<GLenum>(c.format); |
| 8821 GLenum type = static_cast<GLenum>(c.type); |
| 8822 uint32 pixels_shm_id = static_cast<uint32>(c.pixels_shm_id); |
| 8823 uint32 pixels_shm_offset = static_cast<uint32>(c.pixels_shm_offset); |
| 8824 uint32 pixels_size; |
| 8825 if (!GLES2Util::ComputeImageDataSizes( |
| 8826 width, height, depth, format, type, state_.unpack_alignment, &pixels_size, |
| 8827 NULL, NULL)) { |
| 8828 return error::kOutOfBounds; |
| 8829 } |
| 8830 const void* pixels = NULL; |
| 8831 if (pixels_shm_id != 0 || pixels_shm_offset != 0) { |
| 8832 pixels = GetSharedMemoryAs<const void*>( |
| 8833 pixels_shm_id, pixels_shm_offset, pixels_size); |
| 8834 if (!pixels) { |
| 8835 return error::kOutOfBounds; |
| 8836 } |
| 8837 } |
| 8838 |
| 8839 glTexImage3D(target, level, internal_format, width, height, depth, border, |
| 8840 format, type, pixels); |
| 8841 |
| 8842 // This may be a slow command. Exit command processing to allow for |
| 8843 // context preemption and GPU watchdog checks. |
| 8844 ExitCommandProcessingEarly(); |
| 8845 return error::kNoError; |
| 8846 } |
| 8847 |
8803 void GLES2DecoderImpl::DoCompressedTexSubImage2D( | 8848 void GLES2DecoderImpl::DoCompressedTexSubImage2D( |
8804 GLenum target, | 8849 GLenum target, |
8805 GLint level, | 8850 GLint level, |
8806 GLint xoffset, | 8851 GLint xoffset, |
8807 GLint yoffset, | 8852 GLint yoffset, |
8808 GLsizei width, | 8853 GLsizei width, |
8809 GLsizei height, | 8854 GLsizei height, |
8810 GLenum format, | 8855 GLenum format, |
8811 GLsizei image_size, | 8856 GLsizei image_size, |
8812 const void * data) { | 8857 const void * data) { |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8927 | 8972 |
8928 if ((channels_needed & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) { | 8973 if ((channels_needed & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) { |
8929 LOCAL_SET_GL_ERROR( | 8974 LOCAL_SET_GL_ERROR( |
8930 GL_INVALID_OPERATION, | 8975 GL_INVALID_OPERATION, |
8931 "glCopyTexImage2D", "can not be used with depth or stencil textures"); | 8976 "glCopyTexImage2D", "can not be used with depth or stencil textures"); |
8932 return; | 8977 return; |
8933 } | 8978 } |
8934 | 8979 |
8935 uint32 estimated_size = 0; | 8980 uint32 estimated_size = 0; |
8936 if (!GLES2Util::ComputeImageDataSizes( | 8981 if (!GLES2Util::ComputeImageDataSizes( |
8937 width, height, internal_format, GL_UNSIGNED_BYTE, state_.unpack_alignment, | 8982 width, height, 1, internal_format, GL_UNSIGNED_BYTE, |
8938 &estimated_size, NULL, NULL)) { | 8983 state_.unpack_alignment, &estimated_size, NULL, NULL)) { |
8939 LOCAL_SET_GL_ERROR( | 8984 LOCAL_SET_GL_ERROR( |
8940 GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too large"); | 8985 GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too large"); |
8941 return; | 8986 return; |
8942 } | 8987 } |
8943 | 8988 |
8944 if (!EnsureGPUMemoryAvailable(estimated_size)) { | 8989 if (!EnsureGPUMemoryAvailable(estimated_size)) { |
8945 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopyTexImage2D", "out of memory"); | 8990 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopyTexImage2D", "out of memory"); |
8946 return; | 8991 return; |
8947 } | 8992 } |
8948 | 8993 |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9101 return; | 9146 return; |
9102 } | 9147 } |
9103 | 9148 |
9104 if (copyX != x || | 9149 if (copyX != x || |
9105 copyY != y || | 9150 copyY != y || |
9106 copyWidth != width || | 9151 copyWidth != width || |
9107 copyHeight != height) { | 9152 copyHeight != height) { |
9108 // some part was clipped so clear the sub rect. | 9153 // some part was clipped so clear the sub rect. |
9109 uint32 pixels_size = 0; | 9154 uint32 pixels_size = 0; |
9110 if (!GLES2Util::ComputeImageDataSizes( | 9155 if (!GLES2Util::ComputeImageDataSizes( |
9111 width, height, format, type, state_.unpack_alignment, &pixels_size, | 9156 width, height, 1, format, type, state_.unpack_alignment, &pixels_size, |
9112 NULL, NULL)) { | 9157 NULL, NULL)) { |
9113 LOCAL_SET_GL_ERROR( | 9158 LOCAL_SET_GL_ERROR( |
9114 GL_INVALID_VALUE, "glCopyTexSubImage2D", "dimensions too large"); | 9159 GL_INVALID_VALUE, "glCopyTexSubImage2D", "dimensions too large"); |
9115 return; | 9160 return; |
9116 } | 9161 } |
9117 scoped_ptr<char[]> zero(new char[pixels_size]); | 9162 scoped_ptr<char[]> zero(new char[pixels_size]); |
9118 memset(zero.get(), 0, pixels_size); | 9163 memset(zero.get(), 0, pixels_size); |
9119 ScopedModifyPixels modify(texture_ref); | 9164 ScopedModifyPixels modify(texture_ref); |
9120 glTexSubImage2D( | 9165 glTexSubImage2D( |
9121 target, level, xoffset, yoffset, width, height, | 9166 target, level, xoffset, yoffset, width, height, |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9286 GLenum target = static_cast<GLenum>(c.target); | 9331 GLenum target = static_cast<GLenum>(c.target); |
9287 GLint level = static_cast<GLint>(c.level); | 9332 GLint level = static_cast<GLint>(c.level); |
9288 GLint xoffset = static_cast<GLint>(c.xoffset); | 9333 GLint xoffset = static_cast<GLint>(c.xoffset); |
9289 GLint yoffset = static_cast<GLint>(c.yoffset); | 9334 GLint yoffset = static_cast<GLint>(c.yoffset); |
9290 GLsizei width = static_cast<GLsizei>(c.width); | 9335 GLsizei width = static_cast<GLsizei>(c.width); |
9291 GLsizei height = static_cast<GLsizei>(c.height); | 9336 GLsizei height = static_cast<GLsizei>(c.height); |
9292 GLenum format = static_cast<GLenum>(c.format); | 9337 GLenum format = static_cast<GLenum>(c.format); |
9293 GLenum type = static_cast<GLenum>(c.type); | 9338 GLenum type = static_cast<GLenum>(c.type); |
9294 uint32 data_size; | 9339 uint32 data_size; |
9295 if (!GLES2Util::ComputeImageDataSizes( | 9340 if (!GLES2Util::ComputeImageDataSizes( |
9296 width, height, format, type, state_.unpack_alignment, &data_size, | 9341 width, height, 1, format, type, state_.unpack_alignment, &data_size, |
9297 NULL, NULL)) { | 9342 NULL, NULL)) { |
9298 return error::kOutOfBounds; | 9343 return error::kOutOfBounds; |
9299 } | 9344 } |
9300 const void* pixels = GetSharedMemoryAs<const void*>( | 9345 const void* pixels = GetSharedMemoryAs<const void*>( |
9301 c.pixels_shm_id, c.pixels_shm_offset, data_size); | 9346 c.pixels_shm_id, c.pixels_shm_offset, data_size); |
9302 return DoTexSubImage2D( | 9347 return DoTexSubImage2D( |
9303 target, level, xoffset, yoffset, width, height, format, type, pixels); | 9348 target, level, xoffset, yoffset, width, height, format, type, pixels); |
9304 } | 9349 } |
9305 | 9350 |
| 9351 // TODO(zmo): Remove the below stub once we add the real function binding. |
| 9352 // Currently it's missing due to a gmock limitation. |
| 9353 static void glTexSubImage3D( |
| 9354 GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, |
| 9355 GLsizei height, GLsizei width, GLsizei depth, GLenum format, GLenum type, |
| 9356 const void* pixels) { |
| 9357 NOTIMPLEMENTED(); |
| 9358 } |
| 9359 |
| 9360 error::Error GLES2DecoderImpl::HandleTexSubImage3D(uint32 immediate_data_size, |
| 9361 const void* cmd_data) { |
| 9362 // TODO(zmo): Unsafe ES3 API. |
| 9363 if (!unsafe_es3_apis_enabled()) |
| 9364 return error::kUnknownCommand; |
| 9365 |
| 9366 const gles2::cmds::TexSubImage3D& c = |
| 9367 *static_cast<const gles2::cmds::TexSubImage3D*>(cmd_data); |
| 9368 TRACE_EVENT2("gpu", "GLES2DecoderImpl::HandleTexSubImage3D", |
| 9369 "widthXheight", c.width * c.height, "depth", c.depth); |
| 9370 GLenum target = static_cast<GLenum>(c.target); |
| 9371 GLint level = static_cast<GLint>(c.level); |
| 9372 GLint xoffset = static_cast<GLint>(c.xoffset); |
| 9373 GLint yoffset = static_cast<GLint>(c.yoffset); |
| 9374 GLint zoffset = static_cast<GLint>(c.zoffset); |
| 9375 GLsizei width = static_cast<GLsizei>(c.width); |
| 9376 GLsizei height = static_cast<GLsizei>(c.height); |
| 9377 GLsizei depth = static_cast<GLsizei>(c.depth); |
| 9378 GLenum format = static_cast<GLenum>(c.format); |
| 9379 GLenum type = static_cast<GLenum>(c.type); |
| 9380 uint32 data_size; |
| 9381 if (!GLES2Util::ComputeImageDataSizes( |
| 9382 width, height, depth, format, type, state_.unpack_alignment, &data_size, |
| 9383 NULL, NULL)) { |
| 9384 return error::kOutOfBounds; |
| 9385 } |
| 9386 const void* pixels = GetSharedMemoryAs<const void*>( |
| 9387 c.pixels_shm_id, c.pixels_shm_offset, data_size); |
| 9388 glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, |
| 9389 depth, format, type, pixels); |
| 9390 return error::kNoError; |
| 9391 } |
| 9392 |
9306 error::Error GLES2DecoderImpl::HandleGetVertexAttribPointerv( | 9393 error::Error GLES2DecoderImpl::HandleGetVertexAttribPointerv( |
9307 uint32 immediate_data_size, | 9394 uint32 immediate_data_size, |
9308 const void* cmd_data) { | 9395 const void* cmd_data) { |
9309 const gles2::cmds::GetVertexAttribPointerv& c = | 9396 const gles2::cmds::GetVertexAttribPointerv& c = |
9310 *static_cast<const gles2::cmds::GetVertexAttribPointerv*>(cmd_data); | 9397 *static_cast<const gles2::cmds::GetVertexAttribPointerv*>(cmd_data); |
9311 GLuint index = static_cast<GLuint>(c.index); | 9398 GLuint index = static_cast<GLuint>(c.index); |
9312 GLenum pname = static_cast<GLenum>(c.pname); | 9399 GLenum pname = static_cast<GLenum>(c.pname); |
9313 typedef cmds::GetVertexAttribPointerv::Result Result; | 9400 typedef cmds::GetVertexAttribPointerv::Result Result; |
9314 Result* result = GetSharedMemoryAs<Result*>( | 9401 Result* result = GetSharedMemoryAs<Result*>( |
9315 c.pointer_shm_id, c.pointer_shm_offset, Result::ComputeSize(1)); | 9402 c.pointer_shm_id, c.pointer_shm_offset, Result::ComputeSize(1)); |
(...skipping 1379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10695 GLenum format = ExtractFormatFromStorageFormat(internal_format); | 10782 GLenum format = ExtractFormatFromStorageFormat(internal_format); |
10696 GLenum type = ExtractTypeFromStorageFormat(internal_format); | 10783 GLenum type = ExtractTypeFromStorageFormat(internal_format); |
10697 | 10784 |
10698 { | 10785 { |
10699 GLsizei level_width = width; | 10786 GLsizei level_width = width; |
10700 GLsizei level_height = height; | 10787 GLsizei level_height = height; |
10701 uint32 estimated_size = 0; | 10788 uint32 estimated_size = 0; |
10702 for (int ii = 0; ii < levels; ++ii) { | 10789 for (int ii = 0; ii < levels; ++ii) { |
10703 uint32 level_size = 0; | 10790 uint32 level_size = 0; |
10704 if (!GLES2Util::ComputeImageDataSizes( | 10791 if (!GLES2Util::ComputeImageDataSizes( |
10705 level_width, level_height, format, type, state_.unpack_alignment, | 10792 level_width, level_height, 1, format, type, state_.unpack_alignment, |
10706 &estimated_size, NULL, NULL) || | 10793 &estimated_size, NULL, NULL) || |
10707 !SafeAddUint32(estimated_size, level_size, &estimated_size)) { | 10794 !SafeAddUint32(estimated_size, level_size, &estimated_size)) { |
10708 LOCAL_SET_GL_ERROR( | 10795 LOCAL_SET_GL_ERROR( |
10709 GL_OUT_OF_MEMORY, "glTexStorage2DEXT", "dimensions too large"); | 10796 GL_OUT_OF_MEMORY, "glTexStorage2DEXT", "dimensions too large"); |
10710 return; | 10797 return; |
10711 } | 10798 } |
10712 level_width = std::max(1, level_width >> 1); | 10799 level_width = std::max(1, level_width >> 1); |
10713 level_height = std::max(1, level_height >> 1); | 10800 level_height = std::max(1, level_height >> 1); |
10714 } | 10801 } |
10715 if (!EnsureGPUMemoryAvailable(estimated_size)) { | 10802 if (!EnsureGPUMemoryAvailable(estimated_size)) { |
(...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11310 sync_data_shm_offset); | 11397 sync_data_shm_offset); |
11311 if (completion_closure.is_null()) | 11398 if (completion_closure.is_null()) |
11312 return error::kInvalidArguments; | 11399 return error::kInvalidArguments; |
11313 | 11400 |
11314 scoped_completion_callback.Reset(completion_closure); | 11401 scoped_completion_callback.Reset(completion_closure); |
11315 } | 11402 } |
11316 | 11403 |
11317 // TODO(epenner): Move this and copies of this memory validation | 11404 // TODO(epenner): Move this and copies of this memory validation |
11318 // into ValidateTexImage2D step. | 11405 // into ValidateTexImage2D step. |
11319 if (!GLES2Util::ComputeImageDataSizes( | 11406 if (!GLES2Util::ComputeImageDataSizes( |
11320 width, height, format, type, state_.unpack_alignment, &pixels_size, NULL, | 11407 width, height, 1, format, type, state_.unpack_alignment, &pixels_size, |
11321 NULL)) { | 11408 NULL, NULL)) { |
11322 return error::kOutOfBounds; | 11409 return error::kOutOfBounds; |
11323 } | 11410 } |
11324 const void* pixels = NULL; | 11411 const void* pixels = NULL; |
11325 if (pixels_shm_id != 0 || pixels_shm_offset != 0) { | 11412 if (pixels_shm_id != 0 || pixels_shm_offset != 0) { |
11326 pixels = GetSharedMemoryAs<const void*>( | 11413 pixels = GetSharedMemoryAs<const void*>( |
11327 pixels_shm_id, pixels_shm_offset, pixels_size); | 11414 pixels_shm_id, pixels_shm_offset, pixels_size); |
11328 if (!pixels) { | 11415 if (!pixels) { |
11329 return error::kOutOfBounds; | 11416 return error::kOutOfBounds; |
11330 } | 11417 } |
11331 } | 11418 } |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11415 if (completion_closure.is_null()) | 11502 if (completion_closure.is_null()) |
11416 return error::kInvalidArguments; | 11503 return error::kInvalidArguments; |
11417 | 11504 |
11418 scoped_completion_callback.Reset(completion_closure); | 11505 scoped_completion_callback.Reset(completion_closure); |
11419 } | 11506 } |
11420 | 11507 |
11421 // TODO(epenner): Move this and copies of this memory validation | 11508 // TODO(epenner): Move this and copies of this memory validation |
11422 // into ValidateTexSubImage2D step. | 11509 // into ValidateTexSubImage2D step. |
11423 uint32 data_size; | 11510 uint32 data_size; |
11424 if (!GLES2Util::ComputeImageDataSizes( | 11511 if (!GLES2Util::ComputeImageDataSizes( |
11425 width, height, format, type, state_.unpack_alignment, &data_size, | 11512 width, height, 1, format, type, state_.unpack_alignment, &data_size, |
11426 NULL, NULL)) { | 11513 NULL, NULL)) { |
11427 return error::kOutOfBounds; | 11514 return error::kOutOfBounds; |
11428 } | 11515 } |
11429 const void* pixels = GetSharedMemoryAs<const void*>( | 11516 const void* pixels = GetSharedMemoryAs<const void*>( |
11430 c.data_shm_id, c.data_shm_offset, data_size); | 11517 c.data_shm_id, c.data_shm_offset, data_size); |
11431 | 11518 |
11432 // All the normal glTexSubImage2D validation. | 11519 // All the normal glTexSubImage2D validation. |
11433 error::Error error = error::kNoError; | 11520 error::Error error = error::kNoError; |
11434 if (!ValidateTexSubImage2D(&error, "glAsyncTexSubImage2DCHROMIUM", | 11521 if (!ValidateTexSubImage2D(&error, "glAsyncTexSubImage2DCHROMIUM", |
11435 target, level, xoffset, yoffset, width, height, format, type, pixels)) { | 11522 target, level, xoffset, yoffset, width, height, format, type, pixels)) { |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11548 } | 11635 } |
11549 } | 11636 } |
11550 | 11637 |
11551 // Include the auto-generated part of this file. We split this because it means | 11638 // Include the auto-generated part of this file. We split this because it means |
11552 // we can easily edit the non-auto generated parts right here in this file | 11639 // we can easily edit the non-auto generated parts right here in this file |
11553 // instead of having to edit some template or the code generator. | 11640 // instead of having to edit some template or the code generator. |
11554 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 11641 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
11555 | 11642 |
11556 } // namespace gles2 | 11643 } // namespace gles2 |
11557 } // namespace gpu | 11644 } // namespace gpu |
OLD | NEW |