Skia
2D Graphics Library
GrBackendSemaphore.h
Go to the documentation of this file.
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 
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.
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.
35  GrBackendSemaphore& operator=(const GrBackendSemaphore&);
36 #endif
37 
38  void initGL(GrGLsync sync) {
39  fBackend = GrBackendApi::kOpenGL;
40  fGLSync = sync;
41  fIsInitialized = true;
42  }
43 
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.
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
68  void initDirect3D(const GrD3DFenceInfo& info) {
69  fBackend = GrBackendApi::kDirect3D;
70  this->assignD3DFenceInfo(info);
71  fIsInitialized = true;
72  }
73 #endif
74 
75  bool isInitialized() const { return fIsInitialized; }
76 
77  GrGLsync glSync() const {
78  if (!fIsInitialized || GrBackendApi::kOpenGL != fBackend) {
79  return nullptr;
80  }
81  return fGLSync;
82  }
83 
84  VkSemaphore vkSemaphore() const {
85  if (!fIsInitialized || GrBackendApi::kVulkan != fBackend) {
86  return VK_NULL_HANDLE;
87  }
88  return fVkSemaphore;
89  }
90 
91  GrMTLHandle mtlSemaphore() const {
92  if (!fIsInitialized || GrBackendApi::kMetal != fBackend) {
93  return nullptr;
94  }
95  return fMtlEvent;
96  }
97 
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
GrBackendSemaphore::mtlSemaphore
GrMTLHandle mtlSemaphore() const
Definition: GrBackendSemaphore.h:91
GrBackendSemaphore::glSync
GrGLsync glSync() const
Definition: GrBackendSemaphore.h:77
GrBackendSemaphore::vkSemaphore
VkSemaphore vkSemaphore() const
Definition: GrBackendSemaphore.h:84
GrBackendSemaphore::GrBackendSemaphore
GrBackendSemaphore()
Definition: GrBackendSemaphore.h:27
GrBackendSemaphore::initGL
void initGL(GrGLsync sync)
Definition: GrBackendSemaphore.h:38
GrBackendSemaphore::mtlValue
uint64_t mtlValue() const
Definition: GrBackendSemaphore.h:98
GrBackendApi::kDirect3D
@ kDirect3D
GrBackendSemaphore
Wrapper class for passing into and receiving data from Ganesh about a backend semaphore object.
Definition: GrBackendSemaphore.h:23
GrBackendApi::kVulkan
@ kVulkan
GrBackendSemaphore::fMtlEvent
GrMTLHandle fMtlEvent
Definition: GrBackendSemaphore.h:118
GrBackendApi::kOpenGL
@ kOpenGL
GrBackendApi
GrBackendApi
Possible 3D APIs that may be used by Ganesh.
Definition: GrTypes.h:135
GrTypes.h
GrBackendSemaphore::fVkSemaphore
VkSemaphore fVkSemaphore
Definition: GrBackendSemaphore.h:117
GrBackendSemaphore::isInitialized
bool isInitialized() const
Definition: GrBackendSemaphore.h:75
GrBackendApi::kMetal
@ kMetal
GrBackendSemaphore::fGLSync
GrGLsync fGLSync
Definition: GrBackendSemaphore.h:116
GrBackendSemaphore::initVulkan
void initVulkan(VkSemaphore semaphore)
Definition: GrBackendSemaphore.h:44
GrBackendSemaphore::initMetal
void initMetal(GrMTLHandle event, uint64_t value)
Definition: GrBackendSemaphore.h:56