1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2016 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker // SyncVk: 7*8975f5c5SAndroid Build Coastguard Worker // Defines the class interface for SyncVk, implementing SyncImpl. 8*8975f5c5SAndroid Build Coastguard Worker // 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_VULKAN_FENCESYNCVK_H_ 11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_VULKAN_FENCESYNCVK_H_ 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/EGLSyncImpl.h" 14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/SyncImpl.h" 15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_resource.h" 16*8975f5c5SAndroid Build Coastguard Worker 17*8975f5c5SAndroid Build Coastguard Worker namespace egl 18*8975f5c5SAndroid Build Coastguard Worker { 19*8975f5c5SAndroid Build Coastguard Worker class AttributeMap; 20*8975f5c5SAndroid Build Coastguard Worker } 21*8975f5c5SAndroid Build Coastguard Worker 22*8975f5c5SAndroid Build Coastguard Worker namespace rx 23*8975f5c5SAndroid Build Coastguard Worker { 24*8975f5c5SAndroid Build Coastguard Worker namespace vk 25*8975f5c5SAndroid Build Coastguard Worker { 26*8975f5c5SAndroid Build Coastguard Worker 27*8975f5c5SAndroid Build Coastguard Worker // Represents an invalid native fence FD. 28*8975f5c5SAndroid Build Coastguard Worker constexpr int kInvalidFenceFd = EGL_NO_NATIVE_FENCE_FD_ANDROID; 29*8975f5c5SAndroid Build Coastguard Worker 30*8975f5c5SAndroid Build Coastguard Worker class ExternalFence final : angle::NonCopyable 31*8975f5c5SAndroid Build Coastguard Worker { 32*8975f5c5SAndroid Build Coastguard Worker public: 33*8975f5c5SAndroid Build Coastguard Worker ExternalFence(); 34*8975f5c5SAndroid Build Coastguard Worker ~ExternalFence(); 35*8975f5c5SAndroid Build Coastguard Worker 36*8975f5c5SAndroid Build Coastguard Worker VkResult init(VkDevice device, const VkFenceCreateInfo &createInfo); 37*8975f5c5SAndroid Build Coastguard Worker void init(int fenceFd); 38*8975f5c5SAndroid Build Coastguard Worker getHandle()39*8975f5c5SAndroid Build Coastguard Worker VkFence getHandle() const { return mFence.getHandle(); } 40*8975f5c5SAndroid Build Coastguard Worker VkResult getStatus(VkDevice device) const; 41*8975f5c5SAndroid Build Coastguard Worker VkResult wait(VkDevice device, uint64_t timeout) const; 42*8975f5c5SAndroid Build Coastguard Worker 43*8975f5c5SAndroid Build Coastguard Worker void exportFd(VkDevice device, const VkFenceGetFdInfoKHR &fenceGetFdInfo); getFenceFdStatus()44*8975f5c5SAndroid Build Coastguard Worker VkResult getFenceFdStatus() const { return mFenceFdStatus; } getFenceFd()45*8975f5c5SAndroid Build Coastguard Worker int getFenceFd() const { return mFenceFd; } 46*8975f5c5SAndroid Build Coastguard Worker 47*8975f5c5SAndroid Build Coastguard Worker private: 48*8975f5c5SAndroid Build Coastguard Worker VkDevice mDevice; 49*8975f5c5SAndroid Build Coastguard Worker Fence mFence; 50*8975f5c5SAndroid Build Coastguard Worker VkResult mFenceFdStatus; 51*8975f5c5SAndroid Build Coastguard Worker int mFenceFd; 52*8975f5c5SAndroid Build Coastguard Worker }; 53*8975f5c5SAndroid Build Coastguard Worker 54*8975f5c5SAndroid Build Coastguard Worker using SharedExternalFence = std::shared_ptr<ExternalFence>; 55*8975f5c5SAndroid Build Coastguard Worker using MapVkResultToApiType = std::function<void(VkResult, angle::Result, void *)>; 56*8975f5c5SAndroid Build Coastguard Worker 57*8975f5c5SAndroid Build Coastguard Worker class SyncHelperInterface : angle::NonCopyable 58*8975f5c5SAndroid Build Coastguard Worker { 59*8975f5c5SAndroid Build Coastguard Worker public: 60*8975f5c5SAndroid Build Coastguard Worker virtual ~SyncHelperInterface() = default; 61*8975f5c5SAndroid Build Coastguard Worker 62*8975f5c5SAndroid Build Coastguard Worker virtual void releaseToRenderer(Renderer *renderer) = 0; 63*8975f5c5SAndroid Build Coastguard Worker 64*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result clientWait(Context *context, 65*8975f5c5SAndroid Build Coastguard Worker ContextVk *contextVk, 66*8975f5c5SAndroid Build Coastguard Worker bool flushCommands, 67*8975f5c5SAndroid Build Coastguard Worker uint64_t timeout, 68*8975f5c5SAndroid Build Coastguard Worker MapVkResultToApiType mappingFunction, 69*8975f5c5SAndroid Build Coastguard Worker void *outResult) = 0; 70*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result serverWait(ContextVk *contextVk) = 0; 71*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result getStatus(Context *context, ContextVk *contextVk, bool *signaledOut) = 0; 72*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result dupNativeFenceFD(Context *context, int *fdOut) const = 0; 73*8975f5c5SAndroid Build Coastguard Worker }; 74*8975f5c5SAndroid Build Coastguard Worker 75*8975f5c5SAndroid Build Coastguard Worker // Implementation of fence types - glFenceSync, and EGLSync(EGL_SYNC_FENCE_KHR). 76*8975f5c5SAndroid Build Coastguard Worker // The behaviors of SyncVk and EGLFenceSyncVk as fence syncs are currently 77*8975f5c5SAndroid Build Coastguard Worker // identical for the Vulkan backend, and this class implements both interfaces. 78*8975f5c5SAndroid Build Coastguard Worker class SyncHelper final : public vk::Resource, public SyncHelperInterface 79*8975f5c5SAndroid Build Coastguard Worker { 80*8975f5c5SAndroid Build Coastguard Worker public: 81*8975f5c5SAndroid Build Coastguard Worker SyncHelper(); 82*8975f5c5SAndroid Build Coastguard Worker ~SyncHelper() override; 83*8975f5c5SAndroid Build Coastguard Worker 84*8975f5c5SAndroid Build Coastguard Worker angle::Result initialize(ContextVk *contextVk, SyncFenceScope scope); 85*8975f5c5SAndroid Build Coastguard Worker 86*8975f5c5SAndroid Build Coastguard Worker // SyncHelperInterface 87*8975f5c5SAndroid Build Coastguard Worker 88*8975f5c5SAndroid Build Coastguard Worker void releaseToRenderer(Renderer *renderer) override; 89*8975f5c5SAndroid Build Coastguard Worker 90*8975f5c5SAndroid Build Coastguard Worker angle::Result clientWait(Context *context, 91*8975f5c5SAndroid Build Coastguard Worker ContextVk *contextVk, 92*8975f5c5SAndroid Build Coastguard Worker bool flushCommands, 93*8975f5c5SAndroid Build Coastguard Worker uint64_t timeout, 94*8975f5c5SAndroid Build Coastguard Worker MapVkResultToApiType mappingFunction, 95*8975f5c5SAndroid Build Coastguard Worker void *resultOut) override; 96*8975f5c5SAndroid Build Coastguard Worker angle::Result serverWait(ContextVk *contextVk) override; 97*8975f5c5SAndroid Build Coastguard Worker angle::Result getStatus(Context *context, ContextVk *contextVk, bool *signaledOut) override; dupNativeFenceFD(Context * context,int * fdOut)98*8975f5c5SAndroid Build Coastguard Worker angle::Result dupNativeFenceFD(Context *context, int *fdOut) const override 99*8975f5c5SAndroid Build Coastguard Worker { 100*8975f5c5SAndroid Build Coastguard Worker return angle::Result::Stop; 101*8975f5c5SAndroid Build Coastguard Worker } 102*8975f5c5SAndroid Build Coastguard Worker 103*8975f5c5SAndroid Build Coastguard Worker // Used by FenceNVVk. Equivalent of clientWait with infinite timeout, flushCommands == true, 104*8975f5c5SAndroid Build Coastguard Worker // and throw-away return value. 105*8975f5c5SAndroid Build Coastguard Worker angle::Result finish(ContextVk *contextVk); 106*8975f5c5SAndroid Build Coastguard Worker 107*8975f5c5SAndroid Build Coastguard Worker private: 108*8975f5c5SAndroid Build Coastguard Worker angle::Result submitSyncIfDeferred(ContextVk *contextVk, RenderPassClosureReason reason); 109*8975f5c5SAndroid Build Coastguard Worker angle::Result prepareForClientWait(Context *context, 110*8975f5c5SAndroid Build Coastguard Worker ContextVk *contextVk, 111*8975f5c5SAndroid Build Coastguard Worker bool flushCommands, 112*8975f5c5SAndroid Build Coastguard Worker uint64_t timeout, 113*8975f5c5SAndroid Build Coastguard Worker VkResult *resultOut); 114*8975f5c5SAndroid Build Coastguard Worker }; 115*8975f5c5SAndroid Build Coastguard Worker 116*8975f5c5SAndroid Build Coastguard Worker // Implementation of sync types: EGLSync(EGL_SYNC_ANDROID_NATIVE_FENCE_ANDROID). 117*8975f5c5SAndroid Build Coastguard Worker class SyncHelperNativeFence final : public SyncHelperInterface 118*8975f5c5SAndroid Build Coastguard Worker { 119*8975f5c5SAndroid Build Coastguard Worker public: 120*8975f5c5SAndroid Build Coastguard Worker SyncHelperNativeFence(); 121*8975f5c5SAndroid Build Coastguard Worker ~SyncHelperNativeFence() override; 122*8975f5c5SAndroid Build Coastguard Worker 123*8975f5c5SAndroid Build Coastguard Worker angle::Result initializeWithFd(ContextVk *contextVk, int inFd); 124*8975f5c5SAndroid Build Coastguard Worker 125*8975f5c5SAndroid Build Coastguard Worker // SyncHelperInterface 126*8975f5c5SAndroid Build Coastguard Worker 127*8975f5c5SAndroid Build Coastguard Worker void releaseToRenderer(Renderer *renderer) override; 128*8975f5c5SAndroid Build Coastguard Worker 129*8975f5c5SAndroid Build Coastguard Worker angle::Result clientWait(Context *context, 130*8975f5c5SAndroid Build Coastguard Worker ContextVk *contextVk, 131*8975f5c5SAndroid Build Coastguard Worker bool flushCommands, 132*8975f5c5SAndroid Build Coastguard Worker uint64_t timeout, 133*8975f5c5SAndroid Build Coastguard Worker MapVkResultToApiType mappingFunction, 134*8975f5c5SAndroid Build Coastguard Worker void *resultOut) override; 135*8975f5c5SAndroid Build Coastguard Worker angle::Result serverWait(ContextVk *contextVk) override; 136*8975f5c5SAndroid Build Coastguard Worker angle::Result getStatus(Context *context, ContextVk *contextVk, bool *signaledOut) override; 137*8975f5c5SAndroid Build Coastguard Worker angle::Result dupNativeFenceFD(Context *context, int *fdOut) const override; 138*8975f5c5SAndroid Build Coastguard Worker 139*8975f5c5SAndroid Build Coastguard Worker private: 140*8975f5c5SAndroid Build Coastguard Worker angle::Result prepareForClientWait(Context *context, 141*8975f5c5SAndroid Build Coastguard Worker ContextVk *contextVk, 142*8975f5c5SAndroid Build Coastguard Worker bool flushCommands, 143*8975f5c5SAndroid Build Coastguard Worker uint64_t timeout, 144*8975f5c5SAndroid Build Coastguard Worker VkResult *resultOut); 145*8975f5c5SAndroid Build Coastguard Worker 146*8975f5c5SAndroid Build Coastguard Worker SharedExternalFence mExternalFence; 147*8975f5c5SAndroid Build Coastguard Worker }; 148*8975f5c5SAndroid Build Coastguard Worker 149*8975f5c5SAndroid Build Coastguard Worker } // namespace vk 150*8975f5c5SAndroid Build Coastguard Worker 151*8975f5c5SAndroid Build Coastguard Worker // Implementor for glFenceSync. 152*8975f5c5SAndroid Build Coastguard Worker class SyncVk final : public SyncImpl 153*8975f5c5SAndroid Build Coastguard Worker { 154*8975f5c5SAndroid Build Coastguard Worker public: 155*8975f5c5SAndroid Build Coastguard Worker SyncVk(); 156*8975f5c5SAndroid Build Coastguard Worker ~SyncVk() override; 157*8975f5c5SAndroid Build Coastguard Worker 158*8975f5c5SAndroid Build Coastguard Worker void onDestroy(const gl::Context *context) override; 159*8975f5c5SAndroid Build Coastguard Worker 160*8975f5c5SAndroid Build Coastguard Worker angle::Result set(const gl::Context *context, GLenum condition, GLbitfield flags) override; 161*8975f5c5SAndroid Build Coastguard Worker angle::Result clientWait(const gl::Context *context, 162*8975f5c5SAndroid Build Coastguard Worker GLbitfield flags, 163*8975f5c5SAndroid Build Coastguard Worker GLuint64 timeout, 164*8975f5c5SAndroid Build Coastguard Worker GLenum *outResult) override; 165*8975f5c5SAndroid Build Coastguard Worker angle::Result serverWait(const gl::Context *context, 166*8975f5c5SAndroid Build Coastguard Worker GLbitfield flags, 167*8975f5c5SAndroid Build Coastguard Worker GLuint64 timeout) override; 168*8975f5c5SAndroid Build Coastguard Worker angle::Result getStatus(const gl::Context *context, GLint *outResult) override; 169*8975f5c5SAndroid Build Coastguard Worker 170*8975f5c5SAndroid Build Coastguard Worker private: 171*8975f5c5SAndroid Build Coastguard Worker vk::SyncHelper mSyncHelper; 172*8975f5c5SAndroid Build Coastguard Worker }; 173*8975f5c5SAndroid Build Coastguard Worker 174*8975f5c5SAndroid Build Coastguard Worker // Implementor for EGLSync. 175*8975f5c5SAndroid Build Coastguard Worker class EGLSyncVk final : public EGLSyncImpl 176*8975f5c5SAndroid Build Coastguard Worker { 177*8975f5c5SAndroid Build Coastguard Worker public: 178*8975f5c5SAndroid Build Coastguard Worker EGLSyncVk(); 179*8975f5c5SAndroid Build Coastguard Worker ~EGLSyncVk() override; 180*8975f5c5SAndroid Build Coastguard Worker 181*8975f5c5SAndroid Build Coastguard Worker void onDestroy(const egl::Display *display) override; 182*8975f5c5SAndroid Build Coastguard Worker 183*8975f5c5SAndroid Build Coastguard Worker egl::Error initialize(const egl::Display *display, 184*8975f5c5SAndroid Build Coastguard Worker const gl::Context *context, 185*8975f5c5SAndroid Build Coastguard Worker EGLenum type, 186*8975f5c5SAndroid Build Coastguard Worker const egl::AttributeMap &attribs) override; 187*8975f5c5SAndroid Build Coastguard Worker egl::Error clientWait(const egl::Display *display, 188*8975f5c5SAndroid Build Coastguard Worker const gl::Context *context, 189*8975f5c5SAndroid Build Coastguard Worker EGLint flags, 190*8975f5c5SAndroid Build Coastguard Worker EGLTime timeout, 191*8975f5c5SAndroid Build Coastguard Worker EGLint *outResult) override; 192*8975f5c5SAndroid Build Coastguard Worker egl::Error serverWait(const egl::Display *display, 193*8975f5c5SAndroid Build Coastguard Worker const gl::Context *context, 194*8975f5c5SAndroid Build Coastguard Worker EGLint flags) override; 195*8975f5c5SAndroid Build Coastguard Worker egl::Error getStatus(const egl::Display *display, EGLint *outStatus) override; 196*8975f5c5SAndroid Build Coastguard Worker 197*8975f5c5SAndroid Build Coastguard Worker egl::Error dupNativeFenceFD(const egl::Display *display, EGLint *fdOut) const override; 198*8975f5c5SAndroid Build Coastguard Worker 199*8975f5c5SAndroid Build Coastguard Worker private: 200*8975f5c5SAndroid Build Coastguard Worker // SyncHelper or SyncHelperNativeFence decided at run-time. 201*8975f5c5SAndroid Build Coastguard Worker std::unique_ptr<vk::SyncHelperInterface> mSyncHelper; 202*8975f5c5SAndroid Build Coastguard Worker }; 203*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 204*8975f5c5SAndroid Build Coastguard Worker 205*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_RENDERER_VULKAN_FENCESYNCVK_H_ 206