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 <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <set> | 9 #include <set> |
10 #include <vector> | 10 #include <vector> |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 | 299 |
300 void FeatureInfo::EnableOESTextureHalfFloatLinear() { | 300 void FeatureInfo::EnableOESTextureHalfFloatLinear() { |
301 if (!oes_texture_half_float_linear_available_) | 301 if (!oes_texture_half_float_linear_available_) |
302 return; | 302 return; |
303 AddExtensionString("GL_OES_texture_half_float_linear"); | 303 AddExtensionString("GL_OES_texture_half_float_linear"); |
304 feature_flags_.enable_texture_half_float_linear = true; | 304 feature_flags_.enable_texture_half_float_linear = true; |
305 } | 305 } |
306 | 306 |
307 void FeatureInfo::InitializeFeatures() { | 307 void FeatureInfo::InitializeFeatures() { |
308 // Figure out what extensions to turn on. | 308 // Figure out what extensions to turn on. |
309 StringSet extensions(gfx::GetGLExtensionsFromCurrentContext()); | 309 StringSet extensions(gl::GetGLExtensionsFromCurrentContext()); |
310 | 310 |
311 const char* version_str = | 311 const char* version_str = |
312 reinterpret_cast<const char*>(glGetString(GL_VERSION)); | 312 reinterpret_cast<const char*>(glGetString(GL_VERSION)); |
313 const char* renderer_str = | 313 const char* renderer_str = |
314 reinterpret_cast<const char*>(glGetString(GL_RENDERER)); | 314 reinterpret_cast<const char*>(glGetString(GL_RENDERER)); |
315 | 315 |
316 gl_version_info_.reset(new gfx::GLVersionInfo( | 316 gl_version_info_.reset( |
317 version_str, renderer_str, extensions.GetImpl())); | 317 new gl::GLVersionInfo(version_str, renderer_str, extensions.GetImpl())); |
318 | 318 |
319 AddExtensionString("GL_ANGLE_translated_shader_source"); | 319 AddExtensionString("GL_ANGLE_translated_shader_source"); |
320 AddExtensionString("GL_CHROMIUM_async_pixel_transfers"); | 320 AddExtensionString("GL_CHROMIUM_async_pixel_transfers"); |
321 AddExtensionString("GL_CHROMIUM_bind_uniform_location"); | 321 AddExtensionString("GL_CHROMIUM_bind_uniform_location"); |
322 AddExtensionString("GL_CHROMIUM_command_buffer_query"); | 322 AddExtensionString("GL_CHROMIUM_command_buffer_query"); |
323 AddExtensionString("GL_CHROMIUM_command_buffer_latency_query"); | 323 AddExtensionString("GL_CHROMIUM_command_buffer_latency_query"); |
324 AddExtensionString("GL_CHROMIUM_copy_texture"); | 324 AddExtensionString("GL_CHROMIUM_copy_texture"); |
325 AddExtensionString("GL_CHROMIUM_get_error_query"); | 325 AddExtensionString("GL_CHROMIUM_get_error_query"); |
326 AddExtensionString("GL_CHROMIUM_lose_context"); | 326 AddExtensionString("GL_CHROMIUM_lose_context"); |
327 AddExtensionString("GL_CHROMIUM_pixel_transfer_buffer_object"); | 327 AddExtensionString("GL_CHROMIUM_pixel_transfer_buffer_object"); |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
525 | 525 |
526 // If we're using client_side_arrays we have to emulate | 526 // If we're using client_side_arrays we have to emulate |
527 // vertex array objects since vertex array objects do not work | 527 // vertex array objects since vertex array objects do not work |
528 // with client side arrays. | 528 // with client side arrays. |
529 if (workarounds_.use_client_side_arrays_for_stream_buffers) { | 529 if (workarounds_.use_client_side_arrays_for_stream_buffers) { |
530 feature_flags_.native_vertex_array_object = false; | 530 feature_flags_.native_vertex_array_object = false; |
531 } | 531 } |
532 | 532 |
533 if (gl_version_info_->is_es3 || | 533 if (gl_version_info_->is_es3 || |
534 extensions.Contains("GL_OES_element_index_uint") || | 534 extensions.Contains("GL_OES_element_index_uint") || |
535 gfx::HasDesktopGLFeatures()) { | 535 gl::HasDesktopGLFeatures()) { |
536 AddExtensionString("GL_OES_element_index_uint"); | 536 AddExtensionString("GL_OES_element_index_uint"); |
537 validators_.index_type.AddValue(GL_UNSIGNED_INT); | 537 validators_.index_type.AddValue(GL_UNSIGNED_INT); |
538 } | 538 } |
539 | 539 |
540 // With EXT_sRGB, unsized SRGB_EXT and SRGB_ALPHA_EXT are accepted by the | 540 // With EXT_sRGB, unsized SRGB_EXT and SRGB_ALPHA_EXT are accepted by the |
541 // <format> and <internalformat> parameter of TexImage2D. GLES3 adds support | 541 // <format> and <internalformat> parameter of TexImage2D. GLES3 adds support |
542 // for SRGB Textures but the accepted internal formats for TexImage2D are only | 542 // for SRGB Textures but the accepted internal formats for TexImage2D are only |
543 // sized formats GL_SRGB8 and GL_SRGB8_ALPHA8. Also, SRGB_EXT isn't a valid | 543 // sized formats GL_SRGB8 and GL_SRGB8_ALPHA8. Also, SRGB_EXT isn't a valid |
544 // <format> in this case. So, even with GLES3 explicitly check for | 544 // <format> in this case. So, even with GLES3 explicitly check for |
545 // GL_EXT_sRGB. | 545 // GL_EXT_sRGB. |
546 if ((((gl_version_info_->is_es3 || | 546 if ((((gl_version_info_->is_es3 || |
547 extensions.Contains("GL_OES_rgb8_rgba8")) && | 547 extensions.Contains("GL_OES_rgb8_rgba8")) && |
548 extensions.Contains("GL_EXT_sRGB")) || | 548 extensions.Contains("GL_EXT_sRGB")) || |
549 gfx::HasDesktopGLFeatures()) && | 549 gl::HasDesktopGLFeatures()) && |
550 (context_type_ == CONTEXT_TYPE_WEBGL1 || | 550 (context_type_ == CONTEXT_TYPE_WEBGL1 || |
551 context_type_ == CONTEXT_TYPE_OPENGLES2)) { | 551 context_type_ == CONTEXT_TYPE_OPENGLES2)) { |
552 AddExtensionString("GL_EXT_sRGB"); | 552 AddExtensionString("GL_EXT_sRGB"); |
553 validators_.texture_internal_format.AddValue(GL_SRGB_EXT); | 553 validators_.texture_internal_format.AddValue(GL_SRGB_EXT); |
554 validators_.texture_internal_format.AddValue(GL_SRGB_ALPHA_EXT); | 554 validators_.texture_internal_format.AddValue(GL_SRGB_ALPHA_EXT); |
555 validators_.texture_format.AddValue(GL_SRGB_EXT); | 555 validators_.texture_format.AddValue(GL_SRGB_EXT); |
556 validators_.texture_format.AddValue(GL_SRGB_ALPHA_EXT); | 556 validators_.texture_format.AddValue(GL_SRGB_ALPHA_EXT); |
557 validators_.render_buffer_format.AddValue(GL_SRGB8_ALPHA8_EXT); | 557 validators_.render_buffer_format.AddValue(GL_SRGB8_ALPHA8_EXT); |
558 validators_.frame_buffer_parameter.AddValue( | 558 validators_.frame_buffer_parameter.AddValue( |
559 GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT); | 559 GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
640 // glGetInteger64v. The GPUTimer class which implements timer queries can also | 640 // glGetInteger64v. The GPUTimer class which implements timer queries can also |
641 // fallback to an implementation that does not depend on glGetInteger64v on | 641 // fallback to an implementation that does not depend on glGetInteger64v on |
642 // ES2. Thus we can enable GL_EXT_disjoint_timer_query on ES2 contexts even | 642 // ES2. Thus we can enable GL_EXT_disjoint_timer_query on ES2 contexts even |
643 // though it does not support glGetInteger64v due to a specification bug. | 643 // though it does not support glGetInteger64v due to a specification bug. |
644 if (extensions.Contains("GL_EXT_disjoint_timer_query") || | 644 if (extensions.Contains("GL_EXT_disjoint_timer_query") || |
645 extensions.Contains("GL_ARB_timer_query") || | 645 extensions.Contains("GL_ARB_timer_query") || |
646 extensions.Contains("GL_EXT_timer_query")) { | 646 extensions.Contains("GL_EXT_timer_query")) { |
647 AddExtensionString("GL_EXT_disjoint_timer_query"); | 647 AddExtensionString("GL_EXT_disjoint_timer_query"); |
648 } | 648 } |
649 | 649 |
650 if (extensions.Contains("GL_OES_rgb8_rgba8") || gfx::HasDesktopGLFeatures()) { | 650 if (extensions.Contains("GL_OES_rgb8_rgba8") || gl::HasDesktopGLFeatures()) { |
651 AddExtensionString("GL_OES_rgb8_rgba8"); | 651 AddExtensionString("GL_OES_rgb8_rgba8"); |
652 validators_.render_buffer_format.AddValue(GL_RGB8_OES); | 652 validators_.render_buffer_format.AddValue(GL_RGB8_OES); |
653 validators_.render_buffer_format.AddValue(GL_RGBA8_OES); | 653 validators_.render_buffer_format.AddValue(GL_RGBA8_OES); |
654 } | 654 } |
655 | 655 |
656 // Check if we should allow GL_OES_texture_npot | 656 // Check if we should allow GL_OES_texture_npot |
657 if (!disallowed_features_.npot_support && | 657 if (!disallowed_features_.npot_support && |
658 (gl_version_info_->is_es3 || | 658 (gl_version_info_->is_es3 || |
659 gl_version_info_->is_desktop_core_profile || | 659 gl_version_info_->is_desktop_core_profile || |
660 extensions.Contains("GL_ARB_texture_non_power_of_two") || | 660 extensions.Contains("GL_ARB_texture_non_power_of_two") || |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
875 feature_flags_.ext_multisample_compatibility = true; | 875 feature_flags_.ext_multisample_compatibility = true; |
876 validators_.capability.AddValue(GL_MULTISAMPLE_EXT); | 876 validators_.capability.AddValue(GL_MULTISAMPLE_EXT); |
877 validators_.capability.AddValue(GL_SAMPLE_ALPHA_TO_ONE_EXT); | 877 validators_.capability.AddValue(GL_SAMPLE_ALPHA_TO_ONE_EXT); |
878 } | 878 } |
879 | 879 |
880 if (extensions.Contains("GL_INTEL_framebuffer_CMAA")) { | 880 if (extensions.Contains("GL_INTEL_framebuffer_CMAA")) { |
881 feature_flags_.chromium_screen_space_antialiasing = true; | 881 feature_flags_.chromium_screen_space_antialiasing = true; |
882 AddExtensionString("GL_CHROMIUM_screen_space_antialiasing"); | 882 AddExtensionString("GL_CHROMIUM_screen_space_antialiasing"); |
883 } | 883 } |
884 | 884 |
885 if (extensions.Contains("GL_OES_depth24") || gfx::HasDesktopGLFeatures() || | 885 if (extensions.Contains("GL_OES_depth24") || gl::HasDesktopGLFeatures() || |
886 gl_version_info_->is_es3) { | 886 gl_version_info_->is_es3) { |
887 AddExtensionString("GL_OES_depth24"); | 887 AddExtensionString("GL_OES_depth24"); |
888 feature_flags_.oes_depth24 = true; | 888 feature_flags_.oes_depth24 = true; |
889 validators_.render_buffer_format.AddValue(GL_DEPTH_COMPONENT24); | 889 validators_.render_buffer_format.AddValue(GL_DEPTH_COMPONENT24); |
890 } | 890 } |
891 | 891 |
892 if (gl_version_info_->is_es3 || | 892 if (gl_version_info_->is_es3 || |
893 extensions.Contains("GL_OES_standard_derivatives") || | 893 extensions.Contains("GL_OES_standard_derivatives") || |
894 gfx::HasDesktopGLFeatures()) { | 894 gl::HasDesktopGLFeatures()) { |
895 AddExtensionString("GL_OES_standard_derivatives"); | 895 AddExtensionString("GL_OES_standard_derivatives"); |
896 feature_flags_.oes_standard_derivatives = true; | 896 feature_flags_.oes_standard_derivatives = true; |
897 validators_.hint_target.AddValue(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES); | 897 validators_.hint_target.AddValue(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES); |
898 validators_.g_l_state.AddValue(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES); | 898 validators_.g_l_state.AddValue(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES); |
899 } | 899 } |
900 | 900 |
901 if (extensions.Contains("GL_OES_EGL_image_external")) { | 901 if (extensions.Contains("GL_OES_EGL_image_external")) { |
902 AddExtensionString("GL_OES_EGL_image_external"); | 902 AddExtensionString("GL_OES_EGL_image_external"); |
903 feature_flags_.oes_egl_image_external = true; | 903 feature_flags_.oes_egl_image_external = true; |
904 } | 904 } |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
972 // Rectangle textures are used as samplers via glBindTexture, framebuffer | 972 // Rectangle textures are used as samplers via glBindTexture, framebuffer |
973 // textures via glFramebufferTexture2D, and copy destinations via | 973 // textures via glFramebufferTexture2D, and copy destinations via |
974 // glCopyPixels. | 974 // glCopyPixels. |
975 validators_.texture_bind_target.AddValue(GL_TEXTURE_RECTANGLE_ARB); | 975 validators_.texture_bind_target.AddValue(GL_TEXTURE_RECTANGLE_ARB); |
976 validators_.texture_target.AddValue(GL_TEXTURE_RECTANGLE_ARB); | 976 validators_.texture_target.AddValue(GL_TEXTURE_RECTANGLE_ARB); |
977 validators_.get_tex_param_target.AddValue(GL_TEXTURE_RECTANGLE_ARB); | 977 validators_.get_tex_param_target.AddValue(GL_TEXTURE_RECTANGLE_ARB); |
978 validators_.g_l_state.AddValue(GL_TEXTURE_BINDING_RECTANGLE_ARB); | 978 validators_.g_l_state.AddValue(GL_TEXTURE_BINDING_RECTANGLE_ARB); |
979 } | 979 } |
980 | 980 |
981 #if defined(OS_MACOSX) | 981 #if defined(OS_MACOSX) |
982 if (gfx::GetGLImplementation() != gfx::kGLImplementationOSMesaGL) { | 982 if (gl::GetGLImplementation() != gl::kGLImplementationOSMesaGL) { |
983 AddExtensionString("GL_CHROMIUM_iosurface"); | 983 AddExtensionString("GL_CHROMIUM_iosurface"); |
984 AddExtensionString("GL_CHROMIUM_ycbcr_420v_image"); | 984 AddExtensionString("GL_CHROMIUM_ycbcr_420v_image"); |
985 feature_flags_.chromium_image_ycbcr_420v = true; | 985 feature_flags_.chromium_image_ycbcr_420v = true; |
986 } | 986 } |
987 #endif | 987 #endif |
988 | 988 |
989 if (extensions.Contains("GL_APPLE_ycbcr_422")) { | 989 if (extensions.Contains("GL_APPLE_ycbcr_422")) { |
990 AddExtensionString("GL_CHROMIUM_ycbcr_422_image"); | 990 AddExtensionString("GL_CHROMIUM_ycbcr_422_image"); |
991 feature_flags_.chromium_image_ycbcr_422 = true; | 991 feature_flags_.chromium_image_ycbcr_422 = true; |
992 } | 992 } |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1091 validators_.g_l_state.AddValue(GL_MAX_DRAW_BUFFERS_ARB); | 1091 validators_.g_l_state.AddValue(GL_MAX_DRAW_BUFFERS_ARB); |
1092 GLint max_draw_buffers = 0; | 1092 GLint max_draw_buffers = 0; |
1093 glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &max_draw_buffers); | 1093 glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &max_draw_buffers); |
1094 for (GLenum i = GL_DRAW_BUFFER0_ARB; | 1094 for (GLenum i = GL_DRAW_BUFFER0_ARB; |
1095 i < static_cast<GLenum>(GL_DRAW_BUFFER0_ARB + max_draw_buffers); | 1095 i < static_cast<GLenum>(GL_DRAW_BUFFER0_ARB + max_draw_buffers); |
1096 ++i) { | 1096 ++i) { |
1097 validators_.g_l_state.AddValue(i); | 1097 validators_.g_l_state.AddValue(i); |
1098 } | 1098 } |
1099 } | 1099 } |
1100 | 1100 |
1101 if (gl_version_info_->is_es3 || | 1101 if (gl_version_info_->is_es3 || extensions.Contains("GL_EXT_blend_minmax") || |
1102 extensions.Contains("GL_EXT_blend_minmax") || | 1102 gl::HasDesktopGLFeatures()) { |
1103 gfx::HasDesktopGLFeatures()) { | |
1104 AddExtensionString("GL_EXT_blend_minmax"); | 1103 AddExtensionString("GL_EXT_blend_minmax"); |
1105 validators_.equation.AddValue(GL_MIN_EXT); | 1104 validators_.equation.AddValue(GL_MIN_EXT); |
1106 validators_.equation.AddValue(GL_MAX_EXT); | 1105 validators_.equation.AddValue(GL_MAX_EXT); |
1107 static_assert(GL_MIN_EXT == GL_MIN && GL_MAX_EXT == GL_MAX, | 1106 static_assert(GL_MIN_EXT == GL_MIN && GL_MAX_EXT == GL_MAX, |
1108 "min & max variations must match"); | 1107 "min & max variations must match"); |
1109 } | 1108 } |
1110 | 1109 |
1111 // TODO(dshwang): GLES3 supports gl_FragDepth, not gl_FragDepthEXT. | 1110 // TODO(dshwang): GLES3 supports gl_FragDepth, not gl_FragDepthEXT. |
1112 if (extensions.Contains("GL_EXT_frag_depth") || gfx::HasDesktopGLFeatures()) { | 1111 if (extensions.Contains("GL_EXT_frag_depth") || gl::HasDesktopGLFeatures()) { |
1113 AddExtensionString("GL_EXT_frag_depth"); | 1112 AddExtensionString("GL_EXT_frag_depth"); |
1114 feature_flags_.ext_frag_depth = true; | 1113 feature_flags_.ext_frag_depth = true; |
1115 } | 1114 } |
1116 | 1115 |
1117 if (extensions.Contains("GL_EXT_shader_texture_lod") || | 1116 if (extensions.Contains("GL_EXT_shader_texture_lod") || |
1118 gfx::HasDesktopGLFeatures()) { | 1117 gl::HasDesktopGLFeatures()) { |
1119 AddExtensionString("GL_EXT_shader_texture_lod"); | 1118 AddExtensionString("GL_EXT_shader_texture_lod"); |
1120 feature_flags_.ext_shader_texture_lod = true; | 1119 feature_flags_.ext_shader_texture_lod = true; |
1121 } | 1120 } |
1122 | 1121 |
1123 bool ui_gl_fence_works = gfx::GLFence::IsSupported(); | 1122 bool ui_gl_fence_works = gl::GLFence::IsSupported(); |
1124 UMA_HISTOGRAM_BOOLEAN("GPU.FenceSupport", ui_gl_fence_works); | 1123 UMA_HISTOGRAM_BOOLEAN("GPU.FenceSupport", ui_gl_fence_works); |
1125 | 1124 |
1126 feature_flags_.map_buffer_range = | 1125 feature_flags_.map_buffer_range = |
1127 gl_version_info_->is_es3 || | 1126 gl_version_info_->is_es3 || |
1128 gl_version_info_->is_desktop_core_profile || | 1127 gl_version_info_->is_desktop_core_profile || |
1129 extensions.Contains("GL_ARB_map_buffer_range") || | 1128 extensions.Contains("GL_ARB_map_buffer_range") || |
1130 extensions.Contains("GL_EXT_map_buffer_range"); | 1129 extensions.Contains("GL_EXT_map_buffer_range"); |
1131 | 1130 |
1132 // Really it's part of core OpenGL 2.1 and up, but let's assume the | 1131 // Really it's part of core OpenGL 2.1 and up, but let's assume the |
1133 // extension is still advertised. | 1132 // extension is still advertised. |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1271 validators_.dst_blend_factor.AddValue(GL_SRC1_COLOR_EXT); | 1270 validators_.dst_blend_factor.AddValue(GL_SRC1_COLOR_EXT); |
1272 validators_.src_blend_factor.AddValue(GL_ONE_MINUS_SRC1_COLOR_EXT); | 1271 validators_.src_blend_factor.AddValue(GL_ONE_MINUS_SRC1_COLOR_EXT); |
1273 validators_.dst_blend_factor.AddValue(GL_ONE_MINUS_SRC1_COLOR_EXT); | 1272 validators_.dst_blend_factor.AddValue(GL_ONE_MINUS_SRC1_COLOR_EXT); |
1274 validators_.src_blend_factor.AddValue(GL_ONE_MINUS_SRC1_ALPHA_EXT); | 1273 validators_.src_blend_factor.AddValue(GL_ONE_MINUS_SRC1_ALPHA_EXT); |
1275 validators_.dst_blend_factor.AddValue(GL_ONE_MINUS_SRC1_ALPHA_EXT); | 1274 validators_.dst_blend_factor.AddValue(GL_ONE_MINUS_SRC1_ALPHA_EXT); |
1276 validators_.g_l_state.AddValue(GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT); | 1275 validators_.g_l_state.AddValue(GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT); |
1277 } | 1276 } |
1278 | 1277 |
1279 #if !defined(OS_MACOSX) | 1278 #if !defined(OS_MACOSX) |
1280 if (workarounds_.ignore_egl_sync_failures) { | 1279 if (workarounds_.ignore_egl_sync_failures) { |
1281 gfx::GLFenceEGL::SetIgnoreFailures(); | 1280 gl::GLFenceEGL::SetIgnoreFailures(); |
1282 } | 1281 } |
1283 #endif | 1282 #endif |
1284 | 1283 |
1285 if (workarounds_.avoid_egl_image_target_texture_reuse) { | 1284 if (workarounds_.avoid_egl_image_target_texture_reuse) { |
1286 TextureDefinition::AvoidEGLTargetTextureReuse(); | 1285 TextureDefinition::AvoidEGLTargetTextureReuse(); |
1287 } | 1286 } |
1288 | 1287 |
1289 if (gl_version_info_->IsLowerThanGL(4, 3)) { | 1288 if (gl_version_info_->IsLowerThanGL(4, 3)) { |
1290 // crbug.com/481184. | 1289 // crbug.com/481184. |
1291 // GL_PRIMITIVE_RESTART_FIXED_INDEX is only available on Desktop GL 4.3+, | 1290 // GL_PRIMITIVE_RESTART_FIXED_INDEX is only available on Desktop GL 4.3+, |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1395 if (pos == std::string::npos) { | 1394 if (pos == std::string::npos) { |
1396 extensions_ += (extensions_.empty() ? "" : " ") + str; | 1395 extensions_ += (extensions_.empty() ? "" : " ") + str; |
1397 } | 1396 } |
1398 } | 1397 } |
1399 | 1398 |
1400 FeatureInfo::~FeatureInfo() { | 1399 FeatureInfo::~FeatureInfo() { |
1401 } | 1400 } |
1402 | 1401 |
1403 } // namespace gles2 | 1402 } // namespace gles2 |
1404 } // namespace gpu | 1403 } // namespace gpu |
OLD | NEW |