Hash :
20ae6814
Author :
Date :
2019-02-27T17:11:58
Vulkan: Decouple EGLSync from renderer serial To support future work where RendererVk functionality is moved to ContextVk. Given multiple contexts, EGLSync can no longer rely on a single serial as it can be used in multiple contexts. Instead, the fence corresponding to the submission in which the EGLSync object signals is kept so it can be waited on. Introduces a `vk::Shared` class that includes a ref-counted reference to a Vulkan object (vk::Fence in this case). This is specially made to `destroy()` object when reference count reaches zero. Bug: angleproject:2464 Change-Id: I68c8229eea8df77974e28fcc2a9563dae5d204f9 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1493131 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Jamie Madill (use @chromium please) <jmadill@google.com> Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
//
// Copyright 2016 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.
//
// SyncVk:
// Defines the class interface for SyncVk, implementing SyncImpl.
//
#ifndef LIBANGLE_RENDERER_VULKAN_FENCESYNCVK_H_
#define LIBANGLE_RENDERER_VULKAN_FENCESYNCVK_H_
#include "libANGLE/renderer/EGLSyncImpl.h"
#include "libANGLE/renderer/SyncImpl.h"
#include "libANGLE/renderer/vulkan/vk_utils.h"
namespace egl
{
class AttributeMap;
}
namespace rx
{
// The behaviors of SyncImpl and EGLSyncImpl as fence syncs (only supported type) are currently
// identical for the Vulkan backend, and this class implements both interfaces.
class FenceSyncVk
{
public:
FenceSyncVk();
~FenceSyncVk();
void onDestroy(RendererVk *renderer);
angle::Result initialize(vk::Context *context);
angle::Result clientWait(vk::Context *context,
bool flushCommands,
uint64_t timeout,
VkResult *outResult);
angle::Result serverWait(vk::Context *context);
angle::Result getStatus(vk::Context *context, bool *signaled);
private:
// The vkEvent that's signaled on `init` and can be waited on in `serverWait`, or queried with
// `getStatus`.
vk::Event mEvent;
// The vkFence that's signaled once the command buffer including the `init` signal is executed.
// `clientWait` waits on this fence.
vk::Shared<vk::Fence> mFence;
};
class SyncVk final : public SyncImpl
{
public:
SyncVk();
~SyncVk() override;
void onDestroy(const gl::Context *context) override;
angle::Result set(const gl::Context *context, GLenum condition, GLbitfield flags) override;
angle::Result clientWait(const gl::Context *context,
GLbitfield flags,
GLuint64 timeout,
GLenum *outResult) override;
angle::Result serverWait(const gl::Context *context,
GLbitfield flags,
GLuint64 timeout) override;
angle::Result getStatus(const gl::Context *context, GLint *outResult) override;
private:
FenceSyncVk mFenceSync;
};
class EGLSyncVk final : public EGLSyncImpl
{
public:
EGLSyncVk(const egl::AttributeMap &attribs);
~EGLSyncVk() override;
void onDestroy(const egl::Display *display) override;
egl::Error initialize(const egl::Display *display, EGLenum type) override;
egl::Error clientWait(const egl::Display *display,
EGLint flags,
EGLTime timeout,
EGLint *outResult) override;
egl::Error serverWait(const egl::Display *display, EGLint flags) override;
egl::Error getStatus(const egl::Display *display, EGLint *outStatus) override;
private:
FenceSyncVk mFenceSync;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_VULKAN_FENCESYNCVK_H_