| 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 877 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 888 | 888 |
| 889 TextureRef::~TextureRef() { | 889 TextureRef::~TextureRef() { |
| 890 manager_->StopTracking(this); | 890 manager_->StopTracking(this); |
| 891 texture_->RemoveTextureRef(this, manager_->have_context_); | 891 texture_->RemoveTextureRef(this, manager_->have_context_); |
| 892 manager_ = NULL; | 892 manager_ = NULL; |
| 893 } | 893 } |
| 894 | 894 |
| 895 TextureManager::TextureManager(MemoryTracker* memory_tracker, | 895 TextureManager::TextureManager(MemoryTracker* memory_tracker, |
| 896 FeatureInfo* feature_info, | 896 FeatureInfo* feature_info, |
| 897 GLint max_texture_size, | 897 GLint max_texture_size, |
| 898 GLint max_cube_map_texture_size) | 898 GLint max_cube_map_texture_size, |
| 899 : memory_tracker_managed_(new MemoryTypeTracker(memory_tracker, | 899 bool use_default_textures) |
| 900 MemoryTracker::kManaged)), | 900 : memory_tracker_managed_( |
| 901 new MemoryTypeTracker(memory_tracker, MemoryTracker::kManaged)), |
| 901 memory_tracker_unmanaged_( | 902 memory_tracker_unmanaged_( |
| 902 new MemoryTypeTracker(memory_tracker, MemoryTracker::kUnmanaged)), | 903 new MemoryTypeTracker(memory_tracker, MemoryTracker::kUnmanaged)), |
| 903 feature_info_(feature_info), | 904 feature_info_(feature_info), |
| 904 framebuffer_manager_(NULL), | 905 framebuffer_manager_(NULL), |
| 905 max_texture_size_(max_texture_size), | 906 max_texture_size_(max_texture_size), |
| 906 max_cube_map_texture_size_(max_cube_map_texture_size), | 907 max_cube_map_texture_size_(max_cube_map_texture_size), |
| 907 max_levels_(ComputeMipMapCount(GL_TEXTURE_2D, | 908 max_levels_(ComputeMipMapCount(GL_TEXTURE_2D, |
| 908 max_texture_size, | 909 max_texture_size, |
| 909 max_texture_size, | 910 max_texture_size, |
| 910 max_texture_size)), | 911 max_texture_size)), |
| 911 max_cube_map_levels_(ComputeMipMapCount(GL_TEXTURE_CUBE_MAP, | 912 max_cube_map_levels_(ComputeMipMapCount(GL_TEXTURE_CUBE_MAP, |
| 912 max_cube_map_texture_size, | 913 max_cube_map_texture_size, |
| 913 max_cube_map_texture_size, | 914 max_cube_map_texture_size, |
| 914 max_cube_map_texture_size)), | 915 max_cube_map_texture_size)), |
| 916 use_default_textures_(use_default_textures), |
| 915 num_unrenderable_textures_(0), | 917 num_unrenderable_textures_(0), |
| 916 num_unsafe_textures_(0), | 918 num_unsafe_textures_(0), |
| 917 num_uncleared_mips_(0), | 919 num_uncleared_mips_(0), |
| 918 num_images_(0), | 920 num_images_(0), |
| 919 texture_count_(0), | 921 texture_count_(0), |
| 920 have_context_(true) { | 922 have_context_(true) { |
| 921 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { | 923 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { |
| 922 black_texture_ids_[ii] = 0; | 924 black_texture_ids_[ii] = 0; |
| 923 } | 925 } |
| 924 } | 926 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 952 GLuint* black_texture) { | 954 GLuint* black_texture) { |
| 953 static uint8 black[] = {0, 0, 0, 255}; | 955 static uint8 black[] = {0, 0, 0, 255}; |
| 954 | 956 |
| 955 // Sampling a texture not associated with any EGLImage sibling will return | 957 // Sampling a texture not associated with any EGLImage sibling will return |
| 956 // black values according to the spec. | 958 // black values according to the spec. |
| 957 bool needs_initialization = (target != GL_TEXTURE_EXTERNAL_OES); | 959 bool needs_initialization = (target != GL_TEXTURE_EXTERNAL_OES); |
| 958 bool needs_faces = (target == GL_TEXTURE_CUBE_MAP); | 960 bool needs_faces = (target == GL_TEXTURE_CUBE_MAP); |
| 959 | 961 |
| 960 // Make default textures and texture for replacing non-renderable textures. | 962 // Make default textures and texture for replacing non-renderable textures. |
| 961 GLuint ids[2]; | 963 GLuint ids[2]; |
| 962 glGenTextures(arraysize(ids), ids); | 964 const unsigned long num_ids = use_default_textures_ ? 2 : 1; |
| 963 for (unsigned long ii = 0; ii < arraysize(ids); ++ii) { | 965 glGenTextures(num_ids, ids); |
| 966 for (unsigned long ii = 0; ii < num_ids; ++ii) { |
| 964 glBindTexture(target, ids[ii]); | 967 glBindTexture(target, ids[ii]); |
| 965 if (needs_initialization) { | 968 if (needs_initialization) { |
| 966 if (needs_faces) { | 969 if (needs_faces) { |
| 967 for (int jj = 0; jj < GLES2Util::kNumFaces; ++jj) { | 970 for (int jj = 0; jj < GLES2Util::kNumFaces; ++jj) { |
| 968 glTexImage2D(GLES2Util::IndexToGLFaceTarget(jj), 0, GL_RGBA, 1, 1, 0, | 971 glTexImage2D(GLES2Util::IndexToGLFaceTarget(jj), 0, GL_RGBA, 1, 1, 0, |
| 969 GL_RGBA, GL_UNSIGNED_BYTE, black); | 972 GL_RGBA, GL_UNSIGNED_BYTE, black); |
| 970 } | 973 } |
| 971 } else { | 974 } else { |
| 972 glTexImage2D(target, 0, GL_RGBA, 1, 1, 0, GL_RGBA, | 975 glTexImage2D(target, 0, GL_RGBA, 1, 1, 0, GL_RGBA, |
| 973 GL_UNSIGNED_BYTE, black); | 976 GL_UNSIGNED_BYTE, black); |
| 974 } | 977 } |
| 975 } | 978 } |
| 976 } | 979 } |
| 977 glBindTexture(target, 0); | 980 glBindTexture(target, 0); |
| 978 | 981 |
| 979 scoped_refptr<TextureRef> default_texture( | 982 scoped_refptr<TextureRef> default_texture; |
| 980 TextureRef::Create(this, 0, ids[1])); | 983 if (use_default_textures_) { |
| 981 SetTarget(default_texture.get(), target); | 984 default_texture = TextureRef::Create(this, 0, ids[1]); |
| 982 if (needs_faces) { | 985 SetTarget(default_texture.get(), target); |
| 983 for (int ii = 0; ii < GLES2Util::kNumFaces; ++ii) { | 986 if (needs_faces) { |
| 984 SetLevelInfo(default_texture.get(), | 987 for (int ii = 0; ii < GLES2Util::kNumFaces; ++ii) { |
| 985 GLES2Util::IndexToGLFaceTarget(ii), | 988 SetLevelInfo(default_texture.get(), |
| 986 0, | 989 GLES2Util::IndexToGLFaceTarget(ii), |
| 987 GL_RGBA, | 990 0, |
| 988 1, | 991 GL_RGBA, |
| 989 1, | 992 1, |
| 990 1, | 993 1, |
| 991 0, | 994 1, |
| 992 GL_RGBA, | 995 0, |
| 993 GL_UNSIGNED_BYTE, | 996 GL_RGBA, |
| 994 true); | 997 GL_UNSIGNED_BYTE, |
| 995 } | 998 true); |
| 996 } else { | 999 } |
| 997 if (needs_initialization) { | |
| 998 SetLevelInfo(default_texture.get(), | |
| 999 GL_TEXTURE_2D, | |
| 1000 0, | |
| 1001 GL_RGBA, | |
| 1002 1, | |
| 1003 1, | |
| 1004 1, | |
| 1005 0, | |
| 1006 GL_RGBA, | |
| 1007 GL_UNSIGNED_BYTE, | |
| 1008 true); | |
| 1009 } else { | 1000 } else { |
| 1010 SetLevelInfo(default_texture.get(), | 1001 if (needs_initialization) { |
| 1011 GL_TEXTURE_EXTERNAL_OES, | 1002 SetLevelInfo(default_texture.get(), |
| 1012 0, | 1003 GL_TEXTURE_2D, |
| 1013 GL_RGBA, | 1004 0, |
| 1014 1, | 1005 GL_RGBA, |
| 1015 1, | 1006 1, |
| 1016 1, | 1007 1, |
| 1017 0, | 1008 1, |
| 1018 GL_RGBA, | 1009 0, |
| 1019 GL_UNSIGNED_BYTE, | 1010 GL_RGBA, |
| 1020 true); | 1011 GL_UNSIGNED_BYTE, |
| 1012 true); |
| 1013 } else { |
| 1014 SetLevelInfo(default_texture.get(), |
| 1015 GL_TEXTURE_EXTERNAL_OES, |
| 1016 0, |
| 1017 GL_RGBA, |
| 1018 1, |
| 1019 1, |
| 1020 1, |
| 1021 0, |
| 1022 GL_RGBA, |
| 1023 GL_UNSIGNED_BYTE, |
| 1024 true); |
| 1025 } |
| 1021 } | 1026 } |
| 1022 } | 1027 } |
| 1023 | 1028 |
| 1024 *black_texture = ids[0]; | 1029 *black_texture = ids[0]; |
| 1025 return default_texture; | 1030 return default_texture; |
| 1026 } | 1031 } |
| 1027 | 1032 |
| 1028 bool TextureManager::ValidForTarget( | 1033 bool TextureManager::ValidForTarget( |
| 1029 GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth) { | 1034 GLenum target, GLint level, GLsizei width, GLsizei height, GLsizei depth) { |
| 1030 GLsizei max_size = MaxSizeForTarget(target) >> level; | 1035 GLsizei max_size = MaxSizeForTarget(target) >> level; |
| (...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1567 } | 1572 } |
| 1568 | 1573 |
| 1569 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { | 1574 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { |
| 1570 texture_state_->texture_upload_count++; | 1575 texture_state_->texture_upload_count++; |
| 1571 texture_state_->total_texture_upload_time += | 1576 texture_state_->total_texture_upload_time += |
| 1572 base::TimeTicks::HighResNow() - begin_time_; | 1577 base::TimeTicks::HighResNow() - begin_time_; |
| 1573 } | 1578 } |
| 1574 | 1579 |
| 1575 } // namespace gles2 | 1580 } // namespace gles2 |
| 1576 } // namespace gpu | 1581 } // namespace gpu |
| OLD | NEW |