Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(40)

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 1143373004: gpu: Extend CopyTextureCHROMIUM with support for copying part of source texture. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: keep TODO for now Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc ('k') | gpu/command_buffer/service/gles2_cmd_decoder_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698