blob: 115e0b1797dcb60ea59ed689d46aa0f2b385fc96 [file] [log] [blame]
bsalomon95740982014-09-04 13:12:37 -07001/*
2 * Copyright 2014 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
bsalomonf96ba022014-09-17 08:05:40 -07008#include "GrGpuResourceRef.h"
bsalomon95740982014-09-04 13:12:37 -07009
bsalomonf96ba022014-09-17 08:05:40 -070010GrGpuResourceRef::GrGpuResourceRef() {
halcanary96fcdcc2015-08-27 07:41:13 -070011 fResource = nullptr;
bsalomon95740982014-09-04 13:12:37 -070012 fOwnRef = false;
13 fPendingIO = false;
bsalomon95740982014-09-04 13:12:37 -070014}
15
bsalomonbcf0a522014-10-08 08:40:09 -070016GrGpuResourceRef::GrGpuResourceRef(GrGpuResource* resource, GrIOType ioType) {
halcanary96fcdcc2015-08-27 07:41:13 -070017 fResource = nullptr;
bsalomon95740982014-09-04 13:12:37 -070018 fOwnRef = false;
19 fPendingIO = false;
20 this->setResource(resource, ioType);
21}
22
bsalomonf96ba022014-09-17 08:05:40 -070023GrGpuResourceRef::~GrGpuResourceRef() {
bsalomon95740982014-09-04 13:12:37 -070024 if (fOwnRef) {
bsalomon49f085d2014-09-05 13:34:00 -070025 SkASSERT(fResource);
bsalomon95740982014-09-04 13:12:37 -070026 fResource->unref();
27 }
28 if (fPendingIO) {
29 switch (fIOType) {
bsalomonbcf0a522014-10-08 08:40:09 -070030 case kRead_GrIOType:
bsalomon95740982014-09-04 13:12:37 -070031 fResource->completedRead();
32 break;
bsalomonbcf0a522014-10-08 08:40:09 -070033 case kWrite_GrIOType:
bsalomon95740982014-09-04 13:12:37 -070034 fResource->completedWrite();
35 break;
bsalomonbcf0a522014-10-08 08:40:09 -070036 case kRW_GrIOType:
bsalomon95740982014-09-04 13:12:37 -070037 fResource->completedRead();
38 fResource->completedWrite();
39 break;
40 }
41 }
42}
43
bsalomonf96ba022014-09-17 08:05:40 -070044void GrGpuResourceRef::reset() {
bsalomon95740982014-09-04 13:12:37 -070045 SkASSERT(!fPendingIO);
bsalomon49f085d2014-09-05 13:34:00 -070046 SkASSERT(SkToBool(fResource) == fOwnRef);
bsalomon95740982014-09-04 13:12:37 -070047 if (fOwnRef) {
48 fResource->unref();
49 fOwnRef = false;
halcanary96fcdcc2015-08-27 07:41:13 -070050 fResource = nullptr;
bsalomon95740982014-09-04 13:12:37 -070051 }
52}
53
bsalomonbcf0a522014-10-08 08:40:09 -070054void GrGpuResourceRef::setResource(GrGpuResource* resource, GrIOType ioType) {
bsalomon95740982014-09-04 13:12:37 -070055 SkASSERT(!fPendingIO);
bsalomon49f085d2014-09-05 13:34:00 -070056 SkASSERT(SkToBool(fResource) == fOwnRef);
bsalomon95740982014-09-04 13:12:37 -070057 SkSafeUnref(fResource);
halcanary96fcdcc2015-08-27 07:41:13 -070058 if (nullptr == resource) {
59 fResource = nullptr;
bsalomon95740982014-09-04 13:12:37 -070060 fOwnRef = false;
bsalomon95740982014-09-04 13:12:37 -070061 } else {
bsalomon95740982014-09-04 13:12:37 -070062 fResource = resource;
63 fOwnRef = true;
64 fIOType = ioType;
65 }
66}
67
bsalomonf96ba022014-09-17 08:05:40 -070068void GrGpuResourceRef::markPendingIO() const {
Robert Phillipsa91e0b72017-05-01 13:12:20 -040069 if (!fResource) {
70 return;
71 }
72
bsalomonac8d6192014-09-04 14:13:44 -070073 // This should only be called when the owning GrProgramElement gets its first
bsalomon95740982014-09-04 13:12:37 -070074 // pendingExecution ref.
75 SkASSERT(!fPendingIO);
bsalomon95740982014-09-04 13:12:37 -070076 fPendingIO = true;
77 switch (fIOType) {
bsalomonbcf0a522014-10-08 08:40:09 -070078 case kRead_GrIOType:
bsalomon95740982014-09-04 13:12:37 -070079 fResource->addPendingRead();
80 break;
bsalomonbcf0a522014-10-08 08:40:09 -070081 case kWrite_GrIOType:
bsalomon95740982014-09-04 13:12:37 -070082 fResource->addPendingWrite();
83 break;
bsalomonbcf0a522014-10-08 08:40:09 -070084 case kRW_GrIOType:
bsalomon95740982014-09-04 13:12:37 -070085 fResource->addPendingRead();
86 fResource->addPendingWrite();
87 break;
bsalomon95740982014-09-04 13:12:37 -070088 }
89}
90
bsalomonf96ba022014-09-17 08:05:40 -070091void GrGpuResourceRef::pendingIOComplete() const {
Robert Phillipsa91e0b72017-05-01 13:12:20 -040092 if (!fResource) {
93 return;
94 }
95
bsalomonac8d6192014-09-04 14:13:44 -070096 // This should only be called when the owner's pending executions have ocurred but it is still
97 // reffed.
98 SkASSERT(fOwnRef);
99 SkASSERT(fPendingIO);
100 switch (fIOType) {
bsalomonbcf0a522014-10-08 08:40:09 -0700101 case kRead_GrIOType:
bsalomonac8d6192014-09-04 14:13:44 -0700102 fResource->completedRead();
103 break;
bsalomonbcf0a522014-10-08 08:40:09 -0700104 case kWrite_GrIOType:
bsalomonac8d6192014-09-04 14:13:44 -0700105 fResource->completedWrite();
106 break;
bsalomonbcf0a522014-10-08 08:40:09 -0700107 case kRW_GrIOType:
bsalomonac8d6192014-09-04 14:13:44 -0700108 fResource->completedRead();
109 fResource->completedWrite();
110 break;
111
112 }
113 fPendingIO = false;
114}
115
bsalomonf96ba022014-09-17 08:05:40 -0700116void GrGpuResourceRef::removeRef() const {
Robert Phillipsa91e0b72017-05-01 13:12:20 -0400117 if (!fResource) {
118 return;
119 }
120
bsalomon95740982014-09-04 13:12:37 -0700121 // This should only be called once, when the owners last ref goes away and
122 // there is a pending execution.
123 SkASSERT(fOwnRef);
124 SkASSERT(fPendingIO);
bsalomon95740982014-09-04 13:12:37 -0700125 fResource->unref();
126 fOwnRef = false;
127}
Robert Phillips952a2432017-05-04 08:52:22 -0400128
129///////////////////////////////////////////////////////////////////////////////
130#include "GrTextureProxy.h"
131
Robert Phillipsb6deea82017-05-11 14:14:30 -0400132GrSurfaceProxyRef::GrSurfaceProxyRef() {
Robert Phillips952a2432017-05-04 08:52:22 -0400133 fProxy = nullptr;
134 fOwnRef = false;
135 fPendingIO = false;
136}
137
Robert Phillipsb6deea82017-05-11 14:14:30 -0400138GrSurfaceProxyRef::GrSurfaceProxyRef(sk_sp<GrSurfaceProxy> proxy, GrIOType ioType) {
Robert Phillips952a2432017-05-04 08:52:22 -0400139 fProxy = nullptr;
140 fOwnRef = false;
141 fPendingIO = false;
Robert Phillipsb6deea82017-05-11 14:14:30 -0400142 this->setProxy(std::move(proxy), ioType);
Robert Phillips952a2432017-05-04 08:52:22 -0400143}
144
Robert Phillipsb6deea82017-05-11 14:14:30 -0400145GrSurfaceProxyRef::~GrSurfaceProxyRef() {
Robert Phillips952a2432017-05-04 08:52:22 -0400146 if (fOwnRef) {
147 SkASSERT(fProxy);
148 fProxy->unref();
149 }
150 if (fPendingIO) {
151 switch (fIOType) {
152 case kRead_GrIOType:
153 fProxy->completedRead();
154 break;
155 case kWrite_GrIOType:
156 fProxy->completedWrite();
157 break;
158 case kRW_GrIOType:
159 fProxy->completedRead();
160 fProxy->completedWrite();
161 break;
162 }
163 }
164}
165
Robert Phillipsb6deea82017-05-11 14:14:30 -0400166void GrSurfaceProxyRef::reset() {
Robert Phillips952a2432017-05-04 08:52:22 -0400167 SkASSERT(!fPendingIO);
168 SkASSERT(SkToBool(fProxy) == fOwnRef);
169 if (fOwnRef) {
170 fProxy->unref();
171 fOwnRef = false;
172 fProxy = nullptr;
173 }
174}
175
Robert Phillipsb6deea82017-05-11 14:14:30 -0400176void GrSurfaceProxyRef::setProxy(sk_sp<GrSurfaceProxy> proxy, GrIOType ioType) {
Robert Phillips952a2432017-05-04 08:52:22 -0400177 SkASSERT(!fPendingIO);
178 SkASSERT(SkToBool(fProxy) == fOwnRef);
179 SkSafeUnref(fProxy);
180 if (!proxy) {
181 fProxy = nullptr;
182 fOwnRef = false;
183 } else {
184 fProxy = proxy.release(); // due to the semantics of this class we unpack from sk_sp
185 fOwnRef = true;
186 fIOType = ioType;
187 }
188}
189
Robert Phillipsb6deea82017-05-11 14:14:30 -0400190void GrSurfaceProxyRef::markPendingIO() const {
Robert Phillips952a2432017-05-04 08:52:22 -0400191 // This should only be called when the owning GrProgramElement gets its first
192 // pendingExecution ref.
193 SkASSERT(!fPendingIO);
194 SkASSERT(fProxy);
195 fPendingIO = true;
196 switch (fIOType) {
197 case kRead_GrIOType:
198 fProxy->addPendingRead();
199 break;
200 case kWrite_GrIOType:
201 fProxy->addPendingWrite();
202 break;
203 case kRW_GrIOType:
204 fProxy->addPendingRead();
205 fProxy->addPendingWrite();
206 break;
207 }
208}
209
Robert Phillipsb6deea82017-05-11 14:14:30 -0400210void GrSurfaceProxyRef::pendingIOComplete() const {
Robert Phillips952a2432017-05-04 08:52:22 -0400211 // This should only be called when the owner's pending executions have ocurred but it is still
212 // reffed.
213 SkASSERT(fOwnRef);
214 SkASSERT(fPendingIO);
215 switch (fIOType) {
216 case kRead_GrIOType:
217 fProxy->completedRead();
218 break;
219 case kWrite_GrIOType:
220 fProxy->completedWrite();
221 break;
222 case kRW_GrIOType:
223 fProxy->completedRead();
224 fProxy->completedWrite();
225 break;
226
227 }
228 fPendingIO = false;
229}
230
Robert Phillipsb6deea82017-05-11 14:14:30 -0400231void GrSurfaceProxyRef::removeRef() const {
Robert Phillips952a2432017-05-04 08:52:22 -0400232 // This should only be called once, when the owners last ref goes away and
233 // there is a pending execution.
234 SkASSERT(fOwnRef);
235 SkASSERT(fPendingIO);
236 SkASSERT(fProxy);
237 fProxy->unref();
238 fOwnRef = false;
239}
240