Chromium Code Reviews| 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 <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bits.h" | 10 #include "base/bits.h" |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 22 namespace gpu { | 22 namespace gpu { |
| 23 namespace gles2 { | 23 namespace gles2 { |
| 24 | 24 |
| 25 // This should contain everything to uniquely identify a Texture. | 25 // This should contain everything to uniquely identify a Texture. |
| 26 static const char TextureTag[] = "|Texture|"; | 26 static const char TextureTag[] = "|Texture|"; |
| 27 struct TextureSignature { | 27 struct TextureSignature { |
| 28 GLenum target_; | 28 GLenum target_; |
| 29 GLint level_; | 29 GLint level_; |
| 30 GLenum min_filter_; | 30 GLenum min_filter_; |
| 31 GLenum mag_filter_; | 31 GLenum mag_filter_; |
| 32 GLenum wrap_r_; | |
| 32 GLenum wrap_s_; | 33 GLenum wrap_s_; |
| 33 GLenum wrap_t_; | 34 GLenum wrap_t_; |
| 34 GLenum usage_; | 35 GLenum usage_; |
| 35 GLenum internal_format_; | 36 GLenum internal_format_; |
| 37 GLenum compare_func_; | |
| 38 GLenum compare_mode_; | |
| 36 GLsizei width_; | 39 GLsizei width_; |
| 37 GLsizei height_; | 40 GLsizei height_; |
| 38 GLsizei depth_; | 41 GLsizei depth_; |
| 42 GLfloat max_lod_; | |
| 43 GLfloat min_lod_; | |
| 44 GLint base_level_; | |
| 39 GLint border_; | 45 GLint border_; |
| 46 GLint max_level_; | |
| 40 GLenum format_; | 47 GLenum format_; |
| 41 GLenum type_; | 48 GLenum type_; |
| 42 bool has_image_; | 49 bool has_image_; |
| 43 bool can_render_; | 50 bool can_render_; |
| 44 bool can_render_to_; | 51 bool can_render_to_; |
| 45 bool npot_; | 52 bool npot_; |
| 46 | 53 |
| 47 // Since we will be hashing this signature structure, the padding must be | 54 // Since we will be hashing this signature structure, the padding must be |
| 48 // zero initialized. Although the C++11 specifications specify that this is | 55 // zero initialized. Although the C++11 specifications specify that this is |
| 49 // true, we will use a constructor with a memset to further enforce it instead | 56 // true, we will use a constructor with a memset to further enforce it instead |
| 50 // of relying on compilers adhering to this deep dark corner specification. | 57 // of relying on compilers adhering to this deep dark corner specification. |
| 51 TextureSignature(GLenum target, | 58 TextureSignature(GLenum target, |
| 52 GLint level, | 59 GLint level, |
| 53 GLenum min_filter, | 60 GLenum min_filter, |
| 54 GLenum mag_filter, | 61 GLenum mag_filter, |
| 62 GLenum wrap_r, | |
| 55 GLenum wrap_s, | 63 GLenum wrap_s, |
| 56 GLenum wrap_t, | 64 GLenum wrap_t, |
| 57 GLenum usage, | 65 GLenum usage, |
| 58 GLenum internal_format, | 66 GLenum internal_format, |
| 67 GLenum compare_func, | |
| 68 GLenum compare_mode, | |
| 59 GLsizei width, | 69 GLsizei width, |
| 60 GLsizei height, | 70 GLsizei height, |
| 61 GLsizei depth, | 71 GLsizei depth, |
| 72 GLfloat max_lod, | |
| 73 GLfloat min_lod, | |
| 74 GLint base_level, | |
| 62 GLint border, | 75 GLint border, |
| 76 GLint max_level, | |
| 63 GLenum format, | 77 GLenum format, |
| 64 GLenum type, | 78 GLenum type, |
| 65 bool has_image, | 79 bool has_image, |
| 66 bool can_render, | 80 bool can_render, |
| 67 bool can_render_to, | 81 bool can_render_to, |
| 68 bool npot) { | 82 bool npot) { |
| 69 memset(this, 0, sizeof(TextureSignature)); | 83 memset(this, 0, sizeof(TextureSignature)); |
| 70 target_ = target; | 84 target_ = target; |
| 71 level_ = level; | 85 level_ = level; |
| 72 min_filter_ = min_filter; | 86 min_filter_ = min_filter; |
| 73 mag_filter_ = mag_filter; | 87 mag_filter_ = mag_filter; |
| 88 wrap_r_ = wrap_r; | |
| 74 wrap_s_ = wrap_s; | 89 wrap_s_ = wrap_s; |
| 75 wrap_t_ = wrap_t; | 90 wrap_t_ = wrap_t; |
| 76 usage_ = usage; | 91 usage_ = usage; |
| 77 internal_format_ = internal_format; | 92 internal_format_ = internal_format; |
| 93 compare_func_ = compare_func; | |
| 94 compare_mode_ = compare_mode; | |
| 78 width_ = width; | 95 width_ = width; |
| 79 height_ = height; | 96 height_ = height; |
| 80 depth_ = depth; | 97 depth_ = depth; |
| 98 max_lod_ = max_lod; | |
| 99 min_lod_ = min_lod; | |
| 100 base_level_ = base_level; | |
| 81 border_ = border; | 101 border_ = border; |
| 102 max_level_ = max_level; | |
| 82 format_ = format; | 103 format_ = format; |
| 83 type_ = type; | 104 type_ = type; |
| 84 has_image_ = has_image; | 105 has_image_ = has_image; |
| 85 can_render_ = can_render; | 106 can_render_ = can_render; |
| 86 can_render_to_ = can_render_to; | 107 can_render_to_ = can_render_to; |
| 87 npot_ = npot; | 108 npot_ = npot; |
| 88 } | 109 } |
| 89 }; | 110 }; |
| 90 | 111 |
| 91 TextureManager::DestructionObserver::DestructionObserver() {} | 112 TextureManager::DestructionObserver::DestructionObserver() {} |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 126 Texture::Texture(GLuint service_id) | 147 Texture::Texture(GLuint service_id) |
| 127 : mailbox_manager_(NULL), | 148 : mailbox_manager_(NULL), |
| 128 memory_tracking_ref_(NULL), | 149 memory_tracking_ref_(NULL), |
| 129 service_id_(service_id), | 150 service_id_(service_id), |
| 130 cleared_(true), | 151 cleared_(true), |
| 131 num_uncleared_mips_(0), | 152 num_uncleared_mips_(0), |
| 132 num_npot_faces_(0), | 153 num_npot_faces_(0), |
| 133 target_(0), | 154 target_(0), |
| 134 min_filter_(GL_NEAREST_MIPMAP_LINEAR), | 155 min_filter_(GL_NEAREST_MIPMAP_LINEAR), |
| 135 mag_filter_(GL_LINEAR), | 156 mag_filter_(GL_LINEAR), |
| 157 wrap_r_(GL_REPEAT), | |
| 136 wrap_s_(GL_REPEAT), | 158 wrap_s_(GL_REPEAT), |
| 137 wrap_t_(GL_REPEAT), | 159 wrap_t_(GL_REPEAT), |
| 138 usage_(GL_NONE), | 160 usage_(GL_NONE), |
| 139 pool_(GL_TEXTURE_POOL_UNMANAGED_CHROMIUM), | 161 pool_(GL_TEXTURE_POOL_UNMANAGED_CHROMIUM), |
| 162 compare_func_(GL_LEQUAL), | |
| 163 compare_mode_(GL_NONE), | |
| 164 max_lod_(1000.0f), | |
| 165 min_lod_(-1000.0f), | |
| 166 base_level_(0), | |
| 167 max_level_(1000), | |
| 140 max_level_set_(-1), | 168 max_level_set_(-1), |
| 141 texture_complete_(false), | 169 texture_complete_(false), |
| 142 texture_mips_dirty_(false), | 170 texture_mips_dirty_(false), |
| 143 texture_mips_complete_(false), | 171 texture_mips_complete_(false), |
| 144 cube_complete_(false), | 172 cube_complete_(false), |
| 145 texture_level0_dirty_(false), | 173 texture_level0_dirty_(false), |
| 146 texture_level0_complete_(false), | 174 texture_level0_complete_(false), |
| 147 npot_(false), | 175 npot_(false), |
| 148 has_been_bound_(false), | 176 has_been_bound_(false), |
| 149 framebuffer_attachment_count_(0), | 177 framebuffer_attachment_count_(0), |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 298 DCHECK_LT(static_cast<size_t>(level), | 326 DCHECK_LT(static_cast<size_t>(level), |
| 299 face_infos_[face_index].level_infos.size()); | 327 face_infos_[face_index].level_infos.size()); |
| 300 | 328 |
| 301 const Texture::LevelInfo& info = | 329 const Texture::LevelInfo& info = |
| 302 face_infos_[face_index].level_infos[level]; | 330 face_infos_[face_index].level_infos[level]; |
| 303 | 331 |
| 304 TextureSignature signature_data(target, | 332 TextureSignature signature_data(target, |
| 305 level, | 333 level, |
| 306 min_filter_, | 334 min_filter_, |
| 307 mag_filter_, | 335 mag_filter_, |
| 336 wrap_r_, | |
| 308 wrap_s_, | 337 wrap_s_, |
| 309 wrap_t_, | 338 wrap_t_, |
| 310 usage_, | 339 usage_, |
| 311 info.internal_format, | 340 info.internal_format, |
| 341 compare_func_, | |
| 342 compare_mode_, | |
| 312 info.width, | 343 info.width, |
| 313 info.height, | 344 info.height, |
| 314 info.depth, | 345 info.depth, |
| 346 max_lod_, | |
| 347 min_lod_, | |
| 348 base_level_, | |
| 315 info.border, | 349 info.border, |
| 350 max_level_, | |
| 316 info.format, | 351 info.format, |
| 317 info.type, | 352 info.type, |
| 318 info.image.get() != NULL, | 353 info.image.get() != NULL, |
| 319 CanRender(feature_info), | 354 CanRender(feature_info), |
| 320 CanRenderTo(), | 355 CanRenderTo(), |
| 321 npot_); | 356 npot_); |
| 322 | 357 |
| 323 signature->append(TextureTag, sizeof(TextureTag)); | 358 signature->append(TextureTag, sizeof(TextureTag)); |
| 324 signature->append(reinterpret_cast<const char*>(&signature_data), | 359 signature->append(reinterpret_cast<const char*>(&signature_data), |
| 325 sizeof(signature_data)); | 360 sizeof(signature_data)); |
| (...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 738 mag_filter_ = param; | 773 mag_filter_ = param; |
| 739 break; | 774 break; |
| 740 case GL_TEXTURE_POOL_CHROMIUM: | 775 case GL_TEXTURE_POOL_CHROMIUM: |
| 741 if (!feature_info->validators()->texture_pool.IsValid(param)) { | 776 if (!feature_info->validators()->texture_pool.IsValid(param)) { |
| 742 return GL_INVALID_ENUM; | 777 return GL_INVALID_ENUM; |
| 743 } | 778 } |
| 744 GetMemTracker()->TrackMemFree(estimated_size()); | 779 GetMemTracker()->TrackMemFree(estimated_size()); |
| 745 pool_ = param; | 780 pool_ = param; |
| 746 GetMemTracker()->TrackMemAlloc(estimated_size()); | 781 GetMemTracker()->TrackMemAlloc(estimated_size()); |
| 747 break; | 782 break; |
| 783 case GL_TEXTURE_WRAP_R: | |
| 784 if (!feature_info->validators()->texture_wrap_mode.IsValid(param)) { | |
| 785 return GL_INVALID_ENUM; | |
| 786 } | |
| 787 wrap_r_ = param; | |
| 788 break; | |
| 748 case GL_TEXTURE_WRAP_S: | 789 case GL_TEXTURE_WRAP_S: |
| 749 if (!feature_info->validators()->texture_wrap_mode.IsValid(param)) { | 790 if (!feature_info->validators()->texture_wrap_mode.IsValid(param)) { |
| 750 return GL_INVALID_ENUM; | 791 return GL_INVALID_ENUM; |
| 751 } | 792 } |
| 752 wrap_s_ = param; | 793 wrap_s_ = param; |
| 753 break; | 794 break; |
| 754 case GL_TEXTURE_WRAP_T: | 795 case GL_TEXTURE_WRAP_T: |
| 755 if (!feature_info->validators()->texture_wrap_mode.IsValid(param)) { | 796 if (!feature_info->validators()->texture_wrap_mode.IsValid(param)) { |
| 756 return GL_INVALID_ENUM; | 797 return GL_INVALID_ENUM; |
| 757 } | 798 } |
| 758 wrap_t_ = param; | 799 wrap_t_ = param; |
| 759 break; | 800 break; |
| 801 case GL_TEXTURE_COMPARE_FUNC: | |
| 802 if (!feature_info->validators()->texture_compare_func.IsValid(param)) { | |
| 803 return GL_INVALID_ENUM; | |
| 804 } | |
| 805 compare_func_ = param; | |
| 806 break; | |
| 807 case GL_TEXTURE_COMPARE_MODE: | |
| 808 if (!feature_info->validators()->texture_compare_mode.IsValid(param)) { | |
| 809 return GL_INVALID_ENUM; | |
| 810 } | |
| 811 compare_mode_ = param; | |
| 812 break; | |
| 813 case GL_TEXTURE_BASE_LEVEL: | |
|
legend
2015/05/11 07:17:14
I have not found the legal range of GL_TEXTURE_BAS
piman
2015/05/11 21:39:34
In https://www.khronos.org/registry/gles/specs/3.0
legend
2015/05/12 02:34:16
Done.
| |
| 814 base_level_ = param; | |
| 815 break; | |
| 816 case GL_TEXTURE_MAX_LEVEL: | |
| 817 max_level_ = param; | |
| 818 break; | |
| 760 case GL_TEXTURE_MAX_ANISOTROPY_EXT: | 819 case GL_TEXTURE_MAX_ANISOTROPY_EXT: |
| 761 if (param < 1) { | 820 if (param < 1) { |
| 762 return GL_INVALID_VALUE; | 821 return GL_INVALID_VALUE; |
| 763 } | 822 } |
| 764 break; | 823 break; |
| 765 case GL_TEXTURE_USAGE_ANGLE: | 824 case GL_TEXTURE_USAGE_ANGLE: |
| 766 if (!feature_info->validators()->texture_usage.IsValid(param)) { | 825 if (!feature_info->validators()->texture_usage.IsValid(param)) { |
| 767 return GL_INVALID_ENUM; | 826 return GL_INVALID_ENUM; |
| 768 } | 827 } |
| 769 usage_ = param; | 828 usage_ = param; |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 784 case GL_TEXTURE_MIN_FILTER: | 843 case GL_TEXTURE_MIN_FILTER: |
| 785 case GL_TEXTURE_MAG_FILTER: | 844 case GL_TEXTURE_MAG_FILTER: |
| 786 case GL_TEXTURE_POOL_CHROMIUM: | 845 case GL_TEXTURE_POOL_CHROMIUM: |
| 787 case GL_TEXTURE_WRAP_S: | 846 case GL_TEXTURE_WRAP_S: |
| 788 case GL_TEXTURE_WRAP_T: | 847 case GL_TEXTURE_WRAP_T: |
| 789 case GL_TEXTURE_USAGE_ANGLE: | 848 case GL_TEXTURE_USAGE_ANGLE: |
| 790 { | 849 { |
| 791 GLint iparam = static_cast<GLint>(param); | 850 GLint iparam = static_cast<GLint>(param); |
| 792 return SetParameteri(feature_info, pname, iparam); | 851 return SetParameteri(feature_info, pname, iparam); |
| 793 } | 852 } |
| 853 case GL_TEXTURE_MIN_LOD: | |
| 854 min_lod_ = param; | |
| 855 break; | |
| 856 case GL_TEXTURE_MAX_LOD: | |
| 857 max_lod_ = param; | |
| 858 break; | |
| 794 case GL_TEXTURE_MAX_ANISOTROPY_EXT: | 859 case GL_TEXTURE_MAX_ANISOTROPY_EXT: |
| 795 if (param < 1.f) { | 860 if (param < 1.f) { |
| 796 return GL_INVALID_VALUE; | 861 return GL_INVALID_VALUE; |
| 797 } | 862 } |
| 798 break; | 863 break; |
| 799 default: | 864 default: |
| 800 NOTREACHED(); | 865 NOTREACHED(); |
| 801 return GL_INVALID_ENUM; | 866 return GL_INVALID_ENUM; |
| 802 } | 867 } |
| 803 return GL_NO_ERROR; | 868 return GL_NO_ERROR; |
| (...skipping 941 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1745 } | 1810 } |
| 1746 | 1811 |
| 1747 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { | 1812 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { |
| 1748 texture_state_->texture_upload_count++; | 1813 texture_state_->texture_upload_count++; |
| 1749 texture_state_->total_texture_upload_time += | 1814 texture_state_->total_texture_upload_time += |
| 1750 base::TimeTicks::Now() - begin_time_; | 1815 base::TimeTicks::Now() - begin_time_; |
| 1751 } | 1816 } |
| 1752 | 1817 |
| 1753 } // namespace gles2 | 1818 } // namespace gles2 |
| 1754 } // namespace gpu | 1819 } // namespace gpu |
| OLD | NEW |