blob: 95dfcfb427af4b1d8f69f7736d9a04dc15637277 [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;
Robert Phillipse2f7d182016-12-15 09:23:05 -050020class GrSurfaceProxy;
21
Robert Phillips62000362018-02-01 09:10:04 -050022class SkDeferredDisplayList;
Robert Phillipsbc429442019-02-20 08:26:03 -050023class SkTaskGroup;
Robert Phillips62000362018-02-01 09:10:04 -050024
robertphillips4fd74ae2016-08-03 14:26:53 -070025/** Class that adds methods to GrContext that are only intended for use internal to Skia.
26 This class is purely a privileged window into GrContext. It should never have additional
27 data members or virtual methods. */
28class GrContextPriv {
29public:
Robert Phillips4217ea72019-01-30 13:08:28 -050030
31 // from GrContext_Base
Robert Phillipsfd0d9702019-02-01 10:19:42 -050032 uint32_t contextID() const { return fContext->contextID(); }
Robert Phillips4217ea72019-01-30 13:08:28 -050033
Robert Phillipsfe0963c2019-02-07 13:25:07 -050034 bool matches(GrContext_Base* candidate) const { return fContext->matches(candidate); }
35
Robert Phillipsc1541ae2019-02-04 12:05:37 -050036 const GrContextOptions& options() const { return fContext->options(); }
37
Robert Phillipsbb606772019-02-04 17:50:57 -050038 const GrCaps* caps() const { return fContext->caps(); }
Robert Phillipsa41c6852019-02-07 10:44:10 -050039 sk_sp<const GrCaps> refCaps() const;
Robert Phillipsbb606772019-02-04 17:50:57 -050040
Robert Phillipsa41c6852019-02-07 10:44:10 -050041 GrImageContext* asImageContext() { return fContext->asImageContext(); }
42 GrRecordingContext* asRecordingContext() { return fContext->asRecordingContext(); }
43 GrContext* asDirectContext() { return fContext->asDirectContext(); }
44
Robert Phillips4217ea72019-01-30 13:08:28 -050045 // from GrImageContext
Robert Phillipsa41c6852019-02-07 10:44:10 -050046 GrProxyProvider* proxyProvider() { return fContext->proxyProvider(); }
47 const GrProxyProvider* proxyProvider() const { return fContext->proxyProvider(); }
48
Robert Phillips6a6de562019-02-15 15:19:15 -050049 bool abandoned() const { return fContext->abandoned(); }
50
Robert Phillipsa41c6852019-02-07 10:44:10 -050051 /** This is only useful for debug purposes */
52 SkDEBUGCODE(GrSingleOwner* singleOwner() const { return fContext->singleOwner(); } )
Robert Phillips4217ea72019-01-30 13:08:28 -050053
54 // from GrRecordingContext
Robert Phillips6f0e02f2019-02-13 11:02:28 -050055 GrDrawingManager* drawingManager() { return fContext->drawingManager(); }
Michael Ludwig28b0c5d2019-12-19 14:51:00 -050056
Michael Ludwig2c316bd2019-12-19 14:50:44 -050057 GrOpMemoryPool* opMemoryPool() { return fContext->arenas().opMemoryPool(); }
58 SkArenaAlloc* recordTimeAllocator() { return fContext->arenas().recordTimeAllocator(); }
Michael Ludwig28b0c5d2019-12-19 14:51:00 -050059 GrRecordingContext::Arenas arenas() { return fContext->arenas(); }
Robert Phillipsd6841482019-02-08 10:29:20 -050060
Herb Derbya00da612019-03-04 17:10:01 -050061 GrStrikeCache* getGrStrikeCache() { return fContext->getGrStrikeCache(); }
Robert Phillips2184fb72019-02-21 16:11:41 -050062 GrTextBlobCache* getTextBlobCache() { return fContext->getTextBlobCache(); }
63
Robert Phillipsc5058a62019-02-15 12:52:59 -050064 /**
65 * Registers an object for flush-related callbacks. (See GrOnFlushCallbackObject.)
66 *
67 * NOTE: the drawing manager tracks this object as a raw pointer; it is up to the caller to
68 * ensure its lifetime is tied to that of the context.
69 */
70 void addOnFlushCallbackObject(GrOnFlushCallbackObject*);
71
Robert Phillipsb97da532019-02-12 15:24:12 -050072 /*
73 * Create a new render target context backed by a deferred-style
74 * GrRenderTargetProxy. We guarantee that "asTextureProxy" will succeed for
75 * renderTargetContexts created via this entry point.
76 */
Brian Salomonbf6b9792019-08-21 09:38:10 -040077 std::unique_ptr<GrRenderTargetContext> makeDeferredRenderTargetContext(
Brian Salomond6287472019-06-24 15:50:07 -040078 SkBackingFit fit,
79 int width,
80 int height,
Brian Salomond6287472019-06-24 15:50:07 -040081 GrColorType,
82 sk_sp<SkColorSpace> colorSpace,
83 int sampleCnt = 1,
84 GrMipMapped = GrMipMapped::kNo,
85 GrSurfaceOrigin origin = kBottomLeft_GrSurfaceOrigin,
86 const SkSurfaceProps* surfaceProps = nullptr,
87 SkBudgeted = SkBudgeted::kYes,
Emircan Uysaler23ca4e72019-06-24 10:53:09 -040088 GrProtected isProtected = GrProtected::kNo);
Robert Phillipsb97da532019-02-12 15:24:12 -050089
Robert Phillips6f0e02f2019-02-13 11:02:28 -050090 /*
91 * This method will attempt to create a renderTargetContext that has, at least, the number of
92 * channels and precision per channel as requested in 'config' (e.g., A8 and 888 can be
93 * converted to 8888). It may also swizzle the channels (e.g., BGRA -> RGBA).
94 * SRGB-ness will be preserved.
95 */
Brian Salomonbf6b9792019-08-21 09:38:10 -040096 std::unique_ptr<GrRenderTargetContext> makeDeferredRenderTargetContextWithFallback(
Brian Salomond6287472019-06-24 15:50:07 -040097 SkBackingFit fit,
98 int width,
99 int height,
Brian Salomond6287472019-06-24 15:50:07 -0400100 GrColorType,
101 sk_sp<SkColorSpace> colorSpace,
102 int sampleCnt = 1,
103 GrMipMapped = GrMipMapped::kNo,
104 GrSurfaceOrigin origin = kBottomLeft_GrSurfaceOrigin,
105 const SkSurfaceProps* surfaceProps = nullptr,
Brian Osmanc2486592019-09-20 13:32:51 -0400106 SkBudgeted budgeted = SkBudgeted::kYes,
107 GrProtected isProtected = GrProtected::kNo);
Robert Phillips6f0e02f2019-02-13 11:02:28 -0500108
Robert Phillipsd6841482019-02-08 10:29:20 -0500109 GrAuditTrail* auditTrail() { return fContext->auditTrail(); }
Robert Phillips4217ea72019-01-30 13:08:28 -0500110
Robert Phillipse42edcc2017-12-13 11:50:22 -0500111 /**
112 * Create a GrContext without a resource cache
113 */
Kevin Lubickb5502b22018-03-12 10:17:06 -0400114 static sk_sp<GrContext> MakeDDL(const sk_sp<GrContextThreadSafeProxy>&);
Robert Phillipse42edcc2017-12-13 11:50:22 -0500115
Greg Daniel8ce79912019-02-05 10:08:43 -0500116 // These match the definitions in SkSurface & GrSurface.h, for whence they came
117 typedef void* ReleaseContext;
118 typedef void (*ReleaseProc)(ReleaseContext);
119
Brian Salomonbf6b9792019-08-21 09:38:10 -0400120 std::unique_ptr<GrRenderTargetContext> makeBackendTextureRenderTargetContext(
Brian Salomond6287472019-06-24 15:50:07 -0400121 const GrBackendTexture& tex,
122 GrSurfaceOrigin origin,
123 int sampleCnt,
124 GrColorType,
125 sk_sp<SkColorSpace> colorSpace,
126 const SkSurfaceProps* = nullptr,
127 ReleaseProc = nullptr,
128 ReleaseContext = nullptr);
robertphillips4fd74ae2016-08-03 14:26:53 -0700129
Brian Salomonbf6b9792019-08-21 09:38:10 -0400130 std::unique_ptr<GrRenderTargetContext> makeBackendRenderTargetRenderTargetContext(
Brian Salomond6287472019-06-24 15:50:07 -0400131 const GrBackendRenderTarget&,
132 GrSurfaceOrigin origin,
133 GrColorType,
134 sk_sp<SkColorSpace> colorSpace,
135 const SkSurfaceProps* = nullptr,
136 ReleaseProc = nullptr,
137 ReleaseContext = nullptr);
robertphillips4fd74ae2016-08-03 14:26:53 -0700138
Brian Salomonbf6b9792019-08-21 09:38:10 -0400139 std::unique_ptr<GrRenderTargetContext> makeBackendTextureAsRenderTargetRenderTargetContext(
Brian Salomond6287472019-06-24 15:50:07 -0400140 const GrBackendTexture& tex,
141 GrSurfaceOrigin origin,
142 int sampleCnt,
143 GrColorType,
144 sk_sp<SkColorSpace> colorSpace,
145 const SkSurfaceProps* = nullptr);
robertphillips4fd74ae2016-08-03 14:26:53 -0700146
Brian Salomonbf6b9792019-08-21 09:38:10 -0400147 std::unique_ptr<GrRenderTargetContext> makeVulkanSecondaryCBRenderTargetContext(
Greg Danielb46add82019-01-02 14:51:29 -0500148 const SkImageInfo&, const GrVkDrawableInfo&, const SkSurfaceProps* = nullptr);
149
Robert Phillips7ee385e2017-03-30 08:02:11 -0400150 /**
Brian Salomonf9a1fdf2019-05-09 10:30:12 -0400151 * Finalizes all pending reads and writes to the surfaces and also performs an MSAA resolves
152 * if necessary. The GrSurfaceProxy array is treated as a hint. If it is supplied the context
153 * will guarantee that the draws required for those proxies are flushed but it could do more.
154 * If no array is provided then all current work will be flushed.
Robert Phillips7ee385e2017-03-30 08:02:11 -0400155 *
156 * It is not necessary to call this before reading the render target via Skia/GrContext.
157 * GrContext will detect when it must perform a resolve before reading pixels back from the
158 * surface or using it as a texture.
159 */
Brian Salomonf9a1fdf2019-05-09 10:30:12 -0400160 GrSemaphoresSubmitted flushSurfaces(GrSurfaceProxy*[], int numProxies, const GrFlushInfo&);
161
162 /** Version of above that flushes for a single proxy and uses a default GrFlushInfo. Null is
163 * allowed. */
Greg Daniel4aa13e72019-04-15 14:42:20 -0400164 void flushSurface(GrSurfaceProxy*);
Robert Phillips7ee385e2017-03-30 08:02:11 -0400165
Greg Daniel6eb8c242019-06-05 10:22:24 -0400166 /**
167 * Returns true if createPMToUPMEffect and createUPMToPMEffect will succeed. In other words,
168 * did we find a pair of round-trip preserving conversion effects?
169 */
170 bool validPMUPMConversionExists();
Robert Phillipse78b7252017-04-06 07:59:41 -0400171
172 /**
Greg Daniel6eb8c242019-06-05 10:22:24 -0400173 * These functions create premul <-> unpremul effects, using the specialized round-trip effects
174 * from GrConfigConversionEffect.
Robert Phillipse78b7252017-04-06 07:59:41 -0400175 */
Greg Daniel6eb8c242019-06-05 10:22:24 -0400176 std::unique_ptr<GrFragmentProcessor> createPMToUPMEffect(std::unique_ptr<GrFragmentProcessor>);
177 std::unique_ptr<GrFragmentProcessor> createUPMToPMEffect(std::unique_ptr<GrFragmentProcessor>);
Robert Phillipse78b7252017-04-06 07:59:41 -0400178
Brian Osman51279982017-08-23 10:12:00 -0400179 SkTaskGroup* getTaskGroup() { return fContext->fTaskGroup.get(); }
180
Robert Phillips6be756b2018-01-16 15:07:54 -0500181 GrResourceProvider* resourceProvider() { return fContext->fResourceProvider; }
182 const GrResourceProvider* resourceProvider() const { return fContext->fResourceProvider; }
183
184 GrResourceCache* getResourceCache() { return fContext->fResourceCache; }
185
Robert Phillipsf35fd8d2018-01-22 10:48:15 -0500186 GrGpu* getGpu() { return fContext->fGpu.get(); }
187 const GrGpu* getGpu() const { return fContext->fGpu.get(); }
188
Robert Phillipsc4039ea2018-03-01 11:36:45 -0500189 // This accessor should only ever be called by the GrOpFlushState.
Robert Phillips5a66efb2018-03-07 15:13:18 -0500190 GrAtlasManager* getAtlasManager() {
191 return fContext->onGetAtlasManager();
Robert Phillipsc4039ea2018-03-01 11:36:45 -0500192 }
Robert Phillipsf35fd8d2018-01-22 10:48:15 -0500193
Chris Dalton6b498102019-08-01 14:14:52 -0600194 void moveRenderTasksToDDL(SkDeferredDisplayList*);
195 void copyRenderTasksFromDDL(const SkDeferredDisplayList*, GrRenderTargetProxy* newDest);
Robert Phillips62000362018-02-01 09:10:04 -0500196
Robert Phillipsdbaf3172019-02-06 15:12:53 -0500197 GrContextOptions::PersistentCache* getPersistentCache() { return fContext->fPersistentCache; }
Brian Osman5e7fbfd2019-05-03 13:13:35 -0400198 GrContextOptions::ShaderErrorHandler* getShaderErrorHandler() const {
199 return fContext->fShaderErrorHandler;
200 }
Robert Phillipsdbaf3172019-02-06 15:12:53 -0500201
Brian Salomon9241a6d2019-10-03 13:26:54 -0400202 GrClientMappedBufferManager* clientMappedBufferManager() {
203 return fContext->fMappedBufferManager.get();
204 }
205
Robert Phillipsdbaf3172019-02-06 15:12:53 -0500206#if GR_TEST_UTILS
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500207 /** Reset GPU stats */
208 void resetGpuStats() const ;
209
210 /** Prints cache stats to the string if GR_CACHE_STATS == 1. */
211 void dumpCacheStats(SkString*) const;
212 void dumpCacheStatsKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) const;
213 void printCacheStats() const;
214
215 /** Prints GPU stats to the string if GR_GPU_STATS == 1. */
216 void dumpGpuStats(SkString*) const;
217 void dumpGpuStatsKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) const;
218 void printGpuStats() const;
219
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500220 /** Specify the TextBlob cache limit. If the current cache exceeds this limit it will purge.
221 this is for testing only */
Robert Phillipsdbaf3172019-02-06 15:12:53 -0500222 void testingOnly_setTextBlobCacheLimit(size_t bytes);
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500223
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500224 /** Get pointer to atlas texture for given mask format. Note that this wraps an
225 actively mutating texture in an SkImage. This could yield unexpected results
226 if it gets cached or used more generally. */
Robert Phillipsdbaf3172019-02-06 15:12:53 -0500227 sk_sp<SkImage> testingOnly_getFontAtlasImage(GrMaskFormat format, unsigned int index = 0);
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500228
Robert Phillipsdbaf3172019-02-06 15:12:53 -0500229 /**
230 * Purge all the unlocked resources from the cache.
231 * This entry point is mainly meant for timing texture uploads
232 * and is not defined in normal builds of Skia.
233 */
234 void testingOnly_purgeAllUnlockedResources();
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500235
Robert Phillipsdbaf3172019-02-06 15:12:53 -0500236 void testingOnly_flushAndRemoveOnFlushCallbackObject(GrOnFlushCallbackObject*);
237#endif
Robert Phillips0c4b7b12018-03-06 08:20:37 -0500238
robertphillips4fd74ae2016-08-03 14:26:53 -0700239private:
240 explicit GrContextPriv(GrContext* context) : fContext(context) {}
Robert Phillipseb35f4d2017-03-21 07:56:47 -0400241 GrContextPriv(const GrContextPriv&); // unimpl
robertphillips4fd74ae2016-08-03 14:26:53 -0700242 GrContextPriv& operator=(const GrContextPriv&); // unimpl
243
244 // No taking addresses of this type.
245 const GrContextPriv* operator&() const;
246 GrContextPriv* operator&();
247
248 GrContext* fContext;
249
250 friend class GrContext; // to construct/copy this type.
251};
252
Robert Phillips9da87e02019-02-04 13:26:26 -0500253inline GrContextPriv GrContext::priv() { return GrContextPriv(this); }
robertphillips4fd74ae2016-08-03 14:26:53 -0700254
Robert Phillips9da87e02019-02-04 13:26:26 -0500255inline const GrContextPriv GrContext::priv() const {
robertphillips4fd74ae2016-08-03 14:26:53 -0700256 return GrContextPriv(const_cast<GrContext*>(this));
257}
258
259#endif