blob: 68514891c4d7520d86a076e4224008f726a867ed [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 "GrColor.h"
commit-bot@chromium.orga0b40282013-09-18 13:00:55 +000013#include "SkMatrix.h"
egdaniele61c4112014-06-12 10:24:21 -070014#include "SkPathEffect.h"
commit-bot@chromium.orga0b40282013-09-18 13:00:55 +000015#include "SkTypes.h"
joshualitt27a48dc2016-01-08 07:19:47 -080016#include "../private/GrAuditTrail.h"
joshualitt1de610a2016-01-06 08:26:09 -080017#include "../private/GrSingleOwner.h"
Ethan Nicholasd1b2eec2017-11-01 15:45:43 -040018#include "GrContextOptions.h"
bsalomon@google.com27847de2011-02-22 20:59:41 +000019
Brian Salomonf856fd12016-12-16 14:24:34 -050020class GrAtlasGlyphCache;
Greg Daniel51316782017-08-02 15:10:09 +000021class GrBackendSemaphore;
robertphillips4fd74ae2016-08-03 14:26:53 -070022class GrContextPriv;
bsalomon41b952c2016-03-11 06:46:33 -080023class GrContextThreadSafeProxy;
robertphillips77a2e522015-10-17 07:43:27 -070024class GrDrawingManager;
Brian Salomon2ee084e2016-12-16 18:59:19 -050025struct GrDrawOpAtlasConfig;
joshualittb0a8a372014-09-23 09:50:21 -070026class GrFragmentProcessor;
Greg Daniel02611d92017-07-25 10:05:01 -040027struct GrGLInterface;
bsalomon@google.com05ef5102011-05-02 21:14:59 +000028class GrGpu;
bsalomon@google.com583a1e32011-08-17 13:42:46 +000029class GrIndexBuffer;
Greg Daniel02611d92017-07-25 10:05:01 -040030struct GrMockOptions;
commit-bot@chromium.org81312832013-03-22 18:34:09 +000031class GrOvalRenderer;
commit-bot@chromium.org5c8ee252013-11-01 15:23:44 +000032class GrPath;
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 /**
bsalomon6e2aad42016-04-01 11:54:31 -0700117 * Abandons all GPU resources and assumes the underlying backend 3D API context is not longer
118 * 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
Derek Sollenberger5480a182017-05-25 16:43:59 -0400198 /**
199 * Purge unlocked resources from the cache until the the provided byte count has been reached
200 * or we have purged all unlocked resources. The default policy is to purge in LRU order, but
201 * can be overridden to prefer purging scratch resources (in LRU order) prior to purging other
202 * resource types.
203 *
204 * @param maxBytesToPurge the desired number of bytes to be purged.
205 * @param preferScratchResources If true scratch resources will be purged prior to other
206 * resource types.
207 */
208 void purgeUnlockedResources(size_t bytesToPurge, bool preferScratchResources);
209
bsalomon76228632015-05-29 08:02:10 -0700210 /** Access the context capabilities */
Brian Salomoneace8cd2017-12-08 13:11:11 -0500211 const GrCaps* caps() const { return fCaps.get(); }
bsalomon@google.com8a70eef2013-03-19 13:58:55 +0000212
commit-bot@chromium.orgb471a322014-03-10 07:40:03 +0000213 /**
214 * Returns the recommended sample count for a render target when using this
215 * context.
216 *
217 * @param config the configuration of the render target.
218 * @param dpi the display density in dots per inch.
219 *
220 * @return sample count that should be perform well and have good enough
221 * rendering quality for the display. Alternatively returns 0 if
222 * MSAA is not supported or recommended to be used by default.
223 */
224 int getRecommendedSampleCount(GrPixelConfig config, SkScalar dpi) const;
225
Robert Phillipsdd3b3f42017-04-24 10:57:28 -0400226 /*
227 * Create a new render target context backed by a deferred-style
228 * GrRenderTargetProxy. We guarantee that "asTextureProxy" will succeed for
229 * renderTargetContexts created via this entry point.
robertphillipsd4c741e2016-04-28 09:55:15 -0700230 */
Robert Phillips2af746c2017-04-21 12:28:48 +0000231 sk_sp<GrRenderTargetContext> makeDeferredRenderTargetContext(
Robert Phillipsdd3b3f42017-04-24 10:57:28 -0400232 SkBackingFit fit,
Robert Phillips2af746c2017-04-21 12:28:48 +0000233 int width, int height,
234 GrPixelConfig config,
235 sk_sp<SkColorSpace> colorSpace,
236 int sampleCnt = 0,
Greg Daniel45d63032017-10-30 13:41:26 -0400237 GrMipMapped = GrMipMapped::kNo,
Robert Phillips2af746c2017-04-21 12:28:48 +0000238 GrSurfaceOrigin origin = kBottomLeft_GrSurfaceOrigin,
239 const SkSurfaceProps* surfaceProps = nullptr,
240 SkBudgeted = SkBudgeted::kYes);
robertphillips48fde9c2016-09-06 05:20:20 -0700241 /*
Brian Osman11052242016-10-27 14:47:55 -0400242 * This method will attempt to create a renderTargetContext that has, at least, the number of
robertphillips48fde9c2016-09-06 05:20:20 -0700243 * channels and precision per channel as requested in 'config' (e.g., A8 and 888 can be
244 * converted to 8888). It may also swizzle the channels (e.g., BGRA -> RGBA).
245 * SRGB-ness will be preserved.
246 */
robertphillipsd728f0c2016-11-21 11:05:03 -0800247 sk_sp<GrRenderTargetContext> makeDeferredRenderTargetContextWithFallback(
248 SkBackingFit fit,
249 int width, int height,
250 GrPixelConfig config,
251 sk_sp<SkColorSpace> colorSpace,
252 int sampleCnt = 0,
Greg Daniel45d63032017-10-30 13:41:26 -0400253 GrMipMapped = GrMipMapped::kNo,
Robert Phillips40fd7c92017-01-30 08:06:27 -0500254 GrSurfaceOrigin origin = kBottomLeft_GrSurfaceOrigin,
robertphillipsd728f0c2016-11-21 11:05:03 -0800255 const SkSurfaceProps* surfaceProps = nullptr,
256 SkBudgeted budgeted = SkBudgeted::kYes);
257
bsalomon@google.com27847de2011-02-22 20:59:41 +0000258 ///////////////////////////////////////////////////////////////////////////
259 // Misc.
260
261 /**
Greg Daniel51316782017-08-02 15:10:09 +0000262 * Call to ensure all drawing to the context has been issued to the underlying 3D API.
bsalomon@google.com27847de2011-02-22 20:59:41 +0000263 */
bsalomonb77a9072016-09-07 10:02:04 -0700264 void flush();
robertphillipsea461502015-05-26 11:38:03 -0700265
senorblanco@chromium.org027de5f2011-07-08 18:03:33 +0000266 /**
Greg Daniel51316782017-08-02 15:10:09 +0000267 * Call to ensure all drawing to the context has been issued to the underlying 3D API. After
268 * issuing all commands, numSemaphore semaphores will be signaled by the gpu. The client passes
269 * in an array of numSemaphores GrBackendSemaphores. In general these GrBackendSemaphore's can
270 * be either initialized or not. If they are initialized, the backend uses the passed in
271 * semaphore. If it is not initialized, a new semaphore is created and the GrBackendSemaphore
272 * object is initialized with that semaphore.
273 *
274 * The client will own and be responsible for deleting the underlying semaphores that are stored
275 * and returned in initialized GrBackendSemaphore objects. The GrBackendSemaphore objects
276 * themselves can be deleted as soon as this function returns.
277 *
278 * If the backend API is OpenGL only uninitialized GrBackendSemaphores are supported.
279 * If the backend API is Vulkan either initialized or unitialized semaphores are supported.
280 * If unitialized, the semaphores which are created will be valid for use only with the VkDevice
281 * with which they were created.
282 *
283 * If this call returns GrSemaphoresSubmited::kNo, the GPU backend will not have created or
284 * added any semaphores to signal on the GPU. Thus the client should not have the GPU wait on
285 * any of the semaphores. However, any pending commands to the context will still be flushed.
286 */
287 GrSemaphoresSubmitted flushAndSignalSemaphores(int numSemaphores,
288 GrBackendSemaphore signalSemaphores[]);
289
290 /**
joshualitt0acd0d32015-05-07 08:23:19 -0700291 * An ID associated with this context, guaranteed to be unique.
292 */
293 uint32_t uniqueID() { return fUniqueID; }
294
bsalomon@google.com27847de2011-02-22 20:59:41 +0000295 ///////////////////////////////////////////////////////////////////////////
bsalomon@google.com27847de2011-02-22 20:59:41 +0000296 // Functions intended for internal use only.
Brian Salomon384fab42017-12-07 12:33:05 -0500297 GrGpu* getGpu() { return fGpu.get(); }
298 const GrGpu* getGpu() const { return fGpu.get(); }
Brian Salomonf856fd12016-12-16 14:24:34 -0500299 GrAtlasGlyphCache* getAtlasGlyphCache() { return fAtlasGlyphCache; }
bungeman6bd52842016-10-27 09:30:08 -0700300 GrTextBlobCache* getTextBlobCache() { return fTextBlobCache.get(); }
robertphillips77a2e522015-10-17 07:43:27 -0700301 bool abandoned() const;
bsalomond309e7a2015-04-30 14:18:54 -0700302 GrResourceProvider* resourceProvider() { return fResourceProvider; }
303 const GrResourceProvider* resourceProvider() const { return fResourceProvider; }
bsalomon0ea80f42015-02-11 10:49:59 -0800304 GrResourceCache* getResourceCache() { return fResourceCache; }
bsalomon@google.com9923c2b2012-06-06 18:21:18 +0000305
joshualitte45c81c2015-12-02 09:05:37 -0800306 /** Reset GPU stats */
307 void resetGpuStats() const ;
308
mtkleinb9eb4ac2015-02-02 18:26:03 -0800309 /** Prints cache stats to the string if GR_CACHE_STATS == 1. */
310 void dumpCacheStats(SkString*) const;
joshualittdc5685a2015-12-02 14:08:25 -0800311 void dumpCacheStatsKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) const;
robertphillips@google.com5f9f2f52012-08-22 10:57:05 +0000312 void printCacheStats() const;
robertphillips@google.com5f9f2f52012-08-22 10:57:05 +0000313
mtkleinb9eb4ac2015-02-02 18:26:03 -0800314 /** Prints GPU stats to the string if GR_GPU_STATS == 1. */
315 void dumpGpuStats(SkString*) const;
joshualittdc5685a2015-12-02 14:08:25 -0800316 void dumpGpuStatsKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) const;
mtkleinb9eb4ac2015-02-02 18:26:03 -0800317 void printGpuStats() const;
robertphillips754f4e92014-09-18 13:52:08 -0700318
Brian Osman71a18892017-08-10 10:23:25 -0400319 /** Returns a string with detailed information about the context & GPU, in JSON format. */
320 SkString dump() const;
321
joshualitt17d833b2015-08-03 10:17:44 -0700322 /** Specify the TextBlob cache limit. If the current cache exceeds this limit it will purge.
323 this is for testing only */
324 void setTextBlobCacheLimit_ForTesting(size_t bytes);
325
joshualittda04e0e2015-08-19 08:16:43 -0700326 /** Specify the sizes of the GrAtlasTextContext atlases. The configs pointer below should be
327 to an array of 3 entries */
Brian Salomon2ee084e2016-12-16 18:59:19 -0500328 void setTextContextAtlasSizes_ForTesting(const GrDrawOpAtlasConfig* configs);
joshualittda04e0e2015-08-19 08:16:43 -0700329
ericrk0a5fa482015-09-15 14:16:10 -0700330 /** Enumerates all cached GPU resources and dumps their memory to traceMemoryDump. */
331 void dumpMemoryStatistics(SkTraceMemoryDump* traceMemoryDump) const;
332
Robert Phillips33667da2016-12-20 11:05:30 -0500333 /** Get pointer to atlas texture for given mask format. Note that this wraps an
334 actively mutating texture in an SkImage. This could yield unexpected results
335 if it gets cached or used more generally. */
Robert Phillipsc37e6142017-01-20 10:03:25 -0500336 sk_sp<SkImage> getFontAtlasImage_ForTesting(GrMaskFormat format);
jvanverth629162d2015-11-08 08:07:24 -0800337
joshualitt5651ee62016-01-11 10:39:11 -0800338 GrAuditTrail* getAuditTrail() { return &fAuditTrail; }
joshualitt27a48dc2016-01-08 07:19:47 -0800339
Ethan Nicholasd1b2eec2017-11-01 15:45:43 -0400340 GrContextOptions::PersistentCache* getPersistentCache() { return fPersistentCache; }
341
joshualittce894002016-01-11 13:29:31 -0800342 /** This is only useful for debug purposes */
343 SkDEBUGCODE(GrSingleOwner* debugSingleOwner() const { return &fSingleOwner; } )
344
robertphillips4fd74ae2016-08-03 14:26:53 -0700345 // Provides access to functions that aren't part of the public API.
346 GrContextPriv contextPriv();
347 const GrContextPriv contextPriv() const;
348
bsalomon@google.com27847de2011-02-22 20:59:41 +0000349private:
Brian Salomon384fab42017-12-07 12:33:05 -0500350 sk_sp<GrGpu> fGpu;
Brian Salomoneace8cd2017-12-08 13:11:11 -0500351 sk_sp<const GrCaps> fCaps;
bsalomon41b952c2016-03-11 06:46:33 -0800352 GrResourceCache* fResourceCache;
Brian Osman32342f02017-03-04 08:12:46 -0500353 GrResourceProvider* fResourceProvider;
bsalomond309e7a2015-04-30 14:18:54 -0700354
bungeman6bd52842016-10-27 09:30:08 -0700355 sk_sp<GrContextThreadSafeProxy> fThreadSafeProxy;
bsalomon41b952c2016-03-11 06:46:33 -0800356
Brian Salomonf856fd12016-12-16 14:24:34 -0500357 GrAtlasGlyphCache* fAtlasGlyphCache;
bungeman6bd52842016-10-27 09:30:08 -0700358 std::unique_ptr<GrTextBlobCache> fTextBlobCache;
bsalomon@google.comdfe75bc2011-03-25 12:31:16 +0000359
Brian Osman46da1cc2017-02-14 14:15:48 -0500360 bool fDisableGpuYUVConversion;
bsalomon41b952c2016-03-11 06:46:33 -0800361 bool fDidTestPMConversions;
Brian Osman28804f32017-04-20 10:24:36 -0400362 // true if the PM/UPM conversion succeeded; false otherwise
363 bool fPMUPMConversionsRoundTrip;
bsalomon@google.coma04e8e82012-08-27 12:53:13 +0000364
joshualitt1de610a2016-01-06 08:26:09 -0800365 // In debug builds we guard against improper thread handling
joshualittde8dc7e2016-01-08 10:09:13 -0800366 // This guard is passed to the GrDrawingManager and, from there to all the
Brian Osman32342f02017-03-04 08:12:46 -0500367 // GrRenderTargetContexts. It is also passed to the GrResourceProvider and SkGpuDevice.
bsalomon41b952c2016-03-11 06:46:33 -0800368 mutable GrSingleOwner fSingleOwner;
joshualitt1de610a2016-01-06 08:26:09 -0800369
Brian Osman51279982017-08-23 10:12:00 -0400370 std::unique_ptr<SkTaskGroup> fTaskGroup;
371
robertphillips@google.comcdb426d2012-09-24 19:33:59 +0000372 struct CleanUpData {
373 PFCleanUpFunc fFunc;
374 void* fInfo;
375 };
376
bsalomon41b952c2016-03-11 06:46:33 -0800377 SkTDArray<CleanUpData> fCleanUpData;
robertphillips@google.com44a91dc2013-07-25 15:32:06 +0000378
bsalomon41b952c2016-03-11 06:46:33 -0800379 const uint32_t fUniqueID;
krajcevski9c6d4d72014-08-12 07:26:25 -0700380
bungeman6bd52842016-10-27 09:30:08 -0700381 std::unique_ptr<GrDrawingManager> fDrawingManager;
robertphillips77a2e522015-10-17 07:43:27 -0700382
bsalomon41b952c2016-03-11 06:46:33 -0800383 GrAuditTrail fAuditTrail;
joshualitt27a48dc2016-01-08 07:19:47 -0800384
Robert Phillipse42edcc2017-12-13 11:50:22 -0500385 const GrBackend fBackend;
Greg Danielfc978fd2017-04-13 09:54:12 -0400386
Ethan Nicholasd1b2eec2017-11-01 15:45:43 -0400387 GrContextOptions::PersistentCache* fPersistentCache;
388
Brian Osman11052242016-10-27 14:47:55 -0400389 // TODO: have the GrClipStackClip use renderTargetContexts and rm this friending
robertphillips4fd74ae2016-08-03 14:26:53 -0700390 friend class GrContextPriv;
csmartdaltonc6f411e2016-08-05 22:32:12 -0700391
Robert Phillipse42edcc2017-12-13 11:50:22 -0500392 GrContext(GrBackend); // init must be called after the constructor.
393 GrContext(GrContextThreadSafeProxy*);
394 bool init(const GrContextOptions&);
robertphillipsea461502015-05-26 11:38:03 -0700395
skia.committer@gmail.comcdcb2ce2013-01-29 07:05:52 +0000396 /**
Brian Osman409e74f2017-04-17 11:48:28 -0400397 * These functions create premul <-> unpremul effects. If the second argument is 'true', they
398 * use the specialized round-trip effects from GrConfigConversionEffect, otherwise they
399 * create effects that do naive multiply or divide.
bsalomon@google.comadc65362013-01-28 14:26:09 +0000400 */
Brian Salomonaff329b2017-08-11 09:40:37 -0400401 std::unique_ptr<GrFragmentProcessor> createPMToUPMEffect(std::unique_ptr<GrFragmentProcessor>,
402 bool useConfigConversionEffect);
403 std::unique_ptr<GrFragmentProcessor> createUPMToPMEffect(std::unique_ptr<GrFragmentProcessor>,
404 bool useConfigConversionEffect);
Brian Osman409e74f2017-04-17 11:48:28 -0400405
406 /**
407 * Returns true if createPMtoUPMEffect and createUPMToPMEffect will succeed for non-sRGB 8888
408 * configs. In other words, did we find a pair of round-trip preserving conversion effects?
409 */
410 bool validPMUPMConversionExists();
bsalomon@google.coma04e8e82012-08-27 12:53:13 +0000411
commit-bot@chromium.orgcae27fe2013-07-10 10:14:35 +0000412 /**
joshualitt0db6dfa2015-04-10 07:01:30 -0700413 * A callback similar to the above for use by the TextBlobCache
414 * TODO move textblob draw calls below context so we can use the call above.
415 */
416 static void TextBlobCacheOverBudgetCB(void* data);
417
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +0000418 typedef SkRefCnt INHERITED;
bsalomon@google.com27847de2011-02-22 20:59:41 +0000419};
420
bsalomon41b952c2016-03-11 06:46:33 -0800421/**
422 * Can be used to perform actions related to the generating GrContext in a thread safe manner. The
423 * proxy does not access the 3D API (e.g. OpenGL) that backs the generating GrContext.
424 */
425class GrContextThreadSafeProxy : public SkRefCnt {
Robert Phillips8def8bf2017-11-30 08:46:03 -0500426public:
427 bool matches(GrContext* context) const { return context->uniqueID() == fContextUniqueID; }
428
bsalomon41b952c2016-03-11 06:46:33 -0800429private:
Robert Phillipse42edcc2017-12-13 11:50:22 -0500430 // DDL TODO: need to add unit tests for backend & maybe options
431 GrContextThreadSafeProxy(sk_sp<const GrCaps> caps,
432 uint32_t uniqueID,
433 GrBackend backend,
434 const GrContextOptions& options)
bungeman6bd52842016-10-27 09:30:08 -0700435 : fCaps(std::move(caps))
Robert Phillipse42edcc2017-12-13 11:50:22 -0500436 , fContextUniqueID(uniqueID)
437 , fBackend(backend)
438 , fOptions(options) {
439 }
bsalomon41b952c2016-03-11 06:46:33 -0800440
Robert Phillipse42edcc2017-12-13 11:50:22 -0500441 sk_sp<const GrCaps> fCaps;
442 const uint32_t fContextUniqueID;
443 const GrBackend fBackend;
444 const GrContextOptions fOptions;
bsalomon41b952c2016-03-11 06:46:33 -0800445
446 friend class GrContext;
Robert Phillipse42edcc2017-12-13 11:50:22 -0500447 friend class GrContextPriv;
bsalomon41b952c2016-03-11 06:46:33 -0800448 friend class SkImage;
449
450 typedef SkRefCnt INHERITED;
451};
452
bsalomon@google.com27847de2011-02-22 20:59:41 +0000453#endif