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

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: Handle nvidia 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 12482 matching lines...) Expand 10 before | Expand all | Expand 10 after
12493 const char* function_name, 12493 const char* function_name,
12494 GLenum target, 12494 GLenum target,
12495 TextureRef* source_texture_ref, 12495 TextureRef* source_texture_ref,
12496 TextureRef* dest_texture_ref, 12496 TextureRef* dest_texture_ref,
12497 GLenum dest_internal_format) { 12497 GLenum dest_internal_format) {
12498 if (!source_texture_ref || !dest_texture_ref) { 12498 if (!source_texture_ref || !dest_texture_ref) {
12499 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "unknown texture id"); 12499 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "unknown texture id");
12500 return false; 12500 return false;
12501 } 12501 }
12502 12502
12503 if (GL_TEXTURE_2D != target) {
12504 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name,
12505 "invalid texture target");
12506 return false;
12507 }
12508
12509 Texture* source_texture = source_texture_ref->texture(); 12503 Texture* source_texture = source_texture_ref->texture();
12510 Texture* dest_texture = dest_texture_ref->texture(); 12504 Texture* dest_texture = dest_texture_ref->texture();
12511 if (source_texture == dest_texture) { 12505 if (source_texture == dest_texture) {
12512 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name, 12506 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name,
12513 "source and destination textures are the same"); 12507 "source and destination textures are the same");
12514 return false; 12508 return false;
12515 } 12509 }
12516 12510
12517 if (dest_texture->target() != GL_TEXTURE_2D || 12511 GLenum binding_target = GLES2Util::GLTextureTargetToBindingTarget(target);
12518 (source_texture->target() != GL_TEXTURE_2D && 12512 if (dest_texture->target() != binding_target ||
12519 source_texture->target() != GL_TEXTURE_RECTANGLE_ARB && 12513 (GL_TEXTURE_2D != binding_target &&
12520 source_texture->target() != GL_TEXTURE_EXTERNAL_OES)) { 12514 GL_TEXTURE_CUBE_MAP != binding_target)) {
12515 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name,
12516 "invalid texture target");
12517 return false;
12518 }
12519
12520 if (source_texture->target() != GL_TEXTURE_2D &&
12521 source_texture->target() != GL_TEXTURE_RECTANGLE_ARB &&
12522 source_texture->target() != GL_TEXTURE_EXTERNAL_OES) {
12521 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, 12523 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name,
12522 "invalid texture target binding"); 12524 "invalid texture target binding");
12523 return false; 12525 return false;
12524 } 12526 }
12525 12527
12526 GLenum source_type = 0; 12528 GLenum source_type = 0;
12527 GLenum source_internal_format = 0; 12529 GLenum source_internal_format = 0;
12528 source_texture->GetLevelType(source_texture->target(), 0, &source_type, 12530 source_texture->GetLevelType(source_texture->target(), 0, &source_type,
12529 &source_internal_format); 12531 &source_internal_format);
12530 12532
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
12682 copy_texture_CHROMIUM_->Initialize(this); 12684 copy_texture_CHROMIUM_->Initialize(this);
12683 RestoreCurrentFramebufferBindings(); 12685 RestoreCurrentFramebufferBindings();
12684 if (LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM") != GL_NO_ERROR) 12686 if (LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM") != GL_NO_ERROR)
12685 return; 12687 return;
12686 } 12688 }
12687 12689
12688 GLenum dest_type_previous = dest_type; 12690 GLenum dest_type_previous = dest_type;
12689 GLenum dest_internal_format = internal_format; 12691 GLenum dest_internal_format = internal_format;
12690 int dest_width = 0; 12692 int dest_width = 0;
12691 int dest_height = 0; 12693 int dest_height = 0;
12692 bool dest_level_defined = dest_texture->GetLevelSize( 12694 bool dest_level_defined =
12693 GL_TEXTURE_2D, 0, &dest_width, &dest_height, nullptr); 12695 dest_texture->GetLevelSize(target, 0, &dest_width, &dest_height, nullptr);
12694 12696
12695 if (dest_level_defined) { 12697 if (dest_level_defined) {
12696 dest_texture->GetLevelType(GL_TEXTURE_2D, 0, &dest_type_previous, 12698 dest_texture->GetLevelType(target, 0, &dest_type_previous,
12697 &dest_internal_format); 12699 &dest_internal_format);
12698 } 12700 }
12699 12701
12700 // Resize the destination texture to the dimensions of the source texture. 12702 // Resize the destination texture to the dimensions of the source texture.
12701 if (!dest_level_defined || dest_width != source_width || 12703 if (!dest_level_defined || dest_width != source_width ||
12702 dest_height != source_height || 12704 dest_height != source_height ||
12703 dest_internal_format != internal_format || 12705 dest_internal_format != internal_format ||
12704 dest_type_previous != dest_type) { 12706 dest_type_previous != dest_type) {
12705 // Ensure that the glTexImage2D succeeds. 12707 // Ensure that the glTexImage2D succeeds.
12706 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopyTextureCHROMIUM"); 12708 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopyTextureCHROMIUM");
12707 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); 12709 glBindTexture(dest_texture->target(), dest_texture->service_id());
12708 glTexImage2D(GL_TEXTURE_2D, 0, internal_format, source_width, source_height, 12710 glTexImage2D(target, 0, internal_format, source_width, source_height, 0,
12709 0, internal_format, dest_type, NULL); 12711 internal_format, dest_type, NULL);
12710 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM"); 12712 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM");
12711 if (error != GL_NO_ERROR) { 12713 if (error != GL_NO_ERROR) {
12712 RestoreCurrentTextureBindings(&state_, GL_TEXTURE_2D); 12714 RestoreCurrentTextureBindings(&state_, dest_texture->target());
12713 return; 12715 return;
12714 } 12716 }
12715 12717
12716 texture_manager()->SetLevelInfo( 12718 texture_manager()->SetLevelInfo(
12717 dest_texture_ref, GL_TEXTURE_2D, 0, internal_format, source_width, 12719 dest_texture_ref, target, 0, internal_format, source_width,
12718 source_height, 1, 0, internal_format, dest_type, 12720 source_height, 1, 0, internal_format, dest_type,
12719 gfx::Rect(source_width, source_height)); 12721 gfx::Rect(source_width, source_height));
12720 } else { 12722 } else {
12721 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, 12723 texture_manager()->SetLevelCleared(dest_texture_ref, target, 0, true);
12722 true);
12723 } 12724 }
12724 12725
12725 ScopedModifyPixels modify(dest_texture_ref); 12726 ScopedModifyPixels modify(dest_texture_ref);
12726 12727
12727 // Try using GLImage::CopyTexSubImage when possible. 12728 // Try using GLImage::CopyTexSubImage when possible.
12728 bool unpack_premultiply_alpha_change = 12729 bool unpack_premultiply_alpha_change =
12729 (unpack_premultiply_alpha ^ unpack_unmultiply_alpha) != 0; 12730 (unpack_premultiply_alpha ^ unpack_unmultiply_alpha) != 0;
12730 if (image && !unpack_flip_y && !unpack_premultiply_alpha_change) { 12731 if (image && !unpack_flip_y && !unpack_premultiply_alpha_change) {
12731 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); 12732 glBindTexture(dest_texture->target(), dest_texture->service_id());
12732 if (image->CopyTexSubImage(GL_TEXTURE_2D, gfx::Point(0, 0), 12733 if (image->CopyTexSubImage(target, gfx::Point(0, 0),
12733 gfx::Rect(0, 0, source_width, source_height))) { 12734 gfx::Rect(0, 0, source_width, source_height))) {
12734 return; 12735 return;
12735 } 12736 }
12736 } 12737 }
12737 12738
12738 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); 12739 DoWillUseTexImageIfNeeded(source_texture, source_texture->target());
12739 12740
12740 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix 12741 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix
12741 // before presenting. 12742 // before presenting.
12742 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) { 12743 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) {
12743 // TODO(hkuang): get the StreamTexture transform matrix in GPU process 12744 // TODO(hkuang): get the StreamTexture transform matrix in GPU process
12744 // instead of using kIdentityMatrix crbug.com/226218. 12745 // instead of using kIdentityMatrix crbug.com/226218.
12745 copy_texture_CHROMIUM_->DoCopyTextureWithTransform( 12746 copy_texture_CHROMIUM_->DoCopyTextureWithTransform(
12746 this, source_texture->target(), source_texture->service_id(), 12747 this, source_texture->target(), source_texture->service_id(), target,
12747 dest_texture->service_id(), source_width, source_height, 12748 dest_texture->service_id(), internal_format, dest_type, source_width,
12748 unpack_flip_y == GL_TRUE, 12749 source_height, unpack_flip_y == GL_TRUE,
12749 unpack_premultiply_alpha == GL_TRUE, 12750 unpack_premultiply_alpha == GL_TRUE, unpack_unmultiply_alpha == GL_TRUE,
12750 unpack_unmultiply_alpha == GL_TRUE, 12751 &texture_state_, kIdentityMatrix);
12751 kIdentityMatrix);
12752 } else { 12752 } else {
12753 copy_texture_CHROMIUM_->DoCopyTexture( 12753 copy_texture_CHROMIUM_->DoCopyTexture(
12754 this, source_texture->target(), source_texture->service_id(), 12754 this, source_texture->target(), source_texture->service_id(),
12755 source_internal_format, dest_texture->service_id(), internal_format, 12755 source_internal_format, target, dest_texture->service_id(),
12756 source_width, source_height, 12756 internal_format, dest_type, source_width, source_height,
12757 unpack_flip_y == GL_TRUE, 12757 unpack_flip_y == GL_TRUE, unpack_premultiply_alpha == GL_TRUE,
12758 unpack_premultiply_alpha == GL_TRUE, 12758 unpack_unmultiply_alpha == GL_TRUE, &texture_state_);
12759 unpack_unmultiply_alpha == GL_TRUE);
12760 } 12759 }
12761 12760
12762 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); 12761 DoDidUseTexImageIfNeeded(source_texture, source_texture->target());
12763 } 12762 }
12764 12763
12765 void GLES2DecoderImpl::DoCopySubTextureCHROMIUM( 12764 void GLES2DecoderImpl::DoCopySubTextureCHROMIUM(
12766 GLenum target, 12765 GLenum target,
12767 GLuint source_id, 12766 GLuint source_id,
12768 GLuint dest_id, 12767 GLuint dest_id,
12769 GLint xoffset, 12768 GLint xoffset,
12770 GLint yoffset, 12769 GLint yoffset,
12771 GLint x, 12770 GLint x,
12772 GLint y, 12771 GLint y,
12773 GLsizei width, 12772 GLsizei width,
12774 GLsizei height, 12773 GLsizei height,
12775 GLboolean unpack_flip_y, 12774 GLboolean unpack_flip_y,
12776 GLboolean unpack_premultiply_alpha, 12775 GLboolean unpack_premultiply_alpha,
12777 GLboolean unpack_unmultiply_alpha) { 12776 GLboolean unpack_unmultiply_alpha) {
12778 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopySubTextureCHROMIUM"); 12777 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopySubTextureCHROMIUM");
12779 12778
12780 TextureRef* source_texture_ref = GetTexture(source_id); 12779 TextureRef* source_texture_ref = GetTexture(source_id);
12781 TextureRef* dest_texture_ref = GetTexture(dest_id); 12780 TextureRef* dest_texture_ref = GetTexture(dest_id);
12782 Texture* source_texture = source_texture_ref->texture(); 12781 Texture* source_texture = source_texture_ref->texture();
12783 Texture* dest_texture = dest_texture_ref->texture(); 12782 Texture* dest_texture = dest_texture_ref->texture();
12783 GLenum source_type = 0;
12784 GLenum source_internal_format = 0;
12785 source_texture->GetLevelType(source_texture->target(), 0, &source_type,
12786 &source_internal_format);
12784 int source_width = 0; 12787 int source_width = 0;
12785 int source_height = 0; 12788 int source_height = 0;
12786 gfx::GLImage* image = 12789 gfx::GLImage* image =
12787 source_texture->GetLevelImage(source_texture->target(), 0); 12790 source_texture->GetLevelImage(source_texture->target(), 0);
12788 if (image) { 12791 if (image) {
12789 gfx::Size size = image->GetSize(); 12792 gfx::Size size = image->GetSize();
12790 source_width = size.width(); 12793 source_width = size.width();
12791 source_height = size.height(); 12794 source_height = size.height();
12792 if (source_width <= 0 || source_height <= 0) { 12795 if (source_width <= 0 || source_height <= 0) {
12793 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", 12796 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
12794 "invalid image size"); 12797 "invalid image size");
12795 return; 12798 return;
12796 } 12799 }
12797 } else { 12800 } else {
12798 if (!source_texture->GetLevelSize(source_texture->target(), 0, 12801 if (!source_texture->GetLevelSize(source_texture->target(), 0,
12799 &source_width, &source_height, nullptr)) { 12802 &source_width, &source_height, nullptr)) {
12800 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", 12803 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
12801 "source texture has no level 0"); 12804 "source texture has no level 0");
12802 return; 12805 return;
12803 } 12806 }
12804 12807
12808 if (!source_texture->ValidForTexture(source_texture->target(), 0, x, y, 0,
12809 width, height, 1, source_type)) {
12810 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
12811 "source texture bad dimensions.");
12812 return;
12813 }
12814
12805 // Check that this type of texture is allowed. 12815 // Check that this type of texture is allowed.
12806 if (!texture_manager()->ValidForTarget(source_texture->target(), 0, 12816 if (!texture_manager()->ValidForTarget(source_texture->target(), 0,
12807 source_width, source_height, 1)) { 12817 source_width, source_height, 1)) {
12808 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", 12818 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
12809 "source texture bad dimensions"); 12819 "source texture bad dimensions");
12810 return; 12820 return;
12811 } 12821 }
12812 } 12822 }
12813 12823
12814 GLenum source_type = 0;
12815 GLenum source_internal_format = 0;
12816 source_texture->GetLevelType(source_texture->target(), 0, &source_type,
12817 &source_internal_format);
12818 if (!source_texture->ValidForTexture(source_texture->target(), 0, x, y, 0,
12819 width, height, 1, source_type)) {
12820 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
12821 "source texture bad dimensions.");
12822 return;
12823 }
12824
12825 GLenum dest_type = 0; 12824 GLenum dest_type = 0;
12826 GLenum dest_internal_format = 0; 12825 GLenum dest_internal_format = 0;
12827 bool dest_level_defined = dest_texture->GetLevelType( 12826 bool dest_level_defined =
12828 dest_texture->target(), 0, &dest_type, &dest_internal_format); 12827 dest_texture->GetLevelType(target, 0, &dest_type, &dest_internal_format);
12829 if (!dest_level_defined) { 12828 if (!dest_level_defined) {
12830 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glCopySubTextureCHROMIUM", 12829 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glCopySubTextureCHROMIUM",
12831 "destination texture is not defined"); 12830 "destination texture is not defined");
12832 return; 12831 return;
12833 } 12832 }
12834 if (!dest_texture->ValidForTexture(dest_texture->target(), 0, xoffset, 12833 if (!dest_texture->ValidForTexture(target, 0, xoffset, yoffset, 0, width,
12835 yoffset, 0, width, height, 1, dest_type)) { 12834 height, 1, dest_type)) {
12836 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", 12835 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
12837 "destination texture bad dimensions."); 12836 "destination texture bad dimensions.");
12838 return; 12837 return;
12839 } 12838 }
12840 12839
12841 if (!ValidateCopyTextureCHROMIUM("glCopySubTextureCHROMIUM", target, 12840 if (!ValidateCopyTextureCHROMIUM("glCopySubTextureCHROMIUM", target,
12842 source_texture_ref, dest_texture_ref, 12841 source_texture_ref, dest_texture_ref,
12843 dest_internal_format)) { 12842 dest_internal_format)) {
12844 return; 12843 return;
12845 } 12844 }
(...skipping 12 matching lines...) Expand all
12858 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopySubTextureCHROMIUM"); 12857 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopySubTextureCHROMIUM");
12859 copy_texture_CHROMIUM_.reset(new CopyTextureCHROMIUMResourceManager()); 12858 copy_texture_CHROMIUM_.reset(new CopyTextureCHROMIUMResourceManager());
12860 copy_texture_CHROMIUM_->Initialize(this); 12859 copy_texture_CHROMIUM_->Initialize(this);
12861 RestoreCurrentFramebufferBindings(); 12860 RestoreCurrentFramebufferBindings();
12862 if (LOCAL_PEEK_GL_ERROR("glCopySubTextureCHROMIUM") != GL_NO_ERROR) 12861 if (LOCAL_PEEK_GL_ERROR("glCopySubTextureCHROMIUM") != GL_NO_ERROR)
12863 return; 12862 return;
12864 } 12863 }
12865 12864
12866 int dest_width = 0; 12865 int dest_width = 0;
12867 int dest_height = 0; 12866 int dest_height = 0;
12868 bool ok = dest_texture->GetLevelSize( 12867 bool ok =
12869 GL_TEXTURE_2D, 0, &dest_width, &dest_height, nullptr); 12868 dest_texture->GetLevelSize(target, 0, &dest_width, &dest_height, nullptr);
12870 DCHECK(ok); 12869 DCHECK(ok);
12871 if (xoffset != 0 || yoffset != 0 || width != dest_width || 12870 if (xoffset != 0 || yoffset != 0 || width != dest_width ||
12872 height != dest_height) { 12871 height != dest_height) {
12873 gfx::Rect cleared_rect; 12872 gfx::Rect cleared_rect;
12874 if (CombineAdjacentRects(dest_texture->GetLevelClearedRect(target, 0), 12873 if (CombineAdjacentRects(dest_texture->GetLevelClearedRect(target, 0),
12875 gfx::Rect(xoffset, yoffset, width, height), 12874 gfx::Rect(xoffset, yoffset, width, height),
12876 &cleared_rect)) { 12875 &cleared_rect)) {
12877 DCHECK_GE(cleared_rect.size().GetArea(), 12876 DCHECK_GE(cleared_rect.size().GetArea(),
12878 dest_texture->GetLevelClearedRect(target, 0).size().GetArea()); 12877 dest_texture->GetLevelClearedRect(target, 0).size().GetArea());
12879 texture_manager()->SetLevelClearedRect(dest_texture_ref, target, 0, 12878 texture_manager()->SetLevelClearedRect(dest_texture_ref, target, 0,
12880 cleared_rect); 12879 cleared_rect);
12881 } else { 12880 } else {
12882 // Otherwise clear part of texture level that is not already cleared. 12881 // Otherwise clear part of texture level that is not already cleared.
12883 if (!texture_manager()->ClearTextureLevel(this, dest_texture_ref, target, 12882 if (!texture_manager()->ClearTextureLevel(this, dest_texture_ref, target,
12884 0)) { 12883 0)) {
12885 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopySubTextureCHROMIUM", 12884 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopySubTextureCHROMIUM",
12886 "destination texture dimensions too big"); 12885 "destination texture dimensions too big");
12887 return; 12886 return;
12888 } 12887 }
12889 } 12888 }
12890 } else { 12889 } else {
12891 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, 12890 texture_manager()->SetLevelCleared(dest_texture_ref, target, 0, true);
12892 true);
12893 } 12891 }
12894 12892
12895 ScopedModifyPixels modify(dest_texture_ref); 12893 ScopedModifyPixels modify(dest_texture_ref);
12896 12894
12897 // Try using GLImage::CopyTexSubImage when possible. 12895 // Try using GLImage::CopyTexSubImage when possible.
12898 bool unpack_premultiply_alpha_change = 12896 bool unpack_premultiply_alpha_change =
12899 (unpack_premultiply_alpha ^ unpack_unmultiply_alpha) != 0; 12897 (unpack_premultiply_alpha ^ unpack_unmultiply_alpha) != 0;
12900 if (image && !unpack_flip_y && !unpack_premultiply_alpha_change) { 12898 if (image && !unpack_flip_y && !unpack_premultiply_alpha_change) {
12901 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); 12899 glBindTexture(dest_texture->target(), dest_texture->service_id());
12902 if (image->CopyTexSubImage(GL_TEXTURE_2D, gfx::Point(xoffset, yoffset), 12900 if (image->CopyTexSubImage(target, gfx::Point(xoffset, yoffset),
12903 gfx::Rect(x, y, width, height))) { 12901 gfx::Rect(x, y, width, height))) {
12904 return; 12902 return;
12905 } 12903 }
12906 } 12904 }
12907 12905
12908 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); 12906 DoWillUseTexImageIfNeeded(source_texture, source_texture->target());
12909 12907
12910 // TODO(hkuang): get the StreamTexture transform matrix in GPU process. 12908 // TODO(hkuang): get the StreamTexture transform matrix in GPU process.
12911 // crbug.com/226218. 12909 // crbug.com/226218.
12912 copy_texture_CHROMIUM_->DoCopySubTexture( 12910 copy_texture_CHROMIUM_->DoCopySubTexture(
12913 this, source_texture->target(), source_texture->service_id(), 12911 this, source_texture->target(), source_texture->service_id(),
12914 source_internal_format, dest_texture->service_id(), dest_internal_format, 12912 source_internal_format, target, dest_texture->service_id(),
12915 xoffset, yoffset, x, y, width, height, dest_width, dest_height, 12913 dest_internal_format, dest_type, xoffset, yoffset, x, y, width, height,
12916 source_width, source_height, 12914 dest_width, dest_height, source_width, source_height,
12917 unpack_flip_y == GL_TRUE, 12915 unpack_flip_y == GL_TRUE, unpack_premultiply_alpha == GL_TRUE,
12918 unpack_premultiply_alpha == GL_TRUE, 12916 unpack_unmultiply_alpha == GL_TRUE, &texture_state_);
12919 unpack_unmultiply_alpha == GL_TRUE);
12920 12917
12921 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); 12918 DoDidUseTexImageIfNeeded(source_texture, source_texture->target());
12922 } 12919 }
12923 12920
12924 void GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM(GLenum target, 12921 void GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM(GLenum target,
12925 GLuint source_id, 12922 GLuint source_id,
12926 GLuint dest_id) { 12923 GLuint dest_id) {
12927 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM"); 12924 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM");
12928 12925
12929 TextureRef* source_texture_ref = GetTexture(source_id); 12926 TextureRef* source_texture_ref = GetTexture(source_id);
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
13078 source_height, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 13075 source_height, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
13079 gfx::Rect(source_width, source_height)); 13076 gfx::Rect(source_width, source_height));
13080 13077
13081 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix 13078 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix
13082 // before presenting. 13079 // before presenting.
13083 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) { 13080 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) {
13084 // TODO(hkuang): get the StreamTexture transform matrix in GPU process 13081 // TODO(hkuang): get the StreamTexture transform matrix in GPU process
13085 // instead of using kIdentityMatrix crbug.com/226218. 13082 // instead of using kIdentityMatrix crbug.com/226218.
13086 copy_texture_CHROMIUM_->DoCopyTextureWithTransform( 13083 copy_texture_CHROMIUM_->DoCopyTextureWithTransform(
13087 this, source_texture->target(), source_texture->service_id(), 13084 this, source_texture->target(), source_texture->service_id(),
13088 dest_texture->service_id(), source_width, source_height, 13085 GL_TEXTURE_2D, dest_texture->service_id(), GL_RGBA, GL_UNSIGNED_BYTE,
13089 false, false, false, kIdentityMatrix); 13086 source_width, source_height, false, false, false, &texture_state_,
13087 kIdentityMatrix);
13090 } else { 13088 } else {
13091 copy_texture_CHROMIUM_->DoCopyTexture( 13089 copy_texture_CHROMIUM_->DoCopyTexture(
13092 this, source_texture->target(), source_texture->service_id(), 13090 this, source_texture->target(), source_texture->service_id(),
13093 source_internal_format, dest_texture->service_id(), GL_RGBA, 13091 source_internal_format, GL_TEXTURE_2D, dest_texture->service_id(),
13094 source_width, source_height, false, false, false); 13092 GL_RGBA, GL_UNSIGNED_BYTE, source_width, source_height, false, false,
13093 false, &texture_state_);
13095 } 13094 }
13096 13095
13097 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); 13096 DoDidUseTexImageIfNeeded(source_texture, source_texture->target());
13098 } 13097 }
13099 13098
13100 void GLES2DecoderImpl::DoCompressedCopySubTextureCHROMIUM(GLenum target, 13099 void GLES2DecoderImpl::DoCompressedCopySubTextureCHROMIUM(GLenum target,
13101 GLuint source_id, 13100 GLuint source_id,
13102 GLuint dest_id, 13101 GLuint dest_id,
13103 GLint xoffset, 13102 GLint xoffset,
13104 GLint yoffset, 13103 GLint yoffset,
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
13272 13271
13273 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedCopyTextureCHROMIUM"); 13272 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedCopyTextureCHROMIUM");
13274 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height, 0, GL_RGBA, 13273 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height, 0, GL_RGBA,
13275 GL_UNSIGNED_BYTE, NULL); 13274 GL_UNSIGNED_BYTE, NULL);
13276 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedCopySubTextureCHROMIUM"); 13275 GLenum error = LOCAL_PEEK_GL_ERROR("glCompressedCopySubTextureCHROMIUM");
13277 if (error != GL_NO_ERROR) 13276 if (error != GL_NO_ERROR)
13278 return; 13277 return;
13279 13278
13280 copy_texture_CHROMIUM_->DoCopyTexture( 13279 copy_texture_CHROMIUM_->DoCopyTexture(
13281 this, dest_texture->target(), dest_texture->service_id(), 13280 this, dest_texture->target(), dest_texture->service_id(),
13282 dest_internal_format, tmp_service_id, GL_RGBA, 13281 dest_internal_format, GL_TEXTURE_2D, tmp_service_id, GL_RGBA,
13283 dest_width, dest_height, false, false, false); 13282 GL_UNSIGNED_BYTE, dest_width, dest_height, false, false, false,
13283 &texture_state_);
13284 13284
13285 // Redefine destination texture to use RGBA. 13285 // Redefine destination texture to use RGBA.
13286 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); 13286 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id());
13287 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedCopyTextureCHROMIUM"); 13287 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedCopyTextureCHROMIUM");
13288 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height, 0, GL_RGBA, 13288 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height, 0, GL_RGBA,
13289 GL_UNSIGNED_BYTE, NULL); 13289 GL_UNSIGNED_BYTE, NULL);
13290 error = LOCAL_PEEK_GL_ERROR("glCompressedCopySubTextureCHROMIUM"); 13290 error = LOCAL_PEEK_GL_ERROR("glCompressedCopySubTextureCHROMIUM");
13291 if (error != GL_NO_ERROR) 13291 if (error != GL_NO_ERROR)
13292 return; 13292 return;
13293 13293
13294 texture_manager()->SetLevelInfo( 13294 texture_manager()->SetLevelInfo(
13295 dest_texture_ref, GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height, 13295 dest_texture_ref, GL_TEXTURE_2D, 0, GL_RGBA, dest_width, dest_height,
13296 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect(dest_width, dest_height)); 13296 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect(dest_width, dest_height));
13297 13297
13298 copy_texture_CHROMIUM_->DoCopyTexture( 13298 copy_texture_CHROMIUM_->DoCopyTexture(
13299 this, GL_TEXTURE_2D, tmp_service_id, GL_RGBA, 13299 this, GL_TEXTURE_2D, tmp_service_id, GL_RGBA, GL_TEXTURE_2D,
13300 dest_texture->service_id(), GL_RGBA, 13300 dest_texture->service_id(), GL_RGBA, GL_UNSIGNED_BYTE, dest_width,
13301 dest_width, dest_height, false, false, false); 13301 dest_height, false, false, false, &texture_state_);
13302 13302
13303 glDeleteTextures(1, &tmp_service_id); 13303 glDeleteTextures(1, &tmp_service_id);
13304 } 13304 }
13305 13305
13306 // TODO(hkuang): get the StreamTexture transform matrix in GPU process. 13306 // TODO(hkuang): get the StreamTexture transform matrix in GPU process.
13307 // crbug.com/226218. 13307 // crbug.com/226218.
13308 copy_texture_CHROMIUM_->DoCopySubTexture( 13308 copy_texture_CHROMIUM_->DoCopySubTexture(
13309 this, source_texture->target(), source_texture->service_id(), 13309 this, source_texture->target(), source_texture->service_id(),
13310 source_internal_format, dest_texture->service_id(), GL_RGBA, 13310 source_internal_format, GL_TEXTURE_2D, dest_texture->service_id(),
13311 xoffset, yoffset, x, y, width, height, dest_width, dest_height, 13311 GL_RGBA, GL_UNSIGNED_BYTE, xoffset, yoffset, x, y, width, height,
13312 source_width, source_height, false, false, false); 13312 dest_width, dest_height, source_width, source_height, false, false, false,
13313 &texture_state_);
13313 13314
13314 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); 13315 DoDidUseTexImageIfNeeded(source_texture, source_texture->target());
13315 } 13316 }
13316 13317
13317 static GLenum ExtractTypeFromStorageFormat(GLenum internalformat) { 13318 static GLenum ExtractTypeFromStorageFormat(GLenum internalformat) {
13318 switch (internalformat) { 13319 switch (internalformat) {
13319 case GL_R8: 13320 case GL_R8:
13320 return GL_UNSIGNED_BYTE; 13321 return GL_UNSIGNED_BYTE;
13321 case GL_R8_SNORM: 13322 case GL_R8_SNORM:
13322 return GL_BYTE; 13323 return GL_BYTE;
(...skipping 1435 matching lines...) Expand 10 before | Expand all | Expand 10 after
14758 return error::kNoError; 14759 return error::kNoError;
14759 } 14760 }
14760 14761
14761 // Include the auto-generated part of this file. We split this because it means 14762 // Include the auto-generated part of this file. We split this because it means
14762 // we can easily edit the non-auto generated parts right here in this file 14763 // we can easily edit the non-auto generated parts right here in this file
14763 // instead of having to edit some template or the code generator. 14764 // instead of having to edit some template or the code generator.
14764 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 14765 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
14765 14766
14766 } // namespace gles2 14767 } // namespace gles2
14767 } // namespace gpu 14768 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698