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/string_util.h" | 10 #include "base/string_util.h" |
11 #include "base/strings/string_number_conversions.h" | 11 #include "base/strings/string_number_conversions.h" |
12 #include "base/strings/string_split.h" | 12 #include "base/strings/string_split.h" |
13 #include "gpu/command_buffer/service/gl_utils.h" | 13 #include "gpu/command_buffer/service/gl_utils.h" |
14 #include "gpu/command_buffer/service/gpu_driver_bug_workaround_type.h" | |
15 #include "gpu/command_buffer/service/gpu_switches.h" | 14 #include "gpu/command_buffer/service/gpu_switches.h" |
16 #include "ui/gl/gl_implementation.h" | 15 #include "ui/gl/gl_implementation.h" |
17 #if defined(OS_MACOSX) | 16 #if defined(OS_MACOSX) |
18 #include "ui/surface/io_surface_support_mac.h" | 17 #include "ui/surface/io_surface_support_mac.h" |
19 #endif | 18 #endif |
20 | 19 |
21 namespace gpu { | 20 namespace gpu { |
22 namespace gles2 { | 21 namespace gles2 { |
23 | 22 |
24 namespace { | 23 namespace { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 void StringToWorkarounds( | 68 void StringToWorkarounds( |
70 const std::string& types, FeatureInfo::Workarounds* workarounds) { | 69 const std::string& types, FeatureInfo::Workarounds* workarounds) { |
71 DCHECK(workarounds); | 70 DCHECK(workarounds); |
72 std::vector<std::string> pieces; | 71 std::vector<std::string> pieces; |
73 base::SplitString(types, ',', &pieces); | 72 base::SplitString(types, ',', &pieces); |
74 for (size_t i = 0; i < pieces.size(); ++i) { | 73 for (size_t i = 0; i < pieces.size(); ++i) { |
75 int number = 0; | 74 int number = 0; |
76 bool succeed = base::StringToInt(pieces[i], &number); | 75 bool succeed = base::StringToInt(pieces[i], &number); |
77 DCHECK(succeed); | 76 DCHECK(succeed); |
78 switch (number) { | 77 switch (number) { |
79 case gpu::CLEAR_ALPHA_IN_READPIXELS: | 78 #define GPU_OP(type, name) \ |
80 workarounds->clear_alpha_in_readpixels = true; | 79 case gpu::type: \ |
81 break; | 80 workarounds->name = true; \ |
82 case gpu::CLEAR_UNIFORMS_BEFORE_PROGRAM_USE: | 81 break; |
83 workarounds->clear_uniforms_before_program_use = true; | 82 GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP) |
84 break; | 83 #undef GPU_OP |
85 case gpu::DELETE_INSTEAD_OF_RESIZE_FBO: | |
86 workarounds->delete_instead_of_resize_fbo = true; | |
87 break; | |
88 case gpu::DISABLE_ANGLE_FRAMEBUFFER_MULTISAMPLE: | |
89 workarounds->disable_angle_framebuffer_multisample = true; | |
90 break; | |
91 case gpu::DISABLE_DEPTH_TEXTURE: | |
92 workarounds->disable_depth_texture = true; | |
93 break; | |
94 case gpu::DISABLE_EXT_OCCLUSION_QUERY: | |
95 workarounds->disable_ext_occlusion_query = true; | |
96 break; | |
97 case gpu::ENABLE_CHROMIUM_FAST_NPOT_MO8_TEXTURES: | |
98 workarounds->enable_chromium_fast_npot_mo8_textures = true; | |
99 break; | |
100 case gpu::EXIT_ON_CONTEXT_LOST: | |
101 workarounds->exit_on_context_lost = true; | |
102 break; | |
103 case gpu::FLUSH_ON_CONTEXT_SWITCH: | |
104 workarounds->flush_on_context_switch = true; | |
105 break; | |
106 case gpu::MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_1024: | |
107 if (workarounds->max_cube_map_texture_size == 0 || | |
108 workarounds->max_cube_map_texture_size > 1024) | |
109 workarounds->max_cube_map_texture_size = 1024; | |
110 break; | |
111 case gpu::MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_4096: | |
112 if (workarounds->max_cube_map_texture_size == 0 || | |
113 workarounds->max_cube_map_texture_size > 4096) | |
114 workarounds->max_cube_map_texture_size = 4096; | |
115 break; | |
116 case gpu::MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_512: | |
117 if (workarounds->max_cube_map_texture_size == 0 || | |
118 workarounds->max_cube_map_texture_size > 512) | |
119 workarounds->max_cube_map_texture_size = 512; | |
120 break; | |
121 case gpu::MAX_TEXTURE_SIZE_LIMIT_4096: | |
122 if (workarounds->max_texture_size == 0 || | |
123 workarounds->max_texture_size > 4096) | |
124 workarounds->max_texture_size = 4096; | |
125 break; | |
126 case gpu::NEEDS_GLSL_BUILT_IN_FUNCTION_EMULATION: | |
127 workarounds->needs_glsl_built_in_function_emulation = true; | |
128 break; | |
129 case gpu::NEEDS_OFFSCREEN_BUFFER_WORKAROUND: | |
130 workarounds->needs_offscreen_buffer_workaround = true; | |
131 break; | |
132 case gpu::RESTORE_SCISSOR_ON_FBO_CHANGE: | |
133 workarounds->restore_scissor_on_fbo_change = true; | |
134 break; | |
135 case REVERSE_POINT_SPRITE_COORD_ORIGIN: | |
136 workarounds->reverse_point_sprite_coord_origin = true; | |
137 break; | |
138 case gpu::SET_TEXTURE_FILTER_BEFORE_GENERATING_MIPMAP: | |
139 workarounds->set_texture_filter_before_generating_mipmap = true; | |
140 break; | |
141 case gpu::USE_CLIENT_SIDE_ARRAYS_FOR_STREAM_BUFFERS: | |
142 workarounds->use_client_side_arrays_for_stream_buffers = true; | |
143 break; | |
144 case gpu::USE_CURRENT_PROGRAM_AFTER_SUCCESSFUL_LINK: | |
145 workarounds->use_current_program_after_successful_link = true; | |
146 break; | |
147 default: | 84 default: |
148 NOTIMPLEMENTED(); | 85 NOTIMPLEMENTED(); |
149 } | 86 } |
150 } | 87 } |
| 88 if (workarounds->max_texture_size_limit_4096) |
| 89 workarounds->max_texture_size = 4096; |
| 90 if (workarounds->max_cube_map_texture_size_limit_4096) |
| 91 workarounds->max_cube_map_texture_size = 4096; |
| 92 if (workarounds->max_cube_map_texture_size_limit_1024) |
| 93 workarounds->max_cube_map_texture_size = 1024; |
| 94 if (workarounds->max_cube_map_texture_size_limit_512) |
| 95 workarounds->max_cube_map_texture_size = 512; |
151 } | 96 } |
152 | 97 |
153 } // anonymous namespace. | 98 } // anonymous namespace. |
154 | 99 |
155 FeatureInfo::FeatureFlags::FeatureFlags() | 100 FeatureInfo::FeatureFlags::FeatureFlags() |
156 : chromium_framebuffer_multisample(false), | 101 : chromium_framebuffer_multisample(false), |
157 oes_standard_derivatives(false), | 102 oes_standard_derivatives(false), |
158 oes_egl_image_external(false), | 103 oes_egl_image_external(false), |
159 npot_ok(false), | 104 npot_ok(false), |
160 enable_texture_float_linear(false), | 105 enable_texture_float_linear(false), |
161 enable_texture_half_float_linear(false), | 106 enable_texture_half_float_linear(false), |
162 chromium_stream_texture(false), | 107 chromium_stream_texture(false), |
163 angle_translated_shader_source(false), | 108 angle_translated_shader_source(false), |
164 angle_pack_reverse_row_order(false), | 109 angle_pack_reverse_row_order(false), |
165 arb_texture_rectangle(false), | 110 arb_texture_rectangle(false), |
166 angle_instanced_arrays(false), | 111 angle_instanced_arrays(false), |
167 occlusion_query_boolean(false), | 112 occlusion_query_boolean(false), |
168 use_arb_occlusion_query2_for_occlusion_query_boolean(false), | 113 use_arb_occlusion_query2_for_occlusion_query_boolean(false), |
169 use_arb_occlusion_query_for_occlusion_query_boolean(false), | 114 use_arb_occlusion_query_for_occlusion_query_boolean(false), |
170 native_vertex_array_object(false), | 115 native_vertex_array_object(false), |
171 enable_shader_name_hashing(false), | 116 enable_shader_name_hashing(false), |
172 enable_samplers(false), | 117 enable_samplers(false), |
173 ext_draw_buffers(false) { | 118 ext_draw_buffers(false) { |
174 } | 119 } |
175 | 120 |
176 FeatureInfo::Workarounds::Workarounds() | 121 FeatureInfo::Workarounds::Workarounds() : |
177 : clear_alpha_in_readpixels(false), | 122 #define GPU_OP(type, name) name(false), |
178 clear_uniforms_before_program_use(false), | 123 GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP) |
179 delete_instead_of_resize_fbo(false), | 124 #undef GPU_OP |
180 disable_angle_framebuffer_multisample(false), | 125 max_texture_size(0), |
181 disable_depth_texture(false), | 126 max_cube_map_texture_size(0) { |
182 disable_ext_occlusion_query(false), | |
183 enable_chromium_fast_npot_mo8_textures(false), | |
184 exit_on_context_lost(false), | |
185 flush_on_context_switch(false), | |
186 needs_glsl_built_in_function_emulation(false), | |
187 needs_offscreen_buffer_workaround(false), | |
188 restore_scissor_on_fbo_change(false), | |
189 reverse_point_sprite_coord_origin(false), | |
190 set_texture_filter_before_generating_mipmap(false), | |
191 use_client_side_arrays_for_stream_buffers(false), | |
192 use_current_program_after_successful_link(false), | |
193 max_texture_size(0), | |
194 max_cube_map_texture_size(0) { | |
195 } | 127 } |
196 | 128 |
197 FeatureInfo::FeatureInfo() { | 129 FeatureInfo::FeatureInfo() { |
198 static const GLenum kAlphaTypes[] = { | 130 static const GLenum kAlphaTypes[] = { |
199 GL_UNSIGNED_BYTE, | 131 GL_UNSIGNED_BYTE, |
200 }; | 132 }; |
201 static const GLenum kRGBTypes[] = { | 133 static const GLenum kRGBTypes[] = { |
202 GL_UNSIGNED_BYTE, | 134 GL_UNSIGNED_BYTE, |
203 GL_UNSIGNED_SHORT_5_6_5, | 135 GL_UNSIGNED_SHORT_5_6_5, |
204 }; | 136 }; |
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 if (extensions_.find(str) == std::string::npos) { | 634 if (extensions_.find(str) == std::string::npos) { |
703 extensions_ += (extensions_.empty() ? "" : " ") + str; | 635 extensions_ += (extensions_.empty() ? "" : " ") + str; |
704 } | 636 } |
705 } | 637 } |
706 | 638 |
707 FeatureInfo::~FeatureInfo() { | 639 FeatureInfo::~FeatureInfo() { |
708 } | 640 } |
709 | 641 |
710 } // namespace gles2 | 642 } // namespace gles2 |
711 } // namespace gpu | 643 } // namespace gpu |
OLD | NEW |