OLD | NEW |
---|---|
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 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
274 destruction_observers_[i]->OnTextureManagerDestroying(this); | 274 destruction_observers_[i]->OnTextureManagerDestroying(this); |
275 | 275 |
276 DCHECK(textures_.empty()); | 276 DCHECK(textures_.empty()); |
277 | 277 |
278 // If this triggers, that means something is keeping a reference to | 278 // If this triggers, that means something is keeping a reference to |
279 // a Texture belonging to this. | 279 // a Texture belonging to this. |
280 CHECK_EQ(texture_count_, 0u); | 280 CHECK_EQ(texture_count_, 0u); |
281 | 281 |
282 DCHECK_EQ(0, num_unrenderable_textures_); | 282 DCHECK_EQ(0, num_unrenderable_textures_); |
283 DCHECK_EQ(0, num_unsafe_textures_); | 283 DCHECK_EQ(0, num_unsafe_textures_); |
284 DCHECK_EQ(0, num_uncleared_mips_); | |
285 DCHECK_EQ(0, num_images_); | 284 DCHECK_EQ(0, num_images_); |
286 } | 285 } |
287 | 286 |
288 void TextureManager::Destroy(bool have_context) { | 287 void TextureManager::Destroy(bool have_context) { |
289 have_context_ = have_context; | 288 have_context_ = have_context; |
290 textures_.clear(); | 289 textures_.clear(); |
291 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { | 290 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { |
292 default_textures_[ii] = NULL; | 291 default_textures_[ii] = NULL; |
293 } | 292 } |
294 | 293 |
295 if (have_context) { | 294 if (have_context) { |
296 glDeleteTextures(arraysize(black_texture_ids_), black_texture_ids_); | 295 glDeleteTextures(arraysize(black_texture_ids_), black_texture_ids_); |
297 } | 296 } |
298 | 297 |
299 DCHECK_EQ(0u, memory_tracker_managed_->GetMemRepresented()); | 298 DCHECK_EQ(0u, memory_tracker_managed_->GetMemRepresented()); |
300 DCHECK_EQ(0u, memory_tracker_unmanaged_->GetMemRepresented()); | 299 DCHECK_EQ(0u, memory_tracker_unmanaged_->GetMemRepresented()); |
301 } | 300 } |
302 | 301 |
303 Texture::Texture(GLuint service_id) | 302 Texture::Texture(GLuint service_id) |
304 : mailbox_manager_(NULL), | 303 : mailbox_manager_(NULL), |
305 memory_tracking_ref_(NULL), | 304 memory_tracking_ref_(NULL), |
306 service_id_(service_id), | 305 service_id_(service_id), |
307 cleared_(true), | 306 cleared_(true), |
308 num_uncleared_mips_(0), | |
309 num_npot_faces_(0), | 307 num_npot_faces_(0), |
310 target_(0), | 308 target_(0), |
311 min_filter_(GL_NEAREST_MIPMAP_LINEAR), | 309 min_filter_(GL_NEAREST_MIPMAP_LINEAR), |
312 mag_filter_(GL_LINEAR), | 310 mag_filter_(GL_LINEAR), |
313 wrap_r_(GL_REPEAT), | 311 wrap_r_(GL_REPEAT), |
314 wrap_s_(GL_REPEAT), | 312 wrap_s_(GL_REPEAT), |
315 wrap_t_(GL_REPEAT), | 313 wrap_t_(GL_REPEAT), |
316 usage_(GL_NONE), | 314 usage_(GL_NONE), |
317 pool_(GL_TEXTURE_POOL_UNMANAGED_CHROMIUM), | 315 pool_(GL_TEXTURE_POOL_UNMANAGED_CHROMIUM), |
318 compare_func_(GL_LEQUAL), | 316 compare_func_(GL_LEQUAL), |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
372 GetMemTracker()->TrackMemAlloc(estimated_size()); | 370 GetMemTracker()->TrackMemAlloc(estimated_size()); |
373 } | 371 } |
374 } | 372 } |
375 | 373 |
376 MemoryTypeTracker* Texture::GetMemTracker() { | 374 MemoryTypeTracker* Texture::GetMemTracker() { |
377 DCHECK(memory_tracking_ref_); | 375 DCHECK(memory_tracking_ref_); |
378 return memory_tracking_ref_->manager()->GetMemTracker(pool_); | 376 return memory_tracking_ref_->manager()->GetMemTracker(pool_); |
379 } | 377 } |
380 | 378 |
381 Texture::LevelInfo::LevelInfo() | 379 Texture::LevelInfo::LevelInfo() |
382 : cleared(true), | 380 : target(0), |
383 target(0), | |
384 level(-1), | 381 level(-1), |
385 internal_format(0), | 382 internal_format(0), |
386 width(0), | 383 width(0), |
387 height(0), | 384 height(0), |
388 depth(0), | 385 depth(0), |
389 border(0), | 386 border(0), |
390 format(0), | 387 format(0), |
391 type(0), | 388 type(0), |
392 estimated_size(0) { | 389 estimated_size(0) { |
393 } | 390 } |
394 | 391 |
395 Texture::LevelInfo::LevelInfo(const LevelInfo& rhs) | 392 Texture::LevelInfo::LevelInfo(const LevelInfo& rhs) |
396 : cleared(rhs.cleared), | 393 : cleared_rect(rhs.cleared_rect), |
397 target(rhs.target), | 394 target(rhs.target), |
398 level(rhs.level), | 395 level(rhs.level), |
399 internal_format(rhs.internal_format), | 396 internal_format(rhs.internal_format), |
400 width(rhs.width), | 397 width(rhs.width), |
401 height(rhs.height), | 398 height(rhs.height), |
402 depth(rhs.depth), | 399 depth(rhs.depth), |
403 border(rhs.border), | 400 border(rhs.border), |
404 format(rhs.format), | 401 format(rhs.format), |
405 type(rhs.type), | 402 type(rhs.type), |
406 image(rhs.image), | 403 image(rhs.image), |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
533 GLsizei height = level0_info.height; | 530 GLsizei height = level0_info.height; |
534 GLsizei depth = level0_info.depth; | 531 GLsizei depth = level0_info.depth; |
535 GLenum target = target_ == GL_TEXTURE_2D ? GL_TEXTURE_2D : | 532 GLenum target = target_ == GL_TEXTURE_2D ? GL_TEXTURE_2D : |
536 GLES2Util::IndexToGLFaceTarget(ii); | 533 GLES2Util::IndexToGLFaceTarget(ii); |
537 | 534 |
538 const GLsizei num_mips = face_info.num_mip_levels; | 535 const GLsizei num_mips = face_info.num_mip_levels; |
539 for (GLsizei level = 1; level < num_mips; ++level) { | 536 for (GLsizei level = 1; level < num_mips; ++level) { |
540 width = std::max(1, width >> 1); | 537 width = std::max(1, width >> 1); |
541 height = std::max(1, height >> 1); | 538 height = std::max(1, height >> 1); |
542 depth = std::max(1, depth >> 1); | 539 depth = std::max(1, depth >> 1); |
543 SetLevelInfo(feature_info, | 540 SetLevelInfo(feature_info, target, level, level0_info.internal_format, |
544 target, | 541 width, height, depth, level0_info.border, level0_info.format, |
545 level, | 542 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 } | 543 } |
555 } | 544 } |
556 | 545 |
557 return true; | 546 return true; |
558 } | 547 } |
559 | 548 |
560 void Texture::SetTarget( | 549 void Texture::SetTarget( |
561 const FeatureInfo* feature_info, GLenum target, GLint max_levels) { | 550 const FeatureInfo* feature_info, GLenum target, GLint max_levels) { |
562 DCHECK_EQ(0u, target_); // you can only set this once. | 551 DCHECK_EQ(0u, target_); // you can only set this once. |
563 target_ = target; | 552 target_ = target; |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
658 complete &= (width == mip_width && | 647 complete &= (width == mip_width && |
659 height == mip_height && | 648 height == mip_height && |
660 depth == mip_depth && | 649 depth == mip_depth && |
661 internal_format == level0_face.internal_format && | 650 internal_format == level0_face.internal_format && |
662 format == level0_face.format && | 651 format == level0_face.format && |
663 type == level0_face.type); | 652 type == level0_face.type); |
664 } | 653 } |
665 return complete; | 654 return complete; |
666 } | 655 } |
667 | 656 |
668 void Texture::SetLevelCleared(GLenum target, GLint level, bool cleared) { | 657 void Texture::SetLevelClearedRect(GLenum target, |
658 GLint level, | |
659 const gfx::Rect& cleared_rect) { | |
669 DCHECK_GE(level, 0); | 660 DCHECK_GE(level, 0); |
670 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); | 661 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
671 DCHECK_LT(static_cast<size_t>(face_index), | 662 DCHECK_LT(static_cast<size_t>(face_index), |
672 face_infos_.size()); | 663 face_infos_.size()); |
673 DCHECK_LT(static_cast<size_t>(level), | 664 DCHECK_LT(static_cast<size_t>(level), |
674 face_infos_[face_index].level_infos.size()); | 665 face_infos_[face_index].level_infos.size()); |
675 Texture::LevelInfo& info = | 666 Texture::LevelInfo& info = |
676 face_infos_[face_index].level_infos[level]; | 667 face_infos_[face_index].level_infos[level]; |
677 UpdateMipCleared(&info, cleared); | 668 info.cleared_rect = cleared_rect; |
piman
2015/05/27 20:50:17
nit: could we have a DCHECK that cleared_rect only
reveman
2015/06/03 22:40:04
Done. By adding DCHECKs to the caller as we can't
| |
678 UpdateCleared(); | 669 UpdateSafeToRenderFrom(); |
679 } | 670 } |
680 | 671 |
681 void Texture::UpdateCleared() { | 672 void Texture::SetLevelCleared(GLenum target, GLint level, bool cleared) { |
682 if (face_infos_.empty()) { | 673 DCHECK_GE(level, 0); |
683 return; | 674 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
675 DCHECK_LT(static_cast<size_t>(face_index), face_infos_.size()); | |
676 DCHECK_LT(static_cast<size_t>(level), | |
677 face_infos_[face_index].level_infos.size()); | |
678 Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; | |
679 info.cleared_rect = | |
680 cleared ? gfx::Rect(info.width, info.height) : gfx::Rect(); | |
681 UpdateSafeToRenderFrom(); | |
682 } | |
683 | |
684 void Texture::UpdateSafeToRenderFrom() { | |
685 bool cleared = true; | |
686 for (size_t ii = 0; ii < face_infos_.size(); ++ii) { | |
687 for (size_t jj = 0; jj < face_infos_[ii].level_infos.size(); ++jj) { | |
688 const Texture::LevelInfo& info = face_infos_[ii].level_infos[jj]; | |
689 if (!info.cleared_rect.Contains(gfx::Rect(info.width, info.height))) { | |
690 cleared = false; | |
691 break; | |
692 } | |
693 } | |
684 } | 694 } |
piman
2015/05/27 20:50:17
I worry about the extra tracking cost here. This i
reveman
2015/06/03 22:40:04
Done. However, this is a bit more complicated than
| |
685 | 695 |
686 const bool cleared = (num_uncleared_mips_ == 0); | |
687 | |
688 // If texture is uncleared and is attached to a framebuffer, | |
689 // that framebuffer must be marked possibly incomplete. | |
690 if (!cleared && IsAttachedToFramebuffer()) { | |
691 IncAllFramebufferStateChangeCount(); | |
692 } | |
693 | |
694 UpdateSafeToRenderFrom(cleared); | |
695 } | |
696 | |
697 void Texture::UpdateSafeToRenderFrom(bool cleared) { | |
698 if (cleared_ == cleared) | 696 if (cleared_ == cleared) |
699 return; | 697 return; |
700 cleared_ = cleared; | 698 cleared_ = cleared; |
701 int delta = cleared ? -1 : +1; | 699 int delta = cleared ? -1 : +1; |
702 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) | 700 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) |
703 (*it)->manager()->UpdateSafeToRenderFrom(delta); | 701 (*it)->manager()->UpdateSafeToRenderFrom(delta); |
704 } | |
705 | 702 |
706 void Texture::UpdateMipCleared(LevelInfo* info, bool cleared) { | 703 // If texture is uncleared and is attached to a framebuffer, |
707 if (info->cleared == cleared) | 704 // that framebuffer must be marked possibly incomplete. |
708 return; | 705 if (!cleared && IsAttachedToFramebuffer()) |
709 info->cleared = cleared; | 706 IncAllFramebufferStateChangeCount(); |
710 int delta = cleared ? -1 : +1; | |
711 num_uncleared_mips_ += delta; | |
712 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) | |
713 (*it)->manager()->UpdateUnclearedMips(delta); | |
714 } | 707 } |
715 | 708 |
716 void Texture::UpdateCanRenderCondition() { | 709 void Texture::UpdateCanRenderCondition() { |
717 CanRenderCondition can_render_condition = GetCanRenderCondition(); | 710 CanRenderCondition can_render_condition = GetCanRenderCondition(); |
718 if (can_render_condition_ == can_render_condition) | 711 if (can_render_condition_ == can_render_condition) |
719 return; | 712 return; |
720 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) | 713 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) |
721 (*it)->manager()->UpdateCanRenderCondition(can_render_condition_, | 714 (*it)->manager()->UpdateCanRenderCondition(can_render_condition_, |
722 can_render_condition); | 715 can_render_condition); |
723 can_render_condition_ = can_render_condition; | 716 can_render_condition_ = can_render_condition; |
(...skipping 20 matching lines...) Expand all Loading... | |
744 int delta = has_images ? +1 : -1; | 737 int delta = has_images ? +1 : -1; |
745 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) | 738 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) |
746 (*it)->manager()->UpdateNumImages(delta); | 739 (*it)->manager()->UpdateNumImages(delta); |
747 } | 740 } |
748 | 741 |
749 void Texture::IncAllFramebufferStateChangeCount() { | 742 void Texture::IncAllFramebufferStateChangeCount() { |
750 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) | 743 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) |
751 (*it)->manager()->IncFramebufferStateChangeCount(); | 744 (*it)->manager()->IncFramebufferStateChangeCount(); |
752 } | 745 } |
753 | 746 |
754 void Texture::SetLevelInfo( | 747 void Texture::SetLevelInfo(const FeatureInfo* feature_info, |
755 const FeatureInfo* feature_info, | 748 GLenum target, |
756 GLenum target, | 749 GLint level, |
757 GLint level, | 750 GLenum internal_format, |
758 GLenum internal_format, | 751 GLsizei width, |
759 GLsizei width, | 752 GLsizei height, |
760 GLsizei height, | 753 GLsizei depth, |
761 GLsizei depth, | 754 GLint border, |
762 GLint border, | 755 GLenum format, |
763 GLenum format, | 756 GLenum type, |
764 GLenum type, | 757 const gfx::Rect& cleared_rect) { |
765 bool cleared) { | |
766 DCHECK_GE(level, 0); | 758 DCHECK_GE(level, 0); |
767 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); | 759 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
768 DCHECK_LT(static_cast<size_t>(face_index), | 760 DCHECK_LT(static_cast<size_t>(face_index), |
769 face_infos_.size()); | 761 face_infos_.size()); |
770 DCHECK_LT(static_cast<size_t>(level), | 762 DCHECK_LT(static_cast<size_t>(level), |
771 face_infos_[face_index].level_infos.size()); | 763 face_infos_[face_index].level_infos.size()); |
772 DCHECK_GE(width, 0); | 764 DCHECK_GE(width, 0); |
773 DCHECK_GE(height, 0); | 765 DCHECK_GE(height, 0); |
774 DCHECK_GE(depth, 0); | 766 DCHECK_GE(depth, 0); |
775 Texture::LevelInfo& info = | 767 Texture::LevelInfo& info = |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
813 info.border = border; | 805 info.border = border; |
814 info.format = format; | 806 info.format = format; |
815 info.type = type; | 807 info.type = type; |
816 info.image = 0; | 808 info.image = 0; |
817 | 809 |
818 estimated_size_ -= info.estimated_size; | 810 estimated_size_ -= info.estimated_size; |
819 GLES2Util::ComputeImageDataSizes( | 811 GLES2Util::ComputeImageDataSizes( |
820 width, height, 1, format, type, 4, &info.estimated_size, NULL, NULL); | 812 width, height, 1, format, type, 4, &info.estimated_size, NULL, NULL); |
821 estimated_size_ += info.estimated_size; | 813 estimated_size_ += info.estimated_size; |
822 | 814 |
823 UpdateMipCleared(&info, cleared); | 815 info.cleared_rect = cleared_rect; |
824 max_level_set_ = std::max(max_level_set_, level); | 816 max_level_set_ = std::max(max_level_set_, level); |
825 Update(feature_info); | 817 Update(feature_info); |
826 UpdateCleared(); | 818 UpdateSafeToRenderFrom(); |
827 UpdateCanRenderCondition(); | 819 UpdateCanRenderCondition(); |
828 UpdateHasImages(); | 820 UpdateHasImages(); |
829 if (IsAttachedToFramebuffer()) { | 821 if (IsAttachedToFramebuffer()) { |
830 // TODO(gman): If textures tracked which framebuffers they were attached to | 822 // TODO(gman): If textures tracked which framebuffers they were attached to |
831 // we could just mark those framebuffers as not complete. | 823 // we could just mark those framebuffers as not complete. |
832 IncAllFramebufferStateChangeCount(); | 824 IncAllFramebufferStateChangeCount(); |
833 } | 825 } |
834 } | 826 } |
835 | 827 |
836 bool Texture::ValidForTexture( | 828 bool Texture::ValidForTexture( |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
993 if (!feature_info->validators()->texture_usage.IsValid(param)) { | 985 if (!feature_info->validators()->texture_usage.IsValid(param)) { |
994 return GL_INVALID_ENUM; | 986 return GL_INVALID_ENUM; |
995 } | 987 } |
996 usage_ = param; | 988 usage_ = param; |
997 break; | 989 break; |
998 default: | 990 default: |
999 NOTREACHED(); | 991 NOTREACHED(); |
1000 return GL_INVALID_ENUM; | 992 return GL_INVALID_ENUM; |
1001 } | 993 } |
1002 Update(feature_info); | 994 Update(feature_info); |
1003 UpdateCleared(); | 995 UpdateSafeToRenderFrom(); |
1004 UpdateCanRenderCondition(); | 996 UpdateCanRenderCondition(); |
1005 return GL_NO_ERROR; | 997 return GL_NO_ERROR; |
1006 } | 998 } |
1007 | 999 |
1008 GLenum Texture::SetParameterf( | 1000 GLenum Texture::SetParameterf( |
1009 const FeatureInfo* feature_info, GLenum pname, GLfloat param) { | 1001 const FeatureInfo* feature_info, GLenum pname, GLfloat param) { |
1010 switch (pname) { | 1002 switch (pname) { |
1011 case GL_TEXTURE_MIN_FILTER: | 1003 case GL_TEXTURE_MIN_FILTER: |
1012 case GL_TEXTURE_MAG_FILTER: | 1004 case GL_TEXTURE_MAG_FILTER: |
1013 case GL_TEXTURE_POOL_CHROMIUM: | 1005 case GL_TEXTURE_POOL_CHROMIUM: |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1135 const Texture::FaceInfo& face_info = face_infos_[ii]; | 1127 const Texture::FaceInfo& face_info = face_infos_[ii]; |
1136 for (GLint jj = 0; jj < face_info.num_mip_levels; ++jj) { | 1128 for (GLint jj = 0; jj < face_info.num_mip_levels; ++jj) { |
1137 const Texture::LevelInfo& info = face_info.level_infos[jj]; | 1129 const Texture::LevelInfo& info = face_info.level_infos[jj]; |
1138 if (info.target != 0) { | 1130 if (info.target != 0) { |
1139 if (!ClearLevel(decoder, info.target, jj)) { | 1131 if (!ClearLevel(decoder, info.target, jj)) { |
1140 return false; | 1132 return false; |
1141 } | 1133 } |
1142 } | 1134 } |
1143 } | 1135 } |
1144 } | 1136 } |
1145 UpdateSafeToRenderFrom(true); | 1137 UpdateSafeToRenderFrom(); |
1146 return true; | 1138 return true; |
1147 } | 1139 } |
1148 | 1140 |
1141 gfx::Rect Texture::GetLevelClearedRect(GLenum target, GLint level) const { | |
1142 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); | |
1143 if (face_index >= face_infos_.size() || | |
1144 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { | |
1145 return gfx::Rect(); | |
1146 } | |
1147 | |
1148 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; | |
1149 | |
1150 return info.cleared_rect; | |
1151 } | |
1152 | |
1149 bool Texture::IsLevelCleared(GLenum target, GLint level) const { | 1153 bool Texture::IsLevelCleared(GLenum target, GLint level) const { |
1150 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); | 1154 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
1151 if (face_index >= face_infos_.size() || | 1155 if (face_index >= face_infos_.size() || |
1152 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { | 1156 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { |
1153 return true; | 1157 return true; |
1154 } | 1158 } |
1155 | 1159 |
1156 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; | 1160 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; |
1157 | 1161 |
1158 return info.cleared; | 1162 return info.cleared_rect.Contains(gfx::Rect(info.width, info.height)); |
1159 } | 1163 } |
1160 | 1164 |
1161 void Texture::InitTextureMaxAnisotropyIfNeeded(GLenum target) { | 1165 void Texture::InitTextureMaxAnisotropyIfNeeded(GLenum target) { |
1162 if (texture_max_anisotropy_initialized_) | 1166 if (texture_max_anisotropy_initialized_) |
1163 return; | 1167 return; |
1164 texture_max_anisotropy_initialized_ = true; | 1168 texture_max_anisotropy_initialized_ = true; |
1165 GLfloat params[] = { 1.0f }; | 1169 GLfloat params[] = { 1.0f }; |
1166 glTexParameterfv(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, params); | 1170 glTexParameterfv(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, params); |
1167 } | 1171 } |
1168 | 1172 |
1169 bool Texture::ClearLevel( | 1173 bool Texture::ClearLevel( |
1170 GLES2Decoder* decoder, GLenum target, GLint level) { | 1174 GLES2Decoder* decoder, GLenum target, GLint level) { |
1171 DCHECK(decoder); | 1175 DCHECK(decoder); |
1172 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); | 1176 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
1173 if (face_index >= face_infos_.size() || | 1177 if (face_index >= face_infos_.size() || |
1174 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { | 1178 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { |
1175 return true; | 1179 return true; |
1176 } | 1180 } |
1177 | 1181 |
1178 Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; | 1182 Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; |
1179 | 1183 |
1180 DCHECK(target == info.target); | 1184 DCHECK(target == info.target); |
1181 | 1185 |
1182 if (info.target == 0 || | 1186 if (info.target == 0 || |
1183 info.cleared || | 1187 info.cleared_rect.Contains(gfx::Rect(info.width, info.height)) || |
1184 info.width == 0 || | 1188 info.width == 0 || info.height == 0 || info.depth == 0) { |
1185 info.height == 0 || | |
1186 info.depth == 0) { | |
1187 return true; | 1189 return true; |
1188 } | 1190 } |
1189 | 1191 |
1190 // NOTE: It seems kind of gross to call back into the decoder for this | 1192 // Clear all remaining sub regions. |
1191 // but only the decoder knows all the state (like unpack_alignment_) that's | 1193 const int x[] = { |
1192 // needed to be able to call GL correctly. | 1194 0, info.cleared_rect.x(), info.cleared_rect.right(), info.width}; |
1193 bool cleared = decoder->ClearLevel( | 1195 const int y[] = { |
1194 this, info.target, info.level, info.internal_format, info.format, | 1196 0, info.cleared_rect.y(), info.cleared_rect.bottom(), info.height}; |
1195 info.type, info.width, info.height, immutable_); | 1197 |
1196 UpdateMipCleared(&info, cleared); | 1198 for (size_t j = 0; j < 3; ++j) { |
1197 return info.cleared; | 1199 for (size_t i = 0; i < 3; ++i) { |
1200 // Center of nine patch is already cleared. | |
1201 if (j == 1 && i == 1) | |
1202 continue; | |
1203 | |
1204 gfx::Rect rect(x[i], y[j], x[i + 1] - x[i], y[j + 1] - y[j]); | |
1205 if (rect.IsEmpty()) | |
1206 continue; | |
1207 | |
1208 // NOTE: It seems kind of gross to call back into the decoder for this | |
1209 // but only the decoder knows all the state (like unpack_alignment_) | |
1210 // that's needed to be able to call GL correctly. | |
1211 bool cleared = decoder->ClearLevel(this, info.target, info.level, | |
1212 info.format, info.type, rect.x(), | |
1213 rect.y(), rect.width(), rect.height()); | |
1214 if (!cleared) | |
1215 return false; | |
1216 } | |
1217 } | |
1218 | |
1219 info.cleared_rect = gfx::Rect(info.width, info.height); | |
1220 return true; | |
1198 } | 1221 } |
1199 | 1222 |
1200 void Texture::SetLevelImage( | 1223 void Texture::SetLevelImage( |
1201 const FeatureInfo* feature_info, | 1224 const FeatureInfo* feature_info, |
1202 GLenum target, | 1225 GLenum target, |
1203 GLint level, | 1226 GLint level, |
1204 gfx::GLImage* image) { | 1227 gfx::GLImage* image) { |
1205 DCHECK_GE(level, 0); | 1228 DCHECK_GE(level, 0); |
1206 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); | 1229 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); |
1207 DCHECK_LT(static_cast<size_t>(face_index), | 1230 DCHECK_LT(static_cast<size_t>(face_index), |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1297 max_cube_map_texture_size, | 1320 max_cube_map_texture_size, |
1298 max_cube_map_texture_size)), | 1321 max_cube_map_texture_size)), |
1299 max_3d_levels_(ComputeMipMapCount(GL_TEXTURE_3D, | 1322 max_3d_levels_(ComputeMipMapCount(GL_TEXTURE_3D, |
1300 // Same as GL_TEXTURE_2D_ARRAY | 1323 // Same as GL_TEXTURE_2D_ARRAY |
1301 max_3d_texture_size, | 1324 max_3d_texture_size, |
1302 max_3d_texture_size, | 1325 max_3d_texture_size, |
1303 max_3d_texture_size)), | 1326 max_3d_texture_size)), |
1304 use_default_textures_(use_default_textures), | 1327 use_default_textures_(use_default_textures), |
1305 num_unrenderable_textures_(0), | 1328 num_unrenderable_textures_(0), |
1306 num_unsafe_textures_(0), | 1329 num_unsafe_textures_(0), |
1307 num_uncleared_mips_(0), | |
1308 num_images_(0), | 1330 num_images_(0), |
1309 texture_count_(0), | 1331 texture_count_(0), |
1310 have_context_(true) { | 1332 have_context_(true) { |
1311 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { | 1333 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { |
1312 black_texture_ids_[ii] = 0; | 1334 black_texture_ids_[ii] = 0; |
1313 } | 1335 } |
1314 } | 1336 } |
1315 | 1337 |
1316 bool TextureManager::Initialize() { | 1338 bool TextureManager::Initialize() { |
1317 // TODO(gman): The default textures have to be real textures, not the 0 | 1339 // TODO(gman): The default textures have to be real textures, not the 0 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1366 } | 1388 } |
1367 } | 1389 } |
1368 glBindTexture(target, 0); | 1390 glBindTexture(target, 0); |
1369 | 1391 |
1370 scoped_refptr<TextureRef> default_texture; | 1392 scoped_refptr<TextureRef> default_texture; |
1371 if (use_default_textures_) { | 1393 if (use_default_textures_) { |
1372 default_texture = TextureRef::Create(this, 0, ids[1]); | 1394 default_texture = TextureRef::Create(this, 0, ids[1]); |
1373 SetTarget(default_texture.get(), target); | 1395 SetTarget(default_texture.get(), target); |
1374 if (needs_faces) { | 1396 if (needs_faces) { |
1375 for (int ii = 0; ii < GLES2Util::kNumFaces; ++ii) { | 1397 for (int ii = 0; ii < GLES2Util::kNumFaces; ++ii) { |
1376 SetLevelInfo(default_texture.get(), | 1398 SetLevelInfo(default_texture.get(), GLES2Util::IndexToGLFaceTarget(ii), |
1377 GLES2Util::IndexToGLFaceTarget(ii), | 1399 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, |
1378 0, | 1400 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 } | 1401 } |
1388 } else { | 1402 } else { |
1389 if (needs_initialization) { | 1403 if (needs_initialization) { |
1390 SetLevelInfo(default_texture.get(), | 1404 SetLevelInfo(default_texture.get(), GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, |
1391 GL_TEXTURE_2D, | 1405 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 { | 1406 } else { |
1402 SetLevelInfo(default_texture.get(), | 1407 SetLevelInfo(default_texture.get(), GL_TEXTURE_EXTERNAL_OES, 0, GL_RGBA, |
1403 GL_TEXTURE_EXTERNAL_OES, | 1408 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 } | 1409 } |
1414 } | 1410 } |
1415 } | 1411 } |
1416 | 1412 |
1417 *black_texture = ids[0]; | 1413 *black_texture = ids[0]; |
1418 return default_texture; | 1414 return default_texture; |
1419 } | 1415 } |
1420 | 1416 |
1421 bool TextureManager::ValidForTarget( | 1417 bool TextureManager::ValidForTarget( |
1422 GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth) { | 1418 GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth) { |
(...skipping 13 matching lines...) Expand all Loading... | |
1436 (target != GL_TEXTURE_CUBE_MAP || (width == height && depth == 1)) && | 1432 (target != GL_TEXTURE_CUBE_MAP || (width == height && depth == 1)) && |
1437 (target != GL_TEXTURE_2D || (depth == 1)); | 1433 (target != GL_TEXTURE_2D || (depth == 1)); |
1438 } | 1434 } |
1439 | 1435 |
1440 void TextureManager::SetTarget(TextureRef* ref, GLenum target) { | 1436 void TextureManager::SetTarget(TextureRef* ref, GLenum target) { |
1441 DCHECK(ref); | 1437 DCHECK(ref); |
1442 ref->texture() | 1438 ref->texture() |
1443 ->SetTarget(feature_info_.get(), target, MaxLevelsForTarget(target)); | 1439 ->SetTarget(feature_info_.get(), target, MaxLevelsForTarget(target)); |
1444 } | 1440 } |
1445 | 1441 |
1442 void TextureManager::SetLevelClearedRect(TextureRef* ref, | |
1443 GLenum target, | |
1444 GLint level, | |
1445 const gfx::Rect& cleared_rect) { | |
1446 DCHECK(ref); | |
1447 ref->texture()->SetLevelClearedRect(target, level, cleared_rect); | |
1448 } | |
1449 | |
1446 void TextureManager::SetLevelCleared(TextureRef* ref, | 1450 void TextureManager::SetLevelCleared(TextureRef* ref, |
1447 GLenum target, | 1451 GLenum target, |
1448 GLint level, | 1452 GLint level, |
1449 bool cleared) { | 1453 bool cleared) { |
1450 DCHECK(ref); | 1454 DCHECK(ref); |
1451 ref->texture()->SetLevelCleared(target, level, cleared); | 1455 ref->texture()->SetLevelCleared(target, level, cleared); |
1452 } | 1456 } |
1453 | 1457 |
1454 bool TextureManager::ClearRenderableLevels( | 1458 bool TextureManager::ClearRenderableLevels( |
1455 GLES2Decoder* decoder, TextureRef* ref) { | 1459 GLES2Decoder* decoder, TextureRef* ref) { |
1456 DCHECK(ref); | 1460 DCHECK(ref); |
1457 return ref->texture()->ClearRenderableLevels(decoder); | 1461 return ref->texture()->ClearRenderableLevels(decoder); |
1458 } | 1462 } |
1459 | 1463 |
1460 bool TextureManager::ClearTextureLevel( | 1464 bool TextureManager::ClearTextureLevel( |
1461 GLES2Decoder* decoder, TextureRef* ref, | 1465 GLES2Decoder* decoder, TextureRef* ref, |
1462 GLenum target, GLint level) { | 1466 GLenum target, GLint level) { |
1463 DCHECK(ref); | 1467 DCHECK(ref); |
1464 Texture* texture = ref->texture(); | 1468 Texture* texture = ref->texture(); |
1465 if (texture->num_uncleared_mips() == 0) { | 1469 if (texture->SafeToRenderFrom()) { |
1466 return true; | 1470 return true; |
1467 } | 1471 } |
1468 bool result = texture->ClearLevel(decoder, target, level); | 1472 bool result = texture->ClearLevel(decoder, target, level); |
1469 texture->UpdateCleared(); | 1473 texture->UpdateSafeToRenderFrom(); |
1470 return result; | 1474 return result; |
1471 } | 1475 } |
1472 | 1476 |
1473 void TextureManager::SetLevelInfo( | 1477 void TextureManager::SetLevelInfo(TextureRef* ref, |
1474 TextureRef* ref, | 1478 GLenum target, |
1475 GLenum target, | 1479 GLint level, |
1476 GLint level, | 1480 GLenum internal_format, |
1477 GLenum internal_format, | 1481 GLsizei width, |
1478 GLsizei width, | 1482 GLsizei height, |
1479 GLsizei height, | 1483 GLsizei depth, |
1480 GLsizei depth, | 1484 GLint border, |
1481 GLint border, | 1485 GLenum format, |
1482 GLenum format, | 1486 GLenum type, |
1483 GLenum type, | 1487 const gfx::Rect& cleared_rect) { |
1484 bool cleared) { | 1488 DCHECK(gfx::Rect(width, height).Contains(cleared_rect)); |
1485 DCHECK(ref); | 1489 DCHECK(ref); |
1486 Texture* texture = ref->texture(); | 1490 Texture* texture = ref->texture(); |
1487 | 1491 |
1488 texture->GetMemTracker()->TrackMemFree(texture->estimated_size()); | 1492 texture->GetMemTracker()->TrackMemFree(texture->estimated_size()); |
1489 texture->SetLevelInfo(feature_info_.get(), | 1493 texture->SetLevelInfo(feature_info_.get(), target, level, internal_format, |
1490 target, | 1494 width, height, depth, border, format, type, |
1491 level, | 1495 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()); | 1496 texture->GetMemTracker()->TrackMemAlloc(texture->estimated_size()); |
1501 } | 1497 } |
1502 | 1498 |
1503 Texture* TextureManager::Produce(TextureRef* ref) { | 1499 Texture* TextureManager::Produce(TextureRef* ref) { |
1504 DCHECK(ref); | 1500 DCHECK(ref); |
1505 return ref->texture(); | 1501 return ref->texture(); |
1506 } | 1502 } |
1507 | 1503 |
1508 TextureRef* TextureManager::Consume( | 1504 TextureRef* TextureManager::Consume( |
1509 GLuint client_id, | 1505 GLuint client_id, |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1593 TextureMap::iterator it = textures_.find(client_id); | 1589 TextureMap::iterator it = textures_.find(client_id); |
1594 if (it != textures_.end()) { | 1590 if (it != textures_.end()) { |
1595 it->second->reset_client_id(); | 1591 it->second->reset_client_id(); |
1596 textures_.erase(it); | 1592 textures_.erase(it); |
1597 } | 1593 } |
1598 } | 1594 } |
1599 | 1595 |
1600 void TextureManager::StartTracking(TextureRef* ref) { | 1596 void TextureManager::StartTracking(TextureRef* ref) { |
1601 Texture* texture = ref->texture(); | 1597 Texture* texture = ref->texture(); |
1602 ++texture_count_; | 1598 ++texture_count_; |
1603 num_uncleared_mips_ += texture->num_uncleared_mips(); | |
1604 if (!texture->SafeToRenderFrom()) | 1599 if (!texture->SafeToRenderFrom()) |
1605 ++num_unsafe_textures_; | 1600 ++num_unsafe_textures_; |
1606 if (!texture->CanRender(feature_info_.get())) | 1601 if (!texture->CanRender(feature_info_.get())) |
1607 ++num_unrenderable_textures_; | 1602 ++num_unrenderable_textures_; |
1608 if (texture->HasImages()) | 1603 if (texture->HasImages()) |
1609 ++num_images_; | 1604 ++num_images_; |
1610 } | 1605 } |
1611 | 1606 |
1612 void TextureManager::StopTracking(TextureRef* ref) { | 1607 void TextureManager::StopTracking(TextureRef* ref) { |
1613 if (ref->num_observers()) { | 1608 if (ref->num_observers()) { |
(...skipping 11 matching lines...) Expand all Loading... | |
1625 --num_images_; | 1620 --num_images_; |
1626 } | 1621 } |
1627 if (!texture->CanRender(feature_info_.get())) { | 1622 if (!texture->CanRender(feature_info_.get())) { |
1628 DCHECK_NE(0, num_unrenderable_textures_); | 1623 DCHECK_NE(0, num_unrenderable_textures_); |
1629 --num_unrenderable_textures_; | 1624 --num_unrenderable_textures_; |
1630 } | 1625 } |
1631 if (!texture->SafeToRenderFrom()) { | 1626 if (!texture->SafeToRenderFrom()) { |
1632 DCHECK_NE(0, num_unsafe_textures_); | 1627 DCHECK_NE(0, num_unsafe_textures_); |
1633 --num_unsafe_textures_; | 1628 --num_unsafe_textures_; |
1634 } | 1629 } |
1635 num_uncleared_mips_ -= texture->num_uncleared_mips(); | |
1636 DCHECK_GE(num_uncleared_mips_, 0); | |
1637 } | 1630 } |
1638 | 1631 |
1639 MemoryTypeTracker* TextureManager::GetMemTracker(GLenum tracking_pool) { | 1632 MemoryTypeTracker* TextureManager::GetMemTracker(GLenum tracking_pool) { |
1640 switch (tracking_pool) { | 1633 switch (tracking_pool) { |
1641 case GL_TEXTURE_POOL_MANAGED_CHROMIUM: | 1634 case GL_TEXTURE_POOL_MANAGED_CHROMIUM: |
1642 return memory_tracker_managed_.get(); | 1635 return memory_tracker_managed_.get(); |
1643 break; | 1636 break; |
1644 case GL_TEXTURE_POOL_UNMANAGED_CHROMIUM: | 1637 case GL_TEXTURE_POOL_UNMANAGED_CHROMIUM: |
1645 return memory_tracker_unmanaged_.get(); | 1638 return memory_tracker_unmanaged_.get(); |
1646 break; | 1639 break; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1694 GLint level, | 1687 GLint level, |
1695 std::string* signature) const { | 1688 std::string* signature) const { |
1696 ref->texture()->AddToSignature(feature_info_.get(), target, level, signature); | 1689 ref->texture()->AddToSignature(feature_info_.get(), target, level, signature); |
1697 } | 1690 } |
1698 | 1691 |
1699 void TextureManager::UpdateSafeToRenderFrom(int delta) { | 1692 void TextureManager::UpdateSafeToRenderFrom(int delta) { |
1700 num_unsafe_textures_ += delta; | 1693 num_unsafe_textures_ += delta; |
1701 DCHECK_GE(num_unsafe_textures_, 0); | 1694 DCHECK_GE(num_unsafe_textures_, 0); |
1702 } | 1695 } |
1703 | 1696 |
1704 void TextureManager::UpdateUnclearedMips(int delta) { | |
1705 num_uncleared_mips_ += delta; | |
1706 DCHECK_GE(num_uncleared_mips_, 0); | |
1707 } | |
1708 | |
1709 void TextureManager::UpdateCanRenderCondition( | 1697 void TextureManager::UpdateCanRenderCondition( |
1710 Texture::CanRenderCondition old_condition, | 1698 Texture::CanRenderCondition old_condition, |
1711 Texture::CanRenderCondition new_condition) { | 1699 Texture::CanRenderCondition new_condition) { |
1712 if (old_condition == Texture::CAN_RENDER_NEVER || | 1700 if (old_condition == Texture::CAN_RENDER_NEVER || |
1713 (old_condition == Texture::CAN_RENDER_ONLY_IF_NPOT && | 1701 (old_condition == Texture::CAN_RENDER_ONLY_IF_NPOT && |
1714 !feature_info_->feature_flags().npot_ok)) { | 1702 !feature_info_->feature_flags().npot_ok)) { |
1715 DCHECK_GT(num_unrenderable_textures_, 0); | 1703 DCHECK_GT(num_unrenderable_textures_, 0); |
1716 --num_unrenderable_textures_; | 1704 --num_unrenderable_textures_; |
1717 } | 1705 } |
1718 if (new_condition == Texture::CAN_RENDER_NEVER || | 1706 if (new_condition == Texture::CAN_RENDER_NEVER || |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1933 GLenum tex_format = 0; | 1921 GLenum tex_format = 0; |
1934 bool level_is_same = | 1922 bool level_is_same = |
1935 texture->GetLevelSize( | 1923 texture->GetLevelSize( |
1936 args.target, args.level, &tex_width, &tex_height, nullptr) && | 1924 args.target, args.level, &tex_width, &tex_height, nullptr) && |
1937 texture->GetLevelType(args.target, args.level, &tex_type, &tex_format) && | 1925 texture->GetLevelType(args.target, args.level, &tex_type, &tex_format) && |
1938 args.width == tex_width && args.height == tex_height && | 1926 args.width == tex_width && args.height == tex_height && |
1939 args.type == tex_type && args.format == tex_format; | 1927 args.type == tex_type && args.format == tex_format; |
1940 | 1928 |
1941 if (level_is_same && !args.pixels) { | 1929 if (level_is_same && !args.pixels) { |
1942 // Just set the level texture but mark the texture as uncleared. | 1930 // Just set the level texture but mark the texture as uncleared. |
1943 SetLevelInfo( | 1931 SetLevelInfo(texture_ref, args.target, args.level, args.internal_format, |
1944 texture_ref, | 1932 args.width, args.height, 1, args.border, args.format, |
1945 args.target, args.level, args.internal_format, args.width, args.height, | 1933 args.type, gfx::Rect()); |
1946 1, args.border, args.format, args.type, false); | |
1947 texture_state->tex_image_2d_failed = false; | 1934 texture_state->tex_image_2d_failed = false; |
1948 return; | 1935 return; |
1949 } | 1936 } |
1950 | 1937 |
1951 if (texture->IsAttachedToFramebuffer()) { | 1938 if (texture->IsAttachedToFramebuffer()) { |
1952 framebuffer_state->clear_state_dirty = true; | 1939 framebuffer_state->clear_state_dirty = true; |
1953 } | 1940 } |
1954 | 1941 |
1955 if (texture_state->texsubimage2d_faster_than_teximage2d && | 1942 if (texture_state->texsubimage2d_faster_than_teximage2d && |
1956 level_is_same && args.pixels) { | 1943 level_is_same && args.pixels) { |
(...skipping 10 matching lines...) Expand all Loading... | |
1967 ERRORSTATE_COPY_REAL_GL_ERRORS_TO_WRAPPER(error_state, "glTexImage2D"); | 1954 ERRORSTATE_COPY_REAL_GL_ERRORS_TO_WRAPPER(error_state, "glTexImage2D"); |
1968 { | 1955 { |
1969 ScopedTextureUploadTimer timer(texture_state); | 1956 ScopedTextureUploadTimer timer(texture_state); |
1970 glTexImage2D( | 1957 glTexImage2D( |
1971 args.target, args.level, args.internal_format, args.width, args.height, | 1958 args.target, args.level, args.internal_format, args.width, args.height, |
1972 args.border, AdjustTexFormat(args.format), args.type, args.pixels); | 1959 args.border, AdjustTexFormat(args.format), args.type, args.pixels); |
1973 } | 1960 } |
1974 GLenum error = ERRORSTATE_PEEK_GL_ERROR(error_state, "glTexImage2D"); | 1961 GLenum error = ERRORSTATE_PEEK_GL_ERROR(error_state, "glTexImage2D"); |
1975 if (error == GL_NO_ERROR) { | 1962 if (error == GL_NO_ERROR) { |
1976 SetLevelInfo( | 1963 SetLevelInfo( |
1977 texture_ref, | 1964 texture_ref, args.target, args.level, args.internal_format, args.width, |
1978 args.target, args.level, args.internal_format, args.width, args.height, | 1965 args.height, 1, args.border, args.format, args.type, |
1979 1, args.border, args.format, args.type, args.pixels != NULL); | 1966 args.pixels != NULL ? gfx::Rect(args.width, args.height) : gfx::Rect()); |
1980 texture_state->tex_image_2d_failed = false; | 1967 texture_state->tex_image_2d_failed = false; |
1981 } | 1968 } |
1982 } | 1969 } |
1983 | 1970 |
1984 ScopedTextureUploadTimer::ScopedTextureUploadTimer( | 1971 ScopedTextureUploadTimer::ScopedTextureUploadTimer( |
1985 DecoderTextureState* texture_state) | 1972 DecoderTextureState* texture_state) |
1986 : texture_state_(texture_state), | 1973 : texture_state_(texture_state), |
1987 begin_time_(base::TimeTicks::Now()) { | 1974 begin_time_(base::TimeTicks::Now()) { |
1988 } | 1975 } |
1989 | 1976 |
1990 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { | 1977 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { |
1991 texture_state_->texture_upload_count++; | 1978 texture_state_->texture_upload_count++; |
1992 texture_state_->total_texture_upload_time += | 1979 texture_state_->total_texture_upload_time += |
1993 base::TimeTicks::Now() - begin_time_; | 1980 base::TimeTicks::Now() - begin_time_; |
1994 } | 1981 } |
1995 | 1982 |
1996 } // namespace gles2 | 1983 } // namespace gles2 |
1997 } // namespace gpu | 1984 } // namespace gpu |
OLD | NEW |