Merge branch 'master' of https://github.com/highfidelity/hifi into hdr

This commit is contained in:
samcake 2016-11-07 17:31:06 -08:00
commit cab699464e
29 changed files with 288 additions and 95 deletions

View file

@ -175,9 +175,6 @@ AssignmentClient::~AssignmentClient() {
void AssignmentClient::aboutToQuit() { void AssignmentClient::aboutToQuit() {
stopAssignmentClient(); stopAssignmentClient();
// clear the log handler so that Qt doesn't call the destructor on LogHandler
qInstallMessageHandler(0);
} }
void AssignmentClient::setUpStatusToMonitor() { void AssignmentClient::setUpStatusToMonitor() {

View file

@ -45,9 +45,6 @@ AssignmentClientApp::AssignmentClientApp(int argc, char* argv[]) :
setApplicationName("assignment-client"); setApplicationName("assignment-client");
setApplicationVersion(BuildInfo::VERSION); setApplicationVersion(BuildInfo::VERSION);
// use the verbose message handler in Logging
qInstallMessageHandler(LogHandler::verboseMessageHandler);
// parse command-line // parse command-line
QCommandLineParser parser; QCommandLineParser parser;
parser.setApplicationDescription("High Fidelity Assignment Client"); parser.setApplicationDescription("High Fidelity Assignment Client");

View file

@ -126,9 +126,6 @@ void AssignmentClientMonitor::stopChildProcesses() {
void AssignmentClientMonitor::aboutToQuit() { void AssignmentClientMonitor::aboutToQuit() {
stopChildProcesses(); stopChildProcesses();
// clear the log handler so that Qt doesn't call the destructor on LogHandler
qInstallMessageHandler(0);
} }
void AssignmentClientMonitor::spawnChildClient() { void AssignmentClientMonitor::spawnChildClient() {

View file

@ -9,8 +9,7 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// //
#include <QtCore/QDebug> #include <LogHandler.h>
#include <SharedUtil.h> #include <SharedUtil.h>
#include "AssignmentClientApp.h" #include "AssignmentClientApp.h"
@ -18,10 +17,14 @@
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
disableQtBearerPoll(); // Fixes wifi ping spikes disableQtBearerPoll(); // Fixes wifi ping spikes
qInstallMessageHandler(LogHandler::verboseMessageHandler);
qInfo() << "Starting.";
AssignmentClientApp app(argc, argv); AssignmentClientApp app(argc, argv);
int acReturn = app.exec(); int acReturn = app.exec();
qDebug() << "assignment-client process" << app.applicationPid() << "exiting with status code" << acReturn; qDebug() << "assignment-client process" << app.applicationPid() << "exiting with status code" << acReturn;
qInfo() << "Quitting.";
return acReturn; return acReturn;
} }

View file

@ -72,13 +72,10 @@ DomainServer::DomainServer(int argc, char* argv[]) :
_iceServerPort(ICE_SERVER_DEFAULT_PORT) _iceServerPort(ICE_SERVER_DEFAULT_PORT)
{ {
parseCommandLine(); parseCommandLine();
qInstallMessageHandler(LogHandler::verboseMessageHandler);
LogUtils::init(); LogUtils::init();
Setting::init(); Setting::init();
connect(this, &QCoreApplication::aboutToQuit, this, &DomainServer::aboutToQuit);
setOrganizationName(BuildInfo::MODIFIED_ORGANIZATION); setOrganizationName(BuildInfo::MODIFIED_ORGANIZATION);
setOrganizationDomain("highfidelity.io"); setOrganizationDomain("highfidelity.io");
setApplicationName("domain-server"); setApplicationName("domain-server");
@ -211,6 +208,7 @@ void DomainServer::parseCommandLine() {
} }
DomainServer::~DomainServer() { DomainServer::~DomainServer() {
qInfo() << "Domain Server is shutting down.";
// destroy the LimitedNodeList before the DomainServer QCoreApplication is down // destroy the LimitedNodeList before the DomainServer QCoreApplication is down
DependencyManager::destroy<LimitedNodeList>(); DependencyManager::destroy<LimitedNodeList>();
} }
@ -223,12 +221,6 @@ void DomainServer::queuedQuit(QString quitMessage, int exitCode) {
QCoreApplication::exit(exitCode); QCoreApplication::exit(exitCode);
} }
void DomainServer::aboutToQuit() {
// clear the log handler so that Qt doesn't call the destructor on LogHandler
qInstallMessageHandler(0);
}
void DomainServer::restart() { void DomainServer::restart() {
qDebug() << "domain-server is restarting."; qDebug() << "domain-server is restarting.";

View file

@ -72,8 +72,6 @@ public slots:
void processICEServerHeartbeatACK(QSharedPointer<ReceivedMessage> message); void processICEServerHeartbeatACK(QSharedPointer<ReceivedMessage> message);
private slots: private slots:
void aboutToQuit();
void setupPendingAssignmentCredits(); void setupPendingAssignmentCredits();
void sendPendingTransactionsToServer(); void sendPendingTransactionsToServer();
@ -150,13 +148,9 @@ private:
bool isAuthenticatedRequest(HTTPConnection* connection, const QUrl& url); bool isAuthenticatedRequest(HTTPConnection* connection, const QUrl& url);
void handleTokenRequestFinished();
QNetworkReply* profileRequestGivenTokenReply(QNetworkReply* tokenReply); QNetworkReply* profileRequestGivenTokenReply(QNetworkReply* tokenReply);
void handleProfileRequestFinished();
Headers setupCookieHeadersFromProfileReply(QNetworkReply* profileReply); Headers setupCookieHeadersFromProfileReply(QNetworkReply* profileReply);
void loadExistingSessionsFromSettings();
QJsonObject jsonForSocket(const HifiSockAddr& socket); QJsonObject jsonForSocket(const HifiSockAddr& socket);
QJsonObject jsonObjectForNode(const SharedNodePointer& node); QJsonObject jsonObjectForNode(const SharedNodePointer& node);

View file

@ -15,8 +15,6 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// //
#include <QtCore/QCoreApplication>
#include <LogHandler.h> #include <LogHandler.h>
#include <SharedUtil.h> #include <SharedUtil.h>
@ -29,6 +27,9 @@ int main(int argc, char* argv[]) {
setvbuf(stdout, NULL, _IOLBF, 0); setvbuf(stdout, NULL, _IOLBF, 0);
#endif #endif
qInstallMessageHandler(LogHandler::verboseMessageHandler);
qInfo() << "Starting.";
int currentExitCode = 0; int currentExitCode = 0;
// use a do-while to handle domain-server restart // use a do-while to handle domain-server restart
@ -37,7 +38,7 @@ int main(int argc, char* argv[]) {
currentExitCode = domainServer.exec(); currentExitCode = domainServer.exec();
} while (currentExitCode == DomainServer::EXIT_CODE_REBOOT); } while (currentExitCode == DomainServer::EXIT_CODE_REBOOT);
qInfo() << "Quitting.";
return currentExitCode; return currentExitCode;
} }

View file

@ -19,8 +19,9 @@ int main(int argc, char* argv[]) {
#ifndef WIN32 #ifndef WIN32
setvbuf(stdout, NULL, _IOLBF, 0); setvbuf(stdout, NULL, _IOLBF, 0);
#endif #endif
qInstallMessageHandler(LogHandler::verboseMessageHandler); qInstallMessageHandler(LogHandler::verboseMessageHandler);
qInfo() << "Starting.";
IceServer iceServer(argc, argv); IceServer iceServer(argc, argv);
return iceServer.exec(); return iceServer.exec();

View file

@ -189,6 +189,15 @@ Item {
Column { Column {
id: octreeCol id: octreeCol
spacing: 4; x: 4; y: 4; spacing: 4; x: 4; y: 4;
StatText {
text: " Frame timing:"
}
StatText {
text: " Batch: " + root.batchFrameTime.toFixed(1) + " ms"
}
StatText {
text: " GPU: " + root.gpuFrameTime.toFixed(1) + " ms"
}
StatText { StatText {
text: "Triangles: " + root.triangles + text: "Triangles: " + root.triangles +
" / Material Switches: " + root.materialSwitches " / Material Switches: " + root.materialSwitches

View file

@ -1238,7 +1238,10 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
auto glInfo = getGLContextData(); auto glInfo = getGLContextData();
properties["gl_info"] = glInfo; properties["gl_info"] = glInfo;
properties["gpu_used_memory"] = (int)BYTES_TO_MB(gpu::Context::getUsedGPUMemory());
properties["gpu_free_memory"] = (int)BYTES_TO_MB(gpu::Context::getFreeGPUMemory()); properties["gpu_free_memory"] = (int)BYTES_TO_MB(gpu::Context::getFreeGPUMemory());
properties["gpu_frame_time"] = (float)(qApp->getGPUContext()->getFrameTimerGPUAverage());
properties["batch_frame_time"] = (float)(qApp->getGPUContext()->getFrameTimerBatchAverage());
properties["ideal_thread_count"] = QThread::idealThreadCount(); properties["ideal_thread_count"] = QThread::idealThreadCount();
auto hmdHeadPose = getHMDSensorPose(); auto hmdHeadPose = getHMDSensorPose();
@ -1654,7 +1657,8 @@ Application::~Application() {
_window->deleteLater(); _window->deleteLater();
qInstallMessageHandler(nullptr); // NOTE: Do this as late as possible so we continue to get our log messages // Can't log to file passed this point, FileLogger about to be deleted
qInstallMessageHandler(LogHandler::verboseMessageHandler);
} }
void Application::initializeGL() { void Application::initializeGL() {
@ -3378,13 +3382,31 @@ void Application::loadSettings() {
// If there is a preferred plugin, we probably messed it up with the menu settings, so fix it. // If there is a preferred plugin, we probably messed it up with the menu settings, so fix it.
auto pluginManager = PluginManager::getInstance(); auto pluginManager = PluginManager::getInstance();
auto plugins = pluginManager->getPreferredDisplayPlugins(); auto plugins = pluginManager->getPreferredDisplayPlugins();
for (auto plugin : plugins) { auto menu = Menu::getInstance();
auto menu = Menu::getInstance(); if (plugins.size() > 0) {
if (auto action = menu->getActionForOption(plugin->getName())) { for (auto plugin : plugins) {
action->setChecked(true); if (auto action = menu->getActionForOption(plugin->getName())) {
action->trigger(); action->setChecked(true);
// Find and activated highest priority plugin, bail for the rest action->trigger();
break; // Find and activated highest priority plugin, bail for the rest
break;
}
}
} else {
// If this is our first run, and no preferred devices were set, default to
// an HMD device if available.
Setting::Handle<bool> firstRun { Settings::firstRun, true };
if (firstRun.get()) {
auto displayPlugins = pluginManager->getDisplayPlugins();
for (auto& plugin : displayPlugins) {
if (plugin->isHmd()) {
if (auto action = menu->getActionForOption(plugin->getName())) {
action->setChecked(true);
action->trigger();
break;
}
}
}
} }
} }

View file

@ -290,6 +290,12 @@ void Stats::updateStats(bool force) {
STAT_UPDATE(sendingMode, sendingModeResult); STAT_UPDATE(sendingMode, sendingModeResult);
} }
auto gpuContext = qApp->getGPUContext();
// Update Frame timing (in ms)
STAT_UPDATE(gpuFrameTime, (float)gpuContext->getFrameTimerGPUAverage());
STAT_UPDATE(batchFrameTime, (float)gpuContext->getFrameTimerBatchAverage());
STAT_UPDATE(gpuBuffers, (int)gpu::Context::getBufferGPUCount()); STAT_UPDATE(gpuBuffers, (int)gpu::Context::getBufferGPUCount());
STAT_UPDATE(gpuBufferMemory, (int)BYTES_TO_MB(gpu::Context::getBufferGPUMemoryUsage())); STAT_UPDATE(gpuBufferMemory, (int)BYTES_TO_MB(gpu::Context::getBufferGPUMemoryUsage()));
STAT_UPDATE(gpuTextures, (int)gpu::Context::getTextureGPUCount()); STAT_UPDATE(gpuTextures, (int)gpu::Context::getTextureGPUCount());
@ -302,7 +308,7 @@ void Stats::updateStats(bool force) {
STAT_UPDATE(gpuTextureVirtualMemory, (int)BYTES_TO_MB(gpu::Texture::getTextureGPUVirtualMemoryUsage())); STAT_UPDATE(gpuTextureVirtualMemory, (int)BYTES_TO_MB(gpu::Texture::getTextureGPUVirtualMemoryUsage()));
STAT_UPDATE(gpuTextureFramebufferMemory, (int)BYTES_TO_MB(gpu::Texture::getTextureGPUFramebufferMemoryUsage())); STAT_UPDATE(gpuTextureFramebufferMemory, (int)BYTES_TO_MB(gpu::Texture::getTextureGPUFramebufferMemoryUsage()));
STAT_UPDATE(gpuTextureSparseMemory, (int)BYTES_TO_MB(gpu::Texture::getTextureGPUSparseMemoryUsage())); STAT_UPDATE(gpuTextureSparseMemory, (int)BYTES_TO_MB(gpu::Texture::getTextureGPUSparseMemoryUsage()));
STAT_UPDATE(gpuSparseTextureEnabled, qApp->getGPUContext()->getBackend()->isTextureManagementSparseEnabled() ? 1 : 0); STAT_UPDATE(gpuSparseTextureEnabled, gpuContext->getBackend()->isTextureManagementSparseEnabled() ? 1 : 0);
STAT_UPDATE(gpuFreeMemory, (int)BYTES_TO_MB(gpu::Context::getFreeGPUMemory())); STAT_UPDATE(gpuFreeMemory, (int)BYTES_TO_MB(gpu::Context::getFreeGPUMemory()));
STAT_UPDATE(rectifiedTextureCount, (int)RECTIFIED_TEXTURE_COUNT.load()); STAT_UPDATE(rectifiedTextureCount, (int)RECTIFIED_TEXTURE_COUNT.load());
STAT_UPDATE(decimatedTextureCount, (int)DECIMATED_TEXTURE_COUNT.load()); STAT_UPDATE(decimatedTextureCount, (int)DECIMATED_TEXTURE_COUNT.load());

View file

@ -101,6 +101,8 @@ class Stats : public QQuickItem {
STATS_PROPERTY(int, gpuTextureSparseMemory, 0) STATS_PROPERTY(int, gpuTextureSparseMemory, 0)
STATS_PROPERTY(int, gpuSparseTextureEnabled, 0) STATS_PROPERTY(int, gpuSparseTextureEnabled, 0)
STATS_PROPERTY(int, gpuFreeMemory, 0) STATS_PROPERTY(int, gpuFreeMemory, 0)
STATS_PROPERTY(float, gpuFrameTime, 0)
STATS_PROPERTY(float, batchFrameTime, 0)
public: public:
static Stats* getInstance(); static Stats* getInstance();
@ -198,6 +200,8 @@ signals:
void gpuTextureSparseMemoryChanged(); void gpuTextureSparseMemoryChanged();
void gpuSparseTextureEnabledChanged(); void gpuSparseTextureEnabledChanged();
void gpuFreeMemoryChanged(); void gpuFreeMemoryChanged();
void gpuFrameTimeChanged();
void batchFrameTimeChanged();
void rectifiedTextureCountChanged(); void rectifiedTextureCountChanged();
void decimatedTextureCountChanged(); void decimatedTextureCountChanged();

View file

@ -228,9 +228,7 @@ void AnimSkeleton::buildSkeletonFromJoints(const std::vector<FBXJoint>& joints)
} }
} }
#ifndef NDEBUG void AnimSkeleton::dump(bool verbose) const {
#define DUMP_FBX_JOINTS
void AnimSkeleton::dump() const {
qCDebug(animation) << "["; qCDebug(animation) << "[";
for (int i = 0; i < getNumJoints(); i++) { for (int i = 0; i < getNumJoints(); i++) {
qCDebug(animation) << " {"; qCDebug(animation) << " {";
@ -240,24 +238,24 @@ void AnimSkeleton::dump() const {
qCDebug(animation) << " relBindPose =" << getRelativeBindPose(i); qCDebug(animation) << " relBindPose =" << getRelativeBindPose(i);
qCDebug(animation) << " absDefaultPose =" << getAbsoluteDefaultPose(i); qCDebug(animation) << " absDefaultPose =" << getAbsoluteDefaultPose(i);
qCDebug(animation) << " relDefaultPose =" << getRelativeDefaultPose(i); qCDebug(animation) << " relDefaultPose =" << getRelativeDefaultPose(i);
#ifdef DUMP_FBX_JOINTS if (verbose) {
qCDebug(animation) << " fbxJoint ="; qCDebug(animation) << " fbxJoint =";
qCDebug(animation) << " isFree =" << _joints[i].isFree; qCDebug(animation) << " isFree =" << _joints[i].isFree;
qCDebug(animation) << " freeLineage =" << _joints[i].freeLineage; qCDebug(animation) << " freeLineage =" << _joints[i].freeLineage;
qCDebug(animation) << " parentIndex =" << _joints[i].parentIndex; qCDebug(animation) << " parentIndex =" << _joints[i].parentIndex;
qCDebug(animation) << " translation =" << _joints[i].translation; qCDebug(animation) << " translation =" << _joints[i].translation;
qCDebug(animation) << " preTransform =" << _joints[i].preTransform; qCDebug(animation) << " preTransform =" << _joints[i].preTransform;
qCDebug(animation) << " preRotation =" << _joints[i].preRotation; qCDebug(animation) << " preRotation =" << _joints[i].preRotation;
qCDebug(animation) << " rotation =" << _joints[i].rotation; qCDebug(animation) << " rotation =" << _joints[i].rotation;
qCDebug(animation) << " postRotation =" << _joints[i].postRotation; qCDebug(animation) << " postRotation =" << _joints[i].postRotation;
qCDebug(animation) << " postTransform =" << _joints[i].postTransform; qCDebug(animation) << " postTransform =" << _joints[i].postTransform;
qCDebug(animation) << " transform =" << _joints[i].transform; qCDebug(animation) << " transform =" << _joints[i].transform;
qCDebug(animation) << " rotationMin =" << _joints[i].rotationMin << ", rotationMax =" << _joints[i].rotationMax; qCDebug(animation) << " rotationMin =" << _joints[i].rotationMin << ", rotationMax =" << _joints[i].rotationMax;
qCDebug(animation) << " inverseDefaultRotation" << _joints[i].inverseDefaultRotation; qCDebug(animation) << " inverseDefaultRotation" << _joints[i].inverseDefaultRotation;
qCDebug(animation) << " inverseBindRotation" << _joints[i].inverseBindRotation; qCDebug(animation) << " inverseBindRotation" << _joints[i].inverseBindRotation;
qCDebug(animation) << " bindTransform" << _joints[i].bindTransform; qCDebug(animation) << " bindTransform" << _joints[i].bindTransform;
qCDebug(animation) << " isSkeletonJoint" << _joints[i].isSkeletonJoint; qCDebug(animation) << " isSkeletonJoint" << _joints[i].isSkeletonJoint;
#endif }
if (getParentIndex(i) >= 0) { if (getParentIndex(i) >= 0) {
qCDebug(animation) << " parent =" << getJointName(getParentIndex(i)); qCDebug(animation) << " parent =" << getJointName(getParentIndex(i));
} }
@ -284,4 +282,4 @@ void AnimSkeleton::dump(const AnimPoseVec& poses) const {
} }
qCDebug(animation) << "]"; qCDebug(animation) << "]";
} }
#endif

View file

@ -63,10 +63,8 @@ public:
void mirrorRelativePoses(AnimPoseVec& poses) const; void mirrorRelativePoses(AnimPoseVec& poses) const;
void mirrorAbsolutePoses(AnimPoseVec& poses) const; void mirrorAbsolutePoses(AnimPoseVec& poses) const;
#ifndef NDEBUG void dump(bool verbose) const;
void dump() const;
void dump(const AnimPoseVec& poses) const; void dump(const AnimPoseVec& poses) const;
#endif
protected: protected:
void buildSkeletonFromJoints(const std::vector<FBXJoint>& joints); void buildSkeletonFromJoints(const std::vector<FBXJoint>& joints);

View file

@ -34,6 +34,10 @@ void Context::beginFrame(const glm::mat4& renderPose) {
_frameActive = true; _frameActive = true;
_currentFrame = std::make_shared<Frame>(); _currentFrame = std::make_shared<Frame>();
_currentFrame->pose = renderPose; _currentFrame->pose = renderPose;
if (!_frameRangeTimer) {
_frameRangeTimer = std::make_shared<RangeTimer>();
}
} }
void Context::appendFrameBatch(Batch& batch) { void Context::appendFrameBatch(Batch& batch) {
@ -73,10 +77,18 @@ void Context::executeFrame(const FramePointer& frame) const {
consumeFrameUpdates(frame); consumeFrameUpdates(frame);
_backend->setStereoState(frame->stereoState); _backend->setStereoState(frame->stereoState);
{ {
Batch beginBatch;
_frameRangeTimer->begin(beginBatch);
_backend->render(beginBatch);
// Execute the frame rendering commands // Execute the frame rendering commands
for (auto& batch : frame->batches) { for (auto& batch : frame->batches) {
_backend->render(batch); _backend->render(batch);
} }
Batch endBatch;
_frameRangeTimer->end(endBatch);
_backend->render(endBatch);
} }
} }
@ -127,6 +139,20 @@ void Context::getStats(ContextStats& stats) const {
_backend->getStats(stats); _backend->getStats(stats);
} }
double Context::getFrameTimerGPUAverage() const {
if (_frameRangeTimer) {
return _frameRangeTimer->getGPUAverage();
}
return 0.0;
}
double Context::getFrameTimerBatchAverage() const {
if (_frameRangeTimer) {
return _frameRangeTimer->getBatchAverage();
}
return 0.0;
}
const Backend::TransformCamera& Backend::TransformCamera::recomputeDerived(const Transform& xformView) const { const Backend::TransformCamera& Backend::TransformCamera::recomputeDerived(const Transform& xformView) const {
_projectionInverse = glm::inverse(_projection); _projectionInverse = glm::inverse(_projection);
@ -183,6 +209,10 @@ Size Context::getFreeGPUMemory() {
return _freeGPUMemory.load(); return _freeGPUMemory.load();
} }
Size Context::getUsedGPUMemory() {
return getTextureGPUMemoryUsage() + getBufferGPUMemoryUsage();
};
void Context::incrementBufferGPUCount() { void Context::incrementBufferGPUCount() {
static std::atomic<uint32_t> max { 0 }; static std::atomic<uint32_t> max { 0 };
auto total = ++_bufferGPUCount; auto total = ++_bufferGPUCount;
@ -349,3 +379,5 @@ void Backend::updateTextureGPUFramebufferMemoryUsage(Resource::Size prevObjectSi
void Backend::updateTextureGPUSparseMemoryUsage(Resource::Size prevObjectSize, Resource::Size newObjectSize) { Context::updateTextureGPUSparseMemoryUsage(prevObjectSize, newObjectSize); } void Backend::updateTextureGPUSparseMemoryUsage(Resource::Size prevObjectSize, Resource::Size newObjectSize) { Context::updateTextureGPUSparseMemoryUsage(prevObjectSize, newObjectSize); }
void Backend::incrementTextureGPUTransferCount() { Context::incrementTextureGPUTransferCount(); } void Backend::incrementTextureGPUTransferCount() { Context::incrementTextureGPUTransferCount(); }
void Backend::decrementTextureGPUTransferCount() { Context::decrementTextureGPUTransferCount(); } void Backend::decrementTextureGPUTransferCount() { Context::decrementTextureGPUTransferCount(); }

View file

@ -205,12 +205,16 @@ public:
void getStats(ContextStats& stats) const; void getStats(ContextStats& stats) const;
double getFrameTimerGPUAverage() const;
double getFrameTimerBatchAverage() const;
static uint32_t getBufferGPUCount(); static uint32_t getBufferGPUCount();
static Size getBufferGPUMemoryUsage(); static Size getBufferGPUMemoryUsage();
static uint32_t getTextureGPUCount(); static uint32_t getTextureGPUCount();
static uint32_t getTextureGPUSparseCount(); static uint32_t getTextureGPUSparseCount();
static Size getFreeGPUMemory(); static Size getFreeGPUMemory();
static Size getUsedGPUMemory();
static Size getTextureGPUMemoryUsage(); static Size getTextureGPUMemoryUsage();
static Size getTextureGPUVirtualMemoryUsage(); static Size getTextureGPUVirtualMemoryUsage();
static Size getTextureGPUFramebufferMemoryUsage(); static Size getTextureGPUFramebufferMemoryUsage();
@ -223,8 +227,12 @@ protected:
std::shared_ptr<Backend> _backend; std::shared_ptr<Backend> _backend;
bool _frameActive { false }; bool _frameActive { false };
FramePointer _currentFrame; FramePointer _currentFrame;
RangeTimerPointer _frameRangeTimer;
StereoState _stereo; StereoState _stereo;
double getGPUAverage() const;
double getBatchAverage() const;
// This function can only be called by "static Shader::makeProgram()" // This function can only be called by "static Shader::makeProgram()"
// makeProgramShader(...) make a program shader ready to be used in a Batch. // makeProgramShader(...) make a program shader ready to be used in a Batch.
// It compiles the sub shaders, link them and defines the Slots and their bindings. // It compiles the sub shaders, link them and defines the Slots and their bindings.

View file

@ -10,17 +10,18 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// //
#include <qcoreapplication.h>
#include <QDateTime>
#include <QDebug>
#include <QTimer>
#include <QThread>
#include <QMutexLocker>
#include <QRegExp>
#include "LogHandler.h" #include "LogHandler.h"
#include <mutex>
#include <QtCore/QCoreApplication>
#include <QtCore/QDateTime>
#include <QtCore/QDebug>
#include <QtCore/QMutexLocker>
#include <QtCore/QRegExp>
#include <QtCore/QThread>
#include <QtCore/QTimer>
QMutex LogHandler::_mutex; QMutex LogHandler::_mutex;
LogHandler& LogHandler::getInstance() { LogHandler& LogHandler::getInstance() {
@ -28,16 +29,15 @@ LogHandler& LogHandler::getInstance() {
return staticInstance; return staticInstance;
} }
LogHandler::LogHandler() LogHandler::LogHandler() {
{
// setup our timer to flush the verbose logs every 5 seconds
QTimer* logFlushTimer = new QTimer(this);
connect(logFlushTimer, &QTimer::timeout, this, &LogHandler::flushRepeatedMessages);
logFlushTimer->start(VERBOSE_LOG_INTERVAL_SECONDS * 1000);
// when the log handler is first setup we should print our timezone // when the log handler is first setup we should print our timezone
QString timezoneString = "Time zone: " + QDateTime::currentDateTime().toString("t"); QString timezoneString = "Time zone: " + QDateTime::currentDateTime().toString("t");
printf("%s\n", qPrintable(timezoneString)); printMessage(LogMsgType::LogInfo, QMessageLogContext(), timezoneString);
}
LogHandler::~LogHandler() {
flushRepeatedMessages();
printMessage(LogMsgType::LogDebug, QMessageLogContext(), "LogHandler shutdown.");
} }
const char* stringForLogType(LogMsgType msgType) { const char* stringForLogType(LogMsgType msgType) {
@ -165,7 +165,7 @@ QString LogHandler::printMessage(LogMsgType type, const QMessageLogContext& cont
stringForLogType(type), context.category); stringForLogType(type), context.category);
if (_shouldOutputProcessID) { if (_shouldOutputProcessID) {
prefixString.append(QString(" [%1]").arg(QCoreApplication::instance()->applicationPid())); prefixString.append(QString(" [%1]").arg(QCoreApplication::applicationPid()));
} }
if (_shouldOutputThreadID) { if (_shouldOutputThreadID) {
@ -187,6 +187,14 @@ void LogHandler::verboseMessageHandler(QtMsgType type, const QMessageLogContext&
} }
const QString& LogHandler::addRepeatedMessageRegex(const QString& regexString) { const QString& LogHandler::addRepeatedMessageRegex(const QString& regexString) {
static std::once_flag once;
std::call_once(once, [&] {
// setup our timer to flush the verbose logs every 5 seconds
QTimer* logFlushTimer = new QTimer(this);
connect(logFlushTimer, &QTimer::timeout, this, &LogHandler::flushRepeatedMessages);
logFlushTimer->start(VERBOSE_LOG_INTERVAL_SECONDS * 1000);
});
QMutexLocker lock(&_mutex); QMutexLocker lock(&_mutex);
return *_repeatedMessageRegexes.insert(regexString); return *_repeatedMessageRegexes.insert(regexString);
} }

View file

@ -52,8 +52,10 @@ public:
const QString& addRepeatedMessageRegex(const QString& regexString); const QString& addRepeatedMessageRegex(const QString& regexString);
const QString& addOnlyOnceMessageRegex(const QString& regexString); const QString& addOnlyOnceMessageRegex(const QString& regexString);
private: private:
LogHandler(); LogHandler();
~LogHandler();
void flushRepeatedMessages(); void flushRepeatedMessages();

View file

@ -9,8 +9,6 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// //
#include <QCoreApplication>
#include "ShutdownEventListener.h" #include "ShutdownEventListener.h"
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
@ -19,6 +17,9 @@
#include <csignal> #include <csignal>
#endif #endif
#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>
ShutdownEventListener& ShutdownEventListener::getInstance() { ShutdownEventListener& ShutdownEventListener::getInstance() {
static ShutdownEventListener staticInstance; static ShutdownEventListener staticInstance;
return staticInstance; return staticInstance;
@ -29,9 +30,7 @@ void signalHandler(int param) {
QMetaObject::invokeMethod(qApp, "quit"); QMetaObject::invokeMethod(qApp, "quit");
} }
ShutdownEventListener::ShutdownEventListener(QObject* parent) : ShutdownEventListener::ShutdownEventListener(QObject* parent) : QObject(parent) {
QObject(parent)
{
#ifndef Q_OS_WIN #ifndef Q_OS_WIN
// be a signal handler for SIGTERM so we can stop our children when we get it // be a signal handler for SIGTERM so we can stop our children when we get it
signal(SIGTERM, signalHandler); signal(SIGTERM, signalHandler);

View file

@ -109,7 +109,8 @@ bool FilePersistThread::processQueueItems(const Queue& messages) {
} }
FileLogger::FileLogger(QObject* parent) : FileLogger::FileLogger(QObject* parent) :
AbstractLoggerInterface(parent), _fileName(getLogFilename()) AbstractLoggerInterface(parent),
_fileName(getLogFilename())
{ {
_persistThreadInstance = new FilePersistThread(*this); _persistThreadInstance = new FilePersistThread(*this);
_persistThreadInstance->initialize(true, QThread::LowestPriority); _persistThreadInstance->initialize(true, QThread::LowestPriority);

View file

@ -24,7 +24,7 @@ public:
FileLogger(QObject* parent = NULL); FileLogger(QObject* parent = NULL);
virtual ~FileLogger(); virtual ~FileLogger();
QString getFilename() { return _fileName; } QString getFilename() const { return _fileName; }
virtual void addMessage(const QString&) override; virtual void addMessage(const QString&) override;
virtual QString getLogData() override; virtual QString getLogData() override;
virtual void locateLog() override; virtual void locateLog() override;

View file

@ -445,13 +445,11 @@ function hideUserDataTextArea() {
}; };
function showStaticUserData() { function showStaticUserData() {
$('#static-userdata').show();
$('#static-userdata').css('height', $('#userdata-editor').height())
if (editor !== null) { if (editor !== null) {
$('#static-userdata').show();
$('#static-userdata').css('height', $('#userdata-editor').height())
$('#static-userdata').text(editor.getText()); $('#static-userdata').text(editor.getText());
} }
}; };
function removeStaticUserData() { function removeStaticUserData() {

View file

@ -623,6 +623,7 @@ function checkNewContent() {
} else { } else {
// They don't want to update, mark content set as current // They don't want to update, mark content set as current
userConfig.set('homeContentLastModified', new Date()); userConfig.set('homeContentLastModified', new Date());
userConfig.save(configPath);
} }
}); });
} }
@ -676,6 +677,7 @@ function maybeInstallDefaultContentSet(onComplete) {
} }
log.debug('Copied home content over to: ' + getRootHifiDataDirectory()); log.debug('Copied home content over to: ' + getRootHifiDataDirectory());
userConfig.set('homeContentLastModified', new Date()); userConfig.set('homeContentLastModified', new Date());
userConfig.save(configPath);
onComplete(); onComplete();
}); });
return; return;
@ -756,6 +758,7 @@ function maybeInstallDefaultContentSet(onComplete) {
// response and decompression complete, return // response and decompression complete, return
log.debug("Finished unarchiving home content set"); log.debug("Finished unarchiving home content set");
userConfig.set('homeContentLastModified', new Date()); userConfig.set('homeContentLastModified', new Date());
userConfig.save(configPath);
sendStateUpdate('complete'); sendStateUpdate('complete');
}); });
@ -766,6 +769,7 @@ function maybeInstallDefaultContentSet(onComplete) {
}); });
userConfig.set('hasRun', true); userConfig.set('hasRun', true);
userConfig.save(configPath);
}); });
} }

