blob: 8f39e1785e0797d5b76422fcb6d6fe751c0f0926 [file] [log] [blame]
Greg Daniel6be35232017-03-01 17:01:09 -05001/*
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 GrVkSemaphore_DEFINED
9#define GrVkSemaphore_DEFINED
10
11#include "GrSemaphore.h"
Greg Daniel48661b82018-01-22 16:11:35 -050012
13#include "GrResourceProvider.h"
Greg Daniel6be35232017-03-01 17:01:09 -050014#include "GrVkResource.h"
15
16#include "vk/GrVkTypes.h"
17
Greg Daniela5cb7812017-06-16 09:45:32 -040018class GrBackendSemaphore;
Greg Daniel6be35232017-03-01 17:01:09 -050019class GrVkGpu;
20
21class GrVkSemaphore : public GrSemaphore {
22public:
Greg Daniela5cb7812017-06-16 09:45:32 -040023 static sk_sp<GrVkSemaphore> Make(const GrVkGpu* gpu, bool isOwned);
24
Greg Daniel48661b82018-01-22 16:11:35 -050025 using WrapType = GrResourceProvider::SemaphoreWrapType;
26
Greg Daniela5cb7812017-06-16 09:45:32 -040027 static sk_sp<GrVkSemaphore> MakeWrapped(const GrVkGpu* gpu,
28 VkSemaphore semaphore,
Greg Daniel48661b82018-01-22 16:11:35 -050029 WrapType wrapType,
Greg Daniela5cb7812017-06-16 09:45:32 -040030 GrWrapOwnership);
Greg Daniel6be35232017-03-01 17:01:09 -050031
32 ~GrVkSemaphore() override;
33
34 class Resource : public GrVkResource {
35 public:
Greg Daniel48661b82018-01-22 16:11:35 -050036 Resource(VkSemaphore semaphore, bool prohibitSignal, bool prohibitWait, bool isOwned)
37 : INHERITED()
38 , fSemaphore(semaphore)
39 , fHasBeenSubmittedToQueueForSignal(prohibitSignal)
40 , fHasBeenSubmittedToQueueForWait(prohibitWait)
41 , fIsOwned(isOwned) {}
Greg Daniel6be35232017-03-01 17:01:09 -050042
43 ~Resource() override {}
44
45 VkSemaphore semaphore() const { return fSemaphore; }
46
Greg Daniel21580ba2018-06-26 11:26:44 -040047 static void AcquireMutex() { GetMutex()->acquire(); }
48 static void ReleaseMutex() { GetMutex()->release(); }
Greg Daniel48661b82018-01-22 16:11:35 -050049
50 bool shouldSignal() const {
51 return !fHasBeenSubmittedToQueueForSignal;
52 }
53 bool shouldWait() const {
54 return !fHasBeenSubmittedToQueueForWait;
55 }
56
57 void markAsSignaled() {
Greg Daniel21580ba2018-06-26 11:26:44 -040058 GetMutex()->assertHeld();
Greg Daniel48661b82018-01-22 16:11:35 -050059 fHasBeenSubmittedToQueueForSignal = true;
60 }
61 void markAsWaited() {
Greg Daniel21580ba2018-06-26 11:26:44 -040062 GetMutex()->assertHeld();
Greg Daniel48661b82018-01-22 16:11:35 -050063 fHasBeenSubmittedToQueueForWait = true;
64 }
65
Greg Daniel6be35232017-03-01 17:01:09 -050066#ifdef SK_TRACE_VK_RESOURCES
67 void dumpInfo() const override {
68 SkDebugf("GrVkSemaphore: %d (%d refs)\n", fSemaphore, this->getRefCnt());
69 }
70#endif
71 private:
72 void freeGPUData(const GrVkGpu* gpu) const override;
73
Greg Daniel21580ba2018-06-26 11:26:44 -040074 static SkMutex* GetMutex() {
75 static SkMutex kMutex;
76 return &kMutex;
77 }
78
Greg Daniel6be35232017-03-01 17:01:09 -050079 VkSemaphore fSemaphore;
Greg Daniel48661b82018-01-22 16:11:35 -050080 bool fHasBeenSubmittedToQueueForSignal;
81 bool fHasBeenSubmittedToQueueForWait;
Greg Daniela5cb7812017-06-16 09:45:32 -040082 bool fIsOwned;
Greg Daniel6be35232017-03-01 17:01:09 -050083
84 typedef GrVkResource INHERITED;
85 };
86
Greg Daniel48661b82018-01-22 16:11:35 -050087 Resource* getResource() { return fResource; }
Greg Daniel6be35232017-03-01 17:01:09 -050088
89private:
Greg Daniel48661b82018-01-22 16:11:35 -050090 GrVkSemaphore(const GrVkGpu* gpu, VkSemaphore semaphore, bool prohibitSignal, bool prohibitWait,
91 bool isOwned);
Greg Daniela5cb7812017-06-16 09:45:32 -040092
93 void setBackendSemaphore(GrBackendSemaphore*) const override;
Greg Daniel6be35232017-03-01 17:01:09 -050094
Greg Daniel48661b82018-01-22 16:11:35 -050095 Resource* fResource;
Greg Daniel6be35232017-03-01 17:01:09 -050096
97 typedef GrSemaphore INHERITED;
98};
99
100#endif