diff --git a/filament/backend/src/opengl/OpenGLDriver.cpp b/filament/backend/src/opengl/OpenGLDriver.cpp index b9060df78b..98545d83f1 100644 --- a/filament/backend/src/opengl/OpenGLDriver.cpp +++ b/filament/backend/src/opengl/OpenGLDriver.cpp @@ -716,7 +716,11 @@ Handle OpenGLDriver::createSwapChainHeadlessS() noexcept { } Handle OpenGLDriver::createTimerQueryS() noexcept { - return initHandle(); + Handle tqh = initHandle(); + // The state must be constructed here, as a synchronous call to getTimerQueryValue might happen + // before createTimerQueryR is executed on the backend thread. + handle_cast(tqh)->state = std::make_shared(); + return tqh; } Handle OpenGLDriver::createDescriptorSetLayoutS() noexcept { diff --git a/filament/backend/src/opengl/OpenGLTimerQuery.cpp b/filament/backend/src/opengl/OpenGLTimerQuery.cpp index 2d8aedc947..132c0625c2 100644 --- a/filament/backend/src/opengl/OpenGLTimerQuery.cpp +++ b/filament/backend/src/opengl/OpenGLTimerQuery.cpp @@ -88,15 +88,14 @@ TimerQueryFactoryInterface::~TimerQueryFactoryInterface() = default; // This is a backend synchronous call TimerQueryResult TimerQueryFactoryInterface::getTimerQueryValue( GLTimerQuery* tq, uint64_t* elapsedTime) noexcept { - if (UTILS_LIKELY(tq->state)) { - int64_t const elapsed = tq->state->elapsed.load(std::memory_order_relaxed); - if (elapsed > 0) { - *elapsedTime = elapsed; - return TimerQueryResult::AVAILABLE; - } - return TimerQueryResult(elapsed); + assert_invariant(tq->state); + + int64_t const elapsed = tq->state->elapsed.load(std::memory_order_relaxed); + if (elapsed > 0) { + *elapsedTime = elapsed; + return TimerQueryResult::AVAILABLE; } - return TimerQueryResult::ERROR; + return TimerQueryResult(elapsed); } // ------------------------------------------------------------------------------------------------ @@ -110,9 +109,8 @@ TimerQueryNativeFactory::TimerQueryNativeFactory(OpenGLContext& context) TimerQueryNativeFactory::~TimerQueryNativeFactory() = default; void TimerQueryNativeFactory::createTimerQuery(GLTimerQuery* tq) { - assert_invariant(!tq->state); + assert_invariant(tq->state); - tq->state = std::make_shared(); mContext.procs.genQueries(1u, &tq->state->gl.query); CHECK_GL_ERROR() } @@ -181,8 +179,7 @@ TimerQueryFenceFactory::~TimerQueryFenceFactory() { } void TimerQueryFenceFactory::createTimerQuery(GLTimerQuery* tq) { - assert_invariant(!tq->state); - tq->state = std::make_shared(); + assert_invariant(tq->state); } void TimerQueryFenceFactory::destroyTimerQuery(GLTimerQuery* tq) { @@ -238,8 +235,7 @@ TimerQueryFallbackFactory::TimerQueryFallbackFactory() = default; TimerQueryFallbackFactory::~TimerQueryFallbackFactory() = default; void TimerQueryFallbackFactory::createTimerQuery(GLTimerQuery* tq) { - assert_invariant(!tq->state); - tq->state = std::make_shared(); + assert_invariant(tq->state); } void TimerQueryFallbackFactory::destroyTimerQuery(GLTimerQuery* tq) {