// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "gpu/command_buffer/service/feature_info.h"

#include <stddef.h>

#include <memory>

#include "gpu/command_buffer/service/gpu_service_test.h"
#include "gpu/command_buffer/service/gpu_switches.h"
#include "gpu/command_buffer/service/test_helper.h"
#include "gpu/command_buffer/service/texture_manager.h"
#include "gpu/config/gpu_driver_bug_workarounds.h"
#include "gpu/config/gpu_switches.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gl/gl_fence.h"
#include "ui/gl/gl_implementation.h"
#include "ui/gl/gl_mock.h"
#include "ui/gl/gl_version_info.h"

using ::testing::_;
using ::testing::DoAll;
using ::testing::HasSubstr;
using ::testing::InSequence;
using ::testing::MatcherCast;
using ::testing::Not;
using ::testing::Pointee;
using ::testing::Return;
using ::testing::SetArrayArgument;
using ::testing::SetArgPointee;
using ::testing::StrEq;

namespace gpu {
namespace gles2 {

namespace {
const char kGLRendererStringANGLE[] = "ANGLE (some renderer)";
}  // anonymous namespace

enum MockedGLVersionKind {
  ES2_on_Version3_0,
  ES2_on_Version3_2Compatibility,
  ES3_on_Version3_0,
  ES3_on_Version3_2Compatibility,

  // Currently, nothing cares about both ES version and passthrough, so just
  // create one representative passthrough case.
  ES2_on_Version3_0_Passthrough
};

class FeatureInfoTest
    : public GpuServiceTest,
      public ::testing::WithParamInterface<MockedGLVersionKind> {
 public:
  FeatureInfoTest() = default;

  void SetupInitExpectations(const char* extensions) {
    std::string extensions_str = extensions;
    // Most of the tests' expectations currently assume the desktop
    // OpenGL compatibility profile.
    switch (GetParam()) {
      case ES2_on_Version3_0:
      case ES2_on_Version3_0_Passthrough:
      case ES3_on_Version3_0:
        SetupInitExpectationsWithGLVersion(extensions_str.c_str(), "", "3.0");
        break;
      case ES2_on_Version3_2Compatibility:
      case ES3_on_Version3_2Compatibility:
        if (extensions_str.find("GL_ARB_compatibility") == std::string::npos) {
          extensions_str += " GL_ARB_compatibility";
        }
        SetupInitExpectationsWithGLVersion(extensions_str.c_str(), "", "3.2");
        break;
      default:
        NOTREACHED();
        break;
    }
  }

  ContextType GetContextType() {
    switch (GetParam()) {
      case ES2_on_Version3_0:
      case ES2_on_Version3_0_Passthrough:
      case ES2_on_Version3_2Compatibility:
        return CONTEXT_TYPE_OPENGLES2;
      case ES3_on_Version3_0:
      case ES3_on_Version3_2Compatibility:
        return CONTEXT_TYPE_OPENGLES3;
      default:
        NOTREACHED();
        return CONTEXT_TYPE_OPENGLES2;
    }
  }

  bool IsPassthroughCmdDecoder() {
    switch (GetParam()) {
      case ES2_on_Version3_0_Passthrough:
        return true;
      case ES2_on_Version3_0:
      case ES2_on_Version3_2Compatibility:
      case ES3_on_Version3_0:
      case ES3_on_Version3_2Compatibility:
        return false;
      default:
        NOTREACHED();
        return false;
    }
  }

  void SetupInitExpectationsWithGLVersion(
      const char* extensions, const char* renderer, const char* version) {
    GpuServiceTest::SetUpWithGLVersion(version, extensions);
    TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
        gl_.get(), extensions, renderer, version, GetContextType());
    info_ = new FeatureInfo();
    info_->Initialize(GetContextType(), IsPassthroughCmdDecoder(),
                      DisallowedFeatures());
  }

  void SetupInitExpectationsWithGLVersionAndDisallowedFeatures(
      const char* extensions,
      const char* renderer,
      const char* version,
      const DisallowedFeatures& disallowed_features) {
    GpuServiceTest::SetUpWithGLVersion(version, extensions);
    TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
        gl_.get(), extensions, renderer, version, GetContextType());
    info_ = new FeatureInfo();
    info_->Initialize(GetContextType(), IsPassthroughCmdDecoder(),
                      disallowed_features);
  }

  void SetupWithWorkarounds(const gpu::GpuDriverBugWorkarounds& workarounds) {
    GpuServiceTest::SetUp();
    info_ = new FeatureInfo(workarounds, GpuFeatureInfo());
  }

  void SetupInitExpectationsWithWorkarounds(
      const char* extensions,
      const gpu::GpuDriverBugWorkarounds& workarounds) {
    GpuServiceTest::SetUpWithGLVersion("2.0", extensions);
    TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
        gl_.get(), extensions, "", "", GetContextType());
    info_ = new FeatureInfo(workarounds, GpuFeatureInfo());
    info_->Initialize(GetContextType(), IsPassthroughCmdDecoder(),
                      DisallowedFeatures());
  }

  void SetupWithoutInit() {
    GpuServiceTest::SetUp();
    info_ = new FeatureInfo();
  }

 protected:
  void SetUp() override {
    // Do nothing here, since we are using the explicit Setup*() functions.
  }

  void TearDown() override {
    info_ = nullptr;
    GpuServiceTest::TearDown();
  }

  scoped_refptr<FeatureInfo> info_;
};

static const MockedGLVersionKind kGLVersionKinds[] = {
  ES2_on_Version3_0,
  ES2_on_Version3_2Compatibility,
  ES3_on_Version3_0,
  ES3_on_Version3_2Compatibility
};

INSTANTIATE_TEST_SUITE_P(Service,
                         FeatureInfoTest,
                         ::testing::ValuesIn(kGLVersionKinds));

TEST_P(FeatureInfoTest, Basic) {
  SetupWithoutInit();
  // Test it starts off uninitialized.
  EXPECT_FALSE(info_->feature_flags().chromium_framebuffer_multisample);
  EXPECT_FALSE(info_->feature_flags().multisampled_render_to_texture);
  EXPECT_FALSE(info_->feature_flags(
      ).use_img_for_multisampled_render_to_texture);
  EXPECT_FALSE(info_->feature_flags().oes_standard_derivatives);
  EXPECT_FALSE(info_->feature_flags().npot_ok);
  EXPECT_FALSE(info_->feature_flags().enable_texture_float_linear);
  EXPECT_FALSE(info_->feature_flags().enable_texture_half_float_linear);
  EXPECT_FALSE(info_->feature_flags().oes_egl_image_external);
  EXPECT_FALSE(info_->feature_flags().nv_egl_stream_consumer_external);
  EXPECT_FALSE(info_->feature_flags().oes_depth24);
  EXPECT_FALSE(info_->feature_flags().packed_depth24_stencil8);
  EXPECT_FALSE(info_->feature_flags().angle_translated_shader_source);
  EXPECT_FALSE(info_->feature_flags().angle_pack_reverse_row_order);
  EXPECT_FALSE(info_->feature_flags().arb_texture_rectangle);
  EXPECT_FALSE(info_->feature_flags().angle_instanced_arrays);
  EXPECT_FALSE(info_->feature_flags().occlusion_query_boolean);
  EXPECT_FALSE(info_->feature_flags(
      ).use_arb_occlusion_query2_for_occlusion_query_boolean);
  EXPECT_FALSE(info_->feature_flags(
      ).use_arb_occlusion_query_for_occlusion_query_boolean);
  EXPECT_FALSE(info_->feature_flags().native_vertex_array_object);
  EXPECT_FALSE(info_->feature_flags().map_buffer_range);
  EXPECT_FALSE(info_->feature_flags().use_async_readpixels);
  EXPECT_FALSE(info_->feature_flags().ext_draw_buffers);
  EXPECT_FALSE(info_->feature_flags().nv_draw_buffers);
  EXPECT_FALSE(info_->feature_flags().ext_discard_framebuffer);
  EXPECT_FALSE(info_->feature_flags().angle_depth_texture);
  EXPECT_FALSE(info_->feature_flags().ext_read_format_bgra);

#define GPU_OP(type, name) EXPECT_FALSE(info_->workarounds().name);
  GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP)
#undef GPU_OP
  EXPECT_EQ(0, info_->workarounds().max_texture_size);
  EXPECT_FALSE(info_->workarounds().gl_clear_broken);
}

