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

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

Issue 1154053002: gpu: Use a rectangle to keep track of the cleared area of each texture level. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: restore scissor state in GLES2DecoderImpl::ClearLevel and update GLES2DecoderManualInitTest.DrawCle… Created 5 years, 6 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 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 GetMemTracker()->TrackMemAlloc(estimated_size()); 372 GetMemTracker()->TrackMemAlloc(estimated_size());
373 } 373 }
374 } 374 }
375 375
376 MemoryTypeTracker* Texture::GetMemTracker() { 376 MemoryTypeTracker* Texture::GetMemTracker() {
377 DCHECK(memory_tracking_ref_); 377 DCHECK(memory_tracking_ref_);
378 return memory_tracking_ref_->manager()->GetMemTracker(pool_); 378 return memory_tracking_ref_->manager()->GetMemTracker(pool_);
379 } 379 }
380 380
381 Texture::LevelInfo::LevelInfo() 381 Texture::LevelInfo::LevelInfo()
382 : cleared(true), 382 : target(0),
383 target(0),
384 level(-1), 383 level(-1),
385 internal_format(0), 384 internal_format(0),
386 width(0), 385 width(0),
387 height(0), 386 height(0),
388 depth(0), 387 depth(0),
389 border(0), 388 border(0),
390 format(0), 389 format(0),
391 type(0), 390 type(0),
392 estimated_size(0) { 391 estimated_size(0) {
393 } 392 }
394 393
395 Texture::LevelInfo::LevelInfo(const LevelInfo& rhs) 394 Texture::LevelInfo::LevelInfo(const LevelInfo& rhs)
396 : cleared(rhs.cleared), 395 : cleared_rect(rhs.cleared_rect),
397 target(rhs.target), 396 target(rhs.target),
398 level(rhs.level), 397 level(rhs.level),
399 internal_format(rhs.internal_format), 398 internal_format(rhs.internal_format),
400 width(rhs.width), 399 width(rhs.width),
401 height(rhs.height), 400 height(rhs.height),
402 depth(rhs.depth), 401 depth(rhs.depth),
403 border(rhs.border), 402 border(rhs.border),
404 format(rhs.format), 403 format(rhs.format),
405 type(rhs.type), 404 type(rhs.type),
406 image(rhs.image), 405 image(rhs.image),
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 GLsizei height = level0_info.height; 532 GLsizei height = level0_info.height;
534 GLsizei depth = level0_info.depth; 533 GLsizei depth = level0_info.depth;
535 GLenum target = target_ == GL_TEXTURE_2D ? GL_TEXTURE_2D : 534 GLenum target = target_ == GL_TEXTURE_2D ? GL_TEXTURE_2D :
536 GLES2Util::IndexToGLFaceTarget(ii); 535 GLES2Util::IndexToGLFaceTarget(ii);
537 536
538 const GLsizei num_mips = face_info.num_mip_levels; 537 const GLsizei num_mips = face_info.num_mip_levels;
539 for (GLsizei level = 1; level < num_mips; ++level) { 538 for (GLsizei level = 1; level < num_mips; ++level) {
540 width = std::max(1, width >> 1); 539 width = std::max(1, width >> 1);
541 height = std::max(1, height >> 1); 540 height = std::max(1, height >> 1);
542 depth = std::max(1, depth >> 1); 541 depth = std::max(1, depth >> 1);
543 SetLevelInfo(feature_info, 542 SetLevelInfo(feature_info, target, level, level0_info.internal_format,
544 target, 543 width, height, depth, level0_info.border, level0_info.format,
545 level, 544 level0_info.type, gfx::Rect(width, height));
546 level0_info.internal_format,
547 width,
548 height,
549 depth,
550 level0_info.border,
551 level0_info.format,
552 level0_info.type,
553 true);
554 } 545 }
555 } 546 }
556 547
557 return true; 548 return true;
558 } 549 }
559 550
560 void Texture::SetTarget( 551 void Texture::SetTarget(
561 const FeatureInfo* feature_info, GLenum target, GLint max_levels) { 552 const FeatureInfo* feature_info, GLenum target, GLint max_levels) {
562 DCHECK_EQ(0u, target_); // you can only set this once. 553 DCHECK_EQ(0u, target_); // you can only set this once.
563 target_ = target; 554 target_ = target;
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
658 complete &= (width == mip_width && 649 complete &= (width == mip_width &&
659 height == mip_height && 650 height == mip_height &&
660 depth == mip_depth && 651 depth == mip_depth &&
661 internal_format == level0_face.internal_format && 652 internal_format == level0_face.internal_format &&
662 format == level0_face.format && 653 format == level0_face.format &&
663 type == level0_face.type); 654 type == level0_face.type);
664 } 655 }
665 return complete; 656 return complete;
666 } 657 }
667 658
668 void Texture::SetLevelCleared(GLenum target, GLint level, bool cleared) { 659 void Texture::SetLevelClearedRect(GLenum target,
660 GLint level,
661 const gfx::Rect& cleared_rect) {
669 DCHECK_GE(level, 0); 662 DCHECK_GE(level, 0);
670 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 663 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
671 DCHECK_LT(static_cast<size_t>(face_index), 664 DCHECK_LT(static_cast<size_t>(face_index),
672 face_infos_.size()); 665 face_infos_.size());
673 DCHECK_LT(static_cast<size_t>(level), 666 DCHECK_LT(static_cast<size_t>(level),
674 face_infos_[face_index].level_infos.size()); 667 face_infos_[face_index].level_infos.size());
675 Texture::LevelInfo& info = 668 Texture::LevelInfo& info =
676 face_infos_[face_index].level_infos[level]; 669 face_infos_[face_index].level_infos[level];
677 UpdateMipCleared(&info, cleared); 670 UpdateMipCleared(&info, info.width, info.height, cleared_rect);
678 UpdateCleared(); 671 UpdateCleared();
679 } 672 }
680 673
674 void Texture::SetLevelCleared(GLenum target, GLint level, bool cleared) {
675 DCHECK_GE(level, 0);
676 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
677 DCHECK_LT(static_cast<size_t>(face_index), face_infos_.size());
678 DCHECK_LT(static_cast<size_t>(level),
679 face_infos_[face_index].level_infos.size());
680 Texture::LevelInfo& info = face_infos_[face_index].level_infos[level];
681 UpdateMipCleared(&info, info.width, info.height,
682 cleared ? gfx::Rect(info.width, info.height) : gfx::Rect());
683 UpdateCleared();
684 }
685
681 void Texture::UpdateCleared() { 686 void Texture::UpdateCleared() {
682 if (face_infos_.empty()) { 687 if (face_infos_.empty()) {
683 return; 688 return;
684 } 689 }
685 690
686 const bool cleared = (num_uncleared_mips_ == 0); 691 const bool cleared = (num_uncleared_mips_ == 0);
687 692
688 // If texture is uncleared and is attached to a framebuffer, 693 // If texture is uncleared and is attached to a framebuffer,
689 // that framebuffer must be marked possibly incomplete. 694 // that framebuffer must be marked possibly incomplete.
690 if (!cleared && IsAttachedToFramebuffer()) { 695 if (!cleared && IsAttachedToFramebuffer()) {
691 IncAllFramebufferStateChangeCount(); 696 IncAllFramebufferStateChangeCount();
692 } 697 }
693 698
694 UpdateSafeToRenderFrom(cleared); 699 UpdateSafeToRenderFrom(cleared);
695 } 700 }
696 701
697 void Texture::UpdateSafeToRenderFrom(bool cleared) { 702 void Texture::UpdateSafeToRenderFrom(bool cleared) {
698 if (cleared_ == cleared) 703 if (cleared_ == cleared)
699 return; 704 return;
700 cleared_ = cleared; 705 cleared_ = cleared;
701 int delta = cleared ? -1 : +1; 706 int delta = cleared ? -1 : +1;
702 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) 707 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it)
703 (*it)->manager()->UpdateSafeToRenderFrom(delta); 708 (*it)->manager()->UpdateSafeToRenderFrom(delta);
704 } 709 }
705 710
706 void Texture::UpdateMipCleared(LevelInfo* info, bool cleared) { 711 void Texture::UpdateMipCleared(LevelInfo* info,
707 if (info->cleared == cleared) 712 GLsizei width,
713 GLsizei height,
714 const gfx::Rect& cleared_rect) {
715 bool was_cleared = info->cleared_rect == gfx::Rect(info->width, info->height);
716 info->width = width;
717 info->height = height;
718 info->cleared_rect = cleared_rect;
719 bool cleared = info->cleared_rect == gfx::Rect(info->width, info->height);
720 if (cleared == was_cleared)
708 return; 721 return;
709 info->cleared = cleared;
710 int delta = cleared ? -1 : +1; 722 int delta = cleared ? -1 : +1;
711 num_uncleared_mips_ += delta; 723 num_uncleared_mips_ += delta;
712 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) 724 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it)
713 (*it)->manager()->UpdateUnclearedMips(delta); 725 (*it)->manager()->UpdateUnclearedMips(delta);
714 } 726 }
715 727
716 void Texture::UpdateCanRenderCondition() { 728 void Texture::UpdateCanRenderCondition() {
717 CanRenderCondition can_render_condition = GetCanRenderCondition(); 729 CanRenderCondition can_render_condition = GetCanRenderCondition();
718 if (can_render_condition_ == can_render_condition) 730 if (can_render_condition_ == can_render_condition)
719 return; 731 return;
(...skipping 24 matching lines...) Expand all
744 int delta = has_images ? +1 : -1; 756 int delta = has_images ? +1 : -1;
745 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) 757 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it)
746 (*it)->manager()->UpdateNumImages(delta); 758 (*it)->manager()->UpdateNumImages(delta);
747 } 759 }
748 760
749 void Texture::IncAllFramebufferStateChangeCount() { 761 void Texture::IncAllFramebufferStateChangeCount() {
750 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) 762 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it)
751 (*it)->manager()->IncFramebufferStateChangeCount(); 763 (*it)->manager()->IncFramebufferStateChangeCount();
752 } 764 }
753 765
754 void Texture::SetLevelInfo( 766 void Texture::SetLevelInfo(const FeatureInfo* feature_info,
755 const FeatureInfo* feature_info, 767 GLenum target,
756 GLenum target, 768 GLint level,
757 GLint level, 769 GLenum internal_format,
758 GLenum internal_format, 770 GLsizei width,
759 GLsizei width, 771 GLsizei height,
760 GLsizei height, 772 GLsizei depth,
761 GLsizei depth, 773 GLint border,
762 GLint border, 774 GLenum format,
763 GLenum format, 775 GLenum type,
764 GLenum type, 776 const gfx::Rect& cleared_rect) {
765 bool cleared) {
766 DCHECK_GE(level, 0); 777 DCHECK_GE(level, 0);
767 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 778 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
768 DCHECK_LT(static_cast<size_t>(face_index), 779 DCHECK_LT(static_cast<size_t>(face_index),
769 face_infos_.size()); 780 face_infos_.size());
770 DCHECK_LT(static_cast<size_t>(level), 781 DCHECK_LT(static_cast<size_t>(level),
771 face_infos_[face_index].level_infos.size()); 782 face_infos_[face_index].level_infos.size());
772 DCHECK_GE(width, 0); 783 DCHECK_GE(width, 0);
773 DCHECK_GE(height, 0); 784 DCHECK_GE(height, 0);
774 DCHECK_GE(depth, 0); 785 DCHECK_GE(depth, 0);
775 Texture::LevelInfo& info = 786 Texture::LevelInfo& info =
(...skipping 24 matching lines...) Expand all
800 texture_level0_dirty_ = true; 811 texture_level0_dirty_ = true;
801 } 812 }
802 813
803 // Signify that at least one of the mips has changed. 814 // Signify that at least one of the mips has changed.
804 texture_mips_dirty_ = true; 815 texture_mips_dirty_ = true;
805 } 816 }
806 817
807 info.target = target; 818 info.target = target;
808 info.level = level; 819 info.level = level;
809 info.internal_format = internal_format; 820 info.internal_format = internal_format;
810 info.width = width;
811 info.height = height;
812 info.depth = depth; 821 info.depth = depth;
813 info.border = border; 822 info.border = border;
814 info.format = format; 823 info.format = format;
815 info.type = type; 824 info.type = type;
816 info.image = 0; 825 info.image = 0;
817 826
827 UpdateMipCleared(&info, width, height, cleared_rect);
828
818 estimated_size_ -= info.estimated_size; 829 estimated_size_ -= info.estimated_size;
819 GLES2Util::ComputeImageDataSizes( 830 GLES2Util::ComputeImageDataSizes(
820 width, height, 1, format, type, 4, &info.estimated_size, NULL, NULL); 831 width, height, 1, format, type, 4, &info.estimated_size, NULL, NULL);
821 estimated_size_ += info.estimated_size; 832 estimated_size_ += info.estimated_size;
822 833
823 UpdateMipCleared(&info, cleared);
824 max_level_set_ = std::max(max_level_set_, level); 834 max_level_set_ = std::max(max_level_set_, level);
825 Update(feature_info); 835 Update(feature_info);
826 UpdateCleared(); 836 UpdateCleared();
827 UpdateCanRenderCondition(); 837 UpdateCanRenderCondition();
828 UpdateHasImages(); 838 UpdateHasImages();
829 if (IsAttachedToFramebuffer()) { 839 if (IsAttachedToFramebuffer()) {
830 // TODO(gman): If textures tracked which framebuffers they were attached to 840 // TODO(gman): If textures tracked which framebuffers they were attached to
831 // we could just mark those framebuffers as not complete. 841 // we could just mark those framebuffers as not complete.
832 IncAllFramebufferStateChangeCount(); 842 IncAllFramebufferStateChangeCount();
833 } 843 }
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
1139 if (!ClearLevel(decoder, info.target, jj)) { 1149 if (!ClearLevel(decoder, info.target, jj)) {
1140 return false; 1150 return false;
1141 } 1151 }
1142 } 1152 }
1143 } 1153 }
1144 } 1154 }
1145 UpdateSafeToRenderFrom(true); 1155 UpdateSafeToRenderFrom(true);
1146 return true; 1156 return true;
1147 } 1157 }
1148 1158
1159 gfx::Rect Texture::GetLevelClearedRect(GLenum target, GLint level) const {
1160 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
1161 if (face_index >= face_infos_.size() ||
1162 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) {
1163 return gfx::Rect();
1164 }
1165
1166 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level];
1167
1168 return info.cleared_rect;
1169 }
1170
1149 bool Texture::IsLevelCleared(GLenum target, GLint level) const { 1171 bool Texture::IsLevelCleared(GLenum target, GLint level) const {
1150 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 1172 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
1151 if (face_index >= face_infos_.size() || 1173 if (face_index >= face_infos_.size() ||
1152 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { 1174 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) {
1153 return true; 1175 return true;
1154 } 1176 }
1155 1177
1156 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; 1178 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level];
1157 1179
1158 return info.cleared; 1180 return info.cleared_rect == gfx::Rect(info.width, info.height);
1159 } 1181 }
1160 1182
1161 void Texture::InitTextureMaxAnisotropyIfNeeded(GLenum target) { 1183 void Texture::InitTextureMaxAnisotropyIfNeeded(GLenum target) {
1162 if (texture_max_anisotropy_initialized_) 1184 if (texture_max_anisotropy_initialized_)
1163 return; 1185 return;
1164 texture_max_anisotropy_initialized_ = true; 1186 texture_max_anisotropy_initialized_ = true;
1165 GLfloat params[] = { 1.0f }; 1187 GLfloat params[] = { 1.0f };
1166 glTexParameterfv(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, params); 1188 glTexParameterfv(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, params);
1167 } 1189 }
1168 1190
1169 bool Texture::ClearLevel( 1191 bool Texture::ClearLevel(
1170 GLES2Decoder* decoder, GLenum target, GLint level) { 1192 GLES2Decoder* decoder, GLenum target, GLint level) {
1171 DCHECK(decoder); 1193 DCHECK(decoder);
1172 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 1194 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
1173 if (face_index >= face_infos_.size() || 1195 if (face_index >= face_infos_.size() ||
1174 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { 1196 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) {
1175 return true; 1197 return true;
1176 } 1198 }
1177 1199
1178 Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; 1200 Texture::LevelInfo& info = face_infos_[face_index].level_infos[level];
1179 1201
1180 DCHECK(target == info.target); 1202 DCHECK(target == info.target);
1181 1203
1182 if (info.target == 0 || 1204 if (info.target == 0 ||
1183 info.cleared || 1205 info.cleared_rect == gfx::Rect(info.width, info.height) ||
1184 info.width == 0 || 1206 info.width == 0 || info.height == 0 || info.depth == 0) {
1185 info.height == 0 ||
1186 info.depth == 0) {
1187 return true; 1207 return true;
1188 } 1208 }
1189 1209
1190 // NOTE: It seems kind of gross to call back into the decoder for this 1210 // Clear all remaining sub regions.
1191 // but only the decoder knows all the state (like unpack_alignment_) that's 1211 const int x[] = {
1192 // needed to be able to call GL correctly. 1212 0, info.cleared_rect.x(), info.cleared_rect.right(), info.width};
1193 bool cleared = decoder->ClearLevel( 1213 const int y[] = {
1194 this, info.target, info.level, info.internal_format, info.format, 1214 0, info.cleared_rect.y(), info.cleared_rect.bottom(), info.height};
1195 info.type, info.width, info.height, immutable_); 1215
1196 UpdateMipCleared(&info, cleared); 1216 for (size_t j = 0; j < 3; ++j) {
1197 return info.cleared; 1217 for (size_t i = 0; i < 3; ++i) {
1218 // Center of nine patch is already cleared.
1219 if (j == 1 && i == 1)
1220 continue;
1221
1222 gfx::Rect rect(x[i], y[j], x[i + 1] - x[i], y[j + 1] - y[j]);
1223 if (rect.IsEmpty())
1224 continue;
1225
1226 // NOTE: It seems kind of gross to call back into the decoder for this
1227 // but only the decoder knows all the state (like unpack_alignment_)
1228 // that's needed to be able to call GL correctly.
1229 bool cleared = decoder->ClearLevel(this, info.target, info.level,
1230 info.format, info.type, rect.x(),
1231 rect.y(), rect.width(), rect.height());
1232 if (!cleared)
1233 return false;
1234 }
1235 }
1236
1237 UpdateMipCleared(&info, info.width, info.height,
1238 gfx::Rect(info.width, info.height));
1239 return true;
1198 } 1240 }
1199 1241
1200 void Texture::SetLevelImage( 1242 void Texture::SetLevelImage(
1201 const FeatureInfo* feature_info, 1243 const FeatureInfo* feature_info,
1202 GLenum target, 1244 GLenum target,
1203 GLint level, 1245 GLint level,
1204 gfx::GLImage* image) { 1246 gfx::GLImage* image) {
1205 DCHECK_GE(level, 0); 1247 DCHECK_GE(level, 0);
1206 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 1248 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
1207 DCHECK_LT(static_cast<size_t>(face_index), 1249 DCHECK_LT(static_cast<size_t>(face_index),
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1366 } 1408 }
1367 } 1409 }
1368 glBindTexture(target, 0); 1410 glBindTexture(target, 0);
1369 1411
1370 scoped_refptr<TextureRef> default_texture; 1412 scoped_refptr<TextureRef> default_texture;
1371 if (use_default_textures_) { 1413 if (use_default_textures_) {
1372 default_texture = TextureRef::Create(this, 0, ids[1]); 1414 default_texture = TextureRef::Create(this, 0, ids[1]);
1373 SetTarget(default_texture.get(), target); 1415 SetTarget(default_texture.get(), target);
1374 if (needs_faces) { 1416 if (needs_faces) {
1375 for (int ii = 0; ii < GLES2Util::kNumFaces; ++ii) { 1417 for (int ii = 0; ii < GLES2Util::kNumFaces; ++ii) {
1376 SetLevelInfo(default_texture.get(), 1418 SetLevelInfo(default_texture.get(), GLES2Util::IndexToGLFaceTarget(ii),
1377 GLES2Util::IndexToGLFaceTarget(ii), 1419 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1378 0, 1420 gfx::Rect(1, 1));
1379 GL_RGBA,
1380 1,
1381 1,
1382 1,
1383 0,
1384 GL_RGBA,
1385 GL_UNSIGNED_BYTE,
1386 true);
1387 } 1421 }
1388 } else { 1422 } else {
1389 if (needs_initialization) { 1423 if (needs_initialization) {
1390 SetLevelInfo(default_texture.get(), 1424 SetLevelInfo(default_texture.get(), GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1,
1391 GL_TEXTURE_2D, 1425 0, GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect(1, 1));
1392 0,
1393 GL_RGBA,
1394 1,
1395 1,
1396 1,
1397 0,
1398 GL_RGBA,
1399 GL_UNSIGNED_BYTE,
1400 true);
1401 } else { 1426 } else {
1402 SetLevelInfo(default_texture.get(), 1427 SetLevelInfo(default_texture.get(), GL_TEXTURE_EXTERNAL_OES, 0, GL_RGBA,
1403 GL_TEXTURE_EXTERNAL_OES, 1428 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect(1, 1));
1404 0,
1405 GL_RGBA,
1406 1,
1407 1,
1408 1,
1409 0,
1410 GL_RGBA,
1411 GL_UNSIGNED_BYTE,
1412 true);
1413 } 1429 }
1414 } 1430 }
1415 } 1431 }
1416 1432
1417 *black_texture = ids[0]; 1433 *black_texture = ids[0];
1418 return default_texture; 1434 return default_texture;
1419 } 1435 }
1420 1436
1421 bool TextureManager::ValidForTarget( 1437 bool TextureManager::ValidForTarget(
1422 GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth) { 1438 GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth) {
(...skipping 13 matching lines...) Expand all
1436 (target != GL_TEXTURE_CUBE_MAP || (width == height && depth == 1)) && 1452 (target != GL_TEXTURE_CUBE_MAP || (width == height && depth == 1)) &&
1437 (target != GL_TEXTURE_2D || (depth == 1)); 1453 (target != GL_TEXTURE_2D || (depth == 1));
1438 } 1454 }
1439 1455
1440 void TextureManager::SetTarget(TextureRef* ref, GLenum target) { 1456 void TextureManager::SetTarget(TextureRef* ref, GLenum target) {
1441 DCHECK(ref); 1457 DCHECK(ref);
1442 ref->texture() 1458 ref->texture()
1443 ->SetTarget(feature_info_.get(), target, MaxLevelsForTarget(target)); 1459 ->SetTarget(feature_info_.get(), target, MaxLevelsForTarget(target));
1444 } 1460 }
1445 1461
1462 void TextureManager::SetLevelClearedRect(TextureRef* ref,
1463 GLenum target,
1464 GLint level,
1465 const gfx::Rect& cleared_rect) {
1466 DCHECK(ref);
1467 ref->texture()->SetLevelClearedRect(target, level, cleared_rect);
1468 }
1469
1446 void TextureManager::SetLevelCleared(TextureRef* ref, 1470 void TextureManager::SetLevelCleared(TextureRef* ref,
1447 GLenum target, 1471 GLenum target,
1448 GLint level, 1472 GLint level,
1449 bool cleared) { 1473 bool cleared) {
1450 DCHECK(ref); 1474 DCHECK(ref);
1451 ref->texture()->SetLevelCleared(target, level, cleared); 1475 ref->texture()->SetLevelCleared(target, level, cleared);
1452 } 1476 }
1453 1477
1454 bool TextureManager::ClearRenderableLevels( 1478 bool TextureManager::ClearRenderableLevels(
1455 GLES2Decoder* decoder, TextureRef* ref) { 1479 GLES2Decoder* decoder, TextureRef* ref) {
1456 DCHECK(ref); 1480 DCHECK(ref);
1457 return ref->texture()->ClearRenderableLevels(decoder); 1481 return ref->texture()->ClearRenderableLevels(decoder);
1458 } 1482 }
1459 1483
1460 bool TextureManager::ClearTextureLevel( 1484 bool TextureManager::ClearTextureLevel(
1461 GLES2Decoder* decoder, TextureRef* ref, 1485 GLES2Decoder* decoder, TextureRef* ref,
1462 GLenum target, GLint level) { 1486 GLenum target, GLint level) {
1463 DCHECK(ref); 1487 DCHECK(ref);
1464 Texture* texture = ref->texture(); 1488 Texture* texture = ref->texture();
1465 if (texture->num_uncleared_mips() == 0) { 1489 if (texture->num_uncleared_mips() == 0) {
1466 return true; 1490 return true;
1467 } 1491 }
1468 bool result = texture->ClearLevel(decoder, target, level); 1492 bool result = texture->ClearLevel(decoder, target, level);
1469 texture->UpdateCleared(); 1493 texture->UpdateCleared();
1470 return result; 1494 return result;
1471 } 1495 }
1472 1496
1473 void TextureManager::SetLevelInfo( 1497 void TextureManager::SetLevelInfo(TextureRef* ref,
1474 TextureRef* ref, 1498 GLenum target,
1475 GLenum target, 1499 GLint level,
1476 GLint level, 1500 GLenum internal_format,
1477 GLenum internal_format, 1501 GLsizei width,
1478 GLsizei width, 1502 GLsizei height,
1479 GLsizei height, 1503 GLsizei depth,
1480 GLsizei depth, 1504 GLint border,
1481 GLint border, 1505 GLenum format,
1482 GLenum format, 1506 GLenum type,
1483 GLenum type, 1507 const gfx::Rect& cleared_rect) {
1484 bool cleared) { 1508 DCHECK(gfx::Rect(width, height).Contains(cleared_rect));
1485 DCHECK(ref); 1509 DCHECK(ref);
1486 Texture* texture = ref->texture(); 1510 Texture* texture = ref->texture();
1487 1511
1488 texture->GetMemTracker()->TrackMemFree(texture->estimated_size()); 1512 texture->GetMemTracker()->TrackMemFree(texture->estimated_size());
1489 texture->SetLevelInfo(feature_info_.get(), 1513 texture->SetLevelInfo(feature_info_.get(), target, level, internal_format,
1490 target, 1514 width, height, depth, border, format, type,
1491 level, 1515 cleared_rect);
1492 internal_format,
1493 width,
1494 height,
1495 depth,
1496 border,
1497 format,
1498 type,
1499 cleared);
1500 texture->GetMemTracker()->TrackMemAlloc(texture->estimated_size()); 1516 texture->GetMemTracker()->TrackMemAlloc(texture->estimated_size());
1501 } 1517 }
1502 1518
1503 Texture* TextureManager::Produce(TextureRef* ref) { 1519 Texture* TextureManager::Produce(TextureRef* ref) {
1504 DCHECK(ref); 1520 DCHECK(ref);
1505 return ref->texture(); 1521 return ref->texture();
1506 } 1522 }
1507 1523
1508 TextureRef* TextureManager::Consume( 1524 TextureRef* TextureManager::Consume(
1509 GLuint client_id, 1525 GLuint client_id,
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after
1940 bool level_is_same = 1956 bool level_is_same =
1941 texture->GetLevelSize( 1957 texture->GetLevelSize(
1942 args.target, args.level, &tex_width, &tex_height, &tex_depth) && 1958 args.target, args.level, &tex_width, &tex_height, &tex_depth) &&
1943 texture->GetLevelType(args.target, args.level, &tex_type, &tex_format) && 1959 texture->GetLevelType(args.target, args.level, &tex_type, &tex_format) &&
1944 args.width == tex_width && args.height == tex_height && 1960 args.width == tex_width && args.height == tex_height &&
1945 args.depth == tex_depth && args.type == tex_type && 1961 args.depth == tex_depth && args.type == tex_type &&
1946 args.format == tex_format; 1962 args.format == tex_format;
1947 1963
1948 if (level_is_same && !args.pixels) { 1964 if (level_is_same && !args.pixels) {
1949 // Just set the level texture but mark the texture as uncleared. 1965 // Just set the level texture but mark the texture as uncleared.
1950 SetLevelInfo( 1966 SetLevelInfo(texture_ref, args.target, args.level, args.internal_format,
1951 texture_ref, 1967 args.width, args.height, args.depth, args.border, args.format,
1952 args.target, args.level, args.internal_format, args.width, args.height, 1968 args.type, gfx::Rect());
1953 args.depth, args.border, args.format, args.type, false);
1954 texture_state->tex_image_failed = false; 1969 texture_state->tex_image_failed = false;
1955 return; 1970 return;
1956 } 1971 }
1957 1972
1958 if (texture->IsAttachedToFramebuffer()) { 1973 if (texture->IsAttachedToFramebuffer()) {
1959 framebuffer_state->clear_state_dirty = true; 1974 framebuffer_state->clear_state_dirty = true;
1960 } 1975 }
1961 1976
1962 if (texture_state->texsubimage_faster_than_teximage && 1977 if (texture_state->texsubimage_faster_than_teximage &&
1963 level_is_same && args.pixels) { 1978 level_is_same && args.pixels) {
(...skipping 22 matching lines...) Expand all
1986 args.type, args.pixels); 2001 args.type, args.pixels);
1987 } else { 2002 } else {
1988 glTexImage2D(args.target, args.level, args.internal_format, args.width, 2003 glTexImage2D(args.target, args.level, args.internal_format, args.width,
1989 args.height, args.border, AdjustTexFormat(args.format), 2004 args.height, args.border, AdjustTexFormat(args.format),
1990 args.type, args.pixels); 2005 args.type, args.pixels);
1991 } 2006 }
1992 } 2007 }
1993 GLenum error = ERRORSTATE_PEEK_GL_ERROR(error_state, function_name); 2008 GLenum error = ERRORSTATE_PEEK_GL_ERROR(error_state, function_name);
1994 if (error == GL_NO_ERROR) { 2009 if (error == GL_NO_ERROR) {
1995 SetLevelInfo( 2010 SetLevelInfo(
1996 texture_ref, 2011 texture_ref, args.target, args.level, args.internal_format, args.width,
1997 args.target, args.level, args.internal_format, args.width, args.height, 2012 args.height, args.depth, args.border, args.format, args.type,
1998 args.depth, args.border, args.format, args.type, args.pixels != NULL); 2013 args.pixels != NULL ? gfx::Rect(args.width, args.height) : gfx::Rect());
1999 texture_state->tex_image_failed = false; 2014 texture_state->tex_image_failed = false;
2000 } 2015 }
2001 } 2016 }
2002 2017
2003 ScopedTextureUploadTimer::ScopedTextureUploadTimer( 2018 ScopedTextureUploadTimer::ScopedTextureUploadTimer(
2004 DecoderTextureState* texture_state) 2019 DecoderTextureState* texture_state)
2005 : texture_state_(texture_state), 2020 : texture_state_(texture_state),
2006 begin_time_(base::TimeTicks::Now()) { 2021 begin_time_(base::TimeTicks::Now()) {
2007 } 2022 }
2008 2023
2009 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { 2024 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() {
2010 texture_state_->texture_upload_count++; 2025 texture_state_->texture_upload_count++;
2011 texture_state_->total_texture_upload_time += 2026 texture_state_->total_texture_upload_time +=
2012 base::TimeTicks::Now() - begin_time_; 2027 base::TimeTicks::Now() - begin_time_;
2013 } 2028 }
2014 2029
2015 } // namespace gles2 2030 } // namespace gles2
2016 } // namespace gpu 2031 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698