/*
 * Copyright 2023 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef GrBackendSemaphorePriv_DEFINED
#define GrBackendSemaphorePriv_DEFINED

#include "include/core/SkTypes.h"
#include "include/gpu/ganesh/GrBackendSemaphore.h"

enum class GrBackendApi : unsigned int;

class GrBackendSemaphoreData {
public:
    virtual ~GrBackendSemaphoreData();

#if defined(SK_DEBUG)
    virtual GrBackendApi type() const = 0;
#endif
protected:
    GrBackendSemaphoreData() = default;
    GrBackendSemaphoreData(const GrBackendSemaphoreData&) = default;

    using AnySemaphoreData = GrBackendSemaphore::AnySemaphoreData;

private:
    friend class GrBackendSemaphore;
    virtual void copyTo(AnySemaphoreData&) const = 0;
};

class GrBackendSemaphorePriv final {
public:
    template <typename SemaphoreData>
    static GrBackendSemaphore MakeGrBackendSemaphore(GrBackendApi backend,
                                                     const SemaphoreData& data) {
        return GrBackendSemaphore(backend, data);
    }

    static const GrBackendSemaphoreData* GetBackendData(const GrBackendSemaphore& sem) {
        return sem.fSemaphoreData.get();
    }
};

#endif
