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