/*
 * 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
