| Index: content/gpu/gpu_info_collector_mac.mm
|
| ===================================================================
|
| --- content/gpu/gpu_info_collector_mac.mm (revision 201645)
|
| +++ content/gpu/gpu_info_collector_mac.mm (working copy)
|
| @@ -1,220 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "content/gpu/gpu_info_collector.h"
|
| -
|
| -#include <vector>
|
| -
|
| -#include "base/debug/trace_event.h"
|
| -#include "base/logging.h"
|
| -#include "base/mac/mac_util.h"
|
| -#include "base/mac/scoped_cftyperef.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/string_number_conversions.h"
|
| -#include "base/string_util.h"
|
| -#include "base/strings/string_piece.h"
|
| -#include "base/strings/sys_string_conversions.h"
|
| -#include "ui/gl/gl_bindings.h"
|
| -#include "ui/gl/gl_context.h"
|
| -#include "ui/gl/gl_implementation.h"
|
| -#include "ui/gl/gl_interface.h"
|
| -
|
| -#import <Cocoa/Cocoa.h>
|
| -#import <Foundation/Foundation.h>
|
| -#import <IOKit/IOKitLib.h>
|
| -
|
| -namespace {
|
| -
|
| -const UInt32 kVendorIDIntel = 0x8086;
|
| -const UInt32 kVendorIDNVidia = 0x10de;
|
| -const UInt32 kVendorIDAMD = 0x1002;
|
| -
|
| -// Return 0 if we couldn't find the property.
|
| -// The property values we use should not be 0, so it's OK to use 0 as failure.
|
| -UInt32 GetEntryProperty(io_registry_entry_t entry, CFStringRef property_name) {
|
| - base::mac::ScopedCFTypeRef<CFDataRef> data_ref(static_cast<CFDataRef>(
|
| - IORegistryEntrySearchCFProperty(entry,
|
| - kIOServicePlane,
|
| - property_name,
|
| - kCFAllocatorDefault,
|
| - kIORegistryIterateRecursively |
|
| - kIORegistryIterateParents)));
|
| - if (!data_ref)
|
| - return 0;
|
| -
|
| - UInt32 value = 0;
|
| - const UInt32* value_pointer =
|
| - reinterpret_cast<const UInt32*>(CFDataGetBytePtr(data_ref));
|
| - if (value_pointer != NULL)
|
| - value = *value_pointer;
|
| - return value;
|
| -}
|
| -
|
| -// Find the info of the current GPU.
|
| -content::GPUInfo::GPUDevice GetActiveGPU() {
|
| - content::GPUInfo::GPUDevice gpu;
|
| - io_registry_entry_t dsp_port = CGDisplayIOServicePort(kCGDirectMainDisplay);
|
| - gpu.vendor_id = GetEntryProperty(dsp_port, CFSTR("vendor-id"));
|
| - gpu.device_id = GetEntryProperty(dsp_port, CFSTR("device-id"));
|
| - return gpu;
|
| -}
|
| -
|
| -// Scan IO registry for PCI video cards.
|
| -bool CollectPCIVideoCardInfo(content::GPUInfo* gpu_info) {
|
| - DCHECK(gpu_info);
|
| -
|
| - // Collect all GPUs' info.
|
| - // match_dictionary will be consumed by IOServiceGetMatchingServices, no need
|
| - // to release it.
|
| - CFMutableDictionaryRef match_dictionary = IOServiceMatching("IOPCIDevice");
|
| - io_iterator_t entry_iterator;
|
| - std::vector<content::GPUInfo::GPUDevice> gpu_list;
|
| - if (IOServiceGetMatchingServices(kIOMasterPortDefault,
|
| - match_dictionary,
|
| - &entry_iterator) == kIOReturnSuccess) {
|
| - io_registry_entry_t entry;
|
| - while ((entry = IOIteratorNext(entry_iterator))) {
|
| - content::GPUInfo::GPUDevice gpu;
|
| - if (GetEntryProperty(entry, CFSTR("class-code")) != 0x30000) {
|
| - // 0x30000 : DISPLAY_VGA
|
| - continue;
|
| - }
|
| - gpu.vendor_id = GetEntryProperty(entry, CFSTR("vendor-id"));
|
| - gpu.device_id = GetEntryProperty(entry, CFSTR("device-id"));
|
| - if (gpu.vendor_id && gpu.device_id)
|
| - gpu_list.push_back(gpu);
|
| - }
|
| - IOObjectRelease(entry_iterator);
|
| - }
|
| -
|
| - switch (gpu_list.size()) {
|
| - case 0:
|
| - return false;
|
| - case 1:
|
| - gpu_info->gpu = gpu_list[0];
|
| - break;
|
| - case 2:
|
| - {
|
| - int integrated = -1;
|
| - int discrete = -1;
|
| - if (gpu_list[0].vendor_id == kVendorIDIntel)
|
| - integrated = 0;
|
| - else if (gpu_list[1].vendor_id == kVendorIDIntel)
|
| - integrated = 1;
|
| - if (integrated >= 0) {
|
| - switch (gpu_list[1 - integrated].vendor_id) {
|
| - case kVendorIDAMD:
|
| - gpu_info->amd_switchable = true;
|
| - discrete = 1 - integrated;
|
| - break;
|
| - case kVendorIDNVidia:
|
| - gpu_info->optimus = true;
|
| - discrete = 1 - integrated;
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| - }
|
| - if (integrated >= 0 && discrete >= 0) {
|
| - // We always put discrete GPU as primary for blacklisting purpose.
|
| - gpu_info->gpu = gpu_list[discrete];
|
| - gpu_info->secondary_gpus.push_back(gpu_list[integrated]);
|
| - break;
|
| - }
|
| - // If it's not optimus or amd_switchable, we put the current GPU as
|
| - // primary. Fall through to default.
|
| - }
|
| - default:
|
| - {
|
| - content::GPUInfo::GPUDevice active_gpu = GetActiveGPU();
|
| - size_t current = gpu_list.size();
|
| - if (active_gpu.vendor_id && active_gpu.device_id) {
|
| - for (size_t i = 0; i < gpu_list.size(); ++i) {
|
| - if (gpu_list[i].vendor_id == active_gpu.vendor_id &&
|
| - gpu_list[i].device_id == active_gpu.device_id) {
|
| - current = i;
|
| - break;
|
| - }
|
| - }
|
| - }
|
| - if (current == gpu_list.size()) {
|
| - // If we fail to identify the current GPU, select any one as primary.
|
| - current = 0;
|
| - }
|
| - for (size_t i = 0; i < gpu_list.size(); ++i) {
|
| - if (i == current)
|
| - gpu_info->gpu = gpu_list[i];
|
| - else
|
| - gpu_info->secondary_gpus.push_back(gpu_list[i]);
|
| - }
|
| - }
|
| - break;
|
| - }
|
| - return (gpu_info->gpu.vendor_id && gpu_info->gpu.device_id);
|
| -}
|
| -
|
| -} // namespace anonymous
|
| -
|
| -namespace gpu_info_collector {
|
| -
|
| -bool CollectContextGraphicsInfo(content::GPUInfo* gpu_info) {
|
| - DCHECK(gpu_info);
|
| -
|
| - TRACE_EVENT0("gpu", "gpu_info_collector::CollectGraphicsInfo");
|
| -
|
| - gpu_info->can_lose_context =
|
| - (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2);
|
| - gpu_info->finalized = true;
|
| - return CollectGraphicsInfoGL(gpu_info);
|
| -}
|
| -
|
| -GpuIDResult CollectGpuID(uint32* vendor_id, uint32* device_id) {
|
| - DCHECK(vendor_id && device_id);
|
| - *vendor_id = 0;
|
| - *device_id = 0;
|
| -
|
| - content::GPUInfo gpu_info;
|
| - if (CollectPCIVideoCardInfo(&gpu_info)) {
|
| - *vendor_id = gpu_info.gpu.vendor_id;
|
| - *device_id = gpu_info.gpu.device_id;
|
| - return kGpuIDSuccess;
|
| - }
|
| - return kGpuIDFailure;
|
| -}
|
| -
|
| -bool CollectBasicGraphicsInfo(content::GPUInfo* gpu_info) {
|
| - DCHECK(gpu_info);
|
| -
|
| - std::string model_name;
|
| - int32 model_major = 0, model_minor = 0;
|
| - base::mac::ParseModelIdentifier(base::mac::GetModelIdentifier(),
|
| - &model_name, &model_major, &model_minor);
|
| - ReplaceChars(model_name, " ", "_", &gpu_info->machine_model);
|
| - gpu_info->machine_model += " " + base::IntToString(model_major) +
|
| - "." + base::IntToString(model_minor);
|
| -
|
| - return CollectPCIVideoCardInfo(gpu_info);
|
| -}
|
| -
|
| -bool CollectDriverInfoGL(content::GPUInfo* gpu_info) {
|
| - DCHECK(gpu_info);
|
| -
|
| - // Extract the OpenGL driver version string from the GL_VERSION string.
|
| - // Mac OpenGL drivers have the driver version
|
| - // at the end of the gl version string preceded by a dash.
|
| - // Use some jiggery-pokery to turn that utf8 string into a std::wstring.
|
| - std::string gl_version_string = gpu_info->gl_version_string;
|
| - size_t pos = gl_version_string.find_last_of('-');
|
| - if (pos == std::string::npos)
|
| - return false;
|
| - gpu_info->driver_version = gl_version_string.substr(pos + 1);
|
| - return true;
|
| -}
|
| -
|
| -void MergeGPUInfo(content::GPUInfo* basic_gpu_info,
|
| - const content::GPUInfo& context_gpu_info) {
|
| - MergeGPUInfoGL(basic_gpu_info, context_gpu_info);
|
| -}
|
| -
|
| -} // namespace gpu_info_collector
|
|
|