Chromium Code Reviews| Index: gpu/command_buffer/service/texture_manager.cc |
| diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc |
| index 0ab416a494992fb4217fb1430d632b767d676489..a16ea7529bc50f3272e2124e3f0195474e6aa852 100644 |
| --- a/gpu/command_buffer/service/texture_manager.cc |
| +++ b/gpu/command_buffer/service/texture_manager.cc |
| @@ -231,6 +231,8 @@ class FormatTypeValidator { |
| {GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}, |
| {GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL, |
| GL_FLOAT_32_UNSIGNED_INT_24_8_REV}, |
| + // Exposed by GL_APPLE_texture_format_BGRA8888 |
| + {GL_BGRA8_EXT, GL_BGRA_EXT, GL_UNSIGNED_BYTE}, |
| }; |
| for (size_t ii = 0; ii < arraysize(kSupportedFormatTypes); ++ii) { |
| @@ -308,6 +310,24 @@ GLenum GetSwizzleForChannel(GLenum channel, |
| } |
| } |
| +bool SizedFormatAvailable(const FeatureInfo* feature_info, |
| + bool immutable, |
| + GLenum internal_format) { |
| + if (immutable) |
| + return true; |
| + |
| + // TODO(dshwang): check if it's possible to remove |
| + // CHROMIUM_color_buffer_float_rgb. crbug.com/329605 |
| + if ((feature_info->feature_flags().chromium_color_buffer_float_rgb && |
| + internal_format == GL_RGB32F) || |
| + (feature_info->feature_flags().chromium_color_buffer_float_rgba && |
| + internal_format == GL_RGBA32F)) { |
| + return true; |
| + } |
|
dshwang
2016/10/14 12:03:34
following test failed.
https://www.khronos.org/reg
Ken Russell (switch to Gerrit)
2016/10/20 04:59:40
Sorry, I don't remember. The ultimate goal was to
|
| + |
| + return feature_info->IsES3Enabled(); |
| +} |
| + |
| // A 32-bit and 64-bit compatible way of converting a pointer to a GLuint. |
| GLuint ToGLuint(const void* ptr) { |
| return static_cast<GLuint>(reinterpret_cast<size_t>(ptr)); |
| @@ -601,9 +621,8 @@ bool Texture::CanRenderWithSampler(const FeatureInfo* feature_info, |
| // TODO(zmo): The assumption that compressed textures are all filterable |
| // may not be true in the future. |
| } else { |
| - if (!Texture::TextureFilterable(feature_info, |
| - first_level.internal_format, |
| - first_level.type)) { |
| + if (!Texture::TextureFilterable(feature_info, first_level.internal_format, |
| + first_level.type, immutable_)) { |
| return false; |
| } |
| } |
| @@ -729,9 +748,10 @@ bool Texture::CanGenerateMipmaps(const FeatureInfo* feature_info) const { |
| return false; |
| } |
| - if (!Texture::ColorRenderable(feature_info, base.internal_format) || |
| - !Texture::TextureFilterable( |
| - feature_info, base.internal_format, base.type)) { |
| + if (!Texture::ColorRenderable(feature_info, base.internal_format, |
| + immutable_) || |
| + !Texture::TextureFilterable(feature_info, base.internal_format, base.type, |
| + immutable_)) { |
| return false; |
| } |
| @@ -808,19 +828,24 @@ bool Texture::TextureMipComplete(const Texture::LevelInfo& base_level_face, |
| // static |
| bool Texture::ColorRenderable(const FeatureInfo* feature_info, |
| - GLenum internal_format) { |
| + GLenum internal_format, |
| + bool immutable) { |
| if (feature_info->validators()->texture_unsized_internal_format.IsValid( |
| internal_format)) { |
| return true; |
| } |
| - return feature_info->validators()-> |
| - texture_sized_color_renderable_internal_format.IsValid(internal_format); |
| + |
| + return SizedFormatAvailable(feature_info, immutable, internal_format) && |
| + feature_info->validators() |
| + ->texture_sized_color_renderable_internal_format.IsValid( |
| + internal_format); |
| } |
| // static |
| bool Texture::TextureFilterable(const FeatureInfo* feature_info, |
| GLenum internal_format, |
| - GLenum type) { |
| + GLenum type, |
| + bool immutable) { |
| if (feature_info->validators()->texture_unsized_internal_format.IsValid( |
| internal_format)) { |
| switch (type) { |
| @@ -833,8 +858,10 @@ bool Texture::TextureFilterable(const FeatureInfo* feature_info, |
| return true; |
| } |
| } |
| - return feature_info->validators()-> |
| - texture_sized_texture_filterable_internal_format.IsValid(internal_format); |
| + return SizedFormatAvailable(feature_info, immutable, internal_format) && |
| + feature_info->validators() |
| + ->texture_sized_texture_filterable_internal_format.IsValid( |
| + internal_format); |
| } |
| void Texture::SetLevelClearedRect(GLenum target, |
| @@ -1711,15 +1738,15 @@ bool Texture::CanRenderTo(const FeatureInfo* feature_info, GLint level) const { |
| level < static_cast<GLint>(face_infos_[0].level_infos.size())); |
| GLenum internal_format = face_infos_[0].level_infos[level].internal_format; |
| bool color_renderable = |
| - ((feature_info->validators()->texture_unsized_internal_format. |
| - IsValid(internal_format) && |
| - internal_format != GL_ALPHA && |
| - internal_format != GL_LUMINANCE && |
| + ((feature_info->validators()->texture_unsized_internal_format.IsValid( |
| + internal_format) && |
| + internal_format != GL_ALPHA && internal_format != GL_LUMINANCE && |
| internal_format != GL_LUMINANCE_ALPHA && |
| internal_format != GL_SRGB_EXT) || |
| - feature_info->validators()-> |
| - texture_sized_color_renderable_internal_format.IsValid( |
| - internal_format)); |
| + (SizedFormatAvailable(feature_info, immutable_, internal_format) && |
| + feature_info->validators() |
| + ->texture_sized_color_renderable_internal_format.IsValid( |
| + internal_format))); |
| bool depth_renderable = feature_info->validators()-> |
| texture_depth_renderable_internal_format.IsValid(internal_format); |
| bool stencil_renderable = feature_info->validators()-> |