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 |