| Index: gpu/command_buffer/service/feature_info.cc
|
| diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc
|
| index 31b6c5031877e34d3caa3be3ae8785c359d50753..5df6f507d4527369e764b1a0b42396cd4419ef79 100644
|
| --- a/gpu/command_buffer/service/feature_info.cc
|
| +++ b/gpu/command_buffer/service/feature_info.cc
|
| @@ -561,42 +561,73 @@ void FeatureInfo::InitializeFeatures() {
|
| validators_.texture_unsized_internal_format.AddValue(GL_SRGB_ALPHA_EXT);
|
| }
|
|
|
| - bool enable_texture_format_bgra8888 = false;
|
| - bool enable_read_format_bgra = false;
|
| - bool enable_render_buffer_bgra = false;
|
| - bool enable_immutable_texture_format_bgra_on_es3 =
|
| - extensions.Contains("GL_APPLE_texture_format_BGRA8888");
|
| + // Note: Only APPLE_texture_format_BGRA8888 extension allows BGRA8_EXT in
|
| + // ES3's glTexStorage2D, whereas EXT_texture_format_BGRA8888 doesn't provide
|
| + // that compatibility. So if EXT_texture_format_BGRA8888 (but not
|
| + // APPLE_texture_format_BGRA8888) is present on an underlying ES3 context, we
|
| + // have to choose which one of BGRA vs texture storage we expose.
|
| + // When creating ES2 contexts, we prefer support BGRA to texture storage, so
|
| + // we disable texture storage if only EXT_texture_format_BGRA8888 is present.
|
| + // If neither is present, we expose texture storage.
|
| + // When creating ES3 contexts, we do need to expose texture storage, so we
|
| + // disable BGRA if we have to.
|
| + bool has_apple_bgra = extensions.Contains("GL_APPLE_texture_format_BGRA8888");
|
| + bool has_ext_bgra = extensions.Contains("GL_EXT_texture_format_BGRA8888");
|
| + bool has_bgra = has_ext_bgra || has_apple_bgra || !gl_version_info_->is_es;
|
| +
|
| + bool has_ext_texture_storage = extensions.Contains("GL_EXT_texture_storage");
|
| + bool has_arb_texture_storage = extensions.Contains("GL_ARB_texture_storage");
|
| + bool has_texture_storage =
|
| + !workarounds_.disable_texture_storage &&
|
| + (has_ext_texture_storage || has_arb_texture_storage ||
|
| + gl_version_info_->is_es3 || gl_version_info_->IsAtLeastGL(4, 2));
|
| +
|
| + bool enable_texture_format_bgra8888 = has_bgra;
|
| + bool enable_texture_storage = has_texture_storage;
|
| +
|
| + bool texture_storage_incompatible_with_bgra =
|
| + gl_version_info_->is_es3 && !has_ext_texture_storage && !has_apple_bgra;
|
| + if (texture_storage_incompatible_with_bgra &&
|
| + enable_texture_format_bgra8888 && enable_texture_storage) {
|
| + switch (context_type_) {
|
| + case CONTEXT_TYPE_OPENGLES2:
|
| + case CONTEXT_TYPE_WEBGL1:
|
| + enable_texture_storage = false;
|
| + break;
|
| + case CONTEXT_TYPE_OPENGLES3:
|
| + case CONTEXT_TYPE_WEBGL2:
|
| + enable_texture_format_bgra8888 = false;
|
| + break;
|
| + }
|
| + }
|
|
|
| - // Check if we should allow GL_EXT_texture_format_BGRA8888.
|
| - if (extensions.Contains("GL_EXT_texture_format_BGRA8888") ||
|
| - enable_immutable_texture_format_bgra_on_es3 ||
|
| - !gl_version_info_->is_es) {
|
| - enable_texture_format_bgra8888 = true;
|
| + if (enable_texture_format_bgra8888) {
|
| + feature_flags_.ext_texture_format_bgra8888 = true;
|
| + AddExtensionString("GL_EXT_texture_format_BGRA8888");
|
| + validators_.texture_internal_format.AddValue(GL_BGRA_EXT);
|
| + validators_.texture_format.AddValue(GL_BGRA_EXT);
|
| + validators_.texture_unsized_internal_format.AddValue(GL_BGRA_EXT);
|
| }
|
|
|
| // On desktop, all devices support BGRA render buffers (note that on desktop
|
| // BGRA internal formats are converted to RGBA in the API implementation).
|
| // For ES, there is no extension that exposes BGRA renderbuffers, however
|
| // Angle does support these.
|
| - if (gl_version_info_->is_angle || !gl_version_info_->is_es) {
|
| - enable_render_buffer_bgra = true;
|
| + bool enable_render_buffer_bgra =
|
| + gl_version_info_->is_angle || !gl_version_info_->is_es;
|
| +
|
| + if (enable_render_buffer_bgra) {
|
| + feature_flags_.ext_render_buffer_format_bgra8888 = true;
|
| + AddExtensionString("GL_CHROMIUM_renderbuffer_format_BGRA8888");
|
| + validators_.render_buffer_format.AddValue(GL_BGRA8_EXT);
|
| }
|
|
|
| // On desktop, all devices support BGRA readback since OpenGL 2.0, which we
|
| // require. On ES, support is indicated by the GL_EXT_read_format_bgra
|
| // extension.
|
| - if (extensions.Contains("GL_EXT_read_format_bgra") ||
|
| - !gl_version_info_->is_es) {
|
| - enable_read_format_bgra = true;
|
| - }
|
| -
|
| - if (enable_texture_format_bgra8888) {
|
| - feature_flags_.ext_texture_format_bgra8888 = true;
|
| - AddExtensionString("GL_EXT_texture_format_BGRA8888");
|
| - validators_.texture_internal_format.AddValue(GL_BGRA_EXT);
|
| - validators_.texture_format.AddValue(GL_BGRA_EXT);
|
| - validators_.texture_unsized_internal_format.AddValue(GL_BGRA_EXT);
|
| - }
|
| + bool enable_read_format_bgra =
|
| + extensions.Contains("GL_EXT_read_format_bgra") ||
|
| + !gl_version_info_->is_es;
|
|
|
| if (enable_read_format_bgra) {
|
| feature_flags_.ext_read_format_bgra = true;
|
| @@ -616,12 +647,6 @@ void FeatureInfo::InitializeFeatures() {
|
| AddExtensionString("GL_EXT_disjoint_timer_query");
|
| }
|
|
|
| - if (enable_render_buffer_bgra) {
|
| - feature_flags_.ext_render_buffer_format_bgra8888 = true;
|
| - AddExtensionString("GL_CHROMIUM_renderbuffer_format_BGRA8888");
|
| - validators_.render_buffer_format.AddValue(GL_BGRA8_EXT);
|
| - }
|
| -
|
| if (extensions.Contains("GL_OES_rgb8_rgba8") || gfx::HasDesktopGLFeatures()) {
|
| AddExtensionString("GL_OES_rgb8_rgba8");
|
| validators_.render_buffer_format.AddValue(GL_RGB8_OES);
|
| @@ -975,22 +1000,7 @@ void FeatureInfo::InitializeFeatures() {
|
| validators_.texture_parameter.AddValue(GL_TEXTURE_USAGE_ANGLE);
|
| }
|
|
|
| - // Note: Only APPLE_texture_format_BGRA8888 extension allows BGRA8_EXT in
|
| - // ES3's glTexStorage2D. We prefer support BGRA to texture storage.
|
| - // So we don't expose GL_EXT_texture_storage when ES3 +
|
| - // GL_EXT_texture_format_BGRA8888 because we fail the GL_BGRA8 requirement.
|
| - // However we expose GL_EXT_texture_storage when just ES3 because we don't
|
| - // claim to handle GL_BGRA8.
|
| - bool support_texture_storage_on_es3 =
|
| - (gl_version_info_->is_es3 &&
|
| - enable_immutable_texture_format_bgra_on_es3) ||
|
| - (gl_version_info_->is_es3 &&
|
| - !enable_texture_format_bgra8888);
|
| - if (!workarounds_.disable_texture_storage &&
|
| - (extensions.Contains("GL_EXT_texture_storage") ||
|
| - extensions.Contains("GL_ARB_texture_storage") ||
|
| - support_texture_storage_on_es3 ||
|
| - gl_version_info_->IsAtLeastGL(4, 2))) {
|
| + if (enable_texture_storage) {
|
| feature_flags_.ext_texture_storage = true;
|
| AddExtensionString("GL_EXT_texture_storage");
|
| validators_.texture_parameter.AddValue(GL_TEXTURE_IMMUTABLE_FORMAT_EXT);
|
| @@ -1287,6 +1297,8 @@ void FeatureInfo::InitializeFeatures() {
|
| bool FeatureInfo::IsES3Capable() const {
|
| if (!enable_unsafe_es3_apis_switch_)
|
| return false;
|
| + if (workarounds_.disable_texture_storage)
|
| + return false;
|
| if (gl_version_info_)
|
| return gl_version_info_->IsES3Capable();
|
| return false;
|
|
|