OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "gpu/command_buffer/service/feature_info.h" | 5 #include "gpu/command_buffer/service/feature_info.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 enable_shader_name_hashing(false), | 132 enable_shader_name_hashing(false), |
133 enable_samplers(false), | 133 enable_samplers(false), |
134 ext_draw_buffers(false), | 134 ext_draw_buffers(false), |
135 nv_draw_buffers(false), | 135 nv_draw_buffers(false), |
136 ext_frag_depth(false), | 136 ext_frag_depth(false), |
137 ext_shader_texture_lod(false), | 137 ext_shader_texture_lod(false), |
138 use_async_readpixels(false), | 138 use_async_readpixels(false), |
139 map_buffer_range(false), | 139 map_buffer_range(false), |
140 ext_discard_framebuffer(false), | 140 ext_discard_framebuffer(false), |
141 angle_depth_texture(false), | 141 angle_depth_texture(false), |
142 is_angle(false), | |
143 is_swiftshader(false), | 142 is_swiftshader(false), |
144 angle_texture_usage(false), | 143 angle_texture_usage(false), |
145 ext_texture_storage(false), | 144 ext_texture_storage(false), |
146 chromium_path_rendering(false), | 145 chromium_path_rendering(false), |
147 blend_equation_advanced(false), | 146 blend_equation_advanced(false), |
148 blend_equation_advanced_coherent(false), | 147 blend_equation_advanced_coherent(false), |
149 ext_texture_rg(false), | 148 ext_texture_rg(false), |
150 enable_subscribe_uniform(false) { | 149 enable_subscribe_uniform(false) { |
151 } | 150 } |
152 | 151 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 return result; | 263 return result; |
265 } | 264 } |
266 | 265 |
267 void FeatureInfo::InitializeFeatures() { | 266 void FeatureInfo::InitializeFeatures() { |
268 // Figure out what extensions to turn on. | 267 // Figure out what extensions to turn on. |
269 StringSet extensions( | 268 StringSet extensions( |
270 reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS))); | 269 reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS))); |
271 | 270 |
272 const char* renderer_str = | 271 const char* renderer_str = |
273 reinterpret_cast<const char*>(glGetString(GL_RENDERER)); | 272 reinterpret_cast<const char*>(glGetString(GL_RENDERER)); |
274 if (renderer_str) { | |
275 feature_flags_.is_angle = StartsWithASCII(renderer_str, "ANGLE", true); | |
276 } | |
277 | |
278 bool is_es3 = false; | |
279 const char* version_str = | 273 const char* version_str = |
280 reinterpret_cast<const char*>(glGetString(GL_VERSION)); | 274 reinterpret_cast<const char*>(glGetString(GL_VERSION)); |
281 if (version_str) { | 275 |
282 std::string lstr(base::StringToLowerASCII(std::string(version_str))); | 276 gl_version_info_.reset(new gfx::GLVersionInfo(version_str, renderer_str)); |
283 is_es3 = (lstr.substr(0, 12) == "opengl es 3."); | |
284 } | |
285 | 277 |
286 AddExtensionString("GL_ANGLE_translated_shader_source"); | 278 AddExtensionString("GL_ANGLE_translated_shader_source"); |
287 AddExtensionString("GL_CHROMIUM_async_pixel_transfers"); | 279 AddExtensionString("GL_CHROMIUM_async_pixel_transfers"); |
288 AddExtensionString("GL_CHROMIUM_bind_uniform_location"); | 280 AddExtensionString("GL_CHROMIUM_bind_uniform_location"); |
289 AddExtensionString("GL_CHROMIUM_command_buffer_query"); | 281 AddExtensionString("GL_CHROMIUM_command_buffer_query"); |
290 AddExtensionString("GL_CHROMIUM_command_buffer_latency_query"); | 282 AddExtensionString("GL_CHROMIUM_command_buffer_latency_query"); |
291 AddExtensionString("GL_CHROMIUM_copy_texture"); | 283 AddExtensionString("GL_CHROMIUM_copy_texture"); |
292 AddExtensionString("GL_CHROMIUM_get_error_query"); | 284 AddExtensionString("GL_CHROMIUM_get_error_query"); |
293 AddExtensionString("GL_CHROMIUM_lose_context"); | 285 AddExtensionString("GL_CHROMIUM_lose_context"); |
294 AddExtensionString("GL_CHROMIUM_pixel_transfer_buffer_object"); | 286 AddExtensionString("GL_CHROMIUM_pixel_transfer_buffer_object"); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 // | 371 // |
380 // Therefore we made up GL_GOOGLE_depth_texture / GL_CHROMIUM_depth_texture. | 372 // Therefore we made up GL_GOOGLE_depth_texture / GL_CHROMIUM_depth_texture. |
381 // | 373 // |
382 // GL_GOOGLE_depth_texture is legacy. As we exposed it into NaCl we can't | 374 // GL_GOOGLE_depth_texture is legacy. As we exposed it into NaCl we can't |
383 // get rid of it. | 375 // get rid of it. |
384 // | 376 // |
385 bool enable_depth_texture = false; | 377 bool enable_depth_texture = false; |
386 if (!workarounds_.disable_depth_texture && | 378 if (!workarounds_.disable_depth_texture && |
387 (extensions.Contains("GL_ARB_depth_texture") || | 379 (extensions.Contains("GL_ARB_depth_texture") || |
388 extensions.Contains("GL_OES_depth_texture") || | 380 extensions.Contains("GL_OES_depth_texture") || |
389 extensions.Contains("GL_ANGLE_depth_texture") || is_es3)) { | 381 extensions.Contains("GL_ANGLE_depth_texture") || |
| 382 gl_version_info_->is_es3)) { |
390 enable_depth_texture = true; | 383 enable_depth_texture = true; |
391 feature_flags_.angle_depth_texture = | 384 feature_flags_.angle_depth_texture = |
392 extensions.Contains("GL_ANGLE_depth_texture"); | 385 extensions.Contains("GL_ANGLE_depth_texture"); |
393 } | 386 } |
394 | 387 |
395 if (enable_depth_texture) { | 388 if (enable_depth_texture) { |
396 AddExtensionString("GL_CHROMIUM_depth_texture"); | 389 AddExtensionString("GL_CHROMIUM_depth_texture"); |
397 AddExtensionString("GL_GOOGLE_depth_texture"); | 390 AddExtensionString("GL_GOOGLE_depth_texture"); |
398 texture_format_validators_[GL_DEPTH_COMPONENT].AddValue(GL_UNSIGNED_SHORT); | 391 texture_format_validators_[GL_DEPTH_COMPONENT].AddValue(GL_UNSIGNED_SHORT); |
399 texture_format_validators_[GL_DEPTH_COMPONENT].AddValue(GL_UNSIGNED_INT); | 392 texture_format_validators_[GL_DEPTH_COMPONENT].AddValue(GL_UNSIGNED_INT); |
400 validators_.texture_internal_format.AddValue(GL_DEPTH_COMPONENT); | 393 validators_.texture_internal_format.AddValue(GL_DEPTH_COMPONENT); |
401 validators_.texture_format.AddValue(GL_DEPTH_COMPONENT); | 394 validators_.texture_format.AddValue(GL_DEPTH_COMPONENT); |
402 validators_.pixel_type.AddValue(GL_UNSIGNED_SHORT); | 395 validators_.pixel_type.AddValue(GL_UNSIGNED_SHORT); |
403 validators_.pixel_type.AddValue(GL_UNSIGNED_INT); | 396 validators_.pixel_type.AddValue(GL_UNSIGNED_INT); |
404 } | 397 } |
405 | 398 |
406 if (extensions.Contains("GL_EXT_packed_depth_stencil") || | 399 if (extensions.Contains("GL_EXT_packed_depth_stencil") || |
407 extensions.Contains("GL_OES_packed_depth_stencil") || is_es3) { | 400 extensions.Contains("GL_OES_packed_depth_stencil") || |
| 401 gl_version_info_->is_es3) { |
408 AddExtensionString("GL_OES_packed_depth_stencil"); | 402 AddExtensionString("GL_OES_packed_depth_stencil"); |
409 feature_flags_.packed_depth24_stencil8 = true; | 403 feature_flags_.packed_depth24_stencil8 = true; |
410 if (enable_depth_texture) { | 404 if (enable_depth_texture) { |
411 texture_format_validators_[GL_DEPTH_STENCIL] | 405 texture_format_validators_[GL_DEPTH_STENCIL] |
412 .AddValue(GL_UNSIGNED_INT_24_8); | 406 .AddValue(GL_UNSIGNED_INT_24_8); |
413 validators_.texture_internal_format.AddValue(GL_DEPTH_STENCIL); | 407 validators_.texture_internal_format.AddValue(GL_DEPTH_STENCIL); |
414 validators_.texture_format.AddValue(GL_DEPTH_STENCIL); | 408 validators_.texture_format.AddValue(GL_DEPTH_STENCIL); |
415 validators_.pixel_type.AddValue(GL_UNSIGNED_INT_24_8); | 409 validators_.pixel_type.AddValue(GL_UNSIGNED_INT_24_8); |
416 } | 410 } |
417 validators_.render_buffer_format.AddValue(GL_DEPTH24_STENCIL8); | 411 validators_.render_buffer_format.AddValue(GL_DEPTH24_STENCIL8); |
418 } | 412 } |
419 | 413 |
420 if (is_es3 || extensions.Contains("GL_OES_vertex_array_object") || | 414 if (gl_version_info_->is_es3 || |
| 415 extensions.Contains("GL_OES_vertex_array_object") || |
421 extensions.Contains("GL_ARB_vertex_array_object") || | 416 extensions.Contains("GL_ARB_vertex_array_object") || |
422 extensions.Contains("GL_APPLE_vertex_array_object")) { | 417 extensions.Contains("GL_APPLE_vertex_array_object")) { |
423 feature_flags_.native_vertex_array_object = true; | 418 feature_flags_.native_vertex_array_object = true; |
424 } | 419 } |
425 | 420 |
426 // If we're using client_side_arrays we have to emulate | 421 // If we're using client_side_arrays we have to emulate |
427 // vertex array objects since vertex array objects do not work | 422 // vertex array objects since vertex array objects do not work |
428 // with client side arrays. | 423 // with client side arrays. |
429 if (workarounds_.use_client_side_arrays_for_stream_buffers) { | 424 if (workarounds_.use_client_side_arrays_for_stream_buffers) { |
430 feature_flags_.native_vertex_array_object = false; | 425 feature_flags_.native_vertex_array_object = false; |
431 } | 426 } |
432 | 427 |
433 if (is_es3 || extensions.Contains("GL_OES_element_index_uint") || | 428 if (gl_version_info_->is_es3 || |
| 429 extensions.Contains("GL_OES_element_index_uint") || |
434 gfx::HasDesktopGLFeatures()) { | 430 gfx::HasDesktopGLFeatures()) { |
435 AddExtensionString("GL_OES_element_index_uint"); | 431 AddExtensionString("GL_OES_element_index_uint"); |
436 validators_.index_type.AddValue(GL_UNSIGNED_INT); | 432 validators_.index_type.AddValue(GL_UNSIGNED_INT); |
437 } | 433 } |
438 | 434 |
439 // With EXT_sRGB, unsized SRGB_EXT and SRGB_ALPHA_EXT are accepted by the | 435 // With EXT_sRGB, unsized SRGB_EXT and SRGB_ALPHA_EXT are accepted by the |
440 // <format> and <internalformat> parameter of TexImage2D. GLES3 adds support | 436 // <format> and <internalformat> parameter of TexImage2D. GLES3 adds support |
441 // for SRGB Textures but the accepted internal formats for TexImage2D are only | 437 // for SRGB Textures but the accepted internal formats for TexImage2D are only |
442 // sized formats GL_SRGB8 and GL_SRGB8_ALPHA8. Also, SRGB_EXT isn't a valid | 438 // sized formats GL_SRGB8 and GL_SRGB8_ALPHA8. Also, SRGB_EXT isn't a valid |
443 // <format> in this case. So, even with GLES3 explicitly check for | 439 // <format> in this case. So, even with GLES3 explicitly check for |
444 // GL_EXT_sRGB. | 440 // GL_EXT_sRGB. |
445 if (((is_es3 || extensions.Contains("GL_OES_rgb8_rgba8")) && | 441 if (((gl_version_info_->is_es3 || |
| 442 extensions.Contains("GL_OES_rgb8_rgba8")) && |
446 extensions.Contains("GL_EXT_sRGB")) || gfx::HasDesktopGLFeatures()) { | 443 extensions.Contains("GL_EXT_sRGB")) || gfx::HasDesktopGLFeatures()) { |
447 AddExtensionString("GL_EXT_sRGB"); | 444 AddExtensionString("GL_EXT_sRGB"); |
448 texture_format_validators_[GL_SRGB_EXT].AddValue(GL_UNSIGNED_BYTE); | 445 texture_format_validators_[GL_SRGB_EXT].AddValue(GL_UNSIGNED_BYTE); |
449 texture_format_validators_[GL_SRGB_ALPHA_EXT].AddValue(GL_UNSIGNED_BYTE); | 446 texture_format_validators_[GL_SRGB_ALPHA_EXT].AddValue(GL_UNSIGNED_BYTE); |
450 validators_.texture_internal_format.AddValue(GL_SRGB_EXT); | 447 validators_.texture_internal_format.AddValue(GL_SRGB_EXT); |
451 validators_.texture_internal_format.AddValue(GL_SRGB_ALPHA_EXT); | 448 validators_.texture_internal_format.AddValue(GL_SRGB_ALPHA_EXT); |
452 validators_.texture_format.AddValue(GL_SRGB_EXT); | 449 validators_.texture_format.AddValue(GL_SRGB_EXT); |
453 validators_.texture_format.AddValue(GL_SRGB_ALPHA_EXT); | 450 validators_.texture_format.AddValue(GL_SRGB_ALPHA_EXT); |
454 validators_.render_buffer_format.AddValue(GL_SRGB8_ALPHA8_EXT); | 451 validators_.render_buffer_format.AddValue(GL_SRGB8_ALPHA8_EXT); |
455 validators_.frame_buffer_parameter.AddValue( | 452 validators_.frame_buffer_parameter.AddValue( |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 validators_.render_buffer_format.AddValue(GL_BGRA8_EXT); | 493 validators_.render_buffer_format.AddValue(GL_BGRA8_EXT); |
497 } | 494 } |
498 | 495 |
499 if (extensions.Contains("GL_OES_rgb8_rgba8") || gfx::HasDesktopGLFeatures()) { | 496 if (extensions.Contains("GL_OES_rgb8_rgba8") || gfx::HasDesktopGLFeatures()) { |
500 AddExtensionString("GL_OES_rgb8_rgba8"); | 497 AddExtensionString("GL_OES_rgb8_rgba8"); |
501 validators_.render_buffer_format.AddValue(GL_RGB8_OES); | 498 validators_.render_buffer_format.AddValue(GL_RGB8_OES); |
502 validators_.render_buffer_format.AddValue(GL_RGBA8_OES); | 499 validators_.render_buffer_format.AddValue(GL_RGBA8_OES); |
503 } | 500 } |
504 | 501 |
505 // Check if we should allow GL_OES_texture_npot | 502 // Check if we should allow GL_OES_texture_npot |
506 if (is_es3 || extensions.Contains("GL_ARB_texture_non_power_of_two") || | 503 if (gl_version_info_->is_es3 || |
| 504 extensions.Contains("GL_ARB_texture_non_power_of_two") || |
507 extensions.Contains("GL_OES_texture_npot")) { | 505 extensions.Contains("GL_OES_texture_npot")) { |
508 AddExtensionString("GL_OES_texture_npot"); | 506 AddExtensionString("GL_OES_texture_npot"); |
509 feature_flags_.npot_ok = true; | 507 feature_flags_.npot_ok = true; |
510 } | 508 } |
511 | 509 |
512 // Check if we should allow GL_OES_texture_float, GL_OES_texture_half_float, | 510 // Check if we should allow GL_OES_texture_float, GL_OES_texture_half_float, |
513 // GL_OES_texture_float_linear, GL_OES_texture_half_float_linear | 511 // GL_OES_texture_float_linear, GL_OES_texture_half_float_linear |
514 bool enable_texture_float = false; | 512 bool enable_texture_float = false; |
515 bool enable_texture_float_linear = false; | 513 bool enable_texture_float_linear = false; |
516 bool enable_texture_half_float = false; | 514 bool enable_texture_half_float = false; |
(...skipping 11 matching lines...) Expand all Loading... |
528 // GLES3 adds support for Float type by default but it doesn't support all | 526 // GLES3 adds support for Float type by default but it doesn't support all |
529 // formats as GL_OES_texture_float(i.e.LUMINANCE_ALPHA,LUMINANCE and Alpha) | 527 // formats as GL_OES_texture_float(i.e.LUMINANCE_ALPHA,LUMINANCE and Alpha) |
530 if (extensions.Contains("GL_OES_texture_float")) { | 528 if (extensions.Contains("GL_OES_texture_float")) { |
531 enable_texture_float = true; | 529 enable_texture_float = true; |
532 if (extensions.Contains("GL_OES_texture_float_linear")) { | 530 if (extensions.Contains("GL_OES_texture_float_linear")) { |
533 enable_texture_float_linear = true; | 531 enable_texture_float_linear = true; |
534 } | 532 } |
535 // This extension allows a variety of floating point formats to be | 533 // This extension allows a variety of floating point formats to be |
536 // rendered to via framebuffer objects. Enable it's usage only if | 534 // rendered to via framebuffer objects. Enable it's usage only if |
537 // support for Floating textures is enabled. | 535 // support for Floating textures is enabled. |
538 if ((is_es3 && extensions.Contains("GL_EXT_color_buffer_float")) || | 536 if ((gl_version_info_->is_es3 && |
539 feature_flags_.is_angle) { | 537 extensions.Contains("GL_EXT_color_buffer_float")) || |
| 538 gl_version_info_->is_angle) { |
540 may_enable_chromium_color_buffer_float = true; | 539 may_enable_chromium_color_buffer_float = true; |
541 } | 540 } |
542 } | 541 } |
543 | 542 |
544 // TODO(dshwang): GLES3 supports half float by default but GL_HALF_FLOAT_OES | 543 // TODO(dshwang): GLES3 supports half float by default but GL_HALF_FLOAT_OES |
545 // isn't equal to GL_HALF_FLOAT. | 544 // isn't equal to GL_HALF_FLOAT. |
546 if (extensions.Contains("GL_OES_texture_half_float")) { | 545 if (extensions.Contains("GL_OES_texture_half_float")) { |
547 enable_texture_half_float = true; | 546 enable_texture_half_float = true; |
548 if (extensions.Contains("GL_OES_texture_half_float_linear")) { | 547 if (extensions.Contains("GL_OES_texture_half_float_linear")) { |
549 enable_texture_half_float_linear = true; | 548 enable_texture_half_float_linear = true; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
631 if (statusRGB == GL_FRAMEBUFFER_COMPLETE) { | 630 if (statusRGB == GL_FRAMEBUFFER_COMPLETE) { |
632 validators_.texture_internal_format.AddValue(GL_RGB32F); | 631 validators_.texture_internal_format.AddValue(GL_RGB32F); |
633 feature_flags_.chromium_color_buffer_float_rgb = true; | 632 feature_flags_.chromium_color_buffer_float_rgb = true; |
634 AddExtensionString("GL_CHROMIUM_color_buffer_float_rgb"); | 633 AddExtensionString("GL_CHROMIUM_color_buffer_float_rgb"); |
635 } | 634 } |
636 } | 635 } |
637 | 636 |
638 // Check for multisample support | 637 // Check for multisample support |
639 if (!workarounds_.disable_multisampling) { | 638 if (!workarounds_.disable_multisampling) { |
640 bool ext_has_multisample = | 639 bool ext_has_multisample = |
641 extensions.Contains("GL_EXT_framebuffer_multisample") || is_es3; | 640 extensions.Contains("GL_EXT_framebuffer_multisample") || |
642 if (feature_flags_.is_angle) { | 641 gl_version_info_->is_es3; |
| 642 if (gl_version_info_->is_angle) { |
643 ext_has_multisample |= | 643 ext_has_multisample |= |
644 extensions.Contains("GL_ANGLE_framebuffer_multisample"); | 644 extensions.Contains("GL_ANGLE_framebuffer_multisample"); |
645 } | 645 } |
646 feature_flags_.use_core_framebuffer_multisample = is_es3; | 646 feature_flags_.use_core_framebuffer_multisample = gl_version_info_->is_es3; |
647 if (ext_has_multisample) { | 647 if (ext_has_multisample) { |
648 feature_flags_.chromium_framebuffer_multisample = true; | 648 feature_flags_.chromium_framebuffer_multisample = true; |
649 validators_.frame_buffer_target.AddValue(GL_READ_FRAMEBUFFER_EXT); | 649 validators_.frame_buffer_target.AddValue(GL_READ_FRAMEBUFFER_EXT); |
650 validators_.frame_buffer_target.AddValue(GL_DRAW_FRAMEBUFFER_EXT); | 650 validators_.frame_buffer_target.AddValue(GL_DRAW_FRAMEBUFFER_EXT); |
651 validators_.g_l_state.AddValue(GL_READ_FRAMEBUFFER_BINDING_EXT); | 651 validators_.g_l_state.AddValue(GL_READ_FRAMEBUFFER_BINDING_EXT); |
652 validators_.g_l_state.AddValue(GL_MAX_SAMPLES_EXT); | 652 validators_.g_l_state.AddValue(GL_MAX_SAMPLES_EXT); |
653 validators_.render_buffer_parameter.AddValue(GL_RENDERBUFFER_SAMPLES_EXT); | 653 validators_.render_buffer_parameter.AddValue(GL_RENDERBUFFER_SAMPLES_EXT); |
654 AddExtensionString("GL_CHROMIUM_framebuffer_multisample"); | 654 AddExtensionString("GL_CHROMIUM_framebuffer_multisample"); |
655 } | 655 } |
656 if (extensions.Contains("GL_EXT_multisampled_render_to_texture")) { | 656 if (extensions.Contains("GL_EXT_multisampled_render_to_texture")) { |
657 feature_flags_.multisampled_render_to_texture = true; | 657 feature_flags_.multisampled_render_to_texture = true; |
658 } else if (extensions.Contains("GL_IMG_multisampled_render_to_texture")) { | 658 } else if (extensions.Contains("GL_IMG_multisampled_render_to_texture")) { |
659 feature_flags_.multisampled_render_to_texture = true; | 659 feature_flags_.multisampled_render_to_texture = true; |
660 feature_flags_.use_img_for_multisampled_render_to_texture = true; | 660 feature_flags_.use_img_for_multisampled_render_to_texture = true; |
661 } | 661 } |
662 if (feature_flags_.multisampled_render_to_texture) { | 662 if (feature_flags_.multisampled_render_to_texture) { |
663 validators_.render_buffer_parameter.AddValue( | 663 validators_.render_buffer_parameter.AddValue( |
664 GL_RENDERBUFFER_SAMPLES_EXT); | 664 GL_RENDERBUFFER_SAMPLES_EXT); |
665 validators_.g_l_state.AddValue(GL_MAX_SAMPLES_EXT); | 665 validators_.g_l_state.AddValue(GL_MAX_SAMPLES_EXT); |
666 validators_.frame_buffer_parameter.AddValue( | 666 validators_.frame_buffer_parameter.AddValue( |
667 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT); | 667 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT); |
668 AddExtensionString("GL_EXT_multisampled_render_to_texture"); | 668 AddExtensionString("GL_EXT_multisampled_render_to_texture"); |
669 } | 669 } |
670 } | 670 } |
671 | 671 |
672 if (extensions.Contains("GL_OES_depth24") || gfx::HasDesktopGLFeatures() || | 672 if (extensions.Contains("GL_OES_depth24") || gfx::HasDesktopGLFeatures() || |
673 is_es3) { | 673 gl_version_info_->is_es3) { |
674 AddExtensionString("GL_OES_depth24"); | 674 AddExtensionString("GL_OES_depth24"); |
675 feature_flags_.oes_depth24 = true; | 675 feature_flags_.oes_depth24 = true; |
676 validators_.render_buffer_format.AddValue(GL_DEPTH_COMPONENT24); | 676 validators_.render_buffer_format.AddValue(GL_DEPTH_COMPONENT24); |
677 } | 677 } |
678 | 678 |
679 if (!workarounds_.disable_oes_standard_derivatives && | 679 if (!workarounds_.disable_oes_standard_derivatives && |
680 (is_es3 || extensions.Contains("GL_OES_standard_derivatives") || | 680 (gl_version_info_->is_es3 || |
| 681 extensions.Contains("GL_OES_standard_derivatives") || |
681 gfx::HasDesktopGLFeatures())) { | 682 gfx::HasDesktopGLFeatures())) { |
682 AddExtensionString("GL_OES_standard_derivatives"); | 683 AddExtensionString("GL_OES_standard_derivatives"); |
683 feature_flags_.oes_standard_derivatives = true; | 684 feature_flags_.oes_standard_derivatives = true; |
684 validators_.hint_target.AddValue(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES); | 685 validators_.hint_target.AddValue(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES); |
685 validators_.g_l_state.AddValue(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES); | 686 validators_.g_l_state.AddValue(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES); |
686 } | 687 } |
687 | 688 |
688 if (extensions.Contains("GL_OES_EGL_image_external")) { | 689 if (extensions.Contains("GL_OES_EGL_image_external")) { |
689 AddExtensionString("GL_OES_EGL_image_external"); | 690 AddExtensionString("GL_OES_EGL_image_external"); |
690 feature_flags_.oes_egl_image_external = true; | 691 feature_flags_.oes_egl_image_external = true; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
764 validators_.texture_parameter.AddValue(GL_TEXTURE_USAGE_ANGLE); | 765 validators_.texture_parameter.AddValue(GL_TEXTURE_USAGE_ANGLE); |
765 } | 766 } |
766 | 767 |
767 // Note: Only APPLE_texture_format_BGRA8888 extension allows BGRA8_EXT in | 768 // Note: Only APPLE_texture_format_BGRA8888 extension allows BGRA8_EXT in |
768 // ES3's glTexStorage2D. We prefer support BGRA to texture storage. | 769 // ES3's glTexStorage2D. We prefer support BGRA to texture storage. |
769 // So we don't expose GL_EXT_texture_storage when ES3 + | 770 // So we don't expose GL_EXT_texture_storage when ES3 + |
770 // GL_EXT_texture_format_BGRA8888 because we fail the GL_BGRA8 requirement. | 771 // GL_EXT_texture_format_BGRA8888 because we fail the GL_BGRA8 requirement. |
771 // However we expose GL_EXT_texture_storage when just ES3 because we don't | 772 // However we expose GL_EXT_texture_storage when just ES3 because we don't |
772 // claim to handle GL_BGRA8. | 773 // claim to handle GL_BGRA8. |
773 bool support_texture_storage_on_es3 = | 774 bool support_texture_storage_on_es3 = |
774 (is_es3 && enable_immutable_texture_format_bgra_on_es3) || | 775 (gl_version_info_->is_es3 && |
775 (is_es3 && !enable_texture_format_bgra8888); | 776 enable_immutable_texture_format_bgra_on_es3) || |
| 777 (gl_version_info_->is_es3 && |
| 778 !enable_texture_format_bgra8888); |
776 if (extensions.Contains("GL_EXT_texture_storage") || | 779 if (extensions.Contains("GL_EXT_texture_storage") || |
777 extensions.Contains("GL_ARB_texture_storage") || | 780 extensions.Contains("GL_ARB_texture_storage") || |
778 support_texture_storage_on_es3) { | 781 support_texture_storage_on_es3) { |
779 feature_flags_.ext_texture_storage = true; | 782 feature_flags_.ext_texture_storage = true; |
780 AddExtensionString("GL_EXT_texture_storage"); | 783 AddExtensionString("GL_EXT_texture_storage"); |
781 validators_.texture_parameter.AddValue(GL_TEXTURE_IMMUTABLE_FORMAT_EXT); | 784 validators_.texture_parameter.AddValue(GL_TEXTURE_IMMUTABLE_FORMAT_EXT); |
782 if (enable_texture_format_bgra8888) | 785 if (enable_texture_format_bgra8888) |
783 validators_.texture_internal_format_storage.AddValue(GL_BGRA8_EXT); | 786 validators_.texture_internal_format_storage.AddValue(GL_BGRA8_EXT); |
784 if (enable_texture_float) { | 787 if (enable_texture_float) { |
785 validators_.texture_internal_format_storage.AddValue(GL_RGBA32F_EXT); | 788 validators_.texture_internal_format_storage.AddValue(GL_RGBA32F_EXT); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
818 !have_ext_occlusion_query_boolean && have_arb_occlusion_query2; | 821 !have_ext_occlusion_query_boolean && have_arb_occlusion_query2; |
819 feature_flags_.use_arb_occlusion_query_for_occlusion_query_boolean = | 822 feature_flags_.use_arb_occlusion_query_for_occlusion_query_boolean = |
820 !have_ext_occlusion_query_boolean && have_arb_occlusion_query && | 823 !have_ext_occlusion_query_boolean && have_arb_occlusion_query && |
821 !have_arb_occlusion_query2; | 824 !have_arb_occlusion_query2; |
822 } | 825 } |
823 | 826 |
824 if (!workarounds_.disable_angle_instanced_arrays && | 827 if (!workarounds_.disable_angle_instanced_arrays && |
825 (extensions.Contains("GL_ANGLE_instanced_arrays") || | 828 (extensions.Contains("GL_ANGLE_instanced_arrays") || |
826 (extensions.Contains("GL_ARB_instanced_arrays") && | 829 (extensions.Contains("GL_ARB_instanced_arrays") && |
827 extensions.Contains("GL_ARB_draw_instanced")) || | 830 extensions.Contains("GL_ARB_draw_instanced")) || |
828 is_es3)) { | 831 gl_version_info_->is_es3)) { |
829 AddExtensionString("GL_ANGLE_instanced_arrays"); | 832 AddExtensionString("GL_ANGLE_instanced_arrays"); |
830 feature_flags_.angle_instanced_arrays = true; | 833 feature_flags_.angle_instanced_arrays = true; |
831 validators_.vertex_attribute.AddValue(GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE); | 834 validators_.vertex_attribute.AddValue(GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE); |
832 } | 835 } |
833 | 836 |
834 bool vendor_agnostic_draw_buffers = | 837 bool vendor_agnostic_draw_buffers = |
835 extensions.Contains("GL_ARB_draw_buffers") || | 838 extensions.Contains("GL_ARB_draw_buffers") || |
836 extensions.Contains("GL_EXT_draw_buffers"); | 839 extensions.Contains("GL_EXT_draw_buffers"); |
837 if (!workarounds_.disable_ext_draw_buffers && | 840 if (!workarounds_.disable_ext_draw_buffers && |
838 (vendor_agnostic_draw_buffers || | 841 (vendor_agnostic_draw_buffers || |
839 (extensions.Contains("GL_NV_draw_buffers") && is_es3))) { | 842 (extensions.Contains("GL_NV_draw_buffers") && |
| 843 gl_version_info_->is_es3))) { |
840 AddExtensionString("GL_EXT_draw_buffers"); | 844 AddExtensionString("GL_EXT_draw_buffers"); |
841 feature_flags_.ext_draw_buffers = true; | 845 feature_flags_.ext_draw_buffers = true; |
842 | 846 |
843 // This flag is set to enable emulation of EXT_draw_buffers when we're | 847 // This flag is set to enable emulation of EXT_draw_buffers when we're |
844 // running on GLES 3.0+, NV_draw_buffers extension is supported and | 848 // running on GLES 3.0+, NV_draw_buffers extension is supported and |
845 // glDrawBuffers from GLES 3.0 core has been bound. It toggles using the | 849 // glDrawBuffers from GLES 3.0 core has been bound. It toggles using the |
846 // NV_draw_buffers extension directive instead of EXT_draw_buffers extension | 850 // NV_draw_buffers extension directive instead of EXT_draw_buffers extension |
847 // directive in ESSL 100 shaders translated by ANGLE, enabling them to write | 851 // directive in ESSL 100 shaders translated by ANGLE, enabling them to write |
848 // into multiple gl_FragData values, which is not by default possible in | 852 // into multiple gl_FragData values, which is not by default possible in |
849 // ESSL 100 with core GLES 3.0. For more information, see the | 853 // ESSL 100 with core GLES 3.0. For more information, see the |
(...skipping 14 matching lines...) Expand all Loading... |
864 validators_.g_l_state.AddValue(GL_MAX_DRAW_BUFFERS_ARB); | 868 validators_.g_l_state.AddValue(GL_MAX_DRAW_BUFFERS_ARB); |
865 GLint max_draw_buffers = 0; | 869 GLint max_draw_buffers = 0; |
866 glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &max_draw_buffers); | 870 glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &max_draw_buffers); |
867 for (GLenum i = GL_DRAW_BUFFER0_ARB; | 871 for (GLenum i = GL_DRAW_BUFFER0_ARB; |
868 i < static_cast<GLenum>(GL_DRAW_BUFFER0_ARB + max_draw_buffers); | 872 i < static_cast<GLenum>(GL_DRAW_BUFFER0_ARB + max_draw_buffers); |
869 ++i) { | 873 ++i) { |
870 validators_.g_l_state.AddValue(i); | 874 validators_.g_l_state.AddValue(i); |
871 } | 875 } |
872 } | 876 } |
873 | 877 |
874 if (is_es3 || extensions.Contains("GL_EXT_blend_minmax") || | 878 if (gl_version_info_->is_es3 || |
| 879 extensions.Contains("GL_EXT_blend_minmax") || |
875 gfx::HasDesktopGLFeatures()) { | 880 gfx::HasDesktopGLFeatures()) { |
876 AddExtensionString("GL_EXT_blend_minmax"); | 881 AddExtensionString("GL_EXT_blend_minmax"); |
877 validators_.equation.AddValue(GL_MIN_EXT); | 882 validators_.equation.AddValue(GL_MIN_EXT); |
878 validators_.equation.AddValue(GL_MAX_EXT); | 883 validators_.equation.AddValue(GL_MAX_EXT); |
879 COMPILE_ASSERT(GL_MIN_EXT == GL_MIN && GL_MAX_EXT == GL_MAX, | 884 COMPILE_ASSERT(GL_MIN_EXT == GL_MIN && GL_MAX_EXT == GL_MAX, |
880 min_max_variations_must_match); | 885 min_max_variations_must_match); |
881 } | 886 } |
882 | 887 |
883 // TODO(dshwang): GLES3 supports gl_FragDepth, not gl_FragDepthEXT. | 888 // TODO(dshwang): GLES3 supports gl_FragDepth, not gl_FragDepthEXT. |
884 if (extensions.Contains("GL_EXT_frag_depth") || gfx::HasDesktopGLFeatures()) { | 889 if (extensions.Contains("GL_EXT_frag_depth") || gfx::HasDesktopGLFeatures()) { |
(...skipping 14 matching lines...) Expand all Loading... |
899 if (workarounds_.disable_egl_khr_wait_sync) { | 904 if (workarounds_.disable_egl_khr_wait_sync) { |
900 gfx::g_driver_egl.ext.b_EGL_KHR_wait_sync = false; | 905 gfx::g_driver_egl.ext.b_EGL_KHR_wait_sync = false; |
901 } | 906 } |
902 #endif | 907 #endif |
903 if (workarounds_.disable_arb_sync) | 908 if (workarounds_.disable_arb_sync) |
904 gfx::g_driver_gl.ext.b_GL_ARB_sync = false; | 909 gfx::g_driver_gl.ext.b_GL_ARB_sync = false; |
905 bool ui_gl_fence_works = gfx::GLFence::IsSupported(); | 910 bool ui_gl_fence_works = gfx::GLFence::IsSupported(); |
906 UMA_HISTOGRAM_BOOLEAN("GPU.FenceSupport", ui_gl_fence_works); | 911 UMA_HISTOGRAM_BOOLEAN("GPU.FenceSupport", ui_gl_fence_works); |
907 | 912 |
908 feature_flags_.map_buffer_range = | 913 feature_flags_.map_buffer_range = |
909 is_es3 || extensions.Contains("GL_ARB_map_buffer_range") || | 914 gl_version_info_->is_es3 || |
| 915 extensions.Contains("GL_ARB_map_buffer_range") || |
910 extensions.Contains("GL_EXT_map_buffer_range"); | 916 extensions.Contains("GL_EXT_map_buffer_range"); |
911 | 917 |
912 // Really it's part of core OpenGL 2.1 and up, but let's assume the | 918 // Really it's part of core OpenGL 2.1 and up, but let's assume the |
913 // extension is still advertised. | 919 // extension is still advertised. |
914 bool has_pixel_buffers = | 920 bool has_pixel_buffers = |
915 is_es3 || extensions.Contains("GL_ARB_pixel_buffer_object") || | 921 gl_version_info_->is_es3 || |
| 922 extensions.Contains("GL_ARB_pixel_buffer_object") || |
916 extensions.Contains("GL_NV_pixel_buffer_object"); | 923 extensions.Contains("GL_NV_pixel_buffer_object"); |
917 | 924 |
918 // We will use either glMapBuffer() or glMapBufferRange() for async readbacks. | 925 // We will use either glMapBuffer() or glMapBufferRange() for async readbacks. |
919 if (has_pixel_buffers && ui_gl_fence_works && | 926 if (has_pixel_buffers && ui_gl_fence_works && |
920 !workarounds_.disable_async_readpixels) { | 927 !workarounds_.disable_async_readpixels) { |
921 feature_flags_.use_async_readpixels = true; | 928 feature_flags_.use_async_readpixels = true; |
922 } | 929 } |
923 | 930 |
924 if (is_es3 || extensions.Contains("GL_ARB_sampler_objects")) { | 931 if (gl_version_info_->is_es3 || |
| 932 extensions.Contains("GL_ARB_sampler_objects")) { |
925 feature_flags_.enable_samplers = true; | 933 feature_flags_.enable_samplers = true; |
926 // TODO(dsinclair): Add AddExtensionString("GL_CHROMIUM_sampler_objects") | 934 // TODO(dsinclair): Add AddExtensionString("GL_CHROMIUM_sampler_objects") |
927 // when available. | 935 // when available. |
928 } | 936 } |
929 | 937 |
930 if ((is_es3 || extensions.Contains("GL_EXT_discard_framebuffer")) && | 938 if ((gl_version_info_->is_es3 || |
| 939 extensions.Contains("GL_EXT_discard_framebuffer")) && |
931 !workarounds_.disable_ext_discard_framebuffer) { | 940 !workarounds_.disable_ext_discard_framebuffer) { |
932 // DiscardFramebufferEXT is automatically bound to InvalidateFramebuffer. | 941 // DiscardFramebufferEXT is automatically bound to InvalidateFramebuffer. |
933 AddExtensionString("GL_EXT_discard_framebuffer"); | 942 AddExtensionString("GL_EXT_discard_framebuffer"); |
934 feature_flags_.ext_discard_framebuffer = true; | 943 feature_flags_.ext_discard_framebuffer = true; |
935 } | 944 } |
936 | 945 |
937 if (ui_gl_fence_works) { | 946 if (ui_gl_fence_works) { |
938 AddExtensionString("GL_CHROMIUM_sync_query"); | 947 AddExtensionString("GL_CHROMIUM_sync_query"); |
939 feature_flags_.chromium_sync_query = true; | 948 feature_flags_.chromium_sync_query = true; |
940 } | 949 } |
(...skipping 26 matching lines...) Expand all Loading... |
967 if (blend_equation_advanced_coherent) | 976 if (blend_equation_advanced_coherent) |
968 AddExtensionString("GL_KHR_blend_equation_advanced_coherent"); | 977 AddExtensionString("GL_KHR_blend_equation_advanced_coherent"); |
969 | 978 |
970 AddExtensionString("GL_KHR_blend_equation_advanced"); | 979 AddExtensionString("GL_KHR_blend_equation_advanced"); |
971 feature_flags_.blend_equation_advanced = true; | 980 feature_flags_.blend_equation_advanced = true; |
972 feature_flags_.blend_equation_advanced_coherent = | 981 feature_flags_.blend_equation_advanced_coherent = |
973 blend_equation_advanced_coherent; | 982 blend_equation_advanced_coherent; |
974 } | 983 } |
975 | 984 |
976 if (extensions.Contains("GL_NV_path_rendering")) { | 985 if (extensions.Contains("GL_NV_path_rendering")) { |
977 if (extensions.Contains("GL_EXT_direct_state_access") || is_es3) { | 986 if (extensions.Contains("GL_EXT_direct_state_access") || |
| 987 gl_version_info_->is_es3) { |
978 AddExtensionString("GL_CHROMIUM_path_rendering"); | 988 AddExtensionString("GL_CHROMIUM_path_rendering"); |
979 feature_flags_.chromium_path_rendering = true; | 989 feature_flags_.chromium_path_rendering = true; |
980 validators_.g_l_state.AddValue(GL_PATH_MODELVIEW_MATRIX_CHROMIUM); | 990 validators_.g_l_state.AddValue(GL_PATH_MODELVIEW_MATRIX_CHROMIUM); |
981 validators_.g_l_state.AddValue(GL_PATH_PROJECTION_MATRIX_CHROMIUM); | 991 validators_.g_l_state.AddValue(GL_PATH_PROJECTION_MATRIX_CHROMIUM); |
982 } | 992 } |
983 } | 993 } |
984 | 994 |
985 if ((is_es3 || extensions.Contains("GL_EXT_texture_rg") || | 995 if ((gl_version_info_->is_es3 || extensions.Contains("GL_EXT_texture_rg") || |
986 extensions.Contains("GL_ARB_texture_rg")) && | 996 extensions.Contains("GL_ARB_texture_rg")) && |
987 IsGL_REDSupportedOnFBOs()) { | 997 IsGL_REDSupportedOnFBOs()) { |
988 feature_flags_.ext_texture_rg = true; | 998 feature_flags_.ext_texture_rg = true; |
989 AddExtensionString("GL_EXT_texture_rg"); | 999 AddExtensionString("GL_EXT_texture_rg"); |
990 | 1000 |
991 validators_.texture_format.AddValue(GL_RED_EXT); | 1001 validators_.texture_format.AddValue(GL_RED_EXT); |
992 validators_.texture_format.AddValue(GL_RG_EXT); | 1002 validators_.texture_format.AddValue(GL_RG_EXT); |
993 validators_.texture_internal_format.AddValue(GL_RED_EXT); | 1003 validators_.texture_internal_format.AddValue(GL_RED_EXT); |
994 validators_.texture_internal_format.AddValue(GL_RG_EXT); | 1004 validators_.texture_internal_format.AddValue(GL_RG_EXT); |
995 validators_.read_pixel_format.AddValue(GL_RED_EXT); | 1005 validators_.read_pixel_format.AddValue(GL_RED_EXT); |
(...skipping 27 matching lines...) Expand all Loading... |
1023 if (pos == std::string::npos) { | 1033 if (pos == std::string::npos) { |
1024 extensions_ += (extensions_.empty() ? "" : " ") + str; | 1034 extensions_ += (extensions_.empty() ? "" : " ") + str; |
1025 } | 1035 } |
1026 } | 1036 } |
1027 | 1037 |
1028 FeatureInfo::~FeatureInfo() { | 1038 FeatureInfo::~FeatureInfo() { |
1029 } | 1039 } |
1030 | 1040 |
1031 } // namespace gles2 | 1041 } // namespace gles2 |
1032 } // namespace gpu | 1042 } // namespace gpu |
OLD | NEW |