TEST_P(FeatureInfoTest, InitializeNoExtensions) {
  SetupInitExpectations("");
  // Check default extensions are there
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_CHROMIUM_resource_safe"));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_CHROMIUM_strict_attribs"));
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_ANGLE_translated_shader_source"));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_CHROMIUM_trace_marker"));
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_unpack_subimage"));

  bool expect_ext_srgb = false;
  switch (GetParam()) {
    case ES2_on_Version3_0:
    case ES3_on_Version3_0:
    case ES3_on_Version3_2Compatibility:
      break;
    case ES2_on_Version3_2Compatibility:
      // sRGB features are available as core GL 3.2.
      expect_ext_srgb = true;
      break;
    default:
      NOTREACHED();
      break;
  }
  // Note that because GL_EXT_sRGB is a substring of GL_EXT_sRGB_write_control,
  // which is not part of the ES3 core, we have to be careful to search for
  // "GL_EXT_sRGB ", and append a space to the end of the extension string.
  if (expect_ext_srgb) {
    EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_sRGB"));
    EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_SRGB_EXT));
    EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_SRGB_ALPHA_EXT));
    EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(
        GL_SRGB_EXT));
    EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(
        GL_SRGB_ALPHA_EXT));
    EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(
        GL_SRGB8_ALPHA8_EXT));
    EXPECT_TRUE(info_->validators()->framebuffer_attachment_parameter.IsValid(
        GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT));
  } else {
    EXPECT_FALSE(gfx::HasExtension(info_->extensions(), "GL_EXT_sRGB"));
    EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_SRGB_EXT));
    EXPECT_FALSE(info_->validators()->texture_format.IsValid(
        GL_SRGB_ALPHA_EXT));
    EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
        GL_SRGB_EXT));
    EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
        GL_SRGB_ALPHA_EXT));
    EXPECT_FALSE(info_->validators()->render_buffer_format.IsValid(
        GL_SRGB8_ALPHA8_EXT));
    EXPECT_FALSE(info_->validators()->framebuffer_attachment_parameter.IsValid(
        GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT));
  }

  // Check a couple of random extensions that should not be there.
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(), "GL_OES_texture_npot"));
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(),
                                 "GL_EXT_texture_compression_dxt1"));
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(),
                                 "GL_CHROMIUM_texture_compression_dxt3"));
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(),
                                 "GL_CHROMIUM_texture_compression_dxt5"));
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_ANGLE_texture_usage"));
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(),
                                 "GL_OES_compressed_ETC1_RGB8_texture"));
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_AMD_compressed_ATC_texture"));
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(),
                                 "GL_IMG_texture_compression_pvrtc"));
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(),
                                 "GL_EXT_texture_compression_s3tc_srgb"));
  EXPECT_FALSE(info_->feature_flags().npot_ok);
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGB_S3TC_DXT1_EXT));
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGBA_S3TC_DXT1_EXT));
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGBA_S3TC_DXT3_EXT));
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGBA_S3TC_DXT5_EXT));
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_SRGB_S3TC_DXT1_EXT));
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT));
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT));
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT));
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_ETC1_RGB8_OES));
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_ATC_RGB_AMD));
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_ATC_RGBA_EXPLICIT_ALPHA_AMD));
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD));
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG));
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG));
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG));
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG));
  EXPECT_FALSE(info_->validators()->texture_parameter.IsValid(
      GL_TEXTURE_MAX_ANISOTROPY_EXT));
  EXPECT_FALSE(info_->validators()->g_l_state.IsValid(
      GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT));
  EXPECT_FALSE(info_->validators()->framebuffer_target.IsValid(
      GL_READ_FRAMEBUFFER_EXT));
  EXPECT_FALSE(info_->validators()->framebuffer_target.IsValid(
      GL_DRAW_FRAMEBUFFER_EXT));
  EXPECT_FALSE(info_->validators()->g_l_state.IsValid(
      GL_READ_FRAMEBUFFER_BINDING_EXT));
  EXPECT_FALSE(info_->validators()->render_buffer_parameter.IsValid(
      GL_MAX_SAMPLES_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
      GL_DEPTH_COMPONENT));
  EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_DEPTH_COMPONENT));
  EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_SHORT));
  EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_INT));
  EXPECT_FALSE(info_->validators()->render_buffer_format.IsValid(
      GL_DEPTH24_STENCIL8));
  EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
      GL_DEPTH_STENCIL));
  EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
      GL_RGBA32F));
  EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
      GL_RGB32F));
  EXPECT_FALSE(info_->validators()->texture_format.IsValid(
      GL_DEPTH_STENCIL));
  EXPECT_FALSE(info_->validators()->pixel_type.IsValid(
      GL_UNSIGNED_INT_24_8));
  EXPECT_FALSE(info_->validators()->render_buffer_format.IsValid(
      GL_DEPTH_COMPONENT24));
  EXPECT_FALSE(info_->validators()->texture_parameter.IsValid(
      GL_TEXTURE_USAGE_ANGLE));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_DEPTH_COMPONENT16));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_DEPTH_COMPONENT32_OES));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_DEPTH24_STENCIL8_OES));
  EXPECT_FALSE(info_->validators()->equation.IsValid(GL_MIN_EXT));
  EXPECT_FALSE(info_->validators()->equation.IsValid(GL_MAX_EXT));
  EXPECT_FALSE(info_->feature_flags().chromium_sync_query);
  EXPECT_FALSE(info_->feature_flags().chromium_image_ycbcr_422);
}

TEST_P(FeatureInfoTest, InitializeWithANGLE) {
  SetupInitExpectationsWithGLVersion("", kGLRendererStringANGLE, "");
  EXPECT_TRUE(info_->gl_version_info().is_angle);
}

TEST_P(FeatureInfoTest, InitializeWithANGLED3D9Ex) {
  SetupInitExpectationsWithGLVersion("", "ANGLE (foo bar Direct3D9Ex baz)", "");
  EXPECT_TRUE(info_->gl_version_info().is_angle);
  EXPECT_TRUE(info_->gl_version_info().is_d3d);
}

TEST_P(FeatureInfoTest, InitializeWithANGLED3D11) {
  SetupInitExpectationsWithGLVersion("", "ANGLE (foo bar Direct3D11 baz)", "");
  EXPECT_TRUE(info_->gl_version_info().is_angle);
  EXPECT_TRUE(info_->gl_version_info().is_d3d);
}

TEST_P(FeatureInfoTest, InitializeWithANGLEOpenGL) {
  SetupInitExpectationsWithGLVersion("", "ANGLE (foo bar OpenGL baz)", "");
  EXPECT_TRUE(info_->gl_version_info().is_angle);
  EXPECT_FALSE(info_->gl_version_info().is_d3d);
}

TEST_P(FeatureInfoTest, InitializeNPOTExtensionGLES) {
  SetupInitExpectations("GL_OES_texture_npot");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_OES_texture_npot"));
  EXPECT_TRUE(info_->feature_flags().npot_ok);
}

TEST_P(FeatureInfoTest, InitializeNPOTExtensionGL) {
  SetupInitExpectations("GL_ARB_texture_non_power_of_two");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_OES_texture_npot"));
  EXPECT_TRUE(info_->feature_flags().npot_ok);
}

TEST_P(FeatureInfoTest, InitializeDXTExtensionGLES2) {
  SetupInitExpectations("GL_EXT_texture_compression_dxt1");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_EXT_texture_compression_dxt1"));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGB_S3TC_DXT1_EXT));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGBA_S3TC_DXT1_EXT));
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGBA_S3TC_DXT3_EXT));
  EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGBA_S3TC_DXT5_EXT));
}

TEST_P(FeatureInfoTest, InitializeDXTExtensionGL) {
  SetupInitExpectations("GL_EXT_texture_compression_s3tc");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_EXT_texture_compression_dxt1"));
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_CHROMIUM_texture_compression_dxt3"));
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_CHROMIUM_texture_compression_dxt5"));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGB_S3TC_DXT1_EXT));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGBA_S3TC_DXT1_EXT));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGBA_S3TC_DXT3_EXT));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGBA_S3TC_DXT5_EXT));
}

TEST_P(FeatureInfoTest, InitializeEXT_texture_compression_s3tc_srgb) {
  SetupInitExpectationsWithGLVersion("GL_NV_sRGB_formats", "",
                                     "OpenGL ES 2.0");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_EXT_texture_compression_s3tc_srgb"));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_SRGB_S3TC_DXT1_EXT));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT));
}

TEST_P(FeatureInfoTest, InitializeEXT_texture_compression_s3tc_srgbGL) {
  SetupInitExpectations("GL_EXT_texture_sRGB GL_EXT_texture_compression_s3tc");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_EXT_texture_compression_s3tc_srgb"));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_SRGB_S3TC_DXT1_EXT));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT));
}

TEST_P(FeatureInfoTest, InitializeCHROMIUM_compressed_texture_etc) {
  SetupInitExpectationsWithGLVersion("", "",
                                     "OpenGL ES 3.0");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_CHROMIUM_compressed_texture_etc"));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_R11_EAC));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_SIGNED_R11_EAC));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGB8_ETC2));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_SRGB8_ETC2));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RG11_EAC));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_SIGNED_RG11_EAC));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGBA8_ETC2_EAC));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC));

  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_COMPRESSED_R11_EAC));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_COMPRESSED_SIGNED_R11_EAC));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_COMPRESSED_RGB8_ETC2));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_COMPRESSED_SRGB8_ETC2));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_COMPRESSED_RG11_EAC));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_COMPRESSED_SIGNED_RG11_EAC));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_COMPRESSED_RGBA8_ETC2_EAC));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC));
}

