blob: c9874706255efdfab7d9dd6875872947cd476703 [file] [log] [blame]
/*
* Copyright 2019 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef GrMtlSemaphore_DEFINED
#define GrMtlSemaphore_DEFINED
#include "include/gpu/GrBackendSemaphore.h"
#include "include/private/GrTypesPriv.h"
#include "src/gpu/GrManagedResource.h"
#include "src/gpu/GrSemaphore.h"
#include "src/gpu/mtl/GrMtlUtil.h"
#include <Metal/Metal.h>
class GrMtlGpu;
class GrMtlEvent : public GrManagedResource {
public:
static sk_sp<GrMtlEvent> Make(GrMtlGpu* gpu);
static sk_sp<GrMtlEvent> MakeWrapped(GrMTLHandle event);
~GrMtlEvent() override {}
id<MTLEvent> mtlEvent() const SK_API_AVAILABLE(macos(10.14), ios(12.0)) { return fMtlEvent; }
#ifdef SK_TRACE_MANAGED_RESOURCES
/** output a human-readable dump of this resource's information
*/
void dumpInfo() const override {
if (@available(macOS 10.14, iOS 12.0, *)) {
SkDebugf("GrMtlEvent: %p (%ld refs)\n", fMtlEvent,
CFGetRetainCount((CFTypeRef)fMtlEvent));
}
}
#endif
void freeGPUData() const override {
if (@available(macOS 10.14, iOS 12.0, *)) {
fMtlEvent = nil;
}
}
private:
GrMtlEvent(id<MTLEvent> mtlEvent) SK_API_AVAILABLE(macos(10.14), ios(12.0))
: fMtlEvent(mtlEvent) {}
mutable id<MTLEvent> fMtlEvent SK_API_AVAILABLE(macos(10.14), ios(12.0));
};
class GrMtlSemaphore : public GrSemaphore {
public:
static std::unique_ptr<GrMtlSemaphore> Make(GrMtlGpu* gpu) {
sk_sp<GrMtlEvent> event = GrMtlEvent::Make(gpu);
if (!event) {
return nullptr;
}
return std::unique_ptr<GrMtlSemaphore>(new GrMtlSemaphore(std::move(event), 1));
}
static std::unique_ptr<GrMtlSemaphore> MakeWrapped(GrMTLHandle mtlEvent, uint64_t value) {
sk_sp<GrMtlEvent> event = GrMtlEvent::MakeWrapped(mtlEvent);
if (!event) {
return nullptr;
}
return std::unique_ptr<GrMtlSemaphore>(new GrMtlSemaphore(std::move(event), value));
}
~GrMtlSemaphore() override {}
sk_sp<GrMtlEvent> event() { return fEvent; }
uint64_t value() const { return fValue; }
GrBackendSemaphore backendSemaphore() const override;
private:
GrMtlSemaphore(sk_sp<GrMtlEvent> event, uint64_t value)
: fEvent(std::move(event))
, fValue(value) {}
void setIsOwned() override {}
sk_sp<GrMtlEvent> fEvent;
uint64_t fValue;
using INHERITED = GrSemaphore;
};
#endif