Clening up the gpu::Timer behavior, now need a way to show it

This commit is contained in:
samcake 2016-01-18 09:53:41 -08:00
parent 86e9c5ac9b
commit bc579f2605
5 changed files with 37 additions and 30 deletions

View file

@ -98,9 +98,12 @@ void GLBackend::do_getQuery(Batch& batch, size_t paramOffset) {
glGetQueryObjectui64vEXT(glquery->_qo, GL_QUERY_RESULT, &glquery->_result);
#endif
#else
glGetQueryObjectui64v(glquery->_qo, GL_QUERY_RESULT, &glquery->_result);
glGetQueryObjectui64v(glquery->_qo, GL_QUERY_RESULT_AVAILABLE, &glquery->_result);
if (glquery->_result == GL_TRUE) {
glGetQueryObjectui64v(glquery->_qo, GL_QUERY_RESULT, &glquery->_result);
query->triggerReturnHandler(glquery->_result);
}
#endif
query->triggerReturnHandler(glquery->_result);
(void)CHECK_GL_ERROR();
}
}

View file

@ -37,32 +37,31 @@ void Query::triggerReturnHandler(uint64_t queryResult) {
Timer::Timer() {
_timerQueries.resize(6, std::make_shared<gpu::Query>([&] (const Query& query) {
auto elapsedTime = query.getElapsedTime();
_movingAverage.addSample(elapsedTime);
static int frameNum = 0;
frameNum++;
frameNum %= 10;
if (frameNum == 0) {
auto value = _movingAverage.average;
qCDebug(gpulogging) << "AO on gpu = " << value;
}
}));
for (int i = 0; i < QUERY_QUEUE_SIZE; i++) {
_timerQueries.push_back(std::make_shared<gpu::Query>([&, i] (const Query& query) {
_tailIndex ++;
auto elapsedTime = query.getElapsedTime();
_movingAverage.addSample(elapsedTime);
}));
}
}
void Timer::begin(gpu::Batch& batch) {
batch.beginQuery(_timerQueries[_currentTimerQueryIndex]);
_headIndex++;
batch.beginQuery(_timerQueries[rangeIndex(_headIndex)]);
}
void Timer::end(gpu::Batch& batch) {
batch.endQuery(_timerQueries[_currentTimerQueryIndex]);
_currentTimerQueryIndex = (_currentTimerQueryIndex + 1) % _timerQueries.size();
auto returnQuery = _timerQueries[_currentTimerQueryIndex];
batch.getQuery(returnQuery);
if (_headIndex < 0) {
return;
}
batch.endQuery(_timerQueries[rangeIndex(_headIndex)]);
if (_tailIndex < 0) {
_tailIndex = _headIndex;
}
// Pull the previous tail query hopping to see it return
if (_tailIndex != _headIndex) {
batch.getQuery(_timerQueries[rangeIndex(_tailIndex)]);
}
}
void Timer::onQueryReturned(const Query& query) {
}

View file

@ -56,12 +56,15 @@ namespace gpu {
double getAverage() const;
protected:
void onQueryReturned(const Query& query);
static const int QUERY_QUEUE_SIZE = 4;
gpu::Queries _timerQueries;
int _currentTimerQueryIndex = 0;
MovingAverage<double, 5> _movingAverage;
int _headIndex = -1;
int _tailIndex = -1;
MovingAverage<double, QUERY_QUEUE_SIZE * 2> _movingAverage;
int rangeIndex(int index) const { return (index % QUERY_QUEUE_SIZE); }
};
};

View file

@ -56,6 +56,8 @@ public:
float getBlurDeviation() const { return _parametersBuffer.get<Parameters>()._blurInfo.z; }
double getTimerAverage() const { return _gpuTimer.getAverage(); }
using JobModel = render::Task::Job::Model<AmbientOcclusionEffect>;
private:

View file

@ -50,7 +50,7 @@ public:
void setGlobalAtmosphere(const model::AtmospherePointer& atmosphere) { _atmosphere = atmosphere; }
void setGlobalSkybox(const model::SkyboxPointer& skybox);
private:
DeferredLightingEffect() = default;