| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/texture_manager.h" | 5 #include "gpu/command_buffer/service/texture_manager.h" |
| 6 #include "base/bits.h" | 6 #include "base/bits.h" |
| 7 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 7 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
| 8 #include "gpu/command_buffer/service/feature_info.h" | 8 #include "gpu/command_buffer/service/feature_info.h" |
| 9 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 9 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 10 | 10 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 black_cube_texture_id_, | 81 black_cube_texture_id_, |
| 82 default_texture_2d_->service_id(), | 82 default_texture_2d_->service_id(), |
| 83 default_texture_cube_map_->service_id(), | 83 default_texture_cube_map_->service_id(), |
| 84 }; | 84 }; |
| 85 glDeleteTextures(arraysize(ids), ids); | 85 glDeleteTextures(arraysize(ids), ids); |
| 86 } | 86 } |
| 87 } | 87 } |
| 88 | 88 |
| 89 bool TextureManager::TextureInfo::CanRender( | 89 bool TextureManager::TextureInfo::CanRender( |
| 90 const FeatureInfo* feature_info) const { | 90 const FeatureInfo* feature_info) const { |
| 91 if (target_ == 0 || IsDeleted()) { | 91 if (target_ == 0) { |
| 92 return false; | 92 return false; |
| 93 } | 93 } |
| 94 bool needs_mips = NeedsMips(); | 94 bool needs_mips = NeedsMips(); |
| 95 if (npot() && !feature_info->feature_flags().npot_ok) { | 95 if (npot() && !feature_info->feature_flags().npot_ok) { |
| 96 return !needs_mips && | 96 return !needs_mips && |
| 97 wrap_s_ == GL_CLAMP_TO_EDGE && | 97 wrap_s_ == GL_CLAMP_TO_EDGE && |
| 98 wrap_t_ == GL_CLAMP_TO_EDGE; | 98 wrap_t_ == GL_CLAMP_TO_EDGE; |
| 99 } | 99 } |
| 100 if (needs_mips) { | 100 if (needs_mips) { |
| 101 if (target_ == GL_TEXTURE_2D) { | 101 if (target_ == GL_TEXTURE_2D) { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 | 153 |
| 154 if (target == GL_TEXTURE_EXTERNAL_OES) { | 154 if (target == GL_TEXTURE_EXTERNAL_OES) { |
| 155 min_filter_ = GL_LINEAR; | 155 min_filter_ = GL_LINEAR; |
| 156 wrap_s_ = wrap_t_ = GL_CLAMP_TO_EDGE; | 156 wrap_s_ = wrap_t_ = GL_CLAMP_TO_EDGE; |
| 157 } | 157 } |
| 158 } | 158 } |
| 159 | 159 |
| 160 bool TextureManager::TextureInfo::CanGenerateMipmaps( | 160 bool TextureManager::TextureInfo::CanGenerateMipmaps( |
| 161 const FeatureInfo* feature_info) const { | 161 const FeatureInfo* feature_info) const { |
| 162 if ((npot() && !feature_info->feature_flags().npot_ok) || | 162 if ((npot() && !feature_info->feature_flags().npot_ok) || |
| 163 level_infos_.empty() || IsDeleted() || | 163 level_infos_.empty() || |
| 164 target_ == GL_TEXTURE_EXTERNAL_OES) { | 164 target_ == GL_TEXTURE_EXTERNAL_OES) { |
| 165 return false; | 165 return false; |
| 166 } | 166 } |
| 167 const TextureInfo::LevelInfo& first = level_infos_[0][0]; | 167 const TextureInfo::LevelInfo& first = level_infos_[0][0]; |
| 168 // TODO(gman): Check internal_format, format and type. | 168 // TODO(gman): Check internal_format, format and type. |
| 169 for (size_t ii = 0; ii < level_infos_.size(); ++ii) { | 169 for (size_t ii = 0; ii < level_infos_.size(); ++ii) { |
| 170 const LevelInfo& info = level_infos_[ii][0]; | 170 const LevelInfo& info = level_infos_[ii][0]; |
| 171 if ((info.target == 0) || | 171 if ((info.target == 0) || |
| 172 (info.width != first.width) || | 172 (info.width != first.width) || |
| 173 (info.height != first.height) || | 173 (info.height != first.height) || |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 bool TextureManager::TextureInfo::ValidForTexture( | 265 bool TextureManager::TextureInfo::ValidForTexture( |
| 266 GLint face, | 266 GLint face, |
| 267 GLint level, | 267 GLint level, |
| 268 GLint xoffset, | 268 GLint xoffset, |
| 269 GLint yoffset, | 269 GLint yoffset, |
| 270 GLsizei width, | 270 GLsizei width, |
| 271 GLsizei height, | 271 GLsizei height, |
| 272 GLenum format, | 272 GLenum format, |
| 273 GLenum type) const { | 273 GLenum type) const { |
| 274 size_t face_index = GLTargetToFaceIndex(face); | 274 size_t face_index = GLTargetToFaceIndex(face); |
| 275 if (!IsDeleted() && level >= 0 && face_index < level_infos_.size() && | 275 if (level >= 0 && face_index < level_infos_.size() && |
| 276 static_cast<size_t>(level) < level_infos_[face_index].size()) { | 276 static_cast<size_t>(level) < level_infos_[face_index].size()) { |
| 277 const LevelInfo& info = level_infos_[GLTargetToFaceIndex(face)][level]; | 277 const LevelInfo& info = level_infos_[GLTargetToFaceIndex(face)][level]; |
| 278 GLint right; | 278 GLint right; |
| 279 GLint top; | 279 GLint top; |
| 280 return SafeAdd(xoffset, width, &right) && | 280 return SafeAdd(xoffset, width, &right) && |
| 281 SafeAdd(yoffset, height, &top) && | 281 SafeAdd(yoffset, height, &top) && |
| 282 xoffset >= 0 && | 282 xoffset >= 0 && |
| 283 yoffset >= 0 && | 283 yoffset >= 0 && |
| 284 right <= info.width && | 284 right <= info.width && |
| 285 top <= info.height && | 285 top <= info.height && |
| 286 format == info.internal_format && | 286 format == info.internal_format && |
| 287 type == info.type; | 287 type == info.type; |
| 288 } | 288 } |
| 289 return false; | 289 return false; |
| 290 } | 290 } |
| 291 | 291 |
| 292 bool TextureManager::TextureInfo::GetLevelSize( | 292 bool TextureManager::TextureInfo::GetLevelSize( |
| 293 GLint face, GLint level, GLsizei* width, GLsizei* height) const { | 293 GLint face, GLint level, GLsizei* width, GLsizei* height) const { |
| 294 DCHECK(width); | 294 DCHECK(width); |
| 295 DCHECK(height); | 295 DCHECK(height); |
| 296 size_t face_index = GLTargetToFaceIndex(face); | 296 size_t face_index = GLTargetToFaceIndex(face); |
| 297 if (!IsDeleted() && level >= 0 && face_index < level_infos_.size() && | 297 if (level >= 0 && face_index < level_infos_.size() && |
| 298 static_cast<size_t>(level) < level_infos_[face_index].size()) { | 298 static_cast<size_t>(level) < level_infos_[face_index].size()) { |
| 299 const LevelInfo& info = level_infos_[GLTargetToFaceIndex(face)][level]; | 299 const LevelInfo& info = level_infos_[GLTargetToFaceIndex(face)][level]; |
| 300 if (info.target != 0) { | 300 if (info.target != 0) { |
| 301 *width = info.width; | 301 *width = info.width; |
| 302 *height = info.height; | 302 *height = info.height; |
| 303 return true; | 303 return true; |
| 304 } | 304 } |
| 305 } | 305 } |
| 306 return false; | 306 return false; |
| 307 } | 307 } |
| 308 | 308 |
| 309 bool TextureManager::TextureInfo::GetLevelType( | 309 bool TextureManager::TextureInfo::GetLevelType( |
| 310 GLint face, GLint level, GLenum* type, GLenum* internal_format) const { | 310 GLint face, GLint level, GLenum* type, GLenum* internal_format) const { |
| 311 DCHECK(type); | 311 DCHECK(type); |
| 312 DCHECK(internal_format); | 312 DCHECK(internal_format); |
| 313 size_t face_index = GLTargetToFaceIndex(face); | 313 size_t face_index = GLTargetToFaceIndex(face); |
| 314 if (!IsDeleted() && level >= 0 && face_index < level_infos_.size() && | 314 if (level >= 0 && face_index < level_infos_.size() && |
| 315 static_cast<size_t>(level) < level_infos_[face_index].size()) { | 315 static_cast<size_t>(level) < level_infos_[face_index].size()) { |
| 316 const LevelInfo& info = level_infos_[GLTargetToFaceIndex(face)][level]; | 316 const LevelInfo& info = level_infos_[GLTargetToFaceIndex(face)][level]; |
| 317 if (info.target != 0) { | 317 if (info.target != 0) { |
| 318 *type = info.type; | 318 *type = info.type; |
| 319 *internal_format = info.internal_format; | 319 *internal_format = info.internal_format; |
| 320 return true; | 320 return true; |
| 321 } | 321 } |
| 322 } | 322 } |
| 323 return false; | 323 return false; |
| 324 } | 324 } |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 472 } | 472 } |
| 473 } | 473 } |
| 474 } | 474 } |
| 475 } | 475 } |
| 476 cleared_ = true; | 476 cleared_ = true; |
| 477 return true; | 477 return true; |
| 478 } | 478 } |
| 479 | 479 |
| 480 bool TextureManager::TextureInfo::IsLevelCleared(GLenum target, GLint level) { | 480 bool TextureManager::TextureInfo::IsLevelCleared(GLenum target, GLint level) { |
| 481 size_t face_index = GLTargetToFaceIndex(target); | 481 size_t face_index = GLTargetToFaceIndex(target); |
| 482 if (IsDeleted() || | 482 if (face_index >= level_infos_.size() || |
| 483 face_index >= level_infos_.size() || | |
| 484 level >= static_cast<GLint>(level_infos_[face_index].size())) { | 483 level >= static_cast<GLint>(level_infos_[face_index].size())) { |
| 485 return true; | 484 return true; |
| 486 } | 485 } |
| 487 | 486 |
| 488 TextureInfo::LevelInfo& info = level_infos_[face_index][level]; | 487 TextureInfo::LevelInfo& info = level_infos_[face_index][level]; |
| 489 | 488 |
| 490 return info.cleared; | 489 return info.cleared; |
| 491 } | 490 } |
| 492 | 491 |
| 493 bool TextureManager::TextureInfo::ClearLevel( | 492 bool TextureManager::TextureInfo::ClearLevel( |
| 494 GLES2Decoder* decoder, GLenum target, GLint level) { | 493 GLES2Decoder* decoder, GLenum target, GLint level) { |
| 495 DCHECK(decoder); | 494 DCHECK(decoder); |
| 496 size_t face_index = GLTargetToFaceIndex(target); | 495 size_t face_index = GLTargetToFaceIndex(target); |
| 497 if (IsDeleted() || | 496 if (face_index >= level_infos_.size() || |
| 498 face_index >= level_infos_.size() || | |
| 499 level >= static_cast<GLint>(level_infos_[face_index].size())) { | 497 level >= static_cast<GLint>(level_infos_[face_index].size())) { |
| 500 return true; | 498 return true; |
| 501 } | 499 } |
| 502 | 500 |
| 503 TextureInfo::LevelInfo& info = level_infos_[face_index][level]; | 501 TextureInfo::LevelInfo& info = level_infos_[face_index][level]; |
| 504 | 502 |
| 505 DCHECK(target == info.target); | 503 DCHECK(target == info.target); |
| 506 | 504 |
| 507 if (info.target == 0 || | 505 if (info.target == 0 || |
| 508 info.cleared || | 506 info.cleared || |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 } | 641 } |
| 644 info->SetTarget(target, MaxLevelsForTarget(target)); | 642 info->SetTarget(target, MaxLevelsForTarget(target)); |
| 645 if (!info->CanRender(feature_info)) { | 643 if (!info->CanRender(feature_info)) { |
| 646 ++num_unrenderable_textures_; | 644 ++num_unrenderable_textures_; |
| 647 } | 645 } |
| 648 } | 646 } |
| 649 | 647 |
| 650 void TextureManager::SetLevelCleared( | 648 void TextureManager::SetLevelCleared( |
| 651 TextureManager::TextureInfo* info, GLenum target, GLint level) { | 649 TextureManager::TextureInfo* info, GLenum target, GLint level) { |
| 652 DCHECK(info); | 650 DCHECK(info); |
| 653 DCHECK(!info->IsDeleted()); | |
| 654 if (!info->SafeToRenderFrom()) { | 651 if (!info->SafeToRenderFrom()) { |
| 655 DCHECK_NE(0, num_unsafe_textures_); | 652 DCHECK_NE(0, num_unsafe_textures_); |
| 656 --num_unsafe_textures_; | 653 --num_unsafe_textures_; |
| 657 } | 654 } |
| 658 num_uncleared_mips_ -= info->num_uncleared_mips(); | 655 num_uncleared_mips_ -= info->num_uncleared_mips(); |
| 659 DCHECK_GE(num_uncleared_mips_, 0); | 656 DCHECK_GE(num_uncleared_mips_, 0); |
| 660 info->SetLevelCleared(target, level); | 657 info->SetLevelCleared(target, level); |
| 661 num_uncleared_mips_ += info->num_uncleared_mips(); | 658 num_uncleared_mips_ += info->num_uncleared_mips(); |
| 662 if (!info->SafeToRenderFrom()) { | 659 if (!info->SafeToRenderFrom()) { |
| 663 ++num_unsafe_textures_; | 660 ++num_unsafe_textures_; |
| 664 } | 661 } |
| 665 } | 662 } |
| 666 | 663 |
| 667 bool TextureManager::ClearRenderableLevels( | 664 bool TextureManager::ClearRenderableLevels( |
| 668 GLES2Decoder* decoder,TextureManager::TextureInfo* info) { | 665 GLES2Decoder* decoder,TextureManager::TextureInfo* info) { |
| 669 DCHECK(info); | 666 DCHECK(info); |
| 670 DCHECK(!info->IsDeleted()); | |
| 671 if (info->SafeToRenderFrom()) { | 667 if (info->SafeToRenderFrom()) { |
| 672 return true; | 668 return true; |
| 673 } | 669 } |
| 674 DCHECK_NE(0, num_unsafe_textures_); | 670 DCHECK_NE(0, num_unsafe_textures_); |
| 675 --num_unsafe_textures_; | 671 --num_unsafe_textures_; |
| 676 num_uncleared_mips_ -= info->num_uncleared_mips(); | 672 num_uncleared_mips_ -= info->num_uncleared_mips(); |
| 677 DCHECK_GE(num_uncleared_mips_, 0); | 673 DCHECK_GE(num_uncleared_mips_, 0); |
| 678 bool result = info->ClearRenderableLevels(decoder); | 674 bool result = info->ClearRenderableLevels(decoder); |
| 679 num_uncleared_mips_ += info->num_uncleared_mips(); | 675 num_uncleared_mips_ += info->num_uncleared_mips(); |
| 680 if (!info->SafeToRenderFrom()) { | 676 if (!info->SafeToRenderFrom()) { |
| 681 ++num_unsafe_textures_; | 677 ++num_unsafe_textures_; |
| 682 } | 678 } |
| 683 return result; | 679 return result; |
| 684 } | 680 } |
| 685 | 681 |
| 686 bool TextureManager::ClearTextureLevel( | 682 bool TextureManager::ClearTextureLevel( |
| 687 GLES2Decoder* decoder,TextureManager::TextureInfo* info, | 683 GLES2Decoder* decoder,TextureManager::TextureInfo* info, |
| 688 GLenum target, GLint level) { | 684 GLenum target, GLint level) { |
| 689 DCHECK(info); | 685 DCHECK(info); |
| 690 DCHECK(!info->IsDeleted()); | |
| 691 if (info->num_uncleared_mips() == 0) { | 686 if (info->num_uncleared_mips() == 0) { |
| 692 return true; | 687 return true; |
| 693 } | 688 } |
| 694 num_uncleared_mips_ -= info->num_uncleared_mips(); | 689 num_uncleared_mips_ -= info->num_uncleared_mips(); |
| 695 DCHECK_GE(num_uncleared_mips_, 0); | 690 DCHECK_GE(num_uncleared_mips_, 0); |
| 696 if (!info->SafeToRenderFrom()) { | 691 if (!info->SafeToRenderFrom()) { |
| 697 DCHECK_NE(0, num_unsafe_textures_); | 692 DCHECK_NE(0, num_unsafe_textures_); |
| 698 --num_unsafe_textures_; | 693 --num_unsafe_textures_; |
| 699 } | 694 } |
| 700 bool result = info->ClearLevel(decoder, target, level); | 695 bool result = info->ClearLevel(decoder, target, level); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 713 GLint level, | 708 GLint level, |
| 714 GLenum internal_format, | 709 GLenum internal_format, |
| 715 GLsizei width, | 710 GLsizei width, |
| 716 GLsizei height, | 711 GLsizei height, |
| 717 GLsizei depth, | 712 GLsizei depth, |
| 718 GLint border, | 713 GLint border, |
| 719 GLenum format, | 714 GLenum format, |
| 720 GLenum type, | 715 GLenum type, |
| 721 bool cleared) { | 716 bool cleared) { |
| 722 DCHECK(info); | 717 DCHECK(info); |
| 723 DCHECK(!info->IsDeleted()); | |
| 724 if (!info->CanRender(feature_info)) { | 718 if (!info->CanRender(feature_info)) { |
| 725 DCHECK_NE(0, num_unrenderable_textures_); | 719 DCHECK_NE(0, num_unrenderable_textures_); |
| 726 --num_unrenderable_textures_; | 720 --num_unrenderable_textures_; |
| 727 } | 721 } |
| 728 if (!info->SafeToRenderFrom()) { | 722 if (!info->SafeToRenderFrom()) { |
| 729 DCHECK_NE(0, num_unsafe_textures_); | 723 DCHECK_NE(0, num_unsafe_textures_); |
| 730 --num_unsafe_textures_; | 724 --num_unsafe_textures_; |
| 731 } | 725 } |
| 732 num_uncleared_mips_ -= info->num_uncleared_mips(); | 726 num_uncleared_mips_ -= info->num_uncleared_mips(); |
| 733 DCHECK_GE(num_uncleared_mips_, 0); | 727 DCHECK_GE(num_uncleared_mips_, 0); |
| 734 info->SetLevelInfo( | 728 info->SetLevelInfo( |
| 735 feature_info, target, level, internal_format, width, height, depth, | 729 feature_info, target, level, internal_format, width, height, depth, |
| 736 border, format, type, cleared); | 730 border, format, type, cleared); |
| 737 num_uncleared_mips_ += info->num_uncleared_mips(); | 731 num_uncleared_mips_ += info->num_uncleared_mips(); |
| 738 if (!info->CanRender(feature_info)) { | 732 if (!info->CanRender(feature_info)) { |
| 739 ++num_unrenderable_textures_; | 733 ++num_unrenderable_textures_; |
| 740 } | 734 } |
| 741 if (!info->SafeToRenderFrom()) { | 735 if (!info->SafeToRenderFrom()) { |
| 742 ++num_unsafe_textures_; | 736 ++num_unsafe_textures_; |
| 743 } | 737 } |
| 744 } | 738 } |
| 745 | 739 |
| 746 bool TextureManager::SetParameter( | 740 bool TextureManager::SetParameter( |
| 747 const FeatureInfo* feature_info, | 741 const FeatureInfo* feature_info, |
| 748 TextureManager::TextureInfo* info, GLenum pname, GLint param) { | 742 TextureManager::TextureInfo* info, GLenum pname, GLint param) { |
| 749 DCHECK(feature_info); | 743 DCHECK(feature_info); |
| 750 DCHECK(info); | 744 DCHECK(info); |
| 751 DCHECK(!info->IsDeleted()); | |
| 752 if (!info->CanRender(feature_info)) { | 745 if (!info->CanRender(feature_info)) { |
| 753 DCHECK_NE(0, num_unrenderable_textures_); | 746 DCHECK_NE(0, num_unrenderable_textures_); |
| 754 --num_unrenderable_textures_; | 747 --num_unrenderable_textures_; |
| 755 } | 748 } |
| 756 if (!info->SafeToRenderFrom()) { | 749 if (!info->SafeToRenderFrom()) { |
| 757 DCHECK_NE(0, num_unsafe_textures_); | 750 DCHECK_NE(0, num_unsafe_textures_); |
| 758 --num_unsafe_textures_; | 751 --num_unsafe_textures_; |
| 759 } | 752 } |
| 760 bool result = info->SetParameter(feature_info, pname, param); | 753 bool result = info->SetParameter(feature_info, pname, param); |
| 761 if (!info->CanRender(feature_info)) { | 754 if (!info->CanRender(feature_info)) { |
| 762 ++num_unrenderable_textures_; | 755 ++num_unrenderable_textures_; |
| 763 } | 756 } |
| 764 if (!info->SafeToRenderFrom()) { | 757 if (!info->SafeToRenderFrom()) { |
| 765 ++num_unsafe_textures_; | 758 ++num_unsafe_textures_; |
| 766 } | 759 } |
| 767 return result; | 760 return result; |
| 768 } | 761 } |
| 769 | 762 |
| 770 bool TextureManager::MarkMipmapsGenerated( | 763 bool TextureManager::MarkMipmapsGenerated( |
| 771 const FeatureInfo* feature_info, | 764 const FeatureInfo* feature_info, |
| 772 TextureManager::TextureInfo* info) { | 765 TextureManager::TextureInfo* info) { |
| 773 DCHECK(info); | 766 DCHECK(info); |
| 774 DCHECK(!info->IsDeleted()); | |
| 775 if (!info->CanRender(feature_info)) { | 767 if (!info->CanRender(feature_info)) { |
| 776 DCHECK_NE(0, num_unrenderable_textures_); | 768 DCHECK_NE(0, num_unrenderable_textures_); |
| 777 --num_unrenderable_textures_; | 769 --num_unrenderable_textures_; |
| 778 } | 770 } |
| 779 if (!info->SafeToRenderFrom()) { | 771 if (!info->SafeToRenderFrom()) { |
| 780 DCHECK_NE(0, num_unsafe_textures_); | 772 DCHECK_NE(0, num_unsafe_textures_); |
| 781 --num_unsafe_textures_; | 773 --num_unsafe_textures_; |
| 782 } | 774 } |
| 783 num_uncleared_mips_ -= info->num_uncleared_mips(); | 775 num_uncleared_mips_ -= info->num_uncleared_mips(); |
| 784 DCHECK_GE(num_uncleared_mips_, 0); | 776 DCHECK_GE(num_uncleared_mips_, 0); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 845 return true; | 837 return true; |
| 846 } | 838 } |
| 847 } | 839 } |
| 848 return false; | 840 return false; |
| 849 } | 841 } |
| 850 | 842 |
| 851 } // namespace gles2 | 843 } // namespace gles2 |
| 852 } // namespace gpu | 844 } // namespace gpu |
| 853 | 845 |
| 854 | 846 |
| OLD | NEW |