View file

@ -13,3 +13,7 @@ set_target_properties(ice-client PROPERTIES FOLDER "Tools")
add_subdirectory(ac-client) add_subdirectory(ac-client)
set_target_properties(ac-client PROPERTIES FOLDER "Tools") set_target_properties(ac-client PROPERTIES FOLDER "Tools")
add_subdirectory(skeleton-dump)
set_target_properties(skeleton-dump PROPERTIES FOLDER "Tools")

View file

@ -0,0 +1,4 @@
set(TARGET_NAME skeleton-dump)
setup_hifi_project(Core Widgets)
link_hifi_libraries(shared fbx model gpu gl animation)

View file

@ -0,0 +1,63 @@
//
// SkeletonDumpApp.cpp
// tools/skeleton-dump/src
//
// Created by Anthony Thibault on 11/4/16.
// Copyright 2016 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "SkeletonDumpApp.h"
#include <QCommandLineParser>
#include <QFile>
#include <FBXReader.h>
#include <AnimSkeleton.h>
SkeletonDumpApp::SkeletonDumpApp(int argc, char* argv[]) : QCoreApplication(argc, argv) {
// parse command-line
QCommandLineParser parser;
parser.setApplicationDescription("High Fidelity FBX Skeleton Analyzer");
const QCommandLineOption helpOption = parser.addHelpOption();
const QCommandLineOption verboseOutput("v", "verbose output");
parser.addOption(verboseOutput);
const QCommandLineOption inputFilenameOption("i", "input file", "filename.fbx");
parser.addOption(inputFilenameOption);
if (!parser.parse(QCoreApplication::arguments())) {
qCritical() << parser.errorText() << endl;
parser.showHelp();
_returnCode = 1;
return;
}
if (parser.isSet(helpOption)) {
parser.showHelp();
return;
}
bool verbose = parser.isSet(verboseOutput);
QString inputFilename;
if (parser.isSet(inputFilenameOption)) {
inputFilename = parser.value(inputFilenameOption);
}
QFile file(inputFilename);
if (!file.open(QIODevice::ReadOnly)) {
qCritical() << "Failed to open file " << inputFilename;
_returnCode = 2;
return;
}
QByteArray blob = file.readAll();
std::unique_ptr<FBXGeometry> fbxGeometry(readFBX(blob, QVariantHash()));
std::unique_ptr<AnimSkeleton> skeleton(new AnimSkeleton(*fbxGeometry));
skeleton->dump(verbose);
}
SkeletonDumpApp::~SkeletonDumpApp() {
}

