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) ...@@ -569,6 +569,10 @@ egl::Error Context::onDestroy(const egl::Display *display)
for (auto fence : mFenceNVMap) for (auto fence : mFenceNVMap)
{ {
if (fence.second)
{
fence.second->onDestroy(this);
}
SafeDelete(fence.second); SafeDelete(fence.second);
} }
mFenceNVMap.clear(); mFenceNVMap.clear();
...@@ -976,6 +980,10 @@ void Context::deleteFencesNV(GLsizei n, const FenceNVID *fences) ...@@ -976,6 +980,10 @@ void Context::deleteFencesNV(GLsizei n, const FenceNVID *fences)
if (mFenceNVMap.erase(fence, &fenceObject)) if (mFenceNVMap.erase(fence, &fenceObject))
{ {
mFenceNVHandleAllocator.release(fence.value); mFenceNVHandleAllocator.release(fence.value);
if (fenceObject)
{
fenceObject->onDestroy(this);
}
delete fenceObject; delete fenceObject;
} }
} }
......
...@@ -27,6 +27,11 @@ FenceNV::~FenceNV() ...@@ -27,6 +27,11 @@ FenceNV::~FenceNV()
SafeDelete(mFence); SafeDelete(mFence);
} }
void FenceNV::onDestroy(const gl::Context *context)
{
mFence->onDestroy(context);
}
angle::Result FenceNV::set(const Context *context, GLenum condition) angle::Result FenceNV::set(const Context *context, GLenum condition)
{ {
ANGLE_TRY(mFence->set(context, condition)); ANGLE_TRY(mFence->set(context, condition));
......
...@@ -32,6 +32,7 @@ class FenceNV final : angle::NonCopyable ...@@ -32,6 +32,7 @@ class FenceNV final : angle::NonCopyable
explicit FenceNV(rx::GLImplFactory *factory); explicit FenceNV(rx::GLImplFactory *factory);
virtual ~FenceNV(); virtual ~FenceNV();
void onDestroy(const gl::Context *context);
angle::Result set(const Context *context, GLenum condition); angle::Result set(const Context *context, GLenum condition);
angle::Result test(const Context *context, GLboolean *outResult); angle::Result test(const Context *context, GLboolean *outResult);
angle::Result finish(const Context *context); angle::Result finish(const Context *context);
......
...@@ -26,6 +26,7 @@ class MockFenceNVImpl : public rx::FenceNVImpl ...@@ -26,6 +26,7 @@ class MockFenceNVImpl : public rx::FenceNVImpl
public: public:
virtual ~MockFenceNVImpl() { destroy(); } virtual ~MockFenceNVImpl() { destroy(); }
MOCK_METHOD1(onDestroy, void(const gl::Context *context));
MOCK_METHOD2(set, angle::Result(const gl::Context *, GLenum)); MOCK_METHOD2(set, angle::Result(const gl::Context *, GLenum));
MOCK_METHOD2(test, angle::Result(const gl::Context *, GLboolean *)); MOCK_METHOD2(test, angle::Result(const gl::Context *, GLboolean *));
MOCK_METHOD1(finish, angle::Result(const gl::Context *)); MOCK_METHOD1(finish, angle::Result(const gl::Context *));
......
...@@ -28,6 +28,7 @@ class FenceNVImpl : angle::NonCopyable ...@@ -28,6 +28,7 @@ class FenceNVImpl : angle::NonCopyable
FenceNVImpl() {} FenceNVImpl() {}
virtual ~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 set(const gl::Context *context, GLenum condition) = 0;
virtual angle::Result test(const gl::Context *context, GLboolean *outFinished) = 0; virtual angle::Result test(const gl::Context *context, GLboolean *outFinished) = 0;
virtual angle::Result finish(const gl::Context *context) = 0; virtual angle::Result finish(const gl::Context *context) = 0;
......
...@@ -23,6 +23,7 @@ class FenceNV11 : public FenceNVImpl ...@@ -23,6 +23,7 @@ class FenceNV11 : public FenceNVImpl
explicit FenceNV11(Renderer11 *renderer); explicit FenceNV11(Renderer11 *renderer);
~FenceNV11() override; ~FenceNV11() override;
void onDestroy(const gl::Context *context) override {}
angle::Result set(const gl::Context *context, GLenum condition) override; angle::Result set(const gl::Context *context, GLenum condition) override;
angle::Result test(const gl::Context *context, GLboolean *outFinished) override; angle::Result test(const gl::Context *context, GLboolean *outFinished) override;
angle::Result finish(const gl::Context *context) override; angle::Result finish(const gl::Context *context) override;
......
...@@ -23,6 +23,7 @@ class FenceNV9 : public FenceNVImpl ...@@ -23,6 +23,7 @@ class FenceNV9 : public FenceNVImpl
explicit FenceNV9(Renderer9 *renderer); explicit FenceNV9(Renderer9 *renderer);
~FenceNV9() override; ~FenceNV9() override;
void onDestroy(const gl::Context *context) override {}
angle::Result set(const gl::Context *context, GLenum condition) override; angle::Result set(const gl::Context *context, GLenum condition) override;
angle::Result test(const gl::Context *context, GLboolean *outFinished) override; angle::Result test(const gl::Context *context, GLboolean *outFinished) override;
angle::Result finish(const gl::Context *context) override; angle::Result finish(const gl::Context *context) override;
......
...@@ -22,6 +22,7 @@ class FenceNVGL : public FenceNVImpl ...@@ -22,6 +22,7 @@ class FenceNVGL : public FenceNVImpl
explicit FenceNVGL(const FunctionsGL *functions); explicit FenceNVGL(const FunctionsGL *functions);
~FenceNVGL() override; ~FenceNVGL() override;
void onDestroy(const gl::Context *context) override {}
angle::Result set(const gl::Context *context, GLenum condition) override; angle::Result set(const gl::Context *context, GLenum condition) override;
angle::Result test(const gl::Context *context, GLboolean *outFinished) override; angle::Result test(const gl::Context *context, GLboolean *outFinished) override;
angle::Result finish(const gl::Context *context) override; angle::Result finish(const gl::Context *context) override;
...@@ -41,6 +42,7 @@ class FenceNVSyncGL : public FenceNVImpl ...@@ -41,6 +42,7 @@ class FenceNVSyncGL : public FenceNVImpl
explicit FenceNVSyncGL(const FunctionsGL *functions); explicit FenceNVSyncGL(const FunctionsGL *functions);
~FenceNVSyncGL() override; ~FenceNVSyncGL() override;
void onDestroy(const gl::Context *context) override {}
angle::Result set(const gl::Context *context, GLenum condition) override; angle::Result set(const gl::Context *context, GLenum condition) override;
angle::Result test(const gl::Context *context, GLboolean *outFinished) override; angle::Result test(const gl::Context *context, GLboolean *outFinished) override;
angle::Result finish(const gl::Context *context) override; angle::Result finish(const gl::Context *context) override;
......
...@@ -20,6 +20,7 @@ class FenceNVNULL : public FenceNVImpl ...@@ -20,6 +20,7 @@ class FenceNVNULL : public FenceNVImpl
FenceNVNULL(); FenceNVNULL();
~FenceNVNULL() override; ~FenceNVNULL() override;
void onDestroy(const gl::Context *context) override {}
angle::Result set(const gl::Context *context, GLenum condition) override; angle::Result set(const gl::Context *context, GLenum condition) override;
angle::Result test(const gl::Context *context, GLboolean *outFinished) override; angle::Result test(const gl::Context *context, GLboolean *outFinished) override;
angle::Result finish(const gl::Context *context) override; angle::Result finish(const gl::Context *context) override;
......
...@@ -21,22 +21,32 @@ FenceNVVk::FenceNVVk() : FenceNVImpl() {} ...@@ -21,22 +21,32 @@ FenceNVVk::FenceNVVk() : FenceNVImpl() {}
FenceNVVk::~FenceNVVk() {} 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::Result FenceNVVk::set(const gl::Context *context, GLenum condition)
{ {
ANGLE_VK_UNREACHABLE(vk::GetImpl(context)); ASSERT(condition == GL_ALL_COMPLETED_NV);
return angle::Result::Stop; return mFenceSync.initialize(vk::GetImpl(context));
} }
angle::Result FenceNVVk::test(const gl::Context *context, GLboolean *outFinished) angle::Result FenceNVVk::test(const gl::Context *context, GLboolean *outFinished)
{ {
ANGLE_VK_UNREACHABLE(vk::GetImpl(context)); bool signaled = false;
return angle::Result::Stop; 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::Result FenceNVVk::finish(const gl::Context *context)
{ {
ANGLE_VK_UNREACHABLE(vk::GetImpl(context)); VkResult outResult;
return angle::Result::Stop; ContextVk *contextVk = vk::GetImpl(context);
return mFenceSync.clientWait(contextVk, contextVk, true, UINT64_MAX, &outResult);
} }
} // namespace rx } // namespace rx
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#define LIBANGLE_RENDERER_VULKAN_FENCENVVK_H_ #define LIBANGLE_RENDERER_VULKAN_FENCENVVK_H_
#include "libANGLE/renderer/FenceNVImpl.h" #include "libANGLE/renderer/FenceNVImpl.h"
#include "libANGLE/renderer/vulkan/SyncVk.h"
namespace rx namespace rx
{ {
...@@ -20,9 +21,13 @@ class FenceNVVk : public FenceNVImpl ...@@ -20,9 +21,13 @@ class FenceNVVk : public FenceNVImpl
FenceNVVk(); FenceNVVk();
~FenceNVVk() override; ~FenceNVVk() override;
void onDestroy(const gl::Context *context) override;
angle::Result set(const gl::Context *context, GLenum condition) override; angle::Result set(const gl::Context *context, GLenum condition) override;
angle::Result test(const gl::Context *context, GLboolean *outFinished) override; angle::Result test(const gl::Context *context, GLboolean *outFinished) override;
angle::Result finish(const gl::Context *context) override; angle::Result finish(const gl::Context *context) override;
private:
vk::SyncHelper mFenceSync;
}; };
} // namespace rx } // namespace rx
......
...@@ -461,6 +461,9 @@ void RendererVk::ensureCapsInitialized() const ...@@ -461,6 +461,9 @@ void RendererVk::ensureCapsInitialized() const
// Enable GL_NV_pixel_buffer_object extension. // Enable GL_NV_pixel_buffer_object extension.
mNativeExtensions.pixelBufferObjectNV = true; mNativeExtensions.pixelBufferObjectNV = true;
// Enable GL_NV_fence extension.
mNativeExtensions.fenceNV = true;
// Geometry shader is optional. // Geometry shader is optional.
if (mPhysicalDeviceFeatures.geometryShader) 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