TEST_P(FeatureInfoTest, InitializeEXT_texture_format_BGRA8888GLES2) {
  SetupInitExpectationsWithGLVersion("GL_EXT_texture_format_BGRA8888", "",
                                     "OpenGL ES 2.0");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_format_BGRA8888"));
  EXPECT_TRUE(info_->validators()->texture_format.IsValid(
      GL_BGRA_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(
      GL_BGRA_EXT));

  // On GL ES, render buffer and read pixels functionality is unrelated to
  // GL_EXT_texture_format_BGRA8888, make sure we don't enable it.
  EXPECT_FALSE(info_->validators()->render_buffer_format.IsValid(
      GL_BGRA8_EXT));
  EXPECT_FALSE(info_->feature_flags().ext_render_buffer_format_bgra8888);
  EXPECT_FALSE(info_->validators()->read_pixel_format.IsValid(GL_BGRA8_EXT));
  EXPECT_FALSE(info_->feature_flags().ext_read_format_bgra);
}

TEST_P(FeatureInfoTest, InitializeEXT_texture_format_BGRA8888GL) {
  SetupInitExpectationsWithGLVersion("", "", "OpenGL 2.0");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_format_BGRA8888"));
  EXPECT_TRUE(info_->validators()->texture_format.IsValid(
      GL_BGRA_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(
      GL_BGRA_EXT));
}

TEST_P(FeatureInfoTest, InitializeEXT_texture_format_BGRA8888Apple) {
  SetupInitExpectationsWithGLVersion("GL_APPLE_texture_format_BGRA8888", "",
                                     "OpenGL ES 2.0");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_format_BGRA8888"));
  EXPECT_TRUE(info_->validators()->texture_format.IsValid(
      GL_BGRA_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(
      GL_BGRA_EXT));

  // On GL ES, render buffer and read pixels functionality is unrelated to
  // GL_APPLE_texture_format_BGRA8888, make sure we don't enable it.
  EXPECT_FALSE(info_->validators()->render_buffer_format.IsValid(
      GL_BGRA8_EXT));
  EXPECT_FALSE(info_->feature_flags().ext_render_buffer_format_bgra8888);
  EXPECT_FALSE(info_->validators()->read_pixel_format.IsValid(GL_BGRA8_EXT));
  EXPECT_FALSE(info_->feature_flags().ext_read_format_bgra);
}

TEST_P(FeatureInfoTest, InitializeGLES_no_EXT_texture_format_BGRA8888GL) {
  SetupInitExpectationsWithGLVersion("", "", "OpenGL ES 2.0");
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_format_BGRA8888"));
  EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_BGRA_EXT));
  EXPECT_FALSE(
      info_->validators()->texture_internal_format.IsValid(GL_BGRA_EXT));
}

TEST_P(FeatureInfoTest, InitializeGLES2EXT_read_format_bgra) {
  SetupInitExpectationsWithGLVersion(
      "GL_EXT_read_format_bgra", "", "OpenGL ES 2.0");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_read_format_bgra"));
  EXPECT_TRUE(info_->feature_flags().ext_read_format_bgra);
  EXPECT_TRUE(info_->validators()->read_pixel_format.IsValid(
      GL_BGRA_EXT));

  // On GL ES, texture and render buffer functionality is unrelated to
  // GL_EXT_read_format_bgra, make sure we don't enable it.
  EXPECT_FALSE(info_->validators()->render_buffer_format.IsValid(
      GL_BGRA8_EXT));
  EXPECT_FALSE(info_->feature_flags().ext_render_buffer_format_bgra8888);
  EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_BGRA_EXT));
  EXPECT_FALSE(
      info_->validators()->texture_internal_format.IsValid(GL_BGRA_EXT));
}

TEST_P(FeatureInfoTest, InitializeGLEXT_read_format_bgra) {
  SetupInitExpectationsWithGLVersion("", "", "OpenGL 2.0");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_read_format_bgra"));
  EXPECT_TRUE(info_->feature_flags().ext_read_format_bgra);
  EXPECT_TRUE(info_->validators()->read_pixel_format.IsValid(
      GL_BGRA_EXT));
}

TEST_P(FeatureInfoTest, InitializeGLES_no_EXT_read_format_bgra) {
  SetupInitExpectationsWithGLVersion("", "", "OpenGL ES 2.0");
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_read_format_bgra"));
  EXPECT_FALSE(info_->feature_flags().ext_read_format_bgra);
  EXPECT_FALSE(info_->validators()->read_pixel_format.IsValid(GL_BGRA_EXT));
}

TEST_P(FeatureInfoTest, InitializeEXT_sRGB) {
  SetupInitExpectations("GL_EXT_sRGB GL_OES_rgb8_rgba8");

  if (GetContextType() == CONTEXT_TYPE_OPENGLES3) {
    EXPECT_FALSE(gfx::HasExtension(info_->extensions(), "GL_EXT_sRGB"));
    EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_SRGB_EXT));
    EXPECT_FALSE(
        info_->validators()->texture_format.IsValid(GL_SRGB_ALPHA_EXT));
    EXPECT_FALSE(
        info_->validators()->texture_internal_format.IsValid(GL_SRGB_EXT));
    EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
        GL_SRGB_ALPHA_EXT));
    EXPECT_FALSE(
        info_->validators()->render_buffer_format.IsValid(GL_SRGB8_ALPHA8_EXT));
    EXPECT_FALSE(info_->validators()->framebuffer_attachment_parameter.IsValid(
        GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT));
  } else {
    EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_sRGB"));
    EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_SRGB_EXT));
    EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_SRGB_ALPHA_EXT));
    EXPECT_TRUE(
        info_->validators()->texture_internal_format.IsValid(GL_SRGB_EXT));
    EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(
        GL_SRGB_ALPHA_EXT));
    EXPECT_TRUE(
        info_->validators()->render_buffer_format.IsValid(GL_SRGB8_ALPHA8_EXT));
    EXPECT_TRUE(info_->validators()->framebuffer_attachment_parameter.IsValid(
        GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT));
  }
}

TEST_P(FeatureInfoTest, InitializeGLES2EXT_texture_storage) {
  SetupInitExpectationsWithGLVersion(
      "GL_EXT_texture_storage", "", "OpenGL ES 2.0");
  EXPECT_TRUE(info_->feature_flags().ext_texture_storage);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
  EXPECT_TRUE(info_->validators()->texture_parameter.IsValid(
      GL_TEXTURE_IMMUTABLE_FORMAT_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_BGRA8_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_RGBA32F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_RGB32F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_ALPHA32F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_LUMINANCE32F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_LUMINANCE_ALPHA32F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_RGBA16F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_RGB16F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_ALPHA16F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_LUMINANCE16F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_LUMINANCE_ALPHA16F_EXT));
}

TEST_P(FeatureInfoTest, InitializeEXT_texture_storage) {
  SetupInitExpectations("GL_EXT_texture_storage");
  EXPECT_TRUE(info_->feature_flags().ext_texture_storage);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
  EXPECT_TRUE(info_->validators()->texture_parameter.IsValid(
      GL_TEXTURE_IMMUTABLE_FORMAT_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_BGRA8_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_RGBA32F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_RGB32F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_ALPHA32F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_LUMINANCE32F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_LUMINANCE_ALPHA32F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_RGBA16F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_RGB16F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_ALPHA16F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_LUMINANCE16F_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_LUMINANCE_ALPHA16F_EXT));
}

TEST_P(FeatureInfoTest, InitializeARB_texture_storage) {
  SetupInitExpectations("GL_ARB_texture_storage");
  EXPECT_TRUE(info_->feature_flags().ext_texture_storage);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
  EXPECT_TRUE(info_->validators()->texture_parameter.IsValid(
      GL_TEXTURE_IMMUTABLE_FORMAT_EXT));
}

TEST_P(FeatureInfoTest, InitializeEXT_texture_storage_BGRA) {
  SetupInitExpectationsWithGLVersion("GL_EXT_texture_storage", "",
                                     "OpenGL 2.0");
  EXPECT_TRUE(info_->feature_flags().ext_texture_storage);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_BGRA8_EXT));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_format_BGRA8888"));
}

TEST_P(FeatureInfoTest, InitializeARB_texture_storage_BGRA) {
  SetupInitExpectationsWithGLVersion("GL_ARB_texture_storage", "",
                                     "OpenGL 2.0");
  EXPECT_TRUE(info_->feature_flags().ext_texture_storage);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_BGRA8_EXT));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_format_BGRA8888"));
}

TEST_P(FeatureInfoTest, InitializeEXT_texture_storage_BGRA8888) {
  SetupInitExpectations(
      "GL_EXT_texture_storage GL_EXT_texture_format_BGRA8888");
  EXPECT_TRUE(info_->feature_flags().ext_texture_storage);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_format_BGRA8888"));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_BGRA8_EXT));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_format_BGRA8888"));
}

