blob: 6e3b22a01fd21bbb380b30f4b829b0831014ee43 [file] [log] [blame]
robertphillips77a2e522015-10-17 07:43:27 -07001/*
2 * Copyright 2015 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 GrDrawingManager_DEFINED
9#define GrDrawingManager_DEFINED
10
Robert Phillips15c91422019-05-07 16:54:48 -040011#include <set>
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "include/core/SkSurface.h"
13#include "include/private/SkTArray.h"
14#include "src/gpu/GrBufferAllocPool.h"
15#include "src/gpu/GrDeferredUpload.h"
16#include "src/gpu/GrPathRenderer.h"
17#include "src/gpu/GrPathRendererChain.h"
18#include "src/gpu/GrResourceCache.h"
19#include "src/gpu/text/GrTextContext.h"
Robert Phillipsf2361d22016-10-25 14:20:06 -040020
Chris Daltonfddb6c02017-11-04 15:22:22 -060021class GrCoverageCountingPathRenderer;
Robert Phillipsfbcef6e2017-06-15 12:07:18 -040022class GrOnFlushCallbackObject;
Herb Derbydc214c22018-11-08 13:31:39 -050023class GrOpFlushState;
Chris Dalton6b498102019-08-01 14:14:52 -060024class GrOpList;
Robert Phillips69893702019-02-22 11:16:30 -050025class GrRecordingContext;
Brian Osman11052242016-10-27 14:47:55 -040026class GrRenderTargetContext;
Robert Phillipsc7635fa2016-10-28 13:25:24 -040027class GrRenderTargetProxy;
Brian Salomon653f42f2018-07-10 10:07:31 -040028class GrRenderTargetOpList;
robertphillips68737822015-10-29 12:12:21 -070029class GrSoftwarePathRenderer;
Brian Osman45580d32016-11-23 09:37:01 -050030class GrTextureContext;
31class GrTextureOpList;
Brian Salomon653f42f2018-07-10 10:07:31 -040032class SkDeferredDisplayList;
robertphillips77a2e522015-10-17 07:43:27 -070033
robertphillips77a2e522015-10-17 07:43:27 -070034class GrDrawingManager {
35public:
36 ~GrDrawingManager();
37
robertphillips68737822015-10-29 12:12:21 -070038 void freeGpuResources();
robertphillips77a2e522015-10-17 07:43:27 -070039
Robert Phillips37430132016-11-09 06:50:43 -050040 sk_sp<GrRenderTargetContext> makeRenderTargetContext(sk_sp<GrSurfaceProxy>,
Brian Salomond6287472019-06-24 15:50:07 -040041 GrColorType,
Brian Osman11052242016-10-27 14:47:55 -040042 sk_sp<SkColorSpace>,
Robert Phillips941d1442017-06-14 16:37:02 -040043 const SkSurfaceProps*,
44 bool managedOpList = true);
Brian Salomone7499c72019-06-24 12:12:36 -040045 sk_sp<GrTextureContext> makeTextureContext(sk_sp<GrSurfaceProxy>,
Brian Salomond6287472019-06-24 15:50:07 -040046 GrColorType,
Brian Salomone7499c72019-06-24 12:12:36 -040047 SkAlphaType,
48 sk_sp<SkColorSpace>);
robertphillips77a2e522015-10-17 07:43:27 -070049
Robert Phillips941d1442017-06-14 16:37:02 -040050 // A managed opList is controlled by the drawing manager (i.e., sorted & flushed with the
Robert Phillips831a2932019-04-12 17:18:39 -040051 // others). An unmanaged one is created and used by the onFlushCallback.
52 sk_sp<GrRenderTargetOpList> newRTOpList(sk_sp<GrRenderTargetProxy>, bool managedOpList);
53 sk_sp<GrTextureOpList> newTextureOpList(sk_sp<GrTextureProxy>);
robertphillips77a2e522015-10-17 07:43:27 -070054
Robert Phillips69893702019-02-22 11:16:30 -050055 GrRecordingContext* getContext() { return fContext; }
robertphillips77a2e522015-10-17 07:43:27 -070056
Herb Derby26cbe512018-05-24 14:39:01 -040057 GrTextContext* getTextContext();
brianosman86e76262016-08-11 12:17:31 -070058
robertphillips68737822015-10-29 12:12:21 -070059 GrPathRenderer* getPathRenderer(const GrPathRenderer::CanDrawPathArgs& args,
60 bool allowSW,
61 GrPathRendererChain::DrawType drawType,
Ben Wagnera93a14a2017-08-28 10:34:05 -040062 GrPathRenderer::StencilSupport* stencilSupport = nullptr);
robertphillips68737822015-10-29 12:12:21 -070063
Brian Salomone7df0bb2018-05-07 14:44:57 -040064 GrPathRenderer* getSoftwarePathRenderer();
65
Chris Daltonfddb6c02017-11-04 15:22:22 -060066 // Returns a direct pointer to the coverage counting path renderer, or null if it is not
67 // supported and turned on.
68 GrCoverageCountingPathRenderer* getCoverageCountingPathRenderer();
69
Brian Salomon653f42f2018-07-10 10:07:31 -040070 void flushIfNecessary();
bsalomonb77a9072016-09-07 10:02:04 -070071
Greg Daniel78325c12017-06-19 16:39:13 -040072 static bool ProgramUnitTest(GrContext* context, int maxStages, int maxLevels);
robertphillipsa13e2022015-11-11 12:01:09 -080073
Brian Salomonf9a1fdf2019-05-09 10:30:12 -040074 GrSemaphoresSubmitted flushSurfaces(GrSurfaceProxy* proxies[],
75 int cnt,
76 SkSurface::BackendSurfaceAccess access,
77 const GrFlushInfo& info);
78 GrSemaphoresSubmitted flushSurface(GrSurfaceProxy* proxy,
Greg Daniel4aa13e72019-04-15 14:42:20 -040079 SkSurface::BackendSurfaceAccess access,
Brian Salomonf9a1fdf2019-05-09 10:30:12 -040080 const GrFlushInfo& info) {
81 return this->flushSurfaces(&proxy, 1, access, info);
82 }
bsalomon6a2b1942016-09-08 11:28:59 -070083
Chris Daltonfe199b72017-05-05 11:26:15 -040084 void addOnFlushCallbackObject(GrOnFlushCallbackObject*);
Robert Phillipsdbaf3172019-02-06 15:12:53 -050085
86#if GR_TEST_UTILS
Chris Daltonfe199b72017-05-05 11:26:15 -040087 void testingOnly_removeOnFlushCallbackObject(GrOnFlushCallbackObject*);
Robert Phillipsdbaf3172019-02-06 15:12:53 -050088#endif
Robert Phillipseb35f4d2017-03-21 07:56:47 -040089
Chris Dalton6b498102019-08-01 14:14:52 -060090 void moveRenderTasksToDDL(SkDeferredDisplayList* ddl);
91 void copyRenderTasksFromDDL(const SkDeferredDisplayList*, GrRenderTargetProxy* newDest);
Robert Phillips62000362018-02-01 09:10:04 -050092
robertphillips77a2e522015-10-17 07:43:27 -070093private:
Chris Dalton6b498102019-08-01 14:14:52 -060094 // This class encapsulates maintenance and manipulation of the drawing manager's DAG of
95 // renderTasks.
96 class RenderTaskDAG {
Robert Phillips22310d62018-09-05 11:07:21 -040097 public:
Chris Dalton6b498102019-08-01 14:14:52 -060098 RenderTaskDAG(bool sortRenderTasks);
99 ~RenderTaskDAG();
Robert Phillips22310d62018-09-05 11:07:21 -0400100
101 // Currently, when explicitly allocating resources, this call will topologically sort the
102 // opLists.
103 // MDB TODO: remove once incremental opList sorting is enabled
104 void prepForFlush();
105
106 void closeAll(const GrCaps* caps);
107
108 // A yucky combination of closeAll and reset
109 void cleanup(const GrCaps* caps);
110
111 void gatherIDs(SkSTArray<8, uint32_t, true>* idArray) const;
112
113 void reset();
114
115 // These calls forceably remove an opList from the DAG. They are problematic bc they just
116 // remove the opList but don't cleanup any refering pointers (i.e., dependency pointers
117 // in the DAG). They work right now bc they are only called at flush time, after the
118 // topological sort is complete (so the dangling pointers aren't used).
Chris Dalton6b498102019-08-01 14:14:52 -0600119 void removeRenderTask(int index);
120 void removeRenderTasks(int startIndex, int stopIndex);
Robert Phillips22310d62018-09-05 11:07:21 -0400121
Chris Dalton6b498102019-08-01 14:14:52 -0600122 bool empty() const { return fRenderTasks.empty(); }
123 int numRenderTasks() const { return fRenderTasks.count(); }
Robert Phillips22310d62018-09-05 11:07:21 -0400124
Robert Phillips9313aa72019-04-09 18:41:27 -0400125 bool isUsed(GrSurfaceProxy*) const;
126
Chris Dalton6b498102019-08-01 14:14:52 -0600127 GrRenderTask* renderTask(int index) { return fRenderTasks[index].get(); }
128 const GrRenderTask* renderTask(int index) const { return fRenderTasks[index].get(); }
Robert Phillips22310d62018-09-05 11:07:21 -0400129
Chris Dalton6b498102019-08-01 14:14:52 -0600130 GrRenderTask* back() { return fRenderTasks.back().get(); }
131 const GrRenderTask* back() const { return fRenderTasks.back().get(); }
Robert Phillips22310d62018-09-05 11:07:21 -0400132
Chris Dalton6b498102019-08-01 14:14:52 -0600133 void add(sk_sp<GrRenderTask>);
134 void add(const SkTArray<sk_sp<GrRenderTask>>&);
Robert Phillips22310d62018-09-05 11:07:21 -0400135
Chris Dalton6b498102019-08-01 14:14:52 -0600136 void swap(SkTArray<sk_sp<GrRenderTask>>* renderTasks);
Robert Phillips22310d62018-09-05 11:07:21 -0400137
Chris Dalton6b498102019-08-01 14:14:52 -0600138 bool sortingRenderTasks() const { return fSortRenderTasks; }
Robert Phillips46acf9d2018-10-09 09:31:40 -0400139
Robert Phillips22310d62018-09-05 11:07:21 -0400140 private:
Chris Dalton6b498102019-08-01 14:14:52 -0600141 SkTArray<sk_sp<GrRenderTask>> fRenderTasks;
142 bool fSortRenderTasks;
Robert Phillips22310d62018-09-05 11:07:21 -0400143 };
144
Robert Phillips69893702019-02-22 11:16:30 -0500145 GrDrawingManager(GrRecordingContext*, const GrPathRendererChain::Options&,
Robert Phillips0d075de2019-03-04 11:08:13 -0500146 const GrTextContext::Options&,
Chris Dalton6b498102019-08-01 14:14:52 -0600147 bool sortRenderTasks,
Robert Phillips6db27c22019-05-01 10:43:56 -0400148 bool reduceOpListSplitting);
robertphillips77a2e522015-10-17 07:43:27 -0700149
Robert Phillipsa9162df2019-02-11 14:12:03 -0500150 bool wasAbandoned() const;
151
robertphillips77a2e522015-10-17 07:43:27 -0700152 void cleanup();
Robert Phillipseafd48a2017-11-16 07:52:08 -0500153
154 // return true if any opLists were actually executed; false otherwise
Chris Dalton6b498102019-08-01 14:14:52 -0600155 bool executeRenderTasks(int startIndex, int stopIndex, GrOpFlushState*,
156 int* numRenderTasksExecuted);
Robert Phillipseafd48a2017-11-16 07:52:08 -0500157
Brian Salomonf9a1fdf2019-05-09 10:30:12 -0400158 GrSemaphoresSubmitted flush(GrSurfaceProxy* proxies[],
159 int numProxies,
Greg Danielbae71212019-03-01 15:24:35 -0500160 SkSurface::BackendSurfaceAccess access,
Greg Daniel797efca2019-05-09 14:04:20 -0400161 const GrFlushInfo&,
162 const GrPrepareForExternalIORequests&);
robertphillips77a2e522015-10-17 07:43:27 -0700163
Robert Phillips38d64b02018-09-04 13:23:26 -0400164 SkDEBUGCODE(void validate() const);
165
Robert Phillips69893702019-02-22 11:16:30 -0500166 friend class GrContext; // access to: flush & cleanup
Robert Phillips7ee385e2017-03-30 08:02:11 -0400167 friend class GrContextPriv; // access to: flush
Chris Daltonfe199b72017-05-05 11:26:15 -0400168 friend class GrOnFlushResourceProvider; // this is just a shallow wrapper around this class
Robert Phillips69893702019-02-22 11:16:30 -0500169 friend class GrRecordingContext; // access to: ctor
Greg Danielb6c15ba2019-03-04 13:08:25 -0500170 friend class SkImage; // for access to: flush
robertphillips77a2e522015-10-17 07:43:27 -0700171
172 static const int kNumPixelGeometries = 5; // The different pixel geometries
173 static const int kNumDFTOptions = 2; // DFT or no DFT
174
Robert Phillips69893702019-02-22 11:16:30 -0500175 GrRecordingContext* fContext;
bsalomon6b2552f2016-09-15 13:50:26 -0700176 GrPathRendererChain::Options fOptionsForPathRendererChain;
Herb Derby26cbe512018-05-24 14:39:01 -0400177 GrTextContext::Options fOptionsForTextContext;
Brian Salomon601ac802019-02-07 13:37:16 -0500178 // This cache is used by both the vertex and index pools. It reuses memory across multiple
179 // flushes.
180 sk_sp<GrBufferAllocPool::CpuBufferCache> fCpuBufferCache;
joshualittde8dc7e2016-01-08 10:09:13 -0800181
Chris Dalton6b498102019-08-01 14:14:52 -0600182 RenderTaskDAG fDAG;
Robert Phillips38d64b02018-09-04 13:23:26 -0400183 GrOpList* fActiveOpList = nullptr;
Chris Dalton3968ff92017-11-27 12:26:31 -0700184 // These are the IDs of the opLists currently being flushed (in internalFlush)
Chris Dalton6b498102019-08-01 14:14:52 -0600185 SkSTArray<8, uint32_t, true> fFlushingRenderTaskIDs;
Chris Dalton3968ff92017-11-27 12:26:31 -0700186 // These are the new opLists generated by the onFlush CBs
187 SkSTArray<8, sk_sp<GrOpList>> fOnFlushCBOpLists;
robertphillips77a2e522015-10-17 07:43:27 -0700188
Herb Derby26cbe512018-05-24 14:39:01 -0400189 std::unique_ptr<GrTextContext> fTextContext;
robertphillipsa13e2022015-11-11 12:01:09 -0800190
Ben Wagner9ec70c62018-07-12 13:30:47 -0400191 std::unique_ptr<GrPathRendererChain> fPathRendererChain;
192 sk_sp<GrSoftwarePathRenderer> fSoftwarePathRenderer;
brianosman86e76262016-08-11 12:17:31 -0700193
Robert Phillips40a29d72018-01-18 12:59:22 -0500194 GrTokenTracker fTokenTracker;
brianosman86e76262016-08-11 12:17:31 -0700195 bool fFlushing;
Robert Phillips46acf9d2018-10-09 09:31:40 -0400196 bool fReduceOpListSplitting;
bsalomonb77a9072016-09-07 10:02:04 -0700197
Chris Daltonfe199b72017-05-05 11:26:15 -0400198 SkTArray<GrOnFlushCallbackObject*> fOnFlushCBObjects;
Robert Phillips15c91422019-05-07 16:54:48 -0400199
200 void addDDLTarget(GrSurfaceProxy* proxy) { fDDLTargets.insert(proxy); }
201 bool isDDLTarget(GrSurfaceProxy* proxy) { return fDDLTargets.find(proxy) != fDDLTargets.end(); }
202 void clearDDLTargets() { fDDLTargets.clear(); }
203
204 // We play a trick with lazy proxies to retarget the base target of a DDL to the SkSurface
205 // it is replayed on. Because of this remapping we need to explicitly store the targets of
206 // DDL replaying.
207 // Note: we do not expect a whole lot of these per flush
208 std::set<GrSurfaceProxy*> fDDLTargets;
robertphillips77a2e522015-10-17 07:43:27 -0700209};
210
211#endif