blob: 86af1f363a2986115bfcb25573c5a537c9ce37b2 [file] [log] [blame]
robertphillips4fd74ae2016-08-03 14:26:53 -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 GrContextPriv_DEFINED
9#define GrContextPriv_DEFINED
10
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/gpu/GrContext.h"
12#include "src/gpu/GrSurfaceContext.h"
13#include "src/gpu/text/GrAtlasManager.h"
robertphillips4fd74ae2016-08-03 14:26:53 -070014
Greg Daniel4065d452018-11-16 15:43:41 -050015class GrBackendFormat;
Greg Danielbcf612b2017-05-01 13:50:58 +000016class GrBackendRenderTarget;
Robert Phillipsc994a932018-06-19 13:09:54 -040017class GrOpMemoryPool;
Brian Salomond17f6582017-07-19 18:28:58 -040018class GrOnFlushCallbackObject;
Greg Danield85f97d2017-03-07 13:37:21 -050019class GrSemaphore;
Ethan Nicholas00543112018-07-31 09:44:36 -040020class GrSkSLFPFactory;
Robert Phillipsbc429442019-02-20 08:26:03 -050021class GrSkSLFPFactoryCache;
Robert Phillipse2f7d182016-12-15 09:23:05 -050022class GrSurfaceProxy;
Brian Salomond17f6582017-07-19 18:28:58 -040023class GrTextureContext;
Robert Phillipse2f7d182016-12-15 09:23:05 -050024
Robert Phillips62000362018-02-01 09:10:04 -050025class SkDeferredDisplayList;
Robert Phillipsbc429442019-02-20 08:26:03 -050026class SkTaskGroup;
Robert Phillips62000362018-02-01 09:10:04 -050027
robertphillips4fd74ae2016-08-03 14:26:53 -070028/** Class that adds methods to GrContext that are only intended for use internal to Skia.
29 This class is purely a privileged window into GrContext. It should never have additional
30 data members or virtual methods. */
31class GrContextPriv {
32public:
Robert Phillips4217ea72019-01-30 13:08:28 -050033
34 // from GrContext_Base
Robert Phillipsfd0d9702019-02-01 10:19:42 -050035 uint32_t contextID() const { return fContext->contextID(); }
Robert Phillips4217ea72019-01-30 13:08:28 -050036
Robert Phillipsfe0963c2019-02-07 13:25:07 -050037 bool matches(GrContext_Base* candidate) const { return fContext->matches(candidate); }
38
Robert Phillipsc1541ae2019-02-04 12:05:37 -050039 const GrContextOptions& options() const { return fContext->options(); }
40
Robert Phillipsbb606772019-02-04 17:50:57 -050041 const GrCaps* caps() const { return fContext->caps(); }
Robert Phillipsa41c6852019-02-07 10:44:10 -050042 sk_sp<const GrCaps> refCaps() const;
Robert Phillipsbb606772019-02-04 17:50:57 -050043
44 sk_sp<GrSkSLFPFactoryCache> fpFactoryCache();
45
Robert Phillipsa41c6852019-02-07 10:44:10 -050046 GrImageContext* asImageContext() { return fContext->asImageContext(); }
47 GrRecordingContext* asRecordingContext() { return fContext->asRecordingContext(); }
48 GrContext* asDirectContext() { return fContext->asDirectContext(); }
49
Robert Phillips4217ea72019-01-30 13:08:28 -050050 // from GrImageContext
Robert Phillipsa41c6852019-02-07 10:44:10 -050051 GrProxyProvider* proxyProvider() { return fContext->proxyProvider(); }
52 const GrProxyProvider* proxyProvider() const { return fContext->proxyProvider(); }
53
Robert Phillips6a6de562019-02-15 15:19:15 -050054 bool abandoned() const { return fContext->abandoned(); }
55
Robert Phillipsa41c6852019-02-07 10:44:10 -050056 /** This is only useful for debug purposes */
57 SkDEBUGCODE(GrSingleOwner* singleOwner() const { return fContext->singleOwner(); } )
Robert Phillips4217ea72019-01-30 13:08:28 -050058
59 // from GrRecordingContext
Robert Phillips6f0e02f2019-02-13 11:02:28 -050060 GrDrawingManager* drawingManager() { return fContext->drawingManager(); }
61
Robert Phillipsd6841482019-02-08 10:29:20 -050062 sk_sp<GrOpMemoryPool> refOpMemoryPool();
63 GrOpMemoryPool* opMemoryPool() { return fContext->opMemoryPool(); }
64
Herb Derbya00da612019-03-04 17:10:01 -050065 GrStrikeCache* getGrStrikeCache() { return fContext->getGrStrikeCache(); }
Robert Phillips2184fb72019-02-21 16:11:41 -050066 GrTextBlobCache* getTextBlobCache() { return fContext->getTextBlobCache(); }
67
Robert Phillipsc5058a62019-02-15 12:52:59 -050068 /**
69 * Registers an object for flush-related callbacks. (See GrOnFlushCallbackObject.)
70 *
71 * NOTE: the drawing manager tracks this object as a raw pointer; it is up to the caller to
72 * ensure its lifetime is tied to that of the context.
73 */
74 void addOnFlushCallbackObject(GrOnFlushCallbackObject*);
75
Robert Phillips292a6b22019-02-14 14:49:02 -050076 sk_sp<GrSurfaceContext> makeWrappedSurfaceContext(sk_sp<GrSurfaceProxy>,
77 sk_sp<SkColorSpace> = nullptr,
78 const SkSurfaceProps* = nullptr);
79
80 sk_sp<GrSurfaceContext> makeDeferredSurfaceContext(const GrBackendFormat&,
81 const GrSurfaceDesc&,
82 GrSurfaceOrigin,
83 GrMipMapped,
84 SkBackingFit,
85 SkBudgeted,
86 sk_sp<SkColorSpace> colorSpace = nullptr,
87 const SkSurfaceProps* = nullptr);
88
Robert Phillipsb97da532019-02-12 15:24:12 -050089 /*
90 * Create a new render target context backed by a deferred-style
91 * GrRenderTargetProxy. We guarantee that "asTextureProxy" will succeed for
92 * renderTargetContexts created via this entry point.
93 */
94 sk_sp<GrRenderTargetContext> makeDeferredRenderTargetContext(
95 const GrBackendFormat& format,
96 SkBackingFit fit,
97 int width, int height,
98 GrPixelConfig config,
99 sk_sp<SkColorSpace> colorSpace,
100 int sampleCnt = 1,
101 GrMipMapped = GrMipMapped::kNo,
102 GrSurfaceOrigin origin = kBottomLeft_GrSurfaceOrigin,
103 const SkSurfaceProps* surfaceProps = nullptr,
104 SkBudgeted = SkBudgeted::kYes);
105
Robert Phillips6f0e02f2019-02-13 11:02:28 -0500106 /*
107 * This method will attempt to create a renderTargetContext that has, at least, the number of
108 * channels and precision per channel as requested in 'config' (e.g., A8 and 888 can be
109 * converted to 8888). It may also swizzle the channels (e.g., BGRA -> RGBA).
110 * SRGB-ness will be preserved.
111 */
112 sk_sp<GrRenderTargetContext> makeDeferredRenderTargetContextWithFallback(
113 const GrBackendFormat& format,
114 SkBackingFit fit,
115 int width, int height,
116 GrPixelConfig config,
117 sk_sp<SkColorSpace> colorSpace,
118 int sampleCnt = 1,
119 GrMipMapped = GrMipMapped::kNo,
120 GrSurfaceOrigin origin = kBottomLeft_GrSurfaceOrigin,
121 const SkSurfaceProps* surfaceProps = nullptr,
122 SkBudgeted budgeted = SkBudgeted::kYes);
123
Robert Phillipsd6841482019-02-08 10:29:20 -0500124 GrAuditTrail* auditTrail() { return fContext->auditTrail(); }
Robert Phillips4217ea72019-01-30 13:08:28 -0500125
Robert Phillipse42edcc2017-12-13 11:50:22 -0500126 /**
127 * Create a GrContext without a resource cache
128 */
Kevin Lubickb5502b22018-03-12 10:17:06 -0400129 static sk_sp<GrContext> MakeDDL(const sk_sp<GrContextThreadSafeProxy>&);
Robert Phillipse42edcc2017-12-13 11:50:22 -0500130
Brian Salomond17f6582017-07-19 18:28:58 -0400131 sk_sp<GrTextureContext> makeBackendTextureContext(const GrBackendTexture& tex,
Greg Daniel7ef28f32017-04-20 16:41:55 +0000132 GrSurfaceOrigin origin,
Brian Osmanc1e37052017-03-09 14:19:20 -0500133 sk_sp<SkColorSpace> colorSpace);
Robert Phillipsd46697a2017-01-25 12:10:37 -0500134
Greg Daniel8ce79912019-02-05 10:08:43 -0500135 // These match the definitions in SkSurface & GrSurface.h, for whence they came
136 typedef void* ReleaseContext;
137 typedef void (*ReleaseProc)(ReleaseContext);
138
Brian Osman11052242016-10-27 14:47:55 -0400139 sk_sp<GrRenderTargetContext> makeBackendTextureRenderTargetContext(
Greg Daniel7ef28f32017-04-20 16:41:55 +0000140 const GrBackendTexture& tex,
141 GrSurfaceOrigin origin,
142 int sampleCnt,
Brian Osman11052242016-10-27 14:47:55 -0400143 sk_sp<SkColorSpace> colorSpace,
Greg Daniel8ce79912019-02-05 10:08:43 -0500144 const SkSurfaceProps* = nullptr,
145 ReleaseProc = nullptr,
146 ReleaseContext = nullptr);
robertphillips4fd74ae2016-08-03 14:26:53 -0700147
Brian Osman11052242016-10-27 14:47:55 -0400148 sk_sp<GrRenderTargetContext> makeBackendRenderTargetRenderTargetContext(
Greg Danielbcf612b2017-05-01 13:50:58 +0000149 const GrBackendRenderTarget&,
150 GrSurfaceOrigin origin,
Brian Osman11052242016-10-27 14:47:55 -0400151 sk_sp<SkColorSpace> colorSpace,
Greg Daniel8ce79912019-02-05 10:08:43 -0500152 const SkSurfaceProps* = nullptr,
153 ReleaseProc = nullptr,
154 ReleaseContext = nullptr);
robertphillips4fd74ae2016-08-03 14:26:53 -0700155
Brian Osman11052242016-10-27 14:47:55 -0400156 sk_sp<GrRenderTargetContext> makeBackendTextureAsRenderTargetRenderTargetContext(
Greg Daniel7ef28f32017-04-20 16:41:55 +0000157 const GrBackendTexture& tex,
158 GrSurfaceOrigin origin,
159 int sampleCnt,
robertphillips4fd74ae2016-08-03 14:26:53 -0700160 sk_sp<SkColorSpace> colorSpace,
161 const SkSurfaceProps* = nullptr);
162
Greg Danielb46add82019-01-02 14:51:29 -0500163 sk_sp<GrRenderTargetContext> makeVulkanSecondaryCBRenderTargetContext(
164 const SkImageInfo&, const GrVkDrawableInfo&, const SkSurfaceProps* = nullptr);
165
Robert Phillips7ee385e2017-03-30 08:02:11 -0400166 /**
Brian Salomonf9a1fdf2019-05-09 10:30:12 -0400167 * Finalizes all pending reads and writes to the surfaces and also performs an MSAA resolves
168 * if necessary. The GrSurfaceProxy array is treated as a hint. If it is supplied the context
169 * will guarantee that the draws required for those proxies are flushed but it could do more.
170 * If no array is provided then all current work will be flushed.
Robert Phillips7ee385e2017-03-30 08:02:11 -0400171 *
172 * It is not necessary to call this before reading the render target via Skia/GrContext.
173 * GrContext will detect when it must perform a resolve before reading pixels back from the
174 * surface or using it as a texture.
175 */
Brian Salomonf9a1fdf2019-05-09 10:30:12 -0400176 GrSemaphoresSubmitted flushSurfaces(GrSurfaceProxy*[], int numProxies, const GrFlushInfo&);
177
178 /** Version of above that flushes for a single proxy and uses a default GrFlushInfo. Null is
179 * allowed. */
Greg Daniel4aa13e72019-04-15 14:42:20 -0400180 void flushSurface(GrSurfaceProxy*);
Robert Phillips7ee385e2017-03-30 08:02:11 -0400181
Robert Phillipse78b7252017-04-06 07:59:41 -0400182 /**
183 * These flags can be used with the read/write pixels functions below.
184 */
185 enum PixelOpsFlags {
Robert Phillipse78b7252017-04-06 07:59:41 -0400186 /** The src for write or dst read is unpremultiplied. This is only respected if both the
187 config src and dst configs are an RGBA/BGRA 8888 format. */
188 kUnpremul_PixelOpsFlag = 0x4,
189 };
190
191 /**
Brian Salomond494f6e2018-06-01 14:13:43 -0400192 * Reads a rectangle of pixels from a surface.
Brian Salomon19eaf2d2018-03-19 16:06:44 -0400193 *
Robert Phillipsf41c22f2017-04-18 07:48:58 -0400194 * @param src the surface context to read from.
Robert Phillipse78b7252017-04-06 07:59:41 -0400195 * @param left left edge of the rectangle to read (inclusive)
196 * @param top top edge of the rectangle to read (inclusive)
197 * @param width width of rectangle to read in pixels.
198 * @param height height of rectangle to read in pixels.
Brian Salomon19eaf2d2018-03-19 16:06:44 -0400199 * @param dstColorType the color type of the destination buffer
Robert Phillipse78b7252017-04-06 07:59:41 -0400200 * @param dstColorSpace color space of the destination buffer
201 * @param buffer memory to read the rectangle into.
202 * @param rowBytes number of bytes bewtween consecutive rows. Zero means rows are tightly
203 * packed.
204 * @param pixelOpsFlags see PixelOpsFlags enum above.
205 *
206 * @return true if the read succeeded, false if not. The read can fail because of an unsupported
207 * pixel configs
208 */
Brian Salomonc320b152018-02-20 14:05:36 -0500209 bool readSurfacePixels(GrSurfaceContext* src, int left, int top, int width, int height,
210 GrColorType dstColorType, SkColorSpace* dstColorSpace, void* buffer,
211 size_t rowBytes = 0, uint32_t pixelOpsFlags = 0);
Robert Phillipse78b7252017-04-06 07:59:41 -0400212
213 /**
Brian Salomond494f6e2018-06-01 14:13:43 -0400214 * Writes a rectangle of pixels to a surface.
Brian Salomon5f33a8c2018-02-26 14:32:39 -0500215 *
Robert Phillipsf41c22f2017-04-18 07:48:58 -0400216 * @param dst the surface context to write to.
Robert Phillipse78b7252017-04-06 07:59:41 -0400217 * @param left left edge of the rectangle to write (inclusive)
218 * @param top top edge of the rectangle to write (inclusive)
219 * @param width width of rectangle to write in pixels.
220 * @param height height of rectangle to write in pixels.
Brian Salomon5f33a8c2018-02-26 14:32:39 -0500221 * @param srcColorType the color type of the source buffer
Robert Phillipse78b7252017-04-06 07:59:41 -0400222 * @param srcColorSpace color space of the source buffer
223 * @param buffer memory to read pixels from
224 * @param rowBytes number of bytes between consecutive rows. Zero
225 * means rows are tightly packed.
226 * @param pixelOpsFlags see PixelOpsFlags enum above.
227 * @return true if the write succeeded, false if not. The write can fail because of an
228 * unsupported combination of surface and src configs.
229 */
Brian Salomonc320b152018-02-20 14:05:36 -0500230 bool writeSurfacePixels(GrSurfaceContext* dst, int left, int top, int width, int height,
231 GrColorType srcColorType, SkColorSpace* srcColorSpace,
232 const void* buffer, size_t rowBytes, uint32_t pixelOpsFlags = 0);
Robert Phillipse78b7252017-04-06 07:59:41 -0400233
Brian Osman51279982017-08-23 10:12:00 -0400234 SkTaskGroup* getTaskGroup() { return fContext->fTaskGroup.get(); }
235
Robert Phillips6be756b2018-01-16 15:07:54 -0500236 GrResourceProvider* resourceProvider() { return fContext->fResourceProvider; }
237 const GrResourceProvider* resourceProvider() const { return fContext->fResourceProvider; }
238
239 GrResourceCache* getResourceCache() { return fContext->fResourceCache; }
240
Robert Phillipsf35fd8d2018-01-22 10:48:15 -0500241 GrGpu* getGpu() { return fContext->fGpu.get(); }
242 const GrGpu* getGpu() const { return fContext->fGpu.get(); }
243
Robert Phillipsc4039ea2018-03-01 11:36:45 -0500244 // This accessor should only ever be called by the GrOpFlushState.
Robert Phillips5a66efb2018-03-07 15:13:18 -0500245 GrAtlasManager* getAtlasManager() {
246 return fContext->onGetAtlasManager();
Robert Phillipsc4039ea2018-03-01 11:36:45 -0500247 }
Robert Phillipsf35fd8d2018-01-22 10:48:15 -0500248
Robert Phillips62000362018-02-01 09:10:04 -0500249 void moveOpListsToDDL(SkDeferredDisplayList*);
250 void copyOpListsFromDDL(const SkDeferredDisplayList*, GrRenderTargetProxy* newDest);
251
Robert Phillipsdbaf3172019-02-06 15:12:53 -0500252 GrContextOptions::PersistentCache* getPersistentCache() { return fContext->fPersistentCache; }
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400253 GrContextOptions::ShaderErrorHandler* getShaderErrorHandler() const {
254 return fContext->fShaderErrorHandler;
255 }
Robert Phillipsdbaf3172019-02-06 15:12:53 -0500256
Robert Phillipsdbaf3172019-02-06 15:12:53 -0500257#ifdef SK_ENABLE_DUMP_GPU
258 /** Returns a string with detailed information about the context & GPU, in JSON format. */
259 SkString dump() const;
260#endif
261
262#if GR_TEST_UTILS
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500263 /** Reset GPU stats */
264 void resetGpuStats() const ;
265
266 /** Prints cache stats to the string if GR_CACHE_STATS == 1. */
267 void dumpCacheStats(SkString*) const;
268 void dumpCacheStatsKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) const;
269 void printCacheStats() const;
270
271 /** Prints GPU stats to the string if GR_GPU_STATS == 1. */
272 void dumpGpuStats(SkString*) const;
273 void dumpGpuStatsKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) const;
274 void printGpuStats() const;
275
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500276 /** Specify the TextBlob cache limit. If the current cache exceeds this limit it will purge.
277 this is for testing only */
Robert Phillipsdbaf3172019-02-06 15:12:53 -0500278 void testingOnly_setTextBlobCacheLimit(size_t bytes);
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500279
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500280 /** Get pointer to atlas texture for given mask format. Note that this wraps an
281 actively mutating texture in an SkImage. This could yield unexpected results
282 if it gets cached or used more generally. */
Robert Phillipsdbaf3172019-02-06 15:12:53 -0500283 sk_sp<SkImage> testingOnly_getFontAtlasImage(GrMaskFormat format, unsigned int index = 0);
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500284
Robert Phillipsdbaf3172019-02-06 15:12:53 -0500285 /**
286 * Purge all the unlocked resources from the cache.
287 * This entry point is mainly meant for timing texture uploads
288 * and is not defined in normal builds of Skia.
289 */
290 void testingOnly_purgeAllUnlockedResources();
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500291
Robert Phillipsdbaf3172019-02-06 15:12:53 -0500292 void testingOnly_flushAndRemoveOnFlushCallbackObject(GrOnFlushCallbackObject*);
293#endif
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500294
robertphillips4fd74ae2016-08-03 14:26:53 -0700295private:
296 explicit GrContextPriv(GrContext* context) : fContext(context) {}
Robert Phillipseb35f4d2017-03-21 07:56:47 -0400297 GrContextPriv(const GrContextPriv&); // unimpl
robertphillips4fd74ae2016-08-03 14:26:53 -0700298 GrContextPriv& operator=(const GrContextPriv&); // unimpl
299
300 // No taking addresses of this type.
301 const GrContextPriv* operator&() const;
302 GrContextPriv* operator&();
303
304 GrContext* fContext;
305
306 friend class GrContext; // to construct/copy this type.
307};
308
Robert Phillips9da87e02019-02-04 13:26:26 -0500309inline GrContextPriv GrContext::priv() { return GrContextPriv(this); }
robertphillips4fd74ae2016-08-03 14:26:53 -0700310
Robert Phillips9da87e02019-02-04 13:26:26 -0500311inline const GrContextPriv GrContext::priv() const {
robertphillips4fd74ae2016-08-03 14:26:53 -0700312 return GrContextPriv(const_cast<GrContext*>(this));
313}
314
315#endif