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 "content/browser/gpu/compositor_util.h" | 5 #include "content/browser/gpu/compositor_util.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/feature_list.h" | 10 #include "base/feature_list.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 | 28 |
29 static bool IsGpuRasterizationBlacklisted() { | 29 static bool IsGpuRasterizationBlacklisted() { |
30 GpuDataManagerImpl* manager = GpuDataManagerImpl::GetInstance(); | 30 GpuDataManagerImpl* manager = GpuDataManagerImpl::GetInstance(); |
31 return manager->IsFeatureBlacklisted( | 31 return manager->IsFeatureBlacklisted( |
32 gpu::GPU_FEATURE_TYPE_GPU_RASTERIZATION); | 32 gpu::GPU_FEATURE_TYPE_GPU_RASTERIZATION); |
33 } | 33 } |
34 | 34 |
35 const char kGpuCompositingFeatureName[] = "gpu_compositing"; | 35 const char kGpuCompositingFeatureName[] = "gpu_compositing"; |
36 const char kWebGLFeatureName[] = "webgl"; | 36 const char kWebGLFeatureName[] = "webgl"; |
37 const char kRasterizationFeatureName[] = "rasterization"; | 37 const char kRasterizationFeatureName[] = "rasterization"; |
38 const char kMultipleRasterThreadsFeatureName[] = "multiple_raster_threads"; | 38 const char kMultipleCategorizedWorkerThreadsFeatureName[] = |
| 39 "multiple_categorized_worker_threads"; |
39 const char kNativeGpuMemoryBuffersFeatureName[] = "native_gpu_memory_buffers"; | 40 const char kNativeGpuMemoryBuffersFeatureName[] = "native_gpu_memory_buffers"; |
40 | 41 |
41 const int kMinRasterThreads = 1; | 42 const int kMinCategorizedWorkerThreads = 1; |
42 const int kMaxRasterThreads = 4; | 43 const int kMaxCategorizedWorkerThreads = 4; |
43 | 44 |
44 const int kMinMSAASampleCount = 0; | 45 const int kMinMSAASampleCount = 0; |
45 | 46 |
46 struct GpuFeatureInfo { | 47 struct GpuFeatureInfo { |
47 std::string name; | 48 std::string name; |
48 bool blocked; | 49 bool blocked; |
49 bool disabled; | 50 bool disabled; |
50 std::string disabled_description; | 51 std::string disabled_description; |
51 bool fallback_to_software; | 52 bool fallback_to_software; |
52 }; | 53 }; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 false}, | 120 false}, |
120 #endif | 121 #endif |
121 {kRasterizationFeatureName, | 122 {kRasterizationFeatureName, |
122 IsGpuRasterizationBlacklisted() && !IsGpuRasterizationEnabled() && | 123 IsGpuRasterizationBlacklisted() && !IsGpuRasterizationEnabled() && |
123 !IsForceGpuRasterizationEnabled(), | 124 !IsForceGpuRasterizationEnabled(), |
124 !IsGpuRasterizationEnabled() && !IsForceGpuRasterizationEnabled() && | 125 !IsGpuRasterizationEnabled() && !IsForceGpuRasterizationEnabled() && |
125 !IsGpuRasterizationBlacklisted(), | 126 !IsGpuRasterizationBlacklisted(), |
126 "Accelerated rasterization has been disabled, either via blacklist," | 127 "Accelerated rasterization has been disabled, either via blacklist," |
127 " about:flags or the command line.", | 128 " about:flags or the command line.", |
128 true}, | 129 true}, |
129 {kMultipleRasterThreadsFeatureName, false, | 130 {kMultipleCategorizedWorkerThreadsFeatureName, false, |
130 NumberOfRendererRasterThreads() == 1, "Raster is using a single thread.", | 131 NumberOfRendererCategorizedWorkerThreads() == 1, |
131 false}, | 132 "Categorized worker pool is using a single thread.", false}, |
132 {kNativeGpuMemoryBuffersFeatureName, false, | 133 {kNativeGpuMemoryBuffersFeatureName, false, |
133 !BrowserGpuMemoryBufferManager::IsNativeGpuMemoryBuffersEnabled(), | 134 !BrowserGpuMemoryBufferManager::IsNativeGpuMemoryBuffersEnabled(), |
134 "Native GpuMemoryBuffers have been disabled, either via about:flags" | 135 "Native GpuMemoryBuffers have been disabled, either via about:flags" |
135 " or command line.", | 136 " or command line.", |
136 true}, | 137 true}, |
137 }; | 138 }; |
138 DCHECK(index < arraysize(kGpuFeatureInfo)); | 139 DCHECK(index < arraysize(kGpuFeatureInfo)); |
139 *eof = (index == arraysize(kGpuFeatureInfo) - 1); | 140 *eof = (index == arraysize(kGpuFeatureInfo) - 1); |
140 return kGpuFeatureInfo[index]; | 141 return kGpuFeatureInfo[index]; |
141 } | 142 } |
142 | 143 |
143 } // namespace | 144 } // namespace |
144 | 145 |
145 int NumberOfRendererRasterThreads() { | 146 int NumberOfRendererCategorizedWorkerThreads() { |
146 int num_processors = base::SysInfo::NumberOfProcessors(); | 147 int num_processors = base::SysInfo::NumberOfProcessors(); |
147 | 148 |
148 #if defined(OS_ANDROID) | 149 #if defined(OS_ANDROID) |
149 // Android may report 6 to 8 CPUs for big.LITTLE configurations. | 150 // Android may report 6 to 8 CPUs for big.LITTLE configurations. |
150 // Limit the number of raster threads based on maximum of 4 big cores. | 151 // Limit the number of categorized worker threads based on maximum of 4 big |
| 152 // cores. |
151 num_processors = std::min(num_processors, 4); | 153 num_processors = std::min(num_processors, 4); |
152 #endif | 154 #endif |
153 | 155 |
154 int num_raster_threads = num_processors / 2; | 156 int num_categorized_worker_threads = num_processors / 2; |
155 | 157 |
156 #if defined(OS_ANDROID) | 158 #if defined(OS_ANDROID) |
157 // Limit the number of raster threads to 1 on Android. | 159 // Limit the number of categorized worker threads to 1 on Android. |
158 // TODO(reveman): Remove this when we have a better mechanims to prevent | 160 // TODO(reveman): Remove this when we have a better mechanism to prevent |
159 // pre-paint raster work from slowing down non-raster work. crbug.com/504515 | 161 // pre-paint raster work from slowing down non-raster work. crbug.com/504515 |
160 num_raster_threads = 1; | 162 num_categorized_worker_threads = 1; |
161 #endif | 163 #endif |
162 | 164 |
163 const base::CommandLine& command_line = | 165 const base::CommandLine& command_line = |
164 *base::CommandLine::ForCurrentProcess(); | 166 *base::CommandLine::ForCurrentProcess(); |
165 | 167 |
166 if (command_line.HasSwitch(switches::kNumRasterThreads)) { | 168 if (command_line.HasSwitch(switches::kNumCategorizedWorkerThreads)) { |
167 std::string string_value = command_line.GetSwitchValueASCII( | 169 std::string string_value = command_line.GetSwitchValueASCII( |
168 switches::kNumRasterThreads); | 170 switches::kNumCategorizedWorkerThreads); |
169 if (!base::StringToInt(string_value, &num_raster_threads)) { | 171 if (!base::StringToInt(string_value, &num_categorized_worker_threads)) { |
170 DLOG(WARNING) << "Failed to parse switch " << | 172 DLOG(WARNING) << "Failed to parse switch " |
171 switches::kNumRasterThreads << ": " << string_value; | 173 << switches::kNumCategorizedWorkerThreads << ": " |
| 174 << string_value; |
172 } | 175 } |
173 } | 176 } |
174 | 177 |
175 return cc::MathUtil::ClampToRange(num_raster_threads, kMinRasterThreads, | 178 return cc::MathUtil::ClampToRange(num_categorized_worker_threads, |
176 kMaxRasterThreads); | 179 kMinCategorizedWorkerThreads, |
| 180 kMaxCategorizedWorkerThreads); |
177 } | 181 } |
178 | 182 |
179 bool IsZeroCopyUploadEnabled() { | 183 bool IsZeroCopyUploadEnabled() { |
180 const base::CommandLine& command_line = | 184 const base::CommandLine& command_line = |
181 *base::CommandLine::ForCurrentProcess(); | 185 *base::CommandLine::ForCurrentProcess(); |
182 #if defined(OS_MACOSX) | 186 #if defined(OS_MACOSX) |
183 return !command_line.HasSwitch(switches::kDisableZeroCopy); | 187 return !command_line.HasSwitch(switches::kDisableZeroCopy); |
184 #else | 188 #else |
185 return command_line.HasSwitch(switches::kEnableZeroCopy); | 189 return command_line.HasSwitch(switches::kEnableZeroCopy); |
186 #endif | 190 #endif |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 status += "_off"; | 330 status += "_off"; |
327 } else { | 331 } else { |
328 status = "enabled"; | 332 status = "enabled"; |
329 if (gpu_feature_info.name == kWebGLFeatureName && | 333 if (gpu_feature_info.name == kWebGLFeatureName && |
330 manager->IsFeatureBlacklisted(gpu::GPU_FEATURE_TYPE_GPU_COMPOSITING)) | 334 manager->IsFeatureBlacklisted(gpu::GPU_FEATURE_TYPE_GPU_COMPOSITING)) |
331 status += "_readback"; | 335 status += "_readback"; |
332 if (gpu_feature_info.name == kRasterizationFeatureName) { | 336 if (gpu_feature_info.name == kRasterizationFeatureName) { |
333 if (IsForceGpuRasterizationEnabled()) | 337 if (IsForceGpuRasterizationEnabled()) |
334 status += "_force"; | 338 status += "_force"; |
335 } | 339 } |
336 if (gpu_feature_info.name == kMultipleRasterThreadsFeatureName) { | 340 if (gpu_feature_info.name == |
| 341 kMultipleCategorizedWorkerThreadsFeatureName) { |
337 const base::CommandLine& command_line = | 342 const base::CommandLine& command_line = |
338 *base::CommandLine::ForCurrentProcess(); | 343 *base::CommandLine::ForCurrentProcess(); |
339 if (command_line.HasSwitch(switches::kNumRasterThreads)) | 344 if (command_line.HasSwitch(switches::kNumCategorizedWorkerThreads)) |
340 status += "_force"; | 345 status += "_force"; |
341 } | 346 } |
342 if (gpu_feature_info.name == kMultipleRasterThreadsFeatureName) | 347 if (gpu_feature_info.name == kMultipleCategorizedWorkerThreadsFeatureName) |
343 status += "_on"; | 348 status += "_on"; |
344 } | 349 } |
345 if (gpu_feature_info.name == kWebGLFeatureName && | 350 if (gpu_feature_info.name == kWebGLFeatureName && |
346 (gpu_feature_info.blocked || gpu_access_blocked) && | 351 (gpu_feature_info.blocked || gpu_access_blocked) && |
347 manager->ShouldUseSwiftShader()) { | 352 manager->ShouldUseSwiftShader()) { |
348 status = "unavailable_software"; | 353 status = "unavailable_software"; |
349 } | 354 } |
350 | 355 |
351 feature_status_dict->SetString( | 356 feature_status_dict->SetString( |
352 gpu_feature_info.name.c_str(), status.c_str()); | 357 gpu_feature_info.name.c_str(), status.c_str()); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 } | 398 } |
394 } | 399 } |
395 return problem_list; | 400 return problem_list; |
396 } | 401 } |
397 | 402 |
398 std::vector<std::string> GetDriverBugWorkarounds() { | 403 std::vector<std::string> GetDriverBugWorkarounds() { |
399 return GpuDataManagerImpl::GetInstance()->GetDriverBugWorkarounds(); | 404 return GpuDataManagerImpl::GetInstance()->GetDriverBugWorkarounds(); |
400 } | 405 } |
401 | 406 |
402 } // namespace content | 407 } // namespace content |
OLD | NEW |