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 "GrTypes.h"
12
13#include "gl/GrGLTypes.h"
14
15#ifdef SK_VULKAN
16#include "vk/GrVkTypes.h"
17#endif
18
19/**
20 * Wrapper class for passing into and receiving data from Ganesh about a backend semaphore object.
21 */
22class GrBackendSemaphore {
23public:
24    // For convenience we just set the backend here to OpenGL. The GrBackendSemaphore cannot be used
25    // until either initGL or initVulkan are called which will set the appropriate GrBackend.
26    GrBackendSemaphore() : fBackend(kOpenGL_GrBackend), fGLSync(0), fIsInitialized(false) {}
27
28    void initGL(GrGLsync sync) {
29        fBackend = kOpenGL_GrBackend;
30        fGLSync = sync;
31        fIsInitialized = true;
32    }
33
34#ifdef SK_VULKAN
35    void initVulkan(VkSemaphore semaphore) {
36        fBackend = kVulkan_GrBackend;
37        fVkSemaphore = semaphore;
38        fIsInitialized = true;
39    }
40#endif
41
42    bool isInitialized() const { return fIsInitialized; }
43
44    GrGLsync glSync() const {
45        if (!fIsInitialized || kOpenGL_GrBackend != fBackend) {
46            return 0;
47        }
48        return fGLSync;
49    }
50
51#ifdef SK_VULKAN
52    VkSemaphore vkSemaphore() const {
53        if (!fIsInitialized || kVulkan_GrBackend != fBackend) {
54            return VK_NULL_HANDLE;
55        }
56        return fVkSemaphore;
57    }
58#endif
59
60private:
61    GrBackend fBackend;
62    union {
63        GrGLsync    fGLSync;
64#ifdef SK_VULKAN
65        VkSemaphore fVkSemaphore;
66#endif
67    };
68    bool fIsInitialized;
69};
70
71#endif
72