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

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

Issue 1299683002: gpu: If not cube complete, the texture isn't renderable, no matter mipmap complete. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 4 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/texture_manager.h" 5 #include "gpu/command_buffer/service/texture_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 GLsizei height_; 47 GLsizei height_;
48 GLsizei depth_; 48 GLsizei depth_;
49 GLfloat max_lod_; 49 GLfloat max_lod_;
50 GLfloat min_lod_; 50 GLfloat min_lod_;
51 GLint base_level_; 51 GLint base_level_;
52 GLint border_; 52 GLint border_;
53 GLint max_level_; 53 GLint max_level_;
54 GLenum format_; 54 GLenum format_;
55 GLenum type_; 55 GLenum type_;
56 bool has_image_; 56 bool has_image_;
57 bool can_render_; 57 bool texture_complete_;
58 bool can_render_to_; 58 bool can_render_to_;
59 bool npot_; 59 bool npot_;
60 60
61 // Since we will be hashing this signature structure, the padding must be 61 // Since we will be hashing this signature structure, the padding must be
62 // zero initialized. Although the C++11 specifications specify that this is 62 // zero initialized. Although the C++11 specifications specify that this is
63 // true, we will use a constructor with a memset to further enforce it instead 63 // true, we will use a constructor with a memset to further enforce it instead
64 // of relying on compilers adhering to this deep dark corner specification. 64 // of relying on compilers adhering to this deep dark corner specification.
65 TextureSignature(GLenum target, 65 TextureSignature(GLenum target,
66 GLint level, 66 GLint level,
67 GLenum min_filter, 67 GLenum min_filter,
68 GLenum mag_filter, 68 GLenum mag_filter,
69 GLenum wrap_r, 69 GLenum wrap_r,
70 GLenum wrap_s, 70 GLenum wrap_s,
71 GLenum wrap_t, 71 GLenum wrap_t,
72 GLenum usage, 72 GLenum usage,
73 GLenum internal_format, 73 GLenum internal_format,
74 GLenum compare_func, 74 GLenum compare_func,
75 GLenum compare_mode, 75 GLenum compare_mode,
76 GLsizei width, 76 GLsizei width,
77 GLsizei height, 77 GLsizei height,
78 GLsizei depth, 78 GLsizei depth,
79 GLfloat max_lod, 79 GLfloat max_lod,
80 GLfloat min_lod, 80 GLfloat min_lod,
81 GLint base_level, 81 GLint base_level,
82 GLint border, 82 GLint border,
83 GLint max_level, 83 GLint max_level,
84 GLenum format, 84 GLenum format,
85 GLenum type, 85 GLenum type,
86 bool has_image, 86 bool has_image,
87 bool can_render, 87 bool texture_complete,
88 bool can_render_to, 88 bool can_render_to,
89 bool npot) { 89 bool npot) {
90 memset(this, 0, sizeof(TextureSignature)); 90 memset(this, 0, sizeof(TextureSignature));
91 target_ = target; 91 target_ = target;
92 level_ = level; 92 level_ = level;
93 min_filter_ = min_filter; 93 min_filter_ = min_filter;
94 mag_filter_ = mag_filter; 94 mag_filter_ = mag_filter;
95 wrap_r_ = wrap_r; 95 wrap_r_ = wrap_r;
96 wrap_s_ = wrap_s; 96 wrap_s_ = wrap_s;
97 wrap_t_ = wrap_t; 97 wrap_t_ = wrap_t;
98 usage_ = usage; 98 usage_ = usage;
99 internal_format_ = internal_format; 99 internal_format_ = internal_format;
100 compare_func_ = compare_func; 100 compare_func_ = compare_func;
101 compare_mode_ = compare_mode; 101 compare_mode_ = compare_mode;
102 width_ = width; 102 width_ = width;
103 height_ = height; 103 height_ = height;
104 depth_ = depth; 104 depth_ = depth;
105 max_lod_ = max_lod; 105 max_lod_ = max_lod;
106 min_lod_ = min_lod; 106 min_lod_ = min_lod;
107 base_level_ = base_level; 107 base_level_ = base_level;
108 border_ = border; 108 border_ = border;
109 max_level_ = max_level; 109 max_level_ = max_level;
110 format_ = format; 110 format_ = format;
111 type_ = type; 111 type_ = type;
112 has_image_ = has_image; 112 has_image_ = has_image;
113 can_render_ = can_render; 113 texture_complete_ = texture_complete;
114 can_render_to_ = can_render_to; 114 can_render_to_ = can_render_to;
115 npot_ = npot; 115 npot_ = npot;
116 } 116 }
117 }; 117 };
118 118
119 class FormatTypeValidator { 119 class FormatTypeValidator {
120 public: 120 public:
121 FormatTypeValidator() { 121 FormatTypeValidator() {
122 static const FormatType kSupportedFormatTypes[] = { 122 static const FormatType kSupportedFormatTypes[] = {
123 // ES2. 123 // ES2.
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 wrap_t_(GL_REPEAT), 321 wrap_t_(GL_REPEAT),
322 usage_(GL_NONE), 322 usage_(GL_NONE),
323 pool_(GL_TEXTURE_POOL_UNMANAGED_CHROMIUM), 323 pool_(GL_TEXTURE_POOL_UNMANAGED_CHROMIUM),
324 compare_func_(GL_LEQUAL), 324 compare_func_(GL_LEQUAL),
325 compare_mode_(GL_NONE), 325 compare_mode_(GL_NONE),
326 max_lod_(1000.0f), 326 max_lod_(1000.0f),
327 min_lod_(-1000.0f), 327 min_lod_(-1000.0f),
328 base_level_(0), 328 base_level_(0),
329 max_level_(1000), 329 max_level_(1000),
330 max_level_set_(-1), 330 max_level_set_(-1),
331 texture_complete_(false), 331 texture_2d_complete_(false),
332 texture_mips_dirty_(false), 332 texture_mips_dirty_(false),
333 texture_mips_complete_(false), 333 texture_mips_complete_(false),
334 cube_complete_(false), 334 cube_complete_(false),
335 texture_level0_dirty_(false), 335 texture_level0_dirty_(false),
336 texture_level0_complete_(false), 336 texture_level0_complete_(false),
337 npot_(false), 337 npot_(false),
338 has_been_bound_(false), 338 has_been_bound_(false),
339 framebuffer_attachment_count_(0), 339 framebuffer_attachment_count_(0),
340 immutable_(false), 340 immutable_(false),
341 has_images_(false), 341 has_images_(false),
342 estimated_size_(0), 342 estimated_size_(0),
343 can_render_condition_(CAN_RENDER_ALWAYS), 343 texture_completeness(TEXTURE_COMPLETE_ALWAYS),
344 texture_max_anisotropy_initialized_(false) { 344 texture_max_anisotropy_initialized_(false) {}
345 }
346 345
347 Texture::~Texture() { 346 Texture::~Texture() {
348 if (mailbox_manager_) 347 if (mailbox_manager_)
349 mailbox_manager_->TextureDeleted(this); 348 mailbox_manager_->TextureDeleted(this);
350 } 349 }
351 350
352 void Texture::AddTextureRef(TextureRef* ref) { 351 void Texture::AddTextureRef(TextureRef* ref) {
353 DCHECK(refs_.find(ref) == refs_.end()); 352 DCHECK(refs_.find(ref) == refs_.end());
354 refs_.insert(ref); 353 refs_.insert(ref);
355 if (!memory_tracking_ref_) { 354 if (!memory_tracking_ref_) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 Texture::LevelInfo::~LevelInfo() { 414 Texture::LevelInfo::~LevelInfo() {
416 } 415 }
417 416
418 Texture::FaceInfo::FaceInfo() 417 Texture::FaceInfo::FaceInfo()
419 : num_mip_levels(0) { 418 : num_mip_levels(0) {
420 } 419 }
421 420
422 Texture::FaceInfo::~FaceInfo() { 421 Texture::FaceInfo::~FaceInfo() {
423 } 422 }
424 423
425 Texture::CanRenderCondition Texture::GetCanRenderCondition() const { 424 Texture::TextureCompleteness Texture::GetTextureCompleteness() const {
426 if (target_ == 0) 425 if (target_ == 0)
427 return CAN_RENDER_ALWAYS; 426 return TEXTURE_COMPLETE_ALWAYS;
428 427
429 if (target_ != GL_TEXTURE_EXTERNAL_OES) { 428 if (target_ != GL_TEXTURE_EXTERNAL_OES) {
430 if (face_infos_.empty()) { 429 if (face_infos_.empty()) {
431 return CAN_RENDER_NEVER; 430 return TEXTURE_INCOMPLETE;
432 } 431 }
433 432
434 const Texture::LevelInfo& first_face = face_infos_[0].level_infos[0]; 433 const Texture::LevelInfo& first_face = face_infos_[0].level_infos[0];
435 if (first_face.width == 0 || 434 if (first_face.width == 0 ||
436 first_face.height == 0 || 435 first_face.height == 0 ||
437 first_face.depth == 0) { 436 first_face.depth == 0) {
438 return CAN_RENDER_NEVER; 437 return TEXTURE_INCOMPLETE;
439 } 438 }
440 } 439 }
441 440
442 bool needs_mips = NeedsMips(); 441 bool needs_mips = NeedsMips();
443 if (needs_mips) { 442 if (needs_mips) {
444 if (!texture_complete()) 443 if (!texture_2d_complete())
445 return CAN_RENDER_NEVER; 444 return TEXTURE_INCOMPLETE;
446 if (target_ == GL_TEXTURE_CUBE_MAP && !cube_complete()) 445 if (target_ == GL_TEXTURE_CUBE_MAP && !cube_complete())
447 return CAN_RENDER_NEVER; 446 return TEXTURE_INCOMPLETE;
448 } 447 }
449 448
450 bool is_npot_compatible = !needs_mips && 449 bool is_npot_compatible = !needs_mips &&
451 wrap_s_ == GL_CLAMP_TO_EDGE && 450 wrap_s_ == GL_CLAMP_TO_EDGE &&
452 wrap_t_ == GL_CLAMP_TO_EDGE; 451 wrap_t_ == GL_CLAMP_TO_EDGE;
453 452
454 if (!is_npot_compatible) { 453 if (!is_npot_compatible) {
455 if (target_ == GL_TEXTURE_RECTANGLE_ARB) 454 if (target_ == GL_TEXTURE_RECTANGLE_ARB)
456 return CAN_RENDER_NEVER; 455 return TEXTURE_INCOMPLETE;
457 else if (npot()) 456 else if (npot())
458 return CAN_RENDER_ONLY_IF_NPOT; 457 return TEXTURE_COMPLETE_ONLY_IF_NPOT;
459 } 458 }
460 459
461 return CAN_RENDER_ALWAYS; 460 return TEXTURE_COMPLETE_ALWAYS;
462 } 461 }
463 462
464 bool Texture::CanRender(const FeatureInfo* feature_info) const { 463 bool Texture::IsTextureComplete(const FeatureInfo* feature_info) const {
465 switch (can_render_condition_) { 464 switch (texture_completeness) {
466 case CAN_RENDER_ALWAYS: 465 case TEXTURE_COMPLETE_ALWAYS:
467 return true; 466 return true;
468 case CAN_RENDER_NEVER: 467 case TEXTURE_INCOMPLETE:
469 return false; 468 return false;
470 case CAN_RENDER_ONLY_IF_NPOT: 469 case TEXTURE_COMPLETE_ONLY_IF_NPOT:
471 break; 470 break;
472 } 471 }
473 return feature_info->feature_flags().npot_ok; 472 return feature_info->feature_flags().npot_ok;
474 } 473 }
475 474
476 void Texture::AddToSignature( 475 void Texture::AddToSignature(
477 const FeatureInfo* feature_info, 476 const FeatureInfo* feature_info,
478 GLenum target, 477 GLenum target,
479 GLint level, 478 GLint level,
480 std::string* signature) const { 479 std::string* signature) const {
481 DCHECK(feature_info); 480 DCHECK(feature_info);
482 DCHECK(signature); 481 DCHECK(signature);
483 DCHECK_GE(level, 0); 482 DCHECK_GE(level, 0);
484 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 483 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
485 DCHECK_LT(static_cast<size_t>(face_index), 484 DCHECK_LT(static_cast<size_t>(face_index),
486 face_infos_.size()); 485 face_infos_.size());
487 DCHECK_LT(static_cast<size_t>(level), 486 DCHECK_LT(static_cast<size_t>(level),
488 face_infos_[face_index].level_infos.size()); 487 face_infos_[face_index].level_infos.size());
489 488
490 const Texture::LevelInfo& info = 489 const Texture::LevelInfo& info =
491 face_infos_[face_index].level_infos[level]; 490 face_infos_[face_index].level_infos[level];
492 491
493 TextureSignature signature_data(target, 492 TextureSignature signature_data(
494 level, 493 target, level, min_filter_, mag_filter_, wrap_r_, wrap_s_, wrap_t_,
495 min_filter_, 494 usage_, info.internal_format, compare_func_, compare_mode_, info.width,
496 mag_filter_, 495 info.height, info.depth, max_lod_, min_lod_, base_level_, info.border,
497 wrap_r_, 496 max_level_, info.format, info.type, info.image.get() != NULL,
498 wrap_s_, 497 IsTextureComplete(feature_info), CanRenderTo(), npot_);
499 wrap_t_,
500 usage_,
501 info.internal_format,
502 compare_func_,
503 compare_mode_,
504 info.width,
505 info.height,
506 info.depth,
507 max_lod_,
508 min_lod_,
509 base_level_,
510 info.border,
511 max_level_,
512 info.format,
513 info.type,
514 info.image.get() != NULL,
515 CanRender(feature_info),
516 CanRenderTo(),
517 npot_);
518 498
519 signature->append(TextureTag, sizeof(TextureTag)); 499 signature->append(TextureTag, sizeof(TextureTag));
520 signature->append(reinterpret_cast<const char*>(&signature_data), 500 signature->append(reinterpret_cast<const char*>(&signature_data),
521 sizeof(signature_data)); 501 sizeof(signature_data));
522 } 502 }
523 503
524 void Texture::SetMailboxManager(MailboxManager* mailbox_manager) { 504 void Texture::SetMailboxManager(MailboxManager* mailbox_manager) {
525 DCHECK(!mailbox_manager_ || mailbox_manager_ == mailbox_manager); 505 DCHECK(!mailbox_manager_ || mailbox_manager_ == mailbox_manager);
526 mailbox_manager_ = mailbox_manager; 506 mailbox_manager_ = mailbox_manager;
527 } 507 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 546
567 if (target == GL_TEXTURE_EXTERNAL_OES || target == GL_TEXTURE_RECTANGLE_ARB) { 547 if (target == GL_TEXTURE_EXTERNAL_OES || target == GL_TEXTURE_RECTANGLE_ARB) {
568 min_filter_ = GL_LINEAR; 548 min_filter_ = GL_LINEAR;
569 wrap_s_ = wrap_t_ = GL_CLAMP_TO_EDGE; 549 wrap_s_ = wrap_t_ = GL_CLAMP_TO_EDGE;
570 } 550 }
571 551
572 if (target == GL_TEXTURE_EXTERNAL_OES) { 552 if (target == GL_TEXTURE_EXTERNAL_OES) {
573 immutable_ = true; 553 immutable_ = true;
574 } 554 }
575 Update(feature_info); 555 Update(feature_info);
576 UpdateCanRenderCondition(); 556 UpdateTextureCompleteness();
577 } 557 }
578 558
579 bool Texture::CanGenerateMipmaps( 559 bool Texture::CanGenerateMipmaps(
580 const FeatureInfo* feature_info) const { 560 const FeatureInfo* feature_info) const {
581 if ((npot() && !feature_info->feature_flags().npot_ok) || 561 if ((npot() && !feature_info->feature_flags().npot_ok) ||
582 face_infos_.empty() || 562 face_infos_.empty() ||
583 target_ == GL_TEXTURE_EXTERNAL_OES || 563 target_ == GL_TEXTURE_EXTERNAL_OES ||
584 target_ == GL_TEXTURE_RECTANGLE_ARB) { 564 target_ == GL_TEXTURE_RECTANGLE_ARB) {
585 return false; 565 return false;
586 } 566 }
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
724 info->cleared_rect = cleared_rect; 704 info->cleared_rect = cleared_rect;
725 bool cleared = info->cleared_rect == gfx::Rect(info->width, info->height); 705 bool cleared = info->cleared_rect == gfx::Rect(info->width, info->height);
726 if (cleared == was_cleared) 706 if (cleared == was_cleared)
727 return; 707 return;
728 int delta = cleared ? -1 : +1; 708 int delta = cleared ? -1 : +1;
729 num_uncleared_mips_ += delta; 709 num_uncleared_mips_ += delta;
730 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) 710 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it)
731 (*it)->manager()->UpdateUnclearedMips(delta); 711 (*it)->manager()->UpdateUnclearedMips(delta);
732 } 712 }
733 713
734 void Texture::UpdateCanRenderCondition() { 714 void Texture::UpdateTextureCompleteness() {
735 CanRenderCondition can_render_condition = GetCanRenderCondition(); 715 TextureCompleteness new_texture_completeness = GetTextureCompleteness();
736 if (can_render_condition_ == can_render_condition) 716 if (texture_completeness == new_texture_completeness)
737 return; 717 return;
738 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) 718 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it)
739 (*it)->manager()->UpdateCanRenderCondition(can_render_condition_, 719 (*it)->manager()->UpdateTextureCompleteness(texture_completeness,
740 can_render_condition); 720 new_texture_completeness);
741 can_render_condition_ = can_render_condition; 721 texture_completeness = new_texture_completeness;
742 } 722 }
743 723
744 void Texture::UpdateHasImages() { 724 void Texture::UpdateHasImages() {
745 if (face_infos_.empty()) 725 if (face_infos_.empty())
746 return; 726 return;
747 727
748 bool has_images = false; 728 bool has_images = false;
749 for (size_t ii = 0; ii < face_infos_.size(); ++ii) { 729 for (size_t ii = 0; ii < face_infos_.size(); ++ii) {
750 for (size_t jj = 0; jj < face_infos_[ii].level_infos.size(); ++jj) { 730 for (size_t jj = 0; jj < face_infos_[ii].level_infos.size(); ++jj) {
751 const Texture::LevelInfo& info = face_infos_[ii].level_infos[jj]; 731 const Texture::LevelInfo& info = face_infos_[ii].level_infos[jj];
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
833 UpdateMipCleared(&info, width, height, cleared_rect); 813 UpdateMipCleared(&info, width, height, cleared_rect);
834 814
835 estimated_size_ -= info.estimated_size; 815 estimated_size_ -= info.estimated_size;
836 GLES2Util::ComputeImageDataSizes( 816 GLES2Util::ComputeImageDataSizes(
837 width, height, 1, format, type, 4, &info.estimated_size, NULL, NULL); 817 width, height, 1, format, type, 4, &info.estimated_size, NULL, NULL);
838 estimated_size_ += info.estimated_size; 818 estimated_size_ += info.estimated_size;
839 819
840 max_level_set_ = std::max(max_level_set_, level); 820 max_level_set_ = std::max(max_level_set_, level);
841 Update(feature_info); 821 Update(feature_info);
842 UpdateCleared(); 822 UpdateCleared();
843 UpdateCanRenderCondition(); 823 UpdateTextureCompleteness();
844 UpdateHasImages(); 824 UpdateHasImages();
845 if (IsAttachedToFramebuffer()) { 825 if (IsAttachedToFramebuffer()) {
846 // TODO(gman): If textures tracked which framebuffers they were attached to 826 // TODO(gman): If textures tracked which framebuffers they were attached to
847 // we could just mark those framebuffers as not complete. 827 // we could just mark those framebuffers as not complete.
848 IncAllFramebufferStateChangeCount(); 828 IncAllFramebufferStateChangeCount();
849 } 829 }
850 } 830 }
851 831
852 bool Texture::ValidForTexture( 832 bool Texture::ValidForTexture(
853 GLint target, 833 GLint target,
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
1010 return GL_INVALID_ENUM; 990 return GL_INVALID_ENUM;
1011 } 991 }
1012 usage_ = param; 992 usage_ = param;
1013 break; 993 break;
1014 default: 994 default:
1015 NOTREACHED(); 995 NOTREACHED();
1016 return GL_INVALID_ENUM; 996 return GL_INVALID_ENUM;
1017 } 997 }
1018 Update(feature_info); 998 Update(feature_info);
1019 UpdateCleared(); 999 UpdateCleared();
1020 UpdateCanRenderCondition(); 1000 UpdateTextureCompleteness();
1021 return GL_NO_ERROR; 1001 return GL_NO_ERROR;
1022 } 1002 }
1023 1003
1024 GLenum Texture::SetParameterf( 1004 GLenum Texture::SetParameterf(
1025 const FeatureInfo* feature_info, GLenum pname, GLfloat param) { 1005 const FeatureInfo* feature_info, GLenum pname, GLfloat param) {
1026 switch (pname) { 1006 switch (pname) {
1027 case GL_TEXTURE_MIN_FILTER: 1007 case GL_TEXTURE_MIN_FILTER:
1028 case GL_TEXTURE_MAG_FILTER: 1008 case GL_TEXTURE_MAG_FILTER:
1029 case GL_TEXTURE_POOL_CHROMIUM: 1009 case GL_TEXTURE_POOL_CHROMIUM:
1030 case GL_TEXTURE_WRAP_R: 1010 case GL_TEXTURE_WRAP_R:
(...skipping 25 matching lines...) Expand all
1056 } 1036 }
1057 return GL_NO_ERROR; 1037 return GL_NO_ERROR;
1058 } 1038 }
1059 1039
1060 void Texture::Update(const FeatureInfo* feature_info) { 1040 void Texture::Update(const FeatureInfo* feature_info) {
1061 // Update npot status. 1041 // Update npot status.
1062 // Assume GL_TEXTURE_EXTERNAL_OES textures are npot, all others 1042 // Assume GL_TEXTURE_EXTERNAL_OES textures are npot, all others
1063 npot_ = (target_ == GL_TEXTURE_EXTERNAL_OES) || (num_npot_faces_ > 0); 1043 npot_ = (target_ == GL_TEXTURE_EXTERNAL_OES) || (num_npot_faces_ > 0);
1064 1044
1065 if (face_infos_.empty()) { 1045 if (face_infos_.empty()) {
1066 texture_complete_ = false; 1046 texture_2d_complete_ = false;
1067 cube_complete_ = false; 1047 cube_complete_ = false;
1068 return; 1048 return;
1069 } 1049 }
1070 1050
1071 // Update texture_complete and cube_complete status. 1051 // Update texture_complete and cube_complete status.
1072 const Texture::FaceInfo& first_face = face_infos_[0]; 1052 const Texture::FaceInfo& first_face = face_infos_[0];
1073 const Texture::LevelInfo& first_level = first_face.level_infos[0]; 1053 const Texture::LevelInfo& first_level = first_face.level_infos[0];
1074 const GLsizei levels_needed = first_face.num_mip_levels; 1054 const GLsizei levels_needed = first_face.num_mip_levels;
1075 1055
1076 texture_complete_ = 1056 texture_2d_complete_ =
1077 max_level_set_ >= (levels_needed - 1) && max_level_set_ >= 0; 1057 max_level_set_ >= (levels_needed - 1) && max_level_set_ >= 0;
1078 cube_complete_ = (face_infos_.size() == 6) && 1058 cube_complete_ = (face_infos_.size() == 6) &&
1079 (first_level.width == first_level.height); 1059 (first_level.width == first_level.height);
1080 1060
1081 if (first_level.width == 0 || first_level.height == 0) { 1061 if (first_level.width == 0 || first_level.height == 0) {
1082 texture_complete_ = false; 1062 texture_2d_complete_ = false;
1083 } else if (first_level.type == GL_FLOAT && 1063 } else if (first_level.type == GL_FLOAT &&
1084 !feature_info->feature_flags().enable_texture_float_linear && 1064 !feature_info->feature_flags().enable_texture_float_linear &&
1085 (min_filter_ != GL_NEAREST_MIPMAP_NEAREST || 1065 (min_filter_ != GL_NEAREST_MIPMAP_NEAREST ||
1086 mag_filter_ != GL_NEAREST)) { 1066 mag_filter_ != GL_NEAREST)) {
1087 texture_complete_ = false; 1067 texture_2d_complete_ = false;
1088 } else if (first_level.type == GL_HALF_FLOAT_OES && 1068 } else if (first_level.type == GL_HALF_FLOAT_OES &&
1089 !feature_info->feature_flags().enable_texture_half_float_linear && 1069 !feature_info->feature_flags().enable_texture_half_float_linear &&
1090 (min_filter_ != GL_NEAREST_MIPMAP_NEAREST || 1070 (min_filter_ != GL_NEAREST_MIPMAP_NEAREST ||
1091 mag_filter_ != GL_NEAREST)) { 1071 mag_filter_ != GL_NEAREST)) {
1092 texture_complete_ = false; 1072 texture_2d_complete_ = false;
1093 } 1073 }
1094 1074
1095 if (cube_complete_ && texture_level0_dirty_) { 1075 if (cube_complete_ && texture_level0_dirty_) {
1096 texture_level0_complete_ = true; 1076 texture_level0_complete_ = true;
1097 for (size_t ii = 0; ii < face_infos_.size(); ++ii) { 1077 for (size_t ii = 0; ii < face_infos_.size(); ++ii) {
1098 const Texture::LevelInfo& level0 = face_infos_[ii].level_infos[0]; 1078 const Texture::LevelInfo& level0 = face_infos_[ii].level_infos[0];
1099 if (!TextureFaceComplete(first_level, 1079 if (!TextureFaceComplete(first_level,
1100 ii, 1080 ii,
1101 level0.target, 1081 level0.target,
1102 level0.internal_format, 1082 level0.internal_format,
1103 level0.width, 1083 level0.width,
1104 level0.height, 1084 level0.height,
1105 level0.depth, 1085 level0.depth,
1106 level0.format, 1086 level0.format,
1107 level0.type)) { 1087 level0.type)) {
1108 texture_level0_complete_ = false; 1088 texture_level0_complete_ = false;
1109 break; 1089 break;
1110 } 1090 }
1111 } 1091 }
1112 texture_level0_dirty_ = false; 1092 texture_level0_dirty_ = false;
1113 } 1093 }
1114 cube_complete_ &= texture_level0_complete_; 1094 cube_complete_ &= texture_level0_complete_;
1115 1095
1116 if (texture_complete_ && texture_mips_dirty_) { 1096 if (texture_2d_complete_ && texture_mips_dirty_) {
1117 texture_mips_complete_ = true; 1097 texture_mips_complete_ = true;
1118 for (size_t ii = 0; 1098 for (size_t ii = 0;
1119 ii < face_infos_.size() && texture_mips_complete_; 1099 ii < face_infos_.size() && texture_mips_complete_;
1120 ++ii) { 1100 ++ii) {
1121 const Texture::FaceInfo& face_info = face_infos_[ii]; 1101 const Texture::FaceInfo& face_info = face_infos_[ii];
1122 const Texture::LevelInfo& level0 = face_info.level_infos[0]; 1102 const Texture::LevelInfo& level0 = face_info.level_infos[0];
1123 for (GLsizei jj = 1; jj < levels_needed; ++jj) { 1103 for (GLsizei jj = 1; jj < levels_needed; ++jj) {
1124 const Texture::LevelInfo& level_info = face_infos_[ii].level_infos[jj]; 1104 const Texture::LevelInfo& level_info = face_infos_[ii].level_infos[jj];
1125 if (!TextureMipComplete(level0, 1105 if (!TextureMipComplete(level0,
1126 level_info.target, 1106 level_info.target,
1127 jj, 1107 jj,
1128 level_info.internal_format, 1108 level_info.internal_format,
1129 level_info.width, 1109 level_info.width,
1130 level_info.height, 1110 level_info.height,
1131 level_info.depth, 1111 level_info.depth,
1132 level_info.format, 1112 level_info.format,
1133 level_info.type)) { 1113 level_info.type)) {
1134 texture_mips_complete_ = false; 1114 texture_mips_complete_ = false;
1135 break; 1115 break;
1136 } 1116 }
1137 } 1117 }
1138 } 1118 }
1139 texture_mips_dirty_ = false; 1119 texture_mips_dirty_ = false;
1140 } 1120 }
1141 texture_complete_ &= texture_mips_complete_; 1121 texture_2d_complete_ &= texture_mips_complete_;
1142 } 1122 }
1143 1123
1144 bool Texture::ClearRenderableLevels(GLES2Decoder* decoder) { 1124 bool Texture::ClearRenderableLevels(GLES2Decoder* decoder) {
1145 DCHECK(decoder); 1125 DCHECK(decoder);
1146 if (cleared_) { 1126 if (cleared_) {
1147 return true; 1127 return true;
1148 } 1128 }
1149 1129
1150 for (size_t ii = 0; ii < face_infos_.size(); ++ii) { 1130 for (size_t ii = 0; ii < face_infos_.size(); ++ii) {
1151 const Texture::FaceInfo& face_info = face_infos_[ii]; 1131 const Texture::FaceInfo& face_info = face_infos_[ii];
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
1254 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 1234 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
1255 DCHECK_LT(static_cast<size_t>(face_index), 1235 DCHECK_LT(static_cast<size_t>(face_index),
1256 face_infos_.size()); 1236 face_infos_.size());
1257 DCHECK_LT(static_cast<size_t>(level), 1237 DCHECK_LT(static_cast<size_t>(level),
1258 face_infos_[face_index].level_infos.size()); 1238 face_infos_[face_index].level_infos.size());
1259 Texture::LevelInfo& info = 1239 Texture::LevelInfo& info =
1260 face_infos_[face_index].level_infos[level]; 1240 face_infos_[face_index].level_infos[level];
1261 DCHECK_EQ(info.target, target); 1241 DCHECK_EQ(info.target, target);
1262 DCHECK_EQ(info.level, level); 1242 DCHECK_EQ(info.level, level);
1263 info.image = image; 1243 info.image = image;
1264 UpdateCanRenderCondition(); 1244 UpdateTextureCompleteness();
1265 UpdateHasImages(); 1245 UpdateHasImages();
1266 } 1246 }
1267 1247
1268 gfx::GLImage* Texture::GetLevelImage(GLint target, GLint level) const { 1248 gfx::GLImage* Texture::GetLevelImage(GLint target, GLint level) const {
1269 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_EXTERNAL_OES && 1249 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_EXTERNAL_OES &&
1270 target != GL_TEXTURE_RECTANGLE_ARB) { 1250 target != GL_TEXTURE_RECTANGLE_ARB) {
1271 return NULL; 1251 return NULL;
1272 } 1252 }
1273 1253
1274 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 1254 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after
1626 textures_.erase(it); 1606 textures_.erase(it);
1627 } 1607 }
1628 } 1608 }
1629 1609
1630 void TextureManager::StartTracking(TextureRef* ref) { 1610 void TextureManager::StartTracking(TextureRef* ref) {
1631 Texture* texture = ref->texture(); 1611 Texture* texture = ref->texture();
1632 ++texture_count_; 1612 ++texture_count_;
1633 num_uncleared_mips_ += texture->num_uncleared_mips(); 1613 num_uncleared_mips_ += texture->num_uncleared_mips();
1634 if (!texture->SafeToRenderFrom()) 1614 if (!texture->SafeToRenderFrom())
1635 ++num_unsafe_textures_; 1615 ++num_unsafe_textures_;
1636 if (!texture->CanRender(feature_info_.get())) 1616 if (!texture->IsTextureComplete(feature_info_.get()))
1637 ++num_unrenderable_textures_; 1617 ++num_unrenderable_textures_;
1638 if (texture->HasImages()) 1618 if (texture->HasImages())
1639 ++num_images_; 1619 ++num_images_;
1640 } 1620 }
1641 1621
1642 void TextureManager::StopTracking(TextureRef* ref) { 1622 void TextureManager::StopTracking(TextureRef* ref) {
1643 if (ref->num_observers()) { 1623 if (ref->num_observers()) {
1644 for (unsigned int i = 0; i < destruction_observers_.size(); i++) { 1624 for (unsigned int i = 0; i < destruction_observers_.size(); i++) {
1645 destruction_observers_[i]->OnTextureRefDestroying(ref); 1625 destruction_observers_[i]->OnTextureRefDestroying(ref);
1646 } 1626 }
1647 DCHECK_EQ(ref->num_observers(), 0); 1627 DCHECK_EQ(ref->num_observers(), 0);
1648 } 1628 }
1649 1629
1650 Texture* texture = ref->texture(); 1630 Texture* texture = ref->texture();
1651 1631
1652 --texture_count_; 1632 --texture_count_;
1653 if (texture->HasImages()) { 1633 if (texture->HasImages()) {
1654 DCHECK_NE(0, num_images_); 1634 DCHECK_NE(0, num_images_);
1655 --num_images_; 1635 --num_images_;
1656 } 1636 }
1657 if (!texture->CanRender(feature_info_.get())) { 1637 if (!texture->IsTextureComplete(feature_info_.get())) {
1658 DCHECK_NE(0, num_unrenderable_textures_); 1638 DCHECK_NE(0, num_unrenderable_textures_);
1659 --num_unrenderable_textures_; 1639 --num_unrenderable_textures_;
1660 } 1640 }
1661 if (!texture->SafeToRenderFrom()) { 1641 if (!texture->SafeToRenderFrom()) {
1662 DCHECK_NE(0, num_unsafe_textures_); 1642 DCHECK_NE(0, num_unsafe_textures_);
1663 --num_unsafe_textures_; 1643 --num_unsafe_textures_;
1664 } 1644 }
1665 num_uncleared_mips_ -= texture->num_uncleared_mips(); 1645 num_uncleared_mips_ -= texture->num_uncleared_mips();
1666 DCHECK_GE(num_uncleared_mips_, 0); 1646 DCHECK_GE(num_uncleared_mips_, 0);
1667 } 1647 }
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1729 void TextureManager::UpdateSafeToRenderFrom(int delta) { 1709 void TextureManager::UpdateSafeToRenderFrom(int delta) {
1730 num_unsafe_textures_ += delta; 1710 num_unsafe_textures_ += delta;
1731 DCHECK_GE(num_unsafe_textures_, 0); 1711 DCHECK_GE(num_unsafe_textures_, 0);
1732 } 1712 }
1733 1713
1734 void TextureManager::UpdateUnclearedMips(int delta) { 1714 void TextureManager::UpdateUnclearedMips(int delta) {
1735 num_uncleared_mips_ += delta; 1715 num_uncleared_mips_ += delta;
1736 DCHECK_GE(num_uncleared_mips_, 0); 1716 DCHECK_GE(num_uncleared_mips_, 0);
1737 } 1717 }
1738 1718
1739 void TextureManager::UpdateCanRenderCondition( 1719 void TextureManager::UpdateTextureCompleteness(
1740 Texture::CanRenderCondition old_condition, 1720 Texture::TextureCompleteness old_completeness,
1741 Texture::CanRenderCondition new_condition) { 1721 Texture::TextureCompleteness new_completeness) {
1742 if (old_condition == Texture::CAN_RENDER_NEVER || 1722 if (old_completeness == Texture::TEXTURE_INCOMPLETE ||
1743 (old_condition == Texture::CAN_RENDER_ONLY_IF_NPOT && 1723 (old_completeness == Texture::TEXTURE_COMPLETE_ONLY_IF_NPOT &&
1744 !feature_info_->feature_flags().npot_ok)) { 1724 !feature_info_->feature_flags().npot_ok)) {
1745 DCHECK_GT(num_unrenderable_textures_, 0); 1725 DCHECK_GT(num_unrenderable_textures_, 0);
1746 --num_unrenderable_textures_; 1726 --num_unrenderable_textures_;
1747 } 1727 }
1748 if (new_condition == Texture::CAN_RENDER_NEVER || 1728 if (new_completeness == Texture::TEXTURE_INCOMPLETE ||
1749 (new_condition == Texture::CAN_RENDER_ONLY_IF_NPOT && 1729 (new_completeness == Texture::TEXTURE_COMPLETE_ONLY_IF_NPOT &&
1750 !feature_info_->feature_flags().npot_ok)) 1730 !feature_info_->feature_flags().npot_ok))
1751 ++num_unrenderable_textures_; 1731 ++num_unrenderable_textures_;
1752 } 1732 }
1753 1733
1754 void TextureManager::UpdateNumImages(int delta) { 1734 void TextureManager::UpdateNumImages(int delta) {
1755 num_images_ += delta; 1735 num_images_ += delta;
1756 DCHECK_GE(num_images_, 0); 1736 DCHECK_GE(num_images_, 0);
1757 } 1737 }
1758 1738
1759 void TextureManager::IncFramebufferStateChangeCount() { 1739 void TextureManager::IncFramebufferStateChangeCount() {
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
2099 // The link to the memory tracking |client_id| is given a higher importance 2079 // The link to the memory tracking |client_id| is given a higher importance
2100 // than other refs. 2080 // than other refs.
2101 if (ref == ref->texture()->memory_tracking_ref_) 2081 if (ref == ref->texture()->memory_tracking_ref_)
2102 importance = 2; 2082 importance = 2;
2103 2083
2104 pmd->AddOwnershipEdge(client_guid, service_guid, importance); 2084 pmd->AddOwnershipEdge(client_guid, service_guid, importance);
2105 } 2085 }
2106 2086
2107 } // namespace gles2 2087 } // namespace gles2
2108 } // namespace gpu 2088 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698