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 693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
704 } | 704 } |
705 | 705 |
706 // Creates a Texture for the given texture. | 706 // Creates a Texture for the given texture. |
707 Texture* CreateTexture( | 707 Texture* CreateTexture( |
708 GLuint client_id, GLuint service_id) { | 708 GLuint client_id, GLuint service_id) { |
709 return texture_manager()->CreateTexture(client_id, service_id); | 709 return texture_manager()->CreateTexture(client_id, service_id); |
710 } | 710 } |
711 | 711 |
712 // Gets the texture info for the given texture. Returns NULL if none exists. | 712 // Gets the texture info for the given texture. Returns NULL if none exists. |
713 Texture* GetTexture(GLuint client_id) const { | 713 Texture* GetTexture(GLuint client_id) const { |
714 Texture* info = | 714 return texture_manager()->GetTexture(client_id); |
715 texture_manager()->GetTexture(client_id); | |
716 return info; | |
717 } | 715 } |
718 | 716 |
719 // Deletes the texture info for the given texture. | 717 // Deletes the texture info for the given texture. |
720 void RemoveTexture(GLuint client_id) { | 718 void RemoveTexture(GLuint client_id) { |
721 texture_manager()->RemoveTexture(client_id); | 719 texture_manager()->RemoveTexture(client_id); |
722 } | 720 } |
723 | 721 |
724 // Get the size (in pixels) of the currently bound frame buffer (either FBO | 722 // Get the size (in pixels) of the currently bound frame buffer (either FBO |
725 // or regular back buffer). | 723 // or regular back buffer). |
726 gfx::Size GetBoundReadFrameBufferSize(); | 724 gfx::Size GetBoundReadFrameBufferSize(); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
824 GLint yoffset, | 822 GLint yoffset, |
825 GLsizei width, | 823 GLsizei width, |
826 GLsizei height, | 824 GLsizei height, |
827 GLenum format, | 825 GLenum format, |
828 GLenum type, | 826 GLenum type, |
829 const void * data); | 827 const void * data); |
830 | 828 |
831 // Extra validation for async tex(Sub)Image2D. | 829 // Extra validation for async tex(Sub)Image2D. |
832 bool ValidateAsyncTransfer( | 830 bool ValidateAsyncTransfer( |
833 const char* function_name, | 831 const char* function_name, |
834 Texture* info, | 832 Texture* texture, |
835 GLenum target, | 833 GLenum target, |
836 GLint level, | 834 GLint level, |
837 const void * data); | 835 const void * data); |
838 | 836 |
839 // Wrapper for TexImageIOSurface2DCHROMIUM. | 837 // Wrapper for TexImageIOSurface2DCHROMIUM. |
840 void DoTexImageIOSurface2DCHROMIUM( | 838 void DoTexImageIOSurface2DCHROMIUM( |
841 GLenum target, | 839 GLenum target, |
842 GLsizei width, | 840 GLsizei width, |
843 GLsizei height, | 841 GLsizei height, |
844 GLuint io_surface_id, | 842 GLuint io_surface_id, |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1045 | 1043 |
1046 // Helper for glShaderSource. | 1044 // Helper for glShaderSource. |
1047 error::Error ShaderSourceHelper( | 1045 error::Error ShaderSourceHelper( |
1048 GLuint client_id, const char* data, uint32 data_size); | 1046 GLuint client_id, const char* data, uint32 data_size); |
1049 | 1047 |
1050 // Clear any textures used by the current program. | 1048 // Clear any textures used by the current program. |
1051 bool ClearUnclearedTextures(); | 1049 bool ClearUnclearedTextures(); |
1052 | 1050 |
1053 // Clear any uncleared level in texture. | 1051 // Clear any uncleared level in texture. |
1054 // Returns false if there was a generated GL error. | 1052 // Returns false if there was a generated GL error. |
1055 bool ClearTexture(Texture* info); | 1053 bool ClearTexture(Texture* texture); |
1056 | 1054 |
1057 // Clears any uncleared attachments attached to the given frame buffer. | 1055 // Clears any uncleared attachments attached to the given frame buffer. |
1058 // Returns false if there was a generated GL error. | 1056 // Returns false if there was a generated GL error. |
1059 void ClearUnclearedAttachments( | 1057 void ClearUnclearedAttachments( |
1060 GLenum target, Framebuffer* info); | 1058 GLenum target, Framebuffer* info); |
1061 | 1059 |
1062 // overridden from GLES2Decoder | 1060 // overridden from GLES2Decoder |
1063 virtual bool ClearLevel(unsigned service_id, | 1061 virtual bool ClearLevel(unsigned service_id, |
1064 unsigned bind_target, | 1062 unsigned bind_target, |
1065 unsigned target, | 1063 unsigned target, |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1402 if (target == GL_ARRAY_BUFFER) { | 1400 if (target == GL_ARRAY_BUFFER) { |
1403 return state_.bound_array_buffer; | 1401 return state_.bound_array_buffer; |
1404 } else { | 1402 } else { |
1405 return state_.vertex_attrib_manager->element_array_buffer(); | 1403 return state_.vertex_attrib_manager->element_array_buffer(); |
1406 } | 1404 } |
1407 } | 1405 } |
1408 | 1406 |
1409 // Gets the texture id for a given target. | 1407 // Gets the texture id for a given target. |
1410 Texture* GetTextureInfoForTarget(GLenum target) { | 1408 Texture* GetTextureInfoForTarget(GLenum target) { |
1411 TextureUnit& unit = state_.texture_units[state_.active_texture_unit]; | 1409 TextureUnit& unit = state_.texture_units[state_.active_texture_unit]; |
1412 Texture* info = NULL; | 1410 Texture* texture = NULL; |
1413 switch (target) { | 1411 switch (target) { |
1414 case GL_TEXTURE_2D: | 1412 case GL_TEXTURE_2D: |
1415 info = unit.bound_texture_2d; | 1413 texture = unit.bound_texture_2d; |
1416 break; | 1414 break; |
1417 case GL_TEXTURE_CUBE_MAP: | 1415 case GL_TEXTURE_CUBE_MAP: |
1418 case GL_TEXTURE_CUBE_MAP_POSITIVE_X: | 1416 case GL_TEXTURE_CUBE_MAP_POSITIVE_X: |
1419 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: | 1417 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: |
1420 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: | 1418 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: |
1421 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: | 1419 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: |
1422 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: | 1420 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: |
1423 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: | 1421 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: |
1424 info = unit.bound_texture_cube_map; | 1422 texture = unit.bound_texture_cube_map; |
1425 break; | 1423 break; |
1426 case GL_TEXTURE_EXTERNAL_OES: | 1424 case GL_TEXTURE_EXTERNAL_OES: |
1427 info = unit.bound_texture_external_oes; | 1425 texture = unit.bound_texture_external_oes; |
1428 break; | 1426 break; |
1429 case GL_TEXTURE_RECTANGLE_ARB: | 1427 case GL_TEXTURE_RECTANGLE_ARB: |
1430 info = unit.bound_texture_rectangle_arb; | 1428 texture = unit.bound_texture_rectangle_arb; |
1431 break; | 1429 break; |
1432 default: | 1430 default: |
1433 NOTREACHED(); | 1431 NOTREACHED(); |
1434 return NULL; | 1432 return NULL; |
1435 } | 1433 } |
1436 return info; | 1434 return texture; |
1437 } | 1435 } |
1438 | 1436 |
1439 Texture* GetTextureInfoForTargetUnlessDefault( | 1437 Texture* GetTextureInfoForTargetUnlessDefault( |
1440 GLenum target) { | 1438 GLenum target) { |
1441 Texture* info = GetTextureInfoForTarget(target); | 1439 Texture* texture = GetTextureInfoForTarget(target); |
1442 if (!info) | 1440 if (!texture) |
1443 return NULL; | 1441 return NULL; |
1444 if (info == texture_manager()->GetDefaultTextureInfo(target)) | 1442 if (texture == texture_manager()->GetDefaultTextureInfo(target)) |
1445 return NULL; | 1443 return NULL; |
1446 return info; | 1444 return texture; |
1447 } | 1445 } |
1448 | 1446 |
1449 GLenum GetBindTargetForSamplerType(GLenum type) { | 1447 GLenum GetBindTargetForSamplerType(GLenum type) { |
1450 DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || | 1448 DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || |
1451 type == GL_SAMPLER_EXTERNAL_OES || type == GL_SAMPLER_2D_RECT_ARB); | 1449 type == GL_SAMPLER_EXTERNAL_OES || type == GL_SAMPLER_2D_RECT_ARB); |
1452 switch (type) { | 1450 switch (type) { |
1453 case GL_SAMPLER_2D: | 1451 case GL_SAMPLER_2D: |
1454 return GL_TEXTURE_2D; | 1452 return GL_TEXTURE_2D; |
1455 case GL_SAMPLER_CUBE: | 1453 case GL_SAMPLER_CUBE: |
1456 return GL_TEXTURE_CUBE_MAP; | 1454 return GL_TEXTURE_CUBE_MAP; |
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2256 glGenBuffersARB(1, &attrib_0_buffer_id_); | 2254 glGenBuffersARB(1, &attrib_0_buffer_id_); |
2257 glBindBuffer(GL_ARRAY_BUFFER, attrib_0_buffer_id_); | 2255 glBindBuffer(GL_ARRAY_BUFFER, attrib_0_buffer_id_); |
2258 glVertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 0, NULL); | 2256 glVertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 0, NULL); |
2259 glBindBuffer(GL_ARRAY_BUFFER, 0); | 2257 glBindBuffer(GL_ARRAY_BUFFER, 0); |
2260 glGenBuffersARB(1, &fixed_attrib_buffer_id_); | 2258 glGenBuffersARB(1, &fixed_attrib_buffer_id_); |
2261 | 2259 |
2262 state_.texture_units.resize(group_->max_texture_units()); | 2260 state_.texture_units.resize(group_->max_texture_units()); |
2263 for (uint32 tt = 0; tt < state_.texture_units.size(); ++tt) { | 2261 for (uint32 tt = 0; tt < state_.texture_units.size(); ++tt) { |
2264 glActiveTexture(GL_TEXTURE0 + tt); | 2262 glActiveTexture(GL_TEXTURE0 + tt); |
2265 // We want the last bind to be 2D. | 2263 // We want the last bind to be 2D. |
2266 Texture* info; | 2264 Texture* texture; |
2267 if (features().oes_egl_image_external) { | 2265 if (features().oes_egl_image_external) { |
2268 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_EXTERNAL_OES); | 2266 texture = texture_manager()->GetDefaultTextureInfo( |
2269 state_.texture_units[tt].bound_texture_external_oes = info; | 2267 GL_TEXTURE_EXTERNAL_OES); |
2270 glBindTexture(GL_TEXTURE_EXTERNAL_OES, info->service_id()); | 2268 state_.texture_units[tt].bound_texture_external_oes = texture; |
| 2269 glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture->service_id()); |
2271 } | 2270 } |
2272 if (features().arb_texture_rectangle) { | 2271 if (features().arb_texture_rectangle) { |
2273 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_RECTANGLE_ARB); | 2272 texture = texture_manager()->GetDefaultTextureInfo( |
2274 state_.texture_units[tt].bound_texture_rectangle_arb = info; | 2273 GL_TEXTURE_RECTANGLE_ARB); |
2275 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, info->service_id()); | 2274 state_.texture_units[tt].bound_texture_rectangle_arb = texture; |
| 2275 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture->service_id()); |
2276 } | 2276 } |
2277 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP); | 2277 texture = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP); |
2278 state_.texture_units[tt].bound_texture_cube_map = info; | 2278 state_.texture_units[tt].bound_texture_cube_map = texture; |
2279 glBindTexture(GL_TEXTURE_CUBE_MAP, info->service_id()); | 2279 glBindTexture(GL_TEXTURE_CUBE_MAP, texture->service_id()); |
2280 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_2D); | 2280 texture = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_2D); |
2281 state_.texture_units[tt].bound_texture_2d = info; | 2281 state_.texture_units[tt].bound_texture_2d = texture; |
2282 glBindTexture(GL_TEXTURE_2D, info->service_id()); | 2282 glBindTexture(GL_TEXTURE_2D, texture->service_id()); |
2283 } | 2283 } |
2284 glActiveTexture(GL_TEXTURE0); | 2284 glActiveTexture(GL_TEXTURE0); |
2285 CHECK_GL_ERROR(); | 2285 CHECK_GL_ERROR(); |
2286 | 2286 |
2287 ContextCreationAttribParser attrib_parser; | 2287 ContextCreationAttribParser attrib_parser; |
2288 if (!attrib_parser.Parse(attribs)) | 2288 if (!attrib_parser.Parse(attribs)) |
2289 return false; | 2289 return false; |
2290 | 2290 |
2291 // These are NOT if the back buffer has these proprorties. They are | 2291 // These are NOT if the back buffer has these proprorties. They are |
2292 // if we want the command buffer to enforce them regardless of what | 2292 // if we want the command buffer to enforce them regardless of what |
(...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2983 0, // level | 2983 0, // level |
2984 GL_RGBA, | 2984 GL_RGBA, |
2985 offscreen_size_.width(), | 2985 offscreen_size_.width(), |
2986 offscreen_size_.height(), | 2986 offscreen_size_.height(), |
2987 1, // depth | 2987 1, // depth |
2988 0, // border | 2988 0, // border |
2989 GL_RGBA, | 2989 GL_RGBA, |
2990 GL_UNSIGNED_BYTE, | 2990 GL_UNSIGNED_BYTE, |
2991 true); | 2991 true); |
2992 parent_texture_manager->SetParameter( | 2992 parent_texture_manager->SetParameter( |
| 2993 "UpdateParentTextureInfo", |
| 2994 this, |
2993 offscreen_saved_color_texture_info_, | 2995 offscreen_saved_color_texture_info_, |
2994 GL_TEXTURE_MAG_FILTER, | 2996 GL_TEXTURE_MAG_FILTER, |
2995 GL_NEAREST); | 2997 GL_NEAREST); |
2996 parent_texture_manager->SetParameter( | 2998 parent_texture_manager->SetParameter( |
| 2999 "UpdateParentTextureInfo", |
| 3000 this, |
2997 offscreen_saved_color_texture_info_, | 3001 offscreen_saved_color_texture_info_, |
2998 GL_TEXTURE_MIN_FILTER, | 3002 GL_TEXTURE_MIN_FILTER, |
2999 GL_NEAREST); | 3003 GL_NEAREST); |
3000 parent_texture_manager->SetParameter( | 3004 parent_texture_manager->SetParameter( |
| 3005 "UpdateParentTextureInfo", |
| 3006 this, |
3001 offscreen_saved_color_texture_info_, | 3007 offscreen_saved_color_texture_info_, |
3002 GL_TEXTURE_WRAP_S, | 3008 GL_TEXTURE_WRAP_S, |
3003 GL_CLAMP_TO_EDGE); | 3009 GL_CLAMP_TO_EDGE); |
3004 parent_texture_manager->SetParameter( | 3010 parent_texture_manager->SetParameter( |
| 3011 "UpdateParentTextureInfo", |
| 3012 this, |
3005 offscreen_saved_color_texture_info_, | 3013 offscreen_saved_color_texture_info_, |
3006 GL_TEXTURE_WRAP_T, | 3014 GL_TEXTURE_WRAP_T, |
3007 GL_CLAMP_TO_EDGE); | 3015 GL_CLAMP_TO_EDGE); |
3008 } else { | 3016 } else { |
3009 offscreen_saved_color_texture_info_ = NULL; | 3017 offscreen_saved_color_texture_info_ = NULL; |
3010 } | 3018 } |
3011 } | 3019 } |
3012 | 3020 |
3013 void GLES2DecoderImpl::SetResizeCallback( | 3021 void GLES2DecoderImpl::SetResizeCallback( |
3014 const base::Callback<void(gfx::Size)>& callback) { | 3022 const base::Callback<void(gfx::Size)>& callback) { |
(...skipping 18 matching lines...) Expand all Loading... |
3033 return async_pixel_transfer_delegate_.get(); | 3041 return async_pixel_transfer_delegate_.get(); |
3034 } | 3042 } |
3035 | 3043 |
3036 void GLES2DecoderImpl::SetAsyncPixelTransferDelegate( | 3044 void GLES2DecoderImpl::SetAsyncPixelTransferDelegate( |
3037 gfx::AsyncPixelTransferDelegate* delegate) { | 3045 gfx::AsyncPixelTransferDelegate* delegate) { |
3038 async_pixel_transfer_delegate_ = make_scoped_ptr(delegate); | 3046 async_pixel_transfer_delegate_ = make_scoped_ptr(delegate); |
3039 } | 3047 } |
3040 | 3048 |
3041 bool GLES2DecoderImpl::GetServiceTextureId(uint32 client_texture_id, | 3049 bool GLES2DecoderImpl::GetServiceTextureId(uint32 client_texture_id, |
3042 uint32* service_texture_id) { | 3050 uint32* service_texture_id) { |
3043 Texture* texture = | 3051 Texture* texture = texture_manager()->GetTexture(client_texture_id); |
3044 texture_manager()->GetTexture(client_texture_id); | |
3045 if (texture) { | 3052 if (texture) { |
3046 *service_texture_id = texture->service_id(); | 3053 *service_texture_id = texture->service_id(); |
3047 return true; | 3054 return true; |
3048 } | 3055 } |
3049 return false; | 3056 return false; |
3050 } | 3057 } |
3051 | 3058 |
3052 uint32 GLES2DecoderImpl::GetTextureUploadCount() { | 3059 uint32 GLES2DecoderImpl::GetTextureUploadCount() { |
3053 return texture_upload_count_ + | 3060 return texture_upload_count_ + |
3054 async_pixel_transfer_delegate_->GetTextureUploadCount(); | 3061 async_pixel_transfer_delegate_->GetTextureUploadCount(); |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3234 // Replace texture info when ID is already in use by parent. | 3241 // Replace texture info when ID is already in use by parent. |
3235 if (new_parent_impl->texture_manager()->GetTexture( | 3242 if (new_parent_impl->texture_manager()->GetTexture( |
3236 new_parent_texture_id)) | 3243 new_parent_texture_id)) |
3237 new_parent_impl->texture_manager()->RemoveTexture( | 3244 new_parent_impl->texture_manager()->RemoveTexture( |
3238 new_parent_texture_id); | 3245 new_parent_texture_id); |
3239 | 3246 |
3240 offscreen_saved_color_texture_info_ = | 3247 offscreen_saved_color_texture_info_ = |
3241 new_parent_impl->CreateTexture(new_parent_texture_id, service_id); | 3248 new_parent_impl->CreateTexture(new_parent_texture_id, service_id); |
3242 offscreen_saved_color_texture_info_->SetNotOwned(); | 3249 offscreen_saved_color_texture_info_->SetNotOwned(); |
3243 new_parent_impl->texture_manager()-> | 3250 new_parent_impl->texture_manager()-> |
3244 SetInfoTarget(offscreen_saved_color_texture_info_, GL_TEXTURE_2D); | 3251 SetTarget(offscreen_saved_color_texture_info_, GL_TEXTURE_2D); |
3245 | 3252 |
3246 parent_ = base::AsWeakPtr<GLES2DecoderImpl>(new_parent_impl); | 3253 parent_ = base::AsWeakPtr<GLES2DecoderImpl>(new_parent_impl); |
3247 | 3254 |
3248 UpdateParentTextureInfo(); | 3255 UpdateParentTextureInfo(); |
3249 } else { | 3256 } else { |
3250 parent_.reset(); | 3257 parent_.reset(); |
3251 offscreen_saved_color_texture_info_ = NULL; | 3258 offscreen_saved_color_texture_info_ = NULL; |
3252 } | 3259 } |
3253 | 3260 |
3254 return true; | 3261 return true; |
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3768 service_id = info->service_id(); | 3775 service_id = info->service_id(); |
3769 } | 3776 } |
3770 info->MarkAsValid(); | 3777 info->MarkAsValid(); |
3771 } | 3778 } |
3772 LogClientServiceForInfo(info, client_id, "glBindRenerbuffer"); | 3779 LogClientServiceForInfo(info, client_id, "glBindRenerbuffer"); |
3773 state_.bound_renderbuffer = info; | 3780 state_.bound_renderbuffer = info; |
3774 glBindRenderbufferEXT(target, service_id); | 3781 glBindRenderbufferEXT(target, service_id); |
3775 } | 3782 } |
3776 | 3783 |
3777 void GLES2DecoderImpl::DoBindTexture(GLenum target, GLuint client_id) { | 3784 void GLES2DecoderImpl::DoBindTexture(GLenum target, GLuint client_id) { |
3778 Texture* info = NULL; | 3785 Texture* texture = NULL; |
3779 GLuint service_id = 0; | 3786 GLuint service_id = 0; |
3780 if (client_id != 0) { | 3787 if (client_id != 0) { |
3781 info = GetTexture(client_id); | 3788 texture = GetTexture(client_id); |
3782 if (!info) { | 3789 if (!texture) { |
3783 if (!group_->bind_generates_resource()) { | 3790 if (!group_->bind_generates_resource()) { |
3784 LOG(ERROR) << "glBindTexture: id not generated by glGenTextures"; | 3791 LOG(ERROR) << "glBindTexture: id not generated by glGenTextures"; |
3785 current_decoder_error_ = error::kGenericError; | 3792 current_decoder_error_ = error::kGenericError; |
3786 return; | 3793 return; |
3787 } | 3794 } |
3788 | 3795 |
3789 // It's a new id so make a texture info for it. | 3796 // It's a new id so make a texture texture for it. |
3790 glGenTextures(1, &service_id); | 3797 glGenTextures(1, &service_id); |
3791 DCHECK_NE(0u, service_id); | 3798 DCHECK_NE(0u, service_id); |
3792 CreateTexture(client_id, service_id); | 3799 CreateTexture(client_id, service_id); |
3793 info = GetTexture(client_id); | 3800 texture = GetTexture(client_id); |
3794 IdAllocatorInterface* id_allocator = | 3801 IdAllocatorInterface* id_allocator = |
3795 group_->GetIdAllocator(id_namespaces::kTextures); | 3802 group_->GetIdAllocator(id_namespaces::kTextures); |
3796 id_allocator->MarkAsUsed(client_id); | 3803 id_allocator->MarkAsUsed(client_id); |
3797 } | 3804 } |
3798 } else { | 3805 } else { |
3799 info = texture_manager()->GetDefaultTextureInfo(target); | 3806 texture = texture_manager()->GetDefaultTextureInfo(target); |
3800 } | 3807 } |
3801 | 3808 |
3802 // Check the texture exists | 3809 // Check the texture exists |
3803 // Check that we are not trying to bind it to a different target. | 3810 // Check that we are not trying to bind it to a different target. |
3804 if (info->target() != 0 && info->target() != target) { | 3811 if (texture->target() != 0 && texture->target() != target) { |
3805 SetGLError(GL_INVALID_OPERATION, | 3812 SetGLError(GL_INVALID_OPERATION, |
3806 "glBindTexture", "texture bound to more than 1 target."); | 3813 "glBindTexture", "texture bound to more than 1 target."); |
3807 return; | 3814 return; |
3808 } | 3815 } |
3809 if (info->IsStreamTexture() && target != GL_TEXTURE_EXTERNAL_OES) { | 3816 if (texture->IsStreamTexture() && target != GL_TEXTURE_EXTERNAL_OES) { |
3810 SetGLError(GL_INVALID_OPERATION, | 3817 SetGLError(GL_INVALID_OPERATION, |
3811 "glBindTexture", "illegal target for stream texture."); | 3818 "glBindTexture", "illegal target for stream texture."); |
3812 return; | 3819 return; |
3813 } | 3820 } |
3814 LogClientServiceForInfo(info, client_id, "glBindTexture"); | 3821 LogClientServiceForInfo(texture, client_id, "glBindTexture"); |
3815 if (info->target() == 0) { | 3822 if (texture->target() == 0) { |
3816 texture_manager()->SetInfoTarget(info, target); | 3823 texture_manager()->SetTarget(texture, target); |
3817 } | 3824 } |
3818 glBindTexture(target, info->service_id()); | 3825 glBindTexture(target, texture->service_id()); |
3819 | 3826 |
3820 TextureUnit& unit = state_.texture_units[state_.active_texture_unit]; | 3827 TextureUnit& unit = state_.texture_units[state_.active_texture_unit]; |
3821 unit.bind_target = target; | 3828 unit.bind_target = target; |
3822 switch (target) { | 3829 switch (target) { |
3823 case GL_TEXTURE_2D: | 3830 case GL_TEXTURE_2D: |
3824 unit.bound_texture_2d = info; | 3831 unit.bound_texture_2d = texture; |
3825 break; | 3832 break; |
3826 case GL_TEXTURE_CUBE_MAP: | 3833 case GL_TEXTURE_CUBE_MAP: |
3827 unit.bound_texture_cube_map = info; | 3834 unit.bound_texture_cube_map = texture; |
3828 break; | 3835 break; |
3829 case GL_TEXTURE_EXTERNAL_OES: | 3836 case GL_TEXTURE_EXTERNAL_OES: |
3830 unit.bound_texture_external_oes = info; | 3837 unit.bound_texture_external_oes = texture; |
3831 if (info->IsStreamTexture()) { | 3838 if (texture->IsStreamTexture()) { |
3832 DCHECK(stream_texture_manager_); | 3839 DCHECK(stream_texture_manager_); |
3833 StreamTexture* stream_tex = | 3840 StreamTexture* stream_tex = |
3834 stream_texture_manager_->LookupStreamTexture(info->service_id()); | 3841 stream_texture_manager_->LookupStreamTexture(texture->service_id()); |
3835 if (stream_tex) | 3842 if (stream_tex) |
3836 stream_tex->Update(); | 3843 stream_tex->Update(); |
3837 } | 3844 } |
3838 break; | 3845 break; |
3839 case GL_TEXTURE_RECTANGLE_ARB: | 3846 case GL_TEXTURE_RECTANGLE_ARB: |
3840 unit.bound_texture_rectangle_arb = info; | 3847 unit.bound_texture_rectangle_arb = texture; |
3841 break; | 3848 break; |
3842 default: | 3849 default: |
3843 NOTREACHED(); // Validation should prevent us getting here. | 3850 NOTREACHED(); // Validation should prevent us getting here. |
3844 break; | 3851 break; |
3845 } | 3852 } |
3846 } | 3853 } |
3847 | 3854 |
3848 void GLES2DecoderImpl::DoDisableVertexAttribArray(GLuint index) { | 3855 void GLES2DecoderImpl::DoDisableVertexAttribArray(GLuint index) { |
3849 if (state_.vertex_attrib_manager->Enable(index, false)) { | 3856 if (state_.vertex_attrib_manager->Enable(index, false)) { |
3850 if (index != 0 || | 3857 if (index != 0 || |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3907 void GLES2DecoderImpl::DoEnableVertexAttribArray(GLuint index) { | 3914 void GLES2DecoderImpl::DoEnableVertexAttribArray(GLuint index) { |
3908 if (state_.vertex_attrib_manager->Enable(index, true)) { | 3915 if (state_.vertex_attrib_manager->Enable(index, true)) { |
3909 glEnableVertexAttribArray(index); | 3916 glEnableVertexAttribArray(index); |
3910 } else { | 3917 } else { |
3911 SetGLError(GL_INVALID_VALUE, | 3918 SetGLError(GL_INVALID_VALUE, |
3912 "glEnableVertexAttribArray", "index out of range"); | 3919 "glEnableVertexAttribArray", "index out of range"); |
3913 } | 3920 } |
3914 } | 3921 } |
3915 | 3922 |
3916 void GLES2DecoderImpl::DoGenerateMipmap(GLenum target) { | 3923 void GLES2DecoderImpl::DoGenerateMipmap(GLenum target) { |
3917 Texture* info = GetTextureInfoForTarget(target); | 3924 Texture* texture = GetTextureInfoForTarget(target); |
3918 if (!info || | 3925 if (!texture || |
3919 !texture_manager()->CanGenerateMipmaps(info)) { | 3926 !texture_manager()->CanGenerateMipmaps(texture)) { |
3920 SetGLError(GL_INVALID_OPERATION, | 3927 SetGLError(GL_INVALID_OPERATION, |
3921 "glGenerateMipmaps", "Can not generate mips"); | 3928 "glGenerateMipmaps", "Can not generate mips"); |
3922 return; | 3929 return; |
3923 } | 3930 } |
3924 | 3931 |
3925 if (target == GL_TEXTURE_CUBE_MAP) { | 3932 if (target == GL_TEXTURE_CUBE_MAP) { |
3926 for (int i = 0; i < 6; ++i) { | 3933 for (int i = 0; i < 6; ++i) { |
3927 GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X + i; | 3934 GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X + i; |
3928 if (!texture_manager()->ClearTextureLevel(this, info, face, 0)) { | 3935 if (!texture_manager()->ClearTextureLevel(this, texture, face, 0)) { |
3929 SetGLError(GL_OUT_OF_MEMORY, "glGenerateMipmaps", "dimensions too big"); | 3936 SetGLError(GL_OUT_OF_MEMORY, "glGenerateMipmaps", "dimensions too big"); |
3930 return; | 3937 return; |
3931 } | 3938 } |
3932 } | 3939 } |
3933 } else { | 3940 } else { |
3934 if (!texture_manager()->ClearTextureLevel(this, info, target, 0)) { | 3941 if (!texture_manager()->ClearTextureLevel(this, texture, target, 0)) { |
3935 SetGLError(GL_OUT_OF_MEMORY, "glGenerateMipmaps", "dimensions too big"); | 3942 SetGLError(GL_OUT_OF_MEMORY, "glGenerateMipmaps", "dimensions too big"); |
3936 return; | 3943 return; |
3937 } | 3944 } |
3938 } | 3945 } |
3939 | 3946 |
3940 CopyRealGLErrorsToWrapper(); | 3947 CopyRealGLErrorsToWrapper(); |
3941 // Workaround for Mac driver bug. In the large scheme of things setting | 3948 // Workaround for Mac driver bug. In the large scheme of things setting |
3942 // glTexParamter twice for glGenerateMipmap is probably not a lage performance | 3949 // glTexParamter twice for glGenerateMipmap is probably not a lage performance |
3943 // hit so there's probably no need to make this conditional. The bug appears | 3950 // hit so there's probably no need to make this conditional. The bug appears |
3944 // to be that if the filtering mode is set to something that doesn't require | 3951 // to be that if the filtering mode is set to something that doesn't require |
3945 // mipmaps for rendering, or is never set to something other than the default, | 3952 // mipmaps for rendering, or is never set to something other than the default, |
3946 // then glGenerateMipmap misbehaves. | 3953 // then glGenerateMipmap misbehaves. |
3947 if (workarounds().set_texture_filter_before_generating_mipmap) { | 3954 if (workarounds().set_texture_filter_before_generating_mipmap) { |
3948 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); | 3955 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); |
3949 } | 3956 } |
3950 glGenerateMipmapEXT(target); | 3957 glGenerateMipmapEXT(target); |
3951 if (workarounds().set_texture_filter_before_generating_mipmap) { | 3958 if (workarounds().set_texture_filter_before_generating_mipmap) { |
3952 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, info->min_filter()); | 3959 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, texture->min_filter()); |
3953 } | 3960 } |
3954 GLenum error = PeekGLError(); | 3961 GLenum error = PeekGLError(); |
3955 if (error == GL_NO_ERROR) { | 3962 if (error == GL_NO_ERROR) { |
3956 texture_manager()->MarkMipmapsGenerated(info); | 3963 texture_manager()->MarkMipmapsGenerated(texture); |
3957 } | 3964 } |
3958 } | 3965 } |
3959 | 3966 |
3960 bool GLES2DecoderImpl::GetHelper( | 3967 bool GLES2DecoderImpl::GetHelper( |
3961 GLenum pname, GLint* params, GLsizei* num_written) { | 3968 GLenum pname, GLint* params, GLsizei* num_written) { |
3962 DCHECK(num_written); | 3969 DCHECK(num_written); |
3963 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { | 3970 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { |
3964 switch (pname) { | 3971 switch (pname) { |
3965 case GL_IMPLEMENTATION_COLOR_READ_FORMAT: | 3972 case GL_IMPLEMENTATION_COLOR_READ_FORMAT: |
3966 *num_written = 1; | 3973 *num_written = 1; |
(...skipping 827 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4794 GLenum target, GLenum attachment, GLenum textarget, | 4801 GLenum target, GLenum attachment, GLenum textarget, |
4795 GLuint client_texture_id, GLint level) { | 4802 GLuint client_texture_id, GLint level) { |
4796 Framebuffer* framebuffer_info = | 4803 Framebuffer* framebuffer_info = |
4797 GetFramebufferInfoForTarget(target); | 4804 GetFramebufferInfoForTarget(target); |
4798 if (!framebuffer_info) { | 4805 if (!framebuffer_info) { |
4799 SetGLError(GL_INVALID_OPERATION, | 4806 SetGLError(GL_INVALID_OPERATION, |
4800 "glFramebufferTexture2D", "no framebuffer bound."); | 4807 "glFramebufferTexture2D", "no framebuffer bound."); |
4801 return; | 4808 return; |
4802 } | 4809 } |
4803 GLuint service_id = 0; | 4810 GLuint service_id = 0; |
4804 Texture* info = NULL; | 4811 Texture* texture = NULL; |
4805 if (client_texture_id) { | 4812 if (client_texture_id) { |
4806 info = GetTexture(client_texture_id); | 4813 texture = GetTexture(client_texture_id); |
4807 if (!info) { | 4814 if (!texture) { |
4808 SetGLError(GL_INVALID_OPERATION, | 4815 SetGLError(GL_INVALID_OPERATION, |
4809 "glFramebufferTexture2D", "unknown texture"); | 4816 "glFramebufferTexture2D", "unknown texture"); |
4810 return; | 4817 return; |
4811 } | 4818 } |
4812 service_id = info->service_id(); | 4819 service_id = texture->service_id(); |
4813 } | 4820 } |
4814 | 4821 |
4815 if (!texture_manager()->ValidForTarget(textarget, level, 0, 0, 1)) { | 4822 if (!texture_manager()->ValidForTarget(textarget, level, 0, 0, 1)) { |
4816 SetGLError(GL_INVALID_VALUE, | 4823 SetGLError(GL_INVALID_VALUE, |
4817 "glFramebufferTexture2D", "level out of range"); | 4824 "glFramebufferTexture2D", "level out of range"); |
4818 return; | 4825 return; |
4819 } | 4826 } |
4820 | 4827 |
4821 CopyRealGLErrorsToWrapper(); | 4828 CopyRealGLErrorsToWrapper(); |
4822 glFramebufferTexture2DEXT(target, attachment, textarget, service_id, level); | 4829 glFramebufferTexture2DEXT(target, attachment, textarget, service_id, level); |
4823 GLenum error = PeekGLError(); | 4830 GLenum error = PeekGLError(); |
4824 if (error == GL_NO_ERROR) { | 4831 if (error == GL_NO_ERROR) { |
4825 framebuffer_info->AttachTexture(attachment, info, textarget, level); | 4832 framebuffer_info->AttachTexture(attachment, texture, textarget, level); |
4826 } | 4833 } |
4827 if (framebuffer_info == state_.bound_draw_framebuffer) { | 4834 if (framebuffer_info == state_.bound_draw_framebuffer) { |
4828 clear_state_dirty_ = true; | 4835 clear_state_dirty_ = true; |
4829 } | 4836 } |
4830 } | 4837 } |
4831 | 4838 |
4832 void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv( | 4839 void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv( |
4833 GLenum target, GLenum attachment, GLenum pname, GLint* params) { | 4840 GLenum target, GLenum attachment, GLenum pname, GLint* params) { |
4834 Framebuffer* framebuffer_info = | 4841 Framebuffer* framebuffer_info = |
4835 GetFramebufferInfoForTarget(target); | 4842 GetFramebufferInfoForTarget(target); |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5038 if (workarounds().use_current_program_after_successful_link) { | 5045 if (workarounds().use_current_program_after_successful_link) { |
5039 glUseProgram(program->service_id()); | 5046 glUseProgram(program->service_id()); |
5040 } | 5047 } |
5041 program_manager()->ClearUniforms(program); | 5048 program_manager()->ClearUniforms(program); |
5042 } | 5049 } |
5043 } | 5050 } |
5044 }; | 5051 }; |
5045 | 5052 |
5046 void GLES2DecoderImpl::DoTexParameterf( | 5053 void GLES2DecoderImpl::DoTexParameterf( |
5047 GLenum target, GLenum pname, GLfloat param) { | 5054 GLenum target, GLenum pname, GLfloat param) { |
5048 Texture* info = GetTextureInfoForTarget(target); | 5055 Texture* texture = GetTextureInfoForTarget(target); |
5049 if (!info) { | 5056 if (!texture) { |
5050 SetGLError(GL_INVALID_VALUE, "glTexParameterf", "unknown texture"); | 5057 SetGLError(GL_INVALID_VALUE, "glTexParameterf", "unknown texture"); |
5051 return; | 5058 return; |
5052 } | 5059 } |
5053 | 5060 |
5054 GLenum error = texture_manager()->SetParameter( | 5061 texture_manager()->SetParameter( |
5055 info, pname, static_cast<GLint>(param)); | 5062 "glTexParameterf", this, texture, pname, static_cast<GLint>(param)); |
5056 if (error != GL_NO_ERROR) { | |
5057 SetGLErrorInvalidParam( | |
5058 error, "glTexParameterf", pname, static_cast<GLint>(param)); | |
5059 return; | |
5060 } | |
5061 glTexParameterf(target, pname, param); | |
5062 } | 5063 } |
5063 | 5064 |
5064 void GLES2DecoderImpl::DoTexParameteri( | 5065 void GLES2DecoderImpl::DoTexParameteri( |
5065 GLenum target, GLenum pname, GLint param) { | 5066 GLenum target, GLenum pname, GLint param) { |
5066 Texture* info = GetTextureInfoForTarget(target); | 5067 Texture* texture = GetTextureInfoForTarget(target); |
5067 if (!info) { | 5068 if (!texture) { |
5068 SetGLError(GL_INVALID_VALUE, "glTexParameteri", "unknown texture"); | 5069 SetGLError(GL_INVALID_VALUE, "glTexParameteri", "unknown texture"); |
5069 return; | 5070 return; |
5070 } | 5071 } |
5071 | 5072 |
5072 GLenum error = texture_manager()->SetParameter(info, pname, param); | 5073 texture_manager()->SetParameter( |
5073 if (error != GL_NO_ERROR) { | 5074 "glTexParameteri", this, texture, pname, param); |
5074 SetGLErrorInvalidParam(error, "glTexParameteri", pname, param); | |
5075 return; | |
5076 } | |
5077 // Texture tracking pools exist only for the command decoder, so | |
5078 // do not pass them on to the native GL implementation. | |
5079 if (pname == GL_TEXTURE_POOL_CHROMIUM) { | |
5080 return; | |
5081 } | |
5082 glTexParameteri(target, pname, param); | |
5083 } | 5075 } |
5084 | 5076 |
5085 void GLES2DecoderImpl::DoTexParameterfv( | 5077 void GLES2DecoderImpl::DoTexParameterfv( |
5086 GLenum target, GLenum pname, const GLfloat* params) { | 5078 GLenum target, GLenum pname, const GLfloat* params) { |
5087 Texture* info = GetTextureInfoForTarget(target); | 5079 Texture* texture = GetTextureInfoForTarget(target); |
5088 if (!info) { | 5080 if (!texture) { |
5089 SetGLError(GL_INVALID_VALUE, "glTexParameterfv", "unknown texture"); | 5081 SetGLError(GL_INVALID_VALUE, "glTexParameterfv", "unknown texture"); |
5090 return; | 5082 return; |
5091 } | 5083 } |
5092 | 5084 |
5093 GLenum error =texture_manager()->SetParameter( | 5085 texture_manager()->SetParameter( |
5094 info, pname, static_cast<GLint>(params[0])); | 5086 "glTexParameterfv", this, texture, pname, static_cast<GLint>(params[0])); |
5095 if (error != GL_NO_ERROR) { | |
5096 SetGLErrorInvalidParam( | |
5097 error, "glTexParameterfv", pname, static_cast<GLint>(params[0])); | |
5098 return; | |
5099 } | |
5100 glTexParameterfv(target, pname, params); | |
5101 } | 5087 } |
5102 | 5088 |
5103 void GLES2DecoderImpl::DoTexParameteriv( | 5089 void GLES2DecoderImpl::DoTexParameteriv( |
5104 GLenum target, GLenum pname, const GLint* params) { | 5090 GLenum target, GLenum pname, const GLint* params) { |
5105 Texture* info = GetTextureInfoForTarget(target); | 5091 Texture* texture = GetTextureInfoForTarget(target); |
5106 if (!info) { | 5092 if (!texture) { |
5107 SetGLError(GL_INVALID_VALUE, "glTexParameteriv", "unknown texture"); | 5093 SetGLError(GL_INVALID_VALUE, "glTexParameteriv", "unknown texture"); |
5108 return; | 5094 return; |
5109 } | 5095 } |
5110 | 5096 |
5111 GLenum error = texture_manager()->SetParameter(info, pname, *params); | 5097 texture_manager()->SetParameter( |
5112 if (error != GL_NO_ERROR) { | 5098 "glTexParameteriv", this, texture, pname, *params); |
5113 SetGLErrorInvalidParam(error, "glTexParameteriv", pname, *params); | |
5114 return; | |
5115 } | |
5116 glTexParameteriv(target, pname, params); | |
5117 } | 5099 } |
5118 | 5100 |
5119 bool GLES2DecoderImpl::CheckCurrentProgram(const char* function_name) { | 5101 bool GLES2DecoderImpl::CheckCurrentProgram(const char* function_name) { |
5120 if (!state_.current_program) { | 5102 if (!state_.current_program) { |
5121 // The program does not exist. | 5103 // The program does not exist. |
5122 SetGLError(GL_INVALID_OPERATION, function_name, "no program in use"); | 5104 SetGLError(GL_INVALID_OPERATION, function_name, "no program in use"); |
5123 return false; | 5105 return false; |
5124 } | 5106 } |
5125 if (!state_.current_program->InUse()) { | 5107 if (!state_.current_program->InUse()) { |
5126 SetGLError(GL_INVALID_OPERATION, function_name, "program not linked"); | 5108 SetGLError(GL_INVALID_OPERATION, function_name, "program not linked"); |
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5662 const Program::SamplerIndices& sampler_indices = | 5644 const Program::SamplerIndices& sampler_indices = |
5663 state_.current_program->sampler_indices(); | 5645 state_.current_program->sampler_indices(); |
5664 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { | 5646 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { |
5665 const Program::UniformInfo* uniform_info = | 5647 const Program::UniformInfo* uniform_info = |
5666 state_.current_program->GetUniformInfo(sampler_indices[ii]); | 5648 state_.current_program->GetUniformInfo(sampler_indices[ii]); |
5667 DCHECK(uniform_info); | 5649 DCHECK(uniform_info); |
5668 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { | 5650 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { |
5669 GLuint texture_unit_index = uniform_info->texture_units[jj]; | 5651 GLuint texture_unit_index = uniform_info->texture_units[jj]; |
5670 if (texture_unit_index < state_.texture_units.size()) { | 5652 if (texture_unit_index < state_.texture_units.size()) { |
5671 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; | 5653 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; |
5672 Texture* texture_info = | 5654 Texture* texture = |
5673 texture_unit.GetInfoForSamplerType(uniform_info->type); | 5655 texture_unit.GetInfoForSamplerType(uniform_info->type); |
5674 if (!texture_info || !texture_manager()->CanRender(texture_info)) { | 5656 if (!texture || !texture_manager()->CanRender(texture)) { |
5675 textures_set = true; | 5657 textures_set = true; |
5676 glActiveTexture(GL_TEXTURE0 + texture_unit_index); | 5658 glActiveTexture(GL_TEXTURE0 + texture_unit_index); |
5677 glBindTexture( | 5659 glBindTexture( |
5678 GetBindTargetForSamplerType(uniform_info->type), | 5660 GetBindTargetForSamplerType(uniform_info->type), |
5679 texture_manager()->black_texture_id(uniform_info->type)); | 5661 texture_manager()->black_texture_id(uniform_info->type)); |
5680 RenderWarning( | 5662 RenderWarning( |
5681 std::string("texture bound to texture unit ") + | 5663 std::string("texture bound to texture unit ") + |
5682 base::IntToString(texture_unit_index) + | 5664 base::IntToString(texture_unit_index) + |
5683 " is not renderable. It maybe non-power-of-2 and have " | 5665 " is not renderable. It maybe non-power-of-2 and have " |
5684 " incompatible texture filtering or is not " | 5666 " incompatible texture filtering or is not " |
(...skipping 11 matching lines...) Expand all Loading... |
5696 const Program::SamplerIndices& sampler_indices = | 5678 const Program::SamplerIndices& sampler_indices = |
5697 state_.current_program->sampler_indices(); | 5679 state_.current_program->sampler_indices(); |
5698 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { | 5680 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { |
5699 const Program::UniformInfo* uniform_info = | 5681 const Program::UniformInfo* uniform_info = |
5700 state_.current_program->GetUniformInfo(sampler_indices[ii]); | 5682 state_.current_program->GetUniformInfo(sampler_indices[ii]); |
5701 DCHECK(uniform_info); | 5683 DCHECK(uniform_info); |
5702 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { | 5684 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { |
5703 GLuint texture_unit_index = uniform_info->texture_units[jj]; | 5685 GLuint texture_unit_index = uniform_info->texture_units[jj]; |
5704 if (texture_unit_index < state_.texture_units.size()) { | 5686 if (texture_unit_index < state_.texture_units.size()) { |
5705 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; | 5687 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; |
5706 Texture* texture_info = | 5688 Texture* texture = uniform_info->type == GL_SAMPLER_2D ? |
5707 uniform_info->type == GL_SAMPLER_2D ? | 5689 texture_unit.bound_texture_2d : |
5708 texture_unit.bound_texture_2d : | 5690 texture_unit.bound_texture_cube_map; |
5709 texture_unit.bound_texture_cube_map; | 5691 if (!texture || !texture_manager()->CanRender(texture)) { |
5710 if (!texture_info || !texture_manager()->CanRender(texture_info)) { | |
5711 glActiveTexture(GL_TEXTURE0 + texture_unit_index); | 5692 glActiveTexture(GL_TEXTURE0 + texture_unit_index); |
5712 // Get the texture info that was previously bound here. | 5693 // Get the texture info that was previously bound here. |
5713 texture_info = texture_unit.bind_target == GL_TEXTURE_2D ? | 5694 texture = texture_unit.bind_target == GL_TEXTURE_2D ? |
5714 texture_unit.bound_texture_2d : | 5695 texture_unit.bound_texture_2d : |
5715 texture_unit.bound_texture_cube_map; | 5696 texture_unit.bound_texture_cube_map; |
5716 glBindTexture(texture_unit.bind_target, | 5697 glBindTexture(texture_unit.bind_target, |
5717 texture_info ? texture_info->service_id() : 0); | 5698 texture ? texture->service_id() : 0); |
5718 } | 5699 } |
5719 } | 5700 } |
5720 } | 5701 } |
5721 } | 5702 } |
5722 // Set the active texture back to whatever the user had it as. | 5703 // Set the active texture back to whatever the user had it as. |
5723 glActiveTexture(GL_TEXTURE0 + state_.active_texture_unit); | 5704 glActiveTexture(GL_TEXTURE0 + state_.active_texture_unit); |
5724 } | 5705 } |
5725 | 5706 |
5726 bool GLES2DecoderImpl::ClearUnclearedTextures() { | 5707 bool GLES2DecoderImpl::ClearUnclearedTextures() { |
5727 // Only check if there are some uncleared textures. | 5708 // Only check if there are some uncleared textures. |
5728 if (!texture_manager()->HaveUnsafeTextures()) { | 5709 if (!texture_manager()->HaveUnsafeTextures()) { |
5729 return true; | 5710 return true; |
5730 } | 5711 } |
5731 | 5712 |
5732 // 1: Check all textures we are about to render with. | 5713 // 1: Check all textures we are about to render with. |
5733 if (state_.current_program) { | 5714 if (state_.current_program) { |
5734 const Program::SamplerIndices& sampler_indices = | 5715 const Program::SamplerIndices& sampler_indices = |
5735 state_.current_program->sampler_indices(); | 5716 state_.current_program->sampler_indices(); |
5736 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { | 5717 for (size_t ii = 0; ii < sampler_indices.size(); ++ii) { |
5737 const Program::UniformInfo* uniform_info = | 5718 const Program::UniformInfo* uniform_info = |
5738 state_.current_program->GetUniformInfo(sampler_indices[ii]); | 5719 state_.current_program->GetUniformInfo(sampler_indices[ii]); |
5739 DCHECK(uniform_info); | 5720 DCHECK(uniform_info); |
5740 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { | 5721 for (size_t jj = 0; jj < uniform_info->texture_units.size(); ++jj) { |
5741 GLuint texture_unit_index = uniform_info->texture_units[jj]; | 5722 GLuint texture_unit_index = uniform_info->texture_units[jj]; |
5742 if (texture_unit_index < state_.texture_units.size()) { | 5723 if (texture_unit_index < state_.texture_units.size()) { |
5743 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; | 5724 TextureUnit& texture_unit = state_.texture_units[texture_unit_index]; |
5744 Texture* texture_info = | 5725 Texture* texture = |
5745 texture_unit.GetInfoForSamplerType(uniform_info->type); | 5726 texture_unit.GetInfoForSamplerType(uniform_info->type); |
5746 if (texture_info && !texture_info->SafeToRenderFrom()) { | 5727 if (texture && !texture->SafeToRenderFrom()) { |
5747 if (!texture_manager()->ClearRenderableLevels(this, texture_info)) { | 5728 if (!texture_manager()->ClearRenderableLevels(this, texture)) { |
5748 return false; | 5729 return false; |
5749 } | 5730 } |
5750 } | 5731 } |
5751 } | 5732 } |
5752 } | 5733 } |
5753 } | 5734 } |
5754 } | 5735 } |
5755 return true; | 5736 return true; |
5756 } | 5737 } |
5757 | 5738 |
(...skipping 1561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7319 while (y < height) { | 7300 while (y < height) { |
7320 GLint h = y + tile_height > height ? height - y : tile_height; | 7301 GLint h = y + tile_height > height ? height - y : tile_height; |
7321 if (is_texture_immutable || h != height) { | 7302 if (is_texture_immutable || h != height) { |
7322 glTexSubImage2D(target, level, 0, y, width, h, format, type, zero.get()); | 7303 glTexSubImage2D(target, level, 0, y, width, h, format, type, zero.get()); |
7323 } else { | 7304 } else { |
7324 WrappedTexImage2D( | 7305 WrappedTexImage2D( |
7325 target, level, format, width, h, 0, format, type, zero.get()); | 7306 target, level, format, width, h, 0, format, type, zero.get()); |
7326 } | 7307 } |
7327 y += tile_height; | 7308 y += tile_height; |
7328 } | 7309 } |
7329 Texture* info = GetTextureInfoForTarget(bind_target); | 7310 Texture* texture = GetTextureInfoForTarget(bind_target); |
7330 glBindTexture(bind_target, info ? info->service_id() : 0); | 7311 glBindTexture(bind_target, texture ? texture->service_id() : 0); |
7331 return true; | 7312 return true; |
7332 } | 7313 } |
7333 | 7314 |
7334 namespace { | 7315 namespace { |
7335 | 7316 |
7336 const int kS3TCBlockWidth = 4; | 7317 const int kS3TCBlockWidth = 4; |
7337 const int kS3TCBlockHeight = 4; | 7318 const int kS3TCBlockHeight = 4; |
7338 const int kS3TCDXT1BlockSize = 8; | 7319 const int kS3TCDXT1BlockSize = 8; |
7339 const int kS3TCDXT3AndDXT5BlockSize = 16; | 7320 const int kS3TCDXT3AndDXT5BlockSize = 16; |
7340 const int kETC1BlockWidth = 4; | 7321 const int kETC1BlockWidth = 4; |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7492 SetGLErrorInvalidEnum( | 7473 SetGLErrorInvalidEnum( |
7493 "glCompressedTexImage2D", internal_format, "internal_format"); | 7474 "glCompressedTexImage2D", internal_format, "internal_format"); |
7494 return error::kNoError; | 7475 return error::kNoError; |
7495 } | 7476 } |
7496 if (!texture_manager()->ValidForTarget(target, level, width, height, 1) || | 7477 if (!texture_manager()->ValidForTarget(target, level, width, height, 1) || |
7497 border != 0) { | 7478 border != 0) { |
7498 SetGLError(GL_INVALID_VALUE, | 7479 SetGLError(GL_INVALID_VALUE, |
7499 "glCompressedTexImage2D", "dimensions out of range"); | 7480 "glCompressedTexImage2D", "dimensions out of range"); |
7500 return error::kNoError; | 7481 return error::kNoError; |
7501 } | 7482 } |
7502 Texture* info = GetTextureInfoForTarget(target); | 7483 Texture* texture = GetTextureInfoForTarget(target); |
7503 if (!info) { | 7484 if (!texture) { |
7504 SetGLError(GL_INVALID_VALUE, | 7485 SetGLError(GL_INVALID_VALUE, |
7505 "glCompressedTexImage2D", "unknown texture target"); | 7486 "glCompressedTexImage2D", "unknown texture target"); |
7506 return error::kNoError; | 7487 return error::kNoError; |
7507 } | 7488 } |
7508 if (info->IsImmutable()) { | 7489 if (texture->IsImmutable()) { |
7509 SetGLError(GL_INVALID_OPERATION, | 7490 SetGLError(GL_INVALID_OPERATION, |
7510 "glCompressedTexImage2D", "texture is immutable"); | 7491 "glCompressedTexImage2D", "texture is immutable"); |
7511 return error::kNoError; | 7492 return error::kNoError; |
7512 } | 7493 } |
7513 | 7494 |
7514 if (!ValidateCompressedTexDimensions( | 7495 if (!ValidateCompressedTexDimensions( |
7515 "glCompressedTexImage2D", level, width, height, internal_format) || | 7496 "glCompressedTexImage2D", level, width, height, internal_format) || |
7516 !ValidateCompressedTexFuncData( | 7497 !ValidateCompressedTexFuncData( |
7517 "glCompressedTexImage2D", width, height, internal_format, image_size)) { | 7498 "glCompressedTexImage2D", width, height, internal_format, image_size)) { |
7518 return error::kNoError; | 7499 return error::kNoError; |
7519 } | 7500 } |
7520 | 7501 |
7521 if (!EnsureGPUMemoryAvailable(image_size)) { | 7502 if (!EnsureGPUMemoryAvailable(image_size)) { |
7522 SetGLError(GL_OUT_OF_MEMORY, "glCompressedTexImage2D", "out of memory"); | 7503 SetGLError(GL_OUT_OF_MEMORY, "glCompressedTexImage2D", "out of memory"); |
7523 return error::kNoError; | 7504 return error::kNoError; |
7524 } | 7505 } |
7525 | 7506 |
7526 if (info->IsAttachedToFramebuffer()) { | 7507 if (texture->IsAttachedToFramebuffer()) { |
7527 clear_state_dirty_ = true; | 7508 clear_state_dirty_ = true; |
7528 // TODO(gman): If textures tracked which framebuffers they were attached to | 7509 // TODO(gman): If textures tracked which framebuffers they were attached to |
7529 // we could just mark those framebuffers as not complete. | 7510 // we could just mark those framebuffers as not complete. |
7530 framebuffer_manager()->IncFramebufferStateChangeCount(); | 7511 framebuffer_manager()->IncFramebufferStateChangeCount(); |
7531 } | 7512 } |
7532 | 7513 |
7533 scoped_array<int8> zero; | 7514 scoped_array<int8> zero; |
7534 if (!data) { | 7515 if (!data) { |
7535 zero.reset(new int8[image_size]); | 7516 zero.reset(new int8[image_size]); |
7536 memset(zero.get(), 0, image_size); | 7517 memset(zero.get(), 0, image_size); |
7537 data = zero.get(); | 7518 data = zero.get(); |
7538 } | 7519 } |
7539 CopyRealGLErrorsToWrapper(); | 7520 CopyRealGLErrorsToWrapper(); |
7540 glCompressedTexImage2D( | 7521 glCompressedTexImage2D( |
7541 target, level, internal_format, width, height, border, image_size, data); | 7522 target, level, internal_format, width, height, border, image_size, data); |
7542 GLenum error = PeekGLError(); | 7523 GLenum error = PeekGLError(); |
7543 if (error == GL_NO_ERROR) { | 7524 if (error == GL_NO_ERROR) { |
7544 texture_manager()->SetLevelInfo( | 7525 texture_manager()->SetLevelInfo( |
7545 info, target, level, internal_format, width, height, 1, border, 0, 0, | 7526 texture, target, level, internal_format, width, height, 1, border, 0, 0, |
7546 true); | 7527 true); |
7547 } | 7528 } |
7548 return error::kNoError; | 7529 return error::kNoError; |
7549 } | 7530 } |
7550 | 7531 |
7551 error::Error GLES2DecoderImpl::HandleCompressedTexImage2D( | 7532 error::Error GLES2DecoderImpl::HandleCompressedTexImage2D( |
7552 uint32 immediate_data_size, const cmds::CompressedTexImage2D& c) { | 7533 uint32 immediate_data_size, const cmds::CompressedTexImage2D& c) { |
7553 GLenum target = static_cast<GLenum>(c.target); | 7534 GLenum target = static_cast<GLenum>(c.target); |
7554 GLint level = static_cast<GLint>(c.level); | 7535 GLint level = static_cast<GLint>(c.level); |
7555 GLenum internal_format = static_cast<GLenum>(c.internalformat); | 7536 GLenum internal_format = static_cast<GLenum>(c.internalformat); |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7721 SetGLError(GL_INVALID_VALUE, function_name, "dimensions out of range"); | 7702 SetGLError(GL_INVALID_VALUE, function_name, "dimensions out of range"); |
7722 return false; | 7703 return false; |
7723 } | 7704 } |
7724 if ((GLES2Util::GetChannelsForFormat(format) & | 7705 if ((GLES2Util::GetChannelsForFormat(format) & |
7725 (GLES2Util::kDepth | GLES2Util::kStencil)) != 0 && pixels) { | 7706 (GLES2Util::kDepth | GLES2Util::kStencil)) != 0 && pixels) { |
7726 SetGLError( | 7707 SetGLError( |
7727 GL_INVALID_OPERATION, | 7708 GL_INVALID_OPERATION, |
7728 function_name, "can not supply data for depth or stencil textures"); | 7709 function_name, "can not supply data for depth or stencil textures"); |
7729 return false; | 7710 return false; |
7730 } | 7711 } |
7731 Texture* info = GetTextureInfoForTarget(target); | 7712 Texture* texture = GetTextureInfoForTarget(target); |
7732 if (!info) { | 7713 if (!texture) { |
7733 SetGLError(GL_INVALID_OPERATION, | 7714 SetGLError(GL_INVALID_OPERATION, |
7734 function_name, "unknown texture for target"); | 7715 function_name, "unknown texture for target"); |
7735 return false; | 7716 return false; |
7736 } | 7717 } |
7737 if (info->IsImmutable()) { | 7718 if (texture->IsImmutable()) { |
7738 SetGLError(GL_INVALID_OPERATION, | 7719 SetGLError(GL_INVALID_OPERATION, |
7739 function_name, "texture is immutable"); | 7720 function_name, "texture is immutable"); |
7740 return false; | 7721 return false; |
7741 } | 7722 } |
7742 return true; | 7723 return true; |
7743 } | 7724 } |
7744 | 7725 |
7745 void GLES2DecoderImpl::DoTexImage2D( | 7726 void GLES2DecoderImpl::DoTexImage2D( |
7746 GLenum target, | 7727 GLenum target, |
7747 GLint level, | 7728 GLint level, |
7748 GLenum internal_format, | 7729 GLenum internal_format, |
7749 GLsizei width, | 7730 GLsizei width, |
7750 GLsizei height, | 7731 GLsizei height, |
7751 GLint border, | 7732 GLint border, |
7752 GLenum format, | 7733 GLenum format, |
7753 GLenum type, | 7734 GLenum type, |
7754 const void* pixels, | 7735 const void* pixels, |
7755 uint32 pixels_size) { | 7736 uint32 pixels_size) { |
7756 if (!ValidateTexImage2D("glTexImage2D", target, level, internal_format, | 7737 if (!ValidateTexImage2D("glTexImage2D", target, level, internal_format, |
7757 width, height, border, format, type, pixels, pixels_size)) { | 7738 width, height, border, format, type, pixels, pixels_size)) { |
7758 return; | 7739 return; |
7759 } | 7740 } |
7760 | 7741 |
7761 if (!EnsureGPUMemoryAvailable(pixels_size)) { | 7742 if (!EnsureGPUMemoryAvailable(pixels_size)) { |
7762 SetGLError(GL_OUT_OF_MEMORY, "glTexImage2D", "out of memory"); | 7743 SetGLError(GL_OUT_OF_MEMORY, "glTexImage2D", "out of memory"); |
7763 return; | 7744 return; |
7764 } | 7745 } |
7765 | 7746 |
7766 Texture* info = GetTextureInfoForTarget(target); | 7747 Texture* texture = GetTextureInfoForTarget(target); |
7767 GLsizei tex_width = 0; | 7748 GLsizei tex_width = 0; |
7768 GLsizei tex_height = 0; | 7749 GLsizei tex_height = 0; |
7769 GLenum tex_type = 0; | 7750 GLenum tex_type = 0; |
7770 GLenum tex_format = 0; | 7751 GLenum tex_format = 0; |
7771 bool level_is_same = | 7752 bool level_is_same = |
7772 info->GetLevelSize(target, level, &tex_width, &tex_height) && | 7753 texture->GetLevelSize(target, level, &tex_width, &tex_height) && |
7773 info->GetLevelType(target, level, &tex_type, &tex_format) && | 7754 texture->GetLevelType(target, level, &tex_type, &tex_format) && |
7774 width == tex_width && height == tex_height && | 7755 width == tex_width && height == tex_height && |
7775 type == tex_type && format == tex_format; | 7756 type == tex_type && format == tex_format; |
7776 | 7757 |
7777 if (level_is_same && !pixels) { | 7758 if (level_is_same && !pixels) { |
7778 // Just set the level info but mark the texture as uncleared. | 7759 // Just set the level texture but mark the texture as uncleared. |
7779 texture_manager()->SetLevelInfo( | 7760 texture_manager()->SetLevelInfo( |
7780 info, | 7761 texture, |
7781 target, level, internal_format, width, height, 1, border, format, type, | 7762 target, level, internal_format, width, height, 1, border, format, type, |
7782 false); | 7763 false); |
7783 tex_image_2d_failed_ = false; | 7764 tex_image_2d_failed_ = false; |
7784 return; | 7765 return; |
7785 } | 7766 } |
7786 | 7767 |
7787 if (info->IsAttachedToFramebuffer()) { | 7768 if (texture->IsAttachedToFramebuffer()) { |
7788 clear_state_dirty_ = true; | 7769 clear_state_dirty_ = true; |
7789 // TODO(gman): If textures tracked which framebuffers they were attached to | 7770 // TODO(gman): If textures tracked which framebuffers they were attached to |
7790 // we could just mark those framebuffers as not complete. | 7771 // we could just mark those framebuffers as not complete. |
7791 framebuffer_manager()->IncFramebufferStateChangeCount(); | 7772 framebuffer_manager()->IncFramebufferStateChangeCount(); |
7792 } | 7773 } |
7793 | 7774 |
7794 if (!teximage2d_faster_than_texsubimage2d_ && level_is_same && pixels) { | 7775 if (!teximage2d_faster_than_texsubimage2d_ && level_is_same && pixels) { |
7795 glTexSubImage2D(target, level, 0, 0, width, height, format, type, pixels); | 7776 glTexSubImage2D(target, level, 0, 0, width, height, format, type, pixels); |
7796 texture_manager()->SetLevelCleared(info, target, level, true); | 7777 texture_manager()->SetLevelCleared(texture, target, level, true); |
7797 tex_image_2d_failed_ = false; | 7778 tex_image_2d_failed_ = false; |
7798 return; | 7779 return; |
7799 } | 7780 } |
7800 | 7781 |
7801 CopyRealGLErrorsToWrapper(); | 7782 CopyRealGLErrorsToWrapper(); |
7802 WrappedTexImage2D( | 7783 WrappedTexImage2D( |
7803 target, level, internal_format, width, height, border, format, type, | 7784 target, level, internal_format, width, height, border, format, type, |
7804 pixels); | 7785 pixels); |
7805 GLenum error = PeekGLError(); | 7786 GLenum error = PeekGLError(); |
7806 if (error == GL_NO_ERROR) { | 7787 if (error == GL_NO_ERROR) { |
7807 texture_manager()->SetLevelInfo( | 7788 texture_manager()->SetLevelInfo( |
7808 info, | 7789 texture, |
7809 target, level, internal_format, width, height, 1, border, format, type, | 7790 target, level, internal_format, width, height, 1, border, format, type, |
7810 pixels != NULL); | 7791 pixels != NULL); |
7811 tex_image_2d_failed_ = false; | 7792 tex_image_2d_failed_ = false; |
7812 } | 7793 } |
7813 return; | 7794 return; |
7814 } | 7795 } |
7815 | 7796 |
7816 error::Error GLES2DecoderImpl::HandleTexImage2D( | 7797 error::Error GLES2DecoderImpl::HandleTexImage2D( |
7817 uint32 immediate_data_size, const cmds::TexImage2D& c) { | 7798 uint32 immediate_data_size, const cmds::TexImage2D& c) { |
7818 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexImage2D"); | 7799 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexImage2D"); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7878 void GLES2DecoderImpl::DoCompressedTexSubImage2D( | 7859 void GLES2DecoderImpl::DoCompressedTexSubImage2D( |
7879 GLenum target, | 7860 GLenum target, |
7880 GLint level, | 7861 GLint level, |
7881 GLint xoffset, | 7862 GLint xoffset, |
7882 GLint yoffset, | 7863 GLint yoffset, |
7883 GLsizei width, | 7864 GLsizei width, |
7884 GLsizei height, | 7865 GLsizei height, |
7885 GLenum format, | 7866 GLenum format, |
7886 GLsizei image_size, | 7867 GLsizei image_size, |
7887 const void * data) { | 7868 const void * data) { |
7888 Texture* info = GetTextureInfoForTarget(target); | 7869 Texture* texture = GetTextureInfoForTarget(target); |
7889 if (!info) { | 7870 if (!texture) { |
7890 SetGLError(GL_INVALID_OPERATION, | 7871 SetGLError(GL_INVALID_OPERATION, |
7891 "glCompressedTexSubImage2D", "unknown texture for target"); | 7872 "glCompressedTexSubImage2D", "unknown texture for target"); |
7892 return; | 7873 return; |
7893 } | 7874 } |
7894 GLenum type = 0; | 7875 GLenum type = 0; |
7895 GLenum internal_format = 0; | 7876 GLenum internal_format = 0; |
7896 if (!info->GetLevelType(target, level, &type, &internal_format)) { | 7877 if (!texture->GetLevelType(target, level, &type, &internal_format)) { |
7897 SetGLError( | 7878 SetGLError( |
7898 GL_INVALID_OPERATION, | 7879 GL_INVALID_OPERATION, |
7899 "glCompressedTexSubImage2D", "level does not exist."); | 7880 "glCompressedTexSubImage2D", "level does not exist."); |
7900 return; | 7881 return; |
7901 } | 7882 } |
7902 if (internal_format != format) { | 7883 if (internal_format != format) { |
7903 SetGLError( | 7884 SetGLError( |
7904 GL_INVALID_OPERATION, | 7885 GL_INVALID_OPERATION, |
7905 "glCompressedTexSubImage2D", "format does not match internal format."); | 7886 "glCompressedTexSubImage2D", "format does not match internal format."); |
7906 return; | 7887 return; |
7907 } | 7888 } |
7908 if (!info->ValidForTexture( | 7889 if (!texture->ValidForTexture( |
7909 target, level, xoffset, yoffset, width, height, format, type)) { | 7890 target, level, xoffset, yoffset, width, height, format, type)) { |
7910 SetGLError(GL_INVALID_VALUE, | 7891 SetGLError(GL_INVALID_VALUE, |
7911 "glCompressedTexSubImage2D", "bad dimensions."); | 7892 "glCompressedTexSubImage2D", "bad dimensions."); |
7912 return; | 7893 return; |
7913 } | 7894 } |
7914 | 7895 |
7915 if (!ValidateCompressedTexFuncData( | 7896 if (!ValidateCompressedTexFuncData( |
7916 "glCompressedTexSubImage2D", width, height, format, image_size) || | 7897 "glCompressedTexSubImage2D", width, height, format, image_size) || |
7917 !ValidateCompressedTexSubDimensions( | 7898 !ValidateCompressedTexSubDimensions( |
7918 "glCompressedTexSubImage2D", | 7899 "glCompressedTexSubImage2D", |
7919 target, level, xoffset, yoffset, width, height, format, info)) { | 7900 target, level, xoffset, yoffset, width, height, format, texture)) { |
7920 return; | 7901 return; |
7921 } | 7902 } |
7922 | 7903 |
7923 | 7904 |
7924 // Note: There is no need to deal with texture cleared tracking here | 7905 // Note: There is no need to deal with texture cleared tracking here |
7925 // because the validation above means you can only get here if the level | 7906 // because the validation above means you can only get here if the level |
7926 // is already a matching compressed format and in that case | 7907 // is already a matching compressed format and in that case |
7927 // CompressedTexImage2D already cleared the texture. | 7908 // CompressedTexImage2D already cleared the texture. |
7928 glCompressedTexSubImage2D( | 7909 glCompressedTexSubImage2D( |
7929 target, level, xoffset, yoffset, width, height, format, image_size, data); | 7910 target, level, xoffset, yoffset, width, height, format, image_size, data); |
(...skipping 19 matching lines...) Expand all Loading... |
7949 void GLES2DecoderImpl::DoCopyTexImage2D( | 7930 void GLES2DecoderImpl::DoCopyTexImage2D( |
7950 GLenum target, | 7931 GLenum target, |
7951 GLint level, | 7932 GLint level, |
7952 GLenum internal_format, | 7933 GLenum internal_format, |
7953 GLint x, | 7934 GLint x, |
7954 GLint y, | 7935 GLint y, |
7955 GLsizei width, | 7936 GLsizei width, |
7956 GLsizei height, | 7937 GLsizei height, |
7957 GLint border) { | 7938 GLint border) { |
7958 DCHECK(!ShouldDeferReads()); | 7939 DCHECK(!ShouldDeferReads()); |
7959 Texture* info = GetTextureInfoForTarget(target); | 7940 Texture* texture = GetTextureInfoForTarget(target); |
7960 if (!info) { | 7941 if (!texture) { |
7961 SetGLError(GL_INVALID_OPERATION, | 7942 SetGLError(GL_INVALID_OPERATION, |
7962 "glCopyTexImage2D", "unknown texture for target"); | 7943 "glCopyTexImage2D", "unknown texture for target"); |
7963 return; | 7944 return; |
7964 } | 7945 } |
7965 if (info->IsImmutable()) { | 7946 if (texture->IsImmutable()) { |
7966 SetGLError(GL_INVALID_OPERATION, | 7947 SetGLError(GL_INVALID_OPERATION, |
7967 "glCopyTexImage2D", "texture is immutable"); | 7948 "glCopyTexImage2D", "texture is immutable"); |
7968 } | 7949 } |
7969 if (!texture_manager()->ValidForTarget(target, level, width, height, 1) || | 7950 if (!texture_manager()->ValidForTarget(target, level, width, height, 1) || |
7970 border != 0) { | 7951 border != 0) { |
7971 SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D", "dimensions out of range"); | 7952 SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D", "dimensions out of range"); |
7972 return; | 7953 return; |
7973 } | 7954 } |
7974 if (!ValidateTextureParameters( | 7955 if (!ValidateTextureParameters( |
7975 "glCopyTexImage2D", target, internal_format, GL_UNSIGNED_BYTE, level)) { | 7956 "glCopyTexImage2D", target, internal_format, GL_UNSIGNED_BYTE, level)) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8007 } | 7988 } |
8008 | 7989 |
8009 if (!CheckBoundFramebuffersValid("glCopyTexImage2D")) { | 7990 if (!CheckBoundFramebuffersValid("glCopyTexImage2D")) { |
8010 return; | 7991 return; |
8011 } | 7992 } |
8012 | 7993 |
8013 CopyRealGLErrorsToWrapper(); | 7994 CopyRealGLErrorsToWrapper(); |
8014 ScopedResolvedFrameBufferBinder binder(this, false, true); | 7995 ScopedResolvedFrameBufferBinder binder(this, false, true); |
8015 gfx::Size size = GetBoundReadFrameBufferSize(); | 7996 gfx::Size size = GetBoundReadFrameBufferSize(); |
8016 | 7997 |
8017 if (info->IsAttachedToFramebuffer()) { | 7998 if (texture->IsAttachedToFramebuffer()) { |
8018 clear_state_dirty_ = true; | 7999 clear_state_dirty_ = true; |
8019 // TODO(gman): If textures tracked which framebuffers they were attached to | 8000 // TODO(gman): If textures tracked which framebuffers they were attached to |
8020 // we could just mark those framebuffers as not complete. | 8001 // we could just mark those framebuffers as not complete. |
8021 framebuffer_manager()->IncFramebufferStateChangeCount(); | 8002 framebuffer_manager()->IncFramebufferStateChangeCount(); |
8022 } | 8003 } |
8023 | 8004 |
8024 // Clip to size to source dimensions | 8005 // Clip to size to source dimensions |
8025 GLint copyX = 0; | 8006 GLint copyX = 0; |
8026 GLint copyY = 0; | 8007 GLint copyY = 0; |
8027 GLint copyWidth = 0; | 8008 GLint copyWidth = 0; |
8028 GLint copyHeight = 0; | 8009 GLint copyHeight = 0; |
8029 Clip(x, width, size.width(), ©X, ©Width); | 8010 Clip(x, width, size.width(), ©X, ©Width); |
8030 Clip(y, height, size.height(), ©Y, ©Height); | 8011 Clip(y, height, size.height(), ©Y, ©Height); |
8031 | 8012 |
8032 if (copyX != x || | 8013 if (copyX != x || |
8033 copyY != y || | 8014 copyY != y || |
8034 copyWidth != width || | 8015 copyWidth != width || |
8035 copyHeight != height) { | 8016 copyHeight != height) { |
8036 // some part was clipped so clear the texture. | 8017 // some part was clipped so clear the texture. |
8037 if (!ClearLevel( | 8018 if (!ClearLevel( |
8038 info->service_id(), info->target(), | 8019 texture->service_id(), texture->target(), |
8039 target, level, internal_format, GL_UNSIGNED_BYTE, width, height, | 8020 target, level, internal_format, GL_UNSIGNED_BYTE, width, height, |
8040 info->IsImmutable())) { | 8021 texture->IsImmutable())) { |
8041 SetGLError(GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big"); | 8022 SetGLError(GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big"); |
8042 return; | 8023 return; |
8043 } | 8024 } |
8044 if (copyHeight > 0 && copyWidth > 0) { | 8025 if (copyHeight > 0 && copyWidth > 0) { |
8045 GLint dx = copyX - x; | 8026 GLint dx = copyX - x; |
8046 GLint dy = copyY - y; | 8027 GLint dy = copyY - y; |
8047 GLint destX = dx; | 8028 GLint destX = dx; |
8048 GLint destY = dy; | 8029 GLint destY = dy; |
8049 glCopyTexSubImage2D(target, level, | 8030 glCopyTexSubImage2D(target, level, |
8050 destX, destY, copyX, copyY, | 8031 destX, destY, copyX, copyY, |
8051 copyWidth, copyHeight); | 8032 copyWidth, copyHeight); |
8052 } | 8033 } |
8053 } else { | 8034 } else { |
8054 glCopyTexImage2D(target, level, internal_format, | 8035 glCopyTexImage2D(target, level, internal_format, |
8055 copyX, copyY, copyWidth, copyHeight, border); | 8036 copyX, copyY, copyWidth, copyHeight, border); |
8056 } | 8037 } |
8057 GLenum error = PeekGLError(); | 8038 GLenum error = PeekGLError(); |
8058 if (error == GL_NO_ERROR) { | 8039 if (error == GL_NO_ERROR) { |
8059 texture_manager()->SetLevelInfo( | 8040 texture_manager()->SetLevelInfo( |
8060 info, target, level, internal_format, width, height, 1, | 8041 texture, target, level, internal_format, width, height, 1, |
8061 border, internal_format, GL_UNSIGNED_BYTE, true); | 8042 border, internal_format, GL_UNSIGNED_BYTE, true); |
8062 } | 8043 } |
8063 } | 8044 } |
8064 | 8045 |
8065 void GLES2DecoderImpl::DoCopyTexSubImage2D( | 8046 void GLES2DecoderImpl::DoCopyTexSubImage2D( |
8066 GLenum target, | 8047 GLenum target, |
8067 GLint level, | 8048 GLint level, |
8068 GLint xoffset, | 8049 GLint xoffset, |
8069 GLint yoffset, | 8050 GLint yoffset, |
8070 GLint x, | 8051 GLint x, |
8071 GLint y, | 8052 GLint y, |
8072 GLsizei width, | 8053 GLsizei width, |
8073 GLsizei height) { | 8054 GLsizei height) { |
8074 DCHECK(!ShouldDeferReads()); | 8055 DCHECK(!ShouldDeferReads()); |
8075 Texture* info = GetTextureInfoForTarget(target); | 8056 Texture* texture = GetTextureInfoForTarget(target); |
8076 if (!info) { | 8057 if (!texture) { |
8077 SetGLError(GL_INVALID_OPERATION, | 8058 SetGLError(GL_INVALID_OPERATION, |
8078 "glCopyTexSubImage2D", "unknown texture for target"); | 8059 "glCopyTexSubImage2D", "unknown texture for target"); |
8079 return; | 8060 return; |
8080 } | 8061 } |
8081 GLenum type = 0; | 8062 GLenum type = 0; |
8082 GLenum format = 0; | 8063 GLenum format = 0; |
8083 if (!info->GetLevelType(target, level, &type, &format) || | 8064 if (!texture->GetLevelType(target, level, &type, &format) || |
8084 !info->ValidForTexture( | 8065 !texture->ValidForTexture( |
8085 target, level, xoffset, yoffset, width, height, format, type)) { | 8066 target, level, xoffset, yoffset, width, height, format, type)) { |
8086 SetGLError(GL_INVALID_VALUE, | 8067 SetGLError(GL_INVALID_VALUE, |
8087 "glCopyTexSubImage2D", "bad dimensions."); | 8068 "glCopyTexSubImage2D", "bad dimensions."); |
8088 return; | 8069 return; |
8089 } | 8070 } |
8090 if (info->AsyncTransferIsInProgress()) { | 8071 if (texture->AsyncTransferIsInProgress()) { |
8091 SetGLError(GL_INVALID_OPERATION, | 8072 SetGLError(GL_INVALID_OPERATION, |
8092 "glCopyTexSubImage2D", "async upload pending for texture"); | 8073 "glCopyTexSubImage2D", "async upload pending for texture"); |
8093 return; | 8074 return; |
8094 } | 8075 } |
8095 | 8076 |
8096 // Check we have compatible formats. | 8077 // Check we have compatible formats. |
8097 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); | 8078 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); |
8098 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format); | 8079 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format); |
8099 uint32 channels_needed = GLES2Util::GetChannelsForFormat(format); | 8080 uint32 channels_needed = GLES2Util::GetChannelsForFormat(format); |
8100 | 8081 |
(...skipping 17 matching lines...) Expand all Loading... |
8118 | 8099 |
8119 ScopedResolvedFrameBufferBinder binder(this, false, true); | 8100 ScopedResolvedFrameBufferBinder binder(this, false, true); |
8120 gfx::Size size = GetBoundReadFrameBufferSize(); | 8101 gfx::Size size = GetBoundReadFrameBufferSize(); |
8121 GLint copyX = 0; | 8102 GLint copyX = 0; |
8122 GLint copyY = 0; | 8103 GLint copyY = 0; |
8123 GLint copyWidth = 0; | 8104 GLint copyWidth = 0; |
8124 GLint copyHeight = 0; | 8105 GLint copyHeight = 0; |
8125 Clip(x, width, size.width(), ©X, ©Width); | 8106 Clip(x, width, size.width(), ©X, ©Width); |
8126 Clip(y, height, size.height(), ©Y, ©Height); | 8107 Clip(y, height, size.height(), ©Y, ©Height); |
8127 | 8108 |
8128 if (!texture_manager()->ClearTextureLevel(this, info, target, level)) { | 8109 if (!texture_manager()->ClearTextureLevel(this, texture, target, level)) { |
8129 SetGLError(GL_OUT_OF_MEMORY, "glCopyTexSubImage2D", "dimensions too big"); | 8110 SetGLError(GL_OUT_OF_MEMORY, "glCopyTexSubImage2D", "dimensions too big"); |
8130 return; | 8111 return; |
8131 } | 8112 } |
8132 | 8113 |
8133 if (copyX != x || | 8114 if (copyX != x || |
8134 copyY != y || | 8115 copyY != y || |
8135 copyWidth != width || | 8116 copyWidth != width || |
8136 copyHeight != height) { | 8117 copyHeight != height) { |
8137 // some part was clipped so clear the sub rect. | 8118 // some part was clipped so clear the sub rect. |
8138 uint32 pixels_size = 0; | 8119 uint32 pixels_size = 0; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8187 return false; | 8168 return false; |
8188 } | 8169 } |
8189 if (!validators_->texture_format.IsValid(format)) { | 8170 if (!validators_->texture_format.IsValid(format)) { |
8190 SetGLErrorInvalidEnum(function_name, format, "format"); | 8171 SetGLErrorInvalidEnum(function_name, format, "format"); |
8191 return false; | 8172 return false; |
8192 } | 8173 } |
8193 if (!validators_->pixel_type.IsValid(type)) { | 8174 if (!validators_->pixel_type.IsValid(type)) { |
8194 SetGLErrorInvalidEnum(function_name, type, "type"); | 8175 SetGLErrorInvalidEnum(function_name, type, "type"); |
8195 return false; | 8176 return false; |
8196 } | 8177 } |
8197 Texture* info = GetTextureInfoForTarget(target); | 8178 Texture* texture = GetTextureInfoForTarget(target); |
8198 if (!info) { | 8179 if (!texture) { |
8199 SetGLError(GL_INVALID_OPERATION, | 8180 SetGLError(GL_INVALID_OPERATION, |
8200 function_name, "unknown texture for target"); | 8181 function_name, "unknown texture for target"); |
8201 return false; | 8182 return false; |
8202 } | 8183 } |
8203 GLenum current_type = 0; | 8184 GLenum current_type = 0; |
8204 GLenum internal_format = 0; | 8185 GLenum internal_format = 0; |
8205 if (!info->GetLevelType(target, level, ¤t_type, &internal_format)) { | 8186 if (!texture->GetLevelType(target, level, ¤t_type, &internal_format)) { |
8206 SetGLError( | 8187 SetGLError( |
8207 GL_INVALID_OPERATION, function_name, "level does not exist."); | 8188 GL_INVALID_OPERATION, function_name, "level does not exist."); |
8208 return false; | 8189 return false; |
8209 } | 8190 } |
8210 if (format != internal_format) { | 8191 if (format != internal_format) { |
8211 SetGLError(GL_INVALID_OPERATION, | 8192 SetGLError(GL_INVALID_OPERATION, |
8212 function_name, "format does not match internal format."); | 8193 function_name, "format does not match internal format."); |
8213 return false; | 8194 return false; |
8214 } | 8195 } |
8215 if (type != current_type) { | 8196 if (type != current_type) { |
8216 SetGLError(GL_INVALID_OPERATION, | 8197 SetGLError(GL_INVALID_OPERATION, |
8217 function_name, "type does not match type of texture."); | 8198 function_name, "type does not match type of texture."); |
8218 return false; | 8199 return false; |
8219 } | 8200 } |
8220 if (info->AsyncTransferIsInProgress()) { | 8201 if (texture->AsyncTransferIsInProgress()) { |
8221 SetGLError(GL_INVALID_OPERATION, | 8202 SetGLError(GL_INVALID_OPERATION, |
8222 function_name, "async upload pending for texture"); | 8203 function_name, "async upload pending for texture"); |
8223 return false; | 8204 return false; |
8224 } | 8205 } |
8225 if (!info->ValidForTexture( | 8206 if (!texture->ValidForTexture( |
8226 target, level, xoffset, yoffset, width, height, format, type)) { | 8207 target, level, xoffset, yoffset, width, height, format, type)) { |
8227 SetGLError(GL_INVALID_VALUE, function_name, "bad dimensions."); | 8208 SetGLError(GL_INVALID_VALUE, function_name, "bad dimensions."); |
8228 return false; | 8209 return false; |
8229 } | 8210 } |
8230 if ((GLES2Util::GetChannelsForFormat(format) & | 8211 if ((GLES2Util::GetChannelsForFormat(format) & |
8231 (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) { | 8212 (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) { |
8232 SetGLError( | 8213 SetGLError( |
8233 GL_INVALID_OPERATION, | 8214 GL_INVALID_OPERATION, |
8234 function_name, "can not supply data for depth or stencil textures"); | 8215 function_name, "can not supply data for depth or stencil textures"); |
8235 return false; | 8216 return false; |
(...skipping 13 matching lines...) Expand all Loading... |
8249 GLsizei width, | 8230 GLsizei width, |
8250 GLsizei height, | 8231 GLsizei height, |
8251 GLenum format, | 8232 GLenum format, |
8252 GLenum type, | 8233 GLenum type, |
8253 const void * data) { | 8234 const void * data) { |
8254 error::Error error = error::kNoError; | 8235 error::Error error = error::kNoError; |
8255 if (!ValidateTexSubImage2D(&error, "glTexSubImage2D", target, level, | 8236 if (!ValidateTexSubImage2D(&error, "glTexSubImage2D", target, level, |
8256 xoffset, yoffset, width, height, format, type, data)) { | 8237 xoffset, yoffset, width, height, format, type, data)) { |
8257 return error; | 8238 return error; |
8258 } | 8239 } |
8259 Texture* info = GetTextureInfoForTarget(target); | 8240 Texture* texture = GetTextureInfoForTarget(target); |
8260 GLsizei tex_width = 0; | 8241 GLsizei tex_width = 0; |
8261 GLsizei tex_height = 0; | 8242 GLsizei tex_height = 0; |
8262 bool ok = info->GetLevelSize(target, level, &tex_width, &tex_height); | 8243 bool ok = texture->GetLevelSize(target, level, &tex_width, &tex_height); |
8263 DCHECK(ok); | 8244 DCHECK(ok); |
8264 if (xoffset != 0 || yoffset != 0 || | 8245 if (xoffset != 0 || yoffset != 0 || |
8265 width != tex_width || height != tex_height) { | 8246 width != tex_width || height != tex_height) { |
8266 if (!texture_manager()->ClearTextureLevel(this, info, target, level)) { | 8247 if (!texture_manager()->ClearTextureLevel(this, texture, target, level)) { |
8267 SetGLError(GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big"); | 8248 SetGLError(GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big"); |
8268 return error::kNoError; | 8249 return error::kNoError; |
8269 } | 8250 } |
8270 ScopedTextureUploadTimer timer(this); | 8251 ScopedTextureUploadTimer timer(this); |
8271 glTexSubImage2D( | 8252 glTexSubImage2D( |
8272 target, level, xoffset, yoffset, width, height, format, type, data); | 8253 target, level, xoffset, yoffset, width, height, format, type, data); |
8273 return error::kNoError; | 8254 return error::kNoError; |
8274 } | 8255 } |
8275 | 8256 |
8276 if (teximage2d_faster_than_texsubimage2d_ && !info->IsImmutable()) { | 8257 if (teximage2d_faster_than_texsubimage2d_ && !texture->IsImmutable()) { |
8277 ScopedTextureUploadTimer timer(this); | 8258 ScopedTextureUploadTimer timer(this); |
8278 // NOTE: In OpenGL ES 2.0 border is always zero and format is always the | 8259 // NOTE: In OpenGL ES 2.0 border is always zero and format is always the |
8279 // same as internal_foramt. If that changes we'll need to look them up. | 8260 // same as internal_foramt. If that changes we'll need to look them up. |
8280 WrappedTexImage2D( | 8261 WrappedTexImage2D( |
8281 target, level, format, width, height, 0, format, type, data); | 8262 target, level, format, width, height, 0, format, type, data); |
8282 } else { | 8263 } else { |
8283 ScopedTextureUploadTimer timer(this); | 8264 ScopedTextureUploadTimer timer(this); |
8284 glTexSubImage2D( | 8265 glTexSubImage2D( |
8285 target, level, xoffset, yoffset, width, height, format, type, data); | 8266 target, level, xoffset, yoffset, width, height, format, type, data); |
8286 } | 8267 } |
8287 texture_manager()->SetLevelCleared(info, target, level, true); | 8268 texture_manager()->SetLevelCleared(texture, target, level, true); |
8288 return error::kNoError; | 8269 return error::kNoError; |
8289 } | 8270 } |
8290 | 8271 |
8291 error::Error GLES2DecoderImpl::HandleTexSubImage2D( | 8272 error::Error GLES2DecoderImpl::HandleTexSubImage2D( |
8292 uint32 immediate_data_size, const cmds::TexSubImage2D& c) { | 8273 uint32 immediate_data_size, const cmds::TexSubImage2D& c) { |
8293 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexSubImage2D"); | 8274 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexSubImage2D"); |
8294 GLboolean internal = static_cast<GLboolean>(c.internal); | 8275 GLboolean internal = static_cast<GLboolean>(c.internal); |
8295 if (internal == GL_TRUE && tex_image_2d_failed_) | 8276 if (internal == GL_TRUE && tex_image_2d_failed_) |
8296 return error::kNoError; | 8277 return error::kNoError; |
8297 | 8278 |
(...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9299 } | 9280 } |
9300 | 9281 |
9301 uint32 client_id = c.client_id; | 9282 uint32 client_id = c.client_id; |
9302 typedef cmds::CreateStreamTextureCHROMIUM::Result Result; | 9283 typedef cmds::CreateStreamTextureCHROMIUM::Result Result; |
9303 Result* result = GetSharedMemoryAs<Result*>( | 9284 Result* result = GetSharedMemoryAs<Result*>( |
9304 c.result_shm_id, c.result_shm_offset, sizeof(*result)); | 9285 c.result_shm_id, c.result_shm_offset, sizeof(*result)); |
9305 | 9286 |
9306 if (!result) | 9287 if (!result) |
9307 return error::kOutOfBounds; | 9288 return error::kOutOfBounds; |
9308 *result = GL_ZERO; | 9289 *result = GL_ZERO; |
9309 Texture* info = | 9290 Texture* texture = texture_manager()->GetTexture(client_id); |
9310 texture_manager()->GetTexture(client_id); | 9291 if (!texture) { |
9311 if (!info) { | |
9312 SetGLError(GL_INVALID_VALUE, | 9292 SetGLError(GL_INVALID_VALUE, |
9313 "glCreateStreamTextureCHROMIUM", "" | 9293 "glCreateStreamTextureCHROMIUM", "" |
9314 "bad texture id."); | 9294 "bad texture id."); |
9315 return error::kNoError; | 9295 return error::kNoError; |
9316 } | 9296 } |
9317 | 9297 |
9318 if (info->IsStreamTexture()) { | 9298 if (texture->IsStreamTexture()) { |
9319 SetGLError(GL_INVALID_OPERATION, | 9299 SetGLError(GL_INVALID_OPERATION, |
9320 "glCreateStreamTextureCHROMIUM", "" | 9300 "glCreateStreamTextureCHROMIUM", "" |
9321 "is already a stream texture."); | 9301 "is already a stream texture."); |
9322 return error::kNoError; | 9302 return error::kNoError; |
9323 } | 9303 } |
9324 | 9304 |
9325 if (info->target() && info->target() != GL_TEXTURE_EXTERNAL_OES) { | 9305 if (texture->target() && texture->target() != GL_TEXTURE_EXTERNAL_OES) { |
9326 SetGLError(GL_INVALID_OPERATION, | 9306 SetGLError(GL_INVALID_OPERATION, |
9327 "glCreateStreamTextureCHROMIUM", "" | 9307 "glCreateStreamTextureCHROMIUM", "" |
9328 "is already bound to incompatible target."); | 9308 "is already bound to incompatible target."); |
9329 return error::kNoError; | 9309 return error::kNoError; |
9330 } | 9310 } |
9331 | 9311 |
9332 if (!stream_texture_manager_) | 9312 if (!stream_texture_manager_) |
9333 return error::kInvalidArguments; | 9313 return error::kInvalidArguments; |
9334 | 9314 |
9335 GLuint object_id = stream_texture_manager_->CreateStreamTexture( | 9315 GLuint object_id = stream_texture_manager_->CreateStreamTexture( |
9336 info->service_id(), client_id); | 9316 texture->service_id(), client_id); |
9337 | 9317 |
9338 if (object_id) { | 9318 if (object_id) { |
9339 info->SetStreamTexture(true); | 9319 texture->SetStreamTexture(true); |
9340 } else { | 9320 } else { |
9341 SetGLError(GL_OUT_OF_MEMORY, | 9321 SetGLError(GL_OUT_OF_MEMORY, |
9342 "glCreateStreamTextureCHROMIUM", "" | 9322 "glCreateStreamTextureCHROMIUM", "" |
9343 "failed to create platform texture."); | 9323 "failed to create platform texture."); |
9344 } | 9324 } |
9345 | 9325 |
9346 *result = object_id; | 9326 *result = object_id; |
9347 return error::kNoError; | 9327 return error::kNoError; |
9348 } | 9328 } |
9349 | 9329 |
9350 error::Error GLES2DecoderImpl::HandleDestroyStreamTextureCHROMIUM( | 9330 error::Error GLES2DecoderImpl::HandleDestroyStreamTextureCHROMIUM( |
9351 uint32 immediate_data_size, | 9331 uint32 immediate_data_size, |
9352 const cmds::DestroyStreamTextureCHROMIUM& c) { | 9332 const cmds::DestroyStreamTextureCHROMIUM& c) { |
9353 GLuint client_id = c.texture; | 9333 GLuint client_id = c.texture; |
9354 Texture* info = | 9334 Texture* texture = texture_manager()->GetTexture(client_id); |
9355 texture_manager()->GetTexture(client_id); | 9335 if (texture && texture->IsStreamTexture()) { |
9356 if (info && info->IsStreamTexture()) { | |
9357 if (!stream_texture_manager_) | 9336 if (!stream_texture_manager_) |
9358 return error::kInvalidArguments; | 9337 return error::kInvalidArguments; |
9359 | 9338 |
9360 stream_texture_manager_->DestroyStreamTexture(info->service_id()); | 9339 stream_texture_manager_->DestroyStreamTexture(texture->service_id()); |
9361 info->SetStreamTexture(false); | 9340 texture->SetStreamTexture(false); |
9362 } else { | 9341 } else { |
9363 SetGLError(GL_INVALID_VALUE, | 9342 SetGLError(GL_INVALID_VALUE, |
9364 "glDestroyStreamTextureCHROMIUM", "bad texture id."); | 9343 "glDestroyStreamTextureCHROMIUM", "bad texture id."); |
9365 } | 9344 } |
9366 | 9345 |
9367 return error::kNoError; | 9346 return error::kNoError; |
9368 } | 9347 } |
9369 | 9348 |
9370 #if defined(OS_MACOSX) | 9349 #if defined(OS_MACOSX) |
9371 void GLES2DecoderImpl::ReleaseIOSurfaceForTexture(GLuint texture_id) { | 9350 void GLES2DecoderImpl::ReleaseIOSurfaceForTexture(GLuint texture_id) { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9405 // know what's going on. | 9384 // know what's going on. |
9406 SetGLError( | 9385 SetGLError( |
9407 GL_INVALID_OPERATION, | 9386 GL_INVALID_OPERATION, |
9408 "glTexImageIOSurface2DCHROMIUM", | 9387 "glTexImageIOSurface2DCHROMIUM", |
9409 "requires TEXTURE_RECTANGLE_ARB target"); | 9388 "requires TEXTURE_RECTANGLE_ARB target"); |
9410 return; | 9389 return; |
9411 } | 9390 } |
9412 | 9391 |
9413 // Default target might be conceptually valid, but disallow it to avoid | 9392 // Default target might be conceptually valid, but disallow it to avoid |
9414 // accidents. | 9393 // accidents. |
9415 Texture* info = GetTextureInfoForTargetUnlessDefault( | 9394 Texture* texture = GetTextureInfoForTargetUnlessDefault(target); |
9416 target); | 9395 if (!texture) { |
9417 if (!info) { | |
9418 SetGLError(GL_INVALID_OPERATION, | 9396 SetGLError(GL_INVALID_OPERATION, |
9419 "glTexImageIOSurface2DCHROMIUM", "no rectangle texture bound"); | 9397 "glTexImageIOSurface2DCHROMIUM", "no rectangle texture bound"); |
9420 return; | 9398 return; |
9421 } | 9399 } |
9422 | 9400 |
9423 // Look up the new IOSurface. Note that because of asynchrony | 9401 // Look up the new IOSurface. Note that because of asynchrony |
9424 // between processes this might fail; during live resizing the | 9402 // between processes this might fail; during live resizing the |
9425 // plugin process might allocate and release an IOSurface before | 9403 // plugin process might allocate and release an IOSurface before |
9426 // this process gets a chance to look it up. Hold on to any old | 9404 // this process gets a chance to look it up. Hold on to any old |
9427 // IOSurface in this case. | 9405 // IOSurface in this case. |
9428 CFTypeRef surface = surface_support->IOSurfaceLookup(io_surface_id); | 9406 CFTypeRef surface = surface_support->IOSurfaceLookup(io_surface_id); |
9429 if (!surface) { | 9407 if (!surface) { |
9430 SetGLError( | 9408 SetGLError( |
9431 GL_INVALID_OPERATION, | 9409 GL_INVALID_OPERATION, |
9432 "glTexImageIOSurface2DCHROMIUM", "no IOSurface with the given ID"); | 9410 "glTexImageIOSurface2DCHROMIUM", "no IOSurface with the given ID"); |
9433 return; | 9411 return; |
9434 } | 9412 } |
9435 | 9413 |
9436 // Release any IOSurface previously bound to this texture. | 9414 // Release any IOSurface previously bound to this texture. |
9437 ReleaseIOSurfaceForTexture(info->service_id()); | 9415 ReleaseIOSurfaceForTexture(texture->service_id()); |
9438 | 9416 |
9439 // Make sure we release the IOSurface even if CGLTexImageIOSurface2D fails. | 9417 // Make sure we release the IOSurface even if CGLTexImageIOSurface2D fails. |
9440 texture_to_io_surface_map_.insert( | 9418 texture_to_io_surface_map_.insert( |
9441 std::make_pair(info->service_id(), surface)); | 9419 std::make_pair(texture->service_id(), surface)); |
9442 | 9420 |
9443 CGLContextObj context = | 9421 CGLContextObj context = |
9444 static_cast<CGLContextObj>(context_->GetHandle()); | 9422 static_cast<CGLContextObj>(context_->GetHandle()); |
9445 | 9423 |
9446 CGLError err = surface_support->CGLTexImageIOSurface2D( | 9424 CGLError err = surface_support->CGLTexImageIOSurface2D( |
9447 context, | 9425 context, |
9448 target, | 9426 target, |
9449 GL_RGBA, | 9427 GL_RGBA, |
9450 width, | 9428 width, |
9451 height, | 9429 height, |
9452 GL_BGRA, | 9430 GL_BGRA, |
9453 GL_UNSIGNED_INT_8_8_8_8_REV, | 9431 GL_UNSIGNED_INT_8_8_8_8_REV, |
9454 surface, | 9432 surface, |
9455 plane); | 9433 plane); |
9456 | 9434 |
9457 if (err != kCGLNoError) { | 9435 if (err != kCGLNoError) { |
9458 SetGLError( | 9436 SetGLError( |
9459 GL_INVALID_OPERATION, | 9437 GL_INVALID_OPERATION, |
9460 "glTexImageIOSurface2DCHROMIUM", "error in CGLTexImageIOSurface2D"); | 9438 "glTexImageIOSurface2DCHROMIUM", "error in CGLTexImageIOSurface2D"); |
9461 return; | 9439 return; |
9462 } | 9440 } |
9463 | 9441 |
9464 texture_manager()->SetLevelInfo( | 9442 texture_manager()->SetLevelInfo( |
9465 info, target, 0, GL_RGBA, width, height, 1, 0, | 9443 texture, target, 0, GL_RGBA, width, height, 1, 0, |
9466 GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, true); | 9444 GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, true); |
9467 | 9445 |
9468 #else | 9446 #else |
9469 SetGLError(GL_INVALID_OPERATION, | 9447 SetGLError(GL_INVALID_OPERATION, |
9470 "glTexImageIOSurface2DCHROMIUM", "not supported."); | 9448 "glTexImageIOSurface2DCHROMIUM", "not supported."); |
9471 #endif | 9449 #endif |
9472 } | 9450 } |
9473 | 9451 |
9474 static GLenum ExtractFormatFromStorageFormat(GLenum internalformat) { | 9452 static GLenum ExtractFormatFromStorageFormat(GLenum internalformat) { |
9475 switch (internalformat) { | 9453 switch (internalformat) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9512 case GL_BGRA8_EXT: | 9490 case GL_BGRA8_EXT: |
9513 return GL_BGRA_EXT; | 9491 return GL_BGRA_EXT; |
9514 default: | 9492 default: |
9515 return GL_NONE; | 9493 return GL_NONE; |
9516 } | 9494 } |
9517 } | 9495 } |
9518 | 9496 |
9519 void GLES2DecoderImpl::DoCopyTextureCHROMIUM( | 9497 void GLES2DecoderImpl::DoCopyTextureCHROMIUM( |
9520 GLenum target, GLuint source_id, GLuint dest_id, GLint level, | 9498 GLenum target, GLuint source_id, GLuint dest_id, GLint level, |
9521 GLenum internal_format) { | 9499 GLenum internal_format) { |
9522 Texture* dest_info = GetTexture(dest_id); | 9500 Texture* dest_texture = GetTexture(dest_id); |
9523 Texture* source_info = GetTexture(source_id); | 9501 Texture* source_texture = GetTexture(source_id); |
9524 | 9502 |
9525 if (!source_info || !dest_info) { | 9503 if (!source_texture || !dest_texture) { |
9526 SetGLError(GL_INVALID_VALUE, "glCopyTextureCHROMIUM", "unknown texture id"); | 9504 SetGLError(GL_INVALID_VALUE, "glCopyTextureCHROMIUM", "unknown texture id"); |
9527 return; | 9505 return; |
9528 } | 9506 } |
9529 | 9507 |
9530 if (GL_TEXTURE_2D != target) { | 9508 if (GL_TEXTURE_2D != target) { |
9531 SetGLError(GL_INVALID_VALUE, | 9509 SetGLError(GL_INVALID_VALUE, |
9532 "glCopyTextureCHROMIUM", "invalid texture target"); | 9510 "glCopyTextureCHROMIUM", "invalid texture target"); |
9533 return; | 9511 return; |
9534 } | 9512 } |
9535 | 9513 |
9536 if (dest_info->target() != GL_TEXTURE_2D || | 9514 if (dest_texture->target() != GL_TEXTURE_2D || |
9537 source_info->target() != GL_TEXTURE_2D) { | 9515 source_texture->target() != GL_TEXTURE_2D) { |
9538 SetGLError(GL_INVALID_VALUE, | 9516 SetGLError(GL_INVALID_VALUE, |
9539 "glCopyTextureCHROMIUM", "invalid texture target binding"); | 9517 "glCopyTextureCHROMIUM", "invalid texture target binding"); |
9540 return; | 9518 return; |
9541 } | 9519 } |
9542 | 9520 |
9543 int source_width, source_height, dest_width, dest_height; | 9521 int source_width, source_height, dest_width, dest_height; |
9544 if (!source_info->GetLevelSize(GL_TEXTURE_2D, 0, &source_width, | 9522 if (!source_texture->GetLevelSize(GL_TEXTURE_2D, 0, &source_width, |
9545 &source_height)) { | 9523 &source_height)) { |
9546 SetGLError(GL_INVALID_VALUE, | 9524 SetGLError(GL_INVALID_VALUE, |
9547 "glCopyTextureChromium", "source texture has no level 0"); | 9525 "glCopyTextureChromium", "source texture has no level 0"); |
9548 return; | 9526 return; |
9549 } | 9527 } |
9550 | 9528 |
9551 // Check that this type of texture is allowed. | 9529 // Check that this type of texture is allowed. |
9552 if (!texture_manager()->ValidForTarget(GL_TEXTURE_2D, level, source_width, | 9530 if (!texture_manager()->ValidForTarget(GL_TEXTURE_2D, level, source_width, |
9553 source_height, 1)) { | 9531 source_height, 1)) { |
9554 SetGLError(GL_INVALID_VALUE, | 9532 SetGLError(GL_INVALID_VALUE, |
9555 "glCopyTextureCHROMIUM", "Bad dimensions"); | 9533 "glCopyTextureCHROMIUM", "Bad dimensions"); |
9556 return; | 9534 return; |
9557 } | 9535 } |
9558 | 9536 |
9559 // Defer initializing the CopyTextureCHROMIUMResourceManager until it is | 9537 // Defer initializing the CopyTextureCHROMIUMResourceManager until it is |
9560 // needed because it takes 10s of milliseconds to initialize. | 9538 // needed because it takes 10s of milliseconds to initialize. |
9561 if (!copy_texture_CHROMIUM_.get()) { | 9539 if (!copy_texture_CHROMIUM_.get()) { |
9562 CopyRealGLErrorsToWrapper(); | 9540 CopyRealGLErrorsToWrapper(); |
9563 copy_texture_CHROMIUM_.reset(new CopyTextureCHROMIUMResourceManager()); | 9541 copy_texture_CHROMIUM_.reset(new CopyTextureCHROMIUMResourceManager()); |
9564 copy_texture_CHROMIUM_->Initialize(this); | 9542 copy_texture_CHROMIUM_->Initialize(this); |
9565 RestoreCurrentFramebufferBindings(); | 9543 RestoreCurrentFramebufferBindings(); |
9566 if (PeekGLError() != GL_NO_ERROR) | 9544 if (PeekGLError() != GL_NO_ERROR) |
9567 return; | 9545 return; |
9568 } | 9546 } |
9569 | 9547 |
9570 GLenum dest_type; | 9548 GLenum dest_type; |
9571 GLenum dest_internal_format; | 9549 GLenum dest_internal_format; |
9572 bool dest_level_defined = dest_info->GetLevelSize(GL_TEXTURE_2D, level, | 9550 bool dest_level_defined = dest_texture->GetLevelSize( |
9573 &dest_width, | 9551 GL_TEXTURE_2D, level, &dest_width, &dest_height); |
9574 &dest_height); | |
9575 | 9552 |
9576 if (dest_level_defined) { | 9553 if (dest_level_defined) { |
9577 dest_info->GetLevelType(GL_TEXTURE_2D, level, &dest_type, | 9554 dest_texture->GetLevelType(GL_TEXTURE_2D, level, &dest_type, |
9578 &dest_internal_format); | 9555 &dest_internal_format); |
9579 } else { | 9556 } else { |
9580 GLenum source_internal_format; | 9557 GLenum source_internal_format; |
9581 source_info->GetLevelType(GL_TEXTURE_2D, 0, &dest_type, | 9558 source_texture->GetLevelType(GL_TEXTURE_2D, 0, &dest_type, |
9582 &source_internal_format); | 9559 &source_internal_format); |
9583 } | 9560 } |
9584 | 9561 |
9585 // Resize the destination texture to the dimensions of the source texture. | 9562 // Resize the destination texture to the dimensions of the source texture. |
9586 if (!dest_level_defined || dest_width != source_width || | 9563 if (!dest_level_defined || dest_width != source_width || |
9587 dest_height != source_height || | 9564 dest_height != source_height || |
9588 dest_internal_format != internal_format) { | 9565 dest_internal_format != internal_format) { |
9589 // Ensure that the glTexImage2D succeeds. | 9566 // Ensure that the glTexImage2D succeeds. |
9590 CopyRealGLErrorsToWrapper(); | 9567 CopyRealGLErrorsToWrapper(); |
9591 glBindTexture(GL_TEXTURE_2D, dest_info->service_id()); | 9568 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); |
9592 WrappedTexImage2D( | 9569 WrappedTexImage2D( |
9593 GL_TEXTURE_2D, level, internal_format, source_width, source_height, | 9570 GL_TEXTURE_2D, level, internal_format, source_width, source_height, |
9594 0, internal_format, dest_type, NULL); | 9571 0, internal_format, dest_type, NULL); |
9595 GLenum error = PeekGLError(); | 9572 GLenum error = PeekGLError(); |
9596 if (error != GL_NO_ERROR) { | 9573 if (error != GL_NO_ERROR) { |
9597 RestoreCurrentTexture2DBindings(); | 9574 RestoreCurrentTexture2DBindings(); |
9598 return; | 9575 return; |
9599 } | 9576 } |
9600 | 9577 |
9601 texture_manager()->SetLevelInfo( | 9578 texture_manager()->SetLevelInfo( |
9602 dest_info, GL_TEXTURE_2D, level, internal_format, source_width, | 9579 dest_texture, GL_TEXTURE_2D, level, internal_format, source_width, |
9603 source_height, 1, 0, internal_format, dest_type, true); | 9580 source_height, 1, 0, internal_format, dest_type, true); |
9604 } else { | 9581 } else { |
9605 texture_manager()->SetLevelCleared(dest_info, GL_TEXTURE_2D, level, true); | 9582 texture_manager()->SetLevelCleared( |
| 9583 dest_texture, GL_TEXTURE_2D, level, true); |
9606 } | 9584 } |
9607 | 9585 |
9608 copy_texture_CHROMIUM_->DoCopyTexture(this, | 9586 copy_texture_CHROMIUM_->DoCopyTexture(this, |
9609 source_info->target(), | 9587 source_texture->target(), |
9610 dest_info->target(), | 9588 dest_texture->target(), |
9611 source_info->service_id(), | 9589 source_texture->service_id(), |
9612 dest_info->service_id(), level, | 9590 dest_texture->service_id(), level, |
9613 source_width, source_height, | 9591 source_width, source_height, |
9614 unpack_flip_y_, | 9592 unpack_flip_y_, |
9615 unpack_premultiply_alpha_, | 9593 unpack_premultiply_alpha_, |
9616 unpack_unpremultiply_alpha_); | 9594 unpack_unpremultiply_alpha_); |
9617 } | 9595 } |
9618 | 9596 |
9619 static GLenum ExtractTypeFromStorageFormat(GLenum internalformat) { | 9597 static GLenum ExtractTypeFromStorageFormat(GLenum internalformat) { |
9620 switch (internalformat) { | 9598 switch (internalformat) { |
9621 case GL_RGB565: | 9599 case GL_RGB565: |
9622 return GL_UNSIGNED_SHORT_5_6_5; | 9600 return GL_UNSIGNED_SHORT_5_6_5; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9667 GLenum internal_format, | 9645 GLenum internal_format, |
9668 GLsizei width, | 9646 GLsizei width, |
9669 GLsizei height) { | 9647 GLsizei height) { |
9670 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoTexStorage2DEXT"); | 9648 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoTexStorage2DEXT"); |
9671 if (!texture_manager()->ValidForTarget(target, 0, width, height, 1) || | 9649 if (!texture_manager()->ValidForTarget(target, 0, width, height, 1) || |
9672 TextureManager::ComputeMipMapCount(width, height, 1) < levels) { | 9650 TextureManager::ComputeMipMapCount(width, height, 1) < levels) { |
9673 SetGLError( | 9651 SetGLError( |
9674 GL_INVALID_VALUE, "glTexStorage2DEXT", "dimensions out of range"); | 9652 GL_INVALID_VALUE, "glTexStorage2DEXT", "dimensions out of range"); |
9675 return; | 9653 return; |
9676 } | 9654 } |
9677 Texture* info = GetTextureInfoForTarget(target); | 9655 Texture* texture = GetTextureInfoForTarget(target); |
9678 if (!info) { | 9656 if (!texture) { |
9679 SetGLError(GL_INVALID_OPERATION, | 9657 SetGLError(GL_INVALID_OPERATION, |
9680 "glTexStorage2DEXT", "unknown texture for target"); | 9658 "glTexStorage2DEXT", "unknown texture for target"); |
9681 return; | 9659 return; |
9682 } | 9660 } |
9683 if (info->IsAttachedToFramebuffer()) { | 9661 if (texture->IsAttachedToFramebuffer()) { |
9684 clear_state_dirty_ = true; | 9662 clear_state_dirty_ = true; |
9685 } | 9663 } |
9686 if (info->IsImmutable()) { | 9664 if (texture->IsImmutable()) { |
9687 SetGLError(GL_INVALID_OPERATION, | 9665 SetGLError(GL_INVALID_OPERATION, |
9688 "glTexStorage2DEXT", "texture is immutable"); | 9666 "glTexStorage2DEXT", "texture is immutable"); |
9689 return; | 9667 return; |
9690 } | 9668 } |
9691 | 9669 |
9692 GLenum format = ExtractFormatFromStorageFormat(internal_format); | 9670 GLenum format = ExtractFormatFromStorageFormat(internal_format); |
9693 GLenum type = ExtractTypeFromStorageFormat(internal_format); | 9671 GLenum type = ExtractTypeFromStorageFormat(internal_format); |
9694 | 9672 |
9695 { | 9673 { |
9696 GLsizei level_width = width; | 9674 GLsizei level_width = width; |
(...skipping 20 matching lines...) Expand all Loading... |
9717 | 9695 |
9718 CopyRealGLErrorsToWrapper(); | 9696 CopyRealGLErrorsToWrapper(); |
9719 glTexStorage2DEXT(target, levels, GetTexInternalFormat(internal_format), | 9697 glTexStorage2DEXT(target, levels, GetTexInternalFormat(internal_format), |
9720 width, height); | 9698 width, height); |
9721 GLenum error = PeekGLError(); | 9699 GLenum error = PeekGLError(); |
9722 if (error == GL_NO_ERROR) { | 9700 if (error == GL_NO_ERROR) { |
9723 GLsizei level_width = width; | 9701 GLsizei level_width = width; |
9724 GLsizei level_height = height; | 9702 GLsizei level_height = height; |
9725 for (int ii = 0; ii < levels; ++ii) { | 9703 for (int ii = 0; ii < levels; ++ii) { |
9726 texture_manager()->SetLevelInfo( | 9704 texture_manager()->SetLevelInfo( |
9727 info, target, ii, format, level_width, level_height, 1, 0, format, | 9705 texture, target, ii, format, level_width, level_height, 1, 0, format, |
9728 type, false); | 9706 type, false); |
9729 level_width = std::max(1, level_width >> 1); | 9707 level_width = std::max(1, level_width >> 1); |
9730 level_height = std::max(1, level_height >> 1); | 9708 level_height = std::max(1, level_height >> 1); |
9731 } | 9709 } |
9732 info->SetImmutable(true); | 9710 texture->SetImmutable(true); |
9733 } | 9711 } |
9734 } | 9712 } |
9735 | 9713 |
9736 error::Error GLES2DecoderImpl::HandleGenMailboxCHROMIUM( | 9714 error::Error GLES2DecoderImpl::HandleGenMailboxCHROMIUM( |
9737 uint32 immediate_data_size, const cmds::GenMailboxCHROMIUM& c) { | 9715 uint32 immediate_data_size, const cmds::GenMailboxCHROMIUM& c) { |
9738 MailboxName name; | 9716 MailboxName name; |
9739 mailbox_manager()->GenerateMailboxName(&name); | 9717 mailbox_manager()->GenerateMailboxName(&name); |
9740 uint32 bucket_id = static_cast<uint32>(c.bucket_id); | 9718 uint32 bucket_id = static_cast<uint32>(c.bucket_id); |
9741 Bucket* bucket = CreateBucket(bucket_id); | 9719 Bucket* bucket = CreateBucket(bucket_id); |
9742 | 9720 |
9743 bucket->SetSize(GL_MAILBOX_SIZE_CHROMIUM); | 9721 bucket->SetSize(GL_MAILBOX_SIZE_CHROMIUM); |
9744 bucket->SetData(&name, 0, GL_MAILBOX_SIZE_CHROMIUM); | 9722 bucket->SetData(&name, 0, GL_MAILBOX_SIZE_CHROMIUM); |
9745 | 9723 |
9746 return error::kNoError; | 9724 return error::kNoError; |
9747 } | 9725 } |
9748 | 9726 |
9749 void GLES2DecoderImpl::DoProduceTextureCHROMIUM(GLenum target, | 9727 void GLES2DecoderImpl::DoProduceTextureCHROMIUM(GLenum target, |
9750 const GLbyte* mailbox) { | 9728 const GLbyte* mailbox) { |
9751 Texture* info = GetTextureInfoForTarget(target); | 9729 Texture* texture = GetTextureInfoForTarget(target); |
9752 if (!info) { | 9730 if (!texture) { |
9753 SetGLError(GL_INVALID_OPERATION, | 9731 SetGLError(GL_INVALID_OPERATION, |
9754 "glProduceTextureCHROMIUM", "unknown texture for target"); | 9732 "glProduceTextureCHROMIUM", "unknown texture for target"); |
9755 return; | 9733 return; |
9756 } | 9734 } |
9757 | 9735 |
9758 TextureDefinition* definition = texture_manager()->Save(info); | 9736 TextureDefinition* definition = texture_manager()->Save(texture); |
9759 if (!definition) { | 9737 if (!definition) { |
9760 SetGLError(GL_INVALID_OPERATION, | 9738 SetGLError(GL_INVALID_OPERATION, |
9761 "glProduceTextureCHROMIUM", "invalid texture"); | 9739 "glProduceTextureCHROMIUM", "invalid texture"); |
9762 return; | 9740 return; |
9763 } | 9741 } |
9764 | 9742 |
9765 if (!group_->mailbox_manager()->ProduceTexture( | 9743 if (!group_->mailbox_manager()->ProduceTexture( |
9766 target, | 9744 target, |
9767 *reinterpret_cast<const MailboxName*>(mailbox), | 9745 *reinterpret_cast<const MailboxName*>(mailbox), |
9768 definition, | 9746 definition, |
9769 texture_manager())) { | 9747 texture_manager())) { |
9770 bool success = texture_manager()->Restore(info, definition); | 9748 bool success = texture_manager()->Restore( |
| 9749 "glProductTextureCHROMIUM", this, texture, definition); |
9771 DCHECK(success); | 9750 DCHECK(success); |
9772 SetGLError(GL_INVALID_OPERATION, | 9751 SetGLError(GL_INVALID_OPERATION, |
9773 "glProduceTextureCHROMIUM", "invalid mailbox name"); | 9752 "glProduceTextureCHROMIUM", "invalid mailbox name"); |
9774 return; | 9753 return; |
9775 } | 9754 } |
9776 | 9755 |
9777 glBindTexture(info->target(), info->service_id()); | 9756 glBindTexture(texture->target(), texture->service_id()); |
9778 } | 9757 } |
9779 | 9758 |
9780 void GLES2DecoderImpl::DoConsumeTextureCHROMIUM(GLenum target, | 9759 void GLES2DecoderImpl::DoConsumeTextureCHROMIUM(GLenum target, |
9781 const GLbyte* mailbox) { | 9760 const GLbyte* mailbox) { |
9782 Texture* info = GetTextureInfoForTarget(target); | 9761 Texture* texture = GetTextureInfoForTarget(target); |
9783 if (!info) { | 9762 if (!texture) { |
9784 SetGLError(GL_INVALID_OPERATION, | 9763 SetGLError(GL_INVALID_OPERATION, |
9785 "glConsumeTextureCHROMIUM", "unknown texture for target"); | 9764 "glConsumeTextureCHROMIUM", "unknown texture for target"); |
9786 return; | 9765 return; |
9787 } | 9766 } |
9788 | 9767 |
9789 scoped_ptr<TextureDefinition> definition( | 9768 scoped_ptr<TextureDefinition> definition( |
9790 group_->mailbox_manager()->ConsumeTexture( | 9769 group_->mailbox_manager()->ConsumeTexture( |
9791 target, | 9770 target, |
9792 *reinterpret_cast<const MailboxName*>(mailbox))); | 9771 *reinterpret_cast<const MailboxName*>(mailbox))); |
9793 if (!definition.get()) { | 9772 if (!definition.get()) { |
9794 SetGLError(GL_INVALID_OPERATION, | 9773 SetGLError(GL_INVALID_OPERATION, |
9795 "glConsumeTextureCHROMIUM", "invalid mailbox name"); | 9774 "glConsumeTextureCHROMIUM", "invalid mailbox name"); |
9796 return; | 9775 return; |
9797 } | 9776 } |
9798 | 9777 |
9799 if (!texture_manager()->Restore(info, definition.release())) { | 9778 if (!texture_manager()->Restore( |
| 9779 "glConsumeTextureCHROMIUM", this, texture, definition.release())) { |
9800 SetGLError(GL_INVALID_OPERATION, | 9780 SetGLError(GL_INVALID_OPERATION, |
9801 "glConsumeTextureCHROMIUM", "invalid texture"); | 9781 "glConsumeTextureCHROMIUM", "invalid texture"); |
9802 return; | 9782 return; |
9803 } | 9783 } |
9804 | |
9805 glBindTexture(info->target(), info->service_id()); | |
9806 } | 9784 } |
9807 | 9785 |
9808 void GLES2DecoderImpl::DoInsertEventMarkerEXT( | 9786 void GLES2DecoderImpl::DoInsertEventMarkerEXT( |
9809 GLsizei length, const GLchar* marker) { | 9787 GLsizei length, const GLchar* marker) { |
9810 if (!marker) { | 9788 if (!marker) { |
9811 marker = ""; | 9789 marker = ""; |
9812 } | 9790 } |
9813 debug_marker_manager_.SetMarker( | 9791 debug_marker_manager_.SetMarker( |
9814 length ? std::string(marker, length) : std::string(marker)); | 9792 length ? std::string(marker, length) : std::string(marker)); |
9815 } | 9793 } |
(...skipping 17 matching lines...) Expand all Loading... |
9833 if (target != GL_TEXTURE_2D) { | 9811 if (target != GL_TEXTURE_2D) { |
9834 // This might be supported in the future. | 9812 // This might be supported in the future. |
9835 SetGLError( | 9813 SetGLError( |
9836 GL_INVALID_OPERATION, | 9814 GL_INVALID_OPERATION, |
9837 "glBindTexImage2DCHROMIUM", "requires TEXTURE_2D target"); | 9815 "glBindTexImage2DCHROMIUM", "requires TEXTURE_2D target"); |
9838 return; | 9816 return; |
9839 } | 9817 } |
9840 | 9818 |
9841 // Default target might be conceptually valid, but disallow it to avoid | 9819 // Default target might be conceptually valid, but disallow it to avoid |
9842 // accidents. | 9820 // accidents. |
9843 Texture* info = GetTextureInfoForTargetUnlessDefault( | 9821 Texture* texture = GetTextureInfoForTargetUnlessDefault(target); |
9844 target); | 9822 if (!texture) { |
9845 if (!info) { | |
9846 SetGLError(GL_INVALID_OPERATION, | 9823 SetGLError(GL_INVALID_OPERATION, |
9847 "glBindTexImage2DCHROMIUM", "no texture bound"); | 9824 "glBindTexImage2DCHROMIUM", "no texture bound"); |
9848 return; | 9825 return; |
9849 } | 9826 } |
9850 | 9827 |
9851 gfx::GLImage* gl_image = image_manager()->LookupImage(image_id); | 9828 gfx::GLImage* gl_image = image_manager()->LookupImage(image_id); |
9852 if (!gl_image) { | 9829 if (!gl_image) { |
9853 SetGLError(GL_INVALID_OPERATION, | 9830 SetGLError(GL_INVALID_OPERATION, |
9854 "glBindTexImage2DCHROMIUM", | 9831 "glBindTexImage2DCHROMIUM", |
9855 "no image found with the given ID"); | 9832 "no image found with the given ID"); |
9856 return; | 9833 return; |
9857 } | 9834 } |
9858 | 9835 |
9859 if (!gl_image->BindTexImage()) { | 9836 if (!gl_image->BindTexImage()) { |
9860 SetGLError(GL_INVALID_OPERATION, | 9837 SetGLError(GL_INVALID_OPERATION, |
9861 "glBindTexImage2DCHROMIUM", | 9838 "glBindTexImage2DCHROMIUM", |
9862 "fail to bind image with the given ID"); | 9839 "fail to bind image with the given ID"); |
9863 return; | 9840 return; |
9864 } | 9841 } |
9865 | 9842 |
9866 gfx::Size size = gl_image->GetSize(); | 9843 gfx::Size size = gl_image->GetSize(); |
9867 texture_manager()->SetLevelInfo( | 9844 texture_manager()->SetLevelInfo( |
9868 info, target, 0, GL_RGBA, size.width(), size.height(), 1, 0, | 9845 texture, target, 0, GL_RGBA, size.width(), size.height(), 1, 0, |
9869 GL_RGBA, GL_UNSIGNED_BYTE, true); | 9846 GL_RGBA, GL_UNSIGNED_BYTE, true); |
9870 texture_manager()->SetLevelImage(info, target, 0, gl_image); | 9847 texture_manager()->SetLevelImage(texture, target, 0, gl_image); |
9871 } | 9848 } |
9872 | 9849 |
9873 void GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM( | 9850 void GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM( |
9874 GLenum target, GLint image_id) { | 9851 GLenum target, GLint image_id) { |
9875 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM"); | 9852 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM"); |
9876 if (target != GL_TEXTURE_2D) { | 9853 if (target != GL_TEXTURE_2D) { |
9877 // This might be supported in the future. | 9854 // This might be supported in the future. |
9878 SetGLError( | 9855 SetGLError( |
9879 GL_INVALID_OPERATION, | 9856 GL_INVALID_OPERATION, |
9880 "glReleaseTexImage2DCHROMIUM", "requires TEXTURE_2D target"); | 9857 "glReleaseTexImage2DCHROMIUM", "requires TEXTURE_2D target"); |
9881 return; | 9858 return; |
9882 } | 9859 } |
9883 | 9860 |
9884 // Default target might be conceptually valid, but disallow it to avoid | 9861 // Default target might be conceptually valid, but disallow it to avoid |
9885 // accidents. | 9862 // accidents. |
9886 Texture* info = GetTextureInfoForTargetUnlessDefault( | 9863 Texture* texture = GetTextureInfoForTargetUnlessDefault(target); |
9887 target); | 9864 if (!texture) { |
9888 if (!info) { | |
9889 SetGLError(GL_INVALID_OPERATION, | 9865 SetGLError(GL_INVALID_OPERATION, |
9890 "glReleaseTexImage2DCHROMIUM", "no texture bound"); | 9866 "glReleaseTexImage2DCHROMIUM", "no texture bound"); |
9891 return; | 9867 return; |
9892 } | 9868 } |
9893 | 9869 |
9894 gfx::GLImage* gl_image = image_manager()->LookupImage(image_id); | 9870 gfx::GLImage* gl_image = image_manager()->LookupImage(image_id); |
9895 if (!gl_image) { | 9871 if (!gl_image) { |
9896 SetGLError(GL_INVALID_OPERATION, | 9872 SetGLError(GL_INVALID_OPERATION, |
9897 "glReleaseTexImage2DCHROMIUM", | 9873 "glReleaseTexImage2DCHROMIUM", |
9898 "no image found with the given ID"); | 9874 "no image found with the given ID"); |
9899 return; | 9875 return; |
9900 } | 9876 } |
9901 | 9877 |
9902 // Do nothing when image is not currently bound. | 9878 // Do nothing when image is not currently bound. |
9903 if (info->GetLevelImage(target, 0) != gl_image) | 9879 if (texture->GetLevelImage(target, 0) != gl_image) |
9904 return; | 9880 return; |
9905 | 9881 |
9906 gl_image->ReleaseTexImage(); | 9882 gl_image->ReleaseTexImage(); |
9907 | 9883 |
9908 texture_manager()->SetLevelInfo( | 9884 texture_manager()->SetLevelInfo( |
9909 info, target, 0, GL_RGBA, 0, 0, 1, 0, | 9885 texture, target, 0, GL_RGBA, 0, 0, 1, 0, |
9910 GL_RGBA, GL_UNSIGNED_BYTE, false); | 9886 GL_RGBA, GL_UNSIGNED_BYTE, false); |
9911 } | 9887 } |
9912 | 9888 |
9913 error::Error GLES2DecoderImpl::HandleTraceBeginCHROMIUM( | 9889 error::Error GLES2DecoderImpl::HandleTraceBeginCHROMIUM( |
9914 uint32 immediate_data_size, const cmds::TraceBeginCHROMIUM& c) { | 9890 uint32 immediate_data_size, const cmds::TraceBeginCHROMIUM& c) { |
9915 Bucket* bucket = GetBucket(c.bucket_id); | 9891 Bucket* bucket = GetBucket(c.bucket_id); |
9916 if (!bucket || bucket->size() == 0) { | 9892 if (!bucket || bucket->size() == 0) { |
9917 return error::kInvalidArguments; | 9893 return error::kInvalidArguments; |
9918 } | 9894 } |
9919 std::string command_name; | 9895 std::string command_name; |
(...skipping 14 matching lines...) Expand all Loading... |
9934 SetGLError(GL_INVALID_OPERATION, | 9910 SetGLError(GL_INVALID_OPERATION, |
9935 "glTraceEndCHROMIUM", "no trace begin found"); | 9911 "glTraceEndCHROMIUM", "no trace begin found"); |
9936 return; | 9912 return; |
9937 } | 9913 } |
9938 TRACE_EVENT_COPY_ASYNC_END0("gpu", gpu_tracer_->CurrentName().c_str(), this); | 9914 TRACE_EVENT_COPY_ASYNC_END0("gpu", gpu_tracer_->CurrentName().c_str(), this); |
9939 gpu_tracer_->End(); | 9915 gpu_tracer_->End(); |
9940 } | 9916 } |
9941 | 9917 |
9942 bool GLES2DecoderImpl::ValidateAsyncTransfer( | 9918 bool GLES2DecoderImpl::ValidateAsyncTransfer( |
9943 const char* function_name, | 9919 const char* function_name, |
9944 Texture* info, | 9920 Texture* texture, |
9945 GLenum target, | 9921 GLenum target, |
9946 GLint level, | 9922 GLint level, |
9947 const void * data) { | 9923 const void * data) { |
9948 // We only support async uploads to 2D textures for now. | 9924 // We only support async uploads to 2D textures for now. |
9949 if (GL_TEXTURE_2D != target) { | 9925 if (GL_TEXTURE_2D != target) { |
9950 SetGLErrorInvalidEnum(function_name, target, "target"); | 9926 SetGLErrorInvalidEnum(function_name, target, "target"); |
9951 return false; | 9927 return false; |
9952 } | 9928 } |
9953 // We only support uploads to level zero for now. | 9929 // We only support uploads to level zero for now. |
9954 if (level != 0) { | 9930 if (level != 0) { |
9955 SetGLError(GL_INVALID_VALUE, function_name, "level != 0"); | 9931 SetGLError(GL_INVALID_VALUE, function_name, "level != 0"); |
9956 return false; | 9932 return false; |
9957 } | 9933 } |
9958 // A transfer buffer must be bound, even for asyncTexImage2D. | 9934 // A transfer buffer must be bound, even for asyncTexImage2D. |
9959 if (data == NULL) { | 9935 if (data == NULL) { |
9960 SetGLError(GL_INVALID_OPERATION, function_name, "buffer == 0"); | 9936 SetGLError(GL_INVALID_OPERATION, function_name, "buffer == 0"); |
9961 return false; | 9937 return false; |
9962 } | 9938 } |
9963 // We only support one async transfer in progress. | 9939 // We only support one async transfer in progress. |
9964 if (!info || info->AsyncTransferIsInProgress()) { | 9940 if (!texture || texture->AsyncTransferIsInProgress()) { |
9965 SetGLError(GL_INVALID_OPERATION, | 9941 SetGLError(GL_INVALID_OPERATION, |
9966 function_name, "transfer already in progress"); | 9942 function_name, "transfer already in progress"); |
9967 return false; | 9943 return false; |
9968 } | 9944 } |
9969 return true; | 9945 return true; |
9970 } | 9946 } |
9971 | 9947 |
9972 error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM( | 9948 error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM( |
9973 uint32 immediate_data_size, const cmds::AsyncTexImage2DCHROMIUM& c) { | 9949 uint32 immediate_data_size, const cmds::AsyncTexImage2DCHROMIUM& c) { |
9974 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM"); | 9950 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM"); |
(...skipping 26 matching lines...) Expand all Loading... |
10001 } | 9977 } |
10002 | 9978 |
10003 // All the normal glTexSubImage2D validation. | 9979 // All the normal glTexSubImage2D validation. |
10004 if (!ValidateTexImage2D( | 9980 if (!ValidateTexImage2D( |
10005 "glAsyncTexImage2DCHROMIUM", target, level, internal_format, | 9981 "glAsyncTexImage2DCHROMIUM", target, level, internal_format, |
10006 width, height, border, format, type, pixels, pixels_size)) { | 9982 width, height, border, format, type, pixels, pixels_size)) { |
10007 return error::kNoError; | 9983 return error::kNoError; |
10008 } | 9984 } |
10009 | 9985 |
10010 // Extra async validation. | 9986 // Extra async validation. |
10011 Texture* info = GetTextureInfoForTarget(target); | 9987 Texture* texture = GetTextureInfoForTarget(target); |
10012 if (!ValidateAsyncTransfer( | 9988 if (!ValidateAsyncTransfer( |
10013 "glAsyncTexImage2DCHROMIUM", info, target, level, pixels)) | 9989 "glAsyncTexImage2DCHROMIUM", texture, target, level, pixels)) |
10014 return error::kNoError; | 9990 return error::kNoError; |
10015 | 9991 |
10016 // Don't allow async redefinition of a textures. | 9992 // Don't allow async redefinition of a textures. |
10017 if (info->IsDefined()) { | 9993 if (texture->IsDefined()) { |
10018 SetGLError(GL_INVALID_OPERATION, | 9994 SetGLError(GL_INVALID_OPERATION, |
10019 "glAsyncTexImage2DCHROMIUM", "already defined"); | 9995 "glAsyncTexImage2DCHROMIUM", "already defined"); |
10020 return error::kNoError; | 9996 return error::kNoError; |
10021 } | 9997 } |
10022 | 9998 |
10023 if (!EnsureGPUMemoryAvailable(pixels_size)) { | 9999 if (!EnsureGPUMemoryAvailable(pixels_size)) { |
10024 SetGLError(GL_OUT_OF_MEMORY, "glAsyncTexImage2DCHROMIUM", "out of memory"); | 10000 SetGLError(GL_OUT_OF_MEMORY, "glAsyncTexImage2DCHROMIUM", "out of memory"); |
10025 return error::kNoError; | 10001 return error::kNoError; |
10026 } | 10002 } |
10027 | 10003 |
10028 // We know the memory/size is safe, so get the real shared memory since | 10004 // We know the memory/size is safe, so get the real shared memory since |
10029 // it might need to be duped to prevent use-after-free of the memory. | 10005 // it might need to be duped to prevent use-after-free of the memory. |
10030 gpu::Buffer buffer = GetSharedMemoryBuffer(c.pixels_shm_id); | 10006 gpu::Buffer buffer = GetSharedMemoryBuffer(c.pixels_shm_id); |
10031 base::SharedMemory* shared_memory = buffer.shared_memory; | 10007 base::SharedMemory* shared_memory = buffer.shared_memory; |
10032 uint32 shm_size = buffer.size; | 10008 uint32 shm_size = buffer.size; |
10033 uint32 shm_data_offset = c.pixels_shm_offset; | 10009 uint32 shm_data_offset = c.pixels_shm_offset; |
10034 uint32 shm_data_size = pixels_size; | 10010 uint32 shm_data_size = pixels_size; |
10035 | 10011 |
10036 // Set up the async state if needed, and make the texture | 10012 // Set up the async state if needed, and make the texture |
10037 // immutable so the async state stays valid. The level info | 10013 // immutable so the async state stays valid. The level texture |
10038 // is set up lazily when the transfer completes. | 10014 // is set up lazily when the transfer completes. |
10039 DCHECK(!info->GetAsyncTransferState()); | 10015 DCHECK(!texture->GetAsyncTransferState()); |
10040 info->SetAsyncTransferState( | 10016 texture->SetAsyncTransferState( |
10041 async_pixel_transfer_delegate_-> | 10017 async_pixel_transfer_delegate_-> |
10042 CreatePixelTransferState(info->service_id())); | 10018 CreatePixelTransferState(texture->service_id())); |
10043 info->SetImmutable(true); | 10019 texture->SetImmutable(true); |
10044 | 10020 |
10045 // Issue the async call and set up the texture. | 10021 // Issue the async call and set up the texture. |
10046 GLenum gl_internal_format = | 10022 GLenum gl_internal_format = |
10047 GetTexInternalFormat(internal_format, format, type); | 10023 GetTexInternalFormat(internal_format, format, type); |
10048 gfx::AsyncTexImage2DParams tex_params = {target, level, gl_internal_format, | 10024 gfx::AsyncTexImage2DParams tex_params = {target, level, gl_internal_format, |
10049 width, height, border, format, type}; | 10025 width, height, border, format, type}; |
10050 gfx::AsyncMemoryParams mem_params = {shared_memory, shm_size, | 10026 gfx::AsyncMemoryParams mem_params = {shared_memory, shm_size, |
10051 shm_data_offset, shm_data_size}; | 10027 shm_data_offset, shm_data_size}; |
10052 | 10028 |
10053 // Add a pending transfer to the texture manager, which will bind the | 10029 // Add a pending transfer to the texture manager, which will bind the |
10054 // transfer data to the texture and set the level info at the same time, | 10030 // transfer data to the texture and set the level texture at the same time, |
10055 // after the the transfer is complete. | 10031 // after the the transfer is complete. |
10056 texture_manager()->AddPendingAsyncPixelTransfer( | 10032 texture_manager()->AddPendingAsyncPixelTransfer( |
10057 info->GetAsyncTransferState()->AsWeakPtr(), info); | 10033 texture->GetAsyncTransferState()->AsWeakPtr(), texture); |
10058 | 10034 |
10059 async_pixel_transfer_delegate_->AsyncTexImage2D( | 10035 async_pixel_transfer_delegate_->AsyncTexImage2D( |
10060 info->GetAsyncTransferState(), tex_params, mem_params); | 10036 texture->GetAsyncTransferState(), tex_params, mem_params); |
10061 return error::kNoError; | 10037 return error::kNoError; |
10062 } | 10038 } |
10063 | 10039 |
10064 error::Error GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM( | 10040 error::Error GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM( |
10065 uint32 immediate_data_size, const cmds::AsyncTexSubImage2DCHROMIUM& c) { | 10041 uint32 immediate_data_size, const cmds::AsyncTexSubImage2DCHROMIUM& c) { |
10066 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM"); | 10042 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM"); |
10067 GLenum target = static_cast<GLenum>(c.target); | 10043 GLenum target = static_cast<GLenum>(c.target); |
10068 GLint level = static_cast<GLint>(c.level); | 10044 GLint level = static_cast<GLint>(c.level); |
10069 GLint xoffset = static_cast<GLint>(c.xoffset); | 10045 GLint xoffset = static_cast<GLint>(c.xoffset); |
10070 GLint yoffset = static_cast<GLint>(c.yoffset); | 10046 GLint yoffset = static_cast<GLint>(c.yoffset); |
(...skipping 14 matching lines...) Expand all Loading... |
10085 c.data_shm_id, c.data_shm_offset, data_size); | 10061 c.data_shm_id, c.data_shm_offset, data_size); |
10086 | 10062 |
10087 // All the normal glTexSubImage2D validation. | 10063 // All the normal glTexSubImage2D validation. |
10088 error::Error error = error::kNoError; | 10064 error::Error error = error::kNoError; |
10089 if (!ValidateTexSubImage2D(&error, "glAsyncTexSubImage2DCHROMIUM", | 10065 if (!ValidateTexSubImage2D(&error, "glAsyncTexSubImage2DCHROMIUM", |
10090 target, level, xoffset, yoffset, width, height, format, type, pixels)) { | 10066 target, level, xoffset, yoffset, width, height, format, type, pixels)) { |
10091 return error; | 10067 return error; |
10092 } | 10068 } |
10093 | 10069 |
10094 // Extra async validation. | 10070 // Extra async validation. |
10095 Texture* info = GetTextureInfoForTarget(target); | 10071 Texture* texture = GetTextureInfoForTarget(target); |
10096 if (!ValidateAsyncTransfer( | 10072 if (!ValidateAsyncTransfer( |
10097 "glAsyncTexSubImage2DCHROMIUM", info, target, level, pixels)) | 10073 "glAsyncTexSubImage2DCHROMIUM", texture, target, level, pixels)) |
10098 return error::kNoError; | 10074 return error::kNoError; |
10099 | 10075 |
10100 // Guarantee async textures are always 'cleared' as follows: | 10076 // Guarantee async textures are always 'cleared' as follows: |
10101 // - AsyncTexImage2D can not redefine an existing texture | 10077 // - AsyncTexImage2D can not redefine an existing texture |
10102 // - AsyncTexImage2D must initialize the entire image via non-null buffer. | 10078 // - AsyncTexImage2D must initialize the entire image via non-null buffer. |
10103 // - AsyncTexSubImage2D clears synchronously if not already cleared. | 10079 // - AsyncTexSubImage2D clears synchronously if not already cleared. |
10104 // - Textures become immutable after an async call. | 10080 // - Textures become immutable after an async call. |
10105 // This way we know in all cases that an async texture is always clear. | 10081 // This way we know in all cases that an async texture is always clear. |
10106 if (!info->SafeToRenderFrom()) { | 10082 if (!texture->SafeToRenderFrom()) { |
10107 if (!texture_manager()->ClearTextureLevel(this, info, target, level)) { | 10083 if (!texture_manager()->ClearTextureLevel(this, texture, target, level)) { |
10108 SetGLError(GL_OUT_OF_MEMORY, | 10084 SetGLError(GL_OUT_OF_MEMORY, |
10109 "glAsyncTexSubImage2DCHROMIUM", "dimensions too big"); | 10085 "glAsyncTexSubImage2DCHROMIUM", "dimensions too big"); |
10110 return error::kNoError; | 10086 return error::kNoError; |
10111 } | 10087 } |
10112 } | 10088 } |
10113 | 10089 |
10114 // We know the memory/size is safe, so get the real shared memory since | 10090 // We know the memory/size is safe, so get the real shared memory since |
10115 // it might need to be duped to prevent use-after-free of the memory. | 10091 // it might need to be duped to prevent use-after-free of the memory. |
10116 gpu::Buffer buffer = GetSharedMemoryBuffer(c.data_shm_id); | 10092 gpu::Buffer buffer = GetSharedMemoryBuffer(c.data_shm_id); |
10117 base::SharedMemory* shared_memory = buffer.shared_memory; | 10093 base::SharedMemory* shared_memory = buffer.shared_memory; |
10118 uint32 shm_size = buffer.size; | 10094 uint32 shm_size = buffer.size; |
10119 uint32 shm_data_offset = c.data_shm_offset; | 10095 uint32 shm_data_offset = c.data_shm_offset; |
10120 uint32 shm_data_size = data_size; | 10096 uint32 shm_data_size = data_size; |
10121 | 10097 |
10122 if (!info->GetAsyncTransferState()) { | 10098 if (!texture->GetAsyncTransferState()) { |
10123 // Set up the async state if needed, and make the texture | 10099 // Set up the async state if needed, and make the texture |
10124 // immutable so the async state stays valid. | 10100 // immutable so the async state stays valid. |
10125 info->SetAsyncTransferState( | 10101 texture->SetAsyncTransferState( |
10126 async_pixel_transfer_delegate_-> | 10102 async_pixel_transfer_delegate_-> |
10127 CreatePixelTransferState(info->service_id())); | 10103 CreatePixelTransferState(texture->service_id())); |
10128 info->SetImmutable(true); | 10104 texture->SetImmutable(true); |
10129 } | 10105 } |
10130 | 10106 |
10131 gfx::AsyncTexSubImage2DParams tex_params = {target, level, xoffset, yoffset, | 10107 gfx::AsyncTexSubImage2DParams tex_params = {target, level, xoffset, yoffset, |
10132 width, height, format, type}; | 10108 width, height, format, type}; |
10133 gfx::AsyncMemoryParams mem_params = {shared_memory, shm_size, | 10109 gfx::AsyncMemoryParams mem_params = {shared_memory, shm_size, |
10134 shm_data_offset, shm_data_size}; | 10110 shm_data_offset, shm_data_size}; |
10135 async_pixel_transfer_delegate_->AsyncTexSubImage2D( | 10111 async_pixel_transfer_delegate_->AsyncTexSubImage2D( |
10136 info->GetAsyncTransferState(), tex_params, mem_params); | 10112 texture->GetAsyncTransferState(), tex_params, mem_params); |
10137 return error::kNoError; | 10113 return error::kNoError; |
10138 } | 10114 } |
10139 | 10115 |
10140 error::Error GLES2DecoderImpl::HandleWaitAsyncTexImage2DCHROMIUM( | 10116 error::Error GLES2DecoderImpl::HandleWaitAsyncTexImage2DCHROMIUM( |
10141 uint32 immediate_data_size, const cmds::WaitAsyncTexImage2DCHROMIUM& c) { | 10117 uint32 immediate_data_size, const cmds::WaitAsyncTexImage2DCHROMIUM& c) { |
10142 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleWaitAsyncTexImage2DCHROMIUM"); | 10118 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleWaitAsyncTexImage2DCHROMIUM"); |
10143 GLenum target = static_cast<GLenum>(c.target); | 10119 GLenum target = static_cast<GLenum>(c.target); |
10144 | 10120 |
10145 if (GL_TEXTURE_2D != target) { | 10121 if (GL_TEXTURE_2D != target) { |
10146 SetGLError(GL_INVALID_ENUM, "glWaitAsyncTexImage2DCHROMIUM", "target"); | 10122 SetGLError(GL_INVALID_ENUM, "glWaitAsyncTexImage2DCHROMIUM", "target"); |
10147 return error::kNoError; | 10123 return error::kNoError; |
10148 } | 10124 } |
10149 Texture* info = GetTextureInfoForTarget(target); | 10125 Texture* texture = GetTextureInfoForTarget(target); |
10150 if (!info) { | 10126 if (!texture) { |
10151 SetGLError(GL_INVALID_OPERATION, | 10127 SetGLError(GL_INVALID_OPERATION, |
10152 "glWaitAsyncTexImage2DCHROMIUM", "unknown texture"); | 10128 "glWaitAsyncTexImage2DCHROMIUM", "unknown texture"); |
10153 return error::kNoError; | 10129 return error::kNoError; |
10154 } | 10130 } |
10155 async_pixel_transfer_delegate_->WaitForTransferCompletion( | 10131 async_pixel_transfer_delegate_->WaitForTransferCompletion( |
10156 info->GetAsyncTransferState()); | 10132 texture->GetAsyncTransferState()); |
10157 ProcessFinishedAsyncTransfers(); | 10133 ProcessFinishedAsyncTransfers(); |
10158 return error::kNoError; | 10134 return error::kNoError; |
10159 } | 10135 } |
10160 | 10136 |
10161 // Include the auto-generated part of this file. We split this because it means | 10137 // Include the auto-generated part of this file. We split this because it means |
10162 // we can easily edit the non-auto generated parts right here in this file | 10138 // we can easily edit the non-auto generated parts right here in this file |
10163 // instead of having to edit some template or the code generator. | 10139 // instead of having to edit some template or the code generator. |
10164 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 10140 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
10165 | 10141 |
10166 } // namespace gles2 | 10142 } // namespace gles2 |
10167 } // namespace gpu | 10143 } // namespace gpu |
OLD | NEW |