1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "gpu/command_buffer/service/feature_info.h" 6 7 #include "base/command_line.h" 8 #include "base/memory/scoped_ptr.h" 9 #include "base/strings/string_number_conversions.h" 10 #include "gpu/command_buffer/service/gpu_service_test.h" 11 #include "gpu/command_buffer/service/gpu_switches.h" 12 #include "gpu/command_buffer/service/test_helper.h" 13 #include "gpu/command_buffer/service/texture_manager.h" 14 #include "gpu/config/gpu_driver_bug_workaround_type.h" 15 #include "testing/gtest/include/gtest/gtest.h" 16 #include "ui/gl/gl_fence.h" 17 #include "ui/gl/gl_implementation.h" 18 #include "ui/gl/gl_mock.h" 19 20 using ::testing::_; 21 using ::testing::DoAll; 22 using ::testing::HasSubstr; 23 using ::testing::InSequence; 24 using ::testing::MatcherCast; 25 using ::testing::Not; 26 using ::testing::Pointee; 27 using ::testing::Return; 28 using ::testing::SetArrayArgument; 29 using ::testing::SetArgumentPointee; 30 using ::testing::StrEq; 31 32 namespace gpu { 33 namespace gles2 { 34 35 namespace { 36 const char kGLRendererStringANGLE[] = "ANGLE (some renderer)"; 37 } // anonymous namespace 38 39 class FeatureInfoTest : public GpuServiceTest { 40 public: 41 FeatureInfoTest() { 42 } 43 44 void SetupInitExpectations(const char* extensions) { 45 SetupInitExpectationsWithGLVersion(extensions, "", ""); 46 } 47 48 void SetupInitExpectationsWithGLVersion( 49 const char* extensions, const char* renderer, const char* version) { 50 GpuServiceTest::SetUpWithGLVersion(version, extensions); 51 TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion( 52 gl_.get(), extensions, renderer, version); 53 info_ = new FeatureInfo(); 54 info_->Initialize(); 55 } 56 57 void SetupWithCommandLine(const CommandLine& command_line) { 58 GpuServiceTest::SetUp(); 59 info_ = new FeatureInfo(command_line); 60 } 61 62 void SetupInitExpectationsWithCommandLine( 63 const char* extensions, const CommandLine& command_line) { 64 GpuServiceTest::SetUpWithGLVersion("2.0", extensions); 65 TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion( 66 gl_.get(), extensions, "", ""); 67 info_ = new FeatureInfo(command_line); 68 info_->Initialize(); 69 } 70 71 void SetupWithoutInit() { 72 GpuServiceTest::SetUp(); 73 info_ = new FeatureInfo(); 74 } 75 76 protected: 77 virtual void SetUp() OVERRIDE { 78 // Do nothing here, since we are using the explicit Setup*() functions. 79 } 80 81 virtual void TearDown() OVERRIDE { 82 info_ = NULL; 83 GpuServiceTest::TearDown(); 84 } 85 86 scoped_refptr<FeatureInfo> info_; 87 }; 88 89 namespace { 90 91 struct FormatInfo { 92 GLenum format; 93 const GLenum* types; 94 size_t count; 95 }; 96 97 } // anonymous namespace. 98 99 TEST_F(FeatureInfoTest, Basic) { 100 SetupWithoutInit(); 101 // Test it starts off uninitialized. 102 EXPECT_FALSE(info_->feature_flags().chromium_framebuffer_multisample); 103 EXPECT_FALSE(info_->feature_flags().use_core_framebuffer_multisample); 104 EXPECT_FALSE(info_->feature_flags().multisampled_render_to_texture); 105 EXPECT_FALSE(info_->feature_flags( 106 ).use_img_for_multisampled_render_to_texture); 107 EXPECT_FALSE(info_->feature_flags().oes_standard_derivatives); 108 EXPECT_FALSE(info_->feature_flags().npot_ok); 109 EXPECT_FALSE(info_->feature_flags().enable_texture_float_linear); 110 EXPECT_FALSE(info_->feature_flags().enable_texture_half_float_linear); 111 EXPECT_FALSE(info_->feature_flags().oes_egl_image_external); 112 EXPECT_FALSE(info_->feature_flags().oes_depth24); 113 EXPECT_FALSE(info_->feature_flags().packed_depth24_stencil8); 114 EXPECT_FALSE(info_->feature_flags().angle_translated_shader_source); 115 EXPECT_FALSE(info_->feature_flags().angle_pack_reverse_row_order); 116 EXPECT_FALSE(info_->feature_flags().arb_texture_rectangle); 117 EXPECT_FALSE(info_->feature_flags().angle_instanced_arrays); 118 EXPECT_FALSE(info_->feature_flags().occlusion_query_boolean); 119 EXPECT_FALSE(info_->feature_flags( 120 ).use_arb_occlusion_query2_for_occlusion_query_boolean); 121 EXPECT_FALSE(info_->feature_flags( 122 ).use_arb_occlusion_query_for_occlusion_query_boolean); 123 EXPECT_FALSE(info_->feature_flags().native_vertex_array_object); 124 EXPECT_FALSE(info_->feature_flags().map_buffer_range); 125 EXPECT_FALSE(info_->feature_flags().use_async_readpixels); 126 EXPECT_FALSE(info_->feature_flags().ext_discard_framebuffer); 127 EXPECT_FALSE(info_->feature_flags().angle_depth_texture); 128 EXPECT_FALSE(info_->feature_flags().is_angle); 129 130 #define GPU_OP(type, name) EXPECT_FALSE(info_->workarounds().name); 131 GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP) 132 #undef GPU_OP 133 EXPECT_EQ(0, info_->workarounds().max_texture_size); 134 EXPECT_EQ(0, info_->workarounds().max_cube_map_texture_size); 135 136 // Test good types. 137 { 138 static const GLenum kAlphaTypes[] = { 139 GL_UNSIGNED_BYTE, 140 }; 141 static const GLenum kRGBTypes[] = { 142 GL_UNSIGNED_BYTE, 143 GL_UNSIGNED_SHORT_5_6_5, 144 }; 145 static const GLenum kRGBATypes[] = { 146 GL_UNSIGNED_BYTE, 147 GL_UNSIGNED_SHORT_4_4_4_4, 148 GL_UNSIGNED_SHORT_5_5_5_1, 149 }; 150 static const GLenum kLuminanceTypes[] = { 151 GL_UNSIGNED_BYTE, 152 }; 153 static const GLenum kLuminanceAlphaTypes[] = { 154 GL_UNSIGNED_BYTE, 155 }; 156 static const FormatInfo kFormatTypes[] = { 157 { GL_ALPHA, kAlphaTypes, arraysize(kAlphaTypes), }, 158 { GL_RGB, kRGBTypes, arraysize(kRGBTypes), }, 159 { GL_RGBA, kRGBATypes, arraysize(kRGBATypes), }, 160 { GL_LUMINANCE, kLuminanceTypes, arraysize(kLuminanceTypes), }, 161 { GL_LUMINANCE_ALPHA, kLuminanceAlphaTypes, 162 arraysize(kLuminanceAlphaTypes), } , 163 }; 164 for (size_t ii = 0; ii < arraysize(kFormatTypes); ++ii) { 165 const FormatInfo& info = kFormatTypes[ii]; 166 const ValueValidator<GLenum>& validator = 167 info_->GetTextureFormatValidator(info.format); 168 for (size_t jj = 0; jj < info.count; ++jj) { 169 EXPECT_TRUE(validator.IsValid(info.types[jj])); 170 } 171 } 172 } 173 174 // Test some bad types 175 { 176 static const GLenum kAlphaTypes[] = { 177 GL_UNSIGNED_SHORT_5_5_5_1, 178 GL_FLOAT, 179 }; 180 static const GLenum kRGBTypes[] = { 181 GL_UNSIGNED_SHORT_4_4_4_4, 182 GL_FLOAT, 183 }; 184 static const GLenum kRGBATypes[] = { 185 GL_UNSIGNED_SHORT_5_6_5, 186 GL_FLOAT, 187 }; 188 static const GLenum kLuminanceTypes[] = { 189 GL_UNSIGNED_SHORT_4_4_4_4, 190 GL_FLOAT, 191 }; 192 static const GLenum kLuminanceAlphaTypes[] = { 193 GL_UNSIGNED_SHORT_5_5_5_1, 194 GL_FLOAT, 195 }; 196 static const GLenum kBGRATypes[] = { 197 GL_UNSIGNED_BYTE, 198 GL_UNSIGNED_SHORT_5_6_5, 199 GL_FLOAT, 200 }; 201 static const GLenum kDepthTypes[] = { 202 GL_UNSIGNED_BYTE, 203 GL_UNSIGNED_SHORT, 204 GL_UNSIGNED_INT, 205 GL_FLOAT, 206 }; 207 static const FormatInfo kFormatTypes[] = { 208 { GL_ALPHA, kAlphaTypes, arraysize(kAlphaTypes), }, 209 { GL_RGB, kRGBTypes, arraysize(kRGBTypes), }, 210 { GL_RGBA, kRGBATypes, arraysize(kRGBATypes), }, 211 { GL_LUMINANCE, kLuminanceTypes, arraysize(kLuminanceTypes), }, 212 { GL_LUMINANCE_ALPHA, kLuminanceAlphaTypes, 213 arraysize(kLuminanceAlphaTypes), } , 214 { GL_BGRA_EXT, kBGRATypes, arraysize(kBGRATypes), }, 215 { GL_DEPTH_COMPONENT, kDepthTypes, arraysize(kDepthTypes), }, 216 }; 217 for (size_t ii = 0; ii < arraysize(kFormatTypes); ++ii) { 218 const FormatInfo& info = kFormatTypes[ii]; 219 const ValueValidator<GLenum>& validator = 220 info_->GetTextureFormatValidator(info.format); 221 for (size_t jj = 0; jj < info.count; ++jj) { 222 EXPECT_FALSE(validator.IsValid(info.types[jj])); 223 } 224 } 225 } 226 } 227 228 TEST_F(FeatureInfoTest, InitializeNoExtensions) { 229 SetupInitExpectations(""); 230 // Check default extensions are there 231 EXPECT_THAT(info_->extensions(), HasSubstr("GL_CHROMIUM_resource_safe")); 232 EXPECT_THAT(info_->extensions(), HasSubstr("GL_CHROMIUM_strict_attribs")); 233 EXPECT_THAT(info_->extensions(), 234 HasSubstr("GL_ANGLE_translated_shader_source")); 235 236 // Check a couple of random extensions that should not be there. 237 EXPECT_THAT(info_->extensions(), Not(HasSubstr("GL_OES_texture_npot"))); 238 EXPECT_THAT(info_->extensions(), 239 Not(HasSubstr("GL_EXT_texture_compression_dxt1"))); 240 EXPECT_THAT(info_->extensions(), 241 Not(HasSubstr("GL_CHROMIUM_texture_compression_dxt3"))); 242 EXPECT_THAT(info_->extensions(), 243 Not(HasSubstr("GL_CHROMIUM_texture_compression_dxt5"))); 244 EXPECT_THAT(info_->extensions(), 245 Not(HasSubstr("GL_ANGLE_texture_usage"))); 246 EXPECT_THAT(info_->extensions(), 247 Not(HasSubstr("GL_EXT_texture_storage"))); 248 EXPECT_THAT(info_->extensions(), 249 Not(HasSubstr("GL_OES_compressed_ETC1_RGB8_texture"))); 250 EXPECT_THAT(info_->extensions(), 251 Not(HasSubstr("GL_AMD_compressed_ATC_texture"))); 252 EXPECT_THAT(info_->extensions(), 253 Not(HasSubstr("GL_IMG_texture_compression_pvrtc"))); 254 EXPECT_FALSE(info_->feature_flags().npot_ok); 255 EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( 256 GL_COMPRESSED_RGB_S3TC_DXT1_EXT)); 257 EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( 258 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)); 259 EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( 260 GL_COMPRESSED_RGBA_S3TC_DXT3_EXT)); 261 EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( 262 GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)); 263 EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( 264 GL_ETC1_RGB8_OES)); 265 EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( 266 GL_ATC_RGB_AMD)); 267 EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( 268 GL_ATC_RGBA_EXPLICIT_ALPHA_AMD)); 269 EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( 270 GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD)); 271 EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( 272 GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG)); 273 EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( 274 GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG)); 275 EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( 276 GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG)); 277 EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( 278 GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG)); 279 EXPECT_FALSE(info_->validators()->read_pixel_format.IsValid( 280 GL_BGRA_EXT)); 281 EXPECT_FALSE(info_->validators()->texture_parameter.IsValid( 282 GL_TEXTURE_MAX_ANISOTROPY_EXT)); 283 EXPECT_FALSE(info_->validators()->g_l_state.IsValid( 284 GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT)); 285 EXPECT_FALSE(info_->validators()->frame_buffer_target.IsValid( 286 GL_READ_FRAMEBUFFER_EXT)); 287 EXPECT_FALSE(info_->validators()->frame_buffer_target.IsValid( 288 GL_DRAW_FRAMEBUFFER_EXT)); 289 EXPECT_FALSE(info_->validators()->g_l_state.IsValid( 290 GL_READ_FRAMEBUFFER_BINDING_EXT)); 291 EXPECT_FALSE(info_->validators()->render_buffer_parameter.IsValid( 292 GL_MAX_SAMPLES_EXT)); 293 EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid( 294 GL_DEPTH_COMPONENT)); 295 EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_DEPTH_COMPONENT)); 296 EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_SHORT)); 297 EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_INT)); 298 EXPECT_FALSE(info_->validators()->render_buffer_format.IsValid( 299 GL_DEPTH24_STENCIL8)); 300 EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid( 301 GL_DEPTH_STENCIL)); 302 EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid( 303 GL_RGBA32F)); 304 EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid( 305 GL_RGB32F)); 306 EXPECT_FALSE(info_->validators()->texture_format.IsValid( 307 GL_DEPTH_STENCIL)); 308 EXPECT_FALSE(info_->validators()->pixel_type.IsValid( 309 GL_UNSIGNED_INT_24_8)); 310 EXPECT_FALSE(info_->validators()->render_buffer_format.IsValid( 311 GL_DEPTH_COMPONENT24)); 312 EXPECT_FALSE(info_->validators()->texture_parameter.IsValid( 313 GL_TEXTURE_USAGE_ANGLE)); 314 EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid( 315 GL_DEPTH_COMPONENT16)); 316 EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid( 317 GL_DEPTH_COMPONENT32_OES)); 318 EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid( 319 GL_DEPTH24_STENCIL8_OES)); 320 EXPECT_FALSE(info_->validators()->equation.IsValid(GL_MIN_EXT)); 321 EXPECT_FALSE(info_->validators()->equation.IsValid(GL_MAX_EXT)); 322 EXPECT_FALSE(info_->feature_flags().chromium_sync_query); 323 } 324 325 TEST_F(FeatureInfoTest, InitializeWithANGLE) { 326 SetupInitExpectationsWithGLVersion("", kGLRendererStringANGLE, ""); 327 EXPECT_TRUE(info_->feature_flags().is_angle); 328 } 329 330 TEST_F(FeatureInfoTest, InitializeNPOTExtensionGLES) { 331 SetupInitExpectations("GL_OES_texture_npot"); 332 EXPECT_THAT(info_->extensions(), HasSubstr("GL_OES_texture_npot")); 333 EXPECT_TRUE(info_->feature_flags().npot_ok); 334 } 335 336 TEST_F(FeatureInfoTest, InitializeNPOTExtensionGL) { 337 SetupInitExpectations("GL_ARB_texture_non_power_of_two"); 338 EXPECT_THAT(info_->extensions(), HasSubstr("GL_OES_texture_npot")); 339 EXPECT_TRUE(info_->feature_flags().npot_ok); 340 } 341 342 TEST_F(FeatureInfoTest, InitializeDXTExtensionGLES2) { 343 SetupInitExpectations("GL_EXT_texture_compression_dxt1"); 344 EXPECT_THAT(info_->extensions(), 345 HasSubstr("GL_EXT_texture_compression_dxt1")); 346 EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( 347 GL_COMPRESSED_RGB_S3TC_DXT1_EXT)); 348 EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( 349 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)); 350 EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( 351 GL_COMPRESSED_RGBA_S3TC_DXT3_EXT)); 352 EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( 353 GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)); 354 } 355 356 TEST_F(FeatureInfoTest, InitializeDXTExtensionGL) { 357 SetupInitExpectations("GL_EXT_texture_compression_s3tc"); 358 EXPECT_THAT(info_->extensions(), 359 HasSubstr("GL_EXT_texture_compression_dxt1")); 360 EXPECT_THAT(info_->extensions(), 361 HasSubstr("GL_CHROMIUM_texture_compression_dxt3")); 362 EXPECT_THAT(info_->extensions(), 363 HasSubstr("GL_CHROMIUM_texture_compression_dxt5")); 364 EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( 365 GL_COMPRESSED_RGB_S3TC_DXT1_EXT)); 366 EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( 367 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)); 368 EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( 369 GL_COMPRESSED_RGBA_S3TC_DXT3_EXT)); 370 EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( 371 GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)); 372 } 373 374 TEST_F(FeatureInfoTest, InitializeEXT_texture_format_BGRA8888GLES2) { 375 SetupInitExpectations("GL_EXT_texture_format_BGRA8888"); 376 EXPECT_THAT(info_->extensions(), 377 HasSubstr("GL_EXT_texture_format_BGRA8888")); 378 EXPECT_TRUE(info_->validators()->texture_format.IsValid( 379 GL_BGRA_EXT)); 380 EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid( 381 GL_BGRA_EXT)); 382 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_BGRA_EXT).IsValid( 383 GL_UNSIGNED_BYTE)); 384 EXPECT_FALSE(info_->validators()->render_buffer_format.IsValid( 385 GL_BGRA8_EXT)); 386 } 387 388 TEST_F(FeatureInfoTest, InitializeEXT_texture_format_BGRA8888GL) { 389 SetupInitExpectations("GL_EXT_bgra"); 390 EXPECT_THAT(info_->extensions(), 391 HasSubstr("GL_EXT_texture_format_BGRA8888")); 392 EXPECT_THAT(info_->extensions(), 393 HasSubstr("GL_EXT_read_format_bgra")); 394 EXPECT_THAT(info_->extensions(), 395 HasSubstr("GL_CHROMIUM_renderbuffer_format_BGRA8888")); 396 EXPECT_TRUE(info_->validators()->texture_format.IsValid( 397 GL_BGRA_EXT)); 398 EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid( 399 GL_BGRA_EXT)); 400 EXPECT_TRUE(info_->validators()->read_pixel_format.IsValid( 401 GL_BGRA_EXT)); 402 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_BGRA_EXT).IsValid( 403 GL_UNSIGNED_BYTE)); 404 EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid( 405 GL_BGRA8_EXT)); 406 } 407 408 TEST_F(FeatureInfoTest, InitializeEXT_texture_format_BGRA8888Apple) { 409 SetupInitExpectations("GL_APPLE_texture_format_BGRA8888"); 410 EXPECT_THAT(info_->extensions(), 411 HasSubstr("GL_EXT_texture_format_BGRA8888")); 412 EXPECT_TRUE(info_->validators()->texture_format.IsValid( 413 GL_BGRA_EXT)); 414 EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid( 415 GL_BGRA_EXT)); 416 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_BGRA_EXT).IsValid( 417 GL_UNSIGNED_BYTE)); 418 EXPECT_FALSE(info_->validators()->render_buffer_format.IsValid( 419 GL_BGRA8_EXT)); 420 } 421 422 TEST_F(FeatureInfoTest, InitializeEXT_read_format_bgra) { 423 SetupInitExpectations("GL_EXT_read_format_bgra"); 424 EXPECT_THAT(info_->extensions(), 425 HasSubstr("GL_EXT_read_format_bgra")); 426 EXPECT_FALSE(info_->validators()->texture_format.IsValid( 427 GL_BGRA_EXT)); 428 EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid( 429 GL_BGRA_EXT)); 430 EXPECT_TRUE(info_->validators()->read_pixel_format.IsValid( 431 GL_BGRA_EXT)); 432 EXPECT_FALSE(info_->validators()->render_buffer_format.IsValid( 433 GL_BGRA8_EXT)); 434 } 435 436 TEST_F(FeatureInfoTest, InitializeARB_texture_float) { 437 SetupInitExpectations("GL_ARB_texture_float"); 438 EXPECT_TRUE(info_->feature_flags().chromium_color_buffer_float_rgba); 439 EXPECT_TRUE(info_->feature_flags().chromium_color_buffer_float_rgb); 440 std::string extensions = info_->extensions() + " "; 441 EXPECT_THAT(extensions, HasSubstr("GL_CHROMIUM_color_buffer_float_rgb ")); 442 EXPECT_THAT(extensions, HasSubstr("GL_CHROMIUM_color_buffer_float_rgba")); 443 EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid( 444 GL_RGBA32F)); 445 EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid( 446 GL_RGB32F)); 447 } 448 449 TEST_F(FeatureInfoTest, InitializeOES_texture_floatGLES2) { 450 SetupInitExpectations("GL_OES_texture_float"); 451 EXPECT_FALSE(info_->feature_flags().enable_texture_float_linear); 452 EXPECT_FALSE(info_->feature_flags().enable_texture_half_float_linear); 453 EXPECT_THAT(info_->extensions(), HasSubstr("GL_OES_texture_float")); 454 EXPECT_THAT(info_->extensions(), Not(HasSubstr("GL_OES_texture_half_float"))); 455 EXPECT_THAT(info_->extensions(), 456 Not(HasSubstr("GL_OES_texture_float_linear"))); 457 EXPECT_THAT(info_->extensions(), 458 Not(HasSubstr("GL_OES_texture_half_float_linear"))); 459 EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_FLOAT)); 460 EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_HALF_FLOAT_OES)); 461 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_ALPHA).IsValid( 462 GL_FLOAT)); 463 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_RGB).IsValid( 464 GL_FLOAT)); 465 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_RGBA).IsValid( 466 GL_FLOAT)); 467 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_LUMINANCE).IsValid( 468 GL_FLOAT)); 469 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_LUMINANCE_ALPHA).IsValid( 470 GL_FLOAT)); 471 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_ALPHA).IsValid( 472 GL_HALF_FLOAT_OES)); 473 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_RGB).IsValid( 474 GL_HALF_FLOAT_OES)); 475 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_RGBA).IsValid( 476 GL_HALF_FLOAT_OES)); 477 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_LUMINANCE).IsValid( 478 GL_HALF_FLOAT_OES)); 479 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_LUMINANCE_ALPHA).IsValid( 480 GL_HALF_FLOAT_OES)); 481 } 482 483 TEST_F(FeatureInfoTest, InitializeOES_texture_float_linearGLES2) { 484 SetupInitExpectations("GL_OES_texture_float GL_OES_texture_float_linear"); 485 EXPECT_TRUE(info_->feature_flags().enable_texture_float_linear); 486 EXPECT_FALSE(info_->feature_flags().enable_texture_half_float_linear); 487 EXPECT_THAT(info_->extensions(), HasSubstr("GL_OES_texture_float")); 488 EXPECT_THAT(info_->extensions(), Not(HasSubstr("GL_OES_texture_half_float"))); 489 EXPECT_THAT(info_->extensions(), HasSubstr("GL_OES_texture_float_linear")); 490 EXPECT_THAT(info_->extensions(), 491 Not(HasSubstr("GL_OES_texture_half_float_linear"))); 492 EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_FLOAT)); 493 EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_HALF_FLOAT_OES)); 494 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_ALPHA).IsValid( 495 GL_FLOAT)); 496 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_RGB).IsValid( 497 GL_FLOAT)); 498 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_RGBA).IsValid( 499 GL_FLOAT)); 500 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_LUMINANCE).IsValid( 501 GL_FLOAT)); 502 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_LUMINANCE_ALPHA).IsValid( 503 GL_FLOAT)); 504 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_ALPHA).IsValid( 505 GL_HALF_FLOAT_OES)); 506 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_RGB).IsValid( 507 GL_HALF_FLOAT_OES)); 508 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_RGBA).IsValid( 509 GL_HALF_FLOAT_OES)); 510 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_LUMINANCE).IsValid( 511 GL_HALF_FLOAT_OES)); 512 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_LUMINANCE_ALPHA).IsValid( 513 GL_HALF_FLOAT_OES)); 514 } 515 516 TEST_F(FeatureInfoTest, InitializeOES_texture_half_floatGLES2) { 517 SetupInitExpectations("GL_OES_texture_half_float"); 518 EXPECT_FALSE(info_->feature_flags().enable_texture_float_linear); 519 EXPECT_FALSE(info_->feature_flags().enable_texture_half_float_linear); 520 EXPECT_THAT(info_->extensions(), Not(HasSubstr("GL_OES_texture_float"))); 521 EXPECT_THAT(info_->extensions(), HasSubstr("GL_OES_texture_half_float")); 522 EXPECT_THAT(info_->extensions(), 523 Not(HasSubstr("GL_OES_texture_float_linear"))); 524 EXPECT_THAT(info_->extensions(), 525 Not(HasSubstr("GL_OES_texture_half_float_linear"))); 526 EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_FLOAT)); 527 EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_HALF_FLOAT_OES)); 528 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_ALPHA).IsValid( 529 GL_FLOAT)); 530 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_RGB).IsValid( 531 GL_FLOAT)); 532 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_RGBA).IsValid( 533 GL_FLOAT)); 534 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_LUMINANCE).IsValid( 535 GL_FLOAT)); 536 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_LUMINANCE_ALPHA).IsValid( 537 GL_FLOAT)); 538 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_ALPHA).IsValid( 539 GL_HALF_FLOAT_OES)); 540 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_RGB).IsValid( 541 GL_HALF_FLOAT_OES)); 542 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_RGBA).IsValid( 543 GL_HALF_FLOAT_OES)); 544 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_LUMINANCE).IsValid( 545 GL_HALF_FLOAT_OES)); 546 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_LUMINANCE_ALPHA).IsValid( 547 GL_HALF_FLOAT_OES)); 548 } 549 550 TEST_F(FeatureInfoTest, InitializeOES_texture_half_float_linearGLES2) { 551 SetupInitExpectations( 552 "GL_OES_texture_half_float GL_OES_texture_half_float_linear"); 553 EXPECT_FALSE(info_->feature_flags().enable_texture_float_linear); 554 EXPECT_TRUE(info_->feature_flags().enable_texture_half_float_linear); 555 EXPECT_THAT(info_->extensions(), Not(HasSubstr("GL_OES_texture_float"))); 556 EXPECT_THAT(info_->extensions(), HasSubstr("GL_OES_texture_half_float")); 557 EXPECT_THAT(info_->extensions(), 558 Not(HasSubstr("GL_OES_texture_float_linear"))); 559 EXPECT_THAT(info_->extensions(), 560 HasSubstr("GL_OES_texture_half_float_linear")); 561 EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_FLOAT)); 562 EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_HALF_FLOAT_OES)); 563 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_ALPHA).IsValid( 564 GL_FLOAT)); 565 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_RGB).IsValid( 566 GL_FLOAT)); 567 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_RGBA).IsValid( 568 GL_FLOAT)); 569 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_LUMINANCE).IsValid( 570 GL_FLOAT)); 571 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_LUMINANCE_ALPHA).IsValid( 572 GL_FLOAT)); 573 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_ALPHA).IsValid( 574 GL_HALF_FLOAT_OES)); 575 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_RGB).IsValid( 576 GL_HALF_FLOAT_OES)); 577 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_RGBA).IsValid( 578 GL_HALF_FLOAT_OES)); 579 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_LUMINANCE).IsValid( 580 GL_HALF_FLOAT_OES)); 581 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_LUMINANCE_ALPHA).IsValid( 582 GL_HALF_FLOAT_OES)); 583 } 584 585 TEST_F(FeatureInfoTest, InitializeEXT_framebuffer_multisample) { 586 SetupInitExpectations("GL_EXT_framebuffer_multisample"); 587 EXPECT_TRUE(info_->feature_flags().chromium_framebuffer_multisample); 588 EXPECT_THAT(info_->extensions(), 589 HasSubstr("GL_CHROMIUM_framebuffer_multisample")); 590 EXPECT_TRUE(info_->validators()->frame_buffer_target.IsValid( 591 GL_READ_FRAMEBUFFER_EXT)); 592 EXPECT_TRUE(info_->validators()->frame_buffer_target.IsValid( 593 GL_DRAW_FRAMEBUFFER_EXT)); 594 EXPECT_TRUE(info_->validators()->g_l_state.IsValid( 595 GL_READ_FRAMEBUFFER_BINDING_EXT)); 596 EXPECT_TRUE(info_->validators()->g_l_state.IsValid( 597 GL_MAX_SAMPLES_EXT)); 598 EXPECT_TRUE(info_->validators()->render_buffer_parameter.IsValid( 599 GL_RENDERBUFFER_SAMPLES_EXT)); 600 } 601 602 TEST_F(FeatureInfoTest, InitializeANGLE_framebuffer_multisample) { 603 SetupInitExpectationsWithGLVersion( 604 "GL_ANGLE_framebuffer_multisample", kGLRendererStringANGLE, ""); 605 EXPECT_TRUE(info_->feature_flags().chromium_framebuffer_multisample); 606 EXPECT_THAT(info_->extensions(), 607 HasSubstr("GL_CHROMIUM_framebuffer_multisample")); 608 EXPECT_TRUE(info_->validators()->frame_buffer_target.IsValid( 609 GL_READ_FRAMEBUFFER_EXT)); 610 EXPECT_TRUE(info_->validators()->frame_buffer_target.IsValid( 611 GL_DRAW_FRAMEBUFFER_EXT)); 612 EXPECT_TRUE(info_->validators()->g_l_state.IsValid( 613 GL_READ_FRAMEBUFFER_BINDING_EXT)); 614 EXPECT_TRUE(info_->validators()->g_l_state.IsValid( 615 GL_MAX_SAMPLES_EXT)); 616 EXPECT_TRUE(info_->validators()->render_buffer_parameter.IsValid( 617 GL_RENDERBUFFER_SAMPLES_EXT)); 618 } 619 620 // We don't allow ANGLE_framebuffer_multisample on non-ANGLE implementations, 621 // because we wouldn't be choosing the right driver entry point and because the 622 // extension was falsely advertised on some Android devices (crbug.com/165736). 623 TEST_F(FeatureInfoTest, InitializeANGLE_framebuffer_multisampleWithoutANGLE) { 624 SetupInitExpectations("GL_ANGLE_framebuffer_multisample"); 625 EXPECT_FALSE(info_->feature_flags().chromium_framebuffer_multisample); 626 EXPECT_THAT(info_->extensions(), 627 Not(HasSubstr("GL_CHROMIUM_framebuffer_multisample"))); 628 EXPECT_FALSE(info_->validators()->frame_buffer_target.IsValid( 629 GL_READ_FRAMEBUFFER_EXT)); 630 EXPECT_FALSE(info_->validators()->frame_buffer_target.IsValid( 631 GL_DRAW_FRAMEBUFFER_EXT)); 632 EXPECT_FALSE(info_->validators()->g_l_state.IsValid( 633 GL_READ_FRAMEBUFFER_BINDING_EXT)); 634 EXPECT_FALSE(info_->validators()->g_l_state.IsValid( 635 GL_MAX_SAMPLES_EXT)); 636 EXPECT_FALSE(info_->validators()->render_buffer_parameter.IsValid( 637 GL_RENDERBUFFER_SAMPLES_EXT)); 638 } 639 640 TEST_F(FeatureInfoTest, InitializeEXT_multisampled_render_to_texture) { 641 SetupInitExpectations("GL_EXT_multisampled_render_to_texture"); 642 EXPECT_TRUE(info_->feature_flags( 643 ).multisampled_render_to_texture); 644 EXPECT_FALSE(info_->feature_flags( 645 ).use_img_for_multisampled_render_to_texture); 646 EXPECT_THAT(info_->extensions(), 647 HasSubstr("GL_EXT_multisampled_render_to_texture")); 648 EXPECT_TRUE(info_->validators()->g_l_state.IsValid( 649 GL_MAX_SAMPLES_EXT)); 650 EXPECT_TRUE(info_->validators()->render_buffer_parameter.IsValid( 651 GL_RENDERBUFFER_SAMPLES_EXT)); 652 EXPECT_TRUE(info_->validators()->frame_buffer_parameter.IsValid( 653 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT)); 654 } 655 656 TEST_F(FeatureInfoTest, InitializeIMG_multisampled_render_to_texture) { 657 SetupInitExpectations("GL_IMG_multisampled_render_to_texture"); 658 EXPECT_TRUE(info_->feature_flags( 659 ).multisampled_render_to_texture); 660 EXPECT_TRUE(info_->feature_flags( 661 ).use_img_for_multisampled_render_to_texture); 662 EXPECT_THAT(info_->extensions(), 663 HasSubstr("GL_EXT_multisampled_render_to_texture")); 664 EXPECT_TRUE(info_->validators()->g_l_state.IsValid( 665 GL_MAX_SAMPLES_EXT)); 666 EXPECT_TRUE(info_->validators()->render_buffer_parameter.IsValid( 667 GL_RENDERBUFFER_SAMPLES_EXT)); 668 EXPECT_TRUE(info_->validators()->frame_buffer_parameter.IsValid( 669 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT)); 670 } 671 672 TEST_F(FeatureInfoTest, InitializeEXT_texture_filter_anisotropic) { 673 SetupInitExpectations("GL_EXT_texture_filter_anisotropic"); 674 EXPECT_THAT(info_->extensions(), 675 HasSubstr("GL_EXT_texture_filter_anisotropic")); 676 EXPECT_TRUE(info_->validators()->texture_parameter.IsValid( 677 GL_TEXTURE_MAX_ANISOTROPY_EXT)); 678 EXPECT_TRUE(info_->validators()->g_l_state.IsValid( 679 GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT)); 680 } 681 682 TEST_F(FeatureInfoTest, InitializeEXT_ARB_depth_texture) { 683 SetupInitExpectations("GL_ARB_depth_texture"); 684 EXPECT_THAT(info_->extensions(), 685 HasSubstr("GL_GOOGLE_depth_texture")); 686 EXPECT_THAT(info_->extensions(), 687 HasSubstr("GL_CHROMIUM_depth_texture")); 688 EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid( 689 GL_DEPTH_COMPONENT)); 690 EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_DEPTH_COMPONENT)); 691 EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_DEPTH_STENCIL)); 692 EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_SHORT)); 693 EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_INT)); 694 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_DEPTH_COMPONENT).IsValid( 695 GL_UNSIGNED_SHORT)); 696 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_DEPTH_COMPONENT).IsValid( 697 GL_UNSIGNED_INT)); 698 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_DEPTH_STENCIL).IsValid( 699 GL_UNSIGNED_INT_24_8)); 700 } 701 702 TEST_F(FeatureInfoTest, InitializeOES_ARB_depth_texture) { 703 SetupInitExpectations("GL_OES_depth_texture"); 704 EXPECT_THAT(info_->extensions(), 705 HasSubstr("GL_GOOGLE_depth_texture")); 706 EXPECT_THAT(info_->extensions(), 707 HasSubstr("GL_CHROMIUM_depth_texture")); 708 EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid( 709 GL_DEPTH_COMPONENT)); 710 EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_DEPTH_COMPONENT)); 711 EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_DEPTH_STENCIL)); 712 EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_SHORT)); 713 EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_INT)); 714 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_DEPTH_COMPONENT).IsValid( 715 GL_UNSIGNED_SHORT)); 716 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_DEPTH_COMPONENT).IsValid( 717 GL_UNSIGNED_INT)); 718 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_DEPTH_STENCIL).IsValid( 719 GL_UNSIGNED_INT_24_8)); 720 } 721 722 TEST_F(FeatureInfoTest, InitializeANGLE_depth_texture) { 723 SetupInitExpectations("GL_ANGLE_depth_texture"); 724 EXPECT_THAT(info_->extensions(), 725 HasSubstr("GL_GOOGLE_depth_texture")); 726 EXPECT_THAT(info_->extensions(), 727 HasSubstr("GL_CHROMIUM_depth_texture")); 728 EXPECT_THAT(info_->extensions(), 729 Not(HasSubstr("GL_ANGLE_depth_texture"))); 730 EXPECT_TRUE(info_->feature_flags().angle_depth_texture); 731 EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid( 732 GL_DEPTH_COMPONENT)); 733 EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_DEPTH_COMPONENT)); 734 EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_DEPTH_STENCIL)); 735 EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_SHORT)); 736 EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_INT)); 737 EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid( 738 GL_DEPTH_COMPONENT16)); 739 EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid( 740 GL_DEPTH_COMPONENT32_OES)); 741 EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid( 742 GL_DEPTH24_STENCIL8_OES)); 743 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_DEPTH_COMPONENT).IsValid( 744 GL_UNSIGNED_SHORT)); 745 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_DEPTH_COMPONENT).IsValid( 746 GL_UNSIGNED_INT)); 747 EXPECT_FALSE(info_->GetTextureFormatValidator(GL_DEPTH_STENCIL).IsValid( 748 GL_UNSIGNED_INT_24_8)); 749 } 750 751 TEST_F(FeatureInfoTest, InitializeEXT_packed_depth_stencil) { 752 SetupInitExpectations("GL_EXT_packed_depth_stencil"); 753 EXPECT_THAT(info_->extensions(), 754 HasSubstr("GL_OES_packed_depth_stencil")); 755 EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid( 756 GL_DEPTH24_STENCIL8)); 757 EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid( 758 GL_DEPTH_COMPONENT)); 759 EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_DEPTH_COMPONENT)); 760 EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_SHORT)); 761 EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_INT)); 762 } 763 764 TEST_F(FeatureInfoTest, InitializeOES_packed_depth_stencil) { 765 SetupInitExpectations("GL_OES_packed_depth_stencil"); 766 EXPECT_THAT(info_->extensions(), 767 HasSubstr("GL_OES_packed_depth_stencil")); 768 EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid( 769 GL_DEPTH24_STENCIL8)); 770 EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid( 771 GL_DEPTH_COMPONENT)); 772 EXPECT_FALSE(info_->validators()->texture_format.IsValid(GL_DEPTH_COMPONENT)); 773 EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_SHORT)); 774 EXPECT_FALSE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_INT)); 775 } 776 777 TEST_F(FeatureInfoTest, 778 InitializeOES_packed_depth_stencil_and_GL_ARB_depth_texture) { 779 SetupInitExpectations("GL_OES_packed_depth_stencil GL_ARB_depth_texture"); 780 EXPECT_THAT(info_->extensions(), 781 HasSubstr("GL_OES_packed_depth_stencil")); 782 EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid( 783 GL_DEPTH24_STENCIL8)); 784 EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid( 785 GL_DEPTH_STENCIL)); 786 EXPECT_TRUE(info_->validators()->texture_format.IsValid( 787 GL_DEPTH_STENCIL)); 788 EXPECT_TRUE(info_->validators()->pixel_type.IsValid( 789 GL_UNSIGNED_INT_24_8)); 790 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_DEPTH_COMPONENT).IsValid( 791 GL_UNSIGNED_SHORT)); 792 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_DEPTH_COMPONENT).IsValid( 793 GL_UNSIGNED_INT)); 794 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_DEPTH_STENCIL).IsValid( 795 GL_UNSIGNED_INT_24_8)); 796 } 797 798 TEST_F(FeatureInfoTest, InitializeOES_depth24) { 799 SetupInitExpectations("GL_OES_depth24"); 800 EXPECT_TRUE(info_->feature_flags().oes_depth24); 801 EXPECT_THAT(info_->extensions(), HasSubstr("GL_OES_depth24")); 802 EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid( 803 GL_DEPTH_COMPONENT24)); 804 } 805 806 TEST_F(FeatureInfoTest, InitializeOES_standard_derivatives) { 807 SetupInitExpectations("GL_OES_standard_derivatives"); 808 EXPECT_THAT(info_->extensions(), HasSubstr("GL_OES_standard_derivatives")); 809 EXPECT_TRUE(info_->feature_flags().oes_standard_derivatives); 810 EXPECT_TRUE(info_->validators()->hint_target.IsValid( 811 GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES)); 812 EXPECT_TRUE(info_->validators()->g_l_state.IsValid( 813 GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES)); 814 } 815 816 TEST_F(FeatureInfoTest, InitializeOES_rgb8_rgba8) { 817 SetupInitExpectations("GL_OES_rgb8_rgba8"); 818 EXPECT_THAT(info_->extensions(), 819 HasSubstr("GL_OES_rgb8_rgba8")); 820 EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid( 821 GL_RGB8_OES)); 822 EXPECT_TRUE(info_->validators()->render_buffer_format.IsValid( 823 GL_RGBA8_OES)); 824 } 825 826 TEST_F(FeatureInfoTest, InitializeOES_EGL_image_external) { 827 SetupInitExpectations("GL_OES_EGL_image_external"); 828 EXPECT_THAT(info_->extensions(), 829 HasSubstr("GL_OES_EGL_image_external")); 830 EXPECT_TRUE(info_->feature_flags().oes_egl_image_external); 831 EXPECT_TRUE(info_->validators()->texture_bind_target.IsValid( 832 GL_TEXTURE_EXTERNAL_OES)); 833 EXPECT_TRUE(info_->validators()->get_tex_param_target.IsValid( 834 GL_TEXTURE_EXTERNAL_OES)); 835 EXPECT_TRUE(info_->validators()->texture_parameter.IsValid( 836 GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES)); 837 EXPECT_TRUE(info_->validators()->g_l_state.IsValid( 838 GL_TEXTURE_BINDING_EXTERNAL_OES)); 839 } 840 841 TEST_F(FeatureInfoTest, InitializeOES_compressed_ETC1_RGB8_texture) { 842 SetupInitExpectations("GL_OES_compressed_ETC1_RGB8_texture"); 843 EXPECT_THAT(info_->extensions(), 844 HasSubstr("GL_OES_compressed_ETC1_RGB8_texture")); 845 EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( 846 GL_ETC1_RGB8_OES)); 847 EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid( 848 GL_ETC1_RGB8_OES)); 849 } 850 851 TEST_F(FeatureInfoTest, InitializeAMD_compressed_ATC_texture) { 852 SetupInitExpectations("GL_AMD_compressed_ATC_texture"); 853 EXPECT_THAT(info_->extensions(), 854 HasSubstr("GL_AMD_compressed_ATC_texture")); 855 EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( 856 GL_ATC_RGB_AMD)); 857 EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( 858 GL_ATC_RGBA_EXPLICIT_ALPHA_AMD)); 859 EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( 860 GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD)); 861 } 862 863 TEST_F(FeatureInfoTest, InitializeIMG_texture_compression_pvrtc) { 864 SetupInitExpectations("GL_IMG_texture_compression_pvrtc"); 865 EXPECT_THAT(info_->extensions(), 866 HasSubstr("GL_IMG_texture_compression_pvrtc")); 867 EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( 868 GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG)); 869 EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( 870 GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG)); 871 EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( 872 GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG)); 873 EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( 874 GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG)); 875 } 876 877 TEST_F(FeatureInfoTest, InitializeEXT_occlusion_query_boolean) { 878 SetupInitExpectations("GL_EXT_occlusion_query_boolean"); 879 EXPECT_THAT(info_->extensions(), 880 HasSubstr("GL_EXT_occlusion_query_boolean")); 881 EXPECT_TRUE(info_->feature_flags().occlusion_query_boolean); 882 EXPECT_FALSE(info_->feature_flags( 883 ).use_arb_occlusion_query2_for_occlusion_query_boolean); 884 EXPECT_FALSE(info_->feature_flags( 885 ).use_arb_occlusion_query_for_occlusion_query_boolean); 886 } 887 888 TEST_F(FeatureInfoTest, InitializeARB_occlusion_query) { 889 SetupInitExpectations("GL_ARB_occlusion_query"); 890 EXPECT_THAT(info_->extensions(), 891 HasSubstr("GL_EXT_occlusion_query_boolean")); 892 EXPECT_TRUE(info_->feature_flags().occlusion_query_boolean); 893 EXPECT_FALSE(info_->feature_flags( 894 ).use_arb_occlusion_query2_for_occlusion_query_boolean); 895 EXPECT_TRUE(info_->feature_flags( 896 ).use_arb_occlusion_query_for_occlusion_query_boolean); 897 } 898 899 TEST_F(FeatureInfoTest, InitializeARB_occlusion_query2) { 900 SetupInitExpectations("GL_ARB_occlusion_query2 GL_ARB_occlusion_query2"); 901 EXPECT_THAT(info_->extensions(), 902 HasSubstr("GL_EXT_occlusion_query_boolean")); 903 EXPECT_TRUE(info_->feature_flags().occlusion_query_boolean); 904 EXPECT_TRUE(info_->feature_flags( 905 ).use_arb_occlusion_query2_for_occlusion_query_boolean); 906 EXPECT_FALSE(info_->feature_flags( 907 ).use_arb_occlusion_query_for_occlusion_query_boolean); 908 } 909 910 TEST_F(FeatureInfoTest, InitializeOES_vertex_array_object) { 911 SetupInitExpectations("GL_OES_vertex_array_object"); 912 EXPECT_THAT(info_->extensions(), 913 HasSubstr("GL_OES_vertex_array_object")); 914 EXPECT_TRUE(info_->feature_flags().native_vertex_array_object); 915 } 916 917 TEST_F(FeatureInfoTest, InitializeARB_vertex_array_object) { 918 SetupInitExpectations("GL_ARB_vertex_array_object"); 919 EXPECT_THAT(info_->extensions(), 920 HasSubstr("GL_OES_vertex_array_object")); 921 EXPECT_TRUE(info_->feature_flags().native_vertex_array_object); 922 } 923 924 TEST_F(FeatureInfoTest, InitializeAPPLE_vertex_array_object) { 925 SetupInitExpectations("GL_APPLE_vertex_array_object"); 926 EXPECT_THAT(info_->extensions(), 927 HasSubstr("GL_OES_vertex_array_object")); 928 EXPECT_TRUE(info_->feature_flags().native_vertex_array_object); 929 } 930 931 TEST_F(FeatureInfoTest, InitializeNo_vertex_array_object) { 932 SetupInitExpectations(""); 933 // Even if the native extensions are not available the implementation 934 // may still emulate the GL_OES_vertex_array_object functionality. In this 935 // scenario native_vertex_array_object must be false. 936 EXPECT_THAT(info_->extensions(), 937 HasSubstr("GL_OES_vertex_array_object")); 938 EXPECT_FALSE(info_->feature_flags().native_vertex_array_object); 939 } 940 941 TEST_F(FeatureInfoTest, InitializeOES_element_index_uint) { 942 SetupInitExpectations("GL_OES_element_index_uint"); 943 EXPECT_THAT(info_->extensions(), 944 HasSubstr("GL_OES_element_index_uint")); 945 EXPECT_TRUE(info_->validators()->index_type.IsValid(GL_UNSIGNED_INT)); 946 } 947 948 TEST_F(FeatureInfoTest, InitializeVAOsWithClientSideArrays) { 949 CommandLine command_line(0, NULL); 950 command_line.AppendSwitchASCII( 951 switches::kGpuDriverBugWorkarounds, 952 base::IntToString(gpu::USE_CLIENT_SIDE_ARRAYS_FOR_STREAM_BUFFERS)); 953 SetupInitExpectationsWithCommandLine("GL_OES_vertex_array_object", 954 command_line); 955 EXPECT_TRUE(info_->workarounds().use_client_side_arrays_for_stream_buffers); 956 EXPECT_FALSE(info_->feature_flags().native_vertex_array_object); 957 } 958 959 TEST_F(FeatureInfoTest, InitializeEXT_blend_minmax) { 960 SetupInitExpectations("GL_EXT_blend_minmax"); 961 EXPECT_THAT(info_->extensions(), HasSubstr("GL_EXT_blend_minmax")); 962 EXPECT_TRUE(info_->validators()->equation.IsValid(GL_MIN_EXT)); 963 EXPECT_TRUE(info_->validators()->equation.IsValid(GL_MAX_EXT)); 964 } 965 966 TEST_F(FeatureInfoTest, InitializeEXT_frag_depth) { 967 SetupInitExpectations("GL_EXT_frag_depth"); 968 EXPECT_TRUE(info_->feature_flags().ext_frag_depth); 969 EXPECT_THAT(info_->extensions(), HasSubstr("GL_EXT_frag_depth")); 970 } 971 972 TEST_F(FeatureInfoTest, InitializeEXT_shader_texture_lod) { 973 SetupInitExpectations("GL_EXT_shader_texture_lod"); 974 EXPECT_TRUE(info_->feature_flags().ext_shader_texture_lod); 975 EXPECT_THAT(info_->extensions(), HasSubstr("GL_EXT_shader_texture_lod")); 976 } 977 978 TEST_F(FeatureInfoTest, InitializeEXT_discard_framebuffer) { 979 SetupInitExpectations("GL_EXT_discard_framebuffer"); 980 EXPECT_TRUE(info_->feature_flags().ext_discard_framebuffer); 981 EXPECT_THAT(info_->extensions(), HasSubstr("GL_EXT_discard_framebuffer")); 982 } 983 984 TEST_F(FeatureInfoTest, InitializeSamplersWithARBSamplerObjects) { 985 SetupInitExpectationsWithGLVersion( 986 "GL_ARB_sampler_objects", "", "OpenGL 3.0"); 987 EXPECT_TRUE(info_->feature_flags().enable_samplers); 988 } 989 990 TEST_F(FeatureInfoTest, InitializeWithES3) { 991 SetupInitExpectationsWithGLVersion("", "", "OpenGL ES 3.0"); 992 EXPECT_TRUE(info_->feature_flags().enable_samplers); 993 EXPECT_TRUE(info_->feature_flags().map_buffer_range); 994 EXPECT_TRUE(info_->feature_flags().ext_discard_framebuffer); 995 EXPECT_THAT(info_->extensions(), HasSubstr("GL_EXT_discard_framebuffer")); 996 EXPECT_TRUE(info_->feature_flags().chromium_framebuffer_multisample); 997 EXPECT_TRUE(info_->feature_flags().use_core_framebuffer_multisample); 998 EXPECT_THAT(info_->extensions(), 999 HasSubstr("GL_CHROMIUM_framebuffer_multisample")); 1000 EXPECT_TRUE(info_->feature_flags().use_async_readpixels); 1001 EXPECT_TRUE(info_->feature_flags().oes_depth24); 1002 EXPECT_THAT(info_->extensions(), HasSubstr("GL_GOOGLE_depth_texture")); 1003 EXPECT_THAT(info_->extensions(), HasSubstr("GL_CHROMIUM_depth_texture")); 1004 EXPECT_TRUE(info_->validators()->pixel_type.IsValid(GL_UNSIGNED_INT_24_8)); 1005 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_DEPTH_COMPONENT) 1006 .IsValid(GL_UNSIGNED_SHORT)); 1007 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_DEPTH_COMPONENT) 1008 .IsValid(GL_UNSIGNED_INT)); 1009 EXPECT_TRUE(info_->GetTextureFormatValidator(GL_DEPTH_STENCIL) 1010 .IsValid(GL_UNSIGNED_INT_24_8)); 1011 EXPECT_TRUE(info_->feature_flags().packed_depth24_stencil8); 1012 EXPECT_THAT(info_->extensions(), HasSubstr("GL_OES_depth24")); 1013 EXPECT_TRUE( 1014 info_->validators()->render_buffer_format.IsValid(GL_DEPTH_COMPONENT24)); 1015 EXPECT_TRUE( 1016 info_->validators()->render_buffer_format.IsValid(GL_DEPTH24_STENCIL8)); 1017 EXPECT_TRUE( 1018 info_->validators()->texture_internal_format.IsValid(GL_DEPTH_STENCIL)); 1019 EXPECT_TRUE(info_->validators()->texture_format.IsValid(GL_DEPTH_STENCIL)); 1020 EXPECT_TRUE(info_->feature_flags().chromium_sync_query); 1021 EXPECT_TRUE(gfx::GLFence::IsSupported()); 1022 } 1023 1024 TEST_F(FeatureInfoTest, InitializeWithoutSamplers) { 1025 SetupInitExpectationsWithGLVersion("", "", "OpenGL GL 3.0"); 1026 EXPECT_FALSE(info_->feature_flags().enable_samplers); 1027 } 1028 1029 TEST_F(FeatureInfoTest, ParseDriverBugWorkaroundsSingle) { 1030 CommandLine command_line(0, NULL); 1031 command_line.AppendSwitchASCII( 1032 switches::kGpuDriverBugWorkarounds, 1033 base::IntToString(gpu::EXIT_ON_CONTEXT_LOST)); 1034 // Workarounds should get parsed without the need for a context. 1035 SetupWithCommandLine(command_line); 1036 EXPECT_TRUE(info_->workarounds().exit_on_context_lost); 1037 } 1038 1039 TEST_F(FeatureInfoTest, ParseDriverBugWorkaroundsMultiple) { 1040 CommandLine command_line(0, NULL); 1041 command_line.AppendSwitchASCII( 1042 switches::kGpuDriverBugWorkarounds, 1043 base::IntToString(gpu::EXIT_ON_CONTEXT_LOST) + "," + 1044 base::IntToString(gpu::MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_1024) + "," + 1045 base::IntToString(gpu::MAX_TEXTURE_SIZE_LIMIT_4096)); 1046 // Workarounds should get parsed without the need for a context. 1047 SetupWithCommandLine(command_line); 1048 EXPECT_TRUE(info_->workarounds().exit_on_context_lost); 1049 EXPECT_EQ(1024, info_->workarounds().max_cube_map_texture_size); 1050 EXPECT_EQ(4096, info_->workarounds().max_texture_size); 1051 } 1052 1053 TEST_F(FeatureInfoTest, InitializeWithARBSync) { 1054 SetupInitExpectations("GL_ARB_sync"); 1055 EXPECT_TRUE(info_->feature_flags().chromium_sync_query); 1056 EXPECT_TRUE(gfx::GLFence::IsSupported()); 1057 } 1058 1059 TEST_F(FeatureInfoTest, InitializeWithNVFence) { 1060 SetupInitExpectations("GL_NV_fence"); 1061 EXPECT_TRUE(info_->feature_flags().chromium_sync_query); 1062 EXPECT_TRUE(gfx::GLFence::IsSupported()); 1063 } 1064 1065 TEST_F(FeatureInfoTest, ARBSyncDisabled) { 1066 CommandLine command_line(0, NULL); 1067 command_line.AppendSwitchASCII( 1068 switches::kGpuDriverBugWorkarounds, 1069 base::IntToString(gpu::DISABLE_ARB_SYNC)); 1070 SetupInitExpectationsWithCommandLine("GL_ARB_sync", command_line); 1071 EXPECT_FALSE(info_->feature_flags().chromium_sync_query); 1072 EXPECT_FALSE(gfx::GLFence::IsSupported()); 1073 } 1074 1075 } // namespace gles2 1076 } // namespace gpu 1077