TEST_P(FeatureInfoTest, InitializeEXT_texture_storage_float) {
  SetupInitExpectations("GL_EXT_texture_storage GL_OES_texture_float");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_OES_texture_float"));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_RGBA32F_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_RGB32F_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_ALPHA32F_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_LUMINANCE32F_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_LUMINANCE_ALPHA32F_EXT));
}

TEST_P(FeatureInfoTest, InitializeEXT_texture_storage_half_float) {
  SetupInitExpectations("GL_EXT_texture_storage GL_OES_texture_half_float");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_OES_texture_half_float"));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_RGBA16F_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_RGB16F_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_ALPHA16F_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_LUMINANCE16F_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_LUMINANCE_ALPHA16F_EXT));
}

// Check that desktop (unlike ES, handled below) always supports BGRA render
// buffers.
TEST_P(FeatureInfoTest, InitializeGL_renderbuffer_format_BGRA8888) {
  SetupInitExpectationsWithGLVersion("", "", "OpenGL 2.0");

  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_CHROMIUM_renderbuffer_format_BGRA8888"));
  EXPECT_TRUE(info_->feature_flags().ext_render_buffer_format_bgra8888);
  EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(GL_BGRA8_EXT));
}

// Check how to handle ES, texture_storage and BGRA combination; 10 tests.

// 1- ES2 + GL_EXT_texture_storage -> GL_EXT_texture_storage (and no
// GL_EXT_texture_format_BGRA8888 - we don't claim to handle GL_BGRA8 in
// glTexStorage2DEXT)
TEST_P(FeatureInfoTest, InitializeGLES2_texture_storage) {
  SetupInitExpectationsWithGLVersion(
      "GL_EXT_texture_storage", "", "OpenGL ES 2.0");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_format_BGRA8888"));
}

// 2- ES2 + GL_EXT_texture_storage + (GL_EXT_texture_format_BGRA8888 or
// GL_APPLE_texture_format_bgra8888)
TEST_P(FeatureInfoTest, InitializeGLES2_texture_storage_BGRA) {
  SetupInitExpectationsWithGLVersion(
      "GL_EXT_texture_storage GL_EXT_texture_format_BGRA8888",
      "",
      "OpenGL ES 2.0");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_format_BGRA8888"));
}

// 3- ES2 + GL_EXT_texture_format_BGRA8888 or GL_APPLE_texture_format_bgra8888
TEST_P(FeatureInfoTest, InitializeGLES2_texture_format_BGRA) {
  SetupInitExpectationsWithGLVersion(
      "GL_EXT_texture_format_BGRA8888", "", "OpenGL ES 2.0");
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_format_BGRA8888"));
}

// 4- ES2 (neither GL_EXT_texture_storage nor GL_EXT_texture_format_BGRA8888) ->
// nothing
TEST_P(FeatureInfoTest, InitializeGLES2_neither_texture_storage_nor_BGRA) {
  SetupInitExpectationsWithGLVersion("", "", "OpenGL ES 2.0");
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_format_BGRA8888"));
}

// 5- ES3 + GL_EXT_texture_format_BGRA8888
// If creating a GLES2 context, expose GL_EXT_texture_format_BGRA8888
// If creating a GLES3 context, expose GL_EXT_texture_storage
// (we can't expose both at the same time because we fail the GL_BGRA8
// requirement)
TEST_P(FeatureInfoTest, InitializeGLES3_texture_storage_EXT_BGRA) {
  SetupInitExpectationsWithGLVersion(
      "GL_EXT_texture_format_BGRA8888", "", "OpenGL ES 3.0");
  if (GetContextType() == CONTEXT_TYPE_OPENGLES3) {
    EXPECT_TRUE(
        gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
    EXPECT_FALSE(gfx::HasExtension(info_->extensions(),
                                   "GL_EXT_texture_format_BGRA8888"));
  } else {
    EXPECT_FALSE(
        gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
    EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                  "GL_EXT_texture_format_BGRA8888"));
  }
}

// 6- ES3 + GL_APPLE_texture_format_bgra8888 -> GL_EXT_texture_storage +
// GL_EXT_texture_format_BGRA8888 (driver promises to handle GL_BGRA8 by
// exposing GL_APPLE_texture_format_bgra8888)
TEST_P(FeatureInfoTest, InitializeGLES3_texture_storage_APPLE_BGRA) {
  SetupInitExpectationsWithGLVersion(
      "GL_APPLE_texture_format_BGRA8888", "", "OpenGL ES 3.0");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_format_BGRA8888"));
}

// 7- ES3 + GL_EXT_texture_storage + GL_EXT_texture_format_BGRA8888 ->
// GL_EXT_texture_storage + GL_EXT_texture_format_BGRA8888  (driver promises to
// handle GL_BGRA8 by exposing GL_EXT_texture_storage)
TEST_P(FeatureInfoTest, InitializeGLES3_EXT_texture_storage_EXT_BGRA) {
  SetupInitExpectationsWithGLVersion(
      "GL_EXT_texture_storage GL_EXT_texture_format_BGRA8888",
      "",
      "OpenGL ES 3.0");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_format_BGRA8888"));
}

// 8- ES3 + none of the above -> GL_EXT_texture_storage (and no
// GL_EXT_texture_format_BGRA8888 - we don't claim to handle GL_BGRA8)
TEST_P(FeatureInfoTest, InitializeGLES3_texture_storage) {
  SetupInitExpectationsWithGLVersion("", "", "OpenGL ES 3.0");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_texture_storage"));
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_texture_format_BGRA8888"));
}

// 9- ANGLE will add the GL_CHROMIUM_renderbuffer_format_BGRA8888 extension and
// the GL_BGRA8_EXT render buffer format.
TEST_P(FeatureInfoTest, InitializeWithANGLE_BGRA8) {
  SetupInitExpectationsWithGLVersion("", kGLRendererStringANGLE, "");
  EXPECT_TRUE(info_->gl_version_info().is_angle);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_CHROMIUM_renderbuffer_format_BGRA8888"));
  EXPECT_TRUE(info_->feature_flags().ext_render_buffer_format_bgra8888);
  EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(GL_BGRA8_EXT));
}

// 10- vanilla opengl es means no GL_CHROMIUM_renderbuffer_format_BGRA8888
TEST_P(FeatureInfoTest,
       InitializeGLES2_no_CHROMIUM_renderbuffer_format_BGRA8888) {
  SetupInitExpectationsWithGLVersion("", "", "OpenGL ES 2.0");
  EXPECT_FALSE(info_->feature_flags().ext_render_buffer_format_bgra8888);
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(),
                                 "GL_CHROMIUM_renderbuffer_format_BGRA8888"));
}

TEST_P(FeatureInfoTest, InitializeARB_texture_float) {
  DisallowedFeatures disallowed_features;
  disallowed_features.chromium_color_buffer_float_rgb = true;
  disallowed_features.chromium_color_buffer_float_rgba = true;
  SetupInitExpectationsWithGLVersionAndDisallowedFeatures(
      "GL_ARB_texture_float", "", "3.0", disallowed_features);
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(),
                                 "GL_CHROMIUM_color_buffer_float_rgb"));
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(),
                                 "GL_CHROMIUM_color_buffer_float_rgba"));
  EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
      GL_RGBA32F));
  EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
      GL_RGB32F));

  info_->EnableCHROMIUMColorBufferFloatRGBA();
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(),
                                 "GL_CHROMIUM_color_buffer_float_rgb"));
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_CHROMIUM_color_buffer_float_rgba"));
  EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(
      GL_RGBA32F));
  EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
      GL_RGB32F));

  info_->EnableCHROMIUMColorBufferFloatRGB();
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_CHROMIUM_color_buffer_float_rgb"));
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_CHROMIUM_color_buffer_float_rgba"));
  EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(
      GL_RGBA32F));
  EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(
      GL_RGB32F));
}

TEST_P(FeatureInfoTest, Initialize_texture_floatGLES3) {
  SetupInitExpectationsWithGLVersion("", "", "OpenGL ES 3.0");
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(), "GL_OES_texture_float"));
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_OES_texture_half_float"));
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_OES_texture_float_linear"));
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(),
                                 "GL_OES_texture_half_float_linear"));
}

TEST_P(FeatureInfoTest, Initialize_sRGBGLES3) {
  SetupInitExpectationsWithGLVersion("", "", "OpenGL ES 3.0");
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(), "GL_EXT_sRGB"));
  EXPECT_FALSE(info_->validators()->texture_format.IsValid(
      GL_SRGB_EXT));
  EXPECT_FALSE(info_->validators()->texture_format.IsValid(
      GL_SRGB_ALPHA_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
      GL_SRGB_EXT));
  EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
      GL_SRGB_ALPHA_EXT));
  EXPECT_FALSE(info_->validators()->render_buffer_format.IsValid(
      GL_SRGB8_ALPHA8_EXT));
  EXPECT_FALSE(info_->validators()->framebuffer_attachment_parameter.IsValid(
      GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT));
}

