//
// Copyright 2015 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.
//

// SyncGL.cpp: Implements the class methods for SyncGL.

#include "libANGLE/renderer/gl/SyncGL.h"

#include "common/debug.h"
#include "libANGLE/Context.h"
#include "libANGLE/renderer/gl/ContextGL.h"
#include "libANGLE/renderer/gl/FunctionsGL.h"

namespace rx
{

SyncGL::SyncGL(const FunctionsGL *functions) : SyncImpl(), mFunctions(functions), mSyncObject(0)
{
    ASSERT(mFunctions);
}

SyncGL::~SyncGL()
{
    ASSERT(mSyncObject == 0);
}

void SyncGL::onDestroy(const gl::Context *context)
{
    ASSERT(mSyncObject != 0);
    mFunctions->deleteSync(mSyncObject);
    mSyncObject = 0;
}

angle::Result SyncGL::set(const gl::Context *context, GLenum condition, GLbitfield flags)
{
    ASSERT(condition == GL_SYNC_GPU_COMMANDS_COMPLETE && flags == 0);
    ContextGL *contextGL = GetImplAs<ContextGL>(context);
    mSyncObject          = mFunctions->fenceSync(condition, flags);
    ANGLE_CHECK(contextGL, mSyncObject != 0, "glFenceSync failed to create a GLsync object.",
                GL_OUT_OF_MEMORY);
    contextGL->markWorkSubmitted();
    return angle::Result::Continue;
}

angle::Result SyncGL::clientWait(const gl::Context *context,
                                 GLbitfield flags,
                                 GLuint64 timeout,
                                 GLenum *outResult)
{
    ASSERT(mSyncObject != 0);
    *outResult = mFunctions->clientWaitSync(mSyncObject, flags, timeout);
    return angle::Result::Continue;
}

angle::Result SyncGL::serverWait(const gl::Context *context, GLbitfield flags, GLuint64 timeout)
{
    ASSERT(mSyncObject != 0);
    mFunctions->waitSync(mSyncObject, flags, timeout);
    return angle::Result::Continue;
}

angle::Result SyncGL::getStatus(const gl::Context *context, GLint *outResult)
{
    ASSERT(mSyncObject != 0);
    mFunctions->getSynciv(mSyncObject, GL_SYNC_STATUS, 1, nullptr, outResult);
    return angle::Result::Continue;
}
}  // namespace rx
