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