TEST_P(FeatureInfoTest, InitializeOES_texture_floatGLES2) {
  SetupInitExpectations("GL_OES_texture_float");
  EXPECT_FALSE(info_->feature_flags().enable_texture_float_linear);
  EXPECT_FALSE(info_->feature_flags().enable_texture_half_float_linear);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_OES_texture_float"));
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_OES_texture_half_float"));
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_OES_texture_float_linear"));
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(),
                                 "GL_OES_texture_half_float_linear"));
  EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_FLOAT));
  EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_HALF_FLOAT_OES));
}

TEST_P(FeatureInfoTest, InitializeOES_texture_float_linearGLES2) {
  SetupInitExpectations("GL_OES_texture_float GL_OES_texture_float_linear");
  EXPECT_TRUE(info_->feature_flags().enable_texture_float_linear);
  EXPECT_FALSE(info_->feature_flags().enable_texture_half_float_linear);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_OES_texture_float"));
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_OES_texture_half_float"));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_OES_texture_float_linear"));
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(),
                                 "GL_OES_texture_half_float_linear"));
  EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_FLOAT));
  EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_HALF_FLOAT_OES));
}

TEST_P(FeatureInfoTest, InitializeOES_texture_half_floatGLES2) {
  SetupInitExpectations("GL_OES_texture_half_float");
  EXPECT_FALSE(info_->feature_flags().enable_texture_float_linear);
  EXPECT_FALSE(info_->feature_flags().enable_texture_half_float_linear);
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(), "GL_OES_texture_float"));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_OES_texture_half_float"));
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_OES_texture_float_linear"));
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(),
                                 "GL_OES_texture_half_float_linear"));
  EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_FLOAT));
  EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_HALF_FLOAT_OES));
}

TEST_P(FeatureInfoTest, InitializeOES_texture_half_float_linearGLES2) {
  SetupInitExpectations(
      "GL_OES_texture_half_float GL_OES_texture_half_float_linear");
  EXPECT_FALSE(info_->feature_flags().enable_texture_float_linear);
  EXPECT_TRUE(info_->feature_flags().enable_texture_half_float_linear);
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(), "GL_OES_texture_float"));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_OES_texture_half_float"));
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_OES_texture_float_linear"));
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_OES_texture_half_float_linear"));
  EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_FLOAT));
  EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_HALF_FLOAT_OES));
}

TEST_P(FeatureInfoTest, InitializeEXT_framebuffer_multisample) {
  SetupInitExpectations(
      "GL_EXT_framebuffer_blit GL_EXT_framebuffer_multisample");
  EXPECT_TRUE(info_->feature_flags().chromium_framebuffer_multisample);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_CHROMIUM_framebuffer_multisample"));
  EXPECT_TRUE(
      info_->validators()->framebuffer_target.IsValid(GL_READ_FRAMEBUFFER_EXT));
  EXPECT_TRUE(
      info_->validators()->framebuffer_target.IsValid(GL_DRAW_FRAMEBUFFER_EXT));
  EXPECT_TRUE(
      info_->validators()->g_l_state.IsValid(GL_READ_FRAMEBUFFER_BINDING_EXT));
  EXPECT_TRUE(info_->validators()->g_l_state.IsValid(GL_MAX_SAMPLES_EXT));
  EXPECT_TRUE(info_->validators()->render_buffer_parameter.IsValid(
      GL_RENDERBUFFER_SAMPLES_EXT));
}

TEST_P(FeatureInfoTest, InitializeARB_framebuffer_multisample) {
  SetupInitExpectations("GL_ARB_framebuffer_object");
  EXPECT_TRUE(info_->feature_flags().chromium_framebuffer_multisample);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_CHROMIUM_framebuffer_multisample"));
  EXPECT_TRUE(info_->validators()->framebuffer_target.IsValid(
      GL_READ_FRAMEBUFFER_EXT));
  EXPECT_TRUE(info_->validators()->framebuffer_target.IsValid(
      GL_DRAW_FRAMEBUFFER_EXT));
  EXPECT_TRUE(info_->validators()->g_l_state.IsValid(
      GL_READ_FRAMEBUFFER_BINDING_EXT));
  EXPECT_TRUE(info_->validators()->g_l_state.IsValid(
      GL_MAX_SAMPLES_EXT));
  EXPECT_TRUE(info_->validators()->render_buffer_parameter.IsValid(
      GL_RENDERBUFFER_SAMPLES_EXT));
}

TEST_P(FeatureInfoTest, InitializeANGLE_framebuffer_multisample) {
  SetupInitExpectationsWithGLVersion(
      "GL_ANGLE_framebuffer_multisample", kGLRendererStringANGLE, "");
  EXPECT_TRUE(info_->feature_flags().chromium_framebuffer_multisample);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_CHROMIUM_framebuffer_multisample"));
  EXPECT_TRUE(info_->validators()->framebuffer_target.IsValid(
      GL_READ_FRAMEBUFFER_EXT));
  EXPECT_TRUE(info_->validators()->framebuffer_target.IsValid(
      GL_DRAW_FRAMEBUFFER_EXT));
  EXPECT_TRUE(info_->validators()->g_l_state.IsValid(
      GL_READ_FRAMEBUFFER_BINDING_EXT));
  EXPECT_TRUE(info_->validators()->g_l_state.IsValid(
      GL_MAX_SAMPLES_EXT));
  EXPECT_TRUE(info_->validators()->render_buffer_parameter.IsValid(
      GL_RENDERBUFFER_SAMPLES_EXT));
}

// We don't allow ANGLE_framebuffer_multisample on non-ANGLE implementations,
// because we wouldn't be choosing the right driver entry point and because the
// extension was falsely advertised on some Android devices (crbug.com/165736).
TEST_P(FeatureInfoTest, InitializeANGLE_framebuffer_multisampleWithoutANGLE) {
  SetupInitExpectations("GL_ANGLE_framebuffer_multisample");
  EXPECT_FALSE(info_->feature_flags().chromium_framebuffer_multisample);
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(),
                                 "GL_CHROMIUM_framebuffer_multisample"));
  EXPECT_FALSE(info_->validators()->framebuffer_target.IsValid(
      GL_READ_FRAMEBUFFER_EXT));
  EXPECT_FALSE(info_->validators()->framebuffer_target.IsValid(
      GL_DRAW_FRAMEBUFFER_EXT));
  EXPECT_FALSE(info_->validators()->g_l_state.IsValid(
      GL_READ_FRAMEBUFFER_BINDING_EXT));
  EXPECT_FALSE(info_->validators()->g_l_state.IsValid(
      GL_MAX_SAMPLES_EXT));
  EXPECT_FALSE(info_->validators()->render_buffer_parameter.IsValid(
      GL_RENDERBUFFER_SAMPLES_EXT));
}

TEST_P(FeatureInfoTest, InitializeEXT_multisampled_render_to_texture) {
  SetupInitExpectations("GL_EXT_multisampled_render_to_texture");
  EXPECT_TRUE(info_->feature_flags(
      ).multisampled_render_to_texture);
  EXPECT_FALSE(info_->feature_flags(
      ).use_img_for_multisampled_render_to_texture);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_EXT_multisampled_render_to_texture"));
  EXPECT_TRUE(info_->validators()->g_l_state.IsValid(
      GL_MAX_SAMPLES_EXT));
  EXPECT_TRUE(info_->validators()->render_buffer_parameter.IsValid(
      GL_RENDERBUFFER_SAMPLES_EXT));
  EXPECT_TRUE(info_->validators()->framebuffer_attachment_parameter.IsValid(
      GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT));
}

TEST_P(FeatureInfoTest, InitializeIMG_multisampled_render_to_texture) {
  SetupInitExpectations("GL_IMG_multisampled_render_to_texture");
  EXPECT_TRUE(info_->feature_flags(
      ).multisampled_render_to_texture);
  EXPECT_TRUE(info_->feature_flags(
      ).use_img_for_multisampled_render_to_texture);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_EXT_multisampled_render_to_texture"));
  EXPECT_TRUE(info_->validators()->g_l_state.IsValid(
      GL_MAX_SAMPLES_EXT));
  EXPECT_TRUE(info_->validators()->render_buffer_parameter.IsValid(
      GL_RENDERBUFFER_SAMPLES_EXT));
  EXPECT_TRUE(info_->validators()->framebuffer_attachment_parameter.IsValid(
      GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT));
}

TEST_P(FeatureInfoTest, InitializeEXT_texture_filter_anisotropic) {
  SetupInitExpectations("GL_EXT_texture_filter_anisotropic");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_EXT_texture_filter_anisotropic"));
  EXPECT_TRUE(info_->validators()->texture_parameter.IsValid(
      GL_TEXTURE_MAX_ANISOTROPY_EXT));
  EXPECT_TRUE(info_->validators()->g_l_state.IsValid(
      GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT));
}

TEST_P(FeatureInfoTest, InitializeEXT_ARB_depth_texture) {
  SetupInitExpectations("GL_ARB_depth_texture");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_GOOGLE_depth_texture"));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_CHROMIUM_depth_texture"));
  EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(
      GL_DEPTH_COMPONENT));
  EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_DEPTH_COMPONENT));
  EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_DEPTH_STENCIL));
  EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_SHORT));
  EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_INT));
}

