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

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

Issue 2443123004: Revert of gpu: Clarify sized texture format is available only if ES3 context or immutable (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 1 month 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 <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 {GL_RGBA16I, GL_RGBA_INTEGER, GL_SHORT}, 224 {GL_RGBA16I, GL_RGBA_INTEGER, GL_SHORT},
225 {GL_RGBA32I, GL_RGBA_INTEGER, GL_INT}, 225 {GL_RGBA32I, GL_RGBA_INTEGER, GL_INT},
226 {GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT}, 226 {GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT},
227 {GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT}, 227 {GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT},
228 {GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT}, 228 {GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT},
229 {GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT}, 229 {GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT},
230 {GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT}, 230 {GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT},
231 {GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, 231 {GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8},
232 {GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL, 232 {GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL,
233 GL_FLOAT_32_UNSIGNED_INT_24_8_REV}, 233 GL_FLOAT_32_UNSIGNED_INT_24_8_REV},
234 // Exposed by GL_APPLE_texture_format_BGRA8888
235 {GL_BGRA8_EXT, GL_BGRA_EXT, GL_UNSIGNED_BYTE},
236 }; 234 };
237 235
238 for (size_t ii = 0; ii < arraysize(kSupportedFormatTypes); ++ii) { 236 for (size_t ii = 0; ii < arraysize(kSupportedFormatTypes); ++ii) {
239 supported_combinations_.insert(kSupportedFormatTypes[ii]); 237 supported_combinations_.insert(kSupportedFormatTypes[ii]);
240 } 238 }
241 } 239 }
242 240
243 // This may be accessed from multiple threads. 241 // This may be accessed from multiple threads.
244 bool IsValid(GLenum internal_format, GLenum format, GLenum type) const { 242 bool IsValid(GLenum internal_format, GLenum format, GLenum type) const {
245 FormatType query = { internal_format, format, type }; 243 FormatType query = { internal_format, format, type };
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 case GL_BLUE: 301 case GL_BLUE:
304 return swizzle->blue; 302 return swizzle->blue;
305 case GL_ALPHA: 303 case GL_ALPHA:
306 return swizzle->alpha; 304 return swizzle->alpha;
307 default: 305 default:
308 NOTREACHED(); 306 NOTREACHED();
309 return GL_NONE; 307 return GL_NONE;
310 } 308 }
311 } 309 }
312 310
313 bool SizedFormatAvailable(const FeatureInfo* feature_info,
314 bool immutable,
315 GLenum internal_format) {
316 if (immutable)
317 return true;
318
319 // TODO(dshwang): check if it's possible to remove
320 // CHROMIUM_color_buffer_float_rgb. crbug.com/329605
321 if ((feature_info->feature_flags().chromium_color_buffer_float_rgb &&
322 internal_format == GL_RGB32F) ||
323 (feature_info->feature_flags().chromium_color_buffer_float_rgba &&
324 internal_format == GL_RGBA32F)) {
325 return true;
326 }
327
328 return feature_info->IsES3Enabled();
329 }
330
331 // A 32-bit and 64-bit compatible way of converting a pointer to a GLuint. 311 // A 32-bit and 64-bit compatible way of converting a pointer to a GLuint.
332 GLuint ToGLuint(const void* ptr) { 312 GLuint ToGLuint(const void* ptr) {
333 return static_cast<GLuint>(reinterpret_cast<size_t>(ptr)); 313 return static_cast<GLuint>(reinterpret_cast<size_t>(ptr));
334 } 314 }
335 315
336 base::LazyInstance<const FormatTypeValidator>::Leaky g_format_type_validator = 316 base::LazyInstance<const FormatTypeValidator>::Leaky g_format_type_validator =
337 LAZY_INSTANCE_INITIALIZER; 317 LAZY_INSTANCE_INITIALIZER;
338 318
339 class ScopedResetPixelUnpackBuffer{ 319 class ScopedResetPixelUnpackBuffer{
340 public: 320 public:
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
614 // In ES2 with OES_depth_texture, such limitation isn't specified. 594 // In ES2 with OES_depth_texture, such limitation isn't specified.
615 if (feature_info->IsES3Enabled()) { 595 if (feature_info->IsES3Enabled()) {
616 return false; 596 return false;
617 } 597 }
618 } 598 }
619 } else if (feature_info->validators()->compressed_texture_format.IsValid( 599 } else if (feature_info->validators()->compressed_texture_format.IsValid(
620 first_level.internal_format)) { 600 first_level.internal_format)) {
621 // TODO(zmo): The assumption that compressed textures are all filterable 601 // TODO(zmo): The assumption that compressed textures are all filterable
622 // may not be true in the future. 602 // may not be true in the future.
623 } else { 603 } else {
624 if (!Texture::TextureFilterable(feature_info, first_level.internal_format, 604 if (!Texture::TextureFilterable(feature_info,
625 first_level.type, immutable_)) { 605 first_level.internal_format,
606 first_level.type)) {
626 return false; 607 return false;
627 } 608 }
628 } 609 }
629 } 610 }
630 611
631 if (!feature_info->IsES3Enabled()) { 612 if (!feature_info->IsES3Enabled()) {
632 bool is_npot_compatible = !needs_mips && 613 bool is_npot_compatible = !needs_mips &&
633 sampler_state.wrap_s == GL_CLAMP_TO_EDGE && 614 sampler_state.wrap_s == GL_CLAMP_TO_EDGE &&
634 sampler_state.wrap_t == GL_CLAMP_TO_EDGE; 615 sampler_state.wrap_t == GL_CLAMP_TO_EDGE;
635 616
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
741 return false; 722 return false;
742 } 723 }
743 724
744 // Can't generate mips for depth or stencil textures. 725 // Can't generate mips for depth or stencil textures.
745 const Texture::LevelInfo& base = face_infos_[0].level_infos[base_level_]; 726 const Texture::LevelInfo& base = face_infos_[0].level_infos[base_level_];
746 uint32_t channels = GLES2Util::GetChannelsForFormat(base.format); 727 uint32_t channels = GLES2Util::GetChannelsForFormat(base.format);
747 if (channels & (GLES2Util::kDepth | GLES2Util::kStencil)) { 728 if (channels & (GLES2Util::kDepth | GLES2Util::kStencil)) {
748 return false; 729 return false;
749 } 730 }
750 731
751 if (!Texture::ColorRenderable(feature_info, base.internal_format, 732 if (!Texture::ColorRenderable(feature_info, base.internal_format) ||
752 immutable_) || 733 !Texture::TextureFilterable(
753 !Texture::TextureFilterable(feature_info, base.internal_format, base.type, 734 feature_info, base.internal_format, base.type)) {
754 immutable_)) {
755 return false; 735 return false;
756 } 736 }
757 737
758 for (size_t ii = 0; ii < face_infos_.size(); ++ii) { 738 for (size_t ii = 0; ii < face_infos_.size(); ++ii) {
759 const LevelInfo& info = face_infos_[ii].level_infos[base_level_]; 739 const LevelInfo& info = face_infos_[ii].level_infos[base_level_];
760 if ((info.target == 0) || 740 if ((info.target == 0) ||
761 feature_info->validators()->compressed_texture_format.IsValid( 741 feature_info->validators()->compressed_texture_format.IsValid(
762 info.internal_format) || 742 info.internal_format) ||
763 info.image.get()) { 743 info.image.get()) {
764 return false; 744 return false;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 depth == mip_depth && 801 depth == mip_depth &&
822 internal_format == base_level_face.internal_format && 802 internal_format == base_level_face.internal_format &&
823 format == base_level_face.format && 803 format == base_level_face.format &&
824 type == base_level_face.type); 804 type == base_level_face.type);
825 } 805 }
826 return complete; 806 return complete;
827 } 807 }
828 808
829 // static 809 // static
830 bool Texture::ColorRenderable(const FeatureInfo* feature_info, 810 bool Texture::ColorRenderable(const FeatureInfo* feature_info,
831 GLenum internal_format, 811 GLenum internal_format) {
832 bool immutable) {
833 if (feature_info->validators()->texture_unsized_internal_format.IsValid( 812 if (feature_info->validators()->texture_unsized_internal_format.IsValid(
834 internal_format)) { 813 internal_format)) {
835 return true; 814 return true;
836 } 815 }
837 816 return feature_info->validators()->
838 return SizedFormatAvailable(feature_info, immutable, internal_format) && 817 texture_sized_color_renderable_internal_format.IsValid(internal_format);
839 feature_info->validators()
840 ->texture_sized_color_renderable_internal_format.IsValid(
841 internal_format);
842 } 818 }
843 819
844 // static 820 // static
845 bool Texture::TextureFilterable(const FeatureInfo* feature_info, 821 bool Texture::TextureFilterable(const FeatureInfo* feature_info,
846 GLenum internal_format, 822 GLenum internal_format,
847 GLenum type, 823 GLenum type) {
848 bool immutable) {
849 if (feature_info->validators()->texture_unsized_internal_format.IsValid( 824 if (feature_info->validators()->texture_unsized_internal_format.IsValid(
850 internal_format)) { 825 internal_format)) {
851 switch (type) { 826 switch (type) {
852 case GL_FLOAT: 827 case GL_FLOAT:
853 return feature_info->feature_flags().enable_texture_float_linear; 828 return feature_info->feature_flags().enable_texture_float_linear;
854 case GL_HALF_FLOAT_OES: 829 case GL_HALF_FLOAT_OES:
855 return feature_info->feature_flags().enable_texture_half_float_linear; 830 return feature_info->feature_flags().enable_texture_half_float_linear;
856 default: 831 default:
857 // GL_HALF_FLOAT is ES3 only and should only be used with sized formats. 832 // GL_HALF_FLOAT is ES3 only and should only be used with sized formats.
858 return true; 833 return true;
859 } 834 }
860 } 835 }
861 return SizedFormatAvailable(feature_info, immutable, internal_format) && 836 return feature_info->validators()->
862 feature_info->validators() 837 texture_sized_texture_filterable_internal_format.IsValid(internal_format);
863 ->texture_sized_texture_filterable_internal_format.IsValid(
864 internal_format);
865 } 838 }
866 839
867 void Texture::SetLevelClearedRect(GLenum target, 840 void Texture::SetLevelClearedRect(GLenum target,
868 GLint level, 841 GLint level,
869 const gfx::Rect& cleared_rect) { 842 const gfx::Rect& cleared_rect) {
870 DCHECK_GE(level, 0); 843 DCHECK_GE(level, 0);
871 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 844 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
872 DCHECK_LT(static_cast<size_t>(face_index), 845 DCHECK_LT(static_cast<size_t>(face_index),
873 face_infos_.size()); 846 face_infos_.size());
874 DCHECK_LT(static_cast<size_t>(level), 847 DCHECK_LT(static_cast<size_t>(level),
(...skipping 856 matching lines...) Expand 10 before | Expand all | Expand 10 after
1731 // However, it is required if command buffer is implemented on top of 1704 // However, it is required if command buffer is implemented on top of
1732 // recent OpenGL core versions or OpenGL ES 3.0+. Therefore, for consistency, 1705 // recent OpenGL core versions or OpenGL ES 3.0+. Therefore, for consistency,
1733 // it is better to deviate from ES2 spec and require cube completeness all 1706 // it is better to deviate from ES2 spec and require cube completeness all
1734 // the time. 1707 // the time.
1735 if (face_infos_.size() == 6 && !cube_complete_) 1708 if (face_infos_.size() == 6 && !cube_complete_)
1736 return false; 1709 return false;
1737 DCHECK(level >= 0 && 1710 DCHECK(level >= 0 &&
1738 level < static_cast<GLint>(face_infos_[0].level_infos.size())); 1711 level < static_cast<GLint>(face_infos_[0].level_infos.size()));
1739 GLenum internal_format = face_infos_[0].level_infos[level].internal_format; 1712 GLenum internal_format = face_infos_[0].level_infos[level].internal_format;
1740 bool color_renderable = 1713 bool color_renderable =
1741 ((feature_info->validators()->texture_unsized_internal_format.IsValid( 1714 ((feature_info->validators()->texture_unsized_internal_format.
1742 internal_format) && 1715 IsValid(internal_format) &&
1743 internal_format != GL_ALPHA && internal_format != GL_LUMINANCE && 1716 internal_format != GL_ALPHA &&
1717 internal_format != GL_LUMINANCE &&
1744 internal_format != GL_LUMINANCE_ALPHA && 1718 internal_format != GL_LUMINANCE_ALPHA &&
1745 internal_format != GL_SRGB_EXT) || 1719 internal_format != GL_SRGB_EXT) ||
1746 (SizedFormatAvailable(feature_info, immutable_, internal_format) && 1720 feature_info->validators()->
1747 feature_info->validators() 1721 texture_sized_color_renderable_internal_format.IsValid(
1748 ->texture_sized_color_renderable_internal_format.IsValid( 1722 internal_format));
1749 internal_format)));
1750 bool depth_renderable = feature_info->validators()-> 1723 bool depth_renderable = feature_info->validators()->
1751 texture_depth_renderable_internal_format.IsValid(internal_format); 1724 texture_depth_renderable_internal_format.IsValid(internal_format);
1752 bool stencil_renderable = feature_info->validators()-> 1725 bool stencil_renderable = feature_info->validators()->
1753 texture_stencil_renderable_internal_format.IsValid(internal_format); 1726 texture_stencil_renderable_internal_format.IsValid(internal_format);
1754 return (color_renderable || depth_renderable || stencil_renderable); 1727 return (color_renderable || depth_renderable || stencil_renderable);
1755 } 1728 }
1756 1729
1757 GLenum Texture::GetCompatibilitySwizzleForChannel(GLenum channel) { 1730 GLenum Texture::GetCompatibilitySwizzleForChannel(GLenum channel) {
1758 return GetSwizzleForChannel(channel, compatibility_swizzle_); 1731 return GetSwizzleForChannel(channel, compatibility_swizzle_);
1759 } 1732 }
(...skipping 1747 matching lines...) Expand 10 before | Expand all | Expand 10 after
3507 uint32_t TextureManager::GetServiceIdGeneration() const { 3480 uint32_t TextureManager::GetServiceIdGeneration() const {
3508 return current_service_id_generation_; 3481 return current_service_id_generation_;
3509 } 3482 }
3510 3483
3511 void TextureManager::IncrementServiceIdGeneration() { 3484 void TextureManager::IncrementServiceIdGeneration() {
3512 current_service_id_generation_++; 3485 current_service_id_generation_++;
3513 } 3486 }
3514 3487
3515 } // namespace gles2 3488 } // namespace gles2
3516 } // namespace gpu 3489 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/texture_manager.h ('k') | gpu/command_buffer/tests/gl_texture_storage_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698