Chromium Code Reviews| 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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 74 | 74 |
| 75 #if defined(OS_WIN) | 75 #if defined(OS_WIN) |
| 76 #include "base/win/win_util.h" | 76 #include "base/win/win_util.h" |
| 77 #endif | 77 #endif |
| 78 | 78 |
| 79 namespace gpu { | 79 namespace gpu { |
| 80 namespace gles2 { | 80 namespace gles2 { |
| 81 | 81 |
| 82 namespace { | 82 namespace { |
| 83 | 83 |
| 84 static const char kOESDerivativeExtension[] = "GL_OES_standard_derivatives"; | 84 const char kOESDerivativeExtension[] = "GL_OES_standard_derivatives"; |
| 85 static const char kEXTFragDepthExtension[] = "GL_EXT_frag_depth"; | 85 const char kEXTFragDepthExtension[] = "GL_EXT_frag_depth"; |
| 86 static const char kEXTDrawBuffersExtension[] = "GL_EXT_draw_buffers"; | 86 const char kEXTDrawBuffersExtension[] = "GL_EXT_draw_buffers"; |
| 87 static const char kEXTShaderTextureLodExtension[] = "GL_EXT_shader_texture_lod"; | 87 const char kEXTShaderTextureLodExtension[] = "GL_EXT_shader_texture_lod"; |
| 88 | |
| 89 GLfloat kIdentityMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, | |
|
Ken Russell (switch to Gerrit)
2015/01/24 01:33:24
Should be const.
dshwang
2015/02/10 18:11:55
Done.
| |
| 90 0.0f, 1.0f, 0.0f, 0.0f, | |
| 91 0.0f, 0.0f, 1.0f, 0.0f, | |
| 92 0.0f, 0.0f, 0.0f, 1.0f}; | |
| 88 | 93 |
| 89 static bool PrecisionMeetsSpecForHighpFloat(GLint rangeMin, | 94 static bool PrecisionMeetsSpecForHighpFloat(GLint rangeMin, |
| 90 GLint rangeMax, | 95 GLint rangeMax, |
| 91 GLint precision) { | 96 GLint precision) { |
| 92 return (rangeMin >= 62) && (rangeMax >= 62) && (precision >= 16); | 97 return (rangeMin >= 62) && (rangeMax >= 62) && (precision >= 16); |
| 93 } | 98 } |
| 94 | 99 |
| 95 static void GetShaderPrecisionFormatImpl(GLenum shader_type, | 100 static void GetShaderPrecisionFormatImpl(GLenum shader_type, |
| 96 GLenum precision_type, | 101 GLenum precision_type, |
| 97 GLint *range, GLint *precision) { | 102 GLint *range, GLint *precision) { |
| (...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 929 const void * data); | 934 const void * data); |
| 930 | 935 |
| 931 // Wrapper for TexImageIOSurface2DCHROMIUM. | 936 // Wrapper for TexImageIOSurface2DCHROMIUM. |
| 932 void DoTexImageIOSurface2DCHROMIUM( | 937 void DoTexImageIOSurface2DCHROMIUM( |
| 933 GLenum target, | 938 GLenum target, |
| 934 GLsizei width, | 939 GLsizei width, |
| 935 GLsizei height, | 940 GLsizei height, |
| 936 GLuint io_surface_id, | 941 GLuint io_surface_id, |
| 937 GLuint plane); | 942 GLuint plane); |
| 938 | 943 |
| 939 void DoCopyTextureCHROMIUM( | 944 void DoCopyTextureCHROMIUM(GLenum target, |
| 940 GLenum target, | 945 GLuint source_id, |
| 941 GLuint source_id, | 946 GLuint dest_id, |
| 942 GLuint target_id, | 947 GLint level, |
| 943 GLint level, | 948 GLenum internal_format, |
| 944 GLenum internal_format, | 949 GLenum dest_type); |
| 945 GLenum dest_type); | 950 |
| 951 void DoCopySubTextureCHROMIUM(GLenum target, | |
| 952 GLuint source_id, | |
| 953 GLuint dest_id, | |
| 954 GLint level, | |
| 955 GLint xoffset, | |
| 956 GLint yoffset); | |
| 946 | 957 |
| 947 // Wrapper for TexStorage2DEXT. | 958 // Wrapper for TexStorage2DEXT. |
| 948 void DoTexStorage2DEXT( | 959 void DoTexStorage2DEXT( |
| 949 GLenum target, | 960 GLenum target, |
| 950 GLint levels, | 961 GLint levels, |
| 951 GLenum internal_format, | 962 GLenum internal_format, |
| 952 GLsizei width, | 963 GLsizei width, |
| 953 GLsizei height); | 964 GLsizei height); |
| 954 | 965 |
| 955 void DoProduceTextureCHROMIUM(GLenum target, const GLbyte* key); | 966 void DoProduceTextureCHROMIUM(GLenum target, const GLbyte* key); |
| (...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1649 const char* function_name, | 1660 const char* function_name, |
| 1650 GLint level, GLsizei width, GLsizei height, GLenum format); | 1661 GLint level, GLsizei width, GLsizei height, GLenum format); |
| 1651 bool ValidateCompressedTexFuncData( | 1662 bool ValidateCompressedTexFuncData( |
| 1652 const char* function_name, | 1663 const char* function_name, |
| 1653 GLsizei width, GLsizei height, GLenum format, size_t size); | 1664 GLsizei width, GLsizei height, GLenum format, size_t size); |
| 1654 bool ValidateCompressedTexSubDimensions( | 1665 bool ValidateCompressedTexSubDimensions( |
| 1655 const char* function_name, | 1666 const char* function_name, |
| 1656 GLenum target, GLint level, GLint xoffset, GLint yoffset, | 1667 GLenum target, GLint level, GLint xoffset, GLint yoffset, |
| 1657 GLsizei width, GLsizei height, GLenum format, | 1668 GLsizei width, GLsizei height, GLenum format, |
| 1658 Texture* texture); | 1669 Texture* texture); |
| 1670 bool ValidateCopyTextureCHROMIUM(const char* function_name, | |
| 1671 GLenum target, | |
| 1672 TextureRef* source_texture_ref, | |
| 1673 TextureRef* dest_texture_ref, | |
| 1674 GLint level, | |
| 1675 GLenum dest_internal_format); | |
| 1659 | 1676 |
| 1660 void RenderWarning(const char* filename, int line, const std::string& msg); | 1677 void RenderWarning(const char* filename, int line, const std::string& msg); |
| 1661 void PerformanceWarning( | 1678 void PerformanceWarning( |
| 1662 const char* filename, int line, const std::string& msg); | 1679 const char* filename, int line, const std::string& msg); |
| 1663 | 1680 |
| 1664 const FeatureInfo::FeatureFlags& features() const { | 1681 const FeatureInfo::FeatureFlags& features() const { |
| 1665 return feature_info_->feature_flags(); | 1682 return feature_info_->feature_flags(); |
| 1666 } | 1683 } |
| 1667 | 1684 |
| 1668 const FeatureInfo::Workarounds& workarounds() const { | 1685 const FeatureInfo::Workarounds& workarounds() const { |
| (...skipping 8839 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10508 return GL_LUMINANCE_ALPHA; | 10525 return GL_LUMINANCE_ALPHA; |
| 10509 case GL_BGRA8_EXT: | 10526 case GL_BGRA8_EXT: |
| 10510 return GL_BGRA_EXT; | 10527 return GL_BGRA_EXT; |
| 10511 case GL_SRGB8_ALPHA8_EXT: | 10528 case GL_SRGB8_ALPHA8_EXT: |
| 10512 return GL_SRGB_ALPHA_EXT; | 10529 return GL_SRGB_ALPHA_EXT; |
| 10513 default: | 10530 default: |
| 10514 return GL_NONE; | 10531 return GL_NONE; |
| 10515 } | 10532 } |
| 10516 } | 10533 } |
| 10517 | 10534 |
| 10518 void GLES2DecoderImpl::DoCopyTextureCHROMIUM( | 10535 bool GLES2DecoderImpl::ValidateCopyTextureCHROMIUM( |
| 10519 GLenum target, GLuint source_id, GLuint dest_id, GLint level, | 10536 const char* function_name, |
| 10520 GLenum internal_format, GLenum dest_type) { | 10537 GLenum target, |
| 10521 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopyTextureCHROMIUM"); | 10538 TextureRef* source_texture_ref, |
| 10522 | 10539 TextureRef* dest_texture_ref, |
| 10523 TextureRef* dest_texture_ref = GetTexture(dest_id); | 10540 GLint level, |
| 10524 TextureRef* source_texture_ref = GetTexture(source_id); | 10541 GLenum dest_internal_format) { |
| 10525 | |
| 10526 if (!source_texture_ref || !dest_texture_ref) { | 10542 if (!source_texture_ref || !dest_texture_ref) { |
| 10527 LOCAL_SET_GL_ERROR( | 10543 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "unknown texture id"); |
| 10528 GL_INVALID_VALUE, "glCopyTextureCHROMIUM", "unknown texture id"); | 10544 return false; |
| 10529 return; | |
| 10530 } | 10545 } |
| 10531 | 10546 |
| 10532 if (GL_TEXTURE_2D != target) { | 10547 if (GL_TEXTURE_2D != target) { |
| 10533 LOCAL_SET_GL_ERROR( | 10548 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, |
| 10534 GL_INVALID_VALUE, "glCopyTextureCHROMIUM", "invalid texture target"); | 10549 "invalid texture target"); |
| 10535 return; | 10550 return false; |
| 10551 } | |
| 10552 | |
| 10553 if (level) { | |
| 10554 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "level must be 0"); | |
| 10555 return false; | |
| 10536 } | 10556 } |
| 10537 | 10557 |
| 10538 Texture* source_texture = source_texture_ref->texture(); | 10558 Texture* source_texture = source_texture_ref->texture(); |
| 10539 Texture* dest_texture = dest_texture_ref->texture(); | 10559 Texture* dest_texture = dest_texture_ref->texture(); |
| 10560 if (source_texture == dest_texture) { | |
| 10561 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name, | |
| 10562 "source and destination textures are the same"); | |
| 10563 return false; | |
| 10564 } | |
| 10565 | |
| 10540 if (dest_texture->target() != GL_TEXTURE_2D || | 10566 if (dest_texture->target() != GL_TEXTURE_2D || |
| 10541 (source_texture->target() != GL_TEXTURE_2D && | 10567 (source_texture->target() != GL_TEXTURE_2D && |
| 10542 source_texture->target() != GL_TEXTURE_RECTANGLE_ARB && | 10568 source_texture->target() != GL_TEXTURE_RECTANGLE_ARB && |
| 10543 source_texture->target() != GL_TEXTURE_EXTERNAL_OES)) { | 10569 source_texture->target() != GL_TEXTURE_EXTERNAL_OES)) { |
| 10544 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, | 10570 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, |
| 10545 "glCopyTextureCHROMIUM", | |
| 10546 "invalid texture target binding"); | 10571 "invalid texture target binding"); |
| 10547 return; | 10572 return false; |
| 10548 } | 10573 } |
| 10549 | 10574 |
| 10550 int source_width, source_height, dest_width, dest_height; | 10575 GLenum source_type = 0; |
| 10576 GLenum source_internal_format = 0; | |
| 10577 source_texture->GetLevelType(source_texture->target(), 0, &source_type, | |
| 10578 &source_internal_format); | |
| 10551 | 10579 |
| 10580 // The destination format should be GL_RGB, or GL_RGBA. GL_ALPHA, | |
| 10581 // GL_LUMINANCE, and GL_LUMINANCE_ALPHA are not supported because they are not | |
| 10582 // renderable on some platforms. | |
| 10583 bool valid_dest_format = dest_internal_format == GL_RGB || | |
| 10584 dest_internal_format == GL_RGBA || | |
| 10585 dest_internal_format == GL_BGRA_EXT; | |
| 10586 bool valid_source_format = source_internal_format == GL_ALPHA || | |
| 10587 source_internal_format == GL_RGB || | |
| 10588 source_internal_format == GL_RGBA || | |
| 10589 source_internal_format == GL_LUMINANCE || | |
| 10590 source_internal_format == GL_LUMINANCE_ALPHA || | |
| 10591 source_internal_format == GL_BGRA_EXT; | |
| 10592 if (!valid_source_format || !valid_dest_format) { | |
| 10593 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name, | |
| 10594 "invalid internal format"); | |
| 10595 return false; | |
| 10596 } | |
| 10597 return true; | |
| 10598 } | |
| 10599 | |
| 10600 void GLES2DecoderImpl::DoCopyTextureCHROMIUM(GLenum target, | |
| 10601 GLuint source_id, | |
| 10602 GLuint dest_id, | |
| 10603 GLint level, | |
| 10604 GLenum internal_format, | |
| 10605 GLenum dest_type) { | |
| 10606 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopyTextureCHROMIUM"); | |
| 10607 | |
| 10608 TextureRef* source_texture_ref = GetTexture(source_id); | |
| 10609 TextureRef* dest_texture_ref = GetTexture(dest_id); | |
| 10610 Texture* source_texture = source_texture_ref->texture(); | |
| 10611 Texture* dest_texture = dest_texture_ref->texture(); | |
| 10612 int source_width = 0; | |
| 10613 int source_height = 0; | |
| 10552 gfx::GLImage* image = | 10614 gfx::GLImage* image = |
| 10553 source_texture->GetLevelImage(source_texture->target(), 0); | 10615 source_texture->GetLevelImage(source_texture->target(), 0); |
| 10554 if (image) { | 10616 if (image) { |
| 10555 gfx::Size size = image->GetSize(); | 10617 gfx::Size size = image->GetSize(); |
| 10556 source_width = size.width(); | 10618 source_width = size.width(); |
| 10557 source_height = size.height(); | 10619 source_height = size.height(); |
| 10558 if (source_width <= 0 || source_height <= 0) { | 10620 if (source_width <= 0 || source_height <= 0) { |
| 10559 LOCAL_SET_GL_ERROR( | 10621 LOCAL_SET_GL_ERROR( |
| 10560 GL_INVALID_VALUE, | 10622 GL_INVALID_VALUE, |
| 10561 "glCopyTextureChromium", "invalid image size"); | 10623 "glCopyTextureChromium", "invalid image size"); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 10572 | 10634 |
| 10573 // Check that this type of texture is allowed. | 10635 // Check that this type of texture is allowed. |
| 10574 if (!texture_manager()->ValidForTarget( | 10636 if (!texture_manager()->ValidForTarget( |
| 10575 source_texture->target(), level, source_width, source_height, 1)) { | 10637 source_texture->target(), level, source_width, source_height, 1)) { |
| 10576 LOCAL_SET_GL_ERROR( | 10638 LOCAL_SET_GL_ERROR( |
| 10577 GL_INVALID_VALUE, "glCopyTextureCHROMIUM", "Bad dimensions"); | 10639 GL_INVALID_VALUE, "glCopyTextureCHROMIUM", "Bad dimensions"); |
| 10578 return; | 10640 return; |
| 10579 } | 10641 } |
| 10580 } | 10642 } |
| 10581 | 10643 |
| 10582 // Clear the source texture if necessary. | |
| 10583 if (!texture_manager()->ClearTextureLevel( | |
| 10584 this, source_texture_ref, source_texture->target(), 0)) { | |
| 10585 LOCAL_SET_GL_ERROR( | |
| 10586 GL_OUT_OF_MEMORY, "glCopyTextureCHROMIUM", "dimensions too big"); | |
| 10587 return; | |
| 10588 } | |
| 10589 | |
| 10590 GLenum source_type = 0; | 10644 GLenum source_type = 0; |
| 10591 GLenum source_internal_format = 0; | 10645 GLenum source_internal_format = 0; |
| 10592 source_texture->GetLevelType( | 10646 source_texture->GetLevelType( |
| 10593 source_texture->target(), 0, &source_type, &source_internal_format); | 10647 source_texture->target(), 0, &source_type, &source_internal_format); |
| 10594 | 10648 |
| 10595 // The destination format should be GL_RGB, or GL_RGBA. GL_ALPHA, | 10649 if (dest_texture->IsImmutable()) { |
| 10596 // GL_LUMINANCE, and GL_LUMINANCE_ALPHA are not supported because they are not | 10650 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glCopyTextureCHROMIUM", |
| 10597 // renderable on some platforms. | 10651 "texture is immutable"); |
| 10598 bool valid_dest_format = internal_format == GL_RGB || | |
| 10599 internal_format == GL_RGBA || | |
| 10600 internal_format == GL_BGRA_EXT; | |
| 10601 bool valid_source_format = source_internal_format == GL_ALPHA || | |
| 10602 source_internal_format == GL_RGB || | |
| 10603 source_internal_format == GL_RGBA || | |
| 10604 source_internal_format == GL_LUMINANCE || | |
| 10605 source_internal_format == GL_LUMINANCE_ALPHA || | |
| 10606 source_internal_format == GL_BGRA_EXT; | |
| 10607 if (!valid_source_format || !valid_dest_format) { | |
| 10608 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, | |
| 10609 "glCopyTextureCHROMIUM", | |
| 10610 "invalid internal format"); | |
| 10611 return; | 10652 return; |
| 10612 } | 10653 } |
| 10613 | 10654 |
| 10655 if (!ValidateCopyTextureCHROMIUM("glCopyTextureCHROMIUM", target, | |
| 10656 source_texture_ref, dest_texture_ref, level, | |
| 10657 internal_format)) { | |
| 10658 return; | |
| 10659 } | |
| 10660 | |
| 10661 // Clear the source texture if necessary. | |
| 10662 if (!texture_manager()->ClearTextureLevel(this, source_texture_ref, | |
| 10663 source_texture->target(), 0)) { | |
| 10664 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopyTextureCHROMIUM", | |
| 10665 "dimensions too big"); | |
| 10666 return; | |
| 10667 } | |
| 10668 | |
| 10614 // Defer initializing the CopyTextureCHROMIUMResourceManager until it is | 10669 // Defer initializing the CopyTextureCHROMIUMResourceManager until it is |
| 10615 // needed because it takes 10s of milliseconds to initialize. | 10670 // needed because it takes 10s of milliseconds to initialize. |
| 10616 if (!copy_texture_CHROMIUM_.get()) { | 10671 if (!copy_texture_CHROMIUM_.get()) { |
| 10617 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopyTextureCHROMIUM"); | 10672 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopyTextureCHROMIUM"); |
| 10618 copy_texture_CHROMIUM_.reset(new CopyTextureCHROMIUMResourceManager()); | 10673 copy_texture_CHROMIUM_.reset(new CopyTextureCHROMIUMResourceManager()); |
| 10619 copy_texture_CHROMIUM_->Initialize(this); | 10674 copy_texture_CHROMIUM_->Initialize(this); |
| 10620 RestoreCurrentFramebufferBindings(); | 10675 RestoreCurrentFramebufferBindings(); |
| 10621 if (LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM") != GL_NO_ERROR) | 10676 if (LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM") != GL_NO_ERROR) |
| 10622 return; | 10677 return; |
| 10623 } | 10678 } |
| 10624 | 10679 |
| 10625 GLenum dest_type_previous = dest_type; | 10680 GLenum dest_type_previous = dest_type; |
| 10626 GLenum dest_internal_format = internal_format; | 10681 GLenum dest_internal_format = internal_format; |
| 10682 int dest_width = 0; | |
| 10683 int dest_height = 0; | |
| 10627 bool dest_level_defined = dest_texture->GetLevelSize( | 10684 bool dest_level_defined = dest_texture->GetLevelSize( |
| 10628 GL_TEXTURE_2D, level, &dest_width, &dest_height); | 10685 GL_TEXTURE_2D, level, &dest_width, &dest_height); |
| 10629 | 10686 |
| 10630 if (dest_level_defined) { | 10687 if (dest_level_defined) { |
| 10631 dest_texture->GetLevelType(GL_TEXTURE_2D, level, &dest_type_previous, | 10688 dest_texture->GetLevelType(GL_TEXTURE_2D, level, &dest_type_previous, |
| 10632 &dest_internal_format); | 10689 &dest_internal_format); |
| 10633 } | 10690 } |
| 10634 | 10691 |
| 10635 // Resize the destination texture to the dimensions of the source texture. | 10692 // Resize the destination texture to the dimensions of the source texture. |
| 10636 if (!dest_level_defined || dest_width != source_width || | 10693 if (!dest_level_defined || dest_width != source_width || |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 10667 if (image->CopyTexImage(GL_TEXTURE_2D)) | 10724 if (image->CopyTexImage(GL_TEXTURE_2D)) |
| 10668 return; | 10725 return; |
| 10669 } | 10726 } |
| 10670 | 10727 |
| 10671 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); | 10728 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); |
| 10672 | 10729 |
| 10673 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix | 10730 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix |
| 10674 // before presenting. | 10731 // before presenting. |
| 10675 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) { | 10732 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) { |
| 10676 // TODO(hkuang): get the StreamTexture transform matrix in GPU process | 10733 // TODO(hkuang): get the StreamTexture transform matrix in GPU process |
| 10677 // instead of using default matrix crbug.com/226218. | 10734 // instead of using kIdentityMatrix crbug.com/226218. |
| 10678 const static GLfloat default_matrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, | |
| 10679 0.0f, 1.0f, 0.0f, 0.0f, | |
| 10680 0.0f, 0.0f, 1.0f, 0.0f, | |
| 10681 0.0f, 0.0f, 0.0f, 1.0f}; | |
| 10682 copy_texture_CHROMIUM_->DoCopyTextureWithTransform( | 10735 copy_texture_CHROMIUM_->DoCopyTextureWithTransform( |
| 10683 this, | 10736 this, source_texture->target(), source_texture->service_id(), |
| 10684 source_texture->target(), | 10737 dest_texture->service_id(), level, source_width, source_height, |
| 10685 source_texture->service_id(), | 10738 unpack_flip_y_, unpack_premultiply_alpha_, unpack_unpremultiply_alpha_, |
| 10686 dest_texture->service_id(), | 10739 kIdentityMatrix); |
| 10687 level, | |
| 10688 source_width, | |
| 10689 source_height, | |
| 10690 unpack_flip_y_, | |
| 10691 unpack_premultiply_alpha_, | |
| 10692 unpack_unpremultiply_alpha_, | |
| 10693 default_matrix); | |
| 10694 } else { | 10740 } else { |
| 10695 copy_texture_CHROMIUM_->DoCopyTexture(this, | 10741 copy_texture_CHROMIUM_->DoCopyTexture( |
| 10696 source_texture->target(), | 10742 this, source_texture->target(), source_texture->service_id(), |
| 10697 source_texture->service_id(), | 10743 source_internal_format, dest_texture->service_id(), level, |
| 10698 source_internal_format, | 10744 internal_format, source_width, source_height, unpack_flip_y_, |
| 10699 dest_texture->service_id(), | 10745 unpack_premultiply_alpha_, unpack_unpremultiply_alpha_); |
| 10700 level, | |
| 10701 internal_format, | |
| 10702 source_width, | |
| 10703 source_height, | |
| 10704 unpack_flip_y_, | |
| 10705 unpack_premultiply_alpha_, | |
| 10706 unpack_unpremultiply_alpha_); | |
| 10707 } | 10746 } |
| 10708 | 10747 |
| 10709 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); | 10748 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); |
| 10749 } | |
| 10750 | |
| 10751 void GLES2DecoderImpl::DoCopySubTextureCHROMIUM(GLenum target, | |
| 10752 GLuint source_id, | |
| 10753 GLuint dest_id, | |
| 10754 GLint level, | |
| 10755 GLint xoffset, | |
| 10756 GLint yoffset) { | |
| 10757 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopySubTextureCHROMIUM"); | |
| 10758 | |
| 10759 TextureRef* source_texture_ref = GetTexture(source_id); | |
| 10760 TextureRef* dest_texture_ref = GetTexture(dest_id); | |
| 10761 Texture* source_texture = source_texture_ref->texture(); | |
| 10762 Texture* dest_texture = dest_texture_ref->texture(); | |
| 10763 int source_width = 0; | |
| 10764 int source_height = 0; | |
| 10765 gfx::GLImage* image = | |
| 10766 source_texture->GetLevelImage(source_texture->target(), 0); | |
| 10767 if (image) { | |
| 10768 gfx::Size size = image->GetSize(); | |
| 10769 source_width = size.width(); | |
| 10770 source_height = size.height(); | |
| 10771 if (source_width <= 0 || source_height <= 0) { | |
| 10772 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", | |
| 10773 "invalid image size"); | |
| 10774 return; | |
| 10775 } | |
| 10776 } else { | |
| 10777 if (!source_texture->GetLevelSize(source_texture->target(), 0, | |
| 10778 &source_width, &source_height)) { | |
| 10779 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", | |
| 10780 "source texture has no level 0"); | |
| 10781 return; | |
| 10782 } | |
| 10783 | |
| 10784 // Check that this type of texture is allowed. | |
| 10785 if (!texture_manager()->ValidForTarget(source_texture->target(), level, | |
| 10786 source_width, source_height, 1)) { | |
| 10787 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", | |
| 10788 "source texture bad dimensions"); | |
| 10789 return; | |
| 10790 } | |
| 10791 } | |
| 10792 | |
| 10793 GLenum source_type = 0; | |
| 10794 GLenum source_internal_format = 0; | |
| 10795 source_texture->GetLevelType(source_texture->target(), 0, &source_type, | |
| 10796 &source_internal_format); | |
| 10797 GLenum dest_type = 0; | |
| 10798 GLenum dest_internal_format = 0; | |
| 10799 bool dest_level_defined = dest_texture->GetLevelType( | |
| 10800 dest_texture->target(), level, &dest_type, &dest_internal_format); | |
| 10801 if (!dest_level_defined) { | |
| 10802 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glCopySubTextureCHROMIUM", | |
| 10803 "destination texture is not defined"); | |
| 10804 return; | |
| 10805 } | |
| 10806 if (!dest_texture->ValidForTexture(dest_texture->target(), level, xoffset, | |
| 10807 yoffset, source_width, source_height, | |
| 10808 dest_type)) { | |
| 10809 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", | |
| 10810 "destination texture bad dimensions."); | |
| 10811 return; | |
| 10812 } | |
| 10813 | |
| 10814 if (!ValidateCopyTextureCHROMIUM("glCopySubTextureCHROMIUM", target, | |
| 10815 source_texture_ref, dest_texture_ref, level, | |
| 10816 dest_internal_format)) { | |
| 10817 return; | |
| 10818 } | |
| 10819 | |
| 10820 // Clear the source texture if necessary. | |
| 10821 if (!texture_manager()->ClearTextureLevel(this, source_texture_ref, | |
| 10822 source_texture->target(), 0)) { | |
| 10823 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopySubTextureCHROMIUM", | |
| 10824 "source texture dimensions too big"); | |
| 10825 return; | |
| 10826 } | |
| 10827 | |
| 10828 // Defer initializing the CopyTextureCHROMIUMResourceManager until it is | |
| 10829 // needed because it takes 10s of milliseconds to initialize. | |
| 10830 if (!copy_texture_CHROMIUM_.get()) { | |
| 10831 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopySubTextureCHROMIUM"); | |
| 10832 copy_texture_CHROMIUM_.reset(new CopyTextureCHROMIUMResourceManager()); | |
| 10833 copy_texture_CHROMIUM_->Initialize(this); | |
| 10834 RestoreCurrentFramebufferBindings(); | |
| 10835 if (LOCAL_PEEK_GL_ERROR("glCopySubTextureCHROMIUM") != GL_NO_ERROR) | |
| 10836 return; | |
| 10837 } | |
| 10838 | |
| 10839 int dest_width = 0; | |
| 10840 int dest_height = 0; | |
| 10841 bool ok = dest_texture->GetLevelSize(GL_TEXTURE_2D, level, &dest_width, | |
| 10842 &dest_height); | |
| 10843 DCHECK(ok); | |
| 10844 if (xoffset != 0 || yoffset != 0 || source_width != dest_width || | |
| 10845 source_height != dest_height) { | |
| 10846 if (!texture_manager()->ClearTextureLevel(this, dest_texture_ref, target, | |
| 10847 level)) { | |
| 10848 LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopySubTextureCHROMIUM", | |
| 10849 "destination texture dimensions too big"); | |
| 10850 return; | |
| 10851 } | |
| 10852 } else { | |
| 10853 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, level, | |
| 10854 true); | |
| 10855 } | |
| 10856 | |
| 10857 ScopedModifyPixels modify(dest_texture_ref); | |
| 10858 | |
| 10859 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); | |
| 10860 | |
| 10861 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix | |
| 10862 // before presenting. | |
| 10863 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) { | |
| 10864 // TODO(hkuang): get the StreamTexture transform matrix in GPU process | |
| 10865 // instead of using kIdentityMatrix crbug.com/226218. | |
| 10866 copy_texture_CHROMIUM_->DoCopySubTextureWithTransform( | |
| 10867 this, source_texture->target(), source_texture->service_id(), | |
| 10868 dest_texture->service_id(), level, xoffset, yoffset, dest_width, | |
| 10869 dest_height, source_width, source_height, unpack_flip_y_, | |
| 10870 unpack_premultiply_alpha_, unpack_unpremultiply_alpha_, | |
| 10871 kIdentityMatrix); | |
| 10872 } else { | |
| 10873 copy_texture_CHROMIUM_->DoCopySubTexture( | |
| 10874 this, source_texture->target(), source_texture->service_id(), | |
| 10875 source_internal_format, dest_texture->service_id(), level, | |
| 10876 dest_internal_format, xoffset, yoffset, dest_width, dest_height, | |
| 10877 source_width, source_height, unpack_flip_y_, unpack_premultiply_alpha_, | |
| 10878 unpack_unpremultiply_alpha_); | |
| 10879 } | |
| 10880 | |
| 10881 DoDidUseTexImageIfNeeded(source_texture, source_texture->target()); | |
| 10710 } | 10882 } |
| 10711 | 10883 |
| 10712 static GLenum ExtractTypeFromStorageFormat(GLenum internalformat) { | 10884 static GLenum ExtractTypeFromStorageFormat(GLenum internalformat) { |
| 10713 switch (internalformat) { | 10885 switch (internalformat) { |
| 10714 case GL_RGB565: | 10886 case GL_RGB565: |
| 10715 return GL_UNSIGNED_SHORT_5_6_5; | 10887 return GL_UNSIGNED_SHORT_5_6_5; |
| 10716 case GL_RGBA4: | 10888 case GL_RGBA4: |
| 10717 return GL_UNSIGNED_SHORT_4_4_4_4; | 10889 return GL_UNSIGNED_SHORT_4_4_4_4; |
| 10718 case GL_RGB5_A1: | 10890 case GL_RGB5_A1: |
| 10719 return GL_UNSIGNED_SHORT_5_5_5_1; | 10891 return GL_UNSIGNED_SHORT_5_5_5_1; |
| (...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11301 DCHECK(matrix_mode == GL_PATH_PROJECTION_CHROMIUM || | 11473 DCHECK(matrix_mode == GL_PATH_PROJECTION_CHROMIUM || |
| 11302 matrix_mode == GL_PATH_MODELVIEW_CHROMIUM); | 11474 matrix_mode == GL_PATH_MODELVIEW_CHROMIUM); |
| 11303 | 11475 |
| 11304 if (!features().chromium_path_rendering) { | 11476 if (!features().chromium_path_rendering) { |
| 11305 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, | 11477 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, |
| 11306 "glMatrixLoadIdentityCHROMIUM", | 11478 "glMatrixLoadIdentityCHROMIUM", |
| 11307 "function not available"); | 11479 "function not available"); |
| 11308 return; | 11480 return; |
| 11309 } | 11481 } |
| 11310 | 11482 |
| 11311 static GLfloat kIdentityMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, | |
| 11312 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, | |
| 11313 0.0f, 0.0f, 0.0f, 1.0f}; | |
| 11314 | |
| 11315 GLfloat* target_matrix = matrix_mode == GL_PATH_PROJECTION_CHROMIUM | 11483 GLfloat* target_matrix = matrix_mode == GL_PATH_PROJECTION_CHROMIUM |
| 11316 ? state_.projection_matrix | 11484 ? state_.projection_matrix |
| 11317 : state_.modelview_matrix; | 11485 : state_.modelview_matrix; |
| 11318 memcpy(target_matrix, kIdentityMatrix, sizeof(kIdentityMatrix)); | 11486 memcpy(target_matrix, kIdentityMatrix, sizeof(kIdentityMatrix)); |
| 11319 // The matrix_mode is either GL_PATH_MODELVIEW_NV or GL_PATH_PROJECTION_NV | 11487 // The matrix_mode is either GL_PATH_MODELVIEW_NV or GL_PATH_PROJECTION_NV |
| 11320 // since the values of the _NV and _CHROMIUM tokens match. | 11488 // since the values of the _NV and _CHROMIUM tokens match. |
| 11321 glMatrixLoadIdentityEXT(matrix_mode); | 11489 glMatrixLoadIdentityEXT(matrix_mode); |
| 11322 } | 11490 } |
| 11323 | 11491 |
| 11324 bool GLES2DecoderImpl::ValidateAsyncTransfer( | 11492 bool GLES2DecoderImpl::ValidateAsyncTransfer( |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11643 } | 11811 } |
| 11644 } | 11812 } |
| 11645 | 11813 |
| 11646 // Include the auto-generated part of this file. We split this because it means | 11814 // Include the auto-generated part of this file. We split this because it means |
| 11647 // we can easily edit the non-auto generated parts right here in this file | 11815 // we can easily edit the non-auto generated parts right here in this file |
| 11648 // instead of having to edit some template or the code generator. | 11816 // instead of having to edit some template or the code generator. |
| 11649 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 11817 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 11650 | 11818 |
| 11651 } // namespace gles2 | 11819 } // namespace gles2 |
| 11652 } // namespace gpu | 11820 } // namespace gpu |
| OLD | NEW |