blob: 02cbe241fb6796f9f68400fe817d7d84ded2eded [file] [log] [blame]
robertphillips76948d42016-05-04 12:47:41 -07001/*
2 * Copyright 2016 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 GrSurfaceProxy_DEFINED
9#define GrSurfaceProxy_DEFINED
10
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/core/SkRect.h"
12#include "include/gpu/GrBackendSurface.h"
13#include "include/gpu/GrGpuResource.h"
14#include "include/gpu/GrSurface.h"
15#include "include/gpu/GrTexture.h"
16#include "include/private/SkNoncopyable.h"
Greg Daniel2c19e7f2019-06-18 13:29:21 -040017#include "src/gpu/GrSwizzle.h"
robertphillips76948d42016-05-04 12:47:41 -070018
Robert Phillips37430132016-11-09 06:50:43 -050019class GrCaps;
Robert Phillips292a6b22019-02-14 14:49:02 -050020class GrContext_Base;
Robert Phillipsc589b0b2017-04-17 07:53:07 -040021class GrOpList;
Robert Phillipsd44146b2019-02-15 14:44:28 -050022class GrRecordingContext;
Brian Osman45580d32016-11-23 09:37:01 -050023class GrRenderTargetOpList;
24class GrRenderTargetProxy;
Brian Osman32342f02017-03-04 08:12:46 -050025class GrResourceProvider;
Robert Phillipsd46697a2017-01-25 12:10:37 -050026class GrSurfaceContext;
Robert Phillips757914d2017-01-25 15:48:30 -050027class GrSurfaceProxyPriv;
Brian Osman45580d32016-11-23 09:37:01 -050028class GrTextureOpList;
robertphillips76948d42016-05-04 12:47:41 -070029class GrTextureProxy;
robertphillips76948d42016-05-04 12:47:41 -070030
Robert Phillipsb5204762019-06-19 14:12:13 -040031// This is basically SkRefCntBase except Ganesh uses internalGetProxyRefCnt for more than asserts.
Robert Phillipsc7635fa2016-10-28 13:25:24 -040032class GrIORefProxy : public SkNoncopyable {
33public:
Robert Phillipsb5204762019-06-19 14:12:13 -040034 GrIORefProxy() : fRefCnt(1) {}
35
36 virtual ~GrIORefProxy() {}
37
38 bool unique() const {
39 SkASSERT(fRefCnt > 0);
40 return 1 == fRefCnt;
41 }
42
Robert Phillipsc7635fa2016-10-28 13:25:24 -040043 void ref() const {
Robert Phillipsb5204762019-06-19 14:12:13 -040044 SkASSERT(fRefCnt > 0);
Robert Phillipsc7635fa2016-10-28 13:25:24 -040045 ++fRefCnt;
Robert Phillipsc7635fa2016-10-28 13:25:24 -040046 }
47
48 void unref() const {
Robert Phillipsb5204762019-06-19 14:12:13 -040049 SkASSERT(fRefCnt > 0);
Robert Phillipse5f73282019-06-18 17:15:04 -040050 --fRefCnt;
Robert Phillips3d4cac52019-06-11 08:08:08 -040051 if (0 == fRefCnt) {
Robert Phillipsb6deea82017-05-11 14:14:30 -040052 delete this;
53 }
robertphillips1125a032016-11-16 11:17:17 -080054 }
55
Robert Phillipse5f73282019-06-18 17:15:04 -040056protected:
Robert Phillipse5f73282019-06-18 17:15:04 -040057 int32_t internalGetProxyRefCnt() const { return fRefCnt; }
58
Robert Phillipse5f73282019-06-18 17:15:04 -040059private:
robertphillips1125a032016-11-16 11:17:17 -080060 mutable int32_t fRefCnt;
Robert Phillipsc7635fa2016-10-28 13:25:24 -040061};
62
63class GrSurfaceProxy : public GrIORefProxy {
robertphillips76948d42016-05-04 12:47:41 -070064public:
Brian Salomonb6a3a3b2019-04-01 12:29:34 -040065 /**
66 * Some lazy proxy callbacks want to set their own (or no key) on the GrSurfaces they return.
67 * Others want the GrSurface's key to be kept in sync with the proxy's key. This enum controls
68 * the key relationship between proxies and their targets.
69 */
70 enum class LazyInstantiationKeyMode {
71 /**
72 * Don't key the GrSurface with the proxy's key. The lazy instantiation callback is free to
73 * return a GrSurface that already has a unique key unrelated to the proxy's key.
74 */
75 kUnsynced,
76 /**
77 * Keep the GrSurface's unique key in sync with the proxy's unique key. The GrSurface
78 * returned from the lazy instantiation callback must not have a unique key or have the same
79 * same unique key as the proxy. If the proxy is later assigned a key it is in turn assigned
80 * to the GrSurface.
81 */
82 kSynced
83 };
84
85 struct LazyInstantiationResult {
86 LazyInstantiationResult() = default;
87 LazyInstantiationResult(const LazyInstantiationResult&) = default;
88 LazyInstantiationResult(LazyInstantiationResult&& that) = default;
89 LazyInstantiationResult(sk_sp<GrSurface> surf,
90 LazyInstantiationKeyMode mode = LazyInstantiationKeyMode::kSynced)
91 : fSurface(std::move(surf)), fKeyMode(mode) {}
92 LazyInstantiationResult(sk_sp<GrTexture> tex)
93 : LazyInstantiationResult(sk_sp<GrSurface>(std::move(tex))) {}
94
95 LazyInstantiationResult& operator=(const LazyInstantiationResult&) = default;
96 LazyInstantiationResult& operator=(LazyInstantiationResult&&) = default;
97
98 sk_sp<GrSurface> fSurface;
99 LazyInstantiationKeyMode fKeyMode = LazyInstantiationKeyMode::kSynced;
100 };
101
102 using LazyInstantiateCallback = std::function<LazyInstantiationResult(GrResourceProvider*)>;
103
Greg Daniel457469c2018-02-08 15:05:44 -0500104 enum class LazyInstantiationType {
Brian Salomon967df202018-12-07 11:15:53 -0500105 kSingleUse, // Instantiation callback is allowed to be called only once.
106 kMultipleUse, // Instantiation callback can be called multiple times.
Brian Salomon876a0172019-03-08 11:12:14 -0500107 kDeinstantiate, // Instantiation callback can be called multiple times,
108 // but we will deinstantiate the proxy after every flush.
Greg Daniel457469c2018-02-08 15:05:44 -0500109 };
110
Greg Daniel65fa8ca2018-01-10 17:06:31 -0500111 enum class LazyState {
Greg Daniel0a375db2018-02-01 12:21:39 -0500112 kNot, // The proxy is instantiated or does not have a lazy callback
Greg Daniel65fa8ca2018-01-10 17:06:31 -0500113 kPartially, // The proxy has a lazy callback but knows basic information about itself.
114 kFully, // The proxy has a lazy callback and also doesn't know its width, height, etc.
115 };
116
117 LazyState lazyInstantiationState() const {
Robert Phillipse5f73282019-06-18 17:15:04 -0400118 if (this->isInstantiated() || !SkToBool(fLazyInstantiateCallback)) {
Greg Daniel65fa8ca2018-01-10 17:06:31 -0500119 return LazyState::kNot;
120 } else {
121 if (fWidth <= 0) {
122 SkASSERT(fHeight <= 0);
123 return LazyState::kFully;
124 } else {
125 SkASSERT(fHeight > 0);
126 return LazyState::kPartially;
127 }
128 }
129 }
Chris Dalton706a6ff2017-11-29 22:01:06 -0700130
131 GrPixelConfig config() const { return fConfig; }
Greg Daniel65fa8ca2018-01-10 17:06:31 -0500132 int width() const {
133 SkASSERT(LazyState::kFully != this->lazyInstantiationState());
134 return fWidth;
135 }
136 int height() const {
137 SkASSERT(LazyState::kFully != this->lazyInstantiationState());
138 return fHeight;
139 }
Brian Salomon7eae3e02018-08-07 14:02:38 +0000140
141 SkISize isize() const { return {fWidth, fHeight}; }
142
Chris Dalton706a6ff2017-11-29 22:01:06 -0700143 int worstCaseWidth() const;
144 int worstCaseHeight() const;
Brian Salomond8eb7b62018-05-25 10:08:05 -0400145 /**
146 * Helper that gets the width and height of the surface as a bounding rectangle.
147 */
148 SkRect getBoundsRect() const {
149 SkASSERT(LazyState::kFully != this->lazyInstantiationState());
150 return SkRect::MakeIWH(this->width(), this->height());
151 }
152 /**
153 * Helper that gets the worst case width and height of the surface as a bounding rectangle.
154 */
155 SkRect getWorstCaseBoundsRect() const {
156 SkASSERT(LazyState::kFully != this->lazyInstantiationState());
157 return SkRect::MakeIWH(this->worstCaseWidth(), this->worstCaseHeight());
158 }
159
robertphillips76948d42016-05-04 12:47:41 -0700160 GrSurfaceOrigin origin() const {
Brian Salomonbb5711a2017-05-17 13:49:59 -0400161 SkASSERT(kTopLeft_GrSurfaceOrigin == fOrigin || kBottomLeft_GrSurfaceOrigin == fOrigin);
162 return fOrigin;
robertphillips76948d42016-05-04 12:47:41 -0700163 }
Chris Dalton706a6ff2017-11-29 22:01:06 -0700164
Greg Daniel2c19e7f2019-06-18 13:29:21 -0400165 const GrSwizzle& textureSwizzle() const { return fTextureSwizzle; }
166
Greg Daniel4065d452018-11-16 15:43:41 -0500167 const GrBackendFormat& backendFormat() const { return fFormat; }
168
Robert Phillips294870f2016-11-11 12:38:40 -0500169 class UniqueID {
170 public:
Robert Phillips7ee385e2017-03-30 08:02:11 -0400171 static UniqueID InvalidID() {
172 return UniqueID(uint32_t(SK_InvalidUniqueID));
173 }
174
Robert Phillips294870f2016-11-11 12:38:40 -0500175 // wrapped
176 explicit UniqueID(const GrGpuResource::UniqueID& id) : fID(id.asUInt()) { }
Chris Dalton706a6ff2017-11-29 22:01:06 -0700177 // deferred and lazy-callback
Robert Phillips294870f2016-11-11 12:38:40 -0500178 UniqueID() : fID(GrGpuResource::CreateUniqueID()) { }
179
180 uint32_t asUInt() const { return fID; }
181
182 bool operator==(const UniqueID& other) const {
183 return fID == other.fID;
184 }
185 bool operator!=(const UniqueID& other) const {
186 return !(*this == other);
187 }
188
Robert Phillips7ee385e2017-03-30 08:02:11 -0400189 void makeInvalid() { fID = SK_InvalidUniqueID; }
Robert Phillips294870f2016-11-11 12:38:40 -0500190 bool isInvalid() const { return SK_InvalidUniqueID == fID; }
191
192 private:
Robert Phillips7ee385e2017-03-30 08:02:11 -0400193 explicit UniqueID(uint32_t id) : fID(id) {}
194
195 uint32_t fID;
Robert Phillips294870f2016-11-11 12:38:40 -0500196 };
197
198 /*
199 * The contract for the uniqueID is:
200 * for wrapped resources:
201 * the uniqueID will match that of the wrapped resource
202 *
203 * for deferred resources:
204 * the uniqueID will be different from the real resource, when it is allocated
205 * the proxy's uniqueID will not change across the instantiate call
206 *
207 * the uniqueIDs of the proxies and the resources draw from the same pool
208 *
209 * What this boils down to is that the uniqueID of a proxy can be used to consistently
210 * track/identify a proxy but should never be used to distinguish between
211 * resources and proxies - beware!
212 */
213 UniqueID uniqueID() const { return fUniqueID; }
robertphillips76948d42016-05-04 12:47:41 -0700214
Robert Phillips159e3c62017-06-19 12:02:00 -0400215 UniqueID underlyingUniqueID() const {
216 if (fTarget) {
217 return UniqueID(fTarget->uniqueID());
218 }
219
220 return fUniqueID;
221 }
222
Robert Phillips10d17212019-04-24 14:09:10 -0400223 virtual bool instantiate(GrResourceProvider*) = 0;
Robert Phillips37430132016-11-09 06:50:43 -0500224
Brian Salomon967df202018-12-07 11:15:53 -0500225 void deinstantiate();
Robert Phillips4bc70112018-03-01 10:24:02 -0500226
robertphillips76948d42016-05-04 12:47:41 -0700227 /**
Brian Salomon7d94bb52018-10-12 14:37:19 -0400228 * Proxies that are already instantiated and whose backing surface cannot be recycled to
229 * instantiate other proxies do not need to be considered by GrResourceAllocator.
230 */
231 bool canSkipResourceAllocator() const;
232
233 /**
robertphillips76948d42016-05-04 12:47:41 -0700234 * @return the texture proxy associated with the surface proxy, may be NULL.
235 */
236 virtual GrTextureProxy* asTextureProxy() { return nullptr; }
237 virtual const GrTextureProxy* asTextureProxy() const { return nullptr; }
238
239 /**
240 * @return the render target proxy associated with the surface proxy, may be NULL.
241 */
242 virtual GrRenderTargetProxy* asRenderTargetProxy() { return nullptr; }
243 virtual const GrRenderTargetProxy* asRenderTargetProxy() const { return nullptr; }
244
Brian Salomonfd98c2c2018-07-31 17:25:29 -0400245 bool isInstantiated() const { return SkToBool(fTarget); }
246
247 // If the proxy is already instantiated, return its backing GrTexture; if not, return null.
Robert Phillipse5f73282019-06-18 17:15:04 -0400248 GrSurface* peekSurface() const { return fTarget.get(); }
Brian Salomonfd98c2c2018-07-31 17:25:29 -0400249
250 // If this is a texture proxy and the proxy is already instantiated, return its backing
251 // GrTexture; if not, return null.
252 GrTexture* peekTexture() const { return fTarget ? fTarget->asTexture() : nullptr; }
253
254 // If this is a render target proxy and the proxy is already instantiated, return its backing
255 // GrRenderTarget; if not, return null.
256 GrRenderTarget* peekRenderTarget() const {
257 return fTarget ? fTarget->asRenderTarget() : nullptr;
258 }
259
robertphillips13a7eee2016-08-31 15:06:24 -0700260 /**
261 * Does the resource count against the resource budget?
262 */
263 SkBudgeted isBudgeted() const { return fBudgeted; }
264
Brian Salomonc67c31c2018-12-06 10:00:03 -0500265 /**
266 * The pixel values of this proxy's surface cannot be modified (e.g. doesn't support write
Brian Salomon9cadc312018-12-05 15:09:19 -0500267 * pixels or MIP map level regen). Read-only proxies also bypass interval tracking and
268 * assignment in GrResourceAllocator.
Brian Salomonc67c31c2018-12-06 10:00:03 -0500269 */
270 bool readOnly() const { return fSurfaceFlags & GrInternalSurfaceFlags::kReadOnly; }
271
Robert Phillipsf2361d22016-10-25 14:20:06 -0400272 void setLastOpList(GrOpList* opList);
273 GrOpList* getLastOpList() { return fLastOpList; }
274
Brian Osman45580d32016-11-23 09:37:01 -0500275 GrRenderTargetOpList* getLastRenderTargetOpList();
276 GrTextureOpList* getLastTextureOpList();
277
Robert Phillips8bc06d02016-11-01 17:28:40 -0400278 /**
Robert Phillipsf5442bb2017-04-17 14:18:34 -0400279 * Retrieves the amount of GPU memory that will be or currently is used by this resource
Robert Phillips8bc06d02016-11-01 17:28:40 -0400280 * in bytes. It is approximate since we aren't aware of additional padding or copies made
281 * by the driver.
282 *
283 * @return the amount of GPU memory used in bytes
284 */
285 size_t gpuMemorySize() const {
Greg Daniel65fa8ca2018-01-10 17:06:31 -0500286 SkASSERT(LazyState::kFully != this->lazyInstantiationState());
Brian Salomonbb5711a2017-05-17 13:49:59 -0400287 if (fTarget) {
288 return fTarget->gpuMemorySize();
289 }
Robert Phillips8bc06d02016-11-01 17:28:40 -0400290 if (kInvalidGpuMemorySize == fGpuMemorySize) {
Brian Salomonbb5711a2017-05-17 13:49:59 -0400291 fGpuMemorySize = this->onUninstantiatedGpuMemorySize();
Robert Phillips8bc06d02016-11-01 17:28:40 -0400292 SkASSERT(kInvalidGpuMemorySize != fGpuMemorySize);
293 }
294 return fGpuMemorySize;
295 }
296
Greg Daniel46cfbc62019-06-07 11:43:30 -0400297 enum class RectsMustMatch : bool {
298 kNo = false,
299 kYes = true
300 };
301
Robert Phillipse2f7d182016-12-15 09:23:05 -0500302 // Helper function that creates a temporary SurfaceContext to perform the copy
Brian Salomonfee3f9b2018-12-19 12:34:12 -0500303 // The copy is is not a render target and not multisampled.
Robert Phillipsd44146b2019-02-15 14:44:28 -0500304 static sk_sp<GrTextureProxy> Copy(GrRecordingContext*, GrSurfaceProxy* src, GrMipMapped,
Greg Daniel46cfbc62019-06-07 11:43:30 -0400305 SkIRect srcRect, SkBackingFit, SkBudgeted,
306 RectsMustMatch = RectsMustMatch::kNo);
Robert Phillipse2f7d182016-12-15 09:23:05 -0500307
308 // Copy the entire 'src'
Robert Phillipsd44146b2019-02-15 14:44:28 -0500309 static sk_sp<GrTextureProxy> Copy(GrRecordingContext*, GrSurfaceProxy* src, GrMipMapped,
310 SkBackingFit, SkBudgeted);
Robert Phillipse2f7d182016-12-15 09:23:05 -0500311
Robert Phillipsb5204762019-06-19 14:12:13 -0400312#if GR_TEST_UTILS
313 int32_t testingOnly_getBackingRefCnt() const;
314 GrInternalSurfaceFlags testingOnly_getFlags() const;
315#endif
Robert Phillipseaa86252016-11-08 13:49:39 +0000316
Robert Phillips292a6b22019-02-14 14:49:02 -0500317 SkDEBUGCODE(void validate(GrContext_Base*) const;)
Brian Osman45580d32016-11-23 09:37:01 -0500318
Robert Phillips757914d2017-01-25 15:48:30 -0500319 // Provides access to functions that aren't part of the public API.
Robert Phillips420c4cf2017-09-28 09:00:45 -0400320 inline GrSurfaceProxyPriv priv();
321 inline const GrSurfaceProxyPriv priv() const;
Robert Phillips757914d2017-01-25 15:48:30 -0500322
Emircan Uysaler23ca4e72019-06-24 10:53:09 -0400323 // Returns true if we are working with protected content.
324 bool isProtected() const { return fIsProtected == GrProtected::kYes; }
325
robertphillips76948d42016-05-04 12:47:41 -0700326protected:
robertphillips8abb3702016-08-31 14:04:06 -0700327 // Deferred version
Greg Daniel4065d452018-11-16 15:43:41 -0500328 GrSurfaceProxy(const GrBackendFormat& format, const GrSurfaceDesc& desc,
Greg Daniel2c19e7f2019-06-18 13:29:21 -0400329 GrSurfaceOrigin origin, const GrSwizzle& textureSwizzle, SkBackingFit fit,
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400330 SkBudgeted budgeted, GrInternalSurfaceFlags surfaceFlags)
Greg Daniel2c19e7f2019-06-18 13:29:21 -0400331 : GrSurfaceProxy(nullptr, LazyInstantiationType::kSingleUse, format, desc, origin,
332 textureSwizzle, fit, budgeted, surfaceFlags) {
Robert Phillips294870f2016-11-11 12:38:40 -0500333 // Note: this ctor pulls a new uniqueID from the same pool at the GrGpuResources
robertphillips8abb3702016-08-31 14:04:06 -0700334 }
335
Chris Dalton706a6ff2017-11-29 22:01:06 -0700336 // Lazy-callback version
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400337 GrSurfaceProxy(LazyInstantiateCallback&&, LazyInstantiationType,
Greg Daniel4065d452018-11-16 15:43:41 -0500338 const GrBackendFormat& format, const GrSurfaceDesc&, GrSurfaceOrigin,
Greg Daniel2c19e7f2019-06-18 13:29:21 -0400339 const GrSwizzle& textureSwizzle, SkBackingFit, SkBudgeted,
340 GrInternalSurfaceFlags);
Chris Dalton706a6ff2017-11-29 22:01:06 -0700341
Brian Salomonc67c31c2018-12-06 10:00:03 -0500342 // Wrapped version.
Greg Daniel2c19e7f2019-06-18 13:29:21 -0400343 GrSurfaceProxy(sk_sp<GrSurface>, GrSurfaceOrigin, const GrSwizzle& textureSwizzle,
344 SkBackingFit);
robertphillips76948d42016-05-04 12:47:41 -0700345
Robert Phillipsb5204762019-06-19 14:12:13 -0400346 ~GrSurfaceProxy() override;
Robert Phillipsf2361d22016-10-25 14:20:06 -0400347
Robert Phillips757914d2017-01-25 15:48:30 -0500348 friend class GrSurfaceProxyPriv;
349
350 // Methods made available via GrSurfaceProxyPriv
Robert Phillips5f78adf2019-04-22 12:41:39 -0400351 bool ignoredByResourceAllocator() const { return fIgnoredByResourceAllocator; }
352 void setIgnoredByResourceAllocator() { fIgnoredByResourceAllocator = true; }
353
354 int32_t getProxyRefCnt() const { return this->internalGetProxyRefCnt(); }
Robert Phillips715d08c2018-07-18 13:56:48 -0400355
Robert Phillips57aa3672017-07-21 11:38:13 -0400356 void computeScratchKey(GrScratchKey*) const;
357
Robert Phillips5af44de2017-07-18 14:49:38 -0400358 virtual sk_sp<GrSurface> createSurface(GrResourceProvider*) const = 0;
359 void assign(sk_sp<GrSurface> surface);
360
Robert Phillips65048132017-08-10 08:44:49 -0400361 sk_sp<GrSurface> createSurfaceImpl(GrResourceProvider*, int sampleCnt, bool needsStencil,
Robert Phillips10d17212019-04-24 14:09:10 -0400362 GrSurfaceDescFlags, GrMipMapped) const;
Robert Phillips5af44de2017-07-18 14:49:38 -0400363
Chris Daltonf91b7552019-04-29 16:21:18 -0600364 // Once the size of a fully-lazy proxy is decided, and before it gets instantiated, the client
365 // can use this optional method to specify the proxy's size. (A proxy's size can be less than
366 // the GPU surface that backs it. e.g., SkBackingFit::kApprox.) Otherwise, the proxy's size will
367 // be set to match the underlying GPU surface upon instantiation.
368 void setLazySize(int width, int height) {
369 SkASSERT(GrSurfaceProxy::LazyState::kFully == this->lazyInstantiationState());
370 SkASSERT(width > 0 && height > 0);
371 fWidth = width;
372 fHeight = height;
373 }
374
Robert Phillips65048132017-08-10 08:44:49 -0400375 bool instantiateImpl(GrResourceProvider* resourceProvider, int sampleCnt, bool needsStencil,
Robert Phillips10d17212019-04-24 14:09:10 -0400376 GrSurfaceDescFlags descFlags, GrMipMapped, const GrUniqueKey*);
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400377
Robert Phillipsb5204762019-06-19 14:12:13 -0400378 // For deferred proxies this will be null until the proxy is instantiated.
379 // For wrapped proxies it will point to the wrapped resource.
380 sk_sp<GrSurface> fTarget;
381
Greg Daniele3204862018-04-16 11:24:10 -0400382 // In many cases these flags aren't actually known until the proxy has been instantiated.
383 // However, Ganesh frequently needs to change its behavior based on these settings. For
384 // internally create proxies we will know these properties ahead of time. For wrapped
385 // proxies we will copy the properties off of the GrSurface. For lazy proxies we force the
386 // call sites to provide the required information ahead of time. At instantiation time
387 // we verify that the assumed properties match the actual properties.
388 GrInternalSurfaceFlags fSurfaceFlags;
389
Chris Dalton706a6ff2017-11-29 22:01:06 -0700390private:
Greg Daniel4065d452018-11-16 15:43:41 -0500391 // For wrapped resources, 'fFormat', 'fConfig', 'fWidth', 'fHeight', and 'fOrigin; will always
392 // be filled in from the wrapped resource.
393 GrBackendFormat fFormat;
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400394 GrPixelConfig fConfig;
395 int fWidth;
396 int fHeight;
397 GrSurfaceOrigin fOrigin;
Greg Daniel2c19e7f2019-06-18 13:29:21 -0400398 GrSwizzle fTextureSwizzle;
399
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400400 SkBackingFit fFit; // always kApprox for lazy-callback resources
401 // always kExact for wrapped resources
402 mutable SkBudgeted fBudgeted; // always kYes for lazy-callback resources
403 // set from the backing resource for wrapped resources
404 // mutable bc of SkSurface/SkImage wishy-washiness
Robert Phillipsa4c41b32017-03-15 13:02:45 -0400405
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400406 const UniqueID fUniqueID; // set from the backing resource for wrapped resources
robertphillips76948d42016-05-04 12:47:41 -0700407
Chris Dalton706a6ff2017-11-29 22:01:06 -0700408 LazyInstantiateCallback fLazyInstantiateCallback;
Greg Daniel457469c2018-02-08 15:05:44 -0500409 // If this is set to kSingleuse, then after one call to fLazyInstantiateCallback we will cleanup
410 // the lazy callback and then delete it. This will allow for any refs and resources being held
411 // by the standard function to be released. This is specifically useful in non-dll cases where
412 // we make lazy proxies and instantiate them immediately.
413 // Note: This is ignored if fLazyInstantiateCallback is null.
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400414 LazyInstantiationType fLazyInstantiationType;
Greg Daniel849dce12018-04-24 14:32:53 -0400415
416 SkDEBUGCODE(void validateSurface(const GrSurface*);)
417 SkDEBUGCODE(virtual void onValidateSurface(const GrSurface*) = 0;)
Chris Dalton706a6ff2017-11-29 22:01:06 -0700418
Robert Phillips8bc06d02016-11-01 17:28:40 -0400419 static const size_t kInvalidGpuMemorySize = ~static_cast<size_t>(0);
Robert Phillips29e52f12016-11-03 10:19:14 -0400420 SkDEBUGCODE(size_t getRawGpuMemorySize_debugOnly() const { return fGpuMemorySize; })
421
Brian Salomonbb5711a2017-05-17 13:49:59 -0400422 virtual size_t onUninstantiatedGpuMemorySize() const = 0;
Robert Phillips29e52f12016-11-03 10:19:14 -0400423
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400424 bool fNeedsClear;
Robert Phillips5f78adf2019-04-22 12:41:39 -0400425 bool fIgnoredByResourceAllocator = false;
Emircan Uysaler23ca4e72019-06-24 10:53:09 -0400426 GrProtected fIsProtected;
Brian Salomond17b4a62017-05-23 16:53:47 -0400427
Robert Phillips8bc06d02016-11-01 17:28:40 -0400428 // This entry is lazily evaluated so, when the proxy wraps a resource, the resource
429 // will be called but, when the proxy is deferred, it will compute the answer itself.
430 // If the proxy computes its own answer that answer is checked (in debug mode) in
431 // the instantiation method.
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400432 mutable size_t fGpuMemorySize;
Robert Phillips8bc06d02016-11-01 17:28:40 -0400433
Robert Phillipsf2361d22016-10-25 14:20:06 -0400434 // The last opList that wrote to or is currently going to write to this surface
Robert Phillipsb6deea82017-05-11 14:14:30 -0400435 // The opList can be closed (e.g., no surface context is currently bound
436 // to this proxy).
Robert Phillipsf2361d22016-10-25 14:20:06 -0400437 // This back-pointer is required so that we can add a dependancy between
438 // the opList used to create the current contents of this surface
439 // and the opList of a destination surface to which this one is being drawn or copied.
Robert Phillips6cdc22c2017-05-11 16:29:14 -0400440 // This pointer is unreffed. OpLists own a ref on their surface proxies.
Robert Phillipsfe0253f2018-03-16 16:47:25 -0400441 GrOpList* fLastOpList;
Robert Phillipsf2361d22016-10-25 14:20:06 -0400442
Robert Phillipsc7635fa2016-10-28 13:25:24 -0400443 typedef GrIORefProxy INHERITED;
robertphillips76948d42016-05-04 12:47:41 -0700444};
445
robertphillips76948d42016-05-04 12:47:41 -0700446#endif