TEST_P(FeatureInfoTest, InitializeOES_ARB_depth_texture) {
  SetupInitExpectations("GL_OES_depth_texture");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_GOOGLE_depth_texture"));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_CHROMIUM_depth_texture"));
  EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(
      GL_DEPTH_COMPONENT));
  EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_DEPTH_COMPONENT));
  EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_DEPTH_STENCIL));
  EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_SHORT));
  EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_INT));
}

TEST_P(FeatureInfoTest, InitializeANGLE_depth_texture) {
  SetupInitExpectations("GL_ANGLE_depth_texture");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_GOOGLE_depth_texture"));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_CHROMIUM_depth_texture"));
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_ANGLE_depth_texture"));
  EXPECT_TRUE(info_->feature_flags().angle_depth_texture);
  EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(
      GL_DEPTH_COMPONENT));
  EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_DEPTH_COMPONENT));
  EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_DEPTH_STENCIL));
  EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_SHORT));
  EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_INT));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_DEPTH_COMPONENT16));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_DEPTH_COMPONENT32_OES));
  EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid(
      GL_DEPTH24_STENCIL8_OES));
}

TEST_P(FeatureInfoTest, InitializeEXT_packed_depth_stencil) {
  SetupInitExpectations("GL_EXT_packed_depth_stencil");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_OES_packed_depth_stencil"));
  EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(
      GL_DEPTH24_STENCIL8));
  EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
      GL_DEPTH_COMPONENT));
  EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_DEPTH_COMPONENT));
  EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_SHORT));
  EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_INT));
}

TEST_P(FeatureInfoTest, InitializeOES_packed_depth_stencil) {
  SetupInitExpectations("GL_OES_packed_depth_stencil");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_OES_packed_depth_stencil"));
  EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(
      GL_DEPTH24_STENCIL8));
  EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
      GL_DEPTH_COMPONENT));
  EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_DEPTH_COMPONENT));
  EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_SHORT));
  EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_INT));
}

TEST_P(FeatureInfoTest,
       InitializeOES_packed_depth_stencil_and_GL_ARB_depth_texture) {
  SetupInitExpectations("GL_OES_packed_depth_stencil GL_ARB_depth_texture");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_OES_packed_depth_stencil"));
  EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(
      GL_DEPTH24_STENCIL8));
  EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(
      GL_DEPTH_STENCIL));
  EXPECT_TRUE(info_->validators()->texture_format.IsValid(
      GL_DEPTH_STENCIL));
  EXPECT_TRUE(info_->validators()->pixel_type.IsValid(
      GL_UNSIGNED_INT_24_8));
}

TEST_P(FeatureInfoTest, InitializeOES_depth24) {
  SetupInitExpectations("GL_OES_depth24");
  EXPECT_TRUE(info_->feature_flags().oes_depth24);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_OES_depth24"));
  EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(
      GL_DEPTH_COMPONENT24));
}

TEST_P(FeatureInfoTest, InitializeOES_standard_derivatives) {
  SetupInitExpectations("GL_OES_standard_derivatives");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_OES_standard_derivatives"));
  EXPECT_TRUE(info_->feature_flags().oes_standard_derivatives);
  EXPECT_TRUE(info_->validators()->hint_target.IsValid(
      GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES));
  EXPECT_TRUE(info_->validators()->g_l_state.IsValid(
      GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES));
}

TEST_P(FeatureInfoTest, InitializeOES_rgb8_rgba8) {
  SetupInitExpectations("GL_OES_rgb8_rgba8");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_OES_rgb8_rgba8"));
  EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(
      GL_RGB8_OES));
  EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(
      GL_RGBA8_OES));
}

TEST_P(FeatureInfoTest, InitializeOES_EGL_image_external) {
  SetupInitExpectations("GL_OES_EGL_image_external");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_OES_EGL_image_external"));
  EXPECT_TRUE(info_->feature_flags().oes_egl_image_external);
  EXPECT_TRUE(info_->validators()->texture_bind_target.IsValid(
      GL_TEXTURE_EXTERNAL_OES));
  EXPECT_TRUE(info_->validators()->get_tex_param_target.IsValid(
      GL_TEXTURE_EXTERNAL_OES));
  EXPECT_TRUE(info_->validators()->texture_parameter.IsValid(
      GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES));
  EXPECT_TRUE(info_->validators()->g_l_state.IsValid(
      GL_TEXTURE_BINDING_EXTERNAL_OES));
}

TEST_P(FeatureInfoTest, InitializeNV_EGL_stream_consumer_external) {
  SetupInitExpectations("GL_NV_EGL_stream_consumer_external");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_NV_EGL_stream_consumer_external"));
  EXPECT_TRUE(info_->feature_flags().nv_egl_stream_consumer_external);
  EXPECT_TRUE(info_->validators()->texture_bind_target.IsValid(
      GL_TEXTURE_EXTERNAL_OES));
  EXPECT_TRUE(info_->validators()->get_tex_param_target.IsValid(
      GL_TEXTURE_EXTERNAL_OES));
  EXPECT_TRUE(info_->validators()->texture_parameter.IsValid(
      GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES));
  EXPECT_TRUE(
      info_->validators()->g_l_state.IsValid(GL_TEXTURE_BINDING_EXTERNAL_OES));
}

TEST_P(FeatureInfoTest, InitializeOES_compressed_ETC1_RGB8_texture) {
  SetupInitExpectations("GL_OES_compressed_ETC1_RGB8_texture");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_OES_compressed_ETC1_RGB8_texture"));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_ETC1_RGB8_OES));
  EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid(
      GL_ETC1_RGB8_OES));
}

TEST_P(FeatureInfoTest, InitializeAMD_compressed_ATC_texture) {
  SetupInitExpectations("GL_AMD_compressed_ATC_texture");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_AMD_compressed_ATC_texture"));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_ATC_RGB_AMD));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_ATC_RGBA_EXPLICIT_ALPHA_AMD));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD));
}

TEST_P(FeatureInfoTest, InitializeIMG_texture_compression_pvrtc) {
  SetupInitExpectations("GL_IMG_texture_compression_pvrtc");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_IMG_texture_compression_pvrtc"));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG));
  EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
      GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG));
}

TEST_P(FeatureInfoTest, InitializeEXT_occlusion_query_boolean) {
  SetupInitExpectations("GL_EXT_occlusion_query_boolean");
  if (GetContextType() == CONTEXT_TYPE_OPENGLES2) {
    EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                  "GL_EXT_occlusion_query_boolean"));
  }
  EXPECT_TRUE(info_->feature_flags().occlusion_query_boolean);
  EXPECT_FALSE(info_->feature_flags(
      ).use_arb_occlusion_query2_for_occlusion_query_boolean);
  EXPECT_FALSE(info_->feature_flags(
      ).use_arb_occlusion_query_for_occlusion_query_boolean);
}

TEST_P(FeatureInfoTest, InitializeARB_occlusion_query) {
  SetupInitExpectations("GL_ARB_occlusion_query");
  if (GetContextType() == CONTEXT_TYPE_OPENGLES2) {
    EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                  "GL_EXT_occlusion_query_boolean"));
  }
  EXPECT_TRUE(info_->feature_flags().occlusion_query_boolean);
  EXPECT_FALSE(info_->feature_flags(
      ).use_arb_occlusion_query2_for_occlusion_query_boolean);
  EXPECT_TRUE(info_->feature_flags(
      ).use_arb_occlusion_query_for_occlusion_query_boolean);
}

TEST_P(FeatureInfoTest, InitializeARB_occlusion_query2) {
  SetupInitExpectations("GL_ARB_occlusion_query2 GL_ARB_occlusion_query2");
  if (GetContextType() == CONTEXT_TYPE_OPENGLES2) {
    EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                  "GL_EXT_occlusion_query_boolean"));
  }
  EXPECT_TRUE(info_->feature_flags().occlusion_query_boolean);
  EXPECT_TRUE(info_->feature_flags(
      ).use_arb_occlusion_query2_for_occlusion_query_boolean);
  EXPECT_FALSE(info_->feature_flags(
      ).use_arb_occlusion_query_for_occlusion_query_boolean);
}

TEST_P(FeatureInfoTest, InitializeGLES3_occlusion_query_boolean) {
  SetupInitExpectationsWithGLVersion("", "", "OpenGL ES 3.0");
  if (GetContextType() == CONTEXT_TYPE_OPENGLES2) {
    EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                  "GL_EXT_occlusion_query_boolean"));
  }
  EXPECT_TRUE(info_->feature_flags().occlusion_query_boolean);
}

TEST_P(FeatureInfoTest, InitializeGL33_occlusion_query2) {
  SetupInitExpectationsWithGLVersion("", "", "3.3");
  if (GetContextType() == CONTEXT_TYPE_OPENGLES2) {
    EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                  "GL_EXT_occlusion_query_boolean"));
  }
  EXPECT_TRUE(info_->feature_flags().occlusion_query_boolean);
  EXPECT_TRUE(info_->feature_flags(
      ).use_arb_occlusion_query2_for_occlusion_query_boolean);
}

