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 |