blob: 1033f7ad9d8896fb6547f232680c30c3a1b36fe0 [file] [log] [blame]
//
// 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.
//
#include "libANGLE/renderer/gl/SemaphoreGL.h"
#include "libANGLE/Context.h"
#include "libANGLE/renderer/gl/BufferGL.h"
#include "libANGLE/renderer/gl/ContextGL.h"
#include "libANGLE/renderer/gl/FunctionsGL.h"
#include "libANGLE/renderer/gl/TextureGL.h"
#include "libANGLE/renderer/gl/renderergl_utils.h"
namespace rx
{
namespace
{
void GatherNativeBufferIDs(const gl::BufferBarrierVector &bufferBarriers,
gl::BarrierVector<GLuint> *outIDs)
{
outIDs->resize(bufferBarriers.size());
for (GLuint bufferIdx = 0; bufferIdx < bufferBarriers.size(); bufferIdx++)
{
(*outIDs)[bufferIdx] = GetImplAs<BufferGL>(bufferBarriers[bufferIdx])->getBufferID();
}
}
void GatherNativeTextureIDs(const gl::TextureBarrierVector &textureBarriers,
gl::BarrierVector<GLuint> *outIDs,
gl::BarrierVector<GLenum> *outLayouts)
{
outIDs->resize(textureBarriers.size());
outLayouts->resize(textureBarriers.size());
for (GLuint textureIdx = 0; textureIdx < textureBarriers.size(); textureIdx++)
{
(*outIDs)[textureIdx] =
GetImplAs<TextureGL>(textureBarriers[textureIdx].texture)->getTextureID();
(*outLayouts)[textureIdx] = textureBarriers[textureIdx].layout;
}
}
} // anonymous namespace
SemaphoreGL::SemaphoreGL(GLuint semaphoreID) : mSemaphoreID(semaphoreID)
{
ASSERT(mSemaphoreID != 0);
}
SemaphoreGL::~SemaphoreGL()
{
ASSERT(mSemaphoreID == 0);
}
void SemaphoreGL::onDestroy(const gl::Context *context)
{
const FunctionsGL *functions = GetFunctionsGL(context);
functions->deleteSemaphoresEXT(1, &mSemaphoreID);
mSemaphoreID = 0;
}
angle::Result SemaphoreGL::importFd(gl::Context *context, gl::HandleType handleType, GLint fd)
{
const FunctionsGL *functions = GetFunctionsGL(context);
functions->importSemaphoreFdEXT(mSemaphoreID, ToGLenum(handleType), fd);
return angle::Result::Continue;
}
angle::Result SemaphoreGL::wait(gl::Context *context,
const gl::BufferBarrierVector &bufferBarriers,
const gl::TextureBarrierVector &textureBarriers)
{
const FunctionsGL *functions = GetFunctionsGL(context);
gl::BarrierVector<GLuint> bufferIDs(bufferBarriers.size());
GatherNativeBufferIDs(bufferBarriers, &bufferIDs);
gl::BarrierVector<GLuint> textureIDs(textureBarriers.size());
gl::BarrierVector<GLenum> textureLayouts(textureBarriers.size());
GatherNativeTextureIDs(textureBarriers, &textureIDs, &textureLayouts);
ASSERT(textureIDs.size() == textureLayouts.size());
functions->waitSemaphoreEXT(mSemaphoreID, static_cast<GLuint>(bufferIDs.size()),
bufferIDs.data(), static_cast<GLuint>(textureIDs.size()),
textureIDs.data(), textureLayouts.data());
return angle::Result::Continue;
}
angle::Result SemaphoreGL::signal(gl::Context *context,
const gl::BufferBarrierVector &bufferBarriers,
const gl::TextureBarrierVector &textureBarriers)
{
const FunctionsGL *functions = GetFunctionsGL(context);
gl::BarrierVector<GLuint> bufferIDs(bufferBarriers.size());
GatherNativeBufferIDs(bufferBarriers, &bufferIDs);
gl::BarrierVector<GLuint> textureIDs(textureBarriers.size());
gl::BarrierVector<GLenum> textureLayouts(textureBarriers.size());
GatherNativeTextureIDs(textureBarriers, &textureIDs, &textureLayouts);
ASSERT(textureIDs.size() == textureLayouts.size());
functions->signalSemaphoreEXT(mSemaphoreID, static_cast<GLuint>(bufferIDs.size()),
bufferIDs.data(), static_cast<GLuint>(textureIDs.size()),
textureIDs.data(), textureLayouts.data());
return angle::Result::Continue;
}
GLuint SemaphoreGL::getSemaphoreID() const
{
return mSemaphoreID;
}
} // namespace rx