TEST_P(FeatureInfoTest, InitializeGL43_occlusion_query2) {
  SetupInitExpectationsWithGLVersion("", "", "4.3");
  if (GetContextType() == CONTEXT_TYPE_OPENGLES2) {
    EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                  "GL_EXT_occlusion_query_boolean"));
  }
  EXPECT_TRUE(info_->feature_flags().occlusion_query_boolean);
  EXPECT_FALSE(info_->feature_flags(
      ).use_arb_occlusion_query2_for_occlusion_query_boolean);
}

TEST_P(FeatureInfoTest, InitializeOES_vertex_array_object) {
  SetupInitExpectations("GL_OES_vertex_array_object");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_OES_vertex_array_object"));
  EXPECT_TRUE(info_->feature_flags().native_vertex_array_object);
}

TEST_P(FeatureInfoTest, InitializeARB_vertex_array_object) {
  SetupInitExpectations("GL_ARB_vertex_array_object");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_OES_vertex_array_object"));
  EXPECT_TRUE(info_->feature_flags().native_vertex_array_object);
}

TEST_P(FeatureInfoTest, InitializeAPPLE_vertex_array_object) {
  SetupInitExpectations("GL_APPLE_vertex_array_object");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_OES_vertex_array_object"));
  EXPECT_TRUE(info_->feature_flags().native_vertex_array_object);
}

TEST_P(FeatureInfoTest, InitializeNo_vertex_array_object) {
  SetupInitExpectations("");
  // Even if the native extensions are not available the implementation
  // may still emulate the GL_OES_vertex_array_object functionality. In this
  // scenario native_vertex_array_object must be false.
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_OES_vertex_array_object"));
  EXPECT_FALSE(info_->feature_flags().native_vertex_array_object);
}

TEST_P(FeatureInfoTest, InitializeOES_element_index_uint) {
  SetupInitExpectations("GL_OES_element_index_uint");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_OES_element_index_uint"));
  EXPECT_TRUE(info_->validators()->index_type.IsValid(GL_UNSIGNED_INT));
}

TEST_P(FeatureInfoTest, InitializeVAOsWithClientSideArrays) {
  gpu::GpuDriverBugWorkarounds workarounds;
  workarounds.use_client_side_arrays_for_stream_buffers = true;
  SetupInitExpectationsWithWorkarounds("GL_OES_vertex_array_object",
                                       workarounds);
  if (GetContextType() == CONTEXT_TYPE_OPENGLES2) {
    EXPECT_TRUE(info_->workarounds().use_client_side_arrays_for_stream_buffers);
    EXPECT_FALSE(info_->feature_flags().native_vertex_array_object);
  } else {  // CONTEXT_TYPE_OPENGLES3
    // We only turn on use_client_side_arrays_for_stream_buffers on ES2
    // contexts. See https://crbug.com/826509.
    EXPECT_FALSE(
        info_->workarounds().use_client_side_arrays_for_stream_buffers);
    EXPECT_TRUE(info_->feature_flags().native_vertex_array_object);
  }
}

TEST_P(FeatureInfoTest, InitializeEXT_blend_minmax) {
  SetupInitExpectations("GL_EXT_blend_minmax");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_blend_minmax"));
  EXPECT_TRUE(info_->validators()->equation.IsValid(GL_MIN_EXT));
  EXPECT_TRUE(info_->validators()->equation.IsValid(GL_MAX_EXT));
}

TEST_P(FeatureInfoTest, InitializeEXT_frag_depth) {
  SetupInitExpectations("GL_EXT_frag_depth");
  EXPECT_TRUE(info_->feature_flags().ext_frag_depth);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_EXT_frag_depth"));
}

TEST_P(FeatureInfoTest, InitializeEXT_shader_texture_lod) {
  SetupInitExpectations("GL_EXT_shader_texture_lod");
  EXPECT_TRUE(info_->feature_flags().ext_shader_texture_lod);
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_shader_texture_lod"));
}

TEST_P(FeatureInfoTest, InitializeEXT_discard_framebuffer) {
  SetupInitExpectations("GL_EXT_discard_framebuffer");
  EXPECT_TRUE(info_->feature_flags().ext_discard_framebuffer);
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_discard_framebuffer"));
}

TEST_P(FeatureInfoTest, InitializeSamplersWithARBSamplerObjects) {
  SetupInitExpectationsWithGLVersion(
      "GL_ARB_sampler_objects", "", "3.0");
  EXPECT_TRUE(info_->feature_flags().enable_samplers);
}

TEST_P(FeatureInfoTest, InitializeWithES3) {
  SetupInitExpectationsWithGLVersion("", "", "OpenGL ES 3.0");
  EXPECT_TRUE(info_->feature_flags().chromium_framebuffer_multisample);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_CHROMIUM_framebuffer_multisample"));
  EXPECT_TRUE(info_->feature_flags().use_async_readpixels);
  EXPECT_TRUE(info_->feature_flags().oes_standard_derivatives);
  EXPECT_TRUE(info_->feature_flags().oes_depth24);
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_GOOGLE_depth_texture"));
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_CHROMIUM_depth_texture"));
  EXPECT_FALSE(
      info_->validators()->texture_internal_format.IsValid(GL_DEPTH_COMPONENT));
  EXPECT_FALSE(
      info_->validators()->texture_internal_format.IsValid(GL_DEPTH_STENCIL));
  EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_DEPTH_COMPONENT));
  EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_DEPTH_STENCIL));
  EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_SHORT));
  EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_INT));
  EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_INT_24_8));
  EXPECT_TRUE(info_->feature_flags().packed_depth24_stencil8);
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(), "GL_OES_depth24"));
  EXPECT_TRUE(
      info_->validators()->render_buffer_format.IsValid(GL_DEPTH_COMPONENT24));
  EXPECT_TRUE(
      info_->validators()->render_buffer_format.IsValid(GL_DEPTH24_STENCIL8));
  EXPECT_FALSE(
      info_->validators()->texture_internal_format.IsValid(GL_DEPTH_STENCIL));
  EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_DEPTH_STENCIL));
  EXPECT_TRUE(info_->feature_flags().npot_ok);
  EXPECT_TRUE(info_->feature_flags().native_vertex_array_object);
  EXPECT_TRUE(info_->feature_flags().enable_samplers);
  EXPECT_TRUE(info_->feature_flags().map_buffer_range);
  EXPECT_TRUE(info_->feature_flags().ext_discard_framebuffer);
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_EXT_discard_framebuffer"));
  EXPECT_TRUE(info_->feature_flags().chromium_sync_query);
  EXPECT_TRUE(gl::GLFence::IsSupported());
}

TEST_P(FeatureInfoTest, InitializeWithES3AndDepthTexture) {
  SetupInitExpectationsWithGLVersion(
      "GL_ANGLE_depth_texture", "", "OpenGL ES 3.0");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_GOOGLE_depth_texture"));
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_CHROMIUM_depth_texture"));
  EXPECT_TRUE(
      info_->validators()->texture_internal_format.IsValid(GL_DEPTH_COMPONENT));
  EXPECT_TRUE(
      info_->validators()->texture_internal_format.IsValid(GL_DEPTH_STENCIL));
  EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_DEPTH_COMPONENT));
  EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_DEPTH_STENCIL));
  EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_SHORT));
  EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_INT));
  EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_INT_24_8));
  EXPECT_TRUE(info_->feature_flags().packed_depth24_stencil8);
  EXPECT_TRUE(
      info_->validators()->texture_internal_format.IsValid(GL_DEPTH_STENCIL));
  EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_DEPTH_STENCIL));
}

TEST_P(FeatureInfoTest, InitializeWithoutSamplers) {
  SetupInitExpectationsWithGLVersion("", "", "3.0");
  EXPECT_FALSE(info_->feature_flags().enable_samplers);
}

TEST_P(FeatureInfoTest, ParseDriverBugWorkaroundsSingle) {
  gpu::GpuDriverBugWorkarounds workarounds;
  workarounds.exit_on_context_lost = true;
  // Workarounds should get parsed without the need for a context.
  SetupWithWorkarounds(workarounds);
  EXPECT_TRUE(info_->workarounds().exit_on_context_lost);
}

TEST_P(FeatureInfoTest, ParseDriverBugWorkaroundsMultiple) {
  gpu::GpuDriverBugWorkarounds workarounds;
  workarounds.exit_on_context_lost = true;
  workarounds.max_texture_size = 4096;
  // Workarounds should get parsed without the need for a context.
  SetupWithWorkarounds(workarounds);
  EXPECT_TRUE(info_->workarounds().exit_on_context_lost);
  EXPECT_EQ(4096, info_->workarounds().max_texture_size);
}

TEST_P(FeatureInfoTest, InitializeWithARBSync) {
  SetupInitExpectations("GL_ARB_sync");
  EXPECT_TRUE(info_->feature_flags().chromium_sync_query);
  EXPECT_TRUE(gl::GLFence::IsSupported());
}

