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

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

Issue 8515023: Allow deleted resources to be used (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 1 month 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 | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc ('k') | gpu/command_buffer/service/texture_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698