| 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 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 disallowed_features_ = disallowed_features; | 221 disallowed_features_ = disallowed_features; |
| 222 InitializeFeatures(); | 222 InitializeFeatures(); |
| 223 return true; | 223 return true; |
| 224 } | 224 } |
| 225 | 225 |
| 226 void FeatureInfo::InitializeFeatures() { | 226 void FeatureInfo::InitializeFeatures() { |
| 227 // Figure out what extensions to turn on. | 227 // Figure out what extensions to turn on. |
| 228 StringSet extensions( | 228 StringSet extensions( |
| 229 reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS))); | 229 reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS))); |
| 230 | 230 |
| 231 bool npot_ok = false; | |
| 232 | |
| 233 const char* renderer_str = | 231 const char* renderer_str = |
| 234 reinterpret_cast<const char*>(glGetString(GL_RENDERER)); | 232 reinterpret_cast<const char*>(glGetString(GL_RENDERER)); |
| 235 if (renderer_str) { | 233 if (renderer_str) { |
| 236 feature_flags_.is_angle = StartsWithASCII(renderer_str, "ANGLE", true); | 234 feature_flags_.is_angle = StartsWithASCII(renderer_str, "ANGLE", true); |
| 237 } | 235 } |
| 238 | 236 |
| 239 bool is_es3 = false; | 237 bool is_es3 = false; |
| 240 const char* version_str = | 238 const char* version_str = |
| 241 reinterpret_cast<const char*>(glGetString(GL_VERSION)); | 239 reinterpret_cast<const char*>(glGetString(GL_VERSION)); |
| 242 if (version_str) { | 240 if (version_str) { |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 if (enable_depth_texture) { | 365 if (enable_depth_texture) { |
| 368 texture_format_validators_[GL_DEPTH_STENCIL] | 366 texture_format_validators_[GL_DEPTH_STENCIL] |
| 369 .AddValue(GL_UNSIGNED_INT_24_8); | 367 .AddValue(GL_UNSIGNED_INT_24_8); |
| 370 validators_.texture_internal_format.AddValue(GL_DEPTH_STENCIL); | 368 validators_.texture_internal_format.AddValue(GL_DEPTH_STENCIL); |
| 371 validators_.texture_format.AddValue(GL_DEPTH_STENCIL); | 369 validators_.texture_format.AddValue(GL_DEPTH_STENCIL); |
| 372 validators_.pixel_type.AddValue(GL_UNSIGNED_INT_24_8); | 370 validators_.pixel_type.AddValue(GL_UNSIGNED_INT_24_8); |
| 373 } | 371 } |
| 374 validators_.render_buffer_format.AddValue(GL_DEPTH24_STENCIL8); | 372 validators_.render_buffer_format.AddValue(GL_DEPTH24_STENCIL8); |
| 375 } | 373 } |
| 376 | 374 |
| 377 if (extensions.Contains("GL_OES_vertex_array_object") || | 375 if (is_es3 || extensions.Contains("GL_OES_vertex_array_object") || |
| 378 extensions.Contains("GL_ARB_vertex_array_object") || | 376 extensions.Contains("GL_ARB_vertex_array_object") || |
| 379 extensions.Contains("GL_APPLE_vertex_array_object")) { | 377 extensions.Contains("GL_APPLE_vertex_array_object")) { |
| 380 feature_flags_.native_vertex_array_object = true; | 378 feature_flags_.native_vertex_array_object = true; |
| 381 } | 379 } |
| 382 | 380 |
| 383 // If we're using client_side_arrays we have to emulate | 381 // If we're using client_side_arrays we have to emulate |
| 384 // vertex array objects since vertex array objects do not work | 382 // vertex array objects since vertex array objects do not work |
| 385 // with client side arrays. | 383 // with client side arrays. |
| 386 if (workarounds_.use_client_side_arrays_for_stream_buffers) { | 384 if (workarounds_.use_client_side_arrays_for_stream_buffers) { |
| 387 feature_flags_.native_vertex_array_object = false; | 385 feature_flags_.native_vertex_array_object = false; |
| 388 } | 386 } |
| 389 | 387 |
| 390 if (extensions.Contains("GL_OES_element_index_uint") || | 388 if (is_es3 || extensions.Contains("GL_OES_element_index_uint") || |
| 391 gfx::HasDesktopGLFeatures()) { | 389 gfx::HasDesktopGLFeatures()) { |
| 392 AddExtensionString("GL_OES_element_index_uint"); | 390 AddExtensionString("GL_OES_element_index_uint"); |
| 393 validators_.index_type.AddValue(GL_UNSIGNED_INT); | 391 validators_.index_type.AddValue(GL_UNSIGNED_INT); |
| 394 } | 392 } |
| 395 | 393 |
| 396 bool enable_texture_format_bgra8888 = false; | 394 bool enable_texture_format_bgra8888 = false; |
| 397 bool enable_read_format_bgra = false; | 395 bool enable_read_format_bgra = false; |
| 398 bool enable_render_buffer_bgra = false; | 396 bool enable_render_buffer_bgra = false; |
| 399 bool enable_immutable_texture_format_bgra_on_es3 = | 397 bool enable_immutable_texture_format_bgra_on_es3 = |
| 400 extensions.Contains("GL_APPLE_texture_format_BGRA8888"); | 398 extensions.Contains("GL_APPLE_texture_format_BGRA8888"); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 validators_.render_buffer_format.AddValue(GL_BGRA8_EXT); | 431 validators_.render_buffer_format.AddValue(GL_BGRA8_EXT); |
| 434 } | 432 } |
| 435 | 433 |
| 436 if (extensions.Contains("GL_OES_rgb8_rgba8") || gfx::HasDesktopGLFeatures()) { | 434 if (extensions.Contains("GL_OES_rgb8_rgba8") || gfx::HasDesktopGLFeatures()) { |
| 437 AddExtensionString("GL_OES_rgb8_rgba8"); | 435 AddExtensionString("GL_OES_rgb8_rgba8"); |
| 438 validators_.render_buffer_format.AddValue(GL_RGB8_OES); | 436 validators_.render_buffer_format.AddValue(GL_RGB8_OES); |
| 439 validators_.render_buffer_format.AddValue(GL_RGBA8_OES); | 437 validators_.render_buffer_format.AddValue(GL_RGBA8_OES); |
| 440 } | 438 } |
| 441 | 439 |
| 442 // Check if we should allow GL_OES_texture_npot | 440 // Check if we should allow GL_OES_texture_npot |
| 443 if (extensions.Contains("GL_ARB_texture_non_power_of_two") || | 441 if (is_es3 || extensions.Contains("GL_ARB_texture_non_power_of_two") || |
| 444 extensions.Contains("GL_OES_texture_npot")) { | 442 extensions.Contains("GL_OES_texture_npot")) { |
| 445 AddExtensionString("GL_OES_texture_npot"); | 443 AddExtensionString("GL_OES_texture_npot"); |
| 446 npot_ok = true; | 444 feature_flags_.npot_ok = true; |
| 447 } | 445 } |
| 448 | 446 |
| 449 // Check if we should allow GL_OES_texture_float, GL_OES_texture_half_float, | 447 // Check if we should allow GL_OES_texture_float, GL_OES_texture_half_float, |
| 450 // GL_OES_texture_float_linear, GL_OES_texture_half_float_linear | 448 // GL_OES_texture_float_linear, GL_OES_texture_half_float_linear |
| 451 bool enable_texture_float = false; | 449 bool enable_texture_float = false; |
| 452 bool enable_texture_float_linear = false; | 450 bool enable_texture_float_linear = false; |
| 453 bool enable_texture_half_float = false; | 451 bool enable_texture_half_float = false; |
| 454 bool enable_texture_half_float_linear = false; | 452 bool enable_texture_half_float_linear = false; |
| 455 | 453 |
| 456 bool may_enable_chromium_color_buffer_float = false; | 454 bool may_enable_chromium_color_buffer_float = false; |
| 457 | 455 |
| 458 if (extensions.Contains("GL_ARB_texture_float")) { | 456 if (extensions.Contains("GL_ARB_texture_float")) { |
| 459 enable_texture_float = true; | 457 enable_texture_float = true; |
| 460 enable_texture_float_linear = true; | 458 enable_texture_float_linear = true; |
| 461 enable_texture_half_float = true; | 459 enable_texture_half_float = true; |
| 462 enable_texture_half_float_linear = true; | 460 enable_texture_half_float_linear = true; |
| 463 may_enable_chromium_color_buffer_float = true; | 461 may_enable_chromium_color_buffer_float = true; |
| 464 } else { | 462 } else { |
| 465 if (extensions.Contains("GL_OES_texture_float")) { | 463 if (is_es3 || extensions.Contains("GL_OES_texture_float")) { |
| 466 enable_texture_float = true; | 464 enable_texture_float = true; |
| 467 if (extensions.Contains("GL_OES_texture_float_linear")) { | 465 if (extensions.Contains("GL_OES_texture_float_linear")) { |
| 468 enable_texture_float_linear = true; | 466 enable_texture_float_linear = true; |
| 469 } | 467 } |
| 470 if ((is_es3 && extensions.Contains("GL_EXT_color_buffer_float")) || | 468 if ((is_es3 && extensions.Contains("GL_EXT_color_buffer_float")) || |
| 471 feature_flags_.is_angle) { | 469 feature_flags_.is_angle) { |
| 472 may_enable_chromium_color_buffer_float = true; | 470 may_enable_chromium_color_buffer_float = true; |
| 473 } | 471 } |
| 474 } | 472 } |
| 473 // TODO(dshwang): GLES3 supports half float by default but GL_HALF_FLOAT_OES |
| 474 // isn't equal to GL_HALF_FLOAT. |
| 475 if (extensions.Contains("GL_OES_texture_half_float")) { | 475 if (extensions.Contains("GL_OES_texture_half_float")) { |
| 476 enable_texture_half_float = true; | 476 enable_texture_half_float = true; |
| 477 if (extensions.Contains("GL_OES_texture_half_float_linear")) { | 477 if (extensions.Contains("GL_OES_texture_half_float_linear")) { |
| 478 enable_texture_half_float_linear = true; | 478 enable_texture_half_float_linear = true; |
| 479 } | 479 } |
| 480 } | 480 } |
| 481 } | 481 } |
| 482 | 482 |
| 483 if (enable_texture_float) { | 483 if (enable_texture_float) { |
| 484 texture_format_validators_[GL_ALPHA].AddValue(GL_FLOAT); | 484 texture_format_validators_[GL_ALPHA].AddValue(GL_FLOAT); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 } | 599 } |
| 600 | 600 |
| 601 if (extensions.Contains("GL_OES_depth24") || gfx::HasDesktopGLFeatures() || | 601 if (extensions.Contains("GL_OES_depth24") || gfx::HasDesktopGLFeatures() || |
| 602 is_es3) { | 602 is_es3) { |
| 603 AddExtensionString("GL_OES_depth24"); | 603 AddExtensionString("GL_OES_depth24"); |
| 604 feature_flags_.oes_depth24 = true; | 604 feature_flags_.oes_depth24 = true; |
| 605 validators_.render_buffer_format.AddValue(GL_DEPTH_COMPONENT24); | 605 validators_.render_buffer_format.AddValue(GL_DEPTH_COMPONENT24); |
| 606 } | 606 } |
| 607 | 607 |
| 608 if (!workarounds_.disable_oes_standard_derivatives && | 608 if (!workarounds_.disable_oes_standard_derivatives && |
| 609 (extensions.Contains("GL_OES_standard_derivatives") || | 609 (is_es3 || extensions.Contains("GL_OES_standard_derivatives") || |
| 610 gfx::HasDesktopGLFeatures())) { | 610 gfx::HasDesktopGLFeatures())) { |
| 611 AddExtensionString("GL_OES_standard_derivatives"); | 611 AddExtensionString("GL_OES_standard_derivatives"); |
| 612 feature_flags_.oes_standard_derivatives = true; | 612 feature_flags_.oes_standard_derivatives = true; |
| 613 validators_.hint_target.AddValue(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES); | 613 validators_.hint_target.AddValue(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES); |
| 614 validators_.g_l_state.AddValue(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES); | 614 validators_.g_l_state.AddValue(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES); |
| 615 } | 615 } |
| 616 | 616 |
| 617 if (extensions.Contains("GL_OES_EGL_image_external")) { | 617 if (extensions.Contains("GL_OES_EGL_image_external")) { |
| 618 AddExtensionString("GL_OES_EGL_image_external"); | 618 AddExtensionString("GL_OES_EGL_image_external"); |
| 619 feature_flags_.oes_egl_image_external = true; | 619 feature_flags_.oes_egl_image_external = true; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 672 #if defined(OS_MACOSX) | 672 #if defined(OS_MACOSX) |
| 673 AddExtensionString("GL_CHROMIUM_iosurface"); | 673 AddExtensionString("GL_CHROMIUM_iosurface"); |
| 674 #endif | 674 #endif |
| 675 | 675 |
| 676 // TODO(gman): Add support for these extensions. | 676 // TODO(gman): Add support for these extensions. |
| 677 // GL_OES_depth32 | 677 // GL_OES_depth32 |
| 678 | 678 |
| 679 feature_flags_.enable_texture_float_linear |= enable_texture_float_linear; | 679 feature_flags_.enable_texture_float_linear |= enable_texture_float_linear; |
| 680 feature_flags_.enable_texture_half_float_linear |= | 680 feature_flags_.enable_texture_half_float_linear |= |
| 681 enable_texture_half_float_linear; | 681 enable_texture_half_float_linear; |
| 682 feature_flags_.npot_ok |= npot_ok; | |
| 683 | 682 |
| 684 if (extensions.Contains("GL_ANGLE_pack_reverse_row_order")) { | 683 if (extensions.Contains("GL_ANGLE_pack_reverse_row_order")) { |
| 685 AddExtensionString("GL_ANGLE_pack_reverse_row_order"); | 684 AddExtensionString("GL_ANGLE_pack_reverse_row_order"); |
| 686 feature_flags_.angle_pack_reverse_row_order = true; | 685 feature_flags_.angle_pack_reverse_row_order = true; |
| 687 validators_.pixel_store.AddValue(GL_PACK_REVERSE_ROW_ORDER_ANGLE); | 686 validators_.pixel_store.AddValue(GL_PACK_REVERSE_ROW_ORDER_ANGLE); |
| 688 validators_.g_l_state.AddValue(GL_PACK_REVERSE_ROW_ORDER_ANGLE); | 687 validators_.g_l_state.AddValue(GL_PACK_REVERSE_ROW_ORDER_ANGLE); |
| 689 } | 688 } |
| 690 | 689 |
| 691 if (extensions.Contains("GL_ANGLE_texture_usage")) { | 690 if (extensions.Contains("GL_ANGLE_texture_usage")) { |
| 692 feature_flags_.angle_texture_usage = true; | 691 feature_flags_.angle_texture_usage = true; |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 767 AddExtensionString("GL_EXT_draw_buffers"); | 766 AddExtensionString("GL_EXT_draw_buffers"); |
| 768 feature_flags_.ext_draw_buffers = true; | 767 feature_flags_.ext_draw_buffers = true; |
| 769 | 768 |
| 770 GLint max_color_attachments = 0; | 769 GLint max_color_attachments = 0; |
| 771 glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &max_color_attachments); | 770 glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &max_color_attachments); |
| 772 for (GLenum i = GL_COLOR_ATTACHMENT1_EXT; | 771 for (GLenum i = GL_COLOR_ATTACHMENT1_EXT; |
| 773 i < static_cast<GLenum>(GL_COLOR_ATTACHMENT0 + max_color_attachments); | 772 i < static_cast<GLenum>(GL_COLOR_ATTACHMENT0 + max_color_attachments); |
| 774 ++i) { | 773 ++i) { |
| 775 validators_.attachment.AddValue(i); | 774 validators_.attachment.AddValue(i); |
| 776 } | 775 } |
| 776 COMPILE_ASSERT(GL_COLOR_ATTACHMENT0_EXT == GL_COLOR_ATTACHMENT0, |
| 777 color_attachment0_variation_must_match); |
| 777 | 778 |
| 778 validators_.g_l_state.AddValue(GL_MAX_COLOR_ATTACHMENTS_EXT); | 779 validators_.g_l_state.AddValue(GL_MAX_COLOR_ATTACHMENTS_EXT); |
| 779 validators_.g_l_state.AddValue(GL_MAX_DRAW_BUFFERS_ARB); | 780 validators_.g_l_state.AddValue(GL_MAX_DRAW_BUFFERS_ARB); |
| 780 GLint max_draw_buffers = 0; | 781 GLint max_draw_buffers = 0; |
| 781 glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &max_draw_buffers); | 782 glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &max_draw_buffers); |
| 782 for (GLenum i = GL_DRAW_BUFFER0_ARB; | 783 for (GLenum i = GL_DRAW_BUFFER0_ARB; |
| 783 i < static_cast<GLenum>(GL_DRAW_BUFFER0_ARB + max_draw_buffers); | 784 i < static_cast<GLenum>(GL_DRAW_BUFFER0_ARB + max_draw_buffers); |
| 784 ++i) { | 785 ++i) { |
| 785 validators_.g_l_state.AddValue(i); | 786 validators_.g_l_state.AddValue(i); |
| 786 } | 787 } |
| 787 } | 788 } |
| 788 | 789 |
| 789 if (extensions.Contains("GL_EXT_blend_minmax") || | 790 if (is_es3 || extensions.Contains("GL_EXT_blend_minmax") || |
| 790 gfx::HasDesktopGLFeatures()) { | 791 gfx::HasDesktopGLFeatures()) { |
| 791 AddExtensionString("GL_EXT_blend_minmax"); | 792 AddExtensionString("GL_EXT_blend_minmax"); |
| 792 validators_.equation.AddValue(GL_MIN_EXT); | 793 validators_.equation.AddValue(GL_MIN_EXT); |
| 793 validators_.equation.AddValue(GL_MAX_EXT); | 794 validators_.equation.AddValue(GL_MAX_EXT); |
| 795 COMPILE_ASSERT(GL_MIN_EXT == GL_MIN && GL_MAX_EXT == GL_MAX, |
| 796 min_max_variations_must_match); |
| 794 } | 797 } |
| 795 | 798 |
| 799 // TODO(dshwang): GLES3 supports gl_FragDepth, not gl_FragDepthEXT. |
| 796 if (extensions.Contains("GL_EXT_frag_depth") || gfx::HasDesktopGLFeatures()) { | 800 if (extensions.Contains("GL_EXT_frag_depth") || gfx::HasDesktopGLFeatures()) { |
| 797 AddExtensionString("GL_EXT_frag_depth"); | 801 AddExtensionString("GL_EXT_frag_depth"); |
| 798 feature_flags_.ext_frag_depth = true; | 802 feature_flags_.ext_frag_depth = true; |
| 799 } | 803 } |
| 800 | 804 |
| 801 if (extensions.Contains("GL_EXT_shader_texture_lod") || | 805 if (extensions.Contains("GL_EXT_shader_texture_lod") || |
| 802 gfx::HasDesktopGLFeatures()) { | 806 gfx::HasDesktopGLFeatures()) { |
| 803 AddExtensionString("GL_EXT_shader_texture_lod"); | 807 AddExtensionString("GL_EXT_shader_texture_lod"); |
| 804 feature_flags_.ext_shader_texture_lod = true; | 808 feature_flags_.ext_shader_texture_lod = true; |
| 805 } | 809 } |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 867 if (pos == std::string::npos) { | 871 if (pos == std::string::npos) { |
| 868 extensions_ += (extensions_.empty() ? "" : " ") + str; | 872 extensions_ += (extensions_.empty() ? "" : " ") + str; |
| 869 } | 873 } |
| 870 } | 874 } |
| 871 | 875 |
| 872 FeatureInfo::~FeatureInfo() { | 876 FeatureInfo::~FeatureInfo() { |
| 873 } | 877 } |
| 874 | 878 |
| 875 } // namespace gles2 | 879 } // namespace gles2 |
| 876 } // namespace gpu | 880 } // namespace gpu |
| OLD | NEW |