Fix race condition with Metal timer queries (#2413)
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user