Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Side by Side Diff: gpu/command_buffer/service/feature_info.cc

Issue 761903003: Update from https://crrev.com/306655 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/feature_info.h ('k') | gpu/command_buffer/service/feature_info_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698