• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2017 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef GrBackendSemaphore_DEFINED
9 #define GrBackendSemaphore_DEFINED
10 
11 #include "include/gpu/GrTypes.h"
12 
13 #include "include/gpu/gl/GrGLTypes.h"
14 #include "include/gpu/mtl/GrMtlTypes.h"
15 #include "include/gpu/vk/GrVkTypes.h"
16 #ifdef SK_DIRECT3D
17 #include "include/gpu/d3d/GrD3DTypesMinimal.h"
18 #endif
19 
20 /**
21  * Wrapper class for passing into and receiving data from Ganesh about a backend semaphore object.
22  */
23 class GrBackendSemaphore {
24 public:
25     // For convenience we just set the backend here to OpenGL. The GrBackendSemaphore cannot be used
26     // until either initGL or initVulkan are called which will set the appropriate GrBackend.
GrBackendSemaphore()27     GrBackendSemaphore()
28             : fBackend(GrBackendApi::kOpenGL), fGLSync(nullptr), fIsInitialized(false) {}
29 
30 #ifdef SK_DIRECT3D
31     // We only need to specify these if Direct3D is enabled, because it requires special copy
32     // characteristics.
33     ~GrBackendSemaphore();
34     GrBackendSemaphore(const GrBackendSemaphore&);
35     GrBackendSemaphore& operator=(const GrBackendSemaphore&);
36 #endif
37 
initGL(GrGLsync sync)38     void initGL(GrGLsync sync) {
39         fBackend = GrBackendApi::kOpenGL;
40         fGLSync = sync;
41         fIsInitialized = true;
42     }
43 
initVulkan(VkSemaphore semaphore)44     void initVulkan(VkSemaphore semaphore) {
45         fBackend = GrBackendApi::kVulkan;
46         fVkSemaphore = semaphore;
47 #ifdef SK_VULKAN
48         fIsInitialized = true;
49 #else
50         fIsInitialized = false;
51 #endif
52     }
53 
54     // It is the creator's responsibility to ref the MTLEvent passed in here, via __bridge_retained.
55     // The other end will wrap this BackendSemaphore and take the ref, via __bridge_transfer.
initMetal(GrMTLHandle event,uint64_t value)56     void initMetal(GrMTLHandle event, uint64_t value) {
57         fBackend = GrBackendApi::kMetal;
58         fMtlEvent = event;
59         fMtlValue = value;
60 #ifdef SK_METAL
61         fIsInitialized = true;
62 #else
63         fIsInitialized = false;
64 #endif
65     }
66 
67 #ifdef SK_DIRECT3D
initDirect3D(const GrD3DFenceInfo & info)68     void initDirect3D(const GrD3DFenceInfo& info) {
69         fBackend = GrBackendApi::kDirect3D;
70         this->assignD3DFenceInfo(info);
71         fIsInitialized = true;
72     }
73 #endif
74 
isInitialized()75     bool isInitialized() const { return fIsInitialized; }
76 
glSync()77     GrGLsync glSync() const {
78         if (!fIsInitialized || GrBackendApi::kOpenGL != fBackend) {
79             return nullptr;
80         }
81         return fGLSync;
82     }
83 
vkSemaphore()84     VkSemaphore vkSemaphore() const {
85         if (!fIsInitialized || GrBackendApi::kVulkan != fBackend) {
86             return VK_NULL_HANDLE;
87         }
88         return fVkSemaphore;
89     }
90 
mtlSemaphore()91     GrMTLHandle mtlSemaphore() const {
92         if (!fIsInitialized || GrBackendApi::kMetal != fBackend) {
93             return nullptr;
94         }
95         return fMtlEvent;
96     }
97 
mtlValue()98     uint64_t mtlValue() const {
99         if (!fIsInitialized || GrBackendApi::kMetal != fBackend) {
100             return 0;
101         }
102         return fMtlValue;
103     }
104 
105 #ifdef SK_DIRECT3D
106     bool getD3DFenceInfo(GrD3DFenceInfo* outInfo) const;
107 #endif
108 
109 private:
110 #ifdef SK_DIRECT3D
111     void assignD3DFenceInfo(const GrD3DFenceInfo& info);
112 #endif
113 
114     GrBackendApi fBackend;
115     union {
116         GrGLsync    fGLSync;
117         VkSemaphore fVkSemaphore;
118         GrMTLHandle fMtlEvent;    // Expected to be an id<MTLEvent>
119 #ifdef SK_DIRECT3D
120         GrD3DFenceInfo* fD3DFenceInfo;
121 #endif
122     };
123     uint64_t fMtlValue;
124     bool fIsInitialized;
125 };
126 
127 #endif
128