| Index: chrome/gpu/gpu_info_collector_mac.mm
|
| ===================================================================
|
| --- chrome/gpu/gpu_info_collector_mac.mm (revision 71329)
|
| +++ chrome/gpu/gpu_info_collector_mac.mm (working copy)
|
| @@ -16,10 +16,10 @@
|
| #import <Foundation/Foundation.h>
|
| #import <IOKit/IOKitLib.h>
|
|
|
| -namespace gpu_info_collector {
|
| +namespace {
|
|
|
| -static CFTypeRef SearchPortForProperty(io_registry_entry_t dspPort,
|
| - CFStringRef propertyName) {
|
| +CFTypeRef SearchPortForProperty(io_registry_entry_t dspPort,
|
| + CFStringRef propertyName) {
|
| return IORegistryEntrySearchCFProperty(dspPort,
|
| kIOServicePlane,
|
| propertyName,
|
| @@ -28,145 +28,65 @@
|
| kIORegistryIterateParents);
|
| }
|
|
|
| -static void CFReleaseIf(CFTypeRef type_ref) {
|
| - if (type_ref)
|
| - CFRelease(type_ref);
|
| -}
|
| +UInt32 IntValueOfCFData(CFDataRef data_ref) {
|
| + DCHECK(data_ref);
|
|
|
| -static UInt32 IntValueOfCFData(CFDataRef data_ref) {
|
| UInt32 value = 0;
|
| -
|
| - if (data_ref) {
|
| - const UInt32 *value_pointer =
|
| - reinterpret_cast<const UInt32*>(CFDataGetBytePtr(data_ref));
|
| - if (value_pointer != NULL)
|
| - value = *value_pointer;
|
| - }
|
| -
|
| + const UInt32* value_pointer =
|
| + reinterpret_cast<const UInt32*>(CFDataGetBytePtr(data_ref));
|
| + if (value_pointer != NULL)
|
| + value = *value_pointer;
|
| return value;
|
| }
|
|
|
| -static void CollectVideoCardInfo(CGDirectDisplayID displayID,
|
| - int *vendorID,
|
| - int *deviceID) {
|
| - io_registry_entry_t dspPort = CGDisplayIOServicePort(displayID);
|
| +} // namespace anonymous
|
|
|
| - CFTypeRef vendorIDRef = SearchPortForProperty(dspPort, CFSTR("vendor-id"));
|
| - if (vendorID) *vendorID = IntValueOfCFData((CFDataRef)vendorIDRef);
|
| +namespace gpu_info_collector {
|
|
|
| - CFTypeRef deviceIDRef = SearchPortForProperty(dspPort, CFSTR("device-id"));
|
| - if (deviceID) *deviceID = IntValueOfCFData((CFDataRef)deviceIDRef);
|
| +bool CollectGraphicsInfo(GPUInfo* gpu_info) {
|
| + DCHECK(gpu_info);
|
|
|
| - CFReleaseIf(vendorIDRef);
|
| - CFReleaseIf(deviceIDRef);
|
| + gpu_info->SetCanLoseContext(
|
| + gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2);
|
| + gpu_info->SetProgress(GPUInfo::kComplete);
|
| + return CollectGraphicsInfoGL(gpu_info);
|
| }
|
|
|
| -// Return a pointer to the last character with value c in string s.
|
| -// Returns NULL if c is not found.
|
| -static char* FindLastChar(char *s, char c) {
|
| - char *s_found = NULL;
|
| +bool CollectVideoCardInfo(GPUInfo* gpu_info) {
|
| + DCHECK(gpu_info);
|
|
|
| - while (*s != '\0') {
|
| - if (*s == c)
|
| - s_found = s;
|
| - s++;
|
| - }
|
| - return s_found;
|
| -}
|
| + if (gfx::GetGLImplementation() != gfx::kGLImplementationDesktopGL)
|
| + return false;
|
|
|
| -// Gets the numeric HLSL version.
|
| -// You pass it the current GL major version, to give it a hint where to look.
|
| -static int GetShaderNumericVersion(int gl_major_version) {
|
| - int gl_hlsl_major = 0, gl_hlsl_minor = 0;
|
| - int shader_version = 0;
|
| -
|
| - if (gl_major_version == 1) {
|
| - const char *gl_extensions_string = (const char*)glGetString(GL_EXTENSIONS);
|
| - if (gl_extensions_string &&
|
| - strstr(gl_extensions_string, "GL_ARB_shading_language_100")) {
|
| - gl_hlsl_major = 1;
|
| - gl_hlsl_minor = 0;
|
| - }
|
| - } else if (gl_major_version > 1) {
|
| - const char *glsl_version_string =
|
| - (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION);
|
| - if (glsl_version_string)
|
| - sscanf(glsl_version_string, "%u.%u", &gl_hlsl_major, &gl_hlsl_minor);
|
| + UInt32 vendor_id = 0, device_id = 0;
|
| + io_registry_entry_t dsp_port = CGDisplayIOServicePort(kCGDirectMainDisplay);
|
| + CFTypeRef vendor_id_ref = SearchPortForProperty(dsp_port, CFSTR("vendor-id"));
|
| + if (vendor_id_ref) {
|
| + vendor_id = IntValueOfCFData((CFDataRef)vendor_id_ref);
|
| + CFRelease(vendor_id_ref);
|
| }
|
| + CFTypeRef device_id_ref = SearchPortForProperty(dsp_port, CFSTR("device-id"));
|
| + if (device_id_ref) {
|
| + device_id = IntValueOfCFData((CFDataRef)device_id_ref);
|
| + CFRelease(device_id_ref);
|
| + }
|
|
|
| - shader_version = (gl_hlsl_major << 8) | (gl_hlsl_minor & 0xFF);
|
| - return shader_version;
|
| + gpu_info->SetVideoCardInfo(vendor_id, device_id);
|
| + return true;
|
| }
|
|
|
| +bool CollectDriverInfo(GPUInfo* gpu_info) {
|
| + DCHECK(gpu_info);
|
|
|
| -static std::wstring CStringToWString(const char *s) {
|
| - base::StringPiece sp(s);
|
| - return base::SysUTF8ToWide(sp);
|
| -}
|
| -
|
| -
|
| -// Returns the driver version string as its value, and also returns the
|
| -// gl version and shader language version by setting the arguments pointed to.
|
| -static std::wstring CollectGLInfo(int *out_gl_version,
|
| - int *out_shader_version) {
|
| - int gl_major = 0, gl_minor = 0;
|
| - char *gl_version_string = NULL;
|
| - std::wstring driver_version;
|
| -
|
| - gl_version_string = (char*)glGetString(GL_VERSION);
|
| - sscanf(gl_version_string, "%u.%u", &gl_major, &gl_minor);
|
| -
|
| - *out_gl_version = (gl_major << 8) | (gl_minor & 0xFF);
|
| - *out_shader_version = GetShaderNumericVersion(gl_major);
|
| -
|
| // 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.
|
| - char *s = FindLastChar(gl_version_string, '-');
|
| - if (s)
|
| - driver_version = CStringToWString(s + 1);
|
| -
|
| - return driver_version;
|
| -}
|
| -
|
| -
|
| -bool CollectGraphicsInfo(GPUInfo* gpu_info) {
|
| - if (gfx::GetGLImplementation() != gfx::kGLImplementationDesktopGL)
|
| + 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;
|
| - // Video Card data.
|
| - int vendor_id = 0, device_id = 0;
|
| - // OpenGL data.
|
| - std::wstring driver_version = L"";
|
| - int gl_version = 0, shader_version = 0;
|
| -
|
| - CollectVideoCardInfo(kCGDirectMainDisplay, &vendor_id, &device_id);
|
| -
|
| - // Temporarily make an offscreen GL context so we can gather info from it.
|
| - if (gfx::GLContext::InitializeOneOff()) {
|
| - scoped_ptr<gfx::GLContext> ctx(
|
| - gfx::GLContext::CreateOffscreenGLContext(NULL));
|
| - if (ctx.get()) {
|
| - if (ctx->MakeCurrent()) {
|
| - driver_version = CollectGLInfo(&gl_version, &shader_version);
|
| - }
|
| - ctx->Destroy();
|
| - }
|
| - }
|
| -
|
| -
|
| - // OpenGL doesn't have separate versions for pixel and vertex shader
|
| - // languages, so we just pass the shader_version for both.
|
| - gpu_info->SetGraphicsInfo(vendor_id,
|
| - device_id,
|
| - driver_version,
|
| - shader_version,
|
| - shader_version,
|
| - gl_version,
|
| - false);
|
| -
|
| - gpu_info->SetProgress(GPUInfo::kComplete);
|
| -
|
| + gpu_info->SetDriverInfo("", gl_version_string.substr(pos + 1));
|
| return true;
|
| }
|
|
|
|
|