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 <cmath> | 10 #include <cmath> |
(...skipping 985 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
996 void DoCopyTextureCHROMIUM(GLenum target, | 996 void DoCopyTextureCHROMIUM(GLenum target, |
997 GLuint source_id, | 997 GLuint source_id, |
998 GLuint dest_id, | 998 GLuint dest_id, |
999 GLenum internal_format, | 999 GLenum internal_format, |
1000 GLenum dest_type); | 1000 GLenum dest_type); |
1001 | 1001 |
1002 void DoCopySubTextureCHROMIUM(GLenum target, | 1002 void DoCopySubTextureCHROMIUM(GLenum target, |
1003 GLuint source_id, | 1003 GLuint source_id, |
1004 GLuint dest_id, | 1004 GLuint dest_id, |
1005 GLint xoffset, | 1005 GLint xoffset, |
1006 GLint yoffset); | 1006 GLint yoffset, |
| 1007 GLint x, |
| 1008 GLint y, |
| 1009 GLsizei width, |
| 1010 GLsizei height); |
1007 | 1011 |
1008 // Wrapper for TexStorage2DEXT. | 1012 // Wrapper for TexStorage2DEXT. |
1009 void DoTexStorage2DEXT( | 1013 void DoTexStorage2DEXT( |
1010 GLenum target, | 1014 GLenum target, |
1011 GLint levels, | 1015 GLint levels, |
1012 GLenum internal_format, | 1016 GLenum internal_format, |
1013 GLsizei width, | 1017 GLsizei width, |
1014 GLsizei height); | 1018 GLsizei height); |
1015 | 1019 |
1016 void DoProduceTextureCHROMIUM(GLenum target, const GLbyte* key); | 1020 void DoProduceTextureCHROMIUM(GLenum target, const GLbyte* key); |
(...skipping 10933 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11950 texture_manager()->SetLevelInfo( | 11954 texture_manager()->SetLevelInfo( |
11951 dest_texture_ref, GL_TEXTURE_2D, 0, internal_format, source_width, | 11955 dest_texture_ref, GL_TEXTURE_2D, 0, internal_format, source_width, |
11952 source_height, 1, 0, internal_format, dest_type, true); | 11956 source_height, 1, 0, internal_format, dest_type, true); |
11953 } else { | 11957 } else { |
11954 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, | 11958 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, |
11955 true); | 11959 true); |
11956 } | 11960 } |
11957 | 11961 |
11958 ScopedModifyPixels modify(dest_texture_ref); | 11962 ScopedModifyPixels modify(dest_texture_ref); |
11959 | 11963 |
11960 // Try using GLImage::CopyTexImage when possible. | 11964 // Try using GLImage::CopyTexSubImage when possible. |
11961 bool unpack_premultiply_alpha_change = | 11965 bool unpack_premultiply_alpha_change = |
11962 unpack_premultiply_alpha_ ^ unpack_unpremultiply_alpha_; | 11966 unpack_premultiply_alpha_ ^ unpack_unpremultiply_alpha_; |
11963 if (image && !unpack_flip_y_ && !unpack_premultiply_alpha_change) { | 11967 if (image && !unpack_flip_y_ && !unpack_premultiply_alpha_change) { |
11964 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); | 11968 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); |
11965 if (image->CopyTexSubImage(GL_TEXTURE_2D, gfx::Point(0, 0), | 11969 if (image->CopyTexSubImage(GL_TEXTURE_2D, gfx::Point(0, 0), |
11966 gfx::Rect(0, 0, source_width, source_height))) { | 11970 gfx::Rect(0, 0, source_width, source_height))) { |
11967 return; | 11971 return; |
11968 } | 11972 } |
11969 } | 11973 } |
11970 | 11974 |
(...skipping 17 matching lines...) Expand all Loading... |
11988 unpack_unpremultiply_alpha_); | 11992 unpack_unpremultiply_alpha_); |
11989 } | 11993 } |
11990 | 11994 |
11991 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); | 11995 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); |
11992 } | 11996 } |
11993 | 11997 |
11994 void GLES2DecoderImpl::DoCopySubTextureCHROMIUM(GLenum target, | 11998 void GLES2DecoderImpl::DoCopySubTextureCHROMIUM(GLenum target, |
11995 GLuint source_id, | 11999 GLuint source_id, |
11996 GLuint dest_id, | 12000 GLuint dest_id, |
11997 GLint xoffset, | 12001 GLint xoffset, |
11998 GLint yoffset) { | 12002 GLint yoffset, |
| 12003 GLint x, |
| 12004 GLint y, |
| 12005 GLsizei width, |
| 12006 GLsizei height) { |
11999 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopySubTextureCHROMIUM"); | 12007 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopySubTextureCHROMIUM"); |
12000 | 12008 |
12001 TextureRef* source_texture_ref = GetTexture(source_id); | 12009 TextureRef* source_texture_ref = GetTexture(source_id); |
12002 TextureRef* dest_texture_ref = GetTexture(dest_id); | 12010 TextureRef* dest_texture_ref = GetTexture(dest_id); |
12003 Texture* source_texture = source_texture_ref->texture(); | 12011 Texture* source_texture = source_texture_ref->texture(); |
12004 Texture* dest_texture = dest_texture_ref->texture(); | 12012 Texture* dest_texture = dest_texture_ref->texture(); |
12005 int source_width = 0; | 12013 int source_width = 0; |
12006 int source_height = 0; | 12014 int source_height = 0; |
12007 gfx::GLImage* image = | 12015 gfx::GLImage* image = |
12008 source_texture->GetLevelImage(source_texture->target(), 0); | 12016 source_texture->GetLevelImage(source_texture->target(), 0); |
(...skipping 20 matching lines...) Expand all Loading... |
12029 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", | 12037 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", |
12030 "source texture bad dimensions"); | 12038 "source texture bad dimensions"); |
12031 return; | 12039 return; |
12032 } | 12040 } |
12033 } | 12041 } |
12034 | 12042 |
12035 GLenum source_type = 0; | 12043 GLenum source_type = 0; |
12036 GLenum source_internal_format = 0; | 12044 GLenum source_internal_format = 0; |
12037 source_texture->GetLevelType(source_texture->target(), 0, &source_type, | 12045 source_texture->GetLevelType(source_texture->target(), 0, &source_type, |
12038 &source_internal_format); | 12046 &source_internal_format); |
| 12047 if (!source_texture->ValidForTexture(source_texture->target(), 0, x, y, 0, |
| 12048 width, height, 1, source_type)) { |
| 12049 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", |
| 12050 "source texture bad dimensions."); |
| 12051 return; |
| 12052 } |
| 12053 |
12039 GLenum dest_type = 0; | 12054 GLenum dest_type = 0; |
12040 GLenum dest_internal_format = 0; | 12055 GLenum dest_internal_format = 0; |
12041 bool dest_level_defined = dest_texture->GetLevelType( | 12056 bool dest_level_defined = dest_texture->GetLevelType( |
12042 dest_texture->target(), 0, &dest_type, &dest_internal_format); | 12057 dest_texture->target(), 0, &dest_type, &dest_internal_format); |
12043 if (!dest_level_defined) { | 12058 if (!dest_level_defined) { |
12044 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glCopySubTextureCHROMIUM", | 12059 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glCopySubTextureCHROMIUM", |
12045 "destination texture is not defined"); | 12060 "destination texture is not defined"); |
12046 return; | 12061 return; |
12047 } | 12062 } |
12048 if (!dest_texture->ValidForTexture(dest_texture->target(), 0, xoffset, | 12063 if (!dest_texture->ValidForTexture(dest_texture->target(), 0, xoffset, |
12049 yoffset, 0, source_width, source_height, | 12064 yoffset, 0, width, height, 1, dest_type)) { |
12050 1, dest_type)) { | |
12051 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", | 12065 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", |
12052 "destination texture bad dimensions."); | 12066 "destination texture bad dimensions."); |
12053 return; | 12067 return; |
12054 } | 12068 } |
12055 | 12069 |
12056 if (!ValidateCopyTextureCHROMIUM("glCopySubTextureCHROMIUM", target, | 12070 if (!ValidateCopyTextureCHROMIUM("glCopySubTextureCHROMIUM", target, |
12057 source_texture_ref, dest_texture_ref, | 12071 source_texture_ref, dest_texture_ref, |
12058 dest_internal_format)) { | 12072 dest_internal_format)) { |
12059 return; | 12073 return; |
12060 } | 12074 } |
(...skipping 15 matching lines...) Expand all Loading... |
12076 RestoreCurrentFramebufferBindings(); | 12090 RestoreCurrentFramebufferBindings(); |
12077 if (LOCAL_PEEK_GL_ERROR("glCopySubTextureCHROMIUM") != GL_NO_ERROR) | 12091 if (LOCAL_PEEK_GL_ERROR("glCopySubTextureCHROMIUM") != GL_NO_ERROR) |
12078 return; | 12092 return; |
12079 } | 12093 } |
12080 | 12094 |
12081 int dest_width = 0; | 12095 int dest_width = 0; |
12082 int dest_height = 0; | 12096 int dest_height = 0; |
12083 bool ok = dest_texture->GetLevelSize( | 12097 bool ok = dest_texture->GetLevelSize( |
12084 GL_TEXTURE_2D, 0, &dest_width, &dest_height, nullptr); | 12098 GL_TEXTURE_2D, 0, &dest_width, &dest_height, nullptr); |
12085 DCHECK(ok); | 12099 DCHECK(ok); |
12086 if (xoffset != 0 || yoffset != 0 || source_width != dest_width || | 12100 if (xoffset != 0 || yoffset != 0 || width != dest_width || |
12087 source_height != dest_height) { | 12101 height != dest_height) { |
12088 if (!texture_manager()->ClearTextureLevel(this, dest_texture_ref, target, | 12102 if (!texture_manager()->ClearTextureLevel(this, dest_texture_ref, target, |
12089 0)) { | 12103 0)) { |
12090 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopySubTextureCHROMIUM", | 12104 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopySubTextureCHROMIUM", |
12091 "destination texture dimensions too big"); | 12105 "destination texture dimensions too big"); |
12092 return; | 12106 return; |
12093 } | 12107 } |
12094 } else { | 12108 } else { |
12095 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, | 12109 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, |
12096 true); | 12110 true); |
12097 } | 12111 } |
12098 | 12112 |
12099 ScopedModifyPixels modify(dest_texture_ref); | 12113 ScopedModifyPixels modify(dest_texture_ref); |
12100 | 12114 |
12101 // Try using GLImage::CopyTexSubImage when possible. | 12115 // Try using GLImage::CopyTexSubImage when possible. |
12102 bool unpack_premultiply_alpha_change = | 12116 bool unpack_premultiply_alpha_change = |
12103 unpack_premultiply_alpha_ ^ unpack_unpremultiply_alpha_; | 12117 unpack_premultiply_alpha_ ^ unpack_unpremultiply_alpha_; |
12104 if (image && !unpack_flip_y_ && !unpack_premultiply_alpha_change) { | 12118 if (image && !unpack_flip_y_ && !unpack_premultiply_alpha_change) { |
12105 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); | 12119 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); |
12106 if (image->CopyTexSubImage(GL_TEXTURE_2D, gfx::Point(xoffset, yoffset), | 12120 if (image->CopyTexSubImage(GL_TEXTURE_2D, gfx::Point(xoffset, yoffset), |
12107 gfx::Rect(0, 0, source_width, source_height))) { | 12121 gfx::Rect(x, y, source_width, source_height))) { |
12108 return; | 12122 return; |
12109 } | 12123 } |
12110 } | 12124 } |
12111 | 12125 |
12112 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); | 12126 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); |
12113 | 12127 |
12114 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix | 12128 // TODO(hkuang): get the StreamTexture transform matrix in GPU process. |
12115 // before presenting. | 12129 // crbug.com/226218. |
12116 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) { | 12130 copy_texture_CHROMIUM_->DoCopySubTexture( |
12117 // TODO(hkuang): get the StreamTexture transform matrix in GPU process | 12131 this, source_texture->target(), source_texture->service_id(), |
12118 // instead of using kIdentityMatrix crbug.com/226218. | 12132 source_internal_format, dest_texture->service_id(), dest_internal_format, |
12119 copy_texture_CHROMIUM_->DoCopySubTextureWithTransform( | 12133 xoffset, yoffset, x, y, width, height, dest_width, dest_height, |
12120 this, source_texture->target(), source_texture->service_id(), | 12134 source_width, source_height, unpack_flip_y_, unpack_premultiply_alpha_, |
12121 dest_texture->service_id(), xoffset, yoffset, dest_width, dest_height, | 12135 unpack_unpremultiply_alpha_); |
12122 source_width, source_height, unpack_flip_y_, unpack_premultiply_alpha_, | |
12123 unpack_unpremultiply_alpha_, kIdentityMatrix); | |
12124 } else { | |
12125 copy_texture_CHROMIUM_->DoCopySubTexture( | |
12126 this, source_texture->target(), source_texture->service_id(), | |
12127 source_internal_format, dest_texture->service_id(), | |
12128 dest_internal_format, xoffset, yoffset, dest_width, dest_height, | |
12129 source_width, source_height, unpack_flip_y_, unpack_premultiply_alpha_, | |
12130 unpack_unpremultiply_alpha_); | |
12131 } | |
12132 | 12136 |
12133 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); | 12137 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); |
12134 } | 12138 } |
12135 | 12139 |
12136 static GLenum ExtractTypeFromStorageFormat(GLenum internalformat) { | 12140 static GLenum ExtractTypeFromStorageFormat(GLenum internalformat) { |
12137 switch (internalformat) { | 12141 switch (internalformat) { |
12138 case GL_RGB565: | 12142 case GL_RGB565: |
12139 return GL_UNSIGNED_SHORT_5_6_5; | 12143 return GL_UNSIGNED_SHORT_5_6_5; |
12140 case GL_RGBA4: | 12144 case GL_RGBA4: |
12141 return GL_UNSIGNED_SHORT_4_4_4_4; | 12145 return GL_UNSIGNED_SHORT_4_4_4_4; |
(...skipping 1136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13278 } | 13282 } |
13279 } | 13283 } |
13280 | 13284 |
13281 // Include the auto-generated part of this file. We split this because it means | 13285 // Include the auto-generated part of this file. We split this because it means |
13282 // we can easily edit the non-auto generated parts right here in this file | 13286 // we can easily edit the non-auto generated parts right here in this file |
13283 // instead of having to edit some template or the code generator. | 13287 // instead of having to edit some template or the code generator. |
13284 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 13288 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
13285 | 13289 |
13286 } // namespace gles2 | 13290 } // namespace gles2 |
13287 } // namespace gpu | 13291 } // namespace gpu |
OLD | NEW |