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

#include "include/gpu/graphite/BackendSemaphore.h"

#include "include/gpu/GpuTypes.h"
#include "include/private/base/SkAssert.h"
#include "src/gpu/graphite/BackendSemaphorePriv.h"

namespace skgpu::graphite {

BackendSemaphore::BackendSemaphore() = default;

BackendSemaphore::~BackendSemaphore() = default;

BackendSemaphore::BackendSemaphore(const BackendSemaphore& that) {
    *this = that;
}

BackendSemaphore& BackendSemaphore::operator=(const BackendSemaphore& that) {
    if (!that.isValid()) {
        fIsValid = false;
        return *this;
    }
    SkASSERT(!this->isValid() || this->backend() == that.backend());
    fIsValid = true;
    fBackend = that.fBackend;

    switch (that.backend()) {
        case BackendApi::kDawn:
            SK_ABORT("Unsupported Backend");
        case BackendApi::kMetal:
        case BackendApi::kVulkan:
            fSemaphoreData.reset();
            that.fSemaphoreData->copyTo(fSemaphoreData);
            break;
        default:
            SK_ABORT("Unsupported Backend");
    }
    return *this;
}

BackendSemaphoreData::~BackendSemaphoreData() {}

}  // End of namespace skgpu::graphite
