HifiExperimentsruntime gl api switchingebcc81c6 months agoHistory
136 lines · 5.2 KB · C++
RawDownload
////  GLBackendQuery.cpp//  libraries/gpu/src/gpu////  Created by Sam Gateau on 7/7/2015.//  Copyright 2015 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 "GLBackend.h"#include "GLQuery.h"#include "GLShared.h" using namespace gpu;using namespace gpu::gl; // Eventually, we want to test with TIME_ELAPSED instead of TIMESTAMP#ifdef Q_OS_MACconst uint32_t MAX_RANGE_QUERY_DEPTH = 1;static bool timeElapsed = true;#elseconst uint32_t MAX_RANGE_QUERY_DEPTH = 10000;static bool timeElapsed = false;#endif static bool hasTimerExtension() {    static std::once_flag once;    static bool result = false;    std::call_once(once, [&] {        result = glGetQueryObjectui64vEXT != nullptr;    });    return result;} void GLBackend::do_beginQuery(const Batch& batch, size_t paramOffset) {    auto query = batch._queries.get(batch._params[paramOffset]._uint);    GLQuery* glquery = syncGPUObject(*query);    if (glquery) {        PROFILE_RANGE_BEGIN(render_gpu_gl_detail, glquery->_profileRangeId, query->getName().c_str(), 0xFFFF7F00);         ++_queryStage._rangeQueryDepth;        glquery->_batchElapsedTimeBegin = std::chrono::high_resolution_clock::now();         auto backendApi = hifi::properties::getGraphicsAPI();        if (backendApi == hifi::properties::GraphicsAPI::GLES32) {            if (hasTimerExtension()) {                glQueryCounterEXT(glquery->_beginqo, GL_TIMESTAMP_EXT);            }        } else {            if (timeElapsed) {                if (_queryStage._rangeQueryDepth <= MAX_RANGE_QUERY_DEPTH) {                    glBeginQuery(GL_TIME_ELAPSED, glquery->_endqo);                }            } else {                glQueryCounter(glquery->_beginqo, GL_TIMESTAMP);            }        }         glquery->_rangeQueryDepth = _queryStage._rangeQueryDepth;        (void)CHECK_GL_ERROR();    }} void GLBackend::do_endQuery(const Batch& batch, size_t paramOffset) {    auto query = batch._queries.get(batch._params[paramOffset]._uint);    GLQuery* glquery = syncGPUObject(*query);    if (glquery) {        auto backendApi = hifi::properties::getGraphicsAPI();        if (backendApi == hifi::properties::GraphicsAPI::GLES32) {            if (hasTimerExtension()) {                glQueryCounterEXT(glquery->_endqo, GL_TIMESTAMP_EXT);            }        } else {            if (timeElapsed) {                if (_queryStage._rangeQueryDepth <= MAX_RANGE_QUERY_DEPTH) {                    glEndQuery(GL_TIME_ELAPSED);                }            } else {                glQueryCounter(glquery->_endqo, GL_TIMESTAMP);            }        }         --_queryStage._rangeQueryDepth;        auto duration_ns = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now() - glquery->_batchElapsedTimeBegin);        glquery->_batchElapsedTime = duration_ns.count();         PROFILE_RANGE_END(render_gpu_gl_detail, glquery->_profileRangeId);         (void)CHECK_GL_ERROR();    }} void GLBackend::do_getQuery(const Batch& batch, size_t paramOffset) {    auto query = batch._queries.get(batch._params[paramOffset]._uint);    GLQuery* glquery = syncGPUObject(*query);    if (glquery) {        if (glquery->_rangeQueryDepth > MAX_RANGE_QUERY_DEPTH) {            query->triggerReturnHandler(glquery->_result, glquery->_batchElapsedTime);        } else {            auto backendApi = hifi::properties::getGraphicsAPI();            if (backendApi == hifi::properties::GraphicsAPI::GLES32) {                glquery->_result = 0;                if (hasTimerExtension()) {                    glGetQueryObjectui64vEXT(glquery->_endqo, GL_QUERY_RESULT_AVAILABLE, &glquery->_result);                    if (glquery->_result == GL_TRUE) {                        GLuint64 start, end;                        glGetQueryObjectui64vEXT(glquery->_beginqo, GL_QUERY_RESULT, &start);                        glGetQueryObjectui64vEXT(glquery->_endqo, GL_QUERY_RESULT, &end);                        glquery->_result = end - start;                        query->triggerReturnHandler(glquery->_result, glquery->_batchElapsedTime);                    }                } else {                    query->triggerReturnHandler(0, glquery->_batchElapsedTime);                }            } else {                glGetQueryObjectui64v(glquery->_endqo, GL_QUERY_RESULT_AVAILABLE, &glquery->_result);                if (glquery->_result == GL_TRUE) {                    if (timeElapsed) {                        glGetQueryObjectui64v(glquery->_endqo, GL_QUERY_RESULT, &glquery->_result);                    } else {                        GLuint64 start, end;                        glGetQueryObjectui64v(glquery->_beginqo, GL_QUERY_RESULT, &start);                        glGetQueryObjectui64v(glquery->_endqo, GL_QUERY_RESULT, &end);                        glquery->_result = end - start;                    }                    query->triggerReturnHandler(glquery->_result, glquery->_batchElapsedTime);                }            }            (void)CHECK_GL_ERROR();        }    }} void GLBackend::resetQueryStage() {}