This commit is contained in:
amer cerkic 2019-06-21 09:43:33 -07:00
commit 67e42148ef
51 changed files with 525 additions and 296 deletions

View file

@ -139,6 +139,7 @@ option(BUILD_MANUAL_TESTS "Build manual tests" ${BUILD_MANUAL_TESTS_OPTION})
option(BUILD_TOOLS "Build tools" ${BUILD_TOOLS_OPTION}) option(BUILD_TOOLS "Build tools" ${BUILD_TOOLS_OPTION})
option(BUILD_INSTALLER "Build installer" ${BUILD_INSTALLER_OPTION}) option(BUILD_INSTALLER "Build installer" ${BUILD_INSTALLER_OPTION})
option(USE_GLES "Use OpenGL ES" ${GLES_OPTION}) option(USE_GLES "Use OpenGL ES" ${GLES_OPTION})
option(USE_KHR_ROBUSTNESS "Use KHR_robustness" OFF)
option(DISABLE_QML "Disable QML" ${DISABLE_QML_OPTION}) option(DISABLE_QML "Disable QML" ${DISABLE_QML_OPTION})
option(DISABLE_KTX_CACHE "Disable KTX Cache" OFF) option(DISABLE_KTX_CACHE "Disable KTX Cache" OFF)
option( option(
@ -149,6 +150,10 @@ option(
set(PLATFORM_QT_GL OpenGL) set(PLATFORM_QT_GL OpenGL)
if (USE_KHR_ROBUSTNESS)
add_definitions(-DUSE_KHR_ROBUSTNESS)
endif()
if (USE_GLES) if (USE_GLES)
add_definitions(-DUSE_GLES) add_definitions(-DUSE_GLES)
add_definitions(-DGPU_POINTER_STORAGE_SHARED) add_definitions(-DGPU_POINTER_STORAGE_SHARED)

View file

@ -53,6 +53,9 @@ Item {
StatText { StatText {
text: root.recenterText text: root.recenterText
} }
StatText {
text: root.overrideJointText
}
StatText { StatText {
text: "Anim Vars:--------------------------------------------------------------------------------" text: "Anim Vars:--------------------------------------------------------------------------------"
} }
@ -98,6 +101,9 @@ Item {
StatText { StatText {
text: root.sittingText text: root.sittingText
} }
StatText {
text: root.flowText
}
StatText { StatText {
text: "State Machines:---------------------------------------------------------------------------" text: "State Machines:---------------------------------------------------------------------------"
} }
@ -131,6 +137,9 @@ Item {
StatText { StatText {
text: root.walkingText text: root.walkingText
} }
StatText {
text: root.networkGraphText
}
StatText { StatText {
text: "Alpha Values:--------------------------------------------------------------------------" text: "Alpha Values:--------------------------------------------------------------------------"
} }

View file

@ -2934,8 +2934,10 @@ void Application::initializeGL() {
#if !defined(DISABLE_QML) #if !defined(DISABLE_QML)
QStringList chromiumFlags; QStringList chromiumFlags;
// HACK: re-expose mic and camera to prevent crash on domain-change in chromium's media::FakeAudioInputStream::ReadAudioFromSource()
// Bug 21993: disable microphone and camera input // Bug 21993: disable microphone and camera input
chromiumFlags << "--use-fake-device-for-media-stream"; //chromiumFlags << "--use-fake-device-for-media-stream";
// Disable signed distance field font rendering on ATI/AMD GPUs, due to // Disable signed distance field font rendering on ATI/AMD GPUs, due to
// https://highfidelity.manuscript.com/f/cases/13677/Text-showing-up-white-on-Marketplace-app // https://highfidelity.manuscript.com/f/cases/13677/Text-showing-up-white-on-Marketplace-app
std::string vendor{ (const char*)glGetString(GL_VENDOR) }; std::string vendor{ (const char*)glGetString(GL_VENDOR) };

View file

@ -6100,6 +6100,30 @@ QVariantList MyAvatar::getCollidingFlowJoints() {
return result; return result;
} }
int MyAvatar::getOverrideJointCount() const {
if (_skeletonModel) {
return _skeletonModel->getRig().getOverrideJointCount();
} else {
return 0;
}
}
bool MyAvatar::getFlowActive() const {
if (_skeletonModel) {
return _skeletonModel->getRig().getFlowActive();
} else {
return false;
}
}
bool MyAvatar::getNetworkGraphActive() const {
if (_skeletonModel) {
return _skeletonModel->getRig().getNetworkGraphActive();
} else {
return false;
}
}
void MyAvatar::initFlowFromFST() { void MyAvatar::initFlowFromFST() {
if (_skeletonModel->isLoaded()) { if (_skeletonModel->isLoaded()) {
auto &flowData = _skeletonModel->getHFMModel().flowData; auto &flowData = _skeletonModel->getHFMModel().flowData;

View file

@ -1835,6 +1835,10 @@ public:
*/ */
Q_INVOKABLE QVariantList getCollidingFlowJoints(); Q_INVOKABLE QVariantList getCollidingFlowJoints();
int getOverrideJointCount() const;
bool getFlowActive() const;
bool getNetworkGraphActive() const;
public slots: public slots:
/**jsdoc /**jsdoc

View file

@ -192,7 +192,7 @@ QString PlatformInfoScriptingInterface::getDisplay(int index) {
} }
QString PlatformInfoScriptingInterface::getMemory() { QString PlatformInfoScriptingInterface::getMemory() {
auto desc = platform::getMemory(0); auto desc = platform::getMemory();
return QString(desc.dump().c_str()); return QString(desc.dump().c_str());
} }
@ -201,6 +201,10 @@ QString PlatformInfoScriptingInterface::getComputer() {
return QString(desc.dump().c_str()); return QString(desc.dump().c_str());
} }
QString PlatformInfoScriptingInterface::getPlatform() {
auto desc = platform::getAll();
return QString(desc.dump().c_str());
}
PlatformInfoScriptingInterface::PlatformTier PlatformInfoScriptingInterface::getTierProfiled() { PlatformInfoScriptingInterface::PlatformTier PlatformInfoScriptingInterface::getTierProfiled() {
return (PlatformInfoScriptingInterface::PlatformTier) platform::Profiler::profilePlatform(); return (PlatformInfoScriptingInterface::PlatformTier) platform::Profiler::profilePlatform();

View file

@ -51,6 +51,8 @@ public slots:
* Gets the operating system type. * Gets the operating system type.
* @function PlatformInfo.getOperatingSystemType * @function PlatformInfo.getOperatingSystemType
* @returns {string} <code>"WINDOWS"</code>, <code>"MACOS"</code>, or <code>"UNKNOWN"</code>. * @returns {string} <code>"WINDOWS"</code>, <code>"MACOS"</code>, or <code>"UNKNOWN"</code>.
* @deprecated This function is deprecated and will be removed.
* use getComputer()["OS"] instead
*/ */
QString getOperatingSystemType(); QString getOperatingSystemType();
@ -61,6 +63,10 @@ public slots:
* @example <caption>Report the CPU being used.</caption> * @example <caption>Report the CPU being used.</caption>
* print("CPU: " + PlatformInfo.getCPUBrand()); * print("CPU: " + PlatformInfo.getCPUBrand());
* // Example: Intel(R) Core(TM) i7-7820HK CPU @ 2.90GHz * // 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(); QString getCPUBrand();
@ -68,6 +74,8 @@ public slots:
* Gets the number of logical CPU cores. * Gets the number of logical CPU cores.
* @function PlatformInfo.getNumLogicalCores * @function PlatformInfo.getNumLogicalCores
* @returns {number} The number of logical CPU cores. * @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(); unsigned int getNumLogicalCores();
@ -75,6 +83,8 @@ public slots:
* Returns the total system memory in megabytes. * Returns the total system memory in megabytes.
* @function PlatformInfo.getTotalSystemMemoryMB * @function PlatformInfo.getTotalSystemMemoryMB
* @returns {number} The total system memory in megabytes. * @returns {number} The total system memory in megabytes.
* @deprecated This function is deprecated and will be removed.
* use getMemory()["memTotal"] instead
*/ */
int getTotalSystemMemoryMB(); int getTotalSystemMemoryMB();
@ -82,6 +92,10 @@ public slots:
* Gets the graphics card type. * Gets the graphics card type.
* @function PlatformInfo.getGraphicsCardType * @function PlatformInfo.getGraphicsCardType
* @returns {string} The graphics card type. * @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(); QString getGraphicsCardType();
@ -141,7 +155,7 @@ public slots:
/**jsdoc /**jsdoc
* Get the description of the GPU at the index parameter * Get the description of the GPU at the index parameter
* expected fields are: * expected fields are:
* - gpuVendor... * - vendor, model...
* @param index The index of the GPU of the platform * @param index The index of the GPU of the platform
* @function PlatformInfo.getGPU * @function PlatformInfo.getGPU
* @returns {string} The GPU description json field * @returns {string} The GPU description json field
@ -183,6 +197,14 @@ public slots:
*/ */
QString getComputer(); 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 /**jsdoc
* Get the Platform TIer profiled on startup of the Computer * Get the Platform TIer profiled on startup of the Computer

View file

@ -94,6 +94,21 @@ void AnimStats::updateStats(bool force) {
} }
emit walkingTextChanged(); emit walkingTextChanged();
// print current overrideJointText
int overrideJointCount = myAvatar->getOverrideJointCount();
_overrideJointText = QString("Override Joint Count: %1").arg(overrideJointCount);
emit overrideJointTextChanged();
// print current flowText
bool flowActive = myAvatar->getFlowActive();
_flowText = QString("Flow: %1").arg(flowActive ? "enabled" : "disabled");
emit flowTextChanged();
// print current networkGraphText
bool networkGraphActive = myAvatar->getNetworkGraphActive();
_networkGraphText = QString("Network Graph: %1").arg(networkGraphActive ? "enabled" : "disabled");
emit networkGraphTextChanged();
// update animation debug alpha values // update animation debug alpha values
QStringList newAnimAlphaValues; QStringList newAnimAlphaValues;
qint64 now = usecTimestampNow(); qint64 now = usecTimestampNow();

View file

@ -25,6 +25,9 @@ class AnimStats : public QQuickItem {
Q_PROPERTY(QString recenterText READ recenterText NOTIFY recenterTextChanged) Q_PROPERTY(QString recenterText READ recenterText NOTIFY recenterTextChanged)
Q_PROPERTY(QString sittingText READ sittingText NOTIFY sittingTextChanged) Q_PROPERTY(QString sittingText READ sittingText NOTIFY sittingTextChanged)
Q_PROPERTY(QString walkingText READ walkingText NOTIFY walkingTextChanged) Q_PROPERTY(QString walkingText READ walkingText NOTIFY walkingTextChanged)
Q_PROPERTY(QString overrideJointText READ overrideJointText NOTIFY overrideJointTextChanged)
Q_PROPERTY(QString flowText READ flowText NOTIFY flowTextChanged)
Q_PROPERTY(QString networkGraphText READ networkGraphText NOTIFY networkGraphTextChanged)
public: public:
static AnimStats* getInstance(); static AnimStats* getInstance();
@ -43,6 +46,9 @@ public:
QString recenterText() const { return _recenterText; } QString recenterText() const { return _recenterText; }
QString sittingText() const { return _sittingText; } QString sittingText() const { return _sittingText; }
QString walkingText() const { return _walkingText; } QString walkingText() const { return _walkingText; }
QString overrideJointText() const { return _overrideJointText; }
QString flowText() const { return _flowText; }
QString networkGraphText() const { return _networkGraphText; }
public slots: public slots:
void forceUpdateStats() { updateStats(true); } void forceUpdateStats() { updateStats(true); }
@ -58,6 +64,9 @@ signals:
void recenterTextChanged(); void recenterTextChanged();
void sittingTextChanged(); void sittingTextChanged();
void walkingTextChanged(); void walkingTextChanged();
void overrideJointTextChanged();
void flowTextChanged();
void networkGraphTextChanged();
private: private:
QStringList _animAlphaValues; QStringList _animAlphaValues;
@ -76,6 +85,9 @@ private:
QString _recenterText; QString _recenterText;
QString _sittingText; QString _sittingText;
QString _walkingText; QString _walkingText;
QString _overrideJointText;
QString _flowText;
QString _networkGraphText;
}; };
#endif // hifi_AnimStats_h #endif // hifi_AnimStats_h

View file

@ -14,13 +14,23 @@
NSURLSession* session = [NSURLSession sharedSession]; NSURLSession* session = [NSURLSession sharedSession];
NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSLog(@"Latest Build Request error: %@", error);
NSLog(@"Latest Build Request Data: %@", data);
NSHTTPURLResponse *ne = (NSHTTPURLResponse *)response;
NSLog(@"Latest Build Request Response: %ld", [ne statusCode]);
Launcher* sharedLauncher = [Launcher sharedLauncher]; Launcher* sharedLauncher = [Launcher sharedLauncher];
NSLog(@"credentials request finished");
NSMutableData* webData = [NSMutableData data]; NSMutableData* webData = [NSMutableData data];
[webData appendData:data]; [webData appendData:data];
NSString* jsonString = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[data length] encoding:NSUTF8StringEncoding]; NSString* jsonString = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[data length] encoding:NSUTF8StringEncoding];
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; NSLog(@"Latest Build Request -> json string: %@", jsonString);
NSError *jsonError = nil;
id json = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&jsonError];
if (jsonError) {
NSLog(@"Latest Build request: Failed to convert Json to data");
}
NSFileManager* fileManager = [NSFileManager defaultManager]; NSFileManager* fileManager = [NSFileManager defaultManager];
NSArray *values = [json valueForKey:@"results"]; NSArray *values = [json valueForKey:@"results"];
@ -37,10 +47,15 @@
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
Settings* settings = [Settings sharedSettings]; Settings* settings = [Settings sharedSettings];
NSInteger currentVersion = [settings latestBuildVersion]; NSInteger currentVersion = [settings latestBuildVersion];
NSLog(@"Latest Build Request -> does build directory exist: %@", appDirectoryExist ? @"TRUE" : @"FALSE");
NSLog(@"Latest Build Request -> current version: %ld", currentVersion);
NSLog(@"Latest Build Request -> latest version: %ld", buildNumber.integerValue);
NSLog(@"Latest Build Request -> mac url: %@", macInstallerUrl);
BOOL latestVersionAvailable = (currentVersion != buildNumber.integerValue); BOOL latestVersionAvailable = (currentVersion != buildNumber.integerValue);
[[Settings sharedSettings] buildVersion:buildNumber.integerValue]; [[Settings sharedSettings] buildVersion:buildNumber.integerValue];
BOOL shouldDownloadInterface = (latestVersionAvailable || !appDirectoryExist); BOOL shouldDownloadInterface = (latestVersionAvailable || !appDirectoryExist);
NSLog(@"Latest Build Request -> SHOULD DOWNLOAD: %@", shouldDownloadInterface ? @"TRUE" : @"FALSE");
[sharedLauncher shouldDownloadLatestBuild:shouldDownloadInterface :macInstallerUrl]; [sharedLauncher shouldDownloadLatestBuild:shouldDownloadInterface :macInstallerUrl];
}); });
}]; }];

View file

@ -213,6 +213,9 @@ BOOL CLauncherDlg::getHQInfo(const CString& orgname) {
CString lowerOrgName = orgname; CString lowerOrgName = orgname;
lowerOrgName.MakeLower(); lowerOrgName.MakeLower();
LauncherUtils::hMac256(lowerOrgName, LAUNCHER_HMAC_SECRET, hash); LauncherUtils::hMac256(lowerOrgName, LAUNCHER_HMAC_SECRET, hash);
CString msg;
msg.Format(_T("Calculated hash: \"%s\" => \"%s\""), lowerOrgName, hash);
theApp._manager.addToLog(msg);
return theApp._manager.readOrganizationJSON(hash) == LauncherUtils::ResponseError::NoError; return theApp._manager.readOrganizationJSON(hash) == LauncherUtils::ResponseError::NoError;
} }

View file

@ -427,6 +427,11 @@ BOOL LauncherManager::extractApplication() {
LauncherUtils::cStringToStd(installPath), [&](int type, int size) { LauncherUtils::cStringToStd(installPath), [&](int type, int size) {
onZipExtracted((ZipType)type, size); onZipExtracted((ZipType)type, size);
}); });
if (success) {
addToLog(_T("Created thread for unzipping application."));
} else {
addToLog(_T("Failed to create thread for unzipping application."));
}
return success; return success;
} }
@ -449,6 +454,11 @@ BOOL LauncherManager::installContent() {
LauncherUtils::cStringToStd(contentPath), [&](int type, int size) { LauncherUtils::cStringToStd(contentPath), [&](int type, int size) {
onZipExtracted((ZipType)type, size); onZipExtracted((ZipType)type, size);
}); });
if (success) {
addToLog(_T("Created thread for unzipping content."));
} else {
addToLog(_T("Failed to create thread for unzipping content."));
}
return success; return success;
} }

View file

@ -16,6 +16,7 @@
#pragma comment(lib, "winhttp") #pragma comment(lib, "winhttp")
#include "LauncherApp.h"
#include "LauncherUtils.h" #include "LauncherUtils.h"
CString LauncherUtils::urlEncodeString(const CString& url) { CString LauncherUtils::urlEncodeString(const CString& url) {
@ -230,14 +231,24 @@ uint64_t LauncherUtils::extractZip(const std::string& zipFile, const std::string
auto status = mz_zip_reader_init_file(&zip_archive, zipFile.c_str(), 0); auto status = mz_zip_reader_init_file(&zip_archive, zipFile.c_str(), 0);
{
CString msg;
msg.Format(_T("Reading zip file %s, extracting to %s"), CString(zipFile.c_str()), CString(path.c_str()));
theApp._manager.addToLog(msg);
}
if (!status) return 0; if (!status) return 0;
int fileCount = (int)mz_zip_reader_get_num_files(&zip_archive); int fileCount = (int)mz_zip_reader_get_num_files(&zip_archive);
if (fileCount == 0) { if (fileCount == 0) {
theApp._manager.addToLog(_T("Zip archive has a file count of 0"));
mz_zip_reader_end(&zip_archive); mz_zip_reader_end(&zip_archive);
return 0; return 0;
} }
mz_zip_archive_file_stat file_stat; mz_zip_archive_file_stat file_stat;
if (!mz_zip_reader_file_stat(&zip_archive, 0, &file_stat)) { if (!mz_zip_reader_file_stat(&zip_archive, 0, &file_stat)) {
theApp._manager.addToLog(_T("Zip archive cannot be stat'd"));
mz_zip_reader_end(&zip_archive); mz_zip_reader_end(&zip_archive);
return 0; return 0;
} }
@ -263,6 +274,12 @@ uint64_t LauncherUtils::extractZip(const std::string& zipFile, const std::string
} }
} }
{
CString msg;
msg.Format(_T("Done unzipping archive, total size: %llu"), totalSize);
theApp._manager.addToLog(msg);
}
// Close the archive, freeing any resources it was using // Close the archive, freeing any resources it was using
mz_zip_reader_end(&zip_archive); mz_zip_reader_end(&zip_archive);
return totalSize; return totalSize;

View file

@ -2025,6 +2025,9 @@ void Rig::updateFromControllerParameters(const ControllerParameters& params, flo
if (params.isTalking) { if (params.isTalking) {
if (_talkIdleInterpTime < 1.0f) { if (_talkIdleInterpTime < 1.0f) {
_talkIdleInterpTime += dt / TOTAL_EASE_IN_TIME; _talkIdleInterpTime += dt / TOTAL_EASE_IN_TIME;
if (_talkIdleInterpTime > 1.0f) {
_talkIdleInterpTime = 1.0f;
}
float easeOutInValue = _talkIdleInterpTime < 0.5f ? 4.0f * powf(_talkIdleInterpTime, 3.0f) : 4.0f * powf((_talkIdleInterpTime - 1.0f), 3.0f) + 1.0f; float easeOutInValue = _talkIdleInterpTime < 0.5f ? 4.0f * powf(_talkIdleInterpTime, 3.0f) : 4.0f * powf((_talkIdleInterpTime - 1.0f), 3.0f) + 1.0f;
_animVars.set("idleOverlayAlpha", easeOutInValue); _animVars.set("idleOverlayAlpha", easeOutInValue);
} else { } else {
@ -2033,6 +2036,9 @@ void Rig::updateFromControllerParameters(const ControllerParameters& params, flo
} else { } else {
if (_talkIdleInterpTime < 1.0f) { if (_talkIdleInterpTime < 1.0f) {
_talkIdleInterpTime += dt / TOTAL_EASE_OUT_TIME; _talkIdleInterpTime += dt / TOTAL_EASE_OUT_TIME;
if (_talkIdleInterpTime > 1.0f) {
_talkIdleInterpTime = 1.0f;
}
float easeOutInValue = _talkIdleInterpTime < 0.5f ? 4.0f * powf(_talkIdleInterpTime, 3.0f) : 4.0f * powf((_talkIdleInterpTime - 1.0f), 3.0f) + 1.0f; float easeOutInValue = _talkIdleInterpTime < 0.5f ? 4.0f * powf(_talkIdleInterpTime, 3.0f) : 4.0f * powf((_talkIdleInterpTime - 1.0f), 3.0f) + 1.0f;
float talkAlpha = 1.0f - easeOutInValue; float talkAlpha = 1.0f - easeOutInValue;
_animVars.set("idleOverlayAlpha", talkAlpha); _animVars.set("idleOverlayAlpha", talkAlpha);
@ -2287,6 +2293,24 @@ void Rig::buildAbsoluteRigPoses(const AnimPoseVec& relativePoses, AnimPoseVec& a
} }
} }
int Rig::getOverrideJointCount() const {
int count = 0;
for (size_t i = 0; i < _internalPoseSet._overrideFlags.size(); i++) {
if (_internalPoseSet._overrideFlags[i]) {
count++;
}
}
return count;
}
bool Rig::getFlowActive() const {
return _internalFlow.getActive();
}
bool Rig::getNetworkGraphActive() const {
return _sendNetworkNode;
}
glm::mat4 Rig::getJointTransform(int jointIndex) const { glm::mat4 Rig::getJointTransform(int jointIndex) const {
static const glm::mat4 IDENTITY; static const glm::mat4 IDENTITY;
if (isIndexValid(jointIndex)) { if (isIndexValid(jointIndex)) {

View file

@ -246,6 +246,10 @@ public:
float getUnscaledEyeHeight() const; float getUnscaledEyeHeight() const;
void buildAbsoluteRigPoses(const AnimPoseVec& relativePoses, AnimPoseVec& absolutePosesOut) const; void buildAbsoluteRigPoses(const AnimPoseVec& relativePoses, AnimPoseVec& absolutePosesOut) const;
int getOverrideJointCount() const;
bool getFlowActive() const;
bool getNetworkGraphActive() const;
signals: signals:
void onLoadComplete(); void onLoadComplete();

View file

@ -593,9 +593,10 @@ std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> OpenGL
hudEyeViewports[eye] = eyeViewport(eye); hudEyeViewports[eye] = eyeViewport(eye);
}); });
return [=](gpu::Batch& batch, const gpu::TexturePointer& hudTexture, bool mirror) { 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.enableStereo(false);
batch.setPipeline(mirror ? hudMirrorPipeline : hudPipeline); batch.setPipeline(pipeline);
batch.setResourceTexture(0, hudTexture); batch.setResourceTexture(0, hudTexture);
if (hudStereo) { if (hudStereo) {
for_each_eye([&](Eye eye) { for_each_eye([&](Eye eye) {
@ -661,17 +662,6 @@ void OpenGLDisplayPlugin::compositeLayers() {
compositeScene(); 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()) PROFILE_RANGE_EX(render_detail, "compositeExtra", 0xff0077ff, (uint64_t)presentCount())
compositeExtra(); compositeExtra();

View file

@ -86,6 +86,8 @@ public:
void copyTextureToQuickFramebuffer(NetworkTexturePointer source, QOpenGLFramebufferObject* target, GLsync* fenceSync) override; void copyTextureToQuickFramebuffer(NetworkTexturePointer source, QOpenGLFramebufferObject* target, GLsync* fenceSync) override;
virtual std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> getHUDOperator() override;
protected: protected:
friend class PresentThread; friend class PresentThread;
@ -102,7 +104,6 @@ protected:
virtual QThread::Priority getPresentPriority() { return QThread::HighPriority; } virtual QThread::Priority getPresentPriority() { return QThread::HighPriority; }
virtual void compositeLayers(); virtual void compositeLayers();
virtual void compositeScene(); virtual void compositeScene();
virtual std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> getHUDOperator();
virtual void compositePointer(); virtual void compositePointer();
virtual void compositeExtra() {}; virtual void compositeExtra() {};

View file

@ -1,4 +1,4 @@
// //
// Created by Bradley Austin Davis on 2016/02/15 // Created by Bradley Austin Davis on 2016/02/15
// Copyright 2016 High Fidelity, Inc. // Copyright 2016 High Fidelity, Inc.
// //
@ -402,11 +402,7 @@ 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::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)); format->setAttribute(gpu::Stream::TEXCOORD, gpu::Stream::TEXCOORD, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV));
uniformsBuffer = std::make_shared<gpu::Buffer>(sizeof(Uniforms), nullptr); uniformsBuffer = std::make_shared<gpu::Buffer>(sizeof(Uniforms), nullptr);
updatePipeline();
}
void HmdDisplayPlugin::HUDRenderer::updatePipeline() {
if (!pipeline) {
auto program = gpu::Shader::createProgram(shader::render_utils::program::hmd_ui); auto program = gpu::Shader::createProgram(shader::render_utils::program::hmd_ui);
gpu::StatePointer state = gpu::StatePointer(new gpu::State()); gpu::StatePointer state = gpu::StatePointer(new gpu::State());
state->setDepthTest(gpu::State::DepthTest(true, true, gpu::LESS_EQUAL)); state->setDepthTest(gpu::State::DepthTest(true, true, gpu::LESS_EQUAL));
@ -416,11 +412,8 @@ void HmdDisplayPlugin::HUDRenderer::updatePipeline() {
pipeline = gpu::Pipeline::create(program, state); pipeline = gpu::Pipeline::create(program, state);
} }
}
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> HmdDisplayPlugin::HUDRenderer::render(HmdDisplayPlugin& plugin) {
updatePipeline();
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> HmdDisplayPlugin::HUDRenderer::render() {
auto hudPipeline = pipeline; auto hudPipeline = pipeline;
auto hudFormat = format; auto hudFormat = format;
auto hudVertices = vertices; auto hudVertices = vertices;
@ -479,7 +472,7 @@ void HmdDisplayPlugin::compositePointer() {
} }
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> HmdDisplayPlugin::getHUDOperator() { std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> HmdDisplayPlugin::getHUDOperator() {
return _hudRenderer.render(*this); return _hudRenderer.render();
} }
HmdDisplayPlugin::~HmdDisplayPlugin() { HmdDisplayPlugin::~HmdDisplayPlugin() {

View file

@ -48,6 +48,7 @@ public:
void pluginUpdate() override {}; void pluginUpdate() override {};
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> getHUDOperator() override;
virtual StencilMaskMode getStencilMaskMode() const override { return StencilMaskMode::PAINT; } virtual StencilMaskMode getStencilMaskMode() const override { return StencilMaskMode::PAINT; }
signals: signals:
@ -62,7 +63,6 @@ protected:
bool internalActivate() override; bool internalActivate() override;
void internalDeactivate() override; void internalDeactivate() override;
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> getHUDOperator() override;
void compositePointer() override; void compositePointer() override;
void internalPresent() override; void internalPresent() override;
void customizeContext() override; void customizeContext() override;
@ -105,7 +105,7 @@ private:
gpu::BufferPointer vertices; gpu::BufferPointer vertices;
gpu::BufferPointer indices; gpu::BufferPointer indices;
uint32_t indexCount { 0 }; uint32_t indexCount { 0 };
gpu::PipelinePointer pipeline; gpu::PipelinePointer pipeline { nullptr };
gpu::BufferPointer uniformsBuffer; gpu::BufferPointer uniformsBuffer;
@ -123,7 +123,6 @@ private:
static const int VERTEX_STRIDE { sizeof(Vertex) }; static const int VERTEX_STRIDE { sizeof(Vertex) };
void build(); void build();
void updatePipeline(); std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> render();
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> render(HmdDisplayPlugin& plugin);
} _hudRenderer; } _hudRenderer;
}; };

View file

@ -256,18 +256,28 @@ void EntityTreeRenderer::clear() {
} }
// reset the engine // reset the engine
if (_wantScripts && !_shuttingDown) { auto scene = _viewState->getMain3DScene();
if (_shuttingDown) {
if (scene) {
render::Transaction transaction;
for (const auto& entry : _entitiesInScene) {
const auto& renderer = entry.second;
renderer->removeFromScene(scene, transaction);
}
scene->enqueueTransaction(transaction);
}
} else {
if (_wantScripts) {
resetEntitiesScriptEngine(); resetEntitiesScriptEngine();
} }
// remove all entities from the scene
auto scene = _viewState->getMain3DScene();
if (scene) { if (scene) {
for (const auto& entry : _entitiesInScene) { for (const auto& entry : _entitiesInScene) {
const auto& renderer = entry.second; const auto& renderer = entry.second;
fadeOutRenderable(renderer); fadeOutRenderable(renderer);
} }
} else { } else {
qCWarning(entitiesrenderer) << "EntitityTreeRenderer::clear(), Unexpected null scene, possibly during application shutdown"; qCWarning(entitiesrenderer) << "EntitityTreeRenderer::clear(), Unexpected null scene";
}
} }
_entitiesInScene.clear(); _entitiesInScene.clear();
_renderablesToUpdate.clear(); _renderablesToUpdate.clear();
@ -1056,10 +1066,14 @@ void EntityTreeRenderer::fadeOutRenderable(const EntityRendererPointer& renderab
render::Transaction transaction; render::Transaction transaction;
auto scene = _viewState->getMain3DScene(); auto scene = _viewState->getMain3DScene();
transaction.setTransitionFinishedOperator(renderable->getRenderItemID(), [scene, renderable]() { EntityRendererWeakPointer weakRenderable = renderable;
transaction.setTransitionFinishedOperator(renderable->getRenderItemID(), [scene, weakRenderable]() {
auto renderable = weakRenderable.lock();
if (renderable) {
render::Transaction transaction; render::Transaction transaction;
renderable->removeFromScene(scene, transaction); renderable->removeFromScene(scene, transaction);
scene->enqueueTransaction(transaction); scene->enqueueTransaction(transaction);
}
}); });
scene->enqueueTransaction(transaction); scene->enqueueTransaction(transaction);

View file

@ -7,6 +7,7 @@
// //
#include "RenderableWebEntityItem.h" #include "RenderableWebEntityItem.h"
#include <atomic>
#include <QtCore/QTimer> #include <QtCore/QTimer>
#include <QtGui/QOpenGLContext> #include <QtGui/QOpenGLContext>
@ -46,7 +47,7 @@ static uint64_t MAX_NO_RENDER_INTERVAL = 30 * USECS_PER_SECOND;
static uint8_t YOUTUBE_MAX_FPS = 30; static uint8_t YOUTUBE_MAX_FPS = 30;
// Don't allow more than 20 concurrent web views // Don't allow more than 20 concurrent web views
static uint32_t _currentWebCount { 0 }; static std::atomic<uint32_t> _currentWebCount(0);
static const uint32_t MAX_CONCURRENT_WEB_VIEWS = 20; static const uint32_t MAX_CONCURRENT_WEB_VIEWS = 20;
static QTouchDevice _touchDevice; static QTouchDevice _touchDevice;
@ -356,16 +357,15 @@ void WebEntityRenderer::buildWebSurface(const EntityItemPointer& entity, const Q
void WebEntityRenderer::destroyWebSurface() { void WebEntityRenderer::destroyWebSurface() {
QSharedPointer<OffscreenQmlSurface> webSurface; QSharedPointer<OffscreenQmlSurface> webSurface;
ContentType contentType = ContentType::NoContent;
withWriteLock([&] { withWriteLock([&] {
webSurface.swap(_webSurface); webSurface.swap(_webSurface);
_contentType = contentType; _contentType = ContentType::NoContent;
});
if (webSurface) { if (webSurface) {
--_currentWebCount; --_currentWebCount;
WebEntityRenderer::releaseWebSurface(webSurface, _cachedWebSurface, _connections); WebEntityRenderer::releaseWebSurface(webSurface, _cachedWebSurface, _connections);
} }
});
} }
glm::vec2 WebEntityRenderer::getWindowSize(const TypedEntityPointer& entity) const { glm::vec2 WebEntityRenderer::getWindowSize(const TypedEntityPointer& entity) const {

View file

@ -27,6 +27,10 @@
#include "GLHelpers.h" #include "GLHelpers.h"
#include "QOpenGLContextWrapper.h" #include "QOpenGLContextWrapper.h"
#if defined(GL_CUSTOM_CONTEXT)
#include <QtPlatformHeaders/QWGLNativeContext>
#endif
using namespace gl; using namespace gl;
#if defined(GL_CUSTOM_CONTEXT) #if defined(GL_CUSTOM_CONTEXT)
@ -42,7 +46,10 @@ std::atomic<size_t> Context::_totalSwapchainMemoryUsage { 0 };
size_t Context::getSwapchainMemoryUsage() { return _totalSwapchainMemoryUsage.load(); } size_t Context::getSwapchainMemoryUsage() { return _totalSwapchainMemoryUsage.load(); }
size_t Context::evalSurfaceMemoryUsage(uint32_t width, uint32_t height, uint32_t pixelSize) { size_t Context::evalSurfaceMemoryUsage(uint32_t width, uint32_t height, uint32_t pixelSize) {
return width * height * pixelSize; size_t result = width;
result *= height;
result *= pixelSize;
return result;
} }
void Context::updateSwapchainMemoryUsage(size_t prevSize, size_t newSize) { void Context::updateSwapchainMemoryUsage(size_t prevSize, size_t newSize) {
@ -176,6 +183,7 @@ static void setupPixelFormatSimple(HDC hdc) {
#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 #define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126
// Context create flag bits // Context create flag bits
#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004
#define WGL_CONTEXT_DEBUG_BIT_ARB 0x00000001 #define WGL_CONTEXT_DEBUG_BIT_ARB 0x00000001
#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 #define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 #define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004
@ -305,11 +313,18 @@ void Context::create(QOpenGLContext* shareContext) {
#else #else
contextAttribs.push_back(WGL_CONTEXT_CORE_PROFILE_BIT_ARB); contextAttribs.push_back(WGL_CONTEXT_CORE_PROFILE_BIT_ARB);
#endif #endif
contextAttribs.push_back(WGL_CONTEXT_FLAGS_ARB); {
int contextFlags = 0;
if (enableDebugLogger()) { if (enableDebugLogger()) {
contextAttribs.push_back(WGL_CONTEXT_DEBUG_BIT_ARB); contextFlags |= WGL_CONTEXT_DEBUG_BIT_ARB;
} else { }
contextAttribs.push_back(0); #ifdef USE_KHR_ROBUSTNESS
contextFlags |= WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB;
#endif
if (contextFlags != 0) {
contextAttribs.push_back(WGL_CONTEXT_FLAGS_ARB);
contextAttribs.push_back(contextFlags);
}
} }
contextAttribs.push_back(0); contextAttribs.push_back(0);
HGLRC shareHglrc = nullptr; HGLRC shareHglrc = nullptr;

View file

@ -23,7 +23,7 @@ class QOpenGLContext;
class QThread; class QThread;
class QOpenGLDebugMessage; class QOpenGLDebugMessage;
#if defined(Q_OS_WIN) && defined(USE_GLES) #if defined(Q_OS_WIN) && (defined(USE_GLES) || defined(USE_KHR_ROBUSTNESS))
//#if defined(Q_OS_WIN) //#if defined(Q_OS_WIN)
#define GL_CUSTOM_CONTEXT #define GL_CUSTOM_CONTEXT
#endif #endif

View file

@ -309,20 +309,28 @@ void PhysicalEntitySimulation::buildMotionStatesForEntitiesThatNeedThem() {
SetOfEntities::iterator entityItr = _entitiesToAddToPhysics.begin(); SetOfEntities::iterator entityItr = _entitiesToAddToPhysics.begin();
while (entityItr != _entitiesToAddToPhysics.end()) { while (entityItr != _entitiesToAddToPhysics.end()) {
EntityItemPointer entity = (*entityItr); EntityItemPointer entity = (*entityItr);
assert(!entity->getPhysicsInfo());
if (entity->isDead()) { if (entity->isDead()) {
prepareEntityForDelete(entity); prepareEntityForDelete(entity);
entityItr = _entitiesToAddToPhysics.erase(entityItr); entityItr = _entitiesToAddToPhysics.erase(entityItr);
} else if (!entity->shouldBePhysical()) { continue;
// this entity should no longer be on _entitiesToAddToPhysics }
if (entity->getPhysicsInfo()) {
entityItr = _entitiesToAddToPhysics.erase(entityItr); entityItr = _entitiesToAddToPhysics.erase(entityItr);
continue;
}
if (!entity->shouldBePhysical()) {
// this entity should no longer be on _entitiesToAddToPhysics
if (entity->isMovingRelativeToParent()) { if (entity->isMovingRelativeToParent()) {
SetOfEntities::iterator itr = _simpleKinematicEntities.find(entity); SetOfEntities::iterator itr = _simpleKinematicEntities.find(entity);
if (itr == _simpleKinematicEntities.end()) { if (itr == _simpleKinematicEntities.end()) {
_simpleKinematicEntities.insert(entity); _simpleKinematicEntities.insert(entity);
} }
} }
} else if (entity->isReadyToComputeShape()) { entityItr = _entitiesToAddToPhysics.erase(entityItr);
continue;
}
if (entity->isReadyToComputeShape()) {
ShapeRequest shapeRequest(entity); ShapeRequest shapeRequest(entity);
ShapeRequests::iterator requestItr = _shapeRequests.find(shapeRequest); ShapeRequests::iterator requestItr = _shapeRequests.find(shapeRequest);
if (requestItr == _shapeRequests.end()) { if (requestItr == _shapeRequests.end()) {
@ -332,18 +340,7 @@ void PhysicalEntitySimulation::buildMotionStatesForEntitiesThatNeedThem() {
uint32_t requestCount = ObjectMotionState::getShapeManager()->getWorkRequestCount(); uint32_t requestCount = ObjectMotionState::getShapeManager()->getWorkRequestCount();
btCollisionShape* shape = const_cast<btCollisionShape*>(ObjectMotionState::getShapeManager()->getShape(shapeInfo)); btCollisionShape* shape = const_cast<btCollisionShape*>(ObjectMotionState::getShapeManager()->getShape(shapeInfo));
if (shape) { if (shape) {
EntityMotionState* motionState = static_cast<EntityMotionState*>(entity->getPhysicsInfo());
if (!motionState) {
buildMotionState(shape, entity); 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);
}
} else if (requestCount != ObjectMotionState::getShapeManager()->getWorkRequestCount()) { } 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 // shape doesn't exist but a new worker has been spawned to build it --> add to shapeRequests and wait
shapeRequest.shapeHash = shapeInfo.getHash(); shapeRequest.shapeHash = shapeInfo.getHash();
@ -354,6 +351,7 @@ void PhysicalEntitySimulation::buildMotionStatesForEntitiesThatNeedThem() {
} }
entityItr = _entitiesToAddToPhysics.erase(entityItr); entityItr = _entitiesToAddToPhysics.erase(entityItr);
} else { } else {
// skip for later
++entityItr; ++entityItr;
} }
} }

View file

@ -181,7 +181,7 @@ void ThreadSafeDynamicsWorld::drawConnectedSpheres(btIDebugDraw* drawer, btScala
btVector3 xAxis = direction.cross(btVector3(0.0f, 1.0f, 0.0f)); btVector3 xAxis = direction.cross(btVector3(0.0f, 1.0f, 0.0f));
xAxis = xAxis.length() < EPSILON ? btVector3(1.0f, 0.0f, 0.0f) : xAxis.normalize(); xAxis = xAxis.length() < EPSILON ? btVector3(1.0f, 0.0f, 0.0f) : xAxis.normalize();
btVector3 zAxis = xAxis.cross(btVector3(0.0f, 1.0f, 0.0f)); 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; float fullCircle = 2.0f * PI;
for (float i = 0; i < fullCircle; i += stepRadians) { for (float i = 0; i < fullCircle; i += stepRadians) {
float x1 = btSin(btScalar(i)) * radius1; float x1 = btSin(btScalar(i)) * radius1;

View file

@ -28,11 +28,12 @@ json getGPU(int index);
int getNumDisplays(); int getNumDisplays();
json getDisplay(int index); json getDisplay(int index);
int getNumMemories(); json getMemory();
json getMemory(int index);
json getComputer(); json getComputer();
json getAll();
} // namespace platform } // namespace platform
#endif // hifi_platform_h #endif // hifi_platform_h

View file

@ -9,6 +9,9 @@
#define hifi_platform_PlatformKeys_h #define hifi_platform_PlatformKeys_h
namespace platform { namespace keys{ namespace platform { namespace keys{
// "UNKNOWN"
extern const char* UNKNOWN;
namespace cpu { namespace cpu {
extern const char* vendor; extern const char* vendor;
extern const char* vendor_Intel; extern const char* vendor_Intel;
@ -36,8 +39,9 @@ namespace platform { namespace keys{
extern const char* coordsTop; extern const char* coordsTop;
extern const char* coordsBottom; extern const char* coordsBottom;
} }
namespace memory {
extern const char* memTotal; extern const char* memTotal;
}
namespace computer { namespace computer {
extern const char* OS; extern const char* OS;
extern const char* OS_WINDOWS; extern const char* OS_WINDOWS;
@ -45,6 +49,8 @@ namespace platform { namespace keys{
extern const char* OS_LINUX; extern const char* OS_LINUX;
extern const char* OS_ANDROID; extern const char* OS_ANDROID;
extern const char* OSVersion;
extern const char* vendor; extern const char* vendor;
extern const char* vendor_Apple; extern const char* vendor_Apple;
@ -52,6 +58,14 @@ namespace platform { namespace keys{
extern const char* profileTier; extern const char* profileTier;
} }
// 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 } } // namespace plaform::keys
#endif #endif

View file

@ -9,39 +9,45 @@
#include "AndroidPlatform.h" #include "AndroidPlatform.h"
#include "../PlatformKeys.h" #include "../PlatformKeys.h"
#include <GPUIdent.h> #include <GPUIdent.h>
#include <QSysInfo>
using namespace platform; using namespace platform;
void AndroidInstance::enumerateCpu() { void AndroidInstance::enumerateCpus() {
json cpu; json cpu;
cpu[keys::cpu::vendor] = ""; cpu[keys::cpu::vendor] = "";
cpu[keys::cpu::model] = ""; cpu[keys::cpu::model] = "";
cpu[keys::cpu::clockSpeed] = ""; cpu[keys::cpu::clockSpeed] = "";
cpu[keys::cpu::numCores] = 0; cpu[keys::cpu::numCores] = 0;
_cpu.push_back(cpu);
_cpus.push_back(cpu);
} }
void AndroidInstance::enumerateGpu() { void AndroidInstance::enumerateGpus() {
GPUIdent* ident = GPUIdent::getInstance(); GPUIdent* ident = GPUIdent::getInstance();
json gpu = {}; json gpu = {};
gpu[keys::gpu::vendor] = ident->getName().toUtf8().constData();
gpu[keys::gpu::model] = ident->getName().toUtf8().constData(); gpu[keys::gpu::model] = ident->getName().toUtf8().constData();
gpu[keys::gpu::vendor] = findGPUVendorInDescription(gpu[keys::gpu::model].get<std::string>());
gpu[keys::gpu::videoMemory] = ident->getMemory(); gpu[keys::gpu::videoMemory] = ident->getMemory();
gpu[keys::gpu::driver] = ident->getDriver().toUtf8().constData(); gpu[keys::gpu::driver] = ident->getDriver().toUtf8().constData();
_gpu.push_back(gpu); _gpus.push_back(gpu);
_display = ident->getOutput(); _displays = ident->getOutput();
} }
void AndroidInstance::enumerateMemory() { void AndroidInstance::enumerateMemory() {
json ram = {}; json ram = {};
ram[keys::memTotal]=0; ram[keys::memory::memTotal]=0;
_memory.push_back(ram); _memory = ram;
} }
void AndroidInstance::enumerateComputer(){ void AndroidInstance::enumerateComputer(){
_computer[keys::computer::OS] = keys::computer::OS_ANDROID; _computer[keys::computer::OS] = keys::computer::OS_ANDROID;
_computer[keys::computer::vendor] = ""; _computer[keys::computer::vendor] = "";
_computer[keys::computer::model] = ""; _computer[keys::computer::model] = "";
auto sysInfo = QSysInfo();
_computer[keys::computer::OSVersion] = sysInfo.kernelVersion().toStdString();
} }

View file

@ -15,9 +15,9 @@ namespace platform {
class AndroidInstance : public Instance { class AndroidInstance : public Instance {
public: public:
void enumerateCpu() override; void enumerateCpus() override;
void enumerateGpus() override;
void enumerateMemory() override; void enumerateMemory() override;
void enumerateGpu() override;
void enumerateComputer() override; void enumerateComputer() override;
}; };

View file

@ -13,36 +13,37 @@
#include <string> #include <string>
#include <CPUIdent.h> #include <CPUIdent.h>
#include <GPUIdent.h> #include <GPUIdent.h>
#include <QSysInfo>
using namespace platform; using namespace platform;
void LinuxInstance::enumerateCpu() { void LinuxInstance::enumerateCpus() {
json cpu = {}; json cpu = {};
cpu[keys::cpu::vendor] = CPUIdent::Vendor(); cpu[keys::cpu::vendor] = CPUIdent::Vendor();
cpu[keys::cpu::model] = CPUIdent::Brand(); cpu[keys::cpu::model] = CPUIdent::Brand();
cpu[keys::cpu::numCores] = std::thread::hardware_concurrency(); 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(); GPUIdent* ident = GPUIdent::getInstance();
json gpu = {}; json gpu = {};
gpu[keys::gpu::vendor] = ident->getName().toUtf8().constData();
gpu[keys::gpu::model] = ident->getName().toUtf8().constData(); gpu[keys::gpu::model] = ident->getName().toUtf8().constData();
gpu[keys::gpu::vendor] = findGPUVendorInDescription(gpu[keys::gpu::model].get<std::string>());
gpu[keys::gpu::videoMemory] = ident->getMemory(); gpu[keys::gpu::videoMemory] = ident->getMemory();
gpu[keys::gpu::driver] = ident->getDriver().toUtf8().constData(); gpu[keys::gpu::driver] = ident->getDriver().toUtf8().constData();
_gpu.push_back(gpu); _gpus.push_back(gpu);
_display = ident->getOutput(); _displays = ident->getOutput();
} }
void LinuxInstance::enumerateMemory() { void LinuxInstance::enumerateMemory() {
json ram = {}; json ram = {};
ram[keys::memTotal]=0; ram[keys::memory::memTotal]=0;
_memory.push_back(ram); _memory = ram;
} }
void LinuxInstance::enumerateComputer(){ void LinuxInstance::enumerateComputer(){
@ -50,5 +51,9 @@ void LinuxInstance::enumerateComputer(){
_computer[keys::computer::OS] = keys::computer::OS_LINUX; _computer[keys::computer::OS] = keys::computer::OS_LINUX;
_computer[keys::computer::vendor] = ""; _computer[keys::computer::vendor] = "";
_computer[keys::computer::model] = ""; _computer[keys::computer::model] = "";
auto sysInfo = QSysInfo();
_computer[keys::computer::OSVersion] = sysInfo.kernelVersion().toStdString();
} }

View file

@ -15,9 +15,9 @@ namespace platform {
class LinuxInstance : public Instance { class LinuxInstance : public Instance {
public: public:
void enumerateCpu() override; void enumerateCpus() override;
void enumerateGpus() override;
void enumerateMemory() override; void enumerateMemory() override;
void enumerateGpu() override;
void enumerateComputer() override; void enumerateComputer() override;
}; };

View file

@ -21,32 +21,33 @@
#include <CoreFoundation/CoreFoundation.h> #include <CoreFoundation/CoreFoundation.h>
#include <ApplicationServices/ApplicationServices.h> #include <ApplicationServices/ApplicationServices.h>
#include <QSysInfo>
#endif #endif
using namespace platform; using namespace platform;
void MACOSInstance::enumerateCpu() { void MACOSInstance::enumerateCpus() {
json cpu = {}; json cpu = {};
cpu[keys::cpu::vendor] = CPUIdent::Vendor(); cpu[keys::cpu::vendor] = CPUIdent::Vendor();
cpu[keys::cpu::model] = CPUIdent::Brand(); cpu[keys::cpu::model] = CPUIdent::Brand();
cpu[keys::cpu::numCores] = std::thread::hardware_concurrency(); 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 #ifdef Q_OS_MAC
GPUIdent* ident = GPUIdent::getInstance(); GPUIdent* ident = GPUIdent::getInstance();
json gpu = {}; json gpu = {};
gpu[keys::gpu::vendor] = ident->getName().toUtf8().constData();
gpu[keys::gpu::model] = ident->getName().toUtf8().constData(); gpu[keys::gpu::model] = ident->getName().toUtf8().constData();
gpu[keys::gpu::vendor] = findGPUVendorInDescription(gpu[keys::gpu::model].get<std::string>());
gpu[keys::gpu::videoMemory] = ident->getMemory(); gpu[keys::gpu::videoMemory] = ident->getMemory();
gpu[keys::gpu::driver] = ident->getDriver().toUtf8().constData(); gpu[keys::gpu::driver] = ident->getDriver().toUtf8().constData();
_gpu.push_back(gpu); _gpus.push_back(gpu);
#endif #endif
@ -101,7 +102,7 @@ void MACOSInstance::enumerateDisplays() {
display["modeWidth"] = displayModeWidth; display["modeWidth"] = displayModeWidth;
display["modeHeight"] = displayModeHeight; display["modeHeight"] = displayModeHeight;
_display.push_back(display); _displays.push_back(display);
#endif #endif
} }
@ -111,9 +112,9 @@ void MACOSInstance::enumerateMemory() {
#ifdef Q_OS_MAC #ifdef Q_OS_MAC
long pages = sysconf(_SC_PHYS_PAGES); long pages = sysconf(_SC_PHYS_PAGES);
long page_size = sysconf(_SC_PAGE_SIZE); long page_size = sysconf(_SC_PAGE_SIZE);
ram[keys::memTotal] = pages * page_size; ram[keys::memory::memTotal] = pages * page_size;
#endif #endif
_memory.push_back(ram); _memory = ram;
} }
void MACOSInstance::enumerateComputer(){ void MACOSInstance::enumerateComputer(){
@ -133,5 +134,9 @@ void MACOSInstance::enumerateComputer(){
free(model); free(model);
#endif #endif
auto sysInfo = QSysInfo();
_computer[keys::computer::OSVersion] = sysInfo.kernelVersion().toStdString();
} }

View file

@ -15,10 +15,10 @@ namespace platform {
class MACOSInstance : public Instance { class MACOSInstance : public Instance {
public: public:
void enumerateCpu() override; void enumerateCpus() override;
void enumerateMemory() override; void enumerateGpus() override;
void enumerateGpu() override;
void enumerateDisplays() override; void enumerateDisplays() override;
void enumerateMemory() override;
void enumerateComputer() override; void enumerateComputer() override;
}; };

View file

@ -11,6 +11,8 @@
#include "../PlatformKeys.h" #include "../PlatformKeys.h"
namespace platform { namespace keys { namespace platform { namespace keys {
const char* UNKNOWN = "UNKNOWN";
namespace cpu { namespace cpu {
const char* vendor = "vendor"; const char* vendor = "vendor";
const char* vendor_Intel = "Intel"; const char* vendor_Intel = "Intel";
@ -38,8 +40,9 @@ namespace platform { namespace keys {
const char* coordsTop = "coordinatestop"; const char* coordsTop = "coordinatestop";
const char* coordsBottom = "coordinatesbottom"; const char* coordsBottom = "coordinatesbottom";
} }
namespace memory {
const char* memTotal = "memTotal"; const char* memTotal = "memTotal";
}
namespace computer { namespace computer {
const char* OS = "OS"; const char* OS = "OS";
const char* OS_WINDOWS = "WINDOWS"; const char* OS_WINDOWS = "WINDOWS";
@ -47,6 +50,8 @@ namespace platform { namespace keys {
const char* OS_LINUX = "LINUX"; const char* OS_LINUX = "LINUX";
const char* OS_ANDROID = "ANDROID"; const char* OS_ANDROID = "ANDROID";
const char* OSVersion = "OSVersion";
const char* vendor = "vendor"; const char* vendor = "vendor";
const char* vendor_Apple = "Apple"; const char* vendor_Apple = "Apple";
@ -54,6 +59,12 @@ namespace platform { namespace keys {
const char* profileTier = "profileTier"; 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 <qglobal.h> #include <qglobal.h>
@ -117,14 +128,14 @@ json platform::getDisplay(int index) {
return _instance->getDisplay(index); return _instance->getDisplay(index);
} }
int platform::getNumMemories() { json platform::getMemory() {
return _instance->getNumMemories(); return _instance->getMemory();
}
json platform::getMemory(int index) {
return _instance->getMemory(index);
} }
json platform::getComputer() { json platform::getComputer() {
return _instance->getComputer(); return _instance->getComputer();
} }
json platform::getAll() {
return _instance->getAll();
}

View file

@ -16,10 +16,10 @@ using namespace platform;
bool Instance::enumeratePlatform() { bool Instance::enumeratePlatform() {
enumerateComputer(); enumerateComputer();
enumerateCpu();
enumerateGpu();
enumerateDisplays();
enumerateMemory(); enumerateMemory();
enumerateCpus();
enumerateGpus();
enumerateDisplays();
// And profile the platform and put the tier in "computer" // And profile the platform and put the tier in "computer"
_computer[keys::computer::profileTier] = Profiler::TierNames[Profiler::profilePlatform()]; _computer[keys::computer::profileTier] = Profiler::TierNames[Profiler::profilePlatform()];
@ -28,55 +28,42 @@ bool Instance::enumeratePlatform() {
} }
json Instance::getCPU(int index) { json Instance::getCPU(int index) {
assert(index <(int) _cpu.size()); assert(index <(int) _cpus.size());
if (index >= (int)_cpu.size()) if (index >= (int)_cpus.size())
return json(); return json();
return _cpu.at(index); return _cpus.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);
} }
json Instance::getGPU(int 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 json();
return _gpu.at(index); return _gpus.at(index);
} }
json Instance::getDisplay(int 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 json();
return _display.at(index); return _displays.at(index);
} }
Instance::~Instance() { Instance::~Instance() {
if (_cpu.size() > 0) { if (_cpus.size() > 0) {
_cpu.clear(); _cpus.clear();
} }
if (_memory.size() > 0) { if (_gpus.size() > 0) {
_memory.clear(); _gpus.clear();
} }
if (_gpu.size() > 0) { if (_displays.size() > 0) {
_gpu.clear(); _displays.clear();
}
if (_display.size() > 0) {
_display.clear();
} }
} }
@ -106,17 +93,53 @@ json Instance::listAllKeys() {
keys::display::coordsTop, keys::display::coordsTop,
keys::display::coordsBottom, keys::display::coordsBottom,
keys::memTotal, keys::memory::memTotal,
keys::computer::OS, keys::computer::OS,
keys::computer::OS_WINDOWS, keys::computer::OS_WINDOWS,
keys::computer::OS_MACOS, keys::computer::OS_MACOS,
keys::computer::OS_LINUX, keys::computer::OS_LINUX,
keys::computer::OS_ANDROID, keys::computer::OS_ANDROID,
keys::computer::OSVersion,
keys::computer::vendor, keys::computer::vendor,
keys::computer::vendor_Apple, keys::computer::vendor_Apple,
keys::computer::model, keys::computer::model,
keys::computer::profileTier keys::computer::profileTier,
keys::CPUS,
keys::GPUS,
keys::DISPLAYS,
keys::MEMORY,
keys::COMPUTER,
}}); }});
return allKeys; 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) || (description.find("Radeon") != 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;
}

View file

@ -19,36 +19,39 @@ class Instance {
public: public:
bool virtual enumeratePlatform(); bool virtual enumeratePlatform();
int getNumCPUs() { return (int)_cpu.size(); } int getNumCPUs() { return (int)_cpus.size(); }
json getCPU(int index); json getCPU(int index);
int getNumGPUs() { return (int)_gpu.size(); } int getNumGPUs() { return (int)_gpus.size(); }
json getGPU(int index); json getGPU(int index);
int getNumMemories() { return (int)_memory.size(); } int getNumDisplays() { return (int)_displays.size(); }
json getMemory(int index);
int getNumDisplays() { return (int)_display.size(); }
json getDisplay(int index); json getDisplay(int index);
json getMemory() { return _memory; }
json getComputer() { return _computer; } json getComputer() { return _computer; }
void virtual enumerateCpu()=0; json getAll();
void virtual enumerateMemory()=0;
void virtual enumerateGpu()=0; void virtual enumerateCpus()=0;
void virtual enumerateGpus()=0;
void virtual enumerateDisplays() {} void virtual enumerateDisplays() {}
void virtual enumerateMemory() = 0;
void virtual enumerateComputer()=0; void virtual enumerateComputer()=0;
virtual ~Instance(); virtual ~Instance();
static json listAllKeys(); 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: protected:
std::vector<json> _cpu; std::vector<json> _cpus;
std::vector<json> _memory; std::vector<json> _gpus;
std::vector<json> _gpu; std::vector<json> _displays;
std::vector<json> _display; json _memory;
json _computer; json _computer;
}; };

View file

@ -16,32 +16,33 @@
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
#include <Windows.h> #include <Windows.h>
#include <QSysInfo>
#endif #endif
using namespace platform; using namespace platform;
void WINInstance::enumerateCpu() { void WINInstance::enumerateCpus() {
json cpu = {}; json cpu = {};
cpu[keys::cpu::vendor] = CPUIdent::Vendor(); cpu[keys::cpu::vendor] = CPUIdent::Vendor();
cpu[keys::cpu::model] = CPUIdent::Brand(); cpu[keys::cpu::model] = CPUIdent::Brand();
cpu[keys::cpu::numCores] = std::thread::hardware_concurrency(); 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(); GPUIdent* ident = GPUIdent::getInstance();
json gpu = {}; json gpu = {};
gpu[keys::gpu::vendor] = ident->getName().toUtf8().constData();
gpu[keys::gpu::model] = ident->getName().toUtf8().constData(); gpu[keys::gpu::model] = ident->getName().toUtf8().constData();
gpu[keys::gpu::vendor] = findGPUVendorInDescription(gpu[keys::gpu::model].get<std::string>());
gpu[keys::gpu::videoMemory] = ident->getMemory(); gpu[keys::gpu::videoMemory] = ident->getMemory();
gpu[keys::gpu::driver] = ident->getDriver().toUtf8().constData(); gpu[keys::gpu::driver] = ident->getDriver().toUtf8().constData();
_gpu.push_back(gpu); _gpus.push_back(gpu);
_display = ident->getOutput(); _displays = ident->getOutput();
} }
void WINInstance::enumerateMemory() { void WINInstance::enumerateMemory() {
@ -52,9 +53,9 @@ void WINInstance::enumerateMemory() {
statex.dwLength = sizeof(statex); statex.dwLength = sizeof(statex);
GlobalMemoryStatusEx(&statex); GlobalMemoryStatusEx(&statex);
int totalRam = statex.ullTotalPhys / 1024 / 1024; int totalRam = statex.ullTotalPhys / 1024 / 1024;
ram[platform::keys::memTotal] = totalRam; ram[platform::keys::memory::memTotal] = totalRam;
#endif #endif
_memory.push_back(ram); _memory = ram;
} }
void WINInstance::enumerateComputer(){ void WINInstance::enumerateComputer(){
@ -62,5 +63,8 @@ void WINInstance::enumerateComputer(){
_computer[keys::computer::vendor] = ""; _computer[keys::computer::vendor] = "";
_computer[keys::computer::model] = ""; _computer[keys::computer::model] = "";
auto sysInfo = QSysInfo();
_computer[keys::computer::OSVersion] = sysInfo.kernelVersion().toStdString();
} }

View file

@ -15,9 +15,9 @@ namespace platform {
class WINInstance : public Instance { class WINInstance : public Instance {
public: public:
void enumerateCpu() override; void enumerateCpus() override;
void enumerateGpus() override;
void enumerateMemory() override; void enumerateMemory() override;
void enumerateGpu() override;
void enumerateComputer () override; void enumerateComputer () override;
}; };
} // namespace platform } // namespace platform

View file

@ -35,15 +35,6 @@ void DisplayPlugin::waitForPresent() {
} }
} }
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> DisplayPlugin::getHUDOperator() {
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> hudOperator;
{
QMutexLocker locker(&_presentMutex);
hudOperator = _hudOperator;
}
return hudOperator;
}
glm::mat4 HmdDisplay::getEyeToHeadTransform(Eye eye) const { glm::mat4 HmdDisplay::getEyeToHeadTransform(Eye eye) const {
static const glm::mat4 xform; static const glm::mat4 xform;
return xform; return xform;

View file

@ -213,13 +213,12 @@ public:
void waitForPresent(); void waitForPresent();
float getAveragePresentTime() { return _movingAveragePresent.average / (float)USECS_PER_MSEC; } // in msec float getAveragePresentTime() { return _movingAveragePresent.average / (float)USECS_PER_MSEC; } // in msec
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> getHUDOperator();
static const QString& MENU_PATH(); static const QString& MENU_PATH();
// for updating plugin-related commands. Mimics the input plugin. // for updating plugin-related commands. Mimics the input plugin.
virtual void pluginUpdate() = 0; virtual void pluginUpdate() = 0;
virtual std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> getHUDOperator() { return nullptr; }
virtual StencilMaskMode getStencilMaskMode() const { return StencilMaskMode::NONE; } virtual StencilMaskMode getStencilMaskMode() const { return StencilMaskMode::NONE; }
using StencilMaskMeshOperator = std::function<void(gpu::Batch&)>; using StencilMaskMeshOperator = std::function<void(gpu::Batch&)>;
virtual StencilMaskMeshOperator getStencilMaskMeshOperator() { return nullptr; } virtual StencilMaskMeshOperator getStencilMaskMeshOperator() { return nullptr; }
@ -234,8 +233,6 @@ protected:
gpu::ContextPointer _gpuContext; gpu::ContextPointer _gpuContext;
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> _hudOperator { std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)>() };
MovingAverage<float, 10> _movingAveragePresent; MovingAverage<float, 10> _movingAveragePresent;
float _renderResolutionScale { 1.0f }; float _renderResolutionScale { 1.0f };

View file

@ -49,8 +49,8 @@ bool RenderEventHandler::event(QEvent* e) {
return QObject::event(e); return QObject::event(e);
} }
RenderEventHandler::RenderEventHandler(SharedObject* shared, QThread* targetThread) RenderEventHandler::RenderEventHandler(SharedObject* shared, QThread* targetThread) :
: _shared(shared) { _shared(shared) {
// Create the GL canvas in the same thread as the share canvas // Create the GL canvas in the same thread as the share canvas
if (!_canvas.create(SharedObject::getSharedContext())) { if (!_canvas.create(SharedObject::getSharedContext())) {
qFatal("Unable to create new offscreen GL context"); qFatal("Unable to create new offscreen GL context");
@ -136,7 +136,8 @@ void RenderEventHandler::qmlRender(bool sceneGraphSync) {
resize(); resize();
{
if (_currentSize != QSize()) {
PROFILE_RANGE(render_qml_gl, "render"); PROFILE_RANGE(render_qml_gl, "render");
GLuint texture = SharedObject::getTextureCache().acquireTexture(_currentSize); GLuint texture = SharedObject::getTextureCache().acquireTexture(_currentSize);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fbo); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fbo);
@ -146,7 +147,7 @@ void RenderEventHandler::qmlRender(bool sceneGraphSync) {
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
} else { } else {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
_shared->_quickWindow->setRenderTarget(_fbo, _currentSize); _shared->setRenderTarget(_fbo, _currentSize);
_shared->_renderControl->render(); _shared->_renderControl->render();
} }
_shared->_lastRenderTime = usecTimestampNow(); _shared->_lastRenderTime = usecTimestampNow();
@ -179,7 +180,7 @@ void RenderEventHandler::onQuit() {
_fbo = 0; _fbo = 0;
} }
_shared->shutdownRendering(_canvas, _currentSize); _shared->shutdownRendering(_currentSize);
_canvas.doneCurrent(); _canvas.doneCurrent();
} }
_canvas.moveToThreadWithContext(qApp->thread()); _canvas.moveToThreadWithContext(qApp->thread());

View file

@ -78,7 +78,6 @@ SharedObject::SharedObject() {
QObject::connect(qApp, &QCoreApplication::aboutToQuit, this, &SharedObject::onAboutToQuit); QObject::connect(qApp, &QCoreApplication::aboutToQuit, this, &SharedObject::onAboutToQuit);
} }
SharedObject::~SharedObject() { SharedObject::~SharedObject() {
// After destroy returns, the rendering thread should be gone // After destroy returns, the rendering thread should be gone
destroy(); destroy();
@ -173,7 +172,6 @@ void SharedObject::setRootItem(QQuickItem* rootItem) {
QObject::connect(_renderControl, &QQuickRenderControl::renderRequested, this, &SharedObject::requestRender); QObject::connect(_renderControl, &QQuickRenderControl::renderRequested, this, &SharedObject::requestRender);
QObject::connect(_renderControl, &QQuickRenderControl::sceneChanged, this, &SharedObject::requestRenderSync); QObject::connect(_renderControl, &QQuickRenderControl::sceneChanged, this, &SharedObject::requestRenderSync);
#endif #endif
} }
void SharedObject::destroy() { void SharedObject::destroy() {
@ -220,10 +218,8 @@ void SharedObject::destroy() {
#endif #endif
} }
#define SINGLE_QML_ENGINE 0 #define SINGLE_QML_ENGINE 0
#if SINGLE_QML_ENGINE #if SINGLE_QML_ENGINE
static QQmlEngine* globalEngine{ nullptr }; static QQmlEngine* globalEngine{ nullptr };
static size_t globalEngineRefCount{ 0 }; static size_t globalEngineRefCount{ 0 };
@ -344,6 +340,11 @@ void SharedObject::setSize(const QSize& size) {
#endif #endif
} }
void SharedObject::setMaxFps(uint8_t maxFps) {
QMutexLocker locker(&_mutex);
_maxFps = maxFps;
}
bool SharedObject::preRender(bool sceneGraphSync) { bool SharedObject::preRender(bool sceneGraphSync) {
#ifndef DISABLE_QML #ifndef DISABLE_QML
QMutexLocker lock(&_mutex); QMutexLocker lock(&_mutex);
@ -370,9 +371,9 @@ bool SharedObject::preRender(bool sceneGraphSync) {
return true; return true;
} }
void SharedObject::shutdownRendering(OffscreenGLCanvas& canvas, const QSize& size) { void SharedObject::shutdownRendering(const QSize& size) {
QMutexLocker locker(&_mutex); QMutexLocker locker(&_mutex);
if (size != QSize(0, 0)) { if (size != QSize()) {
getTextureCache().releaseSize(size); getTextureCache().releaseSize(size);
if (_latestTextureAndFence.first) { if (_latestTextureAndFence.first) {
getTextureCache().releaseTexture(_latestTextureAndFence); getTextureCache().releaseTexture(_latestTextureAndFence);
@ -380,19 +381,17 @@ void SharedObject::shutdownRendering(OffscreenGLCanvas& canvas, const QSize& siz
} }
#ifndef DISABLE_QML #ifndef DISABLE_QML
_renderControl->invalidate(); _renderControl->invalidate();
canvas.doneCurrent();
#endif #endif
wake(); wake();
} }
bool SharedObject::isQuit() { bool SharedObject::isQuit() const {
QMutexLocker locker(&_mutex); QMutexLocker locker(&_mutex);
return _quit; return _quit;
} }
void SharedObject::requestRender() { void SharedObject::requestRender() {
// Don't queue multiple renders if (_quit) {
if (_renderRequested) {
return; return;
} }
_renderRequested = true; _renderRequested = true;
@ -402,18 +401,13 @@ void SharedObject::requestRenderSync() {
if (_quit) { if (_quit) {
return; return;
} }
_renderRequested = true;
{
QMutexLocker lock(&_mutex);
_syncRequested = true; _syncRequested = true;
} }
requestRender();
}
bool SharedObject::fetchTexture(TextureAndFence& textureAndFence) { bool SharedObject::fetchTexture(TextureAndFence& textureAndFence) {
QMutexLocker locker(&_mutex); QMutexLocker locker(&_mutex);
if (0 == _latestTextureAndFence.first) { if (!_latestTextureAndFence.first) {
return false; return false;
} }
textureAndFence = { 0, 0 }; textureAndFence = { 0, 0 };
@ -421,8 +415,7 @@ bool SharedObject::fetchTexture(TextureAndFence& textureAndFence) {
return true; return true;
} }
void hifi::qml::impl::SharedObject::addToDeletionList(QObject * object) void SharedObject::addToDeletionList(QObject* object) {
{
_deletionList.append(QPointer<QObject>(object)); _deletionList.append(QPointer<QObject>(object));
} }
@ -469,11 +462,9 @@ void SharedObject::onRender() {
return; return;
} }
QMutexLocker lock(&_mutex);
if (_syncRequested) { if (_syncRequested) {
lock.unlock();
_renderControl->polishItems(); _renderControl->polishItems();
lock.relock(); QMutexLocker lock(&_mutex);
QCoreApplication::postEvent(_renderObject, new OffscreenEvent(OffscreenEvent::RenderSync)); QCoreApplication::postEvent(_renderObject, new OffscreenEvent(OffscreenEvent::RenderSync));
// sync and render request, main and render threads must be synchronized // sync and render request, main and render threads must be synchronized
wait(); wait();
@ -494,13 +485,11 @@ void SharedObject::onTimer() {
{ {
QMutexLocker locker(&_mutex); QMutexLocker locker(&_mutex);
// Don't queue more than one frame at a time // Don't queue more than one frame at a time
if (0 != _latestTextureAndFence.first) { if (_latestTextureAndFence.first) {
return; return;
} }
}
{ if (!_maxFps) {
if (_maxFps == 0) {
return; return;
} }
auto minRenderInterval = USECS_PER_SECOND / _maxFps; auto minRenderInterval = USECS_PER_SECOND / _maxFps;

View file

@ -16,7 +16,6 @@
#include "TextureCache.h" #include "TextureCache.h"
class QWindow; class QWindow;
class QTimer; class QTimer;
class QQuickWindow; class QQuickWindow;
@ -24,7 +23,6 @@ class QQuickItem;
class QOpenGLContext; class QOpenGLContext;
class QQmlEngine; class QQmlEngine;
class QQmlContext; class QQmlContext;
class OffscreenGLCanvas;
namespace hifi { namespace qml { namespace hifi { namespace qml {
@ -51,11 +49,11 @@ public:
void create(OffscreenSurface* surface); void create(OffscreenSurface* surface);
void setRootItem(QQuickItem* rootItem); void setRootItem(QQuickItem* rootItem);
void destroy(); void destroy();
bool isQuit(); bool isQuit() const;
QSize getSize() const; QSize getSize() const;
void setSize(const QSize& size); void setSize(const QSize& size);
void setMaxFps(uint8_t maxFps) { _maxFps = maxFps; } void setMaxFps(uint8_t maxFps);
QQuickWindow* getWindow() { return _quickWindow; } QQuickWindow* getWindow() { return _quickWindow; }
QQuickItem* getRootItem() { return _rootItem; } QQuickItem* getRootItem() { return _rootItem; }
@ -72,7 +70,7 @@ private:
bool event(QEvent* e) override; bool event(QEvent* e) override;
bool preRender(bool sceneGraphSync); bool preRender(bool sceneGraphSync);
void shutdownRendering(OffscreenGLCanvas& canvas, const QSize& size); void shutdownRendering(const QSize& size);
// Called by the render event handler, from the render thread // Called by the render event handler, from the render thread
void initializeRenderControl(QOpenGLContext* context); void initializeRenderControl(QOpenGLContext* context);
void releaseTextureAndFence(); void releaseTextureAndFence();
@ -95,7 +93,6 @@ private:
// Texture management // Texture management
TextureAndFence _latestTextureAndFence { 0, 0 }; TextureAndFence _latestTextureAndFence { 0, 0 };
QQuickItem* _item{ nullptr };
QQuickItem* _rootItem { nullptr }; QQuickItem* _rootItem { nullptr };
QQuickWindow* _quickWindow { nullptr }; QQuickWindow* _quickWindow { nullptr };
QQmlContext* _qmlContext { nullptr }; QQmlContext* _qmlContext { nullptr };

View file

@ -35,7 +35,6 @@ public:
using Size = uint64_t; using Size = uint64_t;
struct TextureSet { struct TextureSet {
Size textureSize;
// The number of surfaces with this size // The number of surfaces with this size
size_t clientCount { 0 }; size_t clientCount { 0 };
ValueList returnedTextures; ValueList returnedTextures;

View file

@ -111,7 +111,7 @@ void CompositeHUD::run(const RenderContextPointer& renderContext, const gpu::Fra
assert(renderContext->args->_context); assert(renderContext->args->_context);
// We do not want to render HUD elements in secondary camera // 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; return;
} }

View file

@ -136,8 +136,8 @@ namespace render {
render::ScenePointer _scene; render::ScenePointer _scene;
int8_t _cameraMode { -1 }; int8_t _cameraMode { -1 };
std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> _hudOperator; std::function<void(gpu::Batch&, const gpu::TexturePointer&, bool mirror)> _hudOperator { nullptr };
gpu::TexturePointer _hudTexture; gpu::TexturePointer _hudTexture { nullptr };
bool _takingSnapshot { false }; bool _takingSnapshot { false };
StencilMaskMode _stencilMaskMode { StencilMaskMode::NONE }; StencilMaskMode _stencilMaskMode { StencilMaskMode::NONE };

View file

@ -284,10 +284,11 @@ GPUIdent* GPUIdent::ensureQuery(const QString& vendor, const QString& renderer)
AdapterEntry entry = *outy; AdapterEntry entry = *outy;
for (auto test = entry.second.begin(); test != entry.second.end(); ++test) { 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 = {}; nlohmann::json output = {};
output["description"] = entry.first.first.Description; output["model"] = deviceName;
output["deviceName"]= test->DeviceName;
output["coordinatesleft"] = test->DesktopCoordinates.left; output["coordinatesleft"] = test->DesktopCoordinates.left;
output["coordinatesright"] = test->DesktopCoordinates.right; output["coordinatesright"] = test->DesktopCoordinates.right;
output["coordinatestop"] = test->DesktopCoordinates.top; output["coordinatestop"] = test->DesktopCoordinates.top;

View file

@ -17,7 +17,8 @@
(function () { (function () {
var LEAP_MOTION_NAME = "LeapMotion"; var LEAP_MOTION_NAME = "LeapMotion";
var handTouchEnabled = true; // Hand touch is disabled due to twitchy finger bug when walking near walls or tables. see BUGZ-154.
var handTouchEnabled = false;
var leapMotionEnabled = Controller.getRunningInputDeviceNames().indexOf(LEAP_MOTION_NAME) >= 0; var leapMotionEnabled = Controller.getRunningInputDeviceNames().indexOf(LEAP_MOTION_NAME) >= 0;
var MSECONDS_AFTER_LOAD = 2000; var MSECONDS_AFTER_LOAD = 2000;
var updateFingerWithIndex = 0; var updateFingerWithIndex = 0;

View file

@ -17,7 +17,8 @@
(function () { (function () {
var LEAP_MOTION_NAME = "LeapMotion"; var LEAP_MOTION_NAME = "LeapMotion";
var handTouchEnabled = true; // Hand touch is disabled due to twitchy finger bug when walking near walls or tables. see BUGZ-154.
var handTouchEnabled = false;
var leapMotionEnabled = Controller.getRunningInputDeviceNames().indexOf(LEAP_MOTION_NAME) >= 0; var leapMotionEnabled = Controller.getRunningInputDeviceNames().indexOf(LEAP_MOTION_NAME) >= 0;
var MSECONDS_AFTER_LOAD = 2000; var MSECONDS_AFTER_LOAD = 2000;
var updateFingerWithIndex = 0; var updateFingerWithIndex = 0;

View file

@ -15,7 +15,7 @@ import QtQuick.Dialogs 1.2 as OriginalDialogs
import stylesUit 1.0 import stylesUit 1.0
import controlsUit 1.0 import controlsUit 1.0
import dialogs 1.0 import hifi.dialogs 1.0
Rectangle { Rectangle {
id: newMaterialDialog id: newMaterialDialog

View file

@ -14,7 +14,7 @@ import QtQuick.Dialogs 1.2 as OriginalDialogs
import stylesUit 1.0 import stylesUit 1.0
import controlsUit 1.0 import controlsUit 1.0
import dialogs 1.0 import hifi.dialogs 1.0
Rectangle { Rectangle {
id: newModelDialog id: newModelDialog