Commit 6d6b91a6 by Alexis Hetu Committed by Commit Bot

Enable GL_NV_fence with Vulkan backend

Implemented FenceNVVk, based on the existing vk::SyncHelper class. Bug: angleproject:4295 Change-Id: I3f44a66e27ce3bd24461894dae4757b25321a6a4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2013880 Commit-Queue: Alexis Hétu <sugoi@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 8247ae78
......@@ -569,6 +569,10 @@ egl::Error Context::onDestroy(const egl::Display *display)
for (auto fence : mFenceNVMap)
{
if (fence.second)
{
fence.second->onDestroy(this);
}
SafeDelete(fence.second);
}
mFenceNVMap.clear();
......@@ -976,6 +980,10 @@ void Context::deleteFencesNV(GLsizei n, const FenceNVID *fences)
if (mFenceNVMap.erase(fence, &fenceObject))
{
mFenceNVHandleAllocator.release(fence.value);
if (fenceObject)
{
fenceObject->onDestroy(this);
}
delete fenceObject;
}
}
......
......@@ -27,6 +27,11 @@ FenceNV::~FenceNV()
SafeDelete(mFence);
}
void FenceNV::onDestroy(const gl::Context *context)
{
mFence->onDestroy(context);
}
angle::Result FenceNV::set(const Context *context, GLenum condition)
{
ANGLE_TRY(mFence->set(context, condition));
......
......@@ -32,6 +32,7 @@ class FenceNV final : angle::NonCopyable
explicit FenceNV(rx::GLImplFactory *factory);
virtual ~FenceNV();
void onDestroy(const gl::Context *context);
angle::Result set(const Context *context, GLenum condition);
angle::Result test(const Context *context, GLboolean *outResult);
angle::Result finish(const Context *context);
......
......@@ -26,6 +26,7 @@ class MockFenceNVImpl : public rx::FenceNVImpl
public:
virtual ~MockFenceNVImpl() { destroy(); }
MOCK_METHOD1(onDestroy, void(const gl::Context *context));
MOCK_METHOD2(set, angle::Result(const gl::Context *, GLenum));
MOCK_METHOD2(test, angle::Result(const gl::Context *, GLboolean *));
MOCK_METHOD1(finish, angle::Result(const gl::Context *));
......
......@@ -28,6 +28,7 @@ class FenceNVImpl : angle::NonCopyable
FenceNVImpl() {}
virtual ~FenceNVImpl() {}
virtual void onDestroy(const gl::Context *context) = 0;
virtual angle::Result set(const gl::Context *context, GLenum condition) = 0;
virtual angle::Result test(const gl::Context *context, GLboolean *outFinished) = 0;
virtual angle::Result finish(const gl::Context *context) = 0;
......
......@@ -23,6 +23,7 @@ class FenceNV11 : public FenceNVImpl
explicit FenceNV11(Renderer11 *renderer);
~FenceNV11() override;
void onDestroy(const gl::Context *context) override {}
angle::Result set(const gl::Context *context, GLenum condition) override;
angle::Result test(const gl::Context *context, GLboolean *outFinished) override;
angle::Result finish(const gl::Context *context) override;
......
......@@ -23,6 +23,7 @@ class FenceNV9 : public FenceNVImpl
explicit FenceNV9(Renderer9 *renderer);
~FenceNV9() override;
void onDestroy(const gl::Context *context) override {}
angle::Result set(const gl::Context *context, GLenum condition) override;
angle::Result test(const gl::Context *context, GLboolean *outFinished) override;
angle::Result finish(const gl::Context *context) override;
......
......@@ -22,6 +22,7 @@ class FenceNVGL : public FenceNVImpl
explicit FenceNVGL(const FunctionsGL *functions);
~FenceNVGL() override;
void onDestroy(const gl::Context *context) override {}
angle::Result set(const gl::Context *context, GLenum condition) override;
angle::Result test(const gl::Context *context, GLboolean *outFinished) override;
angle::Result finish(const gl::Context *context) override;
......@@ -41,6 +42,7 @@ class FenceNVSyncGL : public FenceNVImpl
explicit FenceNVSyncGL(const FunctionsGL *functions);
~FenceNVSyncGL() override;
void onDestroy(const gl::Context *context) override {}
angle::Result set(const gl::Context *context, GLenum condition) override;
angle::Result test(const gl::Context *context, GLboolean *outFinished) override;
angle::Result finish(const gl::Context *context) override;
......
......@@ -20,6 +20,7 @@ class FenceNVNULL : public FenceNVImpl
FenceNVNULL();
~FenceNVNULL() override;
void onDestroy(const gl::Context *context) override {}
angle::Result set(const gl::Context *context, GLenum condition) override;
angle::Result test(const gl::Context *context, GLboolean *outFinished) override;
angle::Result finish(const gl::Context *context) override;
......
......@@ -21,22 +21,32 @@ FenceNVVk::FenceNVVk() : FenceNVImpl() {}
FenceNVVk::~FenceNVVk() {}
void FenceNVVk::onDestroy(const gl::Context *context)
{
mFenceSync.releaseToRenderer(vk::GetImpl(context)->getRenderer());
}
angle::Result FenceNVVk::set(const gl::Context *context, GLenum condition)
{
ANGLE_VK_UNREACHABLE(vk::GetImpl(context));
return angle::Result::Stop;
ASSERT(condition == GL_ALL_COMPLETED_NV);
return mFenceSync.initialize(vk::GetImpl(context));
}
angle::Result FenceNVVk::test(const gl::Context *context, GLboolean *outFinished)
{
ANGLE_VK_UNREACHABLE(vk::GetImpl(context));
return angle::Result::Stop;
bool signaled = false;
ANGLE_TRY(mFenceSync.getStatus(vk::GetImpl(context), &signaled));
ASSERT(outFinished);
*outFinished = signaled ? GL_TRUE : GL_FALSE;
return angle::Result::Continue;
}
angle::Result FenceNVVk::finish(const gl::Context *context)
{
ANGLE_VK_UNREACHABLE(vk::GetImpl(context));
return angle::Result::Stop;
VkResult outResult;
ContextVk *contextVk = vk::GetImpl(context);
return mFenceSync.clientWait(contextVk, contextVk, true, UINT64_MAX, &outResult);
}
} // namespace rx
......@@ -11,6 +11,7 @@
#define LIBANGLE_RENDERER_VULKAN_FENCENVVK_H_
#include "libANGLE/renderer/FenceNVImpl.h"
#include "libANGLE/renderer/vulkan/SyncVk.h"
namespace rx
{
......@@ -20,9 +21,13 @@ class FenceNVVk : public FenceNVImpl
FenceNVVk();
~FenceNVVk() override;
void onDestroy(const gl::Context *context) override;
angle::Result set(const gl::Context *context, GLenum condition) override;
angle::Result test(const gl::Context *context, GLboolean *outFinished) override;
angle::Result finish(const gl::Context *context) override;
private:
vk::SyncHelper mFenceSync;
};
} // namespace rx
......
......@@ -461,6 +461,9 @@ void RendererVk::ensureCapsInitialized() const
// Enable GL_NV_pixel_buffer_object extension.
mNativeExtensions.pixelBufferObjectNV = true;
// Enable GL_NV_fence extension.
mNativeExtensions.fenceNV = true;
// Geometry shader is optional.
if (mPhysicalDeviceFeatures.geometryShader)
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment