Fix race condition with Metal timer queries (#2413)

This commit is contained in:
Ben Doherty
2020-04-20 09:33:22 -07:00
committed by GitHub
parent 06593a97bb
commit cb53a68d71
2 changed files with 6 additions and 4 deletions
+4 -2
View File
@@ -275,7 +275,7 @@ void MetalDriver::createStreamFromTextureIdR(Handle<HwStream>, intptr_t external
}
void MetalDriver::createTimerQueryR(Handle<HwTimerQuery> tqh, int) {
construct_handle<MetalTimerQuery>(mHandleMap, tqh);
// nothing to do, timer query was constructed in createTimerQueryS
}
Handle<HwVertexBuffer> MetalDriver::createVertexBufferS() noexcept {
@@ -347,7 +347,9 @@ Handle<HwStream> MetalDriver::createStreamFromTextureIdS() noexcept {
}
Handle<HwTimerQuery> MetalDriver::createTimerQueryS() noexcept {
return alloc_handle<MetalTimerQuery, HwTimerQuery>();
// The handle must be constructed here, as a synchronous call to getTimerQueryValue might happen
// before createTimerQueryR is executed.
return alloc_and_construct_handle<MetalTimerQuery, HwTimerQuery>();
}
void MetalDriver::destroyVertexBuffer(Handle<HwVertexBuffer> vbh) {
+2 -2
View File
@@ -209,8 +209,8 @@ struct MetalTimerQuery : public HwTimerQuery {
MetalTimerQuery() : status(std::make_shared<Status>()) {}
struct Status {
std::atomic<bool> available;
uint64_t elapsed; // only valid if available is true
std::atomic<bool> available {false};
uint64_t elapsed {0}; // only valid if available is true
};
std::shared_ptr<Status> status;