| 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 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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), | 142 is_angle(false), |
| 143 is_swiftshader(false), | 143 is_swiftshader(false), |
| 144 angle_texture_usage(false), | 144 angle_texture_usage(false), |
| 145 ext_texture_storage(false), | 145 ext_texture_storage(false), |
| 146 chromium_path_rendering(false), | 146 chromium_path_rendering(false), |
| 147 blend_equation_advanced(false), | 147 blend_equation_advanced(false), |
| 148 blend_equation_advanced_coherent(false) { | 148 blend_equation_advanced_coherent(false), |
| 149 ext_texture_rg(false), |
| 150 enable_subscribe_uniform(false) { |
| 149 } | 151 } |
| 150 | 152 |
| 151 FeatureInfo::Workarounds::Workarounds() : | 153 FeatureInfo::Workarounds::Workarounds() : |
| 152 #define GPU_OP(type, name) name(false), | 154 #define GPU_OP(type, name) name(false), |
| 153 GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP) | 155 GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP) |
| 154 #undef GPU_OP | 156 #undef GPU_OP |
| 155 max_texture_size(0), | 157 max_texture_size(0), |
| 156 max_cube_map_texture_size(0), | 158 max_cube_map_texture_size(0), |
| 157 max_fragment_uniform_vectors(0), | 159 max_fragment_uniform_vectors(0), |
| 158 max_varying_vectors(0), | 160 max_varying_vectors(0), |
| (...skipping 13 matching lines...) Expand all Loading... |
| 172 std::string types = command_line.GetSwitchValueASCII( | 174 std::string types = command_line.GetSwitchValueASCII( |
| 173 switches::kGpuDriverBugWorkarounds); | 175 switches::kGpuDriverBugWorkarounds); |
| 174 StringToWorkarounds(types, &workarounds_); | 176 StringToWorkarounds(types, &workarounds_); |
| 175 } | 177 } |
| 176 feature_flags_.enable_shader_name_hashing = | 178 feature_flags_.enable_shader_name_hashing = |
| 177 !command_line.HasSwitch(switches::kDisableShaderNameHashing); | 179 !command_line.HasSwitch(switches::kDisableShaderNameHashing); |
| 178 | 180 |
| 179 feature_flags_.is_swiftshader = | 181 feature_flags_.is_swiftshader = |
| 180 (command_line.GetSwitchValueASCII(switches::kUseGL) == "swiftshader"); | 182 (command_line.GetSwitchValueASCII(switches::kUseGL) == "swiftshader"); |
| 181 | 183 |
| 184 feature_flags_.enable_subscribe_uniform = |
| 185 command_line.HasSwitch(switches::kEnableSubscribeUniformExtension); |
| 186 |
| 182 static const GLenum kAlphaTypes[] = { | 187 static const GLenum kAlphaTypes[] = { |
| 183 GL_UNSIGNED_BYTE, | 188 GL_UNSIGNED_BYTE, |
| 184 }; | 189 }; |
| 185 static const GLenum kRGBTypes[] = { | 190 static const GLenum kRGBTypes[] = { |
| 186 GL_UNSIGNED_BYTE, | 191 GL_UNSIGNED_BYTE, |
| 187 GL_UNSIGNED_SHORT_5_6_5, | 192 GL_UNSIGNED_SHORT_5_6_5, |
| 188 }; | 193 }; |
| 189 static const GLenum kRGBATypes[] = { | 194 static const GLenum kRGBATypes[] = { |
| 190 GL_UNSIGNED_BYTE, | 195 GL_UNSIGNED_BYTE, |
| 191 GL_UNSIGNED_SHORT_4_4_4_4, | 196 GL_UNSIGNED_SHORT_4_4_4_4, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 219 InitializeFeatures(); | 224 InitializeFeatures(); |
| 220 return true; | 225 return true; |
| 221 } | 226 } |
| 222 | 227 |
| 223 bool FeatureInfo::Initialize(const DisallowedFeatures& disallowed_features) { | 228 bool FeatureInfo::Initialize(const DisallowedFeatures& disallowed_features) { |
| 224 disallowed_features_ = disallowed_features; | 229 disallowed_features_ = disallowed_features; |
| 225 InitializeFeatures(); | 230 InitializeFeatures(); |
| 226 return true; | 231 return true; |
| 227 } | 232 } |
| 228 | 233 |
| 234 bool IsGL_REDSupportedOnFBOs() { |
| 235 // Skia uses GL_RED with frame buffers, unfortunately, Mesa claims to support |
| 236 // GL_EXT_texture_rg, but it doesn't support it on frame buffers. To fix |
| 237 // this, we try it, and if it fails, we don't expose GL_EXT_texture_rg. |
| 238 GLint fb_binding = 0; |
| 239 GLint tex_binding = 0; |
| 240 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &fb_binding); |
| 241 glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex_binding); |
| 242 |
| 243 GLuint textureId = 0; |
| 244 glGenTextures(1, &textureId); |
| 245 glBindTexture(GL_TEXTURE_2D, textureId); |
| 246 GLubyte data[1] = {0}; |
| 247 glTexImage2D(GL_TEXTURE_2D, 0, GL_RED_EXT, 1, 1, 0, GL_RED_EXT, |
| 248 GL_UNSIGNED_BYTE, data); |
| 249 GLuint textureFBOID = 0; |
| 250 glGenFramebuffersEXT(1, &textureFBOID); |
| 251 glBindFramebufferEXT(GL_FRAMEBUFFER, textureFBOID); |
| 252 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, |
| 253 textureId, 0); |
| 254 bool result = |
| 255 glCheckFramebufferStatusEXT(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_UNSUPPORTED; |
| 256 glDeleteFramebuffersEXT(1, &textureFBOID); |
| 257 glDeleteTextures(1, &textureId); |
| 258 |
| 259 glBindFramebufferEXT(GL_FRAMEBUFFER, static_cast<GLuint>(fb_binding)); |
| 260 glBindTexture(GL_TEXTURE_2D, static_cast<GLuint>(tex_binding)); |
| 261 |
| 262 DCHECK(glGetError() == GL_NO_ERROR); |
| 263 |
| 264 return result; |
| 265 } |
| 266 |
| 229 void FeatureInfo::InitializeFeatures() { | 267 void FeatureInfo::InitializeFeatures() { |
| 230 // Figure out what extensions to turn on. | 268 // Figure out what extensions to turn on. |
| 231 StringSet extensions( | 269 StringSet extensions( |
| 232 reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS))); | 270 reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS))); |
| 233 | 271 |
| 234 const char* renderer_str = | 272 const char* renderer_str = |
| 235 reinterpret_cast<const char*>(glGetString(GL_RENDERER)); | 273 reinterpret_cast<const char*>(glGetString(GL_RENDERER)); |
| 236 if (renderer_str) { | 274 if (renderer_str) { |
| 237 feature_flags_.is_angle = StartsWithASCII(renderer_str, "ANGLE", true); | 275 feature_flags_.is_angle = StartsWithASCII(renderer_str, "ANGLE", true); |
| 238 } | 276 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 254 AddExtensionString("GL_CHROMIUM_get_error_query"); | 292 AddExtensionString("GL_CHROMIUM_get_error_query"); |
| 255 AddExtensionString("GL_CHROMIUM_lose_context"); | 293 AddExtensionString("GL_CHROMIUM_lose_context"); |
| 256 AddExtensionString("GL_CHROMIUM_pixel_transfer_buffer_object"); | 294 AddExtensionString("GL_CHROMIUM_pixel_transfer_buffer_object"); |
| 257 AddExtensionString("GL_CHROMIUM_rate_limit_offscreen_context"); | 295 AddExtensionString("GL_CHROMIUM_rate_limit_offscreen_context"); |
| 258 AddExtensionString("GL_CHROMIUM_resize"); | 296 AddExtensionString("GL_CHROMIUM_resize"); |
| 259 AddExtensionString("GL_CHROMIUM_resource_safe"); | 297 AddExtensionString("GL_CHROMIUM_resource_safe"); |
| 260 AddExtensionString("GL_CHROMIUM_strict_attribs"); | 298 AddExtensionString("GL_CHROMIUM_strict_attribs"); |
| 261 AddExtensionString("GL_CHROMIUM_texture_mailbox"); | 299 AddExtensionString("GL_CHROMIUM_texture_mailbox"); |
| 262 AddExtensionString("GL_EXT_debug_marker"); | 300 AddExtensionString("GL_EXT_debug_marker"); |
| 263 | 301 |
| 302 if (feature_flags_.enable_subscribe_uniform) { |
| 303 AddExtensionString("GL_CHROMIUM_subscribe_uniform"); |
| 304 } |
| 305 |
| 264 // OES_vertex_array_object is emulated if not present natively, | 306 // OES_vertex_array_object is emulated if not present natively, |
| 265 // so the extension string is always exposed. | 307 // so the extension string is always exposed. |
| 266 AddExtensionString("GL_OES_vertex_array_object"); | 308 AddExtensionString("GL_OES_vertex_array_object"); |
| 267 | 309 |
| 268 if (!disallowed_features_.gpu_memory_manager) | 310 if (!disallowed_features_.gpu_memory_manager) |
| 269 AddExtensionString("GL_CHROMIUM_gpu_memory_manager"); | 311 AddExtensionString("GL_CHROMIUM_gpu_memory_manager"); |
| 270 | 312 |
| 271 if (extensions.Contains("GL_ANGLE_translated_shader_source")) { | 313 if (extensions.Contains("GL_ANGLE_translated_shader_source")) { |
| 272 feature_flags_.angle_translated_shader_source = true; | 314 feature_flags_.angle_translated_shader_source = true; |
| 273 } | 315 } |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 if (workarounds_.use_client_side_arrays_for_stream_buffers) { | 429 if (workarounds_.use_client_side_arrays_for_stream_buffers) { |
| 388 feature_flags_.native_vertex_array_object = false; | 430 feature_flags_.native_vertex_array_object = false; |
| 389 } | 431 } |
| 390 | 432 |
| 391 if (is_es3 || extensions.Contains("GL_OES_element_index_uint") || | 433 if (is_es3 || extensions.Contains("GL_OES_element_index_uint") || |
| 392 gfx::HasDesktopGLFeatures()) { | 434 gfx::HasDesktopGLFeatures()) { |
| 393 AddExtensionString("GL_OES_element_index_uint"); | 435 AddExtensionString("GL_OES_element_index_uint"); |
| 394 validators_.index_type.AddValue(GL_UNSIGNED_INT); | 436 validators_.index_type.AddValue(GL_UNSIGNED_INT); |
| 395 } | 437 } |
| 396 | 438 |
| 397 if (is_es3 || extensions.Contains("GL_EXT_sRGB") || | 439 // With EXT_sRGB, unsized SRGB_EXT and SRGB_ALPHA_EXT are accepted by the |
| 398 gfx::HasDesktopGLFeatures()) { | 440 // <format> and <internalformat> parameter of TexImage2D. GLES3 adds support |
| 441 // 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 |
| 443 // <format> in this case. So, even with GLES3 explicitly check for |
| 444 // GL_EXT_sRGB. |
| 445 if (((is_es3 || extensions.Contains("GL_OES_rgb8_rgba8")) && |
| 446 extensions.Contains("GL_EXT_sRGB")) || gfx::HasDesktopGLFeatures()) { |
| 399 AddExtensionString("GL_EXT_sRGB"); | 447 AddExtensionString("GL_EXT_sRGB"); |
| 400 texture_format_validators_[GL_SRGB_EXT].AddValue(GL_UNSIGNED_BYTE); | 448 texture_format_validators_[GL_SRGB_EXT].AddValue(GL_UNSIGNED_BYTE); |
| 401 texture_format_validators_[GL_SRGB_ALPHA_EXT].AddValue(GL_UNSIGNED_BYTE); | 449 texture_format_validators_[GL_SRGB_ALPHA_EXT].AddValue(GL_UNSIGNED_BYTE); |
| 402 validators_.texture_internal_format.AddValue(GL_SRGB_EXT); | 450 validators_.texture_internal_format.AddValue(GL_SRGB_EXT); |
| 403 validators_.texture_internal_format.AddValue(GL_SRGB_ALPHA_EXT); | 451 validators_.texture_internal_format.AddValue(GL_SRGB_ALPHA_EXT); |
| 404 validators_.texture_format.AddValue(GL_SRGB_EXT); | 452 validators_.texture_format.AddValue(GL_SRGB_EXT); |
| 405 validators_.texture_format.AddValue(GL_SRGB_ALPHA_EXT); | 453 validators_.texture_format.AddValue(GL_SRGB_ALPHA_EXT); |
| 406 validators_.render_buffer_format.AddValue(GL_SRGB8_ALPHA8_EXT); | 454 validators_.render_buffer_format.AddValue(GL_SRGB8_ALPHA8_EXT); |
| 407 validators_.frame_buffer_parameter.AddValue( | 455 validators_.frame_buffer_parameter.AddValue( |
| 408 GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT); | 456 GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT); |
| (...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 926 } | 974 } |
| 927 | 975 |
| 928 if (extensions.Contains("GL_NV_path_rendering")) { | 976 if (extensions.Contains("GL_NV_path_rendering")) { |
| 929 if (extensions.Contains("GL_EXT_direct_state_access") || is_es3) { | 977 if (extensions.Contains("GL_EXT_direct_state_access") || is_es3) { |
| 930 AddExtensionString("GL_CHROMIUM_path_rendering"); | 978 AddExtensionString("GL_CHROMIUM_path_rendering"); |
| 931 feature_flags_.chromium_path_rendering = true; | 979 feature_flags_.chromium_path_rendering = true; |
| 932 validators_.g_l_state.AddValue(GL_PATH_MODELVIEW_MATRIX_CHROMIUM); | 980 validators_.g_l_state.AddValue(GL_PATH_MODELVIEW_MATRIX_CHROMIUM); |
| 933 validators_.g_l_state.AddValue(GL_PATH_PROJECTION_MATRIX_CHROMIUM); | 981 validators_.g_l_state.AddValue(GL_PATH_PROJECTION_MATRIX_CHROMIUM); |
| 934 } | 982 } |
| 935 } | 983 } |
| 984 |
| 985 if ((is_es3 || extensions.Contains("GL_EXT_texture_rg") || |
| 986 extensions.Contains("GL_ARB_texture_rg")) && |
| 987 IsGL_REDSupportedOnFBOs()) { |
| 988 feature_flags_.ext_texture_rg = true; |
| 989 AddExtensionString("GL_EXT_texture_rg"); |
| 990 |
| 991 validators_.texture_format.AddValue(GL_RED_EXT); |
| 992 validators_.texture_format.AddValue(GL_RG_EXT); |
| 993 validators_.texture_internal_format.AddValue(GL_RED_EXT); |
| 994 validators_.texture_internal_format.AddValue(GL_RG_EXT); |
| 995 validators_.read_pixel_format.AddValue(GL_RED_EXT); |
| 996 validators_.read_pixel_format.AddValue(GL_RG_EXT); |
| 997 validators_.render_buffer_format.AddValue(GL_R8_EXT); |
| 998 validators_.render_buffer_format.AddValue(GL_RG8_EXT); |
| 999 |
| 1000 texture_format_validators_[GL_RED_EXT].AddValue(GL_UNSIGNED_BYTE); |
| 1001 texture_format_validators_[GL_RG_EXT].AddValue(GL_UNSIGNED_BYTE); |
| 1002 |
| 1003 if (enable_texture_float) { |
| 1004 texture_format_validators_[GL_RED_EXT].AddValue(GL_FLOAT); |
| 1005 texture_format_validators_[GL_RG_EXT].AddValue(GL_FLOAT); |
| 1006 } |
| 1007 if (enable_texture_half_float) { |
| 1008 texture_format_validators_[GL_RED_EXT].AddValue(GL_HALF_FLOAT_OES); |
| 1009 texture_format_validators_[GL_RG_EXT].AddValue(GL_HALF_FLOAT_OES); |
| 1010 } |
| 1011 } |
| 936 } | 1012 } |
| 937 | 1013 |
| 938 void FeatureInfo::AddExtensionString(const char* s) { | 1014 void FeatureInfo::AddExtensionString(const char* s) { |
| 939 std::string str(s); | 1015 std::string str(s); |
| 940 size_t pos = extensions_.find(str); | 1016 size_t pos = extensions_.find(str); |
| 941 while (pos != std::string::npos && | 1017 while (pos != std::string::npos && |
| 942 pos + str.length() < extensions_.length() && | 1018 pos + str.length() < extensions_.length() && |
| 943 extensions_.substr(pos + str.length(), 1) != " ") { | 1019 extensions_.substr(pos + str.length(), 1) != " ") { |
| 944 // This extension name is a substring of another. | 1020 // This extension name is a substring of another. |
| 945 pos = extensions_.find(str, pos + str.length()); | 1021 pos = extensions_.find(str, pos + str.length()); |
| 946 } | 1022 } |
| 947 if (pos == std::string::npos) { | 1023 if (pos == std::string::npos) { |
| 948 extensions_ += (extensions_.empty() ? "" : " ") + str; | 1024 extensions_ += (extensions_.empty() ? "" : " ") + str; |
| 949 } | 1025 } |
| 950 } | 1026 } |
| 951 | 1027 |
| 952 FeatureInfo::~FeatureInfo() { | 1028 FeatureInfo::~FeatureInfo() { |
| 953 } | 1029 } |
| 954 | 1030 |
| 955 } // namespace gles2 | 1031 } // namespace gles2 |
| 956 } // namespace gpu | 1032 } // namespace gpu |
| OLD | NEW |