From 76836ebe9fab7786e1af05fee9906e0a0967bccf Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Fri, 7 Jun 2019 09:32:26 -0700 Subject: [PATCH] Exposing a lot more details about displays on mac --- .../src/platform/backend/MACOSPlatform.cpp | 111 +++++++++++++++++- .../src/platform/backend/MACOSPlatform.h | 1 + .../src/platform/backend/PlatformInstance.cpp | 1 + .../src/platform/backend/PlatformInstance.h | 1 + 4 files changed, 113 insertions(+), 1 deletion(-) diff --git a/libraries/platform/src/platform/backend/MACOSPlatform.cpp b/libraries/platform/src/platform/backend/MACOSPlatform.cpp index 2607c47d5b..c7ab7c77a0 100644 --- a/libraries/platform/src/platform/backend/MACOSPlatform.cpp +++ b/libraries/platform/src/platform/backend/MACOSPlatform.cpp @@ -18,6 +18,9 @@ #include #include #include + +#include +#include #endif using namespace platform; @@ -33,18 +36,124 @@ void MACOSInstance::enumerateCpu() { } void MACOSInstance::enumerateGpu() { +#ifdef Q_OS_MAC +/* uint32_t cglDisplayMask = -1; // Iterate over all of them. + CGLRendererInfoObj rendererInfo; + GLint rendererInfoCount; + CGLError err = CGLQueryRendererInfo(cglDisplayMask, &rendererInfo, &rendererInfoCount); + GLint j, numRenderers = 0, deviceVRAM, bestVRAM = 0; + err = CGLQueryRendererInfo(cglDisplayMask, &rendererInfo, &numRenderers); + if (0 == err) { + // Iterate over all of them and use the figure for the one with the most VRAM, + // on the assumption that this is the one that will actually be used. + CGLDescribeRenderer(rendererInfo, 0, kCGLRPRendererCount, &numRenderers); + for (j = 0; j < numRenderers; j++) { + CGLDescribeRenderer(rendererInfo, j, kCGLRPVideoMemoryMegabytes, &deviceVRAM); + if (deviceVRAM > bestVRAM) { + bestVRAM = deviceVRAM; + isValid = true; + } + } + } + + //get gpu name + FILE* stream = popen("system_profiler SPDisplaysDataType | grep Chipset", "r"); + + std::ostringstream hostStream; + while (!feof(stream) && !ferror(stream)) { + char buf[128]; + int bytesRead = fread(buf, 1, 128, stream); + hostStream.write(buf, bytesRead); + } + + QString result = QString::fromStdString(hostStream.str()); + QStringList parts = result.split('\n'); + std::string name; + + for (int i = 0; i < parts.size(); ++i) { + if (parts[i].toLower().contains("radeon") || parts[i].toLower().contains("nvidia")) { + _name=parts[i]; + } + } + + _dedicatedMemoryMB = bestVRAM; + CGLDestroyRendererInfo(rendererInfo); +*/ + + // auto displayID = CGMainDisplayID(); + // auto displayGLMask = CGDisplayIDToOpenGLDisplayMask(displayID); + // auto metalDevice = CGDirectDisplayCopyCurrentMetalDevice(displayID); + GPUIdent* ident = GPUIdent::getInstance(); json gpu = {}; + gpu[keys::gpu::vendor] = ident->getName().toUtf8().constData(); gpu[keys::gpu::model] = ident->getName().toUtf8().constData(); gpu[keys::gpu::videoMemory] = ident->getMemory(); gpu[keys::gpu::driver] = ident->getDriver().toUtf8().constData(); _gpu.push_back(gpu); - _display = ident->getOutput(); + +#endif } +void MACOSInstance::enumerateDisplays() { +#ifdef Q_OS_MAC + auto displayID = CGMainDisplayID(); + auto displaySize = CGDisplayScreenSize(displayID); + auto displaySizeWidthInches = displaySize.width * 0.0393701; + auto displaySizeHeightInches = displaySize.height * 0.0393701; + auto displaySizeDiagonalInches = sqrt(displaySizeWidthInches * displaySizeWidthInches + displaySizeHeightInches * displaySizeHeightInches); + + auto displayPixelsWidth= CGDisplayPixelsWide(displayID); + auto displayPixelsHeight= CGDisplayPixelsHigh(displayID); + auto displayBounds = CGDisplayBounds(displayID); + auto displayMaster =CGDisplayIsMain(displayID); + + auto displayUnit =CGDisplayUnitNumber(displayID); + auto displayModel =CGDisplayModelNumber(displayID); + auto displayVendor = CGDisplayVendorNumber(displayID); + auto displaySerial = CGDisplaySerialNumber(displayID); + + auto displayMode = CGDisplayCopyDisplayMode(displayID); + auto displayModeWidth = CGDisplayModeGetPixelWidth(displayMode); + auto displayModeHeight = CGDisplayModeGetPixelHeight(displayMode); + auto displayRefreshrate = CGDisplayModeGetRefreshRate(displayMode); + + CGDisplayModeRelease(displayMode); + + json display = {}; + + // display["physicalWidth"] = displaySizeWidthInches; + // display["physicalHeight"] = displaySizeHeightInches; + display["physicalDiagonal"] = displaySizeDiagonalInches; + + // display["ppiH"] = displayModeWidth / displaySizeWidthInches; + // display["ppiV"] = displayModeHeight / displaySizeHeightInches; + display["ppi"] = sqrt(displayModeHeight * displayModeHeight + displayModeWidth * displayModeWidth) / displaySizeDiagonalInches; + + display["coordLeft"] = displayBounds.origin.x; + display["coordRight"] = displayBounds.origin.x + displayBounds.size.width; + display["coordTop"] = displayBounds.origin.y; + display["coordBottom"] = displayBounds.origin.y + displayBounds.size.height; + + display["isMaster"] = displayMaster; + + display["unit"] = displayUnit; + display["vendor"] = displayVendor; + display["model"] = displayModel; + display["serial"] = displaySerial; + + display["refreshrate"] =displayRefreshrate; + display["modeWidth"] = displayModeWidth; + display["modeHeight"] = displayModeHeight; + + + _display.push_back(display); +#endif +} + void MACOSInstance::enumerateMemory() { json ram = {}; diff --git a/libraries/platform/src/platform/backend/MACOSPlatform.h b/libraries/platform/src/platform/backend/MACOSPlatform.h index 1c66f5d742..4a257d8be5 100644 --- a/libraries/platform/src/platform/backend/MACOSPlatform.h +++ b/libraries/platform/src/platform/backend/MACOSPlatform.h @@ -18,6 +18,7 @@ namespace platform { void enumerateCpu() override; void enumerateMemory() override; void enumerateGpu() override; + void enumerateDisplays() override; void enumerateComputer () override; }; diff --git a/libraries/platform/src/platform/backend/PlatformInstance.cpp b/libraries/platform/src/platform/backend/PlatformInstance.cpp index 164fdb924f..3dd3e5f592 100644 --- a/libraries/platform/src/platform/backend/PlatformInstance.cpp +++ b/libraries/platform/src/platform/backend/PlatformInstance.cpp @@ -18,6 +18,7 @@ bool Instance::enumeratePlatform() { enumerateComputer(); enumerateCpu(); enumerateGpu(); + enumerateDisplays(); enumerateMemory(); // And profile the platform and put the tier in "computer" diff --git a/libraries/platform/src/platform/backend/PlatformInstance.h b/libraries/platform/src/platform/backend/PlatformInstance.h index 52fa9ec3f2..95eb2ef25e 100644 --- a/libraries/platform/src/platform/backend/PlatformInstance.h +++ b/libraries/platform/src/platform/backend/PlatformInstance.h @@ -37,6 +37,7 @@ public: void virtual enumerateCpu()=0; void virtual enumerateMemory()=0; void virtual enumerateGpu()=0; + void virtual enumerateDisplays() {} void virtual enumerateComputer()=0; virtual ~Instance();