View file

@ -0,0 +1,29 @@
//
// SkeletonDumpApp.h
// tools/skeleton-dump/src
//
// Created by Anthony Thibault on 11/4/16.
// Copyright 2016 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#ifndef hifi_SkeletonDumpApp_h
#define hifi_SkeletonDumpApp_h
#include <QApplication>
class SkeletonDumpApp : public QCoreApplication {
Q_OBJECT
public:
SkeletonDumpApp(int argc, char* argv[]);
~SkeletonDumpApp();
int getReturnCode() const { return _returnCode; }
private:
int _returnCode { 0 };
};
#endif //hifi_SkeletonDumpApp_h

View file

@ -0,0 +1,22 @@
//
// main.cpp
// tools/skeleton-dump/src
//
// Created by Anthony Thibault on 11/4/16.
// Copyright 2016 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <QDebug>
#include "SkeletonDumpApp.h"
int main(int argc, char * argv[]) {
SkeletonDumpApp app(argc, argv);
return app.getReturnCode();
}

View file

@ -233,7 +233,7 @@ function playSuccessSound() {
function playFirecrackerSound(position) { function playFirecrackerSound(position) {
Audio.playSound(firecrackerSound, { Audio.playSound(firecrackerSound, {
position: position, position: position,
volume: 0.7, volume: 0.5,
loop: false loop: false
}); });
} }