| 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 #include "base/bits.h" | 6 #include "base/bits.h" |
| 7 #include "base/strings/stringprintf.h" | 7 #include "base/strings/stringprintf.h" |
| 8 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 8 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
| 9 #include "gpu/command_buffer/service/context_state.h" | 9 #include "gpu/command_buffer/service/context_state.h" |
| 10 #include "gpu/command_buffer/service/error_state.h" | 10 #include "gpu/command_buffer/service/error_state.h" |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 estimated_size(rhs.estimated_size) { | 191 estimated_size(rhs.estimated_size) { |
| 192 } | 192 } |
| 193 | 193 |
| 194 Texture::LevelInfo::~LevelInfo() { | 194 Texture::LevelInfo::~LevelInfo() { |
| 195 } | 195 } |
| 196 | 196 |
| 197 Texture::CanRenderCondition Texture::GetCanRenderCondition() const { | 197 Texture::CanRenderCondition Texture::GetCanRenderCondition() const { |
| 198 if (target_ == 0) | 198 if (target_ == 0) |
| 199 return CAN_RENDER_ALWAYS; | 199 return CAN_RENDER_ALWAYS; |
| 200 | 200 |
| 201 if (target_ == GL_TEXTURE_EXTERNAL_OES) { | 201 if (target_ != GL_TEXTURE_EXTERNAL_OES) { |
| 202 if (!IsStreamTexture()) { | |
| 203 return CAN_RENDER_NEVER; | |
| 204 } | |
| 205 } else { | |
| 206 if (level_infos_.empty()) { | 202 if (level_infos_.empty()) { |
| 207 return CAN_RENDER_NEVER; | 203 return CAN_RENDER_NEVER; |
| 208 } | 204 } |
| 209 | 205 |
| 210 const Texture::LevelInfo& first_face = level_infos_[0][0]; | 206 const Texture::LevelInfo& first_face = level_infos_[0][0]; |
| 211 if (first_face.width == 0 || | 207 if (first_face.width == 0 || |
| 212 first_face.height == 0 || | 208 first_face.height == 0 || |
| 213 first_face.depth == 0) { | 209 first_face.depth == 0) { |
| 214 return CAN_RENDER_NEVER; | 210 return CAN_RENDER_NEVER; |
| 215 } | 211 } |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 if (!CanGenerateMipmaps(feature_info)) { | 283 if (!CanGenerateMipmaps(feature_info)) { |
| 288 return false; | 284 return false; |
| 289 } | 285 } |
| 290 for (size_t ii = 0; ii < level_infos_.size(); ++ii) { | 286 for (size_t ii = 0; ii < level_infos_.size(); ++ii) { |
| 291 const Texture::LevelInfo& info1 = level_infos_[ii][0]; | 287 const Texture::LevelInfo& info1 = level_infos_[ii][0]; |
| 292 GLsizei width = info1.width; | 288 GLsizei width = info1.width; |
| 293 GLsizei height = info1.height; | 289 GLsizei height = info1.height; |
| 294 GLsizei depth = info1.depth; | 290 GLsizei depth = info1.depth; |
| 295 GLenum target = target_ == GL_TEXTURE_2D ? GL_TEXTURE_2D : | 291 GLenum target = target_ == GL_TEXTURE_2D ? GL_TEXTURE_2D : |
| 296 FaceIndexToGLTarget(ii); | 292 FaceIndexToGLTarget(ii); |
| 297 int num_mips = TextureManager::ComputeMipMapCount(width, height, depth); | 293 int num_mips = |
| 294 TextureManager::ComputeMipMapCount(target_, width, height, depth); |
| 298 for (int level = 1; level < num_mips; ++level) { | 295 for (int level = 1; level < num_mips; ++level) { |
| 299 width = std::max(1, width >> 1); | 296 width = std::max(1, width >> 1); |
| 300 height = std::max(1, height >> 1); | 297 height = std::max(1, height >> 1); |
| 301 depth = std::max(1, depth >> 1); | 298 depth = std::max(1, depth >> 1); |
| 302 SetLevelInfo(feature_info, | 299 SetLevelInfo(feature_info, |
| 303 target, | 300 target, |
| 304 level, | 301 level, |
| 305 info1.internal_format, | 302 info1.internal_format, |
| 306 width, | 303 width, |
| 307 height, | 304 height, |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 UpdateCleared(); | 380 UpdateCleared(); |
| 384 } | 381 } |
| 385 | 382 |
| 386 void Texture::UpdateCleared() { | 383 void Texture::UpdateCleared() { |
| 387 if (level_infos_.empty()) { | 384 if (level_infos_.empty()) { |
| 388 return; | 385 return; |
| 389 } | 386 } |
| 390 | 387 |
| 391 const Texture::LevelInfo& first_face = level_infos_[0][0]; | 388 const Texture::LevelInfo& first_face = level_infos_[0][0]; |
| 392 int levels_needed = TextureManager::ComputeMipMapCount( | 389 int levels_needed = TextureManager::ComputeMipMapCount( |
| 393 first_face.width, first_face.height, first_face.depth); | 390 target_, first_face.width, first_face.height, first_face.depth); |
| 394 bool cleared = true; | 391 bool cleared = true; |
| 395 for (size_t ii = 0; ii < level_infos_.size(); ++ii) { | 392 for (size_t ii = 0; ii < level_infos_.size(); ++ii) { |
| 396 for (GLint jj = 0; jj < levels_needed; ++jj) { | 393 for (GLint jj = 0; jj < levels_needed; ++jj) { |
| 397 const Texture::LevelInfo& info = level_infos_[ii][jj]; | 394 const Texture::LevelInfo& info = level_infos_[ii][jj]; |
| 398 if (info.width > 0 && info.height > 0 && info.depth > 0 && | 395 if (info.width > 0 && info.height > 0 && info.depth > 0 && |
| 399 !info.cleared) { | 396 !info.cleared) { |
| 400 cleared = false; | 397 cleared = false; |
| 401 break; | 398 break; |
| 402 } | 399 } |
| 403 } | 400 } |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 636 GLES2Util::IsNPOT(info.height) || | 633 GLES2Util::IsNPOT(info.height) || |
| 637 GLES2Util::IsNPOT(info.depth)) { | 634 GLES2Util::IsNPOT(info.depth)) { |
| 638 npot_ = true; | 635 npot_ = true; |
| 639 break; | 636 break; |
| 640 } | 637 } |
| 641 } | 638 } |
| 642 | 639 |
| 643 // Update texture_complete and cube_complete status. | 640 // Update texture_complete and cube_complete status. |
| 644 const Texture::LevelInfo& first_face = level_infos_[0][0]; | 641 const Texture::LevelInfo& first_face = level_infos_[0][0]; |
| 645 int levels_needed = TextureManager::ComputeMipMapCount( | 642 int levels_needed = TextureManager::ComputeMipMapCount( |
| 646 first_face.width, first_face.height, first_face.depth); | 643 target_, first_face.width, first_face.height, first_face.depth); |
| 647 texture_complete_ = | 644 texture_complete_ = |
| 648 max_level_set_ >= (levels_needed - 1) && max_level_set_ >= 0; | 645 max_level_set_ >= (levels_needed - 1) && max_level_set_ >= 0; |
| 649 cube_complete_ = (level_infos_.size() == 6) && | 646 cube_complete_ = (level_infos_.size() == 6) && |
| 650 (first_face.width == first_face.height); | 647 (first_face.width == first_face.height); |
| 651 | 648 |
| 652 if (first_face.width == 0 || first_face.height == 0) { | 649 if (first_face.width == 0 || first_face.height == 0) { |
| 653 texture_complete_ = false; | 650 texture_complete_ = false; |
| 654 } | 651 } |
| 655 if (first_face.type == GL_FLOAT && | 652 if (first_face.type == GL_FLOAT && |
| 656 !feature_info->feature_flags().enable_texture_float_linear && | 653 !feature_info->feature_flags().enable_texture_float_linear && |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 } | 698 } |
| 702 | 699 |
| 703 bool Texture::ClearRenderableLevels(GLES2Decoder* decoder) { | 700 bool Texture::ClearRenderableLevels(GLES2Decoder* decoder) { |
| 704 DCHECK(decoder); | 701 DCHECK(decoder); |
| 705 if (cleared_) { | 702 if (cleared_) { |
| 706 return true; | 703 return true; |
| 707 } | 704 } |
| 708 | 705 |
| 709 const Texture::LevelInfo& first_face = level_infos_[0][0]; | 706 const Texture::LevelInfo& first_face = level_infos_[0][0]; |
| 710 int levels_needed = TextureManager::ComputeMipMapCount( | 707 int levels_needed = TextureManager::ComputeMipMapCount( |
| 711 first_face.width, first_face.height, first_face.depth); | 708 target_, first_face.width, first_face.height, first_face.depth); |
| 712 | 709 |
| 713 for (size_t ii = 0; ii < level_infos_.size(); ++ii) { | 710 for (size_t ii = 0; ii < level_infos_.size(); ++ii) { |
| 714 for (GLint jj = 0; jj < levels_needed; ++jj) { | 711 for (GLint jj = 0; jj < levels_needed; ++jj) { |
| 715 Texture::LevelInfo& info = level_infos_[ii][jj]; | 712 Texture::LevelInfo& info = level_infos_[ii][jj]; |
| 716 if (info.target != 0) { | 713 if (info.target != 0) { |
| 717 if (!ClearLevel(decoder, info.target, jj)) { | 714 if (!ClearLevel(decoder, info.target, jj)) { |
| 718 return false; | 715 return false; |
| 719 } | 716 } |
| 720 } | 717 } |
| 721 } | 718 } |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 817 GLuint service_id) { | 814 GLuint service_id) { |
| 818 return new TextureRef(manager, client_id, new Texture(service_id)); | 815 return new TextureRef(manager, client_id, new Texture(service_id)); |
| 819 } | 816 } |
| 820 | 817 |
| 821 TextureRef::~TextureRef() { | 818 TextureRef::~TextureRef() { |
| 822 manager_->StopTracking(this); | 819 manager_->StopTracking(this); |
| 823 texture_->RemoveTextureRef(this, manager_->have_context_); | 820 texture_->RemoveTextureRef(this, manager_->have_context_); |
| 824 manager_ = NULL; | 821 manager_ = NULL; |
| 825 } | 822 } |
| 826 | 823 |
| 827 TextureManager::TextureManager( | 824 TextureManager::TextureManager(MemoryTracker* memory_tracker, |
| 828 MemoryTracker* memory_tracker, | 825 FeatureInfo* feature_info, |
| 829 FeatureInfo* feature_info, | 826 GLint max_texture_size, |
| 830 GLint max_texture_size, | 827 GLint max_cube_map_texture_size) |
| 831 GLint max_cube_map_texture_size) | 828 : memory_tracker_managed_(new MemoryTypeTracker(memory_tracker, |
| 832 : memory_tracker_managed_( | 829 MemoryTracker::kManaged)), |
| 833 new MemoryTypeTracker(memory_tracker, MemoryTracker::kManaged)), | |
| 834 memory_tracker_unmanaged_( | 830 memory_tracker_unmanaged_( |
| 835 new MemoryTypeTracker(memory_tracker, MemoryTracker::kUnmanaged)), | 831 new MemoryTypeTracker(memory_tracker, MemoryTracker::kUnmanaged)), |
| 836 feature_info_(feature_info), | 832 feature_info_(feature_info), |
| 837 framebuffer_manager_(NULL), | 833 framebuffer_manager_(NULL), |
| 838 stream_texture_manager_(NULL), | 834 stream_texture_manager_(NULL), |
| 839 max_texture_size_(max_texture_size), | 835 max_texture_size_(max_texture_size), |
| 840 max_cube_map_texture_size_(max_cube_map_texture_size), | 836 max_cube_map_texture_size_(max_cube_map_texture_size), |
| 841 max_levels_(ComputeMipMapCount(max_texture_size, | 837 max_levels_(ComputeMipMapCount(GL_TEXTURE_2D, |
| 838 max_texture_size, |
| 842 max_texture_size, | 839 max_texture_size, |
| 843 max_texture_size)), | 840 max_texture_size)), |
| 844 max_cube_map_levels_(ComputeMipMapCount(max_cube_map_texture_size, | 841 max_cube_map_levels_(ComputeMipMapCount(GL_TEXTURE_CUBE_MAP, |
| 842 max_cube_map_texture_size, |
| 845 max_cube_map_texture_size, | 843 max_cube_map_texture_size, |
| 846 max_cube_map_texture_size)), | 844 max_cube_map_texture_size)), |
| 847 num_unrenderable_textures_(0), | 845 num_unrenderable_textures_(0), |
| 848 num_unsafe_textures_(0), | 846 num_unsafe_textures_(0), |
| 849 num_uncleared_mips_(0), | 847 num_uncleared_mips_(0), |
| 850 texture_count_(0), | 848 texture_count_(0), |
| 851 have_context_(true) { | 849 have_context_(true) { |
| 852 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { | 850 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { |
| 853 black_texture_ids_[ii] = 0; | 851 black_texture_ids_[ii] = 0; |
| 854 } | 852 } |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1177 // This doesn't need to be fast. It's only used during slow queries. | 1175 // This doesn't need to be fast. It's only used during slow queries. |
| 1178 for (TextureMap::const_iterator it = textures_.begin(); | 1176 for (TextureMap::const_iterator it = textures_.begin(); |
| 1179 it != textures_.end(); ++it) { | 1177 it != textures_.end(); ++it) { |
| 1180 Texture* texture = it->second->texture(); | 1178 Texture* texture = it->second->texture(); |
| 1181 if (texture->service_id() == service_id) | 1179 if (texture->service_id() == service_id) |
| 1182 return texture; | 1180 return texture; |
| 1183 } | 1181 } |
| 1184 return NULL; | 1182 return NULL; |
| 1185 } | 1183 } |
| 1186 | 1184 |
| 1187 GLsizei TextureManager::ComputeMipMapCount( | 1185 GLsizei TextureManager::ComputeMipMapCount(GLenum target, |
| 1188 GLsizei width, GLsizei height, GLsizei depth) { | 1186 GLsizei width, |
| 1189 return 1 + base::bits::Log2Floor(std::max(std::max(width, height), depth)); | 1187 GLsizei height, |
| 1188 GLsizei depth) { |
| 1189 switch (target) { |
| 1190 case GL_TEXTURE_EXTERNAL_OES: |
| 1191 return 1; |
| 1192 default: |
| 1193 return 1 + |
| 1194 base::bits::Log2Floor(std::max(std::max(width, height), depth)); |
| 1195 } |
| 1190 } | 1196 } |
| 1191 | 1197 |
| 1192 void TextureManager::SetLevelImage( | 1198 void TextureManager::SetLevelImage( |
| 1193 TextureRef* ref, | 1199 TextureRef* ref, |
| 1194 GLenum target, | 1200 GLenum target, |
| 1195 GLint level, | 1201 GLint level, |
| 1196 gfx::GLImage* image) { | 1202 gfx::GLImage* image) { |
| 1197 DCHECK(ref); | 1203 DCHECK(ref); |
| 1198 ref->texture()->SetLevelImage(feature_info_.get(), target, level, image); | 1204 ref->texture()->SetLevelImage(feature_info_.get(), target, level, image); |
| 1199 } | 1205 } |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1465 } | 1471 } |
| 1466 | 1472 |
| 1467 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { | 1473 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { |
| 1468 texture_state_->texture_upload_count++; | 1474 texture_state_->texture_upload_count++; |
| 1469 texture_state_->total_texture_upload_time += | 1475 texture_state_->total_texture_upload_time += |
| 1470 base::TimeTicks::HighResNow() - begin_time_; | 1476 base::TimeTicks::HighResNow() - begin_time_; |
| 1471 } | 1477 } |
| 1472 | 1478 |
| 1473 } // namespace gles2 | 1479 } // namespace gles2 |
| 1474 } // namespace gpu | 1480 } // namespace gpu |
| OLD | NEW |