diff --git a/filament/backend/src/metal/MetalDriver.mm b/filament/backend/src/metal/MetalDriver.mm index 0e1036ca13..65d11e123d 100644 --- a/filament/backend/src/metal/MetalDriver.mm +++ b/filament/backend/src/metal/MetalDriver.mm @@ -275,7 +275,7 @@ void MetalDriver::createStreamFromTextureIdR(Handle, intptr_t external } void MetalDriver::createTimerQueryR(Handle tqh, int) { - construct_handle(mHandleMap, tqh); + // nothing to do, timer query was constructed in createTimerQueryS } Handle MetalDriver::createVertexBufferS() noexcept { @@ -347,7 +347,9 @@ Handle MetalDriver::createStreamFromTextureIdS() noexcept { } Handle MetalDriver::createTimerQueryS() noexcept { - return alloc_handle(); + // The handle must be constructed here, as a synchronous call to getTimerQueryValue might happen + // before createTimerQueryR is executed. + return alloc_and_construct_handle(); } void MetalDriver::destroyVertexBuffer(Handle vbh) { diff --git a/filament/backend/src/metal/MetalHandles.h b/filament/backend/src/metal/MetalHandles.h index b9bd29b3de..e8559c4150 100644 --- a/filament/backend/src/metal/MetalHandles.h +++ b/filament/backend/src/metal/MetalHandles.h @@ -209,8 +209,8 @@ struct MetalTimerQuery : public HwTimerQuery { MetalTimerQuery() : status(std::make_shared()) {} struct Status { - std::atomic available; - uint64_t elapsed; // only valid if available is true + std::atomic available {false}; + uint64_t elapsed {0}; // only valid if available is true }; std::shared_ptr status;