//
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Semaphore.h: Implements the gl::Semaphore class [EXT_external_objects]

#include "libANGLE/Semaphore.h"

#include "common/angleutils.h"
#include "libANGLE/renderer/GLImplFactory.h"
#include "libANGLE/renderer/SemaphoreImpl.h"

namespace gl
{

Semaphore::Semaphore(rx::GLImplFactory *factory, SemaphoreID id)
    : RefCountObject(factory->generateSerial(), id), mImplementation(factory->createSemaphore())
{}

Semaphore::~Semaphore() {}

void Semaphore::onDestroy(const Context *context)
{
    mImplementation->onDestroy(context);
}

angle::Result Semaphore::importFd(Context *context, HandleType handleType, GLint fd)
{
    return mImplementation->importFd(context, handleType, fd);
}

angle::Result Semaphore::importZirconHandle(Context *context, HandleType handleType, GLuint handle)
{
    return mImplementation->importZirconHandle(context, handleType, handle);
}

angle::Result Semaphore::wait(Context *context,
                              const BufferBarrierVector &bufferBarriers,
                              const TextureBarrierVector &textureBarriers)
{
    return mImplementation->wait(context, bufferBarriers, textureBarriers);
}

angle::Result Semaphore::signal(Context *context,
                                const BufferBarrierVector &bufferBarriers,
                                const TextureBarrierVector &textureBarriers)
{
    return mImplementation->signal(context, bufferBarriers, textureBarriers);
}

}  // namespace gl
