blob: cd2f43646c48448569949a5bcf18849126fa340d [file] [log] [blame]
reed@google.comac10a2d2010-12-22 21:39:39 +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.
reed@google.comac10a2d2010-12-22 21:39:39 +00006 */
7
reed@google.comac10a2d2010-12-22 21:39:39 +00008#ifndef GrDrawTarget_DEFINED
9#define GrDrawTarget_DEFINED
10
joshualitt44701df2015-02-23 14:44:57 -080011#include "GrClip.h"
joshualitt6db519c2014-10-29 08:48:18 -070012#include "GrClipMaskManager.h"
commit-bot@chromium.org2a05de02014-03-25 15:17:32 +000013#include "GrContext.h"
joshualitt8072caa2015-02-12 14:20:52 -080014#include "GrPathProcessor.h"
15#include "GrPrimitiveProcessor.h"
bsalomon@google.com934c5702012-03-20 21:17:58 +000016#include "GrIndexBuffer.h"
kkinnunenccdaa042014-08-20 01:36:23 -070017#include "GrPathRendering.h"
egdaniel8dd688b2015-01-22 10:16:09 -080018#include "GrPipelineBuilder.h"
commit-bot@chromium.org2a05de02014-03-25 15:17:32 +000019#include "GrTraceMarker.h"
joshualitt7eb8c7b2014-11-18 14:24:27 -080020#include "GrVertexBuffer.h"
reed@google.comac10a2d2010-12-22 21:39:39 +000021
bsalomon@google.com8d67c072012-12-13 20:38:14 +000022#include "SkClipStack.h"
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +000023#include "SkMatrix.h"
sugoi@google.com12b4e272012-12-06 20:13:11 +000024#include "SkPath.h"
commit-bot@chromium.org9b62aa12014-03-25 11:59:40 +000025#include "SkStrokeRec.h"
robertphillips@google.coma2d71482012-08-01 20:08:47 +000026#include "SkTArray.h"
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +000027#include "SkTLazy.h"
commit-bot@chromium.orga0b40282013-09-18 13:00:55 +000028#include "SkTypes.h"
bsalomon@google.com8d67c072012-12-13 20:38:14 +000029#include "SkXfermode.h"
Scroggo97c88c22011-05-11 14:05:25 +000030
joshualitt4d8da812015-01-28 12:53:54 -080031class GrBatch;
joshualitt44701df2015-02-23 14:44:57 -080032class GrClip;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +000033class GrDrawTargetCaps;
bsalomona73239a2015-04-28 13:35:17 -070034class GrIndexBufferAllocPool;
bsalomon@google.com64aef2b2012-06-11 15:36:13 +000035class GrPath;
cdaltonb85a0aa2014-07-21 15:32:44 -070036class GrPathRange;
egdaniele36914c2015-02-13 09:00:33 -080037class GrPipeline;
bsalomona73239a2015-04-28 13:35:17 -070038class GrVertexBufferAllocPool;
sugoi@google.com12b4e272012-12-06 20:13:11 +000039
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +000040class GrDrawTarget : public SkRefCnt {
bsalomon@google.comf6601872012-08-28 21:11:35 +000041public:
42 SK_DECLARE_INST_COUNT(GrDrawTarget)
43
cdalton55b24af2014-11-25 11:00:56 -080044 typedef GrPathRange::PathIndexType PathIndexType;
45 typedef GrPathRendering::PathTransformType PathTransformType;
kkinnunenccdaa042014-08-20 01:36:23 -070046
reed@google.comac10a2d2010-12-22 21:39:39 +000047 ///////////////////////////////////////////////////////////////////////////
48
bsalomon@google.com6e4e6502013-02-25 20:12:45 +000049 // The context may not be fully constructed and should not be used during GrDrawTarget
50 // construction.
bsalomona73239a2015-04-28 13:35:17 -070051 GrDrawTarget(GrContext* context, GrVertexBufferAllocPool*, GrIndexBufferAllocPool*);
52
bsalomon72e3ae42015-04-28 08:08:46 -070053 virtual ~GrDrawTarget() {}
reed@google.comac10a2d2010-12-22 21:39:39 +000054
55 /**
bsalomona73239a2015-04-28 13:35:17 -070056 * Empties the draw buffer of any queued up draws.
57 */
58 void reset();
59
60 /**
61 * This plays any queued up draws to its GrGpu target. It also resets this object (i.e. flushing
62 * is destructive).
63 */
64 void flush();
65
66 /**
bsalomon@google.com18c9c192011-09-22 21:01:31 +000067 * Gets the capabilities of the draw target.
68 */
bsalomon@google.comc26d94f2013-03-25 18:19:00 +000069 const GrDrawTargetCaps* caps() const { return fCaps.get(); }
bsalomon@google.com18c9c192011-09-22 21:01:31 +000070
joshualitt4d8da812015-01-28 12:53:54 -080071 // TODO devbounds should live on the batch
joshualitt44701df2015-02-23 14:44:57 -080072 void drawBatch(GrPipelineBuilder*, GrBatch*, const SkRect* devBounds = NULL);
joshualitt4d8da812015-01-28 12:53:54 -080073
bsalomon@google.com86afc2a2011-02-16 16:12:19 +000074 /**
bsalomon@google.com64aef2b2012-06-11 15:36:13 +000075 * Draws path into the stencil buffer. The fill must be either even/odd or
76 * winding (not inverse or hairline). It will respect the HW antialias flag
egdaniel8dd688b2015-01-22 10:16:09 -080077 * on the GrPipelineBuilder (if possible in the 3D API). Note, we will never have an inverse
78 * fill with stencil path
bsalomon@google.com64aef2b2012-06-11 15:36:13 +000079 */
egdaniel8dd688b2015-01-22 10:16:09 -080080 void stencilPath(GrPipelineBuilder*, const GrPathProcessor*, const GrPath*,
81 GrPathRendering::FillType);
bsalomon@google.com64aef2b2012-06-11 15:36:13 +000082
83 /**
commit-bot@chromium.org32184d82013-10-09 15:14:18 +000084 * Draws a path. Fill must not be a hairline. It will respect the HW
egdaniel8dd688b2015-01-22 10:16:09 -080085 * antialias flag on the GrPipelineBuilder (if possible in the 3D API).
commit-bot@chromium.orgc4dc0ad2013-10-09 14:11:33 +000086 */
egdaniel8dd688b2015-01-22 10:16:09 -080087 void drawPath(GrPipelineBuilder*, const GrPathProcessor*, const GrPath*,
88 GrPathRendering::FillType);
commit-bot@chromium.orgc4dc0ad2013-10-09 14:11:33 +000089
90 /**
cdalton55b24af2014-11-25 11:00:56 -080091 * Draws the aggregate path from combining multiple. Note that this will not
92 * always be equivalent to back-to-back calls to drawPath(). It will respect
egdaniel8dd688b2015-01-22 10:16:09 -080093 * the HW antialias flag on the GrPipelineBuilder (if possible in the 3D API).
commit-bot@chromium.org9b62aa12014-03-25 11:59:40 +000094 *
cdalton55b24af2014-11-25 11:00:56 -080095 * @param pathRange Source paths to draw from
96 * @param indices Array of path indices to draw
97 * @param indexType Data type of the array elements in indexBuffer
98 * @param transformValues Array of transforms for the individual paths
99 * @param transformType Type of transforms in transformBuffer
100 * @param count Number of paths to draw
cdaltonb85a0aa2014-07-21 15:32:44 -0700101 * @param fill Fill type for drawing all the paths
commit-bot@chromium.org9b62aa12014-03-25 11:59:40 +0000102 */
egdaniel8dd688b2015-01-22 10:16:09 -0800103 void drawPaths(GrPipelineBuilder*,
joshualitt56995b52014-12-11 15:44:02 -0800104 const GrPathProcessor*,
joshualitt2e3b3e32014-12-09 13:31:14 -0800105 const GrPathRange* pathRange,
cdalton55b24af2014-11-25 11:00:56 -0800106 const void* indices,
107 PathIndexType indexType,
108 const float transformValues[],
109 PathTransformType transformType,
joshualitt9853cce2014-11-17 14:22:48 -0800110 int count,
joshualitt92e496f2014-10-31 13:56:50 -0700111 GrPathRendering::FillType fill);
cdaltonb85a0aa2014-07-21 15:32:44 -0700112
commit-bot@chromium.org9b62aa12014-03-25 11:59:40 +0000113 /**
bsalomon72e3ae42015-04-28 08:08:46 -0700114 * Helper function for drawing rects.
skia.committer@gmail.com044679e2013-02-15 07:16:57 +0000115 *
bsalomon@google.comc7818882013-03-20 19:19:53 +0000116 * @param rect the rect to draw
bsalomon@google.comc7818882013-03-20 19:19:53 +0000117 * @param localRect optional rect that specifies local coords to map onto
118 * rect. If NULL then rect serves as the local coords.
joshualitt8fc6c2d2014-12-22 15:27:05 -0800119 * @param localMatrix Optional local matrix. The local coordinates are specified by localRect,
120 * or if it is NULL by rect. This matrix applies to the coordinate implied by
121 * that rectangle before it is input to GrCoordTransforms that read local
122 * coordinates
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000123 */
joshualitt4d8da812015-01-28 12:53:54 -0800124 void drawRect(GrPipelineBuilder* pipelineBuilder,
joshualitt2e3b3e32014-12-09 13:31:14 -0800125 GrColor color,
joshualitt8059eb92014-12-29 15:10:07 -0800126 const SkMatrix& viewMatrix,
joshualitt9853cce2014-11-17 14:22:48 -0800127 const SkRect& rect,
commit-bot@chromium.orgfd03d4a2013-07-17 21:39:42 +0000128 const SkRect* localRect,
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000129 const SkMatrix* localMatrix) {
joshualitt4d8da812015-01-28 12:53:54 -0800130 this->onDrawRect(pipelineBuilder, color, viewMatrix, rect, localRect, localMatrix);
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000131 }
jvanverth@google.com39768252013-02-14 15:25:44 +0000132
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000133 /**
bsalomon@google.comc7818882013-03-20 19:19:53 +0000134 * Helper for drawRect when the caller doesn't need separate local rects or matrices.
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000135 */
egdaniel8dd688b2015-01-22 10:16:09 -0800136 void drawSimpleRect(GrPipelineBuilder* ds, GrColor color, const SkMatrix& viewM,
137 const SkRect& rect) {
joshualitt8059eb92014-12-29 15:10:07 -0800138 this->drawRect(ds, color, viewM, rect, NULL, NULL);
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000139 }
egdaniel8dd688b2015-01-22 10:16:09 -0800140 void drawSimpleRect(GrPipelineBuilder* ds, GrColor color, const SkMatrix& viewM,
joshualitt8059eb92014-12-29 15:10:07 -0800141 const SkIRect& irect) {
reed@google.com44699382013-10-31 17:28:30 +0000142 SkRect rect = SkRect::Make(irect);
joshualitt8059eb92014-12-29 15:10:07 -0800143 this->drawRect(ds, color, viewM, rect, NULL, NULL);
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000144 }
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000145
bsalomon@google.com934c5702012-03-20 21:17:58 +0000146
147 /**
egdaniel8dd688b2015-01-22 10:16:09 -0800148 * Clear the passed in render target. Ignores the GrPipelineBuilder and clip. Clears the whole
149 * thing if rect is NULL, otherwise just the rect. If canIgnoreRect is set then the entire
150 * render target can be optionally cleared.
bsalomon@google.com0b335c12011-04-25 19:17:44 +0000151 */
joshualitt9853cce2014-11-17 14:22:48 -0800152 void clear(const SkIRect* rect,
153 GrColor color,
154 bool canIgnoreRect,
bsalomon63b21962014-11-05 07:05:34 -0800155 GrRenderTarget* renderTarget);
skia.committer@gmail.coma9493a32013-04-04 07:01:12 +0000156
bsalomon@google.come4617bf2013-04-03 14:56:40 +0000157 /**
bsalomon89c62982014-11-03 12:08:42 -0800158 * Discards the contents render target.
commit-bot@chromium.org28361fa2014-03-28 16:08:05 +0000159 **/
bsalomon89c62982014-11-03 12:08:42 -0800160 virtual void discard(GrRenderTarget*) = 0;
commit-bot@chromium.org28361fa2014-03-28 16:08:05 +0000161
162 /**
commit-bot@chromium.org2a05de02014-03-25 15:17:32 +0000163 * Called at start and end of gpu trace marking
164 * GR_CREATE_GPU_TRACE_MARKER(marker_str, target) will automatically call these at the start
165 * and end of a code block respectively
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000166 */
egdaniel3eee3832014-06-18 13:09:11 -0700167 void addGpuTraceMarker(const GrGpuTraceMarker* marker);
168 void removeGpuTraceMarker(const GrGpuTraceMarker* marker);
169
170 /**
171 * Takes the current active set of markers and stores them for later use. Any current marker
172 * in the active set is removed from the active set and the targets remove function is called.
173 * These functions do not work as a stack so you cannot call save a second time before calling
174 * restore. Also, it is assumed that when restore is called the current active set of markers
175 * is empty. When the stored markers are added back into the active set, the targets add marker
176 * is called.
177 */
178 void saveActiveTraceMarkers();
179 void restoreActiveTraceMarkers();
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000180
181 /**
bsalomon@google.come4617bf2013-04-03 14:56:40 +0000182 * Copies a pixel rectangle from one surface to another. This call may finalize
183 * reserved vertex/index data (as though a draw call was made). The src pixels
184 * copied are specified by srcRect. They are copied to a rect of the same
185 * size in dst with top left at dstPoint. If the src rect is clipped by the
186 * src bounds then pixel values in the dst rect corresponding to area clipped
187 * by the src rect are not overwritten. This method can fail and return false
188 * depending on the type of surface, configs, etc, and the backend-specific
189 * limitations. If rect is clipped out entirely by the src or dst bounds then
190 * true is returned since there is no actual copy necessary to succeed.
191 */
bsalomonf90a02b2014-11-26 12:28:00 -0800192 bool copySurface(GrSurface* dst,
193 GrSurface* src,
194 const SkIRect& srcRect,
195 const SkIPoint& dstPoint);
bsalomon@google.com116ad842013-04-09 15:38:19 +0000196 /**
bsalomonf90a02b2014-11-26 12:28:00 -0800197 * Function that determines whether a copySurface call would succeed without actually
bsalomon@google.com116ad842013-04-09 15:38:19 +0000198 * performing the copy.
199 */
bsalomonf90a02b2014-11-26 12:28:00 -0800200 bool canCopySurface(const GrSurface* dst,
201 const GrSurface* src,
202 const SkIRect& srcRect,
203 const SkIPoint& dstPoint);
bsalomon@google.comeb851172013-04-15 13:51:00 +0000204
205 /**
robertphillips@google.comff175842012-05-14 19:31:39 +0000206 * Release any resources that are cached but not currently in use. This
207 * is intended to give an application some recourse when resources are low.
208 */
209 virtual void purgeResources() {};
210
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000211 ///////////////////////////////////////////////////////////////////////////
212 // Draw execution tracking (for font atlases and other resources)
213 class DrawToken {
214 public:
215 DrawToken(GrDrawTarget* drawTarget, uint32_t drawID) :
216 fDrawTarget(drawTarget), fDrawID(drawID) {}
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000217
bsalomon49f085d2014-09-05 13:34:00 -0700218 bool isIssued() { return fDrawTarget && fDrawTarget->isIssued(fDrawID); }
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000219
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000220 private:
221 GrDrawTarget* fDrawTarget;
222 uint32_t fDrawID; // this may wrap, but we're doing direct comparison
223 // so that should be okay
224 };
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000225
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000226 virtual DrawToken getCurrentDrawToken() { return DrawToken(this, 0); }
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000227
joshualitt3322fa42014-11-07 08:48:51 -0800228 /**
229 * Used to communicate draws to GPUs / subclasses
230 */
231 class DrawInfo {
232 public:
joshualitt4d8da812015-01-28 12:53:54 -0800233 DrawInfo() { fDevBounds = NULL; }
joshualitt3322fa42014-11-07 08:48:51 -0800234 DrawInfo(const DrawInfo& di) { (*this) = di; }
235 DrawInfo& operator =(const DrawInfo& di);
236
237 GrPrimitiveType primitiveType() const { return fPrimitiveType; }
238 int startVertex() const { return fStartVertex; }
239 int startIndex() const { return fStartIndex; }
240 int vertexCount() const { return fVertexCount; }
241 int indexCount() const { return fIndexCount; }
242 int verticesPerInstance() const { return fVerticesPerInstance; }
243 int indicesPerInstance() const { return fIndicesPerInstance; }
244 int instanceCount() const { return fInstanceCount; }
245
joshualitt4d8da812015-01-28 12:53:54 -0800246 void setPrimitiveType(GrPrimitiveType type) { fPrimitiveType = type; }
247 void setStartVertex(int startVertex) { fStartVertex = startVertex; }
248 void setStartIndex(int startIndex) { fStartIndex = startIndex; }
249 void setVertexCount(int vertexCount) { fVertexCount = vertexCount; }
250 void setIndexCount(int indexCount) { fIndexCount = indexCount; }
251 void setVerticesPerInstance(int verticesPerI) { fVerticesPerInstance = verticesPerI; }
252 void setIndicesPerInstance(int indicesPerI) { fIndicesPerInstance = indicesPerI; }
253 void setInstanceCount(int instanceCount) { fInstanceCount = instanceCount; }
254
joshualitt3322fa42014-11-07 08:48:51 -0800255 bool isIndexed() const { return fIndexCount > 0; }
256#ifdef SK_DEBUG
257 bool isInstanced() const; // this version is longer because of asserts
258#else
259 bool isInstanced() const { return fInstanceCount > 0; }
260#endif
261
262 // adds or remove instances
263 void adjustInstanceCount(int instanceOffset);
264 // shifts the start vertex
bsalomon72e3ae42015-04-28 08:08:46 -0700265 void adjustStartVertex(int vertexOffset) {
266 fStartVertex += vertexOffset;
267 SkASSERT(fStartVertex >= 0);
268 }
joshualitt3322fa42014-11-07 08:48:51 -0800269 // shifts the start index
bsalomon72e3ae42015-04-28 08:08:46 -0700270 void adjustStartIndex(int indexOffset) {
271 SkASSERT(this->isIndexed());
272 fStartIndex += indexOffset;
273 SkASSERT(fStartIndex >= 0);
274 }
joshualitt3322fa42014-11-07 08:48:51 -0800275 void setDevBounds(const SkRect& bounds) {
276 fDevBoundsStorage = bounds;
277 fDevBounds = &fDevBoundsStorage;
278 }
joshualitt7eb8c7b2014-11-18 14:24:27 -0800279 const GrVertexBuffer* vertexBuffer() const { return fVertexBuffer.get(); }
280 const GrIndexBuffer* indexBuffer() const { return fIndexBuffer.get(); }
281 void setVertexBuffer(const GrVertexBuffer* vb) {
282 fVertexBuffer.reset(vb);
283 }
284 void setIndexBuffer(const GrIndexBuffer* ib) {
285 fIndexBuffer.reset(ib);
286 }
joshualitt3322fa42014-11-07 08:48:51 -0800287 const SkRect* getDevBounds() const { return fDevBounds; }
288
joshualitt3322fa42014-11-07 08:48:51 -0800289 private:
joshualitt3322fa42014-11-07 08:48:51 -0800290 friend class GrDrawTarget;
291
292 GrPrimitiveType fPrimitiveType;
293
294 int fStartVertex;
295 int fStartIndex;
296 int fVertexCount;
297 int fIndexCount;
298
299 int fInstanceCount;
300 int fVerticesPerInstance;
301 int fIndicesPerInstance;
302
303 SkRect fDevBoundsStorage;
304 SkRect* fDevBounds;
305
joshualitt7eb8c7b2014-11-18 14:24:27 -0800306 GrPendingIOResource<const GrVertexBuffer, kRead_GrIOType> fVertexBuffer;
307 GrPendingIOResource<const GrIndexBuffer, kRead_GrIOType> fIndexBuffer;
joshualitt3322fa42014-11-07 08:48:51 -0800308 };
joshualitt2c93efe2014-11-06 12:57:13 -0800309
310 bool programUnitTest(int maxStages);
311
reed@google.comac10a2d2010-12-22 21:39:39 +0000312protected:
robertphillipsdad77942015-03-03 09:28:16 -0800313 friend class GrTargetCommands; // for PipelineInfo
314
bsalomon@google.com6e4e6502013-02-25 20:12:45 +0000315 GrContext* getContext() { return fContext; }
316 const GrContext* getContext() const { return fContext; }
317
bsalomona73239a2015-04-28 13:35:17 -0700318 GrGpu* getGpu() {
319 SkASSERT(fContext && fContext->getGpu());
320 return fContext->getGpu();
321 }
322 const GrGpu* getGpu() const {
323 SkASSERT(fContext && fContext->getGpu());
324 return fContext->getGpu();
325 }
326
327 GrVertexBufferAllocPool* getVertexAllocPool() { return fVertexPool; }
328 GrIndexBufferAllocPool* getIndexAllocPool() { return fIndexPool; }
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000329
commit-bot@chromium.org2a05de02014-03-25 15:17:32 +0000330 const GrTraceMarkerSet& getActiveTraceMarkers() { return fActiveTraceMarkers; }
331
joshualitt65171342014-10-09 07:25:36 -0700332 // Makes a copy of the dst if it is necessary for the draw. Returns false if a copy is required
333 // but couldn't be made. Otherwise, returns true. This method needs to be protected because it
334 // needs to be accessed by GLPrograms to setup a correct drawstate
bsalomon50785a32015-02-06 07:02:37 -0800335 bool setupDstReadIfNecessary(const GrPipelineBuilder&,
egdaniele36914c2015-02-13 09:00:33 -0800336 const GrProcOptInfo& colorPOI,
337 const GrProcOptInfo& coveragePOI,
joshualitt9853cce2014-11-17 14:22:48 -0800338 GrDeviceCoordTexture* dstCopy,
339 const SkRect* drawBounds);
joshualitt65171342014-10-09 07:25:36 -0700340
egdaniele36914c2015-02-13 09:00:33 -0800341 struct PipelineInfo {
342 PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor,
joshualitt44701df2015-02-23 14:44:57 -0800343 const GrPrimitiveProcessor* primProc,
344 const SkRect* devBounds, GrDrawTarget* target);
egdaniele36914c2015-02-13 09:00:33 -0800345
346 PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor,
joshualitt44701df2015-02-23 14:44:57 -0800347 const GrBatch* batch, const SkRect* devBounds,
348 GrDrawTarget* target);
egdaniele36914c2015-02-13 09:00:33 -0800349
350 bool willBlendWithDst(const GrPrimitiveProcessor* primProc) const {
351 return fPipelineBuilder->willBlendWithDst(primProc);
352 }
353 private:
354 friend class GrDrawTarget;
355
356 bool mustSkipDraw() const { return (NULL == fPipelineBuilder); }
357
358 GrPipelineBuilder* fPipelineBuilder;
359 GrScissorState* fScissor;
360 GrProcOptInfo fColorPOI;
361 GrProcOptInfo fCoveragePOI;
362 GrDeviceCoordTexture fDstCopy;
363 };
364
365 void setupPipeline(const PipelineInfo& pipelineInfo, GrPipeline* pipeline);
366
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000367private:
bsalomona73239a2015-04-28 13:35:17 -0700368 virtual void onReset() = 0;
bsalomonf90a02b2014-11-26 12:28:00 -0800369
bsalomona73239a2015-04-28 13:35:17 -0700370 virtual void onFlush() = 0;
bsalomonf90a02b2014-11-26 12:28:00 -0800371
egdaniele36914c2015-02-13 09:00:33 -0800372 virtual void onDrawBatch(GrBatch*, const PipelineInfo&) = 0;
joshualitt5478d422014-11-14 16:00:38 -0800373 // TODO copy in order drawbuffer onDrawRect to here
egdaniel8dd688b2015-01-22 10:16:09 -0800374 virtual void onDrawRect(GrPipelineBuilder*,
joshualitt2e3b3e32014-12-09 13:31:14 -0800375 GrColor color,
joshualitt8059eb92014-12-29 15:10:07 -0800376 const SkMatrix& viewMatrix,
joshualitt9853cce2014-11-17 14:22:48 -0800377 const SkRect& rect,
commit-bot@chromium.orgfd03d4a2013-07-17 21:39:42 +0000378 const SkRect* localRect,
joshualitt5478d422014-11-14 16:00:38 -0800379 const SkMatrix* localMatrix) = 0;
commit-bot@chromium.org32184d82013-10-09 15:14:18 +0000380
egdaniel8dd688b2015-01-22 10:16:09 -0800381 virtual void onStencilPath(const GrPipelineBuilder&,
joshualitt56995b52014-12-11 15:44:02 -0800382 const GrPathProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800383 const GrPath*,
bsalomon3e791242014-12-17 13:43:13 -0800384 const GrScissorState&,
joshualitt2c93efe2014-11-06 12:57:13 -0800385 const GrStencilSettings&) = 0;
egdaniele36914c2015-02-13 09:00:33 -0800386 virtual void onDrawPath(const GrPathProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800387 const GrPath*,
joshualitt2c93efe2014-11-06 12:57:13 -0800388 const GrStencilSettings&,
egdaniele36914c2015-02-13 09:00:33 -0800389 const PipelineInfo&) = 0;
390 virtual void onDrawPaths(const GrPathProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800391 const GrPathRange*,
cdalton55b24af2014-11-25 11:00:56 -0800392 const void* indices,
393 PathIndexType,
394 const float transformValues[],
joshualitt2c93efe2014-11-06 12:57:13 -0800395 PathTransformType,
cdalton55b24af2014-11-25 11:00:56 -0800396 int count,
joshualitt2c93efe2014-11-06 12:57:13 -0800397 const GrStencilSettings&,
egdaniele36914c2015-02-13 09:00:33 -0800398 const PipelineInfo&) = 0;
bsalomon@google.com64aef2b2012-06-11 15:36:13 +0000399
bsalomon63b21962014-11-05 07:05:34 -0800400 virtual void onClear(const SkIRect* rect, GrColor color, bool canIgnoreRect,
401 GrRenderTarget* renderTarget) = 0;
402
bsalomona73239a2015-04-28 13:35:17 -0700403 /** The subclass's copy surface implementation. It should assume that any clipping has already
404 been performed on the rect and point and that the GrGpu supports the copy. */
405 virtual void onCopySurface(GrSurface* dst,
bsalomonf90a02b2014-11-26 12:28:00 -0800406 GrSurface* src,
407 const SkIRect& srcRect,
408 const SkIPoint& dstPoint) = 0;
409
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000410 // Check to see if this set of draw commands has been sent out
411 virtual bool isIssued(uint32_t drawID) { return true; }
joshualitt9853cce2014-11-17 14:22:48 -0800412 void getPathStencilSettingsForFilltype(GrPathRendering::FillType,
egdaniel8dc7c3a2015-04-16 11:22:42 -0700413 const GrStencilAttachment*,
joshualitt9853cce2014-11-17 14:22:48 -0800414 GrStencilSettings*);
joshualitta7024152014-11-03 14:16:35 -0800415 virtual GrClipMaskManager* clipMaskManager() = 0;
egdaniel8dd688b2015-01-22 10:16:09 -0800416 virtual bool setupClip(GrPipelineBuilder*,
bsalomon6be6f7c2015-02-26 13:05:21 -0800417 GrPipelineBuilder::AutoRestoreFragmentProcessors*,
418 GrPipelineBuilder::AutoRestoreStencil*,
419 GrScissorState*,
joshualitt8059eb92014-12-29 15:10:07 -0800420 const SkRect* devBounds) = 0;
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000421
bsalomon@google.com6e4e6502013-02-25 20:12:45 +0000422 // The context owns us, not vice-versa, so this ptr is not ref'ed by DrawTarget.
423 GrContext* fContext;
bsalomona73239a2015-04-28 13:35:17 -0700424 SkAutoTUnref<const GrDrawTargetCaps> fCaps;
commit-bot@chromium.org2a05de02014-03-25 15:17:32 +0000425 // To keep track that we always have at least as many debug marker adds as removes
426 int fGpuTraceMarkerCount;
427 GrTraceMarkerSet fActiveTraceMarkers;
egdaniel3eee3832014-06-18 13:09:11 -0700428 GrTraceMarkerSet fStoredTraceMarkers;
bsalomona73239a2015-04-28 13:35:17 -0700429 GrVertexBufferAllocPool* fVertexPool;
430 GrIndexBufferAllocPool* fIndexPool;
431 bool fFlushing;
reed@google.comfa35e3d2012-06-26 20:16:17 +0000432
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +0000433 typedef SkRefCnt INHERITED;
reed@google.comac10a2d2010-12-22 21:39:39 +0000434};
435
joshualitt329bf482014-10-29 12:31:28 -0700436/*
437 * This class is JUST for clip mask manager. Everyone else should just use draw target above.
438 */
joshualitt6db519c2014-10-29 08:48:18 -0700439class GrClipTarget : public GrDrawTarget {
440public:
bsalomona73239a2015-04-28 13:35:17 -0700441 GrClipTarget(GrContext* context,
442 GrVertexBufferAllocPool* vpool,
443 GrIndexBufferAllocPool* ipool)
444 : INHERITED(context, vpool, ipool) {
joshualitt329bf482014-10-29 12:31:28 -0700445 fClipMaskManager.setClipTarget(this);
446 }
447
448 /* Clip mask manager needs access to the context.
449 * TODO we only need a very small subset of context in the CMM.
450 */
451 GrContext* getContext() { return INHERITED::getContext(); }
452 const GrContext* getContext() const { return INHERITED::getContext(); }
453
joshualitt6db519c2014-10-29 08:48:18 -0700454 /**
455 * Clip Mask Manager(and no one else) needs to clear private stencil bits.
456 * ClipTarget subclass sets clip bit in the stencil buffer. The subclass
457 * is free to clear the remaining bits to zero if masked clears are more
458 * expensive than clearing all bits.
459 */
460 virtual void clearStencilClip(const SkIRect& rect, bool insideClip, GrRenderTarget* = NULL) = 0;
461
joshualitt3bdd7dc2014-10-31 08:27:39 -0700462 /**
463 * Release any resources that are cached but not currently in use. This
464 * is intended to give an application some recourse when resources are low.
465 */
mtklein36352bf2015-03-25 18:17:31 -0700466 void purgeResources() override {
joshualitt3bdd7dc2014-10-31 08:27:39 -0700467 // The clip mask manager can rebuild all its clip masks so just
468 // get rid of them all.
469 fClipMaskManager.purgeResources();
470 };
471
joshualitt329bf482014-10-29 12:31:28 -0700472protected:
473 GrClipMaskManager fClipMaskManager;
474
joshualitt6db519c2014-10-29 08:48:18 -0700475private:
mtklein36352bf2015-03-25 18:17:31 -0700476 GrClipMaskManager* clipMaskManager() override { return &fClipMaskManager; }
joshualitt329bf482014-10-29 12:31:28 -0700477
egdaniel8dd688b2015-01-22 10:16:09 -0800478 virtual bool setupClip(GrPipelineBuilder*,
bsalomon6be6f7c2015-02-26 13:05:21 -0800479 GrPipelineBuilder::AutoRestoreFragmentProcessors*,
480 GrPipelineBuilder::AutoRestoreStencil*,
joshualitt8059eb92014-12-29 15:10:07 -0800481 GrScissorState* scissorState,
mtklein36352bf2015-03-25 18:17:31 -0700482 const SkRect* devBounds) override;
joshualitt2c93efe2014-11-06 12:57:13 -0800483
joshualitt6db519c2014-10-29 08:48:18 -0700484 typedef GrDrawTarget INHERITED;
485};
486
reed@google.comac10a2d2010-12-22 21:39:39 +0000487#endif