From 7701710aa5e4241e7b98a06ddd434dcf2572d24c Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 19 Jun 2019 15:02:16 -0700 Subject: [PATCH 1/4] Consider a NetworkClipLoader resource with null URL to be failed --- libraries/recording/src/recording/ClipCache.cpp | 8 +++++++- .../script-engine/src/RecordingScriptingInterface.cpp | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/libraries/recording/src/recording/ClipCache.cpp b/libraries/recording/src/recording/ClipCache.cpp index bc20e4d8eb..0fc65a2d79 100644 --- a/libraries/recording/src/recording/ClipCache.cpp +++ b/libraries/recording/src/recording/ClipCache.cpp @@ -18,7 +18,13 @@ using namespace recording; NetworkClipLoader::NetworkClipLoader(const QUrl& url) : Resource(url), - _clip(std::make_shared(url)) {} + _clip(std::make_shared(url)) { + if (url.isEmpty()) { + _loaded = false; + _startedLoading = false; + _failedToLoad = true; + } +} void NetworkClip::init(const QByteArray& clipData) { _clipData = clipData; diff --git a/libraries/script-engine/src/RecordingScriptingInterface.cpp b/libraries/script-engine/src/RecordingScriptingInterface.cpp index f3bcbe6bb7..e57d80274a 100644 --- a/libraries/script-engine/src/RecordingScriptingInterface.cpp +++ b/libraries/script-engine/src/RecordingScriptingInterface.cpp @@ -93,7 +93,7 @@ void RecordingScriptingInterface::loadRecording(const QString& url, QScriptValue // when clip load fails, call the callback with the URL and failure boolean connect(clipLoader.data(), &recording::NetworkClipLoader::failed, callback.engine(), [this, weakClipLoader, url, callback](QNetworkReply::NetworkError error) mutable { - qCDebug(scriptengine) << "Failed to load recording from" << url; + qCDebug(scriptengine) << "Failed to load recording from\"" << url << '"'; if (callback.isFunction()) { QScriptValueList args { false, url }; From c215831df8b625c0bd8c8ad3a522ad508aabbafa Mon Sep 17 00:00:00 2001 From: Anna Date: Wed, 19 Jun 2019 15:41:53 -0700 Subject: [PATCH 2/4] fixed potential unreachable code warnings --- .../display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp index 5e1c720ba3..4258d4db75 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp @@ -112,15 +112,17 @@ bool Basic2DWindowOpenGLDisplayPlugin::internalActivate() { gpu::PipelinePointer Basic2DWindowOpenGLDisplayPlugin::getCompositeScenePipeline() { #if defined(Q_OS_ANDROID) return _linearToSRGBPipeline; -#endif +#else return _SRGBToLinearPipeline; +#endif } gpu::Element Basic2DWindowOpenGLDisplayPlugin::getCompositeFBColorSpace() { #if defined(Q_OS_ANDROID) return gpu::Element::COLOR_SRGBA_32; -#endif +#else return gpu::Element::COLOR_RGBA_32; +#endif } From f2e3218ec0a230648eb6128bc40fcf45ad21f0f1 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Wed, 19 Jun 2019 16:34:38 -0700 Subject: [PATCH 3/4] possible fix for do_setPipeline crash and other mac fixes --- .../display-plugins/OpenGLDisplayPlugin.cpp | 16 ++-------- .../src/display-plugins/OpenGLDisplayPlugin.h | 3 +- .../display-plugins/hmd/HmdDisplayPlugin.cpp | 31 +++++++------------ .../display-plugins/hmd/HmdDisplayPlugin.h | 7 ++--- .../physics/src/PhysicalEntitySimulation.cpp | 30 +++++++++--------- .../physics/src/ThreadSafeDynamicsWorld.cpp | 2 +- .../plugins/src/plugins/DisplayPlugin.cpp | 9 ------ libraries/plugins/src/plugins/DisplayPlugin.h | 5 +-- .../render-utils/src/RenderCommonTask.cpp | 2 +- libraries/render/src/render/Args.h | 16 +++++----- 10 files changed, 45 insertions(+), 76 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp index aa1233ce22..73bc1d0aad 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp @@ -593,9 +593,10 @@ std::function OpenGL hudEyeViewports[eye] = eyeViewport(eye); }); return [=](gpu::Batch& batch, const gpu::TexturePointer& hudTexture, bool mirror) { - if (hudPipeline && hudTexture) { + auto pipeline = mirror ? hudMirrorPipeline : hudPipeline; + if (pipeline && hudTexture) { batch.enableStereo(false); - batch.setPipeline(mirror ? hudMirrorPipeline : hudPipeline); + batch.setPipeline(pipeline); batch.setResourceTexture(0, hudTexture); if (hudStereo) { for_each_eye([&](Eye eye) { @@ -661,17 +662,6 @@ void OpenGLDisplayPlugin::compositeLayers() { compositeScene(); } -#ifdef HIFI_ENABLE_NSIGHT_DEBUG - if (false) // do not draw the HUD if running nsight debug -#endif - { - PROFILE_RANGE_EX(render_detail, "handleHUDBatch", 0xff0077ff, (uint64_t)presentCount()) - auto hudOperator = getHUDOperator(); - withPresentThreadLock([&] { - _hudOperator = hudOperator; - }); - } - { PROFILE_RANGE_EX(render_detail, "compositeExtra", 0xff0077ff, (uint64_t)presentCount()) compositeExtra(); diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h index 672d9a4beb..eae9f86710 100644 --- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h @@ -86,6 +86,8 @@ public: void copyTextureToQuickFramebuffer(NetworkTexturePointer source, QOpenGLFramebufferObject* target, GLsync* fenceSync) override; + virtual std::function getHUDOperator() override; + protected: friend class PresentThread; @@ -102,7 +104,6 @@ protected: virtual QThread::Priority getPresentPriority() { return QThread::HighPriority; } virtual void compositeLayers(); virtual void compositeScene(); - virtual std::function getHUDOperator(); virtual void compositePointer(); virtual void compositeExtra() {}; diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp index 874454b391..3952c2c90e 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp @@ -1,4 +1,4 @@ -// +// // Created by Bradley Austin Davis on 2016/02/15 // Copyright 2016 High Fidelity, Inc. // @@ -402,25 +402,18 @@ void HmdDisplayPlugin::HUDRenderer::build() { format->setAttribute(gpu::Stream::POSITION, gpu::Stream::POSITION, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0); format->setAttribute(gpu::Stream::TEXCOORD, gpu::Stream::TEXCOORD, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV)); uniformsBuffer = std::make_shared(sizeof(Uniforms), nullptr); - updatePipeline(); + + auto program = gpu::Shader::createProgram(shader::render_utils::program::hmd_ui); + gpu::StatePointer state = gpu::StatePointer(new gpu::State()); + state->setDepthTest(gpu::State::DepthTest(true, true, gpu::LESS_EQUAL)); + state->setBlendFunction(true, + gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, + gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); + + pipeline = gpu::Pipeline::create(program, state); } -void HmdDisplayPlugin::HUDRenderer::updatePipeline() { - if (!pipeline) { - auto program = gpu::Shader::createProgram(shader::render_utils::program::hmd_ui); - gpu::StatePointer state = gpu::StatePointer(new gpu::State()); - state->setDepthTest(gpu::State::DepthTest(true, true, gpu::LESS_EQUAL)); - state->setBlendFunction(true, - gpu::State::SRC_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::INV_SRC_ALPHA, - gpu::State::FACTOR_ALPHA, gpu::State::BLEND_OP_ADD, gpu::State::ONE); - - pipeline = gpu::Pipeline::create(program, state); - } -} - -std::function HmdDisplayPlugin::HUDRenderer::render(HmdDisplayPlugin& plugin) { - updatePipeline(); - +std::function HmdDisplayPlugin::HUDRenderer::render() { auto hudPipeline = pipeline; auto hudFormat = format; auto hudVertices = vertices; @@ -479,7 +472,7 @@ void HmdDisplayPlugin::compositePointer() { } std::function HmdDisplayPlugin::getHUDOperator() { - return _hudRenderer.render(*this); + return _hudRenderer.render(); } HmdDisplayPlugin::~HmdDisplayPlugin() { diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h index e952b1e8db..9942222f48 100644 --- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h @@ -48,6 +48,7 @@ public: void pluginUpdate() override {}; + std::function getHUDOperator() override; virtual StencilMaskMode getStencilMaskMode() const override { return StencilMaskMode::PAINT; } signals: @@ -62,7 +63,6 @@ protected: bool internalActivate() override; void internalDeactivate() override; - std::function getHUDOperator() override; void compositePointer() override; void internalPresent() override; void customizeContext() override; @@ -105,7 +105,7 @@ private: gpu::BufferPointer vertices; gpu::BufferPointer indices; uint32_t indexCount { 0 }; - gpu::PipelinePointer pipeline; + gpu::PipelinePointer pipeline { nullptr }; gpu::BufferPointer uniformsBuffer; @@ -123,7 +123,6 @@ private: static const int VERTEX_STRIDE { sizeof(Vertex) }; void build(); - void updatePipeline(); - std::function render(HmdDisplayPlugin& plugin); + std::function render(); } _hudRenderer; }; diff --git a/libraries/physics/src/PhysicalEntitySimulation.cpp b/libraries/physics/src/PhysicalEntitySimulation.cpp index f532d5209f..0a08aaa28d 100644 --- a/libraries/physics/src/PhysicalEntitySimulation.cpp +++ b/libraries/physics/src/PhysicalEntitySimulation.cpp @@ -309,20 +309,28 @@ void PhysicalEntitySimulation::buildMotionStatesForEntitiesThatNeedThem() { SetOfEntities::iterator entityItr = _entitiesToAddToPhysics.begin(); while (entityItr != _entitiesToAddToPhysics.end()) { EntityItemPointer entity = (*entityItr); - assert(!entity->getPhysicsInfo()); if (entity->isDead()) { prepareEntityForDelete(entity); entityItr = _entitiesToAddToPhysics.erase(entityItr); - } else if (!entity->shouldBePhysical()) { - // this entity should no longer be on _entitiesToAddToPhysics + continue; + } + if (entity->getPhysicsInfo()) { entityItr = _entitiesToAddToPhysics.erase(entityItr); + continue; + } + if (!entity->shouldBePhysical()) { + // this entity should no longer be on _entitiesToAddToPhysics if (entity->isMovingRelativeToParent()) { SetOfEntities::iterator itr = _simpleKinematicEntities.find(entity); if (itr == _simpleKinematicEntities.end()) { _simpleKinematicEntities.insert(entity); } } - } else if (entity->isReadyToComputeShape()) { + entityItr = _entitiesToAddToPhysics.erase(entityItr); + continue; + } + + if (entity->isReadyToComputeShape()) { ShapeRequest shapeRequest(entity); ShapeRequests::iterator requestItr = _shapeRequests.find(shapeRequest); if (requestItr == _shapeRequests.end()) { @@ -332,18 +340,7 @@ void PhysicalEntitySimulation::buildMotionStatesForEntitiesThatNeedThem() { uint32_t requestCount = ObjectMotionState::getShapeManager()->getWorkRequestCount(); btCollisionShape* shape = const_cast(ObjectMotionState::getShapeManager()->getShape(shapeInfo)); if (shape) { - EntityMotionState* motionState = static_cast(entity->getPhysicsInfo()); - if (!motionState) { - buildMotionState(shape, entity); - } else { - // Is it possible to fall in here? - // entity shouldn't be on _entitiesToAddToPhysics list if it already has a motionState. - // but just in case... - motionState->setShape(shape); - motionState->setRegion(_space->getRegion(entity->getSpaceIndex())); - _physicalObjects.insert(motionState); - _incomingChanges.insert(motionState); - } + buildMotionState(shape, entity); } else if (requestCount != ObjectMotionState::getShapeManager()->getWorkRequestCount()) { // shape doesn't exist but a new worker has been spawned to build it --> add to shapeRequests and wait shapeRequest.shapeHash = shapeInfo.getHash(); @@ -354,6 +351,7 @@ void PhysicalEntitySimulation::buildMotionStatesForEntitiesThatNeedThem() { } entityItr = _entitiesToAddToPhysics.erase(entityItr); } else { + // skip for later ++entityItr; } } diff --git a/libraries/physics/src/ThreadSafeDynamicsWorld.cpp b/libraries/physics/src/ThreadSafeDynamicsWorld.cpp index f6189121a9..00b8a71831 100644 --- a/libraries/physics/src/ThreadSafeDynamicsWorld.cpp +++ b/libraries/physics/src/ThreadSafeDynamicsWorld.cpp @@ -181,7 +181,7 @@ void ThreadSafeDynamicsWorld::drawConnectedSpheres(btIDebugDraw* drawer, btScala btVector3 xAxis = direction.cross(btVector3(0.0f, 1.0f, 0.0f)); xAxis = xAxis.length() < EPSILON ? btVector3(1.0f, 0.0f, 0.0f) : xAxis.normalize(); btVector3 zAxis = xAxis.cross(btVector3(0.0f, 1.0f, 0.0f)); - zAxis = (direction.normalize().getY() < EPSILON) ? btVector3(0.0f, 1.0f, 0.0f) : zAxis.normalize(); + zAxis = (direction.length2() < EPSILON || direction.normalize().getY() < EPSILON) ? btVector3(0.0f, 1.0f, 0.0f) : zAxis.normalize(); float fullCircle = 2.0f * PI; for (float i = 0; i < fullCircle; i += stepRadians) { float x1 = btSin(btScalar(i)) * radius1; diff --git a/libraries/plugins/src/plugins/DisplayPlugin.cpp b/libraries/plugins/src/plugins/DisplayPlugin.cpp index 47503e8f85..2fe3d5fbea 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.cpp +++ b/libraries/plugins/src/plugins/DisplayPlugin.cpp @@ -35,15 +35,6 @@ void DisplayPlugin::waitForPresent() { } } -std::function DisplayPlugin::getHUDOperator() { - std::function hudOperator; - { - QMutexLocker locker(&_presentMutex); - hudOperator = _hudOperator; - } - return hudOperator; -} - glm::mat4 HmdDisplay::getEyeToHeadTransform(Eye eye) const { static const glm::mat4 xform; return xform; diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h index 9dc1d7002d..1cad9b1e11 100644 --- a/libraries/plugins/src/plugins/DisplayPlugin.h +++ b/libraries/plugins/src/plugins/DisplayPlugin.h @@ -213,13 +213,12 @@ public: void waitForPresent(); float getAveragePresentTime() { return _movingAveragePresent.average / (float)USECS_PER_MSEC; } // in msec - std::function getHUDOperator(); - static const QString& MENU_PATH(); // for updating plugin-related commands. Mimics the input plugin. virtual void pluginUpdate() = 0; + virtual std::function getHUDOperator() { return nullptr; } virtual StencilMaskMode getStencilMaskMode() const { return StencilMaskMode::NONE; } using StencilMaskMeshOperator = std::function; virtual StencilMaskMeshOperator getStencilMaskMeshOperator() { return nullptr; } @@ -234,8 +233,6 @@ protected: gpu::ContextPointer _gpuContext; - std::function _hudOperator { std::function() }; - MovingAverage _movingAveragePresent; float _renderResolutionScale { 1.0f }; diff --git a/libraries/render-utils/src/RenderCommonTask.cpp b/libraries/render-utils/src/RenderCommonTask.cpp index 18532b7a66..ae53539770 100644 --- a/libraries/render-utils/src/RenderCommonTask.cpp +++ b/libraries/render-utils/src/RenderCommonTask.cpp @@ -111,7 +111,7 @@ void CompositeHUD::run(const RenderContextPointer& renderContext, const gpu::Fra assert(renderContext->args->_context); // We do not want to render HUD elements in secondary camera - if (renderContext->args->_renderMode == RenderArgs::RenderMode::SECONDARY_CAMERA_RENDER_MODE) { + if (nsightActive() || renderContext->args->_renderMode == RenderArgs::RenderMode::SECONDARY_CAMERA_RENDER_MODE) { return; } diff --git a/libraries/render/src/render/Args.h b/libraries/render/src/render/Args.h index 7821692a60..1798208981 100644 --- a/libraries/render/src/render/Args.h +++ b/libraries/render/src/render/Args.h @@ -124,20 +124,20 @@ namespace render { DebugFlags _debugFlags { RENDER_DEBUG_NONE }; gpu::Batch* _batch = nullptr; - uint32_t _globalShapeKey{ 0 }; - uint32_t _itemShapeKey{ 0 }; - bool _enableTexturing{ true }; - bool _enableBlendshape{ true }; - bool _enableSkinning{ true }; + uint32_t _globalShapeKey { 0 }; + uint32_t _itemShapeKey { 0 }; + bool _enableTexturing { true }; + bool _enableBlendshape { true }; + bool _enableSkinning { true }; - bool _enableFade{ false }; + bool _enableFade { false }; RenderDetails _details; render::ScenePointer _scene; int8_t _cameraMode { -1 }; - std::function _hudOperator; - gpu::TexturePointer _hudTexture; + std::function _hudOperator { nullptr }; + gpu::TexturePointer _hudTexture { nullptr }; bool _takingSnapshot { false }; StencilMaskMode _stencilMaskMode { StencilMaskMode::NONE }; From 53094ef70c93f6458e10b60618036046443809a3 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Wed, 19 Jun 2019 16:52:33 -0700 Subject: [PATCH 4/4] One more pass of clean up on the platform api, returning the complete description in a single call, adding the version of the OS and deprecating legacy PlatformInfo calls --- .../PlatformInfoScriptingInterface.cpp | 6 +- .../PlatformInfoScriptingInterface.h | 24 ++++- libraries/platform/src/platform/Platform.h | 7 +- .../platform/src/platform/PlatformKeys.h | 18 +++- .../src/platform/backend/AndroidPlatform.cpp | 22 +++-- .../src/platform/backend/AndroidPlatform.h | 6 +- .../src/platform/backend/LinuxPlatform.cpp | 21 +++-- .../src/platform/backend/LinuxPlatform.h | 6 +- .../src/platform/backend/MACOSPlatform.cpp | 21 +++-- .../src/platform/backend/MACOSPlatform.h | 8 +- .../src/platform/backend/Platform.cpp | 29 ++++-- .../src/platform/backend/PlatformInstance.cpp | 89 ++++++++++++------- .../src/platform/backend/PlatformInstance.h | 33 +++---- .../src/platform/backend/WINPlatform.cpp | 20 +++-- .../src/platform/backend/WINPlatform.h | 4 +- libraries/shared/src/GPUIdent.cpp | 9 +- 16 files changed, 211 insertions(+), 112 deletions(-) diff --git a/interface/src/scripting/PlatformInfoScriptingInterface.cpp b/interface/src/scripting/PlatformInfoScriptingInterface.cpp index 9a5a08503d..84c4d923d0 100644 --- a/interface/src/scripting/PlatformInfoScriptingInterface.cpp +++ b/interface/src/scripting/PlatformInfoScriptingInterface.cpp @@ -192,7 +192,7 @@ QString PlatformInfoScriptingInterface::getDisplay(int index) { } QString PlatformInfoScriptingInterface::getMemory() { - auto desc = platform::getMemory(0); + auto desc = platform::getMemory(); return QString(desc.dump().c_str()); } @@ -201,6 +201,10 @@ QString PlatformInfoScriptingInterface::getComputer() { return QString(desc.dump().c_str()); } +QString PlatformInfoScriptingInterface::getPlatform() { + auto desc = platform::getAll(); + return QString(desc.dump().c_str()); +} PlatformInfoScriptingInterface::PlatformTier PlatformInfoScriptingInterface::getTierProfiled() { return (PlatformInfoScriptingInterface::PlatformTier) platform::Profiler::profilePlatform(); diff --git a/interface/src/scripting/PlatformInfoScriptingInterface.h b/interface/src/scripting/PlatformInfoScriptingInterface.h index 476c5c5788..113509d6d9 100644 --- a/interface/src/scripting/PlatformInfoScriptingInterface.h +++ b/interface/src/scripting/PlatformInfoScriptingInterface.h @@ -51,6 +51,8 @@ public slots: * Gets the operating system type. * @function PlatformInfo.getOperatingSystemType * @returns {string} "WINDOWS", "MACOS", or "UNKNOWN". + * @deprecated This function is deprecated and will be removed. + * use getComputer()["OS"] instead */ QString getOperatingSystemType(); @@ -61,6 +63,10 @@ public slots: * @example Report the CPU being used. * print("CPU: " + PlatformInfo.getCPUBrand()); * // Example: Intel(R) Core(TM) i7-7820HK CPU @ 2.90GHz + * @deprecated This function is deprecated and will be removed. + * use getNumCPUs() to know the number of CPUs in the hardware, at least one is expected + * use getCPU(0)["vendor"] to get the brand of the vendor + * use getCPU(0)["model"] to get the model name of the cpu */ QString getCPUBrand(); @@ -68,6 +74,8 @@ public slots: * Gets the number of logical CPU cores. * @function PlatformInfo.getNumLogicalCores * @returns {number} The number of logical CPU cores. + * @deprecated This function is deprecated and will be removed. + * use getCPU(0)["numCores"] instead */ unsigned int getNumLogicalCores(); @@ -75,6 +83,8 @@ public slots: * Returns the total system memory in megabytes. * @function PlatformInfo.getTotalSystemMemoryMB * @returns {number} The total system memory in megabytes. + * @deprecated This function is deprecated and will be removed. + * use getMemory()["memTotal"] instead */ int getTotalSystemMemoryMB(); @@ -82,6 +92,10 @@ public slots: * Gets the graphics card type. * @function PlatformInfo.getGraphicsCardType * @returns {string} The graphics card type. + * @deprecated This function is deprecated and will be removed. + * use getNumGPUs() to know the number of GPUs in the hardware, at least one is expected + * use getGPU(0)["vendor"] to get the brand of the vendor + * use getGPU(0)["model"] to get the model name of the gpu */ QString getGraphicsCardType(); @@ -141,7 +155,7 @@ public slots: /**jsdoc * Get the description of the GPU at the index parameter * expected fields are: - * - gpuVendor... + * - vendor, model... * @param index The index of the GPU of the platform * @function PlatformInfo.getGPU * @returns {string} The GPU description json field @@ -183,6 +197,14 @@ public slots: */ QString getComputer(); + /**jsdoc + * Get the complete description of the Platform as an aggregated Json + * The expected object description is: + * { "computer": {...}, "memory": {...}, "cpus": [{...}, ...], "gpus": [{...}, ...], "displays": [{...}, ...] } + * @function PlatformInfo.getPlatform + * @returns {string} The Platform description json field + */ + QString getPlatform(); /**jsdoc * Get the Platform TIer profiled on startup of the Computer diff --git a/libraries/platform/src/platform/Platform.h b/libraries/platform/src/platform/Platform.h index 7f73ff4ff4..9405c77ae0 100644 --- a/libraries/platform/src/platform/Platform.h +++ b/libraries/platform/src/platform/Platform.h @@ -27,12 +27,13 @@ json getGPU(int index); int getNumDisplays(); json getDisplay(int index); - -int getNumMemories(); -json getMemory(int index); + +json getMemory(); json getComputer(); +json getAll(); + } // namespace platform #endif // hifi_platform_h diff --git a/libraries/platform/src/platform/PlatformKeys.h b/libraries/platform/src/platform/PlatformKeys.h index fd29b2ff7f..1008c5ca4b 100644 --- a/libraries/platform/src/platform/PlatformKeys.h +++ b/libraries/platform/src/platform/PlatformKeys.h @@ -9,6 +9,9 @@ #define hifi_platform_PlatformKeys_h namespace platform { namespace keys{ + // "UNKNOWN" + extern const char* UNKNOWN; + namespace cpu { extern const char* vendor; extern const char* vendor_Intel; @@ -36,8 +39,9 @@ namespace platform { namespace keys{ extern const char* coordsTop; extern const char* coordsBottom; } + namespace memory { extern const char* memTotal; - + } namespace computer { extern const char* OS; extern const char* OS_WINDOWS; @@ -45,6 +49,8 @@ namespace platform { namespace keys{ extern const char* OS_LINUX; extern const char* OS_ANDROID; + extern const char* OSVersion; + extern const char* vendor; extern const char* vendor_Apple; @@ -52,6 +58,14 @@ namespace platform { namespace keys{ extern const char* profileTier; } - } } // namespace plaform::keys + + // Keys for categories used in json returned by getAll() + extern const char* CPUS; + extern const char* GPUS; + extern const char* DISPLAYS; + extern const char* MEMORY; + extern const char* COMPUTER; + +} } // namespace plaform::keys #endif diff --git a/libraries/platform/src/platform/backend/AndroidPlatform.cpp b/libraries/platform/src/platform/backend/AndroidPlatform.cpp index ee5a7e39b9..b0a4c5e67b 100644 --- a/libraries/platform/src/platform/backend/AndroidPlatform.cpp +++ b/libraries/platform/src/platform/backend/AndroidPlatform.cpp @@ -9,39 +9,45 @@ #include "AndroidPlatform.h" #include "../PlatformKeys.h" #include +#include using namespace platform; -void AndroidInstance::enumerateCpu() { +void AndroidInstance::enumerateCpus() { json cpu; cpu[keys::cpu::vendor] = ""; cpu[keys::cpu::model] = ""; cpu[keys::cpu::clockSpeed] = ""; cpu[keys::cpu::numCores] = 0; - _cpu.push_back(cpu); + + _cpus.push_back(cpu); } -void AndroidInstance::enumerateGpu() { +void AndroidInstance::enumerateGpus() { 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::vendor] = findGPUVendorInDescription(gpu[keys::gpu::model].get()); gpu[keys::gpu::videoMemory] = ident->getMemory(); gpu[keys::gpu::driver] = ident->getDriver().toUtf8().constData(); - _gpu.push_back(gpu); - _display = ident->getOutput(); + _gpus.push_back(gpu); + _displays = ident->getOutput(); } void AndroidInstance::enumerateMemory() { json ram = {}; - ram[keys::memTotal]=0; - _memory.push_back(ram); + ram[keys::memory::memTotal]=0; + _memory = ram; } void AndroidInstance::enumerateComputer(){ _computer[keys::computer::OS] = keys::computer::OS_ANDROID; _computer[keys::computer::vendor] = ""; _computer[keys::computer::model] = ""; + + auto sysInfo = QSysInfo(); + + _computer[keys::computer::OSVersion] = sysInfo.kernelVersion().toStdString(); } diff --git a/libraries/platform/src/platform/backend/AndroidPlatform.h b/libraries/platform/src/platform/backend/AndroidPlatform.h index d1496383c0..6592b3519d 100644 --- a/libraries/platform/src/platform/backend/AndroidPlatform.h +++ b/libraries/platform/src/platform/backend/AndroidPlatform.h @@ -15,10 +15,10 @@ namespace platform { class AndroidInstance : public Instance { public: - void enumerateCpu() override; + void enumerateCpus() override; + void enumerateGpus() override; void enumerateMemory() override; - void enumerateGpu() override; - void enumerateComputer () override; + void enumerateComputer() override; }; } // namespace platform diff --git a/libraries/platform/src/platform/backend/LinuxPlatform.cpp b/libraries/platform/src/platform/backend/LinuxPlatform.cpp index 356df27e0a..61501669cb 100644 --- a/libraries/platform/src/platform/backend/LinuxPlatform.cpp +++ b/libraries/platform/src/platform/backend/LinuxPlatform.cpp @@ -13,36 +13,37 @@ #include #include #include +#include using namespace platform; -void LinuxInstance::enumerateCpu() { +void LinuxInstance::enumerateCpus() { json cpu = {}; cpu[keys::cpu::vendor] = CPUIdent::Vendor(); cpu[keys::cpu::model] = CPUIdent::Brand(); cpu[keys::cpu::numCores] = std::thread::hardware_concurrency(); - _cpu.push_back(cpu); + _cpus.push_back(cpu); } -void LinuxInstance::enumerateGpu() { +void LinuxInstance::enumerateGpus() { 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::vendor] = findGPUVendorInDescription(gpu[keys::gpu::model].get()); gpu[keys::gpu::videoMemory] = ident->getMemory(); gpu[keys::gpu::driver] = ident->getDriver().toUtf8().constData(); - _gpu.push_back(gpu); - _display = ident->getOutput(); + _gpus.push_back(gpu); + _displays = ident->getOutput(); } void LinuxInstance::enumerateMemory() { json ram = {}; - ram[keys::memTotal]=0; + ram[keys::memory::memTotal]=0; - _memory.push_back(ram); + _memory = ram; } void LinuxInstance::enumerateComputer(){ @@ -50,5 +51,9 @@ void LinuxInstance::enumerateComputer(){ _computer[keys::computer::OS] = keys::computer::OS_LINUX; _computer[keys::computer::vendor] = ""; _computer[keys::computer::model] = ""; + + auto sysInfo = QSysInfo(); + + _computer[keys::computer::OSVersion] = sysInfo.kernelVersion().toStdString(); } diff --git a/libraries/platform/src/platform/backend/LinuxPlatform.h b/libraries/platform/src/platform/backend/LinuxPlatform.h index 1629101f41..2f2529db7c 100644 --- a/libraries/platform/src/platform/backend/LinuxPlatform.h +++ b/libraries/platform/src/platform/backend/LinuxPlatform.h @@ -15,10 +15,10 @@ namespace platform { class LinuxInstance : public Instance { public: - void enumerateCpu() override; + void enumerateCpus() override; + void enumerateGpus() override; void enumerateMemory() override; - void enumerateGpu() override; - void enumerateComputer () override; + void enumerateComputer() override; }; } // namespace platform diff --git a/libraries/platform/src/platform/backend/MACOSPlatform.cpp b/libraries/platform/src/platform/backend/MACOSPlatform.cpp index 7dbc403783..cacbd06816 100644 --- a/libraries/platform/src/platform/backend/MACOSPlatform.cpp +++ b/libraries/platform/src/platform/backend/MACOSPlatform.cpp @@ -21,32 +21,33 @@ #include #include +#include #endif using namespace platform; -void MACOSInstance::enumerateCpu() { +void MACOSInstance::enumerateCpus() { json cpu = {}; cpu[keys::cpu::vendor] = CPUIdent::Vendor(); cpu[keys::cpu::model] = CPUIdent::Brand(); cpu[keys::cpu::numCores] = std::thread::hardware_concurrency(); - _cpu.push_back(cpu); + _cpus.push_back(cpu); } -void MACOSInstance::enumerateGpu() { +void MACOSInstance::enumerateGpus() { #ifdef Q_OS_MAC 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::vendor] = findGPUVendorInDescription(gpu[keys::gpu::model].get()); gpu[keys::gpu::videoMemory] = ident->getMemory(); gpu[keys::gpu::driver] = ident->getDriver().toUtf8().constData(); - _gpu.push_back(gpu); + _gpus.push_back(gpu); #endif @@ -101,7 +102,7 @@ void MACOSInstance::enumerateDisplays() { display["modeWidth"] = displayModeWidth; display["modeHeight"] = displayModeHeight; - _display.push_back(display); + _displays.push_back(display); #endif } @@ -111,9 +112,9 @@ void MACOSInstance::enumerateMemory() { #ifdef Q_OS_MAC long pages = sysconf(_SC_PHYS_PAGES); long page_size = sysconf(_SC_PAGE_SIZE); - ram[keys::memTotal] = pages * page_size; + ram[keys::memory::memTotal] = pages * page_size; #endif - _memory.push_back(ram); + _memory = ram; } void MACOSInstance::enumerateComputer(){ @@ -133,5 +134,9 @@ void MACOSInstance::enumerateComputer(){ free(model); #endif + + auto sysInfo = QSysInfo(); + + _computer[keys::computer::OSVersion] = sysInfo.kernelVersion().toStdString(); } diff --git a/libraries/platform/src/platform/backend/MACOSPlatform.h b/libraries/platform/src/platform/backend/MACOSPlatform.h index 4a257d8be5..e893dda739 100644 --- a/libraries/platform/src/platform/backend/MACOSPlatform.h +++ b/libraries/platform/src/platform/backend/MACOSPlatform.h @@ -15,11 +15,11 @@ namespace platform { class MACOSInstance : public Instance { public: - void enumerateCpu() override; - void enumerateMemory() override; - void enumerateGpu() override; + void enumerateCpus() override; + void enumerateGpus() override; void enumerateDisplays() override; - void enumerateComputer () override; + void enumerateMemory() override; + void enumerateComputer() override; }; } // namespace platform diff --git a/libraries/platform/src/platform/backend/Platform.cpp b/libraries/platform/src/platform/backend/Platform.cpp index 8e9fda30ed..dba41ce121 100644 --- a/libraries/platform/src/platform/backend/Platform.cpp +++ b/libraries/platform/src/platform/backend/Platform.cpp @@ -11,6 +11,8 @@ #include "../PlatformKeys.h" namespace platform { namespace keys { + const char* UNKNOWN = "UNKNOWN"; + namespace cpu { const char* vendor = "vendor"; const char* vendor_Intel = "Intel"; @@ -38,8 +40,9 @@ namespace platform { namespace keys { const char* coordsTop = "coordinatestop"; const char* coordsBottom = "coordinatesbottom"; } - const char* memTotal = "memTotal"; - + namespace memory { + const char* memTotal = "memTotal"; + } namespace computer { const char* OS = "OS"; const char* OS_WINDOWS = "WINDOWS"; @@ -47,6 +50,8 @@ namespace platform { namespace keys { const char* OS_LINUX = "LINUX"; const char* OS_ANDROID = "ANDROID"; + const char* OSVersion = "OSVersion"; + const char* vendor = "vendor"; const char* vendor_Apple = "Apple"; @@ -54,6 +59,12 @@ namespace platform { namespace keys { const char* profileTier = "profileTier"; } + + const char* CPUS = "cpus"; + const char* GPUS = "gpus"; + const char* DISPLAYS = "displays"; + const char* MEMORY = "memory"; + const char* COMPUTER = "computer"; }} #include @@ -117,14 +128,14 @@ json platform::getDisplay(int index) { return _instance->getDisplay(index); } -int platform::getNumMemories() { - return _instance->getNumMemories(); +json platform::getMemory() { + return _instance->getMemory(); } -json platform::getMemory(int index) { - return _instance->getMemory(index); -} - -json platform::getComputer(){ +json platform::getComputer() { return _instance->getComputer(); } + +json platform::getAll() { + return _instance->getAll(); +} diff --git a/libraries/platform/src/platform/backend/PlatformInstance.cpp b/libraries/platform/src/platform/backend/PlatformInstance.cpp index 3dd3e5f592..f3a82f8cc4 100644 --- a/libraries/platform/src/platform/backend/PlatformInstance.cpp +++ b/libraries/platform/src/platform/backend/PlatformInstance.cpp @@ -16,10 +16,10 @@ using namespace platform; bool Instance::enumeratePlatform() { enumerateComputer(); - enumerateCpu(); - enumerateGpu(); - enumerateDisplays(); enumerateMemory(); + enumerateCpus(); + enumerateGpus(); + enumerateDisplays(); // And profile the platform and put the tier in "computer" _computer[keys::computer::profileTier] = Profiler::TierNames[Profiler::profilePlatform()]; @@ -28,55 +28,42 @@ bool Instance::enumeratePlatform() { } json Instance::getCPU(int index) { - assert(index <(int) _cpu.size()); - if (index >= (int)_cpu.size()) + assert(index <(int) _cpus.size()); + if (index >= (int)_cpus.size()) return json(); - return _cpu.at(index); -} - -//These are ripe for template.. will work on that next -json Instance::getMemory(int index) { - assert(index <(int) _memory.size()); - if(index >= (int)_memory.size()) - return json(); - - return _memory.at(index); + return _cpus.at(index); } json Instance::getGPU(int index) { - assert(index <(int) _gpu.size()); + assert(index <(int) _gpus.size()); - if (index >=(int) _gpu.size()) + if (index >=(int) _gpus.size()) return json(); - return _gpu.at(index); + return _gpus.at(index); } json Instance::getDisplay(int index) { - assert(index <(int) _display.size()); + assert(index <(int) _displays.size()); - if (index >=(int) _display.size()) + if (index >=(int) _displays.size()) return json(); - return _display.at(index); + return _displays.at(index); } Instance::~Instance() { - if (_cpu.size() > 0) { - _cpu.clear(); + if (_cpus.size() > 0) { + _cpus.clear(); } - if (_memory.size() > 0) { - _memory.clear(); + if (_gpus.size() > 0) { + _gpus.clear(); } - if (_gpu.size() > 0) { - _gpu.clear(); - } - - if (_display.size() > 0) { - _display.clear(); + if (_displays.size() > 0) { + _displays.clear(); } } @@ -106,17 +93,53 @@ json Instance::listAllKeys() { keys::display::coordsTop, keys::display::coordsBottom, - keys::memTotal, + keys::memory::memTotal, keys::computer::OS, keys::computer::OS_WINDOWS, keys::computer::OS_MACOS, keys::computer::OS_LINUX, keys::computer::OS_ANDROID, + keys::computer::OSVersion, keys::computer::vendor, keys::computer::vendor_Apple, keys::computer::model, - keys::computer::profileTier + keys::computer::profileTier, + + keys::CPUS, + keys::GPUS, + keys::DISPLAYS, + keys::MEMORY, + keys::COMPUTER, }}); return allKeys; } + +const char* Instance::findGPUVendorInDescription(const std::string& description) { + // intel integrated graphics + if (description.find(keys::gpu::vendor_Intel) != std::string::npos) { + return keys::gpu::vendor_Intel; + } + // AMD gpu + else if (description.find(keys::gpu::vendor_AMD) != std::string::npos) { + return keys::gpu::vendor_AMD; + } + // NVIDIA gpu + else if (description.find(keys::gpu::vendor_NVIDIA) != std::string::npos) { + return keys::gpu::vendor_NVIDIA; + } else { + return keys::UNKNOWN; + } +} + +json Instance::getAll() { + json all = {}; + + all[keys::COMPUTER] = _computer; + all[keys::MEMORY] = _memory; + all[keys::CPUS] = _cpus; + all[keys::GPUS] = _gpus; + all[keys::DISPLAYS] = _displays; + + return all; +} diff --git a/libraries/platform/src/platform/backend/PlatformInstance.h b/libraries/platform/src/platform/backend/PlatformInstance.h index 95eb2ef25e..b7983446f5 100644 --- a/libraries/platform/src/platform/backend/PlatformInstance.h +++ b/libraries/platform/src/platform/backend/PlatformInstance.h @@ -19,36 +19,39 @@ class Instance { public: bool virtual enumeratePlatform(); - int getNumCPUs() { return (int)_cpu.size(); } + int getNumCPUs() { return (int)_cpus.size(); } json getCPU(int index); - int getNumGPUs() { return (int)_gpu.size(); } + int getNumGPUs() { return (int)_gpus.size(); } json getGPU(int index); - int getNumMemories() { return (int)_memory.size(); } - json getMemory(int index); - - int getNumDisplays() { return (int)_display.size(); } + int getNumDisplays() { return (int)_displays.size(); } json getDisplay(int index); + json getMemory() { return _memory; } + + json getComputer() { return _computer; } - json getComputer() {return _computer;} - - void virtual enumerateCpu()=0; - void virtual enumerateMemory()=0; - void virtual enumerateGpu()=0; + json getAll(); + + void virtual enumerateCpus()=0; + void virtual enumerateGpus()=0; void virtual enumerateDisplays() {} + void virtual enumerateMemory() = 0; void virtual enumerateComputer()=0; virtual ~Instance(); static json listAllKeys(); + // Helper function to filter the vendor name out of the description of a GPU + static const char* findGPUVendorInDescription(const std::string& description); + protected: - std::vector _cpu; - std::vector _memory; - std::vector _gpu; - std::vector _display; + std::vector _cpus; + std::vector _gpus; + std::vector _displays; + json _memory; json _computer; }; diff --git a/libraries/platform/src/platform/backend/WINPlatform.cpp b/libraries/platform/src/platform/backend/WINPlatform.cpp index e34d87d853..9cf01ce4e0 100644 --- a/libraries/platform/src/platform/backend/WINPlatform.cpp +++ b/libraries/platform/src/platform/backend/WINPlatform.cpp @@ -16,32 +16,33 @@ #ifdef Q_OS_WIN #include +#include #endif using namespace platform; -void WINInstance::enumerateCpu() { +void WINInstance::enumerateCpus() { json cpu = {}; cpu[keys::cpu::vendor] = CPUIdent::Vendor(); cpu[keys::cpu::model] = CPUIdent::Brand(); cpu[keys::cpu::numCores] = std::thread::hardware_concurrency(); - _cpu.push_back(cpu); + _cpus.push_back(cpu); } -void WINInstance::enumerateGpu() { +void WINInstance::enumerateGpus() { 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::vendor] = findGPUVendorInDescription(gpu[keys::gpu::model].get()); gpu[keys::gpu::videoMemory] = ident->getMemory(); gpu[keys::gpu::driver] = ident->getDriver().toUtf8().constData(); - _gpu.push_back(gpu); - _display = ident->getOutput(); + _gpus.push_back(gpu); + _displays = ident->getOutput(); } void WINInstance::enumerateMemory() { @@ -52,9 +53,9 @@ void WINInstance::enumerateMemory() { statex.dwLength = sizeof(statex); GlobalMemoryStatusEx(&statex); int totalRam = statex.ullTotalPhys / 1024 / 1024; - ram[platform::keys::memTotal] = totalRam; + ram[platform::keys::memory::memTotal] = totalRam; #endif - _memory.push_back(ram); + _memory = ram; } void WINInstance::enumerateComputer(){ @@ -62,5 +63,8 @@ void WINInstance::enumerateComputer(){ _computer[keys::computer::vendor] = ""; _computer[keys::computer::model] = ""; + auto sysInfo = QSysInfo(); + + _computer[keys::computer::OSVersion] = sysInfo.kernelVersion().toStdString(); } diff --git a/libraries/platform/src/platform/backend/WINPlatform.h b/libraries/platform/src/platform/backend/WINPlatform.h index e540335d94..cb6d3f482f 100644 --- a/libraries/platform/src/platform/backend/WINPlatform.h +++ b/libraries/platform/src/platform/backend/WINPlatform.h @@ -15,9 +15,9 @@ namespace platform { class WINInstance : public Instance { public: - void enumerateCpu() override; + void enumerateCpus() override; + void enumerateGpus() override; void enumerateMemory() override; - void enumerateGpu() override; void enumerateComputer () override; }; } // namespace platform diff --git a/libraries/shared/src/GPUIdent.cpp b/libraries/shared/src/GPUIdent.cpp index f092a56c17..c195b2ec3a 100644 --- a/libraries/shared/src/GPUIdent.cpp +++ b/libraries/shared/src/GPUIdent.cpp @@ -282,12 +282,13 @@ GPUIdent* GPUIdent::ensureQuery(const QString& vendor, const QString& renderer) if (!validAdapterList.empty()) { for (auto outy = adapterToOutputs.begin(); outy != adapterToOutputs.end(); ++outy) { - AdapterEntry entry = *outy; + AdapterEntry entry = *outy; for (auto test = entry.second.begin(); test != entry.second.end(); ++test) { - + std::wstring wDeviceName(test->DeviceName); + std::string deviceName(wDeviceName.begin(), wDeviceName.end()); + nlohmann::json output = {}; - output["description"] = entry.first.first.Description; - output["deviceName"]= test->DeviceName; + output["model"] = deviceName; output["coordinatesleft"] = test->DesktopCoordinates.left; output["coordinatesright"] = test->DesktopCoordinates.right; output["coordinatestop"] = test->DesktopCoordinates.top;