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

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

Issue 1275773003: gpu: support GL_TEXTURE_CUBE_MAP destination target to Copy(Sub)TextureCHROMIUM. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add comments about crbug.com/528145 Created 5 years, 3 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 12522 matching lines...) Expand 10 before | Expand all | Expand 10 after
12533 const char* function_name, 12533 const char* function_name,
12534 GLenum target, 12534 GLenum target,
12535 TextureRef* source_texture_ref, 12535 TextureRef* source_texture_ref,
12536 TextureRef* dest_texture_ref, 12536 TextureRef* dest_texture_ref,
12537 GLenum dest_internal_format) { 12537 GLenum dest_internal_format) {
12538 if (!source_texture_ref || !dest_texture_ref) { 12538 if (!source_texture_ref || !dest_texture_ref) {
12539 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "unknown texture id"); 12539 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "unknown texture id");
12540 return false; 12540 return false;
12541 } 12541 }
12542 12542
12543 if (GL_TEXTURE_2D != target) {
12544 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name,
12545 "invalid texture target");
12546 return false;
12547 }
12548
12549 Texture* source_texture = source_texture_ref->texture(); 12543 Texture* source_texture = source_texture_ref->texture();
12550 Texture* dest_texture = dest_texture_ref->texture(); 12544 Texture* dest_texture = dest_texture_ref->texture();
12551 if (source_texture == dest_texture) { 12545 if (source_texture == dest_texture) {
12552 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name, 12546 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name,
12553 "source and destination textures are the same"); 12547 "source and destination textures are the same");
12554 return false; 12548 return false;
12555 } 12549 }
12556 12550
12557 if (dest_texture->target() != GL_TEXTURE_2D || 12551 GLenum binding_target = GLES2Util::GLTextureTargetToBindingTarget(target);
12558 (source_texture->target() != GL_TEXTURE_2D && 12552 if (dest_texture->target() != binding_target ||
12559 source_texture->target() != GL_TEXTURE_RECTANGLE_ARB && 12553 (GL_TEXTURE_2D != binding_target &&
12560 source_texture->target() != GL_TEXTURE_EXTERNAL_OES)) { 12554 GL_TEXTURE_CUBE_MAP != binding_target)) {
12555 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name,
12556 "invalid texture target");
12557 return false;
12558 }
12559
12560 if (source_texture->target() != GL_TEXTURE_2D &&
12561 source_texture->target() != GL_TEXTURE_RECTANGLE_ARB &&
12562 source_texture->target() != GL_TEXTURE_EXTERNAL_OES) {
12561 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, 12563 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name,
12562 "invalid texture target binding"); 12564 "invalid texture target binding");
12563 return false; 12565 return false;
12564 } 12566 }
12565 12567
12566 GLenum source_type = 0; 12568 GLenum source_type = 0;
12567 GLenum source_internal_format = 0; 12569 GLenum source_internal_format = 0;
12568 source_texture->GetLevelType(source_texture->target(), 0, &source_type, 12570 source_texture->GetLevelType(source_texture->target(), 0, &source_type,
12569 &source_internal_format); 12571 &source_internal_format);
12570 12572
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
12722 copy_texture_CHROMIUM_->Initialize(this); 12724 copy_texture_CHROMIUM_->Initialize(this);
12723 RestoreCurrentFramebufferBindings(); 12725 RestoreCurrentFramebufferBindings();
12724 if (LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM") != GL_NO_ERROR) 12726 if (LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM") != GL_NO_ERROR)
12725 return; 12727 return;
12726 } 12728 }
12727 12729
12728 GLenum dest_type_previous = dest_type; 12730 GLenum dest_type_previous = dest_type;
12729 GLenum dest_internal_format = internal_format; 12731 GLenum dest_internal_format = internal_format;
12730 int dest_width = 0; 12732 int dest_width = 0;
12731 int dest_height = 0; 12733 int dest_height = 0;
12732 bool dest_level_defined = dest_texture->GetLevelSize( 12734 bool dest_level_defined =
12733 GL_TEXTURE_2D, 0, &dest_width, &dest_height, nullptr); 12735 dest_texture->GetLevelSize(target, 0, &dest_width, &dest_height, nullptr);
12734 12736
12735 if (dest_level_defined) { 12737 if (dest_level_defined) {
12736 dest_texture->GetLevelType(GL_TEXTURE_2D, 0, &dest_type_previous, 12738 dest_texture->GetLevelType(target, 0, &dest_type_previous,
12737 &dest_internal_format); 12739 &dest_internal_format);
12738 } 12740 }
12739 12741
12740 // Resize the destination texture to the dimensions of the source texture. 12742 // Resize the destination texture to the dimensions of the source texture.
12741 if (!dest_level_defined || dest_width != source_width || 12743 if (!dest_level_defined || dest_width != source_width ||
12742 dest_height != source_height || 12744 dest_height != source_height ||
12743 dest_internal_format != internal_format || 12745 dest_internal_format != internal_format ||
12744 dest_type_previous != dest_type) { 12746 dest_type_previous != dest_type) {
12745 // Ensure that the glTexImage2D succeeds. 12747 // Ensure that the glTexImage2D succeeds.
12746 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopyTextureCHROMIUM"); 12748 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopyTextureCHROMIUM");
12747 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); 12749 glBindTexture(dest_texture->target(), dest_texture->service_id());
12748 glTexImage2D(GL_TEXTURE_2D, 0, internal_format, source_width, source_height, 12750 glTexImage2D(target, 0, internal_format, source_width, source_height, 0,
12749 0, internal_format, dest_type, NULL); 12751 internal_format, dest_type, NULL);
12750 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM"); 12752 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM");
12751 if (error != GL_NO_ERROR) { 12753 if (error != GL_NO_ERROR) {
12752 RestoreCurrentTextureBindings(&state_, GL_TEXTURE_2D); 12754 RestoreCurrentTextureBindings(&state_, dest_texture->target());
12753 return; 12755 return;
12754 } 12756 }
12755 12757
12756 texture_manager()->SetLevelInfo( 12758 texture_manager()->SetLevelInfo(
12757 dest_texture_ref, GL_TEXTURE_2D, 0, internal_format, source_width, 12759 dest_texture_ref, target, 0, internal_format, source_width,
12758 source_height, 1, 0, internal_format, dest_type, 12760 source_height, 1, 0, internal_format, dest_type,
12759 gfx::Rect(source_width, source_height)); 12761 gfx::Rect(source_width, source_height));
12760 } else { 12762 } else {
12761 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, 12763 texture_manager()->SetLevelCleared(dest_texture_ref, target, 0, true);
12762 true);
12763 } 12764 }
12764 12765
12765 ScopedModifyPixels modify(dest_texture_ref); 12766 ScopedModifyPixels modify(dest_texture_ref);
12766 12767
12767 // Try using GLImage::CopyTexSubImage when possible. 12768 // Try using GLImage::CopyTexSubImage when possible.
12768 bool unpack_premultiply_alpha_change = 12769 bool unpack_premultiply_alpha_change =
12769 (unpack_premultiply_alpha ^ unpack_unmultiply_alpha) != 0; 12770 (unpack_premultiply_alpha ^ unpack_unmultiply_alpha) != 0;
12770 if (image && !unpack_flip_y && !unpack_premultiply_alpha_change) { 12771 if (image && !unpack_flip_y && !unpack_premultiply_alpha_change) {
12771 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); 12772 glBindTexture(dest_texture->target(), dest_texture->service_id());
12772 if (image->CopyTexSubImage(GL_TEXTURE_2D, gfx::Point(0, 0), 12773 if (image->CopyTexSubImage(target, gfx::Point(0, 0),
12773 gfx::Rect(0, 0, source_width, source_height))) { 12774 gfx::Rect(0, 0, source_width, source_height))) {
12774 return; 12775 return;
12775 } 12776 }
12776 } 12777 }
12777 12778
12778 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); 12779 DoWillUseTexImageIfNeeded(source_texture, source_texture->target());
12779 12780
12780 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix 12781 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix
12781 // before presenting. 12782 // before presenting.
12782 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) { 12783 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) {
12783 // TODO(hkuang): get the StreamTexture transform matrix in GPU process 12784 // TODO(hkuang): get the StreamTexture transform matrix in GPU process
12784 // instead of using kIdentityMatrix crbug.com/226218. 12785 // instead of using kIdentityMatrix crbug.com/226218.
12785 copy_texture_CHROMIUM_->DoCopyTextureWithTransform( 12786 copy_texture_CHROMIUM_->DoCopyTextureWithTransform(
12786 this, source_texture->target(), source_texture->service_id(), 12787 this, source_texture->target(), source_texture->service_id(), target,
12787 dest_texture->service_id(), source_width, source_height, 12788 dest_texture->service_id(), internal_format, dest_type, source_width,
12788 unpack_flip_y == GL_TRUE, 12789 source_height, unpack_flip_y == GL_TRUE,
12789 unpack_premultiply_alpha == GL_TRUE, 12790 unpack_premultiply_alpha == GL_TRUE, unpack_unmultiply_alpha == GL_TRUE,
12790 unpack_unmultiply_alpha == GL_TRUE, 12791 &texture_state_, kIdentityMatrix);
12791 kIdentityMatrix);
12792 } else { 12792 } else {
12793 copy_texture_CHROMIUM_->DoCopyTexture( 12793 copy_texture_CHROMIUM_->DoCopyTexture(
12794 this, source_texture->target(), source_texture->service_id(), 12794 this, source_texture->target(), source_texture->service_id(),
12795 source_internal_format, dest_texture->service_id(), internal_format, 12795 source_internal_format, target, dest_texture->service_id(),
12796 source_width, source_height, 12796 internal_format, dest_type, source_width, source_height,
12797 unpack_flip_y == GL_TRUE, 12797 unpack_flip_y == GL_TRUE, unpack_premultiply_alpha == GL_TRUE,
12798 unpack_premultiply_alpha == GL_TRUE, 12798 unpack_unmultiply_alpha == GL_TRUE, &texture_state_);
12799 unpack_unmultiply_alpha == GL_TRUE);
12800 } 12799 }
12801 12800
12802 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); 12801 DoDidUseTexImageIfNeeded(source_texture, source_texture->target());
12803 } 12802 }
12804 12803
12805 void GLES2DecoderImpl::DoCopySubTextureCHROMIUM( 12804 void GLES2DecoderImpl::DoCopySubTextureCHROMIUM(
12806 GLenum target, 12805 GLenum target,
12807 GLuint source_id, 12806 GLuint source_id,
12808 GLuint dest_id, 12807 GLuint dest_id,
12809 GLint xoffset, 12808 GLint xoffset,
12810 GLint yoffset, 12809 GLint yoffset,
12811 GLint x, 12810 GLint x,
12812 GLint y, 12811 GLint y,
12813 GLsizei width, 12812 GLsizei width,
12814 GLsizei height, 12813 GLsizei height,
12815 GLboolean unpack_flip_y, 12814 GLboolean unpack_flip_y,
12816 GLboolean unpack_premultiply_alpha, 12815 GLboolean unpack_premultiply_alpha,
12817 GLboolean unpack_unmultiply_alpha) { 12816 GLboolean unpack_unmultiply_alpha) {
12818 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopySubTextureCHROMIUM"); 12817 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopySubTextureCHROMIUM");
12819 12818
12820 TextureRef* source_texture_ref = GetTexture(source_id); 12819 TextureRef* source_texture_ref = GetTexture(source_id);
12821 TextureRef* dest_texture_ref = GetTexture(dest_id); 12820 TextureRef* dest_texture_ref = GetTexture(dest_id);
12822 Texture* source_texture = source_texture_ref->texture(); 12821 Texture* source_texture = source_texture_ref->texture();
12823 Texture* dest_texture = dest_texture_ref->texture(); 12822 Texture* dest_texture = dest_texture_ref->texture();
12823 GLenum source_type = 0;
12824 GLenum source_internal_format = 0;
12825 source_texture->GetLevelType(source_texture->target(), 0, &source_type,
12826 &source_internal_format);
12824 int source_width = 0; 12827 int source_width = 0;
12825 int source_height = 0; 12828 int source_height = 0;
12826 gfx::GLImage* image = 12829 gfx::GLImage* image =
12827 source_texture->GetLevelImage(source_texture->target(), 0); 12830 source_texture->GetLevelImage(source_texture->target(), 0);
12828 if (image) { 12831 if (image) {
12829 gfx::Size size = image->GetSize(); 12832 gfx::Size size = image->GetSize();
12830 source_width = size.width(); 12833 source_width = size.width();
12831 source_height = size.height(); 12834 source_height = size.height();
12832 if (source_width <= 0 || source_height <= 0) { 12835 if (source_width <= 0 || source_height <= 0) {
12833 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", 12836 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
12834 "invalid image size"); 12837 "invalid image size");
12835 return; 12838 return;
12836 } 12839 }
12837 } else { 12840 } else {
12838 if (!source_texture->GetLevelSize(source_texture->target(), 0, 12841 if (!source_texture->GetLevelSize(source_texture->target(), 0,
12839 &source_width, &source_height, nullptr)) { 12842 &source_width, &source_height, nullptr)) {
12840 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", 12843 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
12841 "source texture has no level 0"); 12844 "source texture has no level 0");
12842 return; 12845 return;
12843 } 12846 }
12844 12847
12848 if (!source_texture->ValidForTexture(source_texture->target(), 0, x, y, 0,
12849 width, height, 1, source_type)) {
12850 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
12851 "source texture bad dimensions.");
12852 return;
12853 }
12854
12845 // Check that this type of texture is allowed. 12855 // Check that this type of texture is allowed.
12846 if (!texture_manager()->ValidForTarget(source_texture->target(), 0, 12856 if (!texture_manager()->ValidForTarget(source_texture->target(), 0,
12847 source_width, source_height, 1)) { 12857 source_width, source_height, 1)) {
12848 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", 12858 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
12849 "source texture bad dimensions"); 12859 "source texture bad dimensions");
12850 return; 12860 return;
12851 } 12861 }
12852 } 12862 }
12853 12863
12854 GLenum source_type = 0;
12855 GLenum source_internal_format = 0;
12856 source_texture->GetLevelType(source_texture->target(), 0, &source_type,
12857 &source_internal_format);
12858 if (!source_texture->ValidForTexture(source_texture->target(), 0, x, y, 0,
12859 width, height, 1, source_type)) {
12860 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
12861 "source texture bad dimensions.");
12862 return;
12863 }
12864
12865 GLenum dest_type = 0; 12864 GLenum dest_type = 0;
12866 GLenum dest_internal_format = 0; 12865 GLenum dest_internal_format = 0;
12867 bool dest_level_defined = dest_texture->GetLevelType( 12866 bool dest_level_defined =
12868 dest_texture->target(), 0, &dest_type, &dest_internal_format); 12867 dest_texture->GetLevelType(target, 0, &dest_type, &dest_internal_format);
12869 if (!dest_level_defined) { 12868 if (!dest_level_defined) {
12870 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glCopySubTextureCHROMIUM", 12869 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glCopySubTextureCHROMIUM",
12871 "destination texture is not defined"); 12870 "destination texture is not defined");
12872 return; 12871 return;
12873 } 12872 }
12874 if (!dest_texture->ValidForTexture(dest_texture->target(), 0, xoffset, 12873 if (!dest_texture->ValidForTexture(target, 0, xoffset, yoffset, 0, width,
12875 yoffset, 0, width, height, 1, dest_type)) { 12874 height, 1, dest_type)) {
12876 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", 12875 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
12877 "destination texture bad dimensions."); 12876 "destination texture bad dimensions.");
12878 return; 12877 return;
12879 } 12878 }
12880 12879
12881 if (!ValidateCopyTextureCHROMIUM("glCopySubTextureCHROMIUM", target, 12880 if (!ValidateCopyTextureCHROMIUM("glCopySubTextureCHROMIUM", target,
12882 source_texture_ref, dest_texture_ref, 12881 source_texture_ref, dest_texture_ref,
12883 dest_internal_format)) { 12882 dest_internal_format)) {
12884 return; 12883 return;
12885 } 12884 }
(...skipping 12 matching lines...) Expand all
12898 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopySubTextureCHROMIUM"); 12897 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopySubTextureCHROMIUM");
12899 copy_texture_CHROMIUM_.reset(new CopyTextureCHROMIUMResourceManager()); 12898 copy_texture_CHROMIUM_.reset(new CopyTextureCHROMIUMResourceManager());
12900 copy_texture_CHROMIUM_->Initialize(this); 12899 copy_texture_CHROMIUM_->Initialize(this);
12901 RestoreCurrentFramebufferBindings(); 12900 RestoreCurrentFramebufferBindings();
12902 if (LOCAL_PEEK_GL_ERROR("glCopySubTextureCHROMIUM") != GL_NO_ERROR) 12901 if (LOCAL_PEEK_GL_ERROR("glCopySubTextureCHROMIUM") != GL_NO_ERROR)
12903 return; 12902 return;
12904 } 12903 }
12905 12904
12906 int dest_width = 0; 12905 int dest_width = 0;
12907 int dest_height = 0; 12906 int dest_height = 0;
12908 bool ok = dest_texture->GetLevelSize( 12907 bool ok =
12909 GL_TEXTURE_2D, 0, &dest_width, &dest_height, nullptr); 12908 dest_texture->GetLevelSize(target, 0, &dest_width, &dest_height, nullptr);
12910 DCHECK(ok); 12909 DCHECK(ok);
12911 if (xoffset != 0 || yoffset != 0 || width != dest_width || 12910 if (xoffset != 0 || yoffset != 0 || width != dest_width ||
12912 height != dest_height) { 12911 height != dest_height) {
12913 gfx::Rect cleared_rect; 12912 gfx::Rect cleared_rect;
12914 if (CombineAdjacentRects(dest_texture->GetLevelClearedRect(target, 0), 12913 if (CombineAdjacentRects(dest_texture->GetLevelClearedRect(target, 0),
12915 gfx::Rect(xoffset, yoffset, width, height), 12914 gfx::Rect(xoffset, yoffset, width, height),
12916 &cleared_rect)) { 12915 &cleared_rect)) {
12917 DCHECK_GE(cleared_rect.size().GetArea(), 12916 DCHECK_GE(cleared_rect.size().GetArea(),
12918 dest_texture->GetLevelClearedRect(target, 0).size().GetArea()); 12917 dest_texture->GetLevelClearedRect(target, 0).size().GetArea());
12919 texture_manager()->SetLevelClearedRect(dest_texture_ref, target, 0, 12918 texture_manager()->SetLevelClearedRect(dest_texture_ref, target, 0,
12920 cleared_rect); 12919 cleared_rect);
12921 } else { 12920 } else {
12922 // Otherwise clear part of texture level that is not already cleared. 12921 // Otherwise clear part of texture level that is not already cleared.
12923 if (!texture_manager()->ClearTextureLevel(this, dest_texture_ref, target, 12922 if (!texture_manager()->ClearTextureLevel(this, dest_texture_ref, target,
12924 0)) { 12923 0)) {
12925 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopySubTextureCHROMIUM", 12924 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopySubTextureCHROMIUM",
12926 "destination texture dimensions too big"); 12925 "destination texture dimensions too big");
12927 return; 12926 return;
12928 } 12927 }
12929 } 12928 }
12930 } else { 12929 } else {
12931 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, 12930 texture_manager()->SetLevelCleared(dest_texture_ref, target, 0, true);
12932 true);
12933 } 12931 }
12934 12932
12935 ScopedModifyPixels modify(dest_texture_ref); 12933 ScopedModifyPixels modify(dest_texture_ref);
12936 12934
12937 // Try using GLImage::CopyTexSubImage when possible. 12935 // Try using GLImage::CopyTexSubImage when possible.
12938 bool unpack_premultiply_alpha_change = 12936 bool unpack_premultiply_alpha_change =
12939 (unpack_premultiply_alpha ^ unpack_unmultiply_alpha) != 0; 12937 (unpack_premultiply_alpha ^ unpack_unmultiply_alpha) != 0;
12940 if (image && !unpack_flip_y && !unpack_premultiply_alpha_change) { 12938 if (image && !unpack_flip_y && !unpack_premultiply_alpha_change) {
12941 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); 12939 glBindTexture(dest_texture->target(), dest_texture->service_id());
12942 if (image->CopyTexSubImage(GL_TEXTURE_2D, gfx::Point(xoffset, yoffset), 12940 if (image->CopyTexSubImage(target, gfx::Point(xoffset, yoffset),
12943 gfx::Rect(x, y, width, height))) { 12941 gfx::Rect(x, y, width, height))) {
12944 return; 12942 return;
12945 } 12943 }
12946 } 12944 }
12947 12945
12948 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); 12946 DoWillUseTexImageIfNeeded(source_texture, source_texture->target());
12949 12947
12950 // TODO(hkuang): get the StreamTexture transform matrix in GPU process. 12948 // TODO(hkuang): get the StreamTexture transform matrix in GPU process.
12951 // crbug.com/226218. 12949 // crbug.com/226218.
12952 copy_texture_CHROMIUM_->DoCopySubTexture( 12950 copy_texture_CHROMIUM_->DoCopySubTexture(
12953 this, source_texture->target(), source_texture->service_id(), 12951 this, source_texture->target(), source_texture->service_id(),
12954 source_internal_format, dest_texture->service_id(), dest_internal_format, 12952 source_internal_format, target, dest_texture->service_id(),
12955 xoffset, yoffset, x, y, width, height, dest_width, dest_height, 12953 dest_internal_format, dest_type, xoffset, yoffset, x, y, width, height,
12956 source_width, source_height, 12954 dest_width, dest_height, source_width, source_height,
12957 unpack_flip_y == GL_TRUE, 12955 unpack_flip_y == GL_TRUE, unpack_premultiply_alpha == GL_TRUE,
12958 unpack_premultiply_alpha == GL_TRUE, 12956 unpack_unmultiply_alpha == GL_TRUE, &texture_state_);
12959 unpack_unmultiply_alpha == GL_TRUE);
12960 12957
12961 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); 12958 DoDidUseTexImageIfNeeded(source_texture, source_texture->target());
12962 } 12959 }
12963 12960
12964 void GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM(GLenum target, 12961 void GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM(GLenum target,
12965 GLuint source_id, 12962 GLuint source_id,
12966 GLuint dest_id) { 12963 GLuint dest_id) {
12967 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM"); 12964 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM");
12968 12965
12969 TextureRef* source_texture_ref = GetTexture(source_id); 12966 TextureRef* source_texture_ref = GetTexture(source_id);
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
13118 source_height, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 13115 source_height, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
13119 gfx::Rect(source_width, source_height)); 13116 gfx::Rect(source_width, source_height));
13120 13117
13121 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix 13118 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix
13122 // before presenting. 13119 // before presenting.
13123 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) { 13120 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) {
13124 // TODO(hkuang): get the StreamTexture transform matrix in GPU process 13121 // TODO(hkuang): get the StreamTexture transform matrix in GPU process
13125 // instead of using kIdentityMatrix crbug.com/226218. 13122 // instead of using kIdentityMatrix crbug.com/226218.
13126 copy_texture_CHROMIUM_->DoCopyTextureWithTransform( 13123 copy_texture_CHROMIUM_->DoCopyTextureWithTransform(
13127 this, source_texture->target(), source_texture->service_id(), 13124 this, source_texture->target(), source_texture->service_id(),
13128 dest_texture->service_id(), source_width, source_height, 13125 GL_TEXTURE_2D, dest_texture->service_id(), GL_RGBA, GL_UNSIGNED_BYTE,
13129 false, false, false, kIdentityMatrix); 13126 source_width, source_height, false, false, false, &texture_state_,
13127 kIdentityMatrix);
13130 } else { 13128 } else {
13131 copy_texture_CHROMIUM_->DoCopyTexture( 13129 copy_texture_CHROMIUM_->DoCopyTexture(
13132 this, source_texture->target(), source_texture->service_id(), 13130 this, source_texture->target(), source_texture->service_id(),
13133 source_internal_format, dest_texture->service_id(), GL_RGBA, 13131 source_internal_format, GL_TEXTURE_2D, dest_texture->service_id(),
13134 source_width, source_height, false, false, false); 13132 GL_RGBA, GL_UNSIGNED_BYTE, source_width, source_height, false, false,
13133 false, &texture_state_);
13135 } 13134 }
13136 13135
13137 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); 13136 DoDidUseTexImageIfNeeded(source_texture, source_texture->target());
13138 } 13137 }
13139 13138
13140 void GLES2DecoderImpl::DoCompressedCopySubTextureCHROMIUM(GLenum target, 13139 void GLES2DecoderImpl::DoCompressedCopySubTextureCHROMIUM(GLenum target,
13141 GLuint source_id, 13140 GLuint source_id,
13142 GLuint dest_id, 13141 GLuint dest_id,
13143 GLint xoffset, 13142 GLint xoffset,
13144 GLint yoffset, 13143 GLint yoffset,
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
13312 13311
13313 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedCopyTextureCHROMIUM"); 13312 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedCopyTextureCHROMIUM");
13314 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height, 0, GL_RGBA, 13313 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height, 0, GL_RGBA,
13315 GL_UNSIGNED_BYTE, NULL); 13314 GL_UNSIGNED_BYTE, NULL);
13316 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedCopySubTextureCHROMIUM"); 13315 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedCopySubTextureCHROMIUM");
13317 if (error != GL_NO_ERROR) 13316 if (error != GL_NO_ERROR)
13318 return; 13317 return;
13319 13318
13320 copy_texture_CHROMIUM_->DoCopyTexture( 13319 copy_texture_CHROMIUM_->DoCopyTexture(
13321 this, dest_texture->target(), dest_texture->service_id(), 13320 this, dest_texture->target(), dest_texture->service_id(),
13322 dest_internal_format, tmp_service_id, GL_RGBA, 13321 dest_internal_format, GL_TEXTURE_2D, tmp_service_id, GL_RGBA,
13323 dest_width, dest_height, false, false, false); 13322 GL_UNSIGNED_BYTE, dest_width, dest_height, false, false, false,
13323 &texture_state_);
13324 13324
13325 // Redefine destination texture to use RGBA. 13325 // Redefine destination texture to use RGBA.
13326 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); 13326 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id());
13327 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedCopyTextureCHROMIUM"); 13327 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedCopyTextureCHROMIUM");
13328 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height, 0, GL_RGBA, 13328 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height, 0, GL_RGBA,
13329 GL_UNSIGNED_BYTE, NULL); 13329 GL_UNSIGNED_BYTE, NULL);
13330 error = LOCAL_PEEK_GL_ERROR("glCompressedCopySubTextureCHROMIUM"); 13330 error = LOCAL_PEEK_GL_ERROR("glCompressedCopySubTextureCHROMIUM");
13331 if (error != GL_NO_ERROR) 13331 if (error != GL_NO_ERROR)
13332 return; 13332 return;
13333 13333
13334 texture_manager()->SetLevelInfo( 13334 texture_manager()->SetLevelInfo(
13335 dest_texture_ref, GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height, 13335 dest_texture_ref, GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height,
13336 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect(dest_width, dest_height)); 13336 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect(dest_width, dest_height));
13337 13337
13338 copy_texture_CHROMIUM_->DoCopyTexture( 13338 copy_texture_CHROMIUM_->DoCopyTexture(
13339 this, GL_TEXTURE_2D, tmp_service_id, GL_RGBA, 13339 this, GL_TEXTURE_2D, tmp_service_id, GL_RGBA, GL_TEXTURE_2D,
13340 dest_texture->service_id(), GL_RGBA, 13340 dest_texture->service_id(), GL_RGBA, GL_UNSIGNED_BYTE, dest_width,
13341 dest_width, dest_height, false, false, false); 13341 dest_height, false, false, false, &texture_state_);
13342 13342
13343 glDeleteTextures(1, &tmp_service_id); 13343 glDeleteTextures(1, &tmp_service_id);
13344 } 13344 }
13345 13345
13346 // TODO(hkuang): get the StreamTexture transform matrix in GPU process. 13346 // TODO(hkuang): get the StreamTexture transform matrix in GPU process.
13347 // crbug.com/226218. 13347 // crbug.com/226218.
13348 copy_texture_CHROMIUM_->DoCopySubTexture( 13348 copy_texture_CHROMIUM_->DoCopySubTexture(
13349 this, source_texture->target(), source_texture->service_id(), 13349 this, source_texture->target(), source_texture->service_id(),
13350 source_internal_format, dest_texture->service_id(), GL_RGBA, 13350 source_internal_format, GL_TEXTURE_2D, dest_texture->service_id(),
13351 xoffset, yoffset, x, y, width, height, dest_width, dest_height, 13351 GL_RGBA, GL_UNSIGNED_BYTE, xoffset, yoffset, x, y, width, height,
13352 source_width, source_height, false, false, false); 13352 dest_width, dest_height, source_width, source_height, false, false, false,
13353 &texture_state_);
13353 13354
13354 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); 13355 DoDidUseTexImageIfNeeded(source_texture, source_texture->target());
13355 } 13356 }
13356 13357
13357 static GLenum ExtractTypeFromStorageFormat(GLenum internalformat) { 13358 static GLenum ExtractTypeFromStorageFormat(GLenum internalformat) {
13358 switch (internalformat) { 13359 switch (internalformat) {
13359 case GL_R8: 13360 case GL_R8:
13360 return GL_UNSIGNED_BYTE; 13361 return GL_UNSIGNED_BYTE;
13361 case GL_R8_SNORM: 13362 case GL_R8_SNORM:
13362 return GL_BYTE; 13363 return GL_BYTE;
(...skipping 1435 matching lines...) Expand 10 before | Expand all | Expand 10 after
14798 return error::kNoError; 14799 return error::kNoError;
14799 } 14800 }
14800 14801
14801 // Include the auto-generated part of this file. We split this because it means 14802 // Include the auto-generated part of this file. We split this because it means
14802 // we can easily edit the non-auto generated parts right here in this file 14803 // we can easily edit the non-auto generated parts right here in this file
14803 // instead of having to edit some template or the code generator. 14804 // instead of having to edit some template or the code generator.
14804 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 14805 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
14805 14806
14806 } // namespace gles2 14807 } // namespace gles2
14807 } // namespace gpu 14808 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698