blob: 7510a7312d21069d8ba0ce5947ef8f5ff8037a32 [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"
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;
bsalomon682c2692015-05-22 14:01:46 -070021struct GrContextOptions;
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;
Mike Reed84dd8572017-03-08 22:21:00 -050037class GrSamplerParams;
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
Greg Daniel02611d92017-07-25 10:05:01 -040059 static sk_sp<GrContext> MakeGL(const GrGLInterface*, const GrContextOptions&);
60 static sk_sp<GrContext> MakeGL(const GrGLInterface*);
61
62#ifdef SK_VULKAN
63 static sk_sp<GrContext> MakeVulkan(const GrVkBackendContext*, const GrContextOptions&);
64 static sk_sp<GrContext> MakeVulkan(const GrVkBackendContext*);
65#endif
66
Greg Danielb76a72a2017-07-13 15:07:54 -040067#ifdef SK_METAL
68 /**
69 * Makes a GrContext which uses Metal as the backend. The device parameter is an MTLDevice
70 * and queue is an MTLCommandQueue which should be used by the backend. These objects must
71 * have a ref on them which can be transferred to Ganesh which will release the ref when the
72 * GrContext is destroyed.
73 */
74 static sk_sp<GrContext> MakeMetal(void* device, void* queue, const GrContextOptions& options);
Greg Daniel02611d92017-07-25 10:05:01 -040075 static sk_sp<GrContext> MakeMetal(void* device, void* queue);
Greg Danielb76a72a2017-07-13 15:07:54 -040076#endif
77
Greg Daniel02611d92017-07-25 10:05:01 -040078 static sk_sp<GrContext> MakeMock(const GrMockOptions*, const GrContextOptions&);
79 static sk_sp<GrContext> MakeMock(const GrMockOptions*);
80
bsalomon@google.com27847de2011-02-22 20:59:41 +000081 virtual ~GrContext();
82
bungeman6bd52842016-10-27 09:30:08 -070083 sk_sp<GrContextThreadSafeProxy> threadSafeProxy();
bsalomon41b952c2016-03-11 06:46:33 -080084
bsalomon@google.com27847de2011-02-22 20:59:41 +000085 /**
86 * The GrContext normally assumes that no outsider is setting state
87 * within the underlying 3D API's context/device/whatever. This call informs
88 * the context that the state was modified and it should resend. Shouldn't
89 * be called frequently for good performance.
bsalomon@google.com0a208a12013-06-28 18:57:35 +000090 * The flag bits, state, is dpendent on which backend is used by the
91 * context, either GL or D3D (possible in future).
bsalomon@google.com27847de2011-02-22 20:59:41 +000092 */
bsalomon@google.com0a208a12013-06-28 18:57:35 +000093 void resetContext(uint32_t state = kAll_GrBackendState);
bsalomon@google.com27847de2011-02-22 20:59:41 +000094
bsalomon@google.com8fe72472011-03-30 21:26:44 +000095 /**
robertphillips@google.comcdb426d2012-09-24 19:33:59 +000096 * Callback function to allow classes to cleanup on GrContext destruction.
97 * The 'info' field is filled in with the 'info' passed to addCleanUp.
98 */
99 typedef void (*PFCleanUpFunc)(const GrContext* context, void* info);
100
101 /**
102 * Add a function to be called from within GrContext's destructor.
103 * This gives classes a chance to free resources held on a per context basis.
104 * The 'info' parameter will be stored and passed to the callback function.
105 */
106 void addCleanUp(PFCleanUpFunc cleanUp, void* info) {
107 CleanUpData* entry = fCleanUpData.push();
108
109 entry->fFunc = cleanUp;
110 entry->fInfo = info;
111 }
112
113 /**
bsalomon6e2aad42016-04-01 11:54:31 -0700114 * Abandons all GPU resources and assumes the underlying backend 3D API context is not longer
115 * usable. Call this if you have lost the associated GPU context, and thus internal texture,
116 * buffer, etc. references/IDs are now invalid. Calling this ensures that the destructors of the
117 * GrContext and any of its created resource objects will not make backend 3D API calls. Content
118 * rendered but not previously flushed may be lost. After this function is called all subsequent
119 * calls on the GrContext will fail or be no-ops.
120 *
121 * The typical use case for this function is that the underlying 3D context was lost and further
122 * API calls may crash.
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000123 */
bsalomon2354f842014-07-28 13:48:36 -0700124 void abandonContext();
junov@google.com53a55842011-06-08 22:55:10 +0000125
bsalomon6e2aad42016-04-01 11:54:31 -0700126 /**
127 * This is similar to abandonContext() however the underlying 3D context is not yet lost and
128 * the GrContext will cleanup all allocated resources before returning. After returning it will
129 * assume that the underlying context may no longer be valid.
130 *
131 * The typical use case for this function is that the client is going to destroy the 3D context
132 * but can't guarantee that GrContext will be destroyed first (perhaps because it may be ref'ed
133 * elsewhere by either the client or Skia objects).
134 */
135 void releaseResourcesAndAbandonContext();
136
commit-bot@chromium.org95c20032014-05-09 14:29:32 +0000137 ///////////////////////////////////////////////////////////////////////////
138 // Resource Cache
139
140 /**
141 * Return the current GPU resource cache limits.
142 *
143 * @param maxResources If non-null, returns maximum number of resources that
144 * can be held in the cache.
145 * @param maxResourceBytes If non-null, returns maximum number of bytes of
146 * video memory that can be held in the cache.
147 */
148 void getResourceCacheLimits(int* maxResources, size_t* maxResourceBytes) const;
commit-bot@chromium.org95c20032014-05-09 14:29:32 +0000149
150 /**
151 * Gets the current GPU resource cache usage.
152 *
153 * @param resourceCount If non-null, returns the number of resources that are held in the
154 * cache.
155 * @param maxResourceBytes If non-null, returns the total number of bytes of video memory held
156 * in the cache.
157 */
158 void getResourceCacheUsage(int* resourceCount, size_t* resourceBytes) const;
159
commit-bot@chromium.org95c20032014-05-09 14:29:32 +0000160 /**
Derek Sollenbergeree479142017-05-24 11:41:33 -0400161 * Gets the number of bytes in the cache consumed by purgeable (e.g. unlocked) resources.
162 */
163 size_t getResourceCachePurgeableBytes() const;
164
165 /**
commit-bot@chromium.org95c20032014-05-09 14:29:32 +0000166 * Specify the GPU resource cache limits. If the current cache exceeds either
167 * of these, it will be purged (LRU) to keep the cache within these limits.
168 *
169 * @param maxResources The maximum number of resources that can be held in
170 * the cache.
171 * @param maxResourceBytes The maximum number of bytes of video memory
172 * that can be held in the cache.
173 */
174 void setResourceCacheLimits(int maxResources, size_t maxResourceBytes);
commit-bot@chromium.org95c20032014-05-09 14:29:32 +0000175
junov@google.com53a55842011-06-08 22:55:10 +0000176 /**
bsalomon@google.com1e269b52012-10-15 14:25:31 +0000177 * Frees GPU created by the context. Can be called to reduce GPU memory
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000178 * pressure.
bsalomon@google.com27847de2011-02-22 20:59:41 +0000179 */
bsalomon@google.com8fe72472011-03-30 21:26:44 +0000180 void freeGpuResources();
181
bsalomon@google.com07fc0d12012-06-22 15:15:59 +0000182 /**
commit-bot@chromium.org95c20032014-05-09 14:29:32 +0000183 * Purge all the unlocked resources from the cache.
184 * This entry point is mainly meant for timing texture uploads
185 * and is not defined in normal builds of Skia.
commit-bot@chromium.orgd8a57af2014-03-19 21:19:16 +0000186 */
commit-bot@chromium.org95c20032014-05-09 14:29:32 +0000187 void purgeAllUnlockedResources();
188
Brian Salomon5e150852017-03-22 14:53:13 -0400189 /**
190 * Purge GPU resources that haven't been used in the past 'ms' milliseconds, regardless of
191 * whether the context is currently under budget.
192 */
193 void purgeResourcesNotUsedInMs(std::chrono::milliseconds ms);
194
Derek Sollenberger5480a182017-05-25 16:43:59 -0400195 /**
196 * Purge unlocked resources from the cache until the the provided byte count has been reached
197 * or we have purged all unlocked resources. The default policy is to purge in LRU order, but
198 * can be overridden to prefer purging scratch resources (in LRU order) prior to purging other
199 * resource types.
200 *
201 * @param maxBytesToPurge the desired number of bytes to be purged.
202 * @param preferScratchResources If true scratch resources will be purged prior to other
203 * resource types.
204 */
205 void purgeUnlockedResources(size_t bytesToPurge, bool preferScratchResources);
206
bsalomon76228632015-05-29 08:02:10 -0700207 /** Access the context capabilities */
208 const GrCaps* caps() const { return fCaps; }
bsalomon@google.com8a70eef2013-03-19 13:58:55 +0000209
commit-bot@chromium.orgb471a322014-03-10 07:40:03 +0000210 /**
211 * Returns the recommended sample count for a render target when using this
212 * context.
213 *
214 * @param config the configuration of the render target.
215 * @param dpi the display density in dots per inch.
216 *
217 * @return sample count that should be perform well and have good enough
218 * rendering quality for the display. Alternatively returns 0 if
219 * MSAA is not supported or recommended to be used by default.
220 */
221 int getRecommendedSampleCount(GrPixelConfig config, SkScalar dpi) const;
222
Robert Phillipsdd3b3f42017-04-24 10:57:28 -0400223 /*
224 * Create a new render target context backed by a deferred-style
225 * GrRenderTargetProxy. We guarantee that "asTextureProxy" will succeed for
226 * renderTargetContexts created via this entry point.
robertphillipsd4c741e2016-04-28 09:55:15 -0700227 */
Robert Phillips2af746c2017-04-21 12:28:48 +0000228 sk_sp<GrRenderTargetContext> makeDeferredRenderTargetContext(
Robert Phillipsdd3b3f42017-04-24 10:57:28 -0400229 SkBackingFit fit,
Robert Phillips2af746c2017-04-21 12:28:48 +0000230 int width, int height,
231 GrPixelConfig config,
232 sk_sp<SkColorSpace> colorSpace,
233 int sampleCnt = 0,
234 GrSurfaceOrigin origin = kBottomLeft_GrSurfaceOrigin,
235 const SkSurfaceProps* surfaceProps = nullptr,
236 SkBudgeted = SkBudgeted::kYes);
robertphillips48fde9c2016-09-06 05:20:20 -0700237 /*
Brian Osman11052242016-10-27 14:47:55 -0400238 * This method will attempt to create a renderTargetContext that has, at least, the number of
robertphillips48fde9c2016-09-06 05:20:20 -0700239 * channels and precision per channel as requested in 'config' (e.g., A8 and 888 can be
240 * converted to 8888). It may also swizzle the channels (e.g., BGRA -> RGBA).
241 * SRGB-ness will be preserved.
242 */
robertphillipsd728f0c2016-11-21 11:05:03 -0800243 sk_sp<GrRenderTargetContext> makeDeferredRenderTargetContextWithFallback(
244 SkBackingFit fit,
245 int width, int height,
246 GrPixelConfig config,
247 sk_sp<SkColorSpace> colorSpace,
248 int sampleCnt = 0,
Robert Phillips40fd7c92017-01-30 08:06:27 -0500249 GrSurfaceOrigin origin = kBottomLeft_GrSurfaceOrigin,
robertphillipsd728f0c2016-11-21 11:05:03 -0800250 const SkSurfaceProps* surfaceProps = nullptr,
251 SkBudgeted budgeted = SkBudgeted::kYes);
252
bsalomon@google.com27847de2011-02-22 20:59:41 +0000253 ///////////////////////////////////////////////////////////////////////////
254 // Misc.
255
256 /**
Greg Daniel51316782017-08-02 15:10:09 +0000257 * Call to ensure all drawing to the context has been issued to the underlying 3D API.
bsalomon@google.com27847de2011-02-22 20:59:41 +0000258 */
bsalomonb77a9072016-09-07 10:02:04 -0700259 void flush();
robertphillipsea461502015-05-26 11:38:03 -0700260
senorblanco@chromium.org027de5f2011-07-08 18:03:33 +0000261 /**
Greg Daniel51316782017-08-02 15:10:09 +0000262 * Call to ensure all drawing to the context has been issued to the underlying 3D API. After
263 * issuing all commands, numSemaphore semaphores will be signaled by the gpu. The client passes
264 * in an array of numSemaphores GrBackendSemaphores. In general these GrBackendSemaphore's can
265 * be either initialized or not. If they are initialized, the backend uses the passed in
266 * semaphore. If it is not initialized, a new semaphore is created and the GrBackendSemaphore
267 * object is initialized with that semaphore.
268 *
269 * The client will own and be responsible for deleting the underlying semaphores that are stored
270 * and returned in initialized GrBackendSemaphore objects. The GrBackendSemaphore objects
271 * themselves can be deleted as soon as this function returns.
272 *
273 * If the backend API is OpenGL only uninitialized GrBackendSemaphores are supported.
274 * If the backend API is Vulkan either initialized or unitialized semaphores are supported.
275 * If unitialized, the semaphores which are created will be valid for use only with the VkDevice
276 * with which they were created.
277 *
278 * If this call returns GrSemaphoresSubmited::kNo, the GPU backend will not have created or
279 * added any semaphores to signal on the GPU. Thus the client should not have the GPU wait on
280 * any of the semaphores. However, any pending commands to the context will still be flushed.
281 */
282 GrSemaphoresSubmitted flushAndSignalSemaphores(int numSemaphores,
283 GrBackendSemaphore signalSemaphores[]);
284
285 /**
joshualitt0acd0d32015-05-07 08:23:19 -0700286 * An ID associated with this context, guaranteed to be unique.
287 */
288 uint32_t uniqueID() { return fUniqueID; }
289
bsalomon@google.com27847de2011-02-22 20:59:41 +0000290 ///////////////////////////////////////////////////////////////////////////
bsalomon@google.com27847de2011-02-22 20:59:41 +0000291 // Functions intended for internal use only.
292 GrGpu* getGpu() { return fGpu; }
bsalomon@google.com1f221a72011-08-23 20:54:07 +0000293 const GrGpu* getGpu() const { return fGpu; }
Brian Salomonf856fd12016-12-16 14:24:34 -0500294 GrAtlasGlyphCache* getAtlasGlyphCache() { return fAtlasGlyphCache; }
bungeman6bd52842016-10-27 09:30:08 -0700295 GrTextBlobCache* getTextBlobCache() { return fTextBlobCache.get(); }
robertphillips77a2e522015-10-17 07:43:27 -0700296 bool abandoned() const;
bsalomond309e7a2015-04-30 14:18:54 -0700297 GrResourceProvider* resourceProvider() { return fResourceProvider; }
298 const GrResourceProvider* resourceProvider() const { return fResourceProvider; }
bsalomon0ea80f42015-02-11 10:49:59 -0800299 GrResourceCache* getResourceCache() { return fResourceCache; }
bsalomon@google.com9923c2b2012-06-06 18:21:18 +0000300
joshualitte45c81c2015-12-02 09:05:37 -0800301 /** Reset GPU stats */
302 void resetGpuStats() const ;
303
mtkleinb9eb4ac2015-02-02 18:26:03 -0800304 /** Prints cache stats to the string if GR_CACHE_STATS == 1. */
305 void dumpCacheStats(SkString*) const;
joshualittdc5685a2015-12-02 14:08:25 -0800306 void dumpCacheStatsKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) const;
robertphillips@google.com5f9f2f52012-08-22 10:57:05 +0000307 void printCacheStats() const;
robertphillips@google.com5f9f2f52012-08-22 10:57:05 +0000308
mtkleinb9eb4ac2015-02-02 18:26:03 -0800309 /** Prints GPU stats to the string if GR_GPU_STATS == 1. */
310 void dumpGpuStats(SkString*) const;
joshualittdc5685a2015-12-02 14:08:25 -0800311 void dumpGpuStatsKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) const;
mtkleinb9eb4ac2015-02-02 18:26:03 -0800312 void printGpuStats() const;
robertphillips754f4e92014-09-18 13:52:08 -0700313
Brian Osman71a18892017-08-10 10:23:25 -0400314 /** Returns a string with detailed information about the context & GPU, in JSON format. */
315 SkString dump() const;
316
joshualitt17d833b2015-08-03 10:17:44 -0700317 /** Specify the TextBlob cache limit. If the current cache exceeds this limit it will purge.
318 this is for testing only */
319 void setTextBlobCacheLimit_ForTesting(size_t bytes);
320
joshualittda04e0e2015-08-19 08:16:43 -0700321 /** Specify the sizes of the GrAtlasTextContext atlases. The configs pointer below should be
322 to an array of 3 entries */
Brian Salomon2ee084e2016-12-16 18:59:19 -0500323 void setTextContextAtlasSizes_ForTesting(const GrDrawOpAtlasConfig* configs);
joshualittda04e0e2015-08-19 08:16:43 -0700324
ericrk0a5fa482015-09-15 14:16:10 -0700325 /** Enumerates all cached GPU resources and dumps their memory to traceMemoryDump. */
326 void dumpMemoryStatistics(SkTraceMemoryDump* traceMemoryDump) const;
327
Robert Phillips33667da2016-12-20 11:05:30 -0500328 /** Get pointer to atlas texture for given mask format. Note that this wraps an
329 actively mutating texture in an SkImage. This could yield unexpected results
330 if it gets cached or used more generally. */
Robert Phillipsc37e6142017-01-20 10:03:25 -0500331 sk_sp<SkImage> getFontAtlasImage_ForTesting(GrMaskFormat format);
jvanverth629162d2015-11-08 08:07:24 -0800332
joshualitt5651ee62016-01-11 10:39:11 -0800333 GrAuditTrail* getAuditTrail() { return &fAuditTrail; }
joshualitt27a48dc2016-01-08 07:19:47 -0800334
joshualittce894002016-01-11 13:29:31 -0800335 /** This is only useful for debug purposes */
336 SkDEBUGCODE(GrSingleOwner* debugSingleOwner() const { return &fSingleOwner; } )
337
robertphillips4fd74ae2016-08-03 14:26:53 -0700338 // Provides access to functions that aren't part of the public API.
339 GrContextPriv contextPriv();
340 const GrContextPriv contextPriv() const;
341
bsalomon@google.com27847de2011-02-22 20:59:41 +0000342private:
bsalomon41b952c2016-03-11 06:46:33 -0800343 GrGpu* fGpu;
344 const GrCaps* fCaps;
345 GrResourceCache* fResourceCache;
Brian Osman32342f02017-03-04 08:12:46 -0500346 GrResourceProvider* fResourceProvider;
bsalomond309e7a2015-04-30 14:18:54 -0700347
bungeman6bd52842016-10-27 09:30:08 -0700348 sk_sp<GrContextThreadSafeProxy> fThreadSafeProxy;
bsalomon41b952c2016-03-11 06:46:33 -0800349
Brian Salomonf856fd12016-12-16 14:24:34 -0500350 GrAtlasGlyphCache* fAtlasGlyphCache;
bungeman6bd52842016-10-27 09:30:08 -0700351 std::unique_ptr<GrTextBlobCache> fTextBlobCache;
bsalomon@google.comdfe75bc2011-03-25 12:31:16 +0000352
Brian Osman46da1cc2017-02-14 14:15:48 -0500353 bool fDisableGpuYUVConversion;
bsalomon41b952c2016-03-11 06:46:33 -0800354 bool fDidTestPMConversions;
Brian Osman28804f32017-04-20 10:24:36 -0400355 // true if the PM/UPM conversion succeeded; false otherwise
356 bool fPMUPMConversionsRoundTrip;
bsalomon@google.coma04e8e82012-08-27 12:53:13 +0000357
joshualitt1de610a2016-01-06 08:26:09 -0800358 // In debug builds we guard against improper thread handling
joshualittde8dc7e2016-01-08 10:09:13 -0800359 // This guard is passed to the GrDrawingManager and, from there to all the
Brian Osman32342f02017-03-04 08:12:46 -0500360 // GrRenderTargetContexts. It is also passed to the GrResourceProvider and SkGpuDevice.
bsalomon41b952c2016-03-11 06:46:33 -0800361 mutable GrSingleOwner fSingleOwner;
joshualitt1de610a2016-01-06 08:26:09 -0800362
Brian Osman51279982017-08-23 10:12:00 -0400363 std::unique_ptr<SkTaskGroup> fTaskGroup;
364
robertphillips@google.comcdb426d2012-09-24 19:33:59 +0000365 struct CleanUpData {
366 PFCleanUpFunc fFunc;
367 void* fInfo;
368 };
369
bsalomon41b952c2016-03-11 06:46:33 -0800370 SkTDArray<CleanUpData> fCleanUpData;
robertphillips@google.com44a91dc2013-07-25 15:32:06 +0000371
bsalomon41b952c2016-03-11 06:46:33 -0800372 const uint32_t fUniqueID;
krajcevski9c6d4d72014-08-12 07:26:25 -0700373
bungeman6bd52842016-10-27 09:30:08 -0700374 std::unique_ptr<GrDrawingManager> fDrawingManager;
robertphillips77a2e522015-10-17 07:43:27 -0700375
bsalomon41b952c2016-03-11 06:46:33 -0800376 GrAuditTrail fAuditTrail;
joshualitt27a48dc2016-01-08 07:19:47 -0800377
Greg Danielfc978fd2017-04-13 09:54:12 -0400378 GrBackend fBackend;
379
Brian Osman11052242016-10-27 14:47:55 -0400380 // TODO: have the GrClipStackClip use renderTargetContexts and rm this friending
robertphillips4fd74ae2016-08-03 14:26:53 -0700381 friend class GrContextPriv;
csmartdaltonc6f411e2016-08-05 22:32:12 -0700382
bsalomon682c2692015-05-22 14:01:46 -0700383 GrContext(); // init must be called after the constructor.
384 bool init(GrBackend, GrBackendContext, const GrContextOptions& options);
Greg Danielb76a72a2017-07-13 15:07:54 -0400385 bool init(const GrContextOptions& options);
robertphillipsea461502015-05-26 11:38:03 -0700386
skia.committer@gmail.comcdcb2ce2013-01-29 07:05:52 +0000387 /**
Brian Osman409e74f2017-04-17 11:48:28 -0400388 * These functions create premul <-> unpremul effects. If the second argument is 'true', they
389 * use the specialized round-trip effects from GrConfigConversionEffect, otherwise they
390 * create effects that do naive multiply or divide.
bsalomon@google.comadc65362013-01-28 14:26:09 +0000391 */
Brian Salomonaff329b2017-08-11 09:40:37 -0400392 std::unique_ptr<GrFragmentProcessor> createPMToUPMEffect(std::unique_ptr<GrFragmentProcessor>,
393 bool useConfigConversionEffect);
394 std::unique_ptr<GrFragmentProcessor> createUPMToPMEffect(std::unique_ptr<GrFragmentProcessor>,
395 bool useConfigConversionEffect);
Brian Osman409e74f2017-04-17 11:48:28 -0400396
397 /**
398 * Returns true if createPMtoUPMEffect and createUPMToPMEffect will succeed for non-sRGB 8888
399 * configs. In other words, did we find a pair of round-trip preserving conversion effects?
400 */
401 bool validPMUPMConversionExists();
bsalomon@google.coma04e8e82012-08-27 12:53:13 +0000402
commit-bot@chromium.orgcae27fe2013-07-10 10:14:35 +0000403 /**
joshualitt0db6dfa2015-04-10 07:01:30 -0700404 * A callback similar to the above for use by the TextBlobCache
405 * TODO move textblob draw calls below context so we can use the call above.
406 */
407 static void TextBlobCacheOverBudgetCB(void* data);
408
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +0000409 typedef SkRefCnt INHERITED;
bsalomon@google.com27847de2011-02-22 20:59:41 +0000410};
411
bsalomon41b952c2016-03-11 06:46:33 -0800412/**
413 * Can be used to perform actions related to the generating GrContext in a thread safe manner. The
414 * proxy does not access the 3D API (e.g. OpenGL) that backs the generating GrContext.
415 */
416class GrContextThreadSafeProxy : public SkRefCnt {
417private:
bungeman6bd52842016-10-27 09:30:08 -0700418 GrContextThreadSafeProxy(sk_sp<const GrCaps> caps, uint32_t uniqueID)
419 : fCaps(std::move(caps))
bsalomon41b952c2016-03-11 06:46:33 -0800420 , fContextUniqueID(uniqueID) {}
421
bungeman6bd52842016-10-27 09:30:08 -0700422 sk_sp<const GrCaps> fCaps;
423 uint32_t fContextUniqueID;
bsalomon41b952c2016-03-11 06:46:33 -0800424
425 friend class GrContext;
426 friend class SkImage;
427
428 typedef SkRefCnt INHERITED;
429};
430
bsalomon@google.com27847de2011-02-22 20:59:41 +0000431#endif