blob: df9b85bacd7e9575098352380a81c106dbcda93f [file] [log] [blame]
bsalomon@google.com27847de2011-02-22 20:59:41 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2010 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.
bsalomon@google.com27847de2011-02-22 20:59:41 +00006 */
7
8#ifndef GrContext_DEFINED
9#define GrContext_DEFINED
10
robertphillipscaef3452015-11-11 13:18:11 -080011#include "GrCaps.h"
commit-bot@chromium.orga0b40282013-09-18 13:00:55 +000012#include "SkMatrix.h"
egdaniele61c4112014-06-12 10:24:21 -070013#include "SkPathEffect.h"
commit-bot@chromium.orga0b40282013-09-18 13:00:55 +000014#include "SkTypes.h"
joshualitt27a48dc2016-01-08 07:19:47 -080015#include "../private/GrAuditTrail.h"
joshualitt1de610a2016-01-06 08:26:09 -080016#include "../private/GrSingleOwner.h"
Ethan Nicholasd1b2eec2017-11-01 15:45:43 -040017#include "GrContextOptions.h"
bsalomon@google.com27847de2011-02-22 20:59:41 +000018
Brian Salomonf856fd12016-12-16 14:24:34 -050019class GrAtlasGlyphCache;
Greg Daniel51316782017-08-02 15:10:09 +000020class GrBackendSemaphore;
robertphillips4fd74ae2016-08-03 14:26:53 -070021class GrContextPriv;
bsalomon41b952c2016-03-11 06:46:33 -080022class GrContextThreadSafeProxy;
robertphillips77a2e522015-10-17 07:43:27 -070023class GrDrawingManager;
Brian Salomon2ee084e2016-12-16 18:59:19 -050024struct GrDrawOpAtlasConfig;
joshualittb0a8a372014-09-23 09:50:21 -070025class GrFragmentProcessor;
Greg Daniel02611d92017-07-25 10:05:01 -040026struct GrGLInterface;
bsalomon@google.com05ef5102011-05-02 21:14:59 +000027class GrGpu;
bsalomon@google.com583a1e32011-08-17 13:42:46 +000028class GrIndexBuffer;
Greg Daniel02611d92017-07-25 10:05:01 -040029struct GrMockOptions;
commit-bot@chromium.org81312832013-03-22 18:34:09 +000030class GrOvalRenderer;
commit-bot@chromium.org5c8ee252013-11-01 15:23:44 +000031class GrPath;
Robert Phillips1afd4cd2018-01-08 13:40:32 -050032class GrProxyProvider;
Greg Daniel02611d92017-07-25 10:05:01 -040033class GrRenderTargetContext;
bsalomon@google.com50398bf2011-07-26 20:45:30 +000034class GrResourceEntry;
bsalomon0ea80f42015-02-11 10:49:59 -080035class GrResourceCache;
bsalomond309e7a2015-04-30 14:18:54 -070036class GrResourceProvider;
Brian Salomon2bbdcc42017-09-07 12:36:34 -040037class GrSamplerState;
Robert Phillips7ee385e2017-03-30 08:02:11 -040038class GrSurfaceProxy;
joshualittb7133be2015-04-08 09:08:31 -070039class GrTextBlobCache;
kkinnunenc6cb56f2014-06-24 00:12:27 -070040class GrTextContext;
Mike Reed84dd8572017-03-08 22:21:00 -050041class GrTextureProxy;
bsalomon@google.com583a1e32011-08-17 13:42:46 +000042class GrVertexBuffer;
Greg Daniel02611d92017-07-25 10:05:01 -040043struct GrVkBackendContext;
bsalomon6c9cd552016-01-22 07:17:34 -080044class GrSwizzle;
ericrk0a5fa482015-09-15 14:16:10 -070045class SkTraceMemoryDump;
bsalomon@google.com50398bf2011-07-26 20:45:30 +000046
Mike Reed84dd8572017-03-08 22:21:00 -050047class SkImage;
48class SkSurfaceProps;
Brian Osman51279982017-08-23 10:12:00 -040049class SkTaskGroup;
Mike Reed84dd8572017-03-08 22:21:00 -050050
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +000051class SK_API GrContext : public SkRefCnt {
bsalomon@google.com27847de2011-02-22 20:59:41 +000052public:
53 /**
bsalomon@google.com16e3dde2012-10-25 18:43:28 +000054 * Creates a GrContext for a backend context.
bsalomon@google.com27847de2011-02-22 20:59:41 +000055 */
bsalomon682c2692015-05-22 14:01:46 -070056 static GrContext* Create(GrBackend, GrBackendContext, const GrContextOptions& options);
57 static GrContext* Create(GrBackend, GrBackendContext);
bsalomon@google.com27847de2011-02-22 20:59:41 +000058
Brian Salomon384fab42017-12-07 12:33:05 -050059 static sk_sp<GrContext> MakeGL(sk_sp<const GrGLInterface>, const GrContextOptions&);
60 static sk_sp<GrContext> MakeGL(sk_sp<const GrGLInterface>);
Brian Salomon990014d2017-12-07 16:23:39 -050061 // Deprecated
62 static sk_sp<GrContext> MakeGL(const GrGLInterface*);
63 static sk_sp<GrContext> MakeGL(const GrGLInterface*, const GrContextOptions&);
Greg Daniel02611d92017-07-25 10:05:01 -040064
65#ifdef SK_VULKAN
Brian Salomon384fab42017-12-07 12:33:05 -050066 static sk_sp<GrContext> MakeVulkan(sk_sp<const GrVkBackendContext>, const GrContextOptions&);
67 static sk_sp<GrContext> MakeVulkan(sk_sp<const GrVkBackendContext>);
Greg Daniel02611d92017-07-25 10:05:01 -040068#endif
69
Greg Danielb76a72a2017-07-13 15:07:54 -040070#ifdef SK_METAL
71 /**
72 * Makes a GrContext which uses Metal as the backend. The device parameter is an MTLDevice
73 * and queue is an MTLCommandQueue which should be used by the backend. These objects must
74 * have a ref on them which can be transferred to Ganesh which will release the ref when the
75 * GrContext is destroyed.
76 */
77 static sk_sp<GrContext> MakeMetal(void* device, void* queue, const GrContextOptions& options);
Greg Daniel02611d92017-07-25 10:05:01 -040078 static sk_sp<GrContext> MakeMetal(void* device, void* queue);
Greg Danielb76a72a2017-07-13 15:07:54 -040079#endif
80
Greg Daniel02611d92017-07-25 10:05:01 -040081 static sk_sp<GrContext> MakeMock(const GrMockOptions*, const GrContextOptions&);
82 static sk_sp<GrContext> MakeMock(const GrMockOptions*);
83
bsalomon@google.com27847de2011-02-22 20:59:41 +000084 virtual ~GrContext();
85
bungeman6bd52842016-10-27 09:30:08 -070086 sk_sp<GrContextThreadSafeProxy> threadSafeProxy();
bsalomon41b952c2016-03-11 06:46:33 -080087
bsalomon@google.com27847de2011-02-22 20:59:41 +000088 /**
89 * The GrContext normally assumes that no outsider is setting state
90 * within the underlying 3D API's context/device/whatever. This call informs
91 * the context that the state was modified and it should resend. Shouldn't
92 * be called frequently for good performance.
bsalomon@google.com0a208a12013-06-28 18:57:35 +000093 * The flag bits, state, is dpendent on which backend is used by the
94 * context, either GL or D3D (possible in future).
bsalomon@google.com27847de2011-02-22 20:59:41 +000095 */
bsalomon@google.com0a208a12013-06-28 18:57:35 +000096 void resetContext(uint32_t state = kAll_GrBackendState);
bsalomon@google.com27847de2011-02-22 20:59:41 +000097
bsalomon@google.com8fe72472011-03-30 21:26:44 +000098 /**
robertphillips@google.comcdb426d2012-09-24 19:33:59 +000099 * Callback function to allow classes to cleanup on GrContext destruction.
100 * The 'info' field is filled in with the 'info' passed to addCleanUp.
101 */
102 typedef void (*PFCleanUpFunc)(const GrContext* context, void* info);
103
104 /**
105 * Add a function to be called from within GrContext's destructor.
106 * This gives classes a chance to free resources held on a per context basis.
107 * The 'info' parameter will be stored and passed to the callback function.
108 */
109 void addCleanUp(PFCleanUpFunc cleanUp, void* info) {
110 CleanUpData* entry = fCleanUpData.push();
111
112 entry->fFunc = cleanUp;
113 entry->fInfo = info;
114 }
115
116 /**
Robert Phillips88260b52018-01-19 12:56:09 -0500117 * Abandons all GPU resources and assumes the underlying backend 3D API context is no longer
bsalomon6e2aad42016-04-01 11:54:31 -0700118 * usable. Call this if you have lost the associated GPU context, and thus internal texture,
119 * buffer, etc. references/IDs are now invalid. Calling this ensures that the destructors of the
120 * GrContext and any of its created resource objects will not make backend 3D API calls. Content
121 * rendered but not previously flushed may be lost. After this function is called all subsequent
122 * calls on the GrContext will fail or be no-ops.
123 *
124 * The typical use case for this function is that the underlying 3D context was lost and further
125 * API calls may crash.
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000126 */
bsalomon2354f842014-07-28 13:48:36 -0700127 void abandonContext();
junov@google.com53a55842011-06-08 22:55:10 +0000128
bsalomon6e2aad42016-04-01 11:54:31 -0700129 /**
130 * This is similar to abandonContext() however the underlying 3D context is not yet lost and
131 * the GrContext will cleanup all allocated resources before returning. After returning it will
132 * assume that the underlying context may no longer be valid.
133 *
134 * The typical use case for this function is that the client is going to destroy the 3D context
135 * but can't guarantee that GrContext will be destroyed first (perhaps because it may be ref'ed
136 * elsewhere by either the client or Skia objects).
137 */
138 void releaseResourcesAndAbandonContext();
139
commit-bot@chromium.org95c20032014-05-09 14:29:32 +0000140 ///////////////////////////////////////////////////////////////////////////
141 // Resource Cache
142
143 /**
144 * Return the current GPU resource cache limits.
145 *
146 * @param maxResources If non-null, returns maximum number of resources that
147 * can be held in the cache.
148 * @param maxResourceBytes If non-null, returns maximum number of bytes of
149 * video memory that can be held in the cache.
150 */
151 void getResourceCacheLimits(int* maxResources, size_t* maxResourceBytes) const;
commit-bot@chromium.org95c20032014-05-09 14:29:32 +0000152
153 /**
154 * Gets the current GPU resource cache usage.
155 *
156 * @param resourceCount If non-null, returns the number of resources that are held in the
157 * cache.
158 * @param maxResourceBytes If non-null, returns the total number of bytes of video memory held
159 * in the cache.
160 */
161 void getResourceCacheUsage(int* resourceCount, size_t* resourceBytes) const;
162
commit-bot@chromium.org95c20032014-05-09 14:29:32 +0000163 /**
Derek Sollenbergeree479142017-05-24 11:41:33 -0400164 * Gets the number of bytes in the cache consumed by purgeable (e.g. unlocked) resources.
165 */
166 size_t getResourceCachePurgeableBytes() const;
167
168 /**
commit-bot@chromium.org95c20032014-05-09 14:29:32 +0000169 * Specify the GPU resource cache limits. If the current cache exceeds either
170 * of these, it will be purged (LRU) to keep the cache within these limits.
171 *
172 * @param maxResources The maximum number of resources that can be held in
173 * the cache.
174 * @param maxResourceBytes The maximum number of bytes of video memory
175 * that can be held in the cache.
176 */
177 void setResourceCacheLimits(int maxResources, size_t maxResourceBytes);
commit-bot@chromium.org95c20032014-05-09 14:29:32 +0000178
junov@google.com53a55842011-06-08 22:55:10 +0000179 /**
bsalomon@google.com1e269b52012-10-15 14:25:31 +0000180 * Frees GPU created by the context. Can be called to reduce GPU memory
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000181 * pressure.
bsalomon@google.com27847de2011-02-22 20:59:41 +0000182 */
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000183 void freeGpuResources();
184
bsalomon@google.com07fc0d12012-06-22 15:15:59 +0000185 /**
commit-bot@chromium.org95c20032014-05-09 14:29:32 +0000186 * Purge all the unlocked resources from the cache.
187 * This entry point is mainly meant for timing texture uploads
188 * and is not defined in normal builds of Skia.
commit-bot@chromium.orgd8a57af2014-03-19 21:19:16 +0000189 */
commit-bot@chromium.org95c20032014-05-09 14:29:32 +0000190 void purgeAllUnlockedResources();
191
Brian Salomon5e150852017-03-22 14:53:13 -0400192 /**
Jim Van Verth76d917c2017-12-13 09:26:37 -0500193 * Purge GPU resources that haven't been used in the past 'msNotUsed' milliseconds or are
194 * otherwise marked for deletion, regardless of whether the context is under budget.
Brian Salomon5e150852017-03-22 14:53:13 -0400195 */
Jim Van Verth76d917c2017-12-13 09:26:37 -0500196 void performDeferredCleanup(std::chrono::milliseconds msNotUsed);
Brian Salomon5e150852017-03-22 14:53:13 -0400197
Mike Klein4b6bde72017-12-14 07:46:55 -0500198 // Temporary compatibility API for Android.
199 void purgeResourcesNotUsedInMs(std::chrono::milliseconds msNotUsed) {
200 this->performDeferredCleanup(msNotUsed);
201 }
202
Derek Sollenberger5480a182017-05-25 16:43:59 -0400203 /**
204 * Purge unlocked resources from the cache until the the provided byte count has been reached
205 * or we have purged all unlocked resources. The default policy is to purge in LRU order, but
206 * can be overridden to prefer purging scratch resources (in LRU order) prior to purging other
207 * resource types.
208 *
209 * @param maxBytesToPurge the desired number of bytes to be purged.
210 * @param preferScratchResources If true scratch resources will be purged prior to other
211 * resource types.
212 */
213 void purgeUnlockedResources(size_t bytesToPurge, bool preferScratchResources);
214
bsalomon76228632015-05-29 08:02:10 -0700215 /** Access the context capabilities */
Brian Salomoneace8cd2017-12-08 13:11:11 -0500216 const GrCaps* caps() const { return fCaps.get(); }
bsalomon@google.com8a70eef2013-03-19 13:58:55 +0000217
Brian Salomonbdecacf2018-02-02 20:32:49 -0500218 /**
219 * Can a SkImage be created with the given color type.
220 */
221 bool colorTypeSupportedAsImage(SkColorType) const;
222
223 /**
224 * Can a SkSurface be created with the given color type. To check whether MSAA is supported
225 * use maxSurfaceSampleCountForColorType().
226 */
227 bool colorTypeSupportedAsSurface(SkColorType colorType) const {
228 return this->maxSurfaceSampleCountForColorType(colorType) > 0;
229 }
230
231 /**
232 * Gets the maximum supported sample count for a color type. 1 is returned if only non-MSAA
233 * rendering is supported for the color type. 0 is returned if rendering to this color type
234 * is not supported at all.
235 */
236 int maxSurfaceSampleCountForColorType(SkColorType) const;
237
Robert Phillipsdd3b3f42017-04-24 10:57:28 -0400238 /*
239 * Create a new render target context backed by a deferred-style
240 * GrRenderTargetProxy. We guarantee that "asTextureProxy" will succeed for
241 * renderTargetContexts created via this entry point.
robertphillipsd4c741e2016-04-28 09:55:15 -0700242 */
Robert Phillips2af746c2017-04-21 12:28:48 +0000243 sk_sp<GrRenderTargetContext> makeDeferredRenderTargetContext(
Robert Phillipsdd3b3f42017-04-24 10:57:28 -0400244 SkBackingFit fit,
Robert Phillips2af746c2017-04-21 12:28:48 +0000245 int width, int height,
246 GrPixelConfig config,
247 sk_sp<SkColorSpace> colorSpace,
Brian Salomonbdecacf2018-02-02 20:32:49 -0500248 int sampleCnt = 1,
Greg Daniel45d63032017-10-30 13:41:26 -0400249 GrMipMapped = GrMipMapped::kNo,
Robert Phillips2af746c2017-04-21 12:28:48 +0000250 GrSurfaceOrigin origin = kBottomLeft_GrSurfaceOrigin,
251 const SkSurfaceProps* surfaceProps = nullptr,
252 SkBudgeted = SkBudgeted::kYes);
robertphillips48fde9c2016-09-06 05:20:20 -0700253 /*
Brian Osman11052242016-10-27 14:47:55 -0400254 * This method will attempt to create a renderTargetContext that has, at least, the number of
robertphillips48fde9c2016-09-06 05:20:20 -0700255 * channels and precision per channel as requested in 'config' (e.g., A8 and 888 can be
256 * converted to 8888). It may also swizzle the channels (e.g., BGRA -> RGBA).
257 * SRGB-ness will be preserved.
258 */
robertphillipsd728f0c2016-11-21 11:05:03 -0800259 sk_sp<GrRenderTargetContext> makeDeferredRenderTargetContextWithFallback(
260 SkBackingFit fit,
261 int width, int height,
262 GrPixelConfig config,
263 sk_sp<SkColorSpace> colorSpace,
Brian Salomonbdecacf2018-02-02 20:32:49 -0500264 int sampleCnt = 1,
Greg Daniel45d63032017-10-30 13:41:26 -0400265 GrMipMapped = GrMipMapped::kNo,
Robert Phillips40fd7c92017-01-30 08:06:27 -0500266 GrSurfaceOrigin origin = kBottomLeft_GrSurfaceOrigin,
robertphillipsd728f0c2016-11-21 11:05:03 -0800267 const SkSurfaceProps* surfaceProps = nullptr,
268 SkBudgeted budgeted = SkBudgeted::kYes);
269
bsalomon@google.com27847de2011-02-22 20:59:41 +0000270 ///////////////////////////////////////////////////////////////////////////
271 // Misc.
272
273 /**
Greg Daniel51316782017-08-02 15:10:09 +0000274 * Call to ensure all drawing to the context has been issued to the underlying 3D API.
bsalomon@google.com27847de2011-02-22 20:59:41 +0000275 */
bsalomonb77a9072016-09-07 10:02:04 -0700276 void flush();
robertphillipsea461502015-05-26 11:38:03 -0700277
senorblanco@chromium.org027de5f2011-07-08 18:03:33 +0000278 /**
Greg Daniel51316782017-08-02 15:10:09 +0000279 * Call to ensure all drawing to the context has been issued to the underlying 3D API. After
280 * issuing all commands, numSemaphore semaphores will be signaled by the gpu. The client passes
281 * in an array of numSemaphores GrBackendSemaphores. In general these GrBackendSemaphore's can
282 * be either initialized or not. If they are initialized, the backend uses the passed in
283 * semaphore. If it is not initialized, a new semaphore is created and the GrBackendSemaphore
284 * object is initialized with that semaphore.
285 *
286 * The client will own and be responsible for deleting the underlying semaphores that are stored
287 * and returned in initialized GrBackendSemaphore objects. The GrBackendSemaphore objects
288 * themselves can be deleted as soon as this function returns.
289 *
290 * If the backend API is OpenGL only uninitialized GrBackendSemaphores are supported.
291 * If the backend API is Vulkan either initialized or unitialized semaphores are supported.
292 * If unitialized, the semaphores which are created will be valid for use only with the VkDevice
293 * with which they were created.
294 *
295 * If this call returns GrSemaphoresSubmited::kNo, the GPU backend will not have created or
296 * added any semaphores to signal on the GPU. Thus the client should not have the GPU wait on
297 * any of the semaphores. However, any pending commands to the context will still be flushed.
298 */
299 GrSemaphoresSubmitted flushAndSignalSemaphores(int numSemaphores,
300 GrBackendSemaphore signalSemaphores[]);
301
302 /**
joshualitt0acd0d32015-05-07 08:23:19 -0700303 * An ID associated with this context, guaranteed to be unique.
304 */
305 uint32_t uniqueID() { return fUniqueID; }
306
bsalomon@google.com27847de2011-02-22 20:59:41 +0000307 ///////////////////////////////////////////////////////////////////////////
bsalomon@google.com27847de2011-02-22 20:59:41 +0000308 // Functions intended for internal use only.
robertphillips77a2e522015-10-17 07:43:27 -0700309 bool abandoned() const;
bsalomon@google.com9923c2b2012-06-06 18:21:18 +0000310
joshualitte45c81c2015-12-02 09:05:37 -0800311 /** Reset GPU stats */
312 void resetGpuStats() const ;
313
mtkleinb9eb4ac2015-02-02 18:26:03 -0800314 /** Prints cache stats to the string if GR_CACHE_STATS == 1. */
315 void dumpCacheStats(SkString*) const;
joshualittdc5685a2015-12-02 14:08:25 -0800316 void dumpCacheStatsKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) const;
robertphillips@google.com5f9f2f52012-08-22 10:57:05 +0000317 void printCacheStats() const;
robertphillips@google.com5f9f2f52012-08-22 10:57:05 +0000318
mtkleinb9eb4ac2015-02-02 18:26:03 -0800319 /** Prints GPU stats to the string if GR_GPU_STATS == 1. */
320 void dumpGpuStats(SkString*) const;
joshualittdc5685a2015-12-02 14:08:25 -0800321 void dumpGpuStatsKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) const;
mtkleinb9eb4ac2015-02-02 18:26:03 -0800322 void printGpuStats() const;
robertphillips754f4e92014-09-18 13:52:08 -0700323
Brian Osman71a18892017-08-10 10:23:25 -0400324 /** Returns a string with detailed information about the context & GPU, in JSON format. */
325 SkString dump() const;
326
joshualitt17d833b2015-08-03 10:17:44 -0700327 /** Specify the TextBlob cache limit. If the current cache exceeds this limit it will purge.
328 this is for testing only */
329 void setTextBlobCacheLimit_ForTesting(size_t bytes);
330
joshualittda04e0e2015-08-19 08:16:43 -0700331 /** Specify the sizes of the GrAtlasTextContext atlases. The configs pointer below should be
332 to an array of 3 entries */
Brian Salomon2ee084e2016-12-16 18:59:19 -0500333 void setTextContextAtlasSizes_ForTesting(const GrDrawOpAtlasConfig* configs);
joshualittda04e0e2015-08-19 08:16:43 -0700334
ericrk0a5fa482015-09-15 14:16:10 -0700335 /** Enumerates all cached GPU resources and dumps their memory to traceMemoryDump. */
336 void dumpMemoryStatistics(SkTraceMemoryDump* traceMemoryDump) const;
337
Robert Phillips33667da2016-12-20 11:05:30 -0500338 /** Get pointer to atlas texture for given mask format. Note that this wraps an
339 actively mutating texture in an SkImage. This could yield unexpected results
340 if it gets cached or used more generally. */
Jim Van Verth87d18ce2018-01-22 12:45:47 -0500341 sk_sp<SkImage> getFontAtlasImage_ForTesting(GrMaskFormat format, uint32_t index = 0);
jvanverth629162d2015-11-08 08:07:24 -0800342
joshualitt5651ee62016-01-11 10:39:11 -0800343 GrAuditTrail* getAuditTrail() { return &fAuditTrail; }
joshualitt27a48dc2016-01-08 07:19:47 -0800344
Ethan Nicholasd1b2eec2017-11-01 15:45:43 -0400345 GrContextOptions::PersistentCache* getPersistentCache() { return fPersistentCache; }
346
joshualittce894002016-01-11 13:29:31 -0800347 /** This is only useful for debug purposes */
348 SkDEBUGCODE(GrSingleOwner* debugSingleOwner() const { return &fSingleOwner; } )
349
robertphillips4fd74ae2016-08-03 14:26:53 -0700350 // Provides access to functions that aren't part of the public API.
351 GrContextPriv contextPriv();
352 const GrContextPriv contextPriv() const;
353
Robert Phillips88260b52018-01-19 12:56:09 -0500354protected:
355 GrContext(GrContextThreadSafeProxy*);
356 GrContext(GrBackend);
357
bsalomon@google.com27847de2011-02-22 20:59:41 +0000358private:
Brian Salomon384fab42017-12-07 12:33:05 -0500359 sk_sp<GrGpu> fGpu;
Brian Salomoneace8cd2017-12-08 13:11:11 -0500360 sk_sp<const GrCaps> fCaps;
bsalomon41b952c2016-03-11 06:46:33 -0800361 GrResourceCache* fResourceCache;
Brian Osman32342f02017-03-04 08:12:46 -0500362 GrResourceProvider* fResourceProvider;
Robert Phillips1afd4cd2018-01-08 13:40:32 -0500363 GrProxyProvider* fProxyProvider;
bsalomond309e7a2015-04-30 14:18:54 -0700364
bungeman6bd52842016-10-27 09:30:08 -0700365 sk_sp<GrContextThreadSafeProxy> fThreadSafeProxy;
bsalomon41b952c2016-03-11 06:46:33 -0800366
Brian Salomonf856fd12016-12-16 14:24:34 -0500367 GrAtlasGlyphCache* fAtlasGlyphCache;
bungeman6bd52842016-10-27 09:30:08 -0700368 std::unique_ptr<GrTextBlobCache> fTextBlobCache;
bsalomon@google.comdfe75bc2011-03-25 12:31:16 +0000369
Brian Osman46da1cc2017-02-14 14:15:48 -0500370 bool fDisableGpuYUVConversion;
bsalomon41b952c2016-03-11 06:46:33 -0800371 bool fDidTestPMConversions;
Brian Osman28804f32017-04-20 10:24:36 -0400372 // true if the PM/UPM conversion succeeded; false otherwise
373 bool fPMUPMConversionsRoundTrip;
bsalomon@google.coma04e8e82012-08-27 12:53:13 +0000374
joshualitt1de610a2016-01-06 08:26:09 -0800375 // In debug builds we guard against improper thread handling
joshualittde8dc7e2016-01-08 10:09:13 -0800376 // This guard is passed to the GrDrawingManager and, from there to all the
Brian Osman32342f02017-03-04 08:12:46 -0500377 // GrRenderTargetContexts. It is also passed to the GrResourceProvider and SkGpuDevice.
bsalomon41b952c2016-03-11 06:46:33 -0800378 mutable GrSingleOwner fSingleOwner;
joshualitt1de610a2016-01-06 08:26:09 -0800379
Brian Osman51279982017-08-23 10:12:00 -0400380 std::unique_ptr<SkTaskGroup> fTaskGroup;
381
robertphillips@google.comcdb426d2012-09-24 19:33:59 +0000382 struct CleanUpData {
383 PFCleanUpFunc fFunc;
384 void* fInfo;
385 };
386
bsalomon41b952c2016-03-11 06:46:33 -0800387 SkTDArray<CleanUpData> fCleanUpData;
robertphillips@google.com44a91dc2013-07-25 15:32:06 +0000388
bsalomon41b952c2016-03-11 06:46:33 -0800389 const uint32_t fUniqueID;
krajcevski9c6d4d72014-08-12 07:26:25 -0700390
bungeman6bd52842016-10-27 09:30:08 -0700391 std::unique_ptr<GrDrawingManager> fDrawingManager;
robertphillips77a2e522015-10-17 07:43:27 -0700392
bsalomon41b952c2016-03-11 06:46:33 -0800393 GrAuditTrail fAuditTrail;
joshualitt27a48dc2016-01-08 07:19:47 -0800394
Robert Phillipse42edcc2017-12-13 11:50:22 -0500395 const GrBackend fBackend;
Greg Danielfc978fd2017-04-13 09:54:12 -0400396
Ethan Nicholasd1b2eec2017-11-01 15:45:43 -0400397 GrContextOptions::PersistentCache* fPersistentCache;
398
Brian Osman11052242016-10-27 14:47:55 -0400399 // TODO: have the GrClipStackClip use renderTargetContexts and rm this friending
robertphillips4fd74ae2016-08-03 14:26:53 -0700400 friend class GrContextPriv;
csmartdaltonc6f411e2016-08-05 22:32:12 -0700401
Robert Phillips88260b52018-01-19 12:56:09 -0500402 bool init(const GrContextOptions&); // init must be called after either constructor.
robertphillipsea461502015-05-26 11:38:03 -0700403
skia.committer@gmail.comcdcb2ce2013-01-29 07:05:52 +0000404 /**
Brian Osman409e74f2017-04-17 11:48:28 -0400405 * These functions create premul <-> unpremul effects. If the second argument is 'true', they
406 * use the specialized round-trip effects from GrConfigConversionEffect, otherwise they
407 * create effects that do naive multiply or divide.
bsalomon@google.comadc65362013-01-28 14:26:09 +0000408 */
Brian Salomonaff329b2017-08-11 09:40:37 -0400409 std::unique_ptr<GrFragmentProcessor> createPMToUPMEffect(std::unique_ptr<GrFragmentProcessor>,
410 bool useConfigConversionEffect);
411 std::unique_ptr<GrFragmentProcessor> createUPMToPMEffect(std::unique_ptr<GrFragmentProcessor>,
412 bool useConfigConversionEffect);
Brian Osman409e74f2017-04-17 11:48:28 -0400413
414 /**
415 * Returns true if createPMtoUPMEffect and createUPMToPMEffect will succeed for non-sRGB 8888
416 * configs. In other words, did we find a pair of round-trip preserving conversion effects?
417 */
418 bool validPMUPMConversionExists();
bsalomon@google.coma04e8e82012-08-27 12:53:13 +0000419
commit-bot@chromium.orgcae27fe2013-07-10 10:14:35 +0000420 /**
joshualitt0db6dfa2015-04-10 07:01:30 -0700421 * A callback similar to the above for use by the TextBlobCache
422 * TODO move textblob draw calls below context so we can use the call above.
423 */
424 static void TextBlobCacheOverBudgetCB(void* data);
425
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +0000426 typedef SkRefCnt INHERITED;
bsalomon@google.com27847de2011-02-22 20:59:41 +0000427};
428
bsalomon41b952c2016-03-11 06:46:33 -0800429/**
430 * Can be used to perform actions related to the generating GrContext in a thread safe manner. The
431 * proxy does not access the 3D API (e.g. OpenGL) that backs the generating GrContext.
432 */
433class GrContextThreadSafeProxy : public SkRefCnt {
Robert Phillips8def8bf2017-11-30 08:46:03 -0500434public:
435 bool matches(GrContext* context) const { return context->uniqueID() == fContextUniqueID; }
436
bsalomon41b952c2016-03-11 06:46:33 -0800437private:
Robert Phillipse42edcc2017-12-13 11:50:22 -0500438 // DDL TODO: need to add unit tests for backend & maybe options
439 GrContextThreadSafeProxy(sk_sp<const GrCaps> caps,
440 uint32_t uniqueID,
441 GrBackend backend,
442 const GrContextOptions& options)
bungeman6bd52842016-10-27 09:30:08 -0700443 : fCaps(std::move(caps))
Robert Phillipse42edcc2017-12-13 11:50:22 -0500444 , fContextUniqueID(uniqueID)
445 , fBackend(backend)
446 , fOptions(options) {
447 }
bsalomon41b952c2016-03-11 06:46:33 -0800448
Robert Phillipse42edcc2017-12-13 11:50:22 -0500449 sk_sp<const GrCaps> fCaps;
450 const uint32_t fContextUniqueID;
451 const GrBackend fBackend;
452 const GrContextOptions fOptions;
bsalomon41b952c2016-03-11 06:46:33 -0800453
454 friend class GrContext;
Robert Phillipse42edcc2017-12-13 11:50:22 -0500455 friend class GrContextPriv;
bsalomon41b952c2016-03-11 06:46:33 -0800456 friend class SkImage;
457
458 typedef SkRefCnt INHERITED;
459};
460
bsalomon@google.com27847de2011-02-22 20:59:41 +0000461#endif