TEST_P(FeatureInfoTest, InitializeWithNVFence) {
  SetupInitExpectations("GL_NV_fence");
  EXPECT_TRUE(info_->feature_flags().chromium_sync_query);
  EXPECT_TRUE(gl::GLFence::IsSupported());
}

TEST_P(FeatureInfoTest, InitializeWithNVDrawBuffers) {
  SetupInitExpectationsWithGLVersion("GL_NV_draw_buffers", "", "OpenGL ES 3.0");
  bool is_es2 = GetContextType() == CONTEXT_TYPE_OPENGLES2;
  EXPECT_EQ(is_es2, info_->feature_flags().nv_draw_buffers);
  EXPECT_EQ(is_es2, info_->feature_flags().ext_draw_buffers);
}

TEST_P(FeatureInfoTest, InitializeWithPreferredEXTDrawBuffers) {
  SetupInitExpectationsWithGLVersion(
      "GL_NV_draw_buffers GL_EXT_draw_buffers", "", "OpenGL ES 3.0");
  bool is_es2 = GetContextType() == CONTEXT_TYPE_OPENGLES2;
  EXPECT_FALSE(info_->feature_flags().nv_draw_buffers);
  EXPECT_EQ(is_es2, info_->feature_flags().ext_draw_buffers);
}

TEST_P(FeatureInfoTest, BlendEquationAdvancedDisabled) {
  gpu::GpuDriverBugWorkarounds workarounds;
  workarounds.disable_blend_equation_advanced = true;
  SetupInitExpectationsWithWorkarounds(
      "GL_KHR_blend_equation_advanced_coherent GL_KHR_blend_equation_advanced",
      workarounds);
  EXPECT_FALSE(info_->feature_flags().blend_equation_advanced);
  EXPECT_FALSE(info_->feature_flags().blend_equation_advanced_coherent);
}

TEST_P(FeatureInfoTest, InitializeCHROMIUM_path_rendering) {
  SetupInitExpectationsWithGLVersion(
      "GL_ARB_compatibility GL_NV_path_rendering GL_EXT_direct_state_access "
      "GL_NV_framebuffer_mixed_samples",
      "", "4.3");
  EXPECT_TRUE(info_->feature_flags().chromium_path_rendering);
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_CHROMIUM_path_rendering"));
}

TEST_P(FeatureInfoTest, InitializeCHROMIUM_path_rendering2) {
  SetupInitExpectationsWithGLVersion(
      "GL_NV_path_rendering GL_NV_framebuffer_mixed_samples", "",
      "OpenGL ES 3.1");
  EXPECT_TRUE(info_->feature_flags().chromium_path_rendering);
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_CHROMIUM_path_rendering"));
}

TEST_P(FeatureInfoTest, InitializeNoCHROMIUM_path_rendering) {
  SetupInitExpectationsWithGLVersion("GL_ARB_compatibility", "", "4.3");
  EXPECT_FALSE(info_->feature_flags().chromium_path_rendering);
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_CHROMIUM_path_rendering"));
}

TEST_P(FeatureInfoTest, InitializeNoCHROMIUM_path_rendering2) {
  SetupInitExpectationsWithGLVersion(
      "GL_ARB_compatibility GL_NV_path_rendering", "", "4.3");
  EXPECT_FALSE(info_->feature_flags().chromium_path_rendering);
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_CHROMIUM_path_rendering"));
}

TEST_P(FeatureInfoTest, InitializeNoCHROMIUM_path_rendering3) {
  // Missing framebuffer mixed samples.
  SetupInitExpectationsWithGLVersion("GL_NV_path_rendering", "",
                                     "OpenGL ES 3.1");
  EXPECT_FALSE(info_->feature_flags().chromium_path_rendering);
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_CHROMIUM_path_rendering"));
}

TEST_P(FeatureInfoTest, InitializeNoKHR_blend_equation_advanced) {
  SetupInitExpectationsWithGLVersion("GL_ARB_compatibility", "", "4.3");
  EXPECT_FALSE(info_->feature_flags().blend_equation_advanced);
  EXPECT_FALSE(
      gfx::HasExtension(info_->extensions(), "GL_KHR_blend_equation_advanced"));
}

TEST_P(FeatureInfoTest, InitializeKHR_blend_equations_advanced) {
  SetupInitExpectations("GL_KHR_blend_equation_advanced");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_KHR_blend_equation_advanced"));
  EXPECT_TRUE(info_->feature_flags().blend_equation_advanced);
}

TEST_P(FeatureInfoTest, InitializeNV_blend_equations_advanced) {
  SetupInitExpectations("GL_NV_blend_equation_advanced");
  EXPECT_TRUE(
      gfx::HasExtension(info_->extensions(), "GL_KHR_blend_equation_advanced"));
  EXPECT_TRUE(info_->feature_flags().blend_equation_advanced);
}

TEST_P(FeatureInfoTest, InitializeNoKHR_blend_equation_advanced_coherent) {
  SetupInitExpectationsWithGLVersion("GL_ARB_compatibility ", "", "4.3");
  EXPECT_FALSE(info_->feature_flags().blend_equation_advanced_coherent);
  EXPECT_FALSE(gfx::HasExtension(info_->extensions(),
                                 "GL_KHR_blend_equation_advanced_coherent"));
}

TEST_P(FeatureInfoTest, InitializeKHR_blend_equations_advanced_coherent) {
  SetupInitExpectations("GL_KHR_blend_equation_advanced_coherent");
  EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
                                "GL_KHR_blend_equation_advanced_coherent"));
  EXPECT_TRUE(info_->feature_flags().blend_equation_advanced);
  EXPECT_TRUE(info_->feature_flags().blend_equation_advanced_coherent);
}

TEST_P(FeatureInfoTest, InitializeEXT_texture_rgWithFloat) {
  SetupInitExpectations(
      "GL_EXT_texture_rg GL_OES_texture_float GL_OES_texture_half_float");
  EXPECT_TRUE(info_->feature_flags().ext_texture_rg);

  EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_RED_EXT));
  EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_RG_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(GL_RED_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(GL_RG_EXT));
  EXPECT_TRUE(info_->validators()->read_pixel_format.IsValid(GL_RED_EXT));
  EXPECT_TRUE(info_->validators()->read_pixel_format.IsValid(GL_RG_EXT));
  EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(GL_R8_EXT));
  EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(GL_RG8_EXT));
}

TEST_P(FeatureInfoTest, InitializeARB_texture_rgNoFloat) {
  SetupInitExpectations("GL_ARB_texture_rg");
  EXPECT_TRUE(info_->feature_flags().ext_texture_rg);

  EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_RED_EXT));
  EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_RG_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(GL_RED_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(GL_RG_EXT));
  EXPECT_TRUE(info_->validators()->read_pixel_format.IsValid(GL_RED_EXT));
  EXPECT_TRUE(info_->validators()->read_pixel_format.IsValid(GL_RG_EXT));
  EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(GL_R8_EXT));
  EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid(GL_RG8_EXT));
}

TEST_P(FeatureInfoTest, InitializeEXT_texture_norm16) {
  SetupInitExpectations("GL_EXT_texture_norm16");
  EXPECT_TRUE(info_->feature_flags().ext_texture_norm16);

  EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_RED_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(GL_R16_EXT));
  EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid(GL_RED_EXT));
  EXPECT_TRUE(
      info_->validators()->texture_internal_format_storage.IsValid(GL_R16_EXT));
}

TEST_P(FeatureInfoTest, InitializeCHROMIUM_ycbcr_422_imageTrue) {
  SetupInitExpectations("GL_APPLE_ycbcr_422");
  EXPECT_TRUE(info_->feature_flags().chromium_image_ycbcr_422);
}

TEST_P(FeatureInfoTest, InitializeCHROMIUM_unpremultiply_and_dither_copy) {
  SetupInitExpectations("");
  switch (GetParam()) {
    case ES2_on_Version3_0_Passthrough:
      EXPECT_FALSE(info_->feature_flags().unpremultiply_and_dither_copy);
      EXPECT_FALSE(gfx::HasExtension(
          info_->extensions(), "GL_CHROMIUM_unpremultiply_and_dither_copy"));
      break;
    case ES2_on_Version3_0:
    case ES2_on_Version3_2Compatibility:
    case ES3_on_Version3_0:
    case ES3_on_Version3_2Compatibility:
      EXPECT_TRUE(info_->feature_flags().unpremultiply_and_dither_copy);
      EXPECT_TRUE(gfx::HasExtension(
          info_->extensions(), "GL_CHROMIUM_unpremultiply_and_dither_copy"));
      break;
  }
}

TEST_P(FeatureInfoTest, InitializeMESAFramebufferFlipYExtensionTrue) {
  SetupInitExpectations("GL_MESA_framebuffer_flip_y");
  EXPECT_TRUE(info_->feature_flags().mesa_framebuffer_flip_y);
}

}  // namespace gles2
}  // namespace gpu
