blob: d90a498c40fb7c11f37e571acbfb1d2285d5204b [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"
Greg Daniel6be35232017-03-01 17:01:09 -050015#include "vk/GrVkTypes.h"
16
Greg Daniela5cb7812017-06-16 09:45:32 -040017class GrBackendSemaphore;
Greg Daniel6be35232017-03-01 17:01:09 -050018class GrVkGpu;
19
20class GrVkSemaphore : public GrSemaphore {
21public:
Brian Salomon62db8d52018-08-30 10:37:47 -040022 static sk_sp<GrVkSemaphore> Make(GrVkGpu* gpu, bool isOwned);
Greg Daniela5cb7812017-06-16 09:45:32 -040023
Greg Daniel48661b82018-01-22 16:11:35 -050024 using WrapType = GrResourceProvider::SemaphoreWrapType;
25
Brian Salomon62db8d52018-08-30 10:37:47 -040026 static sk_sp<GrVkSemaphore> MakeWrapped(GrVkGpu* gpu,
Greg Daniela5cb7812017-06-16 09:45:32 -040027 VkSemaphore semaphore,
Greg Daniel48661b82018-01-22 16:11:35 -050028 WrapType wrapType,
Greg Daniela5cb7812017-06-16 09:45:32 -040029 GrWrapOwnership);
Greg Daniel6be35232017-03-01 17:01:09 -050030
Brian Salomon1e576e72018-08-30 10:20:38 -040031 GrBackendSemaphore backendSemaphore() const override;
32
Greg Daniel6be35232017-03-01 17:01:09 -050033 class Resource : public GrVkResource {
34 public:
Greg Daniel48661b82018-01-22 16:11:35 -050035 Resource(VkSemaphore semaphore, bool prohibitSignal, bool prohibitWait, bool isOwned)
36 : INHERITED()
37 , fSemaphore(semaphore)
38 , fHasBeenSubmittedToQueueForSignal(prohibitSignal)
39 , fHasBeenSubmittedToQueueForWait(prohibitWait)
40 , fIsOwned(isOwned) {}
Greg Daniel6be35232017-03-01 17:01:09 -050041
42 ~Resource() override {}
43
44 VkSemaphore semaphore() const { return fSemaphore; }
45
Greg Daniel21580ba2018-06-26 11:26:44 -040046 static void AcquireMutex() { GetMutex()->acquire(); }
47 static void ReleaseMutex() { GetMutex()->release(); }
Greg Daniel48661b82018-01-22 16:11:35 -050048
49 bool shouldSignal() const {
50 return !fHasBeenSubmittedToQueueForSignal;
51 }
52 bool shouldWait() const {
53 return !fHasBeenSubmittedToQueueForWait;
54 }
55
56 void markAsSignaled() {
Greg Daniel21580ba2018-06-26 11:26:44 -040057 GetMutex()->assertHeld();
Greg Daniel48661b82018-01-22 16:11:35 -050058 fHasBeenSubmittedToQueueForSignal = true;
59 }
60 void markAsWaited() {
Greg Daniel21580ba2018-06-26 11:26:44 -040061 GetMutex()->assertHeld();
Greg Daniel48661b82018-01-22 16:11:35 -050062 fHasBeenSubmittedToQueueForWait = true;
63 }
64
Greg Daniel6be35232017-03-01 17:01:09 -050065#ifdef SK_TRACE_VK_RESOURCES
66 void dumpInfo() const override {
67 SkDebugf("GrVkSemaphore: %d (%d refs)\n", fSemaphore, this->getRefCnt());
68 }
69#endif
70 private:
Ethan Nicholas8e265a72018-12-12 16:22:40 -050071 void freeGPUData(GrVkGpu* gpu) const override;
Greg Daniel6be35232017-03-01 17:01:09 -050072
Greg Daniel21580ba2018-06-26 11:26:44 -040073 static SkMutex* GetMutex() {
74 static SkMutex kMutex;
75 return &kMutex;
76 }
77
Greg Daniel6be35232017-03-01 17:01:09 -050078 VkSemaphore fSemaphore;
Greg Daniel48661b82018-01-22 16:11:35 -050079 bool fHasBeenSubmittedToQueueForSignal;
80 bool fHasBeenSubmittedToQueueForWait;
Greg Daniela5cb7812017-06-16 09:45:32 -040081 bool fIsOwned;
Greg Daniel6be35232017-03-01 17:01:09 -050082
83 typedef GrVkResource INHERITED;
84 };
85
Greg Daniel48661b82018-01-22 16:11:35 -050086 Resource* getResource() { return fResource; }
Greg Daniel6be35232017-03-01 17:01:09 -050087
88private:
Brian Salomon62db8d52018-08-30 10:37:47 -040089 GrVkSemaphore(GrVkGpu* gpu, VkSemaphore semaphore, bool prohibitSignal, bool prohibitWait,
Greg Daniel48661b82018-01-22 16:11:35 -050090 bool isOwned);
Greg Daniela5cb7812017-06-16 09:45:32 -040091
Brian Salomon62db8d52018-08-30 10:37:47 -040092 void onRelease() override;
93 void onAbandon() override;
94
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