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 |