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/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
93 if (workarounds->max_cube_map_texture_size_limit_1024) | 93 if (workarounds->max_cube_map_texture_size_limit_1024) |
94 workarounds->max_cube_map_texture_size = 1024; | 94 workarounds->max_cube_map_texture_size = 1024; |
95 if (workarounds->max_cube_map_texture_size_limit_512) | 95 if (workarounds->max_cube_map_texture_size_limit_512) |
96 workarounds->max_cube_map_texture_size = 512; | 96 workarounds->max_cube_map_texture_size = 512; |
97 } | 97 } |
98 | 98 |
99 } // anonymous namespace. | 99 } // anonymous namespace. |
100 | 100 |
101 FeatureInfo::FeatureFlags::FeatureFlags() | 101 FeatureInfo::FeatureFlags::FeatureFlags() |
102 : chromium_framebuffer_multisample(false), | 102 : chromium_framebuffer_multisample(false), |
103 core_framebuffer_multisample(false), | |
103 multisampled_render_to_texture(false), | 104 multisampled_render_to_texture(false), |
104 use_img_for_multisampled_render_to_texture(false), | 105 use_img_for_multisampled_render_to_texture(false), |
105 oes_standard_derivatives(false), | 106 oes_standard_derivatives(false), |
106 oes_egl_image_external(false), | 107 oes_egl_image_external(false), |
107 oes_depth24(false), | 108 oes_depth24(false), |
109 packed_depth24_stencil8(false), | |
108 npot_ok(false), | 110 npot_ok(false), |
109 enable_texture_float_linear(false), | 111 enable_texture_float_linear(false), |
110 enable_texture_half_float_linear(false), | 112 enable_texture_half_float_linear(false), |
111 chromium_stream_texture(false), | 113 chromium_stream_texture(false), |
112 angle_translated_shader_source(false), | 114 angle_translated_shader_source(false), |
113 angle_pack_reverse_row_order(false), | 115 angle_pack_reverse_row_order(false), |
114 arb_texture_rectangle(false), | 116 arb_texture_rectangle(false), |
115 angle_instanced_arrays(false), | 117 angle_instanced_arrays(false), |
116 occlusion_query_boolean(false), | 118 occlusion_query_boolean(false), |
117 use_arb_occlusion_query2_for_occlusion_query_boolean(false), | 119 use_arb_occlusion_query2_for_occlusion_query_boolean(false), |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
198 return true; | 200 return true; |
199 } | 201 } |
200 | 202 |
201 void FeatureInfo::InitializeFeatures() { | 203 void FeatureInfo::InitializeFeatures() { |
202 // Figure out what extensions to turn on. | 204 // Figure out what extensions to turn on. |
203 StringSet extensions( | 205 StringSet extensions( |
204 reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS))); | 206 reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS))); |
205 | 207 |
206 bool npot_ok = false; | 208 bool npot_ok = false; |
207 | 209 |
210 bool is_es3 = false; | |
211 const char* str = reinterpret_cast<const char*>(glGetString(GL_VERSION)); | |
212 if (str) { | |
213 std::string lstr(StringToLowerASCII(std::string(str))); | |
214 is_es3 = (lstr.substr(0, 12) == "opengl es 3."); | |
Ken Russell (switch to Gerrit)
2013/11/14 01:18:37
Is this going to scale well to some hypothetical O
Sami
2013/11/14 15:48:53
You could also check for glGetIntegerv({MAJOR_VERS
| |
215 } | |
216 | |
208 AddExtensionString("GL_ANGLE_translated_shader_source"); | 217 AddExtensionString("GL_ANGLE_translated_shader_source"); |
209 AddExtensionString("GL_CHROMIUM_async_pixel_transfers"); | 218 AddExtensionString("GL_CHROMIUM_async_pixel_transfers"); |
210 AddExtensionString("GL_CHROMIUM_bind_uniform_location"); | 219 AddExtensionString("GL_CHROMIUM_bind_uniform_location"); |
211 AddExtensionString("GL_CHROMIUM_command_buffer_query"); | 220 AddExtensionString("GL_CHROMIUM_command_buffer_query"); |
212 AddExtensionString("GL_CHROMIUM_command_buffer_latency_query"); | 221 AddExtensionString("GL_CHROMIUM_command_buffer_latency_query"); |
213 AddExtensionString("GL_CHROMIUM_copy_texture"); | 222 AddExtensionString("GL_CHROMIUM_copy_texture"); |
214 AddExtensionString("GL_CHROMIUM_discard_backbuffer"); | 223 AddExtensionString("GL_CHROMIUM_discard_backbuffer"); |
215 AddExtensionString("GL_CHROMIUM_get_error_query"); | 224 AddExtensionString("GL_CHROMIUM_get_error_query"); |
216 AddExtensionString("GL_CHROMIUM_lose_context"); | 225 AddExtensionString("GL_CHROMIUM_lose_context"); |
217 AddExtensionString("GL_CHROMIUM_pixel_transfer_buffer_object"); | 226 AddExtensionString("GL_CHROMIUM_pixel_transfer_buffer_object"); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
305 // | 314 // |
306 // Therefore we made up GL_GOOGLE_depth_texture / GL_CHROMIUM_depth_texture. | 315 // Therefore we made up GL_GOOGLE_depth_texture / GL_CHROMIUM_depth_texture. |
307 // | 316 // |
308 // GL_GOOGLE_depth_texture is legacy. As we exposed it into NaCl we can't | 317 // GL_GOOGLE_depth_texture is legacy. As we exposed it into NaCl we can't |
309 // get rid of it. | 318 // get rid of it. |
310 // | 319 // |
311 bool enable_depth_texture = false; | 320 bool enable_depth_texture = false; |
312 if (!workarounds_.disable_depth_texture && | 321 if (!workarounds_.disable_depth_texture && |
313 (extensions.Contains("GL_ARB_depth_texture") || | 322 (extensions.Contains("GL_ARB_depth_texture") || |
314 extensions.Contains("GL_OES_depth_texture") || | 323 extensions.Contains("GL_OES_depth_texture") || |
315 extensions.Contains("GL_ANGLE_depth_texture"))) { | 324 extensions.Contains("GL_ANGLE_depth_texture") || is_es3)) { |
316 enable_depth_texture = true; | 325 enable_depth_texture = true; |
317 } | 326 } |
318 | 327 |
319 if (enable_depth_texture) { | 328 if (enable_depth_texture) { |
320 AddExtensionString("GL_CHROMIUM_depth_texture"); | 329 AddExtensionString("GL_CHROMIUM_depth_texture"); |
321 AddExtensionString("GL_GOOGLE_depth_texture"); | 330 AddExtensionString("GL_GOOGLE_depth_texture"); |
322 texture_format_validators_[GL_DEPTH_COMPONENT].AddValue(GL_UNSIGNED_SHORT); | 331 texture_format_validators_[GL_DEPTH_COMPONENT].AddValue(GL_UNSIGNED_SHORT); |
323 texture_format_validators_[GL_DEPTH_COMPONENT].AddValue(GL_UNSIGNED_INT); | 332 texture_format_validators_[GL_DEPTH_COMPONENT].AddValue(GL_UNSIGNED_INT); |
324 validators_.texture_internal_format.AddValue(GL_DEPTH_COMPONENT); | 333 validators_.texture_internal_format.AddValue(GL_DEPTH_COMPONENT); |
325 validators_.texture_format.AddValue(GL_DEPTH_COMPONENT); | 334 validators_.texture_format.AddValue(GL_DEPTH_COMPONENT); |
326 validators_.pixel_type.AddValue(GL_UNSIGNED_SHORT); | 335 validators_.pixel_type.AddValue(GL_UNSIGNED_SHORT); |
327 validators_.pixel_type.AddValue(GL_UNSIGNED_INT); | 336 validators_.pixel_type.AddValue(GL_UNSIGNED_INT); |
328 } | 337 } |
329 | 338 |
330 if (extensions.Contains("GL_EXT_packed_depth_stencil") || | 339 if (extensions.Contains("GL_EXT_packed_depth_stencil") || |
331 extensions.Contains("GL_OES_packed_depth_stencil")) { | 340 extensions.Contains("GL_OES_packed_depth_stencil") || is_es3) { |
332 AddExtensionString("GL_OES_packed_depth_stencil"); | 341 AddExtensionString("GL_OES_packed_depth_stencil"); |
342 feature_flags_.packed_depth24_stencil8 = true; | |
333 if (enable_depth_texture) { | 343 if (enable_depth_texture) { |
334 texture_format_validators_[GL_DEPTH_STENCIL].AddValue( | 344 texture_format_validators_[GL_DEPTH_STENCIL] |
335 GL_UNSIGNED_INT_24_8); | 345 .AddValue(GL_UNSIGNED_INT_24_8); |
336 validators_.texture_internal_format.AddValue(GL_DEPTH_STENCIL); | 346 validators_.texture_internal_format.AddValue(GL_DEPTH_STENCIL); |
337 validators_.texture_format.AddValue(GL_DEPTH_STENCIL); | 347 validators_.texture_format.AddValue(GL_DEPTH_STENCIL); |
338 validators_.pixel_type.AddValue(GL_UNSIGNED_INT_24_8); | 348 validators_.pixel_type.AddValue(GL_UNSIGNED_INT_24_8); |
339 } | 349 } |
340 validators_.render_buffer_format.AddValue(GL_DEPTH24_STENCIL8); | 350 validators_.render_buffer_format.AddValue(GL_DEPTH24_STENCIL8); |
341 } | 351 } |
342 | 352 |
343 if (extensions.Contains("GL_OES_vertex_array_object") || | 353 if (extensions.Contains("GL_OES_vertex_array_object") || |
344 extensions.Contains("GL_ARB_vertex_array_object") || | 354 extensions.Contains("GL_ARB_vertex_array_object") || |
345 extensions.Contains("GL_APPLE_vertex_array_object")) { | 355 extensions.Contains("GL_APPLE_vertex_array_object")) { |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
463 texture_format_validators_[GL_LUMINANCE_ALPHA].AddValue(GL_HALF_FLOAT_OES); | 473 texture_format_validators_[GL_LUMINANCE_ALPHA].AddValue(GL_HALF_FLOAT_OES); |
464 validators_.pixel_type.AddValue(GL_HALF_FLOAT_OES); | 474 validators_.pixel_type.AddValue(GL_HALF_FLOAT_OES); |
465 validators_.read_pixel_type.AddValue(GL_HALF_FLOAT_OES); | 475 validators_.read_pixel_type.AddValue(GL_HALF_FLOAT_OES); |
466 AddExtensionString("GL_OES_texture_half_float"); | 476 AddExtensionString("GL_OES_texture_half_float"); |
467 if (enable_texture_half_float_linear) { | 477 if (enable_texture_half_float_linear) { |
468 AddExtensionString("GL_OES_texture_half_float_linear"); | 478 AddExtensionString("GL_OES_texture_half_float_linear"); |
469 } | 479 } |
470 } | 480 } |
471 | 481 |
472 // Check for multisample support | 482 // Check for multisample support |
473 if (!disallowed_features_.multisampling) { | 483 if (!disallowed_features_.multisampling && |
484 !workarounds_.disable_framebuffer_multisample) { | |
474 bool ext_has_multisample = | 485 bool ext_has_multisample = |
475 extensions.Contains("GL_EXT_framebuffer_multisample"); | 486 extensions.Contains("GL_EXT_framebuffer_multisample") || is_es3; |
476 if (!workarounds_.disable_angle_framebuffer_multisample) { | 487 if (!workarounds_.disable_angle_framebuffer_multisample) { |
477 ext_has_multisample |= | 488 ext_has_multisample |= |
478 extensions.Contains("GL_ANGLE_framebuffer_multisample"); | 489 extensions.Contains("GL_ANGLE_framebuffer_multisample"); |
479 } | 490 } |
491 feature_flags_.core_framebuffer_multisample = is_es3; | |
480 if (ext_has_multisample) { | 492 if (ext_has_multisample) { |
481 feature_flags_.chromium_framebuffer_multisample = true; | 493 feature_flags_.chromium_framebuffer_multisample = true; |
482 validators_.frame_buffer_target.AddValue(GL_READ_FRAMEBUFFER_EXT); | 494 validators_.frame_buffer_target.AddValue(GL_READ_FRAMEBUFFER_EXT); |
483 validators_.frame_buffer_target.AddValue(GL_DRAW_FRAMEBUFFER_EXT); | 495 validators_.frame_buffer_target.AddValue(GL_DRAW_FRAMEBUFFER_EXT); |
484 validators_.g_l_state.AddValue(GL_READ_FRAMEBUFFER_BINDING_EXT); | 496 validators_.g_l_state.AddValue(GL_READ_FRAMEBUFFER_BINDING_EXT); |
485 validators_.g_l_state.AddValue(GL_MAX_SAMPLES_EXT); | 497 validators_.g_l_state.AddValue(GL_MAX_SAMPLES_EXT); |
486 validators_.render_buffer_parameter.AddValue(GL_RENDERBUFFER_SAMPLES_EXT); | 498 validators_.render_buffer_parameter.AddValue(GL_RENDERBUFFER_SAMPLES_EXT); |
487 AddExtensionString("GL_CHROMIUM_framebuffer_multisample"); | 499 AddExtensionString("GL_CHROMIUM_framebuffer_multisample"); |
488 } else { | 500 } else { |
489 if (extensions.Contains("GL_EXT_multisampled_render_to_texture")) { | 501 if (extensions.Contains("GL_EXT_multisampled_render_to_texture")) { |
490 feature_flags_.multisampled_render_to_texture = true; | 502 feature_flags_.multisampled_render_to_texture = true; |
491 } else if (extensions.Contains("GL_IMG_multisampled_render_to_texture")) { | 503 } else if (extensions.Contains("GL_IMG_multisampled_render_to_texture")) { |
492 feature_flags_.multisampled_render_to_texture = true; | 504 feature_flags_.multisampled_render_to_texture = true; |
493 feature_flags_.use_img_for_multisampled_render_to_texture = true; | 505 feature_flags_.use_img_for_multisampled_render_to_texture = true; |
494 } | 506 } |
495 if (feature_flags_.multisampled_render_to_texture) { | 507 if (feature_flags_.multisampled_render_to_texture) { |
496 validators_.render_buffer_parameter.AddValue( | 508 validators_.render_buffer_parameter.AddValue( |
497 GL_RENDERBUFFER_SAMPLES_EXT); | 509 GL_RENDERBUFFER_SAMPLES_EXT); |
498 validators_.g_l_state.AddValue(GL_MAX_SAMPLES_EXT); | 510 validators_.g_l_state.AddValue(GL_MAX_SAMPLES_EXT); |
499 validators_.frame_buffer_parameter.AddValue( | 511 validators_.frame_buffer_parameter.AddValue( |
500 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT); | 512 GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT); |
501 AddExtensionString("GL_EXT_multisampled_render_to_texture"); | 513 AddExtensionString("GL_EXT_multisampled_render_to_texture"); |
502 } | 514 } |
503 } | 515 } |
504 } | 516 } |
505 | 517 |
506 if (extensions.Contains("GL_OES_depth24") || gfx::HasDesktopGLFeatures()) { | 518 if (extensions.Contains("GL_OES_depth24") || gfx::HasDesktopGLFeatures() || |
519 is_es3) { | |
507 AddExtensionString("GL_OES_depth24"); | 520 AddExtensionString("GL_OES_depth24"); |
508 feature_flags_.oes_depth24 = true; | 521 feature_flags_.oes_depth24 = true; |
509 validators_.render_buffer_format.AddValue(GL_DEPTH_COMPONENT24); | 522 validators_.render_buffer_format.AddValue(GL_DEPTH_COMPONENT24); |
510 } | 523 } |
511 | 524 |
512 if (!workarounds_.disable_oes_standard_derivatives && | 525 if (!workarounds_.disable_oes_standard_derivatives && |
513 (extensions.Contains("GL_OES_standard_derivatives") || | 526 (extensions.Contains("GL_OES_standard_derivatives") || |
514 gfx::HasDesktopGLFeatures())) { | 527 gfx::HasDesktopGLFeatures())) { |
515 AddExtensionString("GL_OES_standard_derivatives"); | 528 AddExtensionString("GL_OES_standard_derivatives"); |
516 feature_flags_.oes_standard_derivatives = true; | 529 feature_flags_.oes_standard_derivatives = true; |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
656 } | 669 } |
657 | 670 |
658 if (extensions.Contains("GL_EXT_frag_depth") || gfx::HasDesktopGLFeatures()) { | 671 if (extensions.Contains("GL_EXT_frag_depth") || gfx::HasDesktopGLFeatures()) { |
659 AddExtensionString("GL_EXT_frag_depth"); | 672 AddExtensionString("GL_EXT_frag_depth"); |
660 feature_flags_.ext_frag_depth = true; | 673 feature_flags_.ext_frag_depth = true; |
661 } | 674 } |
662 | 675 |
663 if (!disallowed_features_.swap_buffer_complete_callback) | 676 if (!disallowed_features_.swap_buffer_complete_callback) |
664 AddExtensionString("GL_CHROMIUM_swapbuffers_complete_callback"); | 677 AddExtensionString("GL_CHROMIUM_swapbuffers_complete_callback"); |
665 | 678 |
666 bool is_es3 = false; | |
667 const char* str = reinterpret_cast<const char*>(glGetString(GL_VERSION)); | |
668 if (str) { | |
669 std::string lstr(StringToLowerASCII(std::string(str))); | |
670 is_es3 = (lstr.substr(0, 12) == "opengl es 3."); | |
671 } | |
672 | |
673 bool ui_gl_fence_works = extensions.Contains("GL_NV_fence") || | 679 bool ui_gl_fence_works = extensions.Contains("GL_NV_fence") || |
674 extensions.Contains("GL_ARB_sync") || | 680 extensions.Contains("GL_ARB_sync") || |
675 extensions.Contains("EGL_KHR_fence_sync"); | 681 extensions.Contains("EGL_KHR_fence_sync"); |
676 | 682 |
677 feature_flags_.map_buffer_range = | 683 feature_flags_.map_buffer_range = |
678 is_es3 || extensions.Contains("GL_ARB_map_buffer_range"); | 684 is_es3 || extensions.Contains("GL_ARB_map_buffer_range"); |
679 | 685 |
680 // Really it's part of core OpenGL 2.1 and up, but let's assume the | 686 // Really it's part of core OpenGL 2.1 and up, but let's assume the |
681 // extension is still advertised. | 687 // extension is still advertised. |
682 bool has_pixel_buffers = | 688 bool has_pixel_buffers = |
(...skipping 23 matching lines...) Expand all Loading... | |
706 if (extensions_.find(str) == std::string::npos) { | 712 if (extensions_.find(str) == std::string::npos) { |
707 extensions_ += (extensions_.empty() ? "" : " ") + str; | 713 extensions_ += (extensions_.empty() ? "" : " ") + str; |
708 } | 714 } |
709 } | 715 } |
710 | 716 |
711 FeatureInfo::~FeatureInfo() { | 717 FeatureInfo::~FeatureInfo() { |
712 } | 718 } |
713 | 719 |
714 } // namespace gles2 | 720 } // namespace gles2 |
715 } // namespace gpu | 721 } // namespace gpu |
OLD | NEW |