|  | // 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 "base/command_line.h" | 
|  | #include "base/strings/string_number_conversions.h" | 
|  | #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_workaround_type.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::SetArgumentPointee; | 
|  | 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 | 
|  | }; | 
|  |  | 
|  | class FeatureInfoTest | 
|  | : public GpuServiceTest, | 
|  | public ::testing::WithParamInterface<MockedGLVersionKind> { | 
|  | public: | 
|  | FeatureInfoTest() { | 
|  | } | 
|  |  | 
|  | 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 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_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; | 
|  | } | 
|  | } | 
|  |  | 
|  | 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(), 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(), disallowed_features); | 
|  | } | 
|  |  | 
|  | void SetupInitExpectationsWithGLVersionAndCommandLine( | 
|  | const char* extensions, | 
|  | const char* renderer, | 
|  | const char* version, | 
|  | const base::CommandLine& command_line) { | 
|  | GpuServiceTest::SetUpWithGLVersion(version, extensions); | 
|  | TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion( | 
|  | gl_.get(), extensions, renderer, version, GetContextType()); | 
|  | GpuDriverBugWorkarounds gpu_driver_bug_workaround(&command_line); | 
|  | info_ = new FeatureInfo(command_line, gpu_driver_bug_workaround); | 
|  | info_->Initialize(GetContextType(), DisallowedFeatures()); | 
|  | } | 
|  |  | 
|  | void SetupWithCommandLine(const base::CommandLine& command_line) { | 
|  | GpuServiceTest::SetUp(); | 
|  | GpuDriverBugWorkarounds gpu_driver_bug_workaround(&command_line); | 
|  | info_ = new FeatureInfo(command_line, gpu_driver_bug_workaround); | 
|  | } | 
|  |  | 
|  | void SetupInitExpectationsWithCommandLine( | 
|  | const char* extensions, | 
|  | const base::CommandLine& command_line) { | 
|  | GpuServiceTest::SetUpWithGLVersion("2.0", extensions); | 
|  | TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion( | 
|  | gl_.get(), extensions, "", "", GetContextType()); | 
|  | GpuDriverBugWorkarounds gpu_driver_bug_workaround(&command_line); | 
|  | info_ = new FeatureInfo(command_line, gpu_driver_bug_workaround); | 
|  | info_->Initialize(GetContextType(), 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_ = NULL; | 
|  | GpuServiceTest::TearDown(); | 
|  | } | 
|  |  | 
|  | scoped_refptr<FeatureInfo> info_; | 
|  | }; | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | struct FormatInfo { | 
|  | GLenum format; | 
|  | const GLenum* types; | 
|  | size_t count; | 
|  | }; | 
|  |  | 
|  | }  // anonymous namespace. | 
|  |  | 
|  | static const MockedGLVersionKind kGLVersionKinds[] = { | 
|  | ES2_on_Version3_0, | 
|  | ES2_on_Version3_2Compatibility, | 
|  | ES3_on_Version3_0, | 
|  | ES3_on_Version3_2Compatibility | 
|  | }; | 
|  |  | 
|  | INSTANTIATE_TEST_CASE_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().use_core_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_THAT(info_->extensions(), HasSubstr("GL_CHROMIUM_resource_safe")); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("GL_CHROMIUM_strict_attribs")); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | HasSubstr("GL_ANGLE_translated_shader_source")); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("GL_CHROMIUM_trace_marker")); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions() + " ", HasSubstr("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_parameter.IsValid( | 
|  | GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT)); | 
|  | } else { | 
|  | EXPECT_THAT(info_->extensions() + " ", Not(HasSubstr("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_parameter.IsValid( | 
|  | GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT)); | 
|  | } | 
|  |  | 
|  | // Check a couple of random extensions that should not be there. | 
|  | EXPECT_THAT(info_->extensions(), Not(HasSubstr("GL_OES_texture_npot"))); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_EXT_texture_compression_dxt1"))); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_CHROMIUM_texture_compression_dxt3"))); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_CHROMIUM_texture_compression_dxt5"))); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_ANGLE_texture_usage"))); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_EXT_texture_storage"))); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_OES_compressed_ETC1_RGB8_texture"))); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_AMD_compressed_ATC_texture"))); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_IMG_texture_compression_pvrtc"))); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("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, InitializeNPOTExtensionGLES) { | 
|  | SetupInitExpectations("GL_OES_texture_npot"); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("GL_OES_texture_npot")); | 
|  | EXPECT_TRUE(info_->feature_flags().npot_ok); | 
|  | } | 
|  |  | 
|  | TEST_P(FeatureInfoTest, InitializeNPOTExtensionGL) { | 
|  | SetupInitExpectations("GL_ARB_texture_non_power_of_two"); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("GL_OES_texture_npot")); | 
|  | EXPECT_TRUE(info_->feature_flags().npot_ok); | 
|  | } | 
|  |  | 
|  | TEST_P(FeatureInfoTest, InitializeDXTExtensionGLES2) { | 
|  | SetupInitExpectations("GL_EXT_texture_compression_dxt1"); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("GL_EXT_texture_compression_dxt1")); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | HasSubstr("GL_CHROMIUM_texture_compression_dxt3")); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | Not(HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), Not(HasSubstr("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_THAT(info_->extensions() + " ", Not(HasSubstr("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_parameter.IsValid( | 
|  | GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT)); | 
|  | } else { | 
|  | EXPECT_THAT(info_->extensions() + " ", HasSubstr("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_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_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), HasSubstr("GL_EXT_texture_storage")); | 
|  | EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid( | 
|  | GL_BGRA8_EXT)); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), HasSubstr("GL_EXT_texture_storage")); | 
|  | EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid( | 
|  | GL_BGRA8_EXT)); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), HasSubstr("GL_EXT_texture_storage")); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("GL_EXT_texture_format_BGRA8888")); | 
|  | EXPECT_TRUE(info_->validators()->texture_internal_format_storage.IsValid( | 
|  | GL_BGRA8_EXT)); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("GL_EXT_texture_format_BGRA8888")); | 
|  | } | 
|  |  | 
|  | TEST_P(FeatureInfoTest, InitializeEXT_texture_storage_float) { | 
|  | SetupInitExpectations("GL_EXT_texture_storage GL_OES_texture_float"); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("GL_EXT_texture_storage")); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), HasSubstr("GL_EXT_texture_storage")); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), HasSubstr("GL_EXT_texture_storage")); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("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_THAT(info_->extensions(), HasSubstr("GL_EXT_texture_storage")); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), Not(HasSubstr("GL_EXT_texture_storage"))); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), Not(HasSubstr("GL_EXT_texture_storage"))); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("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_THAT(info_->extensions(), HasSubstr("GL_EXT_texture_storage")); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_EXT_texture_format_BGRA8888"))); | 
|  | } else { | 
|  | EXPECT_THAT(info_->extensions(), Not(HasSubstr("GL_EXT_texture_storage"))); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), HasSubstr("GL_EXT_texture_storage")); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), HasSubstr("GL_EXT_texture_storage")); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), HasSubstr("GL_EXT_texture_storage")); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | Not(HasSubstr("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); | 
|  | std::string extensions = info_->extensions() + " "; | 
|  | EXPECT_THAT(extensions, | 
|  | Not(HasSubstr("GL_CHROMIUM_color_buffer_float_rgb "))); | 
|  | EXPECT_THAT(extensions, | 
|  | Not(HasSubstr("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(); | 
|  | extensions = info_->extensions() + " "; | 
|  | EXPECT_THAT(extensions, | 
|  | Not(HasSubstr("GL_CHROMIUM_color_buffer_float_rgb "))); | 
|  | EXPECT_THAT(extensions, HasSubstr("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(); | 
|  | extensions = info_->extensions() + " "; | 
|  | EXPECT_THAT(extensions, HasSubstr("GL_CHROMIUM_color_buffer_float_rgb ")); | 
|  | EXPECT_THAT(extensions, HasSubstr("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_THAT(info_->extensions(), Not(HasSubstr("GL_OES_texture_float"))); | 
|  | EXPECT_THAT(info_->extensions(), Not(HasSubstr("GL_OES_texture_half_float"))); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_OES_texture_float_linear"))); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_OES_texture_half_float_linear"))); | 
|  | } | 
|  |  | 
|  | TEST_P(FeatureInfoTest, Initialize_sRGBGLES3) { | 
|  | SetupInitExpectationsWithGLVersion("", "", "OpenGL ES 3.0"); | 
|  | EXPECT_THAT(info_->extensions() + " ", Not(HasSubstr("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_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_THAT(info_->extensions(), HasSubstr("GL_OES_texture_float")); | 
|  | EXPECT_THAT(info_->extensions(), Not(HasSubstr("GL_OES_texture_half_float"))); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_OES_texture_float_linear"))); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("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_THAT(info_->extensions(), HasSubstr("GL_OES_texture_float")); | 
|  | EXPECT_THAT(info_->extensions(), Not(HasSubstr("GL_OES_texture_half_float"))); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("GL_OES_texture_float_linear")); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("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_THAT(info_->extensions(), Not(HasSubstr("GL_OES_texture_float"))); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("GL_OES_texture_half_float")); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_OES_texture_float_linear"))); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("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_THAT(info_->extensions(), Not(HasSubstr("GL_OES_texture_float"))); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("GL_OES_texture_half_float")); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_OES_texture_float_linear"))); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | HasSubstr("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_multisample"); | 
|  | EXPECT_TRUE(info_->feature_flags().chromium_framebuffer_multisample); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | Not(HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_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_THAT(info_->extensions(), | 
|  | HasSubstr("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_parameter.IsValid( | 
|  | GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT)); | 
|  | } | 
|  |  | 
|  | TEST_P(FeatureInfoTest, InitializeEXT_texture_filter_anisotropic) { | 
|  | SetupInitExpectations("GL_EXT_texture_filter_anisotropic"); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("GL_GOOGLE_depth_texture")); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("GL_GOOGLE_depth_texture")); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("GL_GOOGLE_depth_texture")); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | HasSubstr("GL_CHROMIUM_depth_texture")); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), | 
|  | HasSubstr("GL_OES_element_index_uint")); | 
|  | EXPECT_TRUE(info_->validators()->index_type.IsValid(GL_UNSIGNED_INT)); | 
|  | } | 
|  |  | 
|  | TEST_P(FeatureInfoTest, InitializeVAOsWithClientSideArrays) { | 
|  | base::CommandLine command_line(0, NULL); | 
|  | command_line.AppendSwitchASCII( | 
|  | switches::kGpuDriverBugWorkarounds, | 
|  | base::IntToString(gpu::USE_CLIENT_SIDE_ARRAYS_FOR_STREAM_BUFFERS)); | 
|  | SetupInitExpectationsWithCommandLine("GL_OES_vertex_array_object", | 
|  | command_line); | 
|  | EXPECT_TRUE(info_->workarounds().use_client_side_arrays_for_stream_buffers); | 
|  | EXPECT_FALSE(info_->feature_flags().native_vertex_array_object); | 
|  | } | 
|  |  | 
|  | TEST_P(FeatureInfoTest, InitializeEXT_blend_minmax) { | 
|  | SetupInitExpectations("GL_EXT_blend_minmax"); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), HasSubstr("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(info_->feature_flags().use_core_framebuffer_multisample); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | HasSubstr("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_THAT(info_->extensions(), Not(HasSubstr("GL_GOOGLE_depth_texture"))); | 
|  | EXPECT_THAT(info_->extensions(), Not(HasSubstr("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_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), HasSubstr("GL_GOOGLE_depth_texture")); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("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) { | 
|  | base::CommandLine command_line(0, NULL); | 
|  | command_line.AppendSwitchASCII( | 
|  | switches::kGpuDriverBugWorkarounds, | 
|  | base::IntToString(gpu::EXIT_ON_CONTEXT_LOST)); | 
|  | // Workarounds should get parsed without the need for a context. | 
|  | SetupWithCommandLine(command_line); | 
|  | EXPECT_TRUE(info_->workarounds().exit_on_context_lost); | 
|  | } | 
|  |  | 
|  | TEST_P(FeatureInfoTest, ParseDriverBugWorkaroundsMultiple) { | 
|  | base::CommandLine command_line(0, NULL); | 
|  | command_line.AppendSwitchASCII( | 
|  | switches::kGpuDriverBugWorkarounds, | 
|  | base::IntToString(gpu::EXIT_ON_CONTEXT_LOST) + "," + | 
|  | base::IntToString(gpu::MAX_TEXTURE_SIZE_LIMIT_4096)); | 
|  | // Workarounds should get parsed without the need for a context. | 
|  | SetupWithCommandLine(command_line); | 
|  | 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"); | 
|  | EXPECT_TRUE(info_->feature_flags().nv_draw_buffers); | 
|  | EXPECT_TRUE(info_->feature_flags().ext_draw_buffers); | 
|  | } | 
|  |  | 
|  | TEST_P(FeatureInfoTest, InitializeWithPreferredEXTDrawBuffers) { | 
|  | SetupInitExpectationsWithGLVersion( | 
|  | "GL_NV_draw_buffers GL_EXT_draw_buffers", "", "OpenGL ES 3.0"); | 
|  | EXPECT_FALSE(info_->feature_flags().nv_draw_buffers); | 
|  | EXPECT_TRUE(info_->feature_flags().ext_draw_buffers); | 
|  | } | 
|  |  | 
|  | TEST_P(FeatureInfoTest, BlendEquationAdvancedDisabled) { | 
|  | base::CommandLine command_line(0, NULL); | 
|  | command_line.AppendSwitchASCII( | 
|  | switches::kGpuDriverBugWorkarounds, | 
|  | base::IntToString(gpu::DISABLE_BLEND_EQUATION_ADVANCED)); | 
|  | SetupInitExpectationsWithCommandLine( | 
|  | "GL_KHR_blend_equation_advanced_coherent GL_KHR_blend_equation_advanced", | 
|  | command_line); | 
|  | EXPECT_FALSE(info_->feature_flags().blend_equation_advanced); | 
|  | EXPECT_FALSE(info_->feature_flags().blend_equation_advanced_coherent); | 
|  | } | 
|  |  | 
|  | TEST_P(FeatureInfoTest, InitializeCHROMIUM_path_rendering) { | 
|  | base::CommandLine command_line(0, NULL); | 
|  | SetupInitExpectationsWithGLVersionAndCommandLine( | 
|  | "GL_ARB_compatibility GL_NV_path_rendering GL_EXT_direct_state_access " | 
|  | "GL_NV_framebuffer_mixed_samples", | 
|  | "", "4.3", command_line); | 
|  | EXPECT_TRUE(info_->feature_flags().chromium_path_rendering); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("GL_CHROMIUM_path_rendering")); | 
|  | } | 
|  |  | 
|  | TEST_P(FeatureInfoTest, InitializeCHROMIUM_path_rendering2) { | 
|  | base::CommandLine command_line(0, NULL); | 
|  | SetupInitExpectationsWithGLVersionAndCommandLine( | 
|  | "GL_NV_path_rendering GL_NV_framebuffer_mixed_samples", "", | 
|  | "OpenGL ES 3.1", command_line); | 
|  | EXPECT_TRUE(info_->feature_flags().chromium_path_rendering); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("GL_CHROMIUM_path_rendering")); | 
|  | } | 
|  |  | 
|  | TEST_P(FeatureInfoTest, InitializeNoCHROMIUM_path_rendering) { | 
|  | base::CommandLine command_line(0, NULL); | 
|  | SetupInitExpectationsWithGLVersionAndCommandLine("GL_ARB_compatibility", "", | 
|  | "4.3", command_line); | 
|  | EXPECT_FALSE(info_->feature_flags().chromium_path_rendering); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_CHROMIUM_path_rendering"))); | 
|  | } | 
|  |  | 
|  | TEST_P(FeatureInfoTest, InitializeNoCHROMIUM_path_rendering2) { | 
|  | base::CommandLine command_line(0, NULL); | 
|  | SetupInitExpectationsWithGLVersionAndCommandLine( | 
|  | "GL_ARB_compatibility GL_NV_path_rendering", "", "4.3", command_line); | 
|  | EXPECT_FALSE(info_->feature_flags().chromium_path_rendering); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_CHROMIUM_path_rendering"))); | 
|  | } | 
|  |  | 
|  | TEST_P(FeatureInfoTest, InitializeNoCHROMIUM_path_rendering3) { | 
|  | base::CommandLine command_line(0, NULL); | 
|  | // Missing framebuffer mixed samples. | 
|  | SetupInitExpectationsWithGLVersionAndCommandLine( | 
|  | "GL_NV_path_rendering", "", "OpenGL ES 3.1", command_line); | 
|  | EXPECT_FALSE(info_->feature_flags().chromium_path_rendering); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | Not(HasSubstr("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_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_KHR_blend_equation_advanced"))); | 
|  | } | 
|  |  | 
|  | TEST_P(FeatureInfoTest, InitializeKHR_blend_equations_advanced) { | 
|  | SetupInitExpectations("GL_KHR_blend_equation_advanced"); | 
|  | EXPECT_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), HasSubstr("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_THAT(info_->extensions(), | 
|  | Not(HasSubstr("GL_KHR_blend_equation_advanced_coherent"))); | 
|  | } | 
|  |  | 
|  | TEST_P(FeatureInfoTest, InitializeKHR_blend_equations_advanced_coherent) { | 
|  | SetupInitExpectations("GL_KHR_blend_equation_advanced_coherent"); | 
|  | EXPECT_THAT(info_->extensions(), | 
|  | HasSubstr("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, InitializeCHROMIUM_ycbcr_422_imageTrue) { | 
|  | SetupInitExpectations("GL_APPLE_ycbcr_422"); | 
|  | EXPECT_TRUE(info_->feature_flags().chromium_image_ycbcr_422); | 
|  | } | 
|  |  | 
|  | }  // namespace gles2 | 
|  | }  // namespace gpu |