• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 GrDirectContextPriv_DEFINED
9 #define GrDirectContextPriv_DEFINED
10 
11 #include "include/core/SkSpan.h"
12 #include "include/core/SkSurface.h"
13 #include "include/gpu/GrDirectContext.h"
14 #include "src/gpu/BaseDevice.h"
15 #include "src/gpu/GrRecordingContextPriv.h"
16 
17 class GrAtlasManager;
18 class GrBackendFormat;
19 class GrBackendRenderTarget;
20 class GrImageInfo;
21 class GrMemoryPool;
22 class GrOnFlushCallbackObject;
23 class GrRenderTargetProxy;
24 class GrSemaphore;
25 class GrSurfaceProxy;
26 
27 class SkDeferredDisplayList;
28 class SkTaskGroup;
29 
30 /** Class that adds methods to GrDirectContext that are only intended for use internal to Skia.
31     This class is purely a privileged window into GrDirectContext. It should never have additional
32     data members or virtual methods. */
33 class SK_API GrDirectContextPriv : public GrRecordingContextPriv {
34 public:
context()35     GrDirectContext* context() { return static_cast<GrDirectContext*>(fContext); }
context()36     const GrDirectContext* context() const { return static_cast<const GrDirectContext*>(fContext); }
37 
getGrStrikeCache()38     GrStrikeCache* getGrStrikeCache() { return this->context()->fStrikeCache.get(); }
39 
40     /**
41      * Finalizes all pending reads and writes to the surfaces and also performs an MSAA resolves
42      * if necessary. The GrSurfaceProxy array is treated as a hint. If it is supplied the context
43      * will guarantee that the draws required for those proxies are flushed but it could do more.
44      * If no array is provided then all current work will be flushed.
45      *
46      * It is not necessary to call this before reading the render target via Skia/GrContext.
47      * GrContext will detect when it must perform a resolve before reading pixels back from the
48      * surface or using it as a texture.
49      */
50     GrSemaphoresSubmitted flushSurfaces(
51                 SkSpan<GrSurfaceProxy*>,
52                 SkSurface::BackendSurfaceAccess = SkSurface::BackendSurfaceAccess::kNoAccess,
53                 const GrFlushInfo& = {},
54                 const GrBackendSurfaceMutableState* newState = nullptr);
55 
56     /** Version of above that flushes for a single proxy. Null is allowed. */
57     GrSemaphoresSubmitted flushSurface(
58                 GrSurfaceProxy* proxy,
59                 SkSurface::BackendSurfaceAccess access = SkSurface::BackendSurfaceAccess::kNoAccess,
60                 const GrFlushInfo& info = {},
61                 const GrBackendSurfaceMutableState* newState = nullptr) {
62         size_t size = proxy ? 1 : 0;
63         return this->flushSurfaces({&proxy, size}, access, info, newState);
64     }
65 
66     /**
67      * Returns true if createPMToUPMEffect and createUPMToPMEffect will succeed. In other words,
68      * did we find a pair of round-trip preserving conversion effects?
69      */
70     bool validPMUPMConversionExists();
71 
72     /**
73      * These functions create premul <-> unpremul effects, using specialized round-trip effects.
74      */
75     std::unique_ptr<GrFragmentProcessor> createPMToUPMEffect(std::unique_ptr<GrFragmentProcessor>);
76     std::unique_ptr<GrFragmentProcessor> createUPMToPMEffect(std::unique_ptr<GrFragmentProcessor>);
77 
getTaskGroup()78     SkTaskGroup* getTaskGroup() { return this->context()->fTaskGroup.get(); }
79 
resourceProvider()80     GrResourceProvider* resourceProvider() { return this->context()->fResourceProvider.get(); }
resourceProvider()81     const GrResourceProvider* resourceProvider() const {
82         return this->context()->fResourceProvider.get();
83     }
84 
getResourceCache()85     GrResourceCache* getResourceCache() { return this->context()->fResourceCache.get(); }
86 
getGpu()87     GrGpu* getGpu() { return this->context()->fGpu.get(); }
getGpu()88     const GrGpu* getGpu() const { return this->context()->fGpu.get(); }
89 
90     // This accessor should only ever be called by the GrOpFlushState.
getAtlasManager()91     GrAtlasManager* getAtlasManager() {
92         return this->context()->onGetAtlasManager();
93     }
94 
95     // This accessor should only ever be called by the GrOpFlushState.
getSmallPathAtlasMgr()96     skgpu::v1::SmallPathAtlasMgr* getSmallPathAtlasMgr() {
97         return this->context()->onGetSmallPathAtlasMgr();
98     }
99 
100     void createDDLTask(sk_sp<const SkDeferredDisplayList>,
101                        sk_sp<GrRenderTargetProxy> newDest,
102                        SkIPoint offset);
103 
104     bool compile(const GrProgramDesc&, const GrProgramInfo&);
105 
getPersistentCache()106     GrContextOptions::PersistentCache* getPersistentCache() {
107         return this->context()->fPersistentCache;
108     }
109 
clientMappedBufferManager()110     GrClientMappedBufferManager* clientMappedBufferManager() {
111         return this->context()->fMappedBufferManager.get();
112     }
113 
114 #if GR_TEST_UTILS
115     /** Reset GPU stats */
116     void resetGpuStats() const;
117 
118     /** Prints cache stats to the string if GR_CACHE_STATS == 1. */
119     void dumpCacheStats(SkString*) const;
120     void dumpCacheStatsKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) const;
121     void printCacheStats() const;
122 
123     /** Prints GPU stats to the string if GR_GPU_STATS == 1. */
124     void dumpGpuStats(SkString*) const;
125     void dumpGpuStatsKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) const;
126     void printGpuStats() const;
127 
128     /** These are only active if GR_GPU_STATS == 1. */
129     void resetContextStats();
130     void dumpContextStats(SkString*) const;
131     void dumpContextStatsKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values) const;
132     void printContextStats() const;
133 
134     /** Get pointer to atlas texture for given mask format. Note that this wraps an
135         actively mutating texture in an SkImage. This could yield unexpected results
136         if it gets cached or used more generally. */
137     sk_sp<SkImage> testingOnly_getFontAtlasImage(GrMaskFormat format, unsigned int index = 0);
138 
139     void testingOnly_flushAndRemoveOnFlushCallbackObject(GrOnFlushCallbackObject*);
140 #endif
141 
142 private:
GrDirectContextPriv(GrDirectContext * dContext)143     explicit GrDirectContextPriv(GrDirectContext* dContext) : GrRecordingContextPriv(dContext) {}
144     // Required until C++17 copy elision
145     GrDirectContextPriv(const GrDirectContextPriv&) = default;
146     GrDirectContextPriv& operator=(const GrDirectContextPriv&) = delete;
147 
148     // No taking addresses of this type.
149     const GrDirectContextPriv* operator&() const;
150     GrDirectContextPriv* operator&();
151 
152     friend class GrDirectContext; // to construct/copy this type.
153 
154     using INHERITED = GrRecordingContextPriv;
155 };
156 
priv()157 inline GrDirectContextPriv GrDirectContext::priv() { return GrDirectContextPriv(this); }
158 
159 // NOLINTNEXTLINE(readability-const-return-type)
priv()160 inline const GrDirectContextPriv GrDirectContext::priv() const {
161     return GrDirectContextPriv(const_cast<GrDirectContext*>(this));
162 }
163 
164 #endif
165