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

Unified Diff: gpu/config/gpu_info_collector.cc

Issue 1503223005: Identify the active GPU using GL strings in multiple GPU situation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/config/gpu_info_collector.h ('k') | gpu/config/gpu_info_collector_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/config/gpu_info_collector.cc
diff --git a/gpu/config/gpu_info_collector.cc b/gpu/config/gpu_info_collector.cc
index beda6fd5b96951f75415860d851951ba52db1bf5..20630c6f637cd7c69495fdc00a1e69226bd42237 100644
--- a/gpu/config/gpu_info_collector.cc
+++ b/gpu/config/gpu_info_collector.cc
@@ -13,6 +13,7 @@
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_piece.h"
#include "base/strings/string_split.h"
+#include "base/strings/string_util.h"
#include "base/trace_event/trace_event.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h"
@@ -78,6 +79,20 @@ std::string GetVersionFromString(const std::string& version_string) {
return std::string();
}
+// Return the array index of the found name, or return -1.
+int StringContainsName(
+ const std::string& str, const std::string* names, size_t num_names) {
+ std::vector<std::string> tokens = base::SplitString(
+ str, " .,()-_", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
+ for (size_t ii = 0; ii < tokens.size(); ++ii) {
+ for (size_t name_index = 0; name_index < num_names; ++name_index) {
+ if (tokens[ii] == names[name_index])
+ return name_index;
+ }
+ }
+ return -1;
+}
+
} // namespace anonymous
namespace gpu {
@@ -149,12 +164,17 @@ CollectInfoResult CollectGraphicsInfoGL(GPUInfo* gpu_info) {
gpu_info->pixel_shader_version = glsl_version;
gpu_info->vertex_shader_version = glsl_version;
+ IdentifyActiveGPU(gpu_info);
return CollectDriverInfoGL(gpu_info);
}
void MergeGPUInfoGL(GPUInfo* basic_gpu_info,
const GPUInfo& context_gpu_info) {
DCHECK(basic_gpu_info);
+ // Copy over GPUs because which one is active could change.
+ basic_gpu_info->gpu = context_gpu_info.gpu;
+ basic_gpu_info->secondary_gpus = context_gpu_info.secondary_gpus;
+
basic_gpu_info->gl_renderer = context_gpu_info.gl_renderer;
basic_gpu_info->gl_vendor = context_gpu_info.gl_vendor;
basic_gpu_info->gl_version = context_gpu_info.gl_version;
@@ -190,5 +210,63 @@ void MergeGPUInfoGL(GPUInfo* basic_gpu_info,
context_gpu_info.jpeg_decode_accelerator_supported;
}
+void IdentifyActiveGPU(GPUInfo* gpu_info) {
+ const std::string kNVidiaName = "nvidia";
+ const std::string kIntelName = "intel";
+ const std::string kAMDName = "amd";
+ const std::string kATIName = "ati";
+ const std::string kVendorNames[] = {
+ kNVidiaName, kIntelName, kAMDName, kATIName};
+
+ const uint32 kNVidiaID = 0x10de;
+ const uint32 kIntelID = 0x8086;
+ const uint32 kAMDID = 0x1002;
+ const uint32 kATIID = 0x1002;
+ const uint32 kVendorIDs[] = {
+ kNVidiaID, kIntelID, kAMDID, kATIID};
+
+ DCHECK(gpu_info);
+ if (gpu_info->secondary_gpus.size() == 0)
+ return;
+
+ uint32 active_vendor_id = 0;
+ if (!gpu_info->gl_vendor.empty()) {
+ std::string gl_vendor_lower = base::ToLowerASCII(gpu_info->gl_vendor);
+ int index = StringContainsName(
+ gl_vendor_lower, kVendorNames, arraysize(kVendorNames));
+ if (index >= 0) {
+ active_vendor_id = kVendorIDs[index];
+ }
+ }
+ if (active_vendor_id == 0 && !gpu_info->gl_renderer.empty()) {
+ std::string gl_renderer_lower = base::ToLowerASCII(gpu_info->gl_renderer);
+ int index = StringContainsName(
+ gl_renderer_lower, kVendorNames, arraysize(kVendorNames));
+ if (index >= 0) {
+ active_vendor_id = kVendorIDs[index];
+ }
+ }
+ if (active_vendor_id == 0) {
+ // We fail to identify the GPU vendor through GL_VENDOR/GL_RENDERER.
+ return;
+ }
+ gpu_info->gpu.active = false;
+ for (size_t ii = 0; ii < gpu_info->secondary_gpus.size(); ++ii)
+ gpu_info->secondary_gpus[ii].active = false;
+
+ // TODO(zmo): if two GPUs are from the same vendor, this code will always
+ // set the first GPU as active, which could be wrong.
+ if (active_vendor_id == gpu_info->gpu.vendor_id) {
+ gpu_info->gpu.active = true;
+ return;
+ }
+ for (size_t ii = 0; ii < gpu_info->secondary_gpus.size(); ++ii) {
+ if (active_vendor_id == gpu_info->secondary_gpus[ii].vendor_id) {
+ gpu_info->secondary_gpus[ii].active = true;
+ return;
+ }
+ }
+}
+
} // namespace gpu
« no previous file with comments | « gpu/config/gpu_info_collector.h ('k') | gpu/config/gpu_info_collector_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698