blob: 8706702866bcfa726b53fa2160f837e7c88599e8 [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;
bsalomon@google.com64aef2b2012-06-11 15:36:13 +000034class GrPath;
cdaltonb85a0aa2014-07-21 15:32:44 -070035class GrPathRange;
egdaniele36914c2015-02-13 09:00:33 -080036class GrPipeline;
sugoi@google.com12b4e272012-12-06 20:13:11 +000037
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +000038class GrDrawTarget : public SkRefCnt {
bsalomon@google.comf6601872012-08-28 21:11:35 +000039public:
40 SK_DECLARE_INST_COUNT(GrDrawTarget)
41
cdalton55b24af2014-11-25 11:00:56 -080042 typedef GrPathRange::PathIndexType PathIndexType;
43 typedef GrPathRendering::PathTransformType PathTransformType;
kkinnunenccdaa042014-08-20 01:36:23 -070044
reed@google.comac10a2d2010-12-22 21:39:39 +000045 ///////////////////////////////////////////////////////////////////////////
46
bsalomon@google.com6e4e6502013-02-25 20:12:45 +000047 // The context may not be fully constructed and should not be used during GrDrawTarget
48 // construction.
49 GrDrawTarget(GrContext* context);
bsalomon72e3ae42015-04-28 08:08:46 -070050 virtual ~GrDrawTarget() {}
reed@google.comac10a2d2010-12-22 21:39:39 +000051
52 /**
bsalomon@google.com18c9c192011-09-22 21:01:31 +000053 * Gets the capabilities of the draw target.
54 */
bsalomon@google.comc26d94f2013-03-25 18:19:00 +000055 const GrDrawTargetCaps* caps() const { return fCaps.get(); }
bsalomon@google.com18c9c192011-09-22 21:01:31 +000056
joshualitt4d8da812015-01-28 12:53:54 -080057 // TODO devbounds should live on the batch
joshualitt44701df2015-02-23 14:44:57 -080058 void drawBatch(GrPipelineBuilder*, GrBatch*, const SkRect* devBounds = NULL);
joshualitt4d8da812015-01-28 12:53:54 -080059
bsalomon@google.com86afc2a2011-02-16 16:12:19 +000060 /**
bsalomon@google.com64aef2b2012-06-11 15:36:13 +000061 * Draws path into the stencil buffer. The fill must be either even/odd or
62 * winding (not inverse or hairline). It will respect the HW antialias flag
egdaniel8dd688b2015-01-22 10:16:09 -080063 * on the GrPipelineBuilder (if possible in the 3D API). Note, we will never have an inverse
64 * fill with stencil path
bsalomon@google.com64aef2b2012-06-11 15:36:13 +000065 */
egdaniel8dd688b2015-01-22 10:16:09 -080066 void stencilPath(GrPipelineBuilder*, const GrPathProcessor*, const GrPath*,
67 GrPathRendering::FillType);
bsalomon@google.com64aef2b2012-06-11 15:36:13 +000068
69 /**
commit-bot@chromium.org32184d82013-10-09 15:14:18 +000070 * Draws a path. Fill must not be a hairline. It will respect the HW
egdaniel8dd688b2015-01-22 10:16:09 -080071 * antialias flag on the GrPipelineBuilder (if possible in the 3D API).
commit-bot@chromium.orgc4dc0ad2013-10-09 14:11:33 +000072 */
egdaniel8dd688b2015-01-22 10:16:09 -080073 void drawPath(GrPipelineBuilder*, const GrPathProcessor*, const GrPath*,
74 GrPathRendering::FillType);
commit-bot@chromium.orgc4dc0ad2013-10-09 14:11:33 +000075
76 /**
cdalton55b24af2014-11-25 11:00:56 -080077 * Draws the aggregate path from combining multiple. Note that this will not
78 * always be equivalent to back-to-back calls to drawPath(). It will respect
egdaniel8dd688b2015-01-22 10:16:09 -080079 * the HW antialias flag on the GrPipelineBuilder (if possible in the 3D API).
commit-bot@chromium.org9b62aa12014-03-25 11:59:40 +000080 *
cdalton55b24af2014-11-25 11:00:56 -080081 * @param pathRange Source paths to draw from
82 * @param indices Array of path indices to draw
83 * @param indexType Data type of the array elements in indexBuffer
84 * @param transformValues Array of transforms for the individual paths
85 * @param transformType Type of transforms in transformBuffer
86 * @param count Number of paths to draw
cdaltonb85a0aa2014-07-21 15:32:44 -070087 * @param fill Fill type for drawing all the paths
commit-bot@chromium.org9b62aa12014-03-25 11:59:40 +000088 */
egdaniel8dd688b2015-01-22 10:16:09 -080089 void drawPaths(GrPipelineBuilder*,
joshualitt56995b52014-12-11 15:44:02 -080090 const GrPathProcessor*,
joshualitt2e3b3e32014-12-09 13:31:14 -080091 const GrPathRange* pathRange,
cdalton55b24af2014-11-25 11:00:56 -080092 const void* indices,
93 PathIndexType indexType,
94 const float transformValues[],
95 PathTransformType transformType,
joshualitt9853cce2014-11-17 14:22:48 -080096 int count,
joshualitt92e496f2014-10-31 13:56:50 -070097 GrPathRendering::FillType fill);
cdaltonb85a0aa2014-07-21 15:32:44 -070098
commit-bot@chromium.org9b62aa12014-03-25 11:59:40 +000099 /**
bsalomon72e3ae42015-04-28 08:08:46 -0700100 * Helper function for drawing rects.
skia.committer@gmail.com044679e2013-02-15 07:16:57 +0000101 *
bsalomon@google.comc7818882013-03-20 19:19:53 +0000102 * @param rect the rect to draw
bsalomon@google.comc7818882013-03-20 19:19:53 +0000103 * @param localRect optional rect that specifies local coords to map onto
104 * rect. If NULL then rect serves as the local coords.
joshualitt8fc6c2d2014-12-22 15:27:05 -0800105 * @param localMatrix Optional local matrix. The local coordinates are specified by localRect,
106 * or if it is NULL by rect. This matrix applies to the coordinate implied by
107 * that rectangle before it is input to GrCoordTransforms that read local
108 * coordinates
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000109 */
joshualitt4d8da812015-01-28 12:53:54 -0800110 void drawRect(GrPipelineBuilder* pipelineBuilder,
joshualitt2e3b3e32014-12-09 13:31:14 -0800111 GrColor color,
joshualitt8059eb92014-12-29 15:10:07 -0800112 const SkMatrix& viewMatrix,
joshualitt9853cce2014-11-17 14:22:48 -0800113 const SkRect& rect,
commit-bot@chromium.orgfd03d4a2013-07-17 21:39:42 +0000114 const SkRect* localRect,
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000115 const SkMatrix* localMatrix) {
joshualitt4d8da812015-01-28 12:53:54 -0800116 this->onDrawRect(pipelineBuilder, color, viewMatrix, rect, localRect, localMatrix);
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000117 }
jvanverth@google.com39768252013-02-14 15:25:44 +0000118
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000119 /**
bsalomon@google.comc7818882013-03-20 19:19:53 +0000120 * Helper for drawRect when the caller doesn't need separate local rects or matrices.
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000121 */
egdaniel8dd688b2015-01-22 10:16:09 -0800122 void drawSimpleRect(GrPipelineBuilder* ds, GrColor color, const SkMatrix& viewM,
123 const SkRect& rect) {
joshualitt8059eb92014-12-29 15:10:07 -0800124 this->drawRect(ds, color, viewM, rect, NULL, NULL);
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000125 }
egdaniel8dd688b2015-01-22 10:16:09 -0800126 void drawSimpleRect(GrPipelineBuilder* ds, GrColor color, const SkMatrix& viewM,
joshualitt8059eb92014-12-29 15:10:07 -0800127 const SkIRect& irect) {
reed@google.com44699382013-10-31 17:28:30 +0000128 SkRect rect = SkRect::Make(irect);
joshualitt8059eb92014-12-29 15:10:07 -0800129 this->drawRect(ds, color, viewM, rect, NULL, NULL);
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000130 }
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000131
bsalomon@google.com934c5702012-03-20 21:17:58 +0000132
133 /**
egdaniel8dd688b2015-01-22 10:16:09 -0800134 * Clear the passed in render target. Ignores the GrPipelineBuilder and clip. Clears the whole
135 * thing if rect is NULL, otherwise just the rect. If canIgnoreRect is set then the entire
136 * render target can be optionally cleared.
bsalomon@google.com0b335c12011-04-25 19:17:44 +0000137 */
joshualitt9853cce2014-11-17 14:22:48 -0800138 void clear(const SkIRect* rect,
139 GrColor color,
140 bool canIgnoreRect,
bsalomon63b21962014-11-05 07:05:34 -0800141 GrRenderTarget* renderTarget);
skia.committer@gmail.coma9493a32013-04-04 07:01:12 +0000142
bsalomon@google.come4617bf2013-04-03 14:56:40 +0000143 /**
bsalomon89c62982014-11-03 12:08:42 -0800144 * Discards the contents render target.
commit-bot@chromium.org28361fa2014-03-28 16:08:05 +0000145 **/
bsalomon89c62982014-11-03 12:08:42 -0800146 virtual void discard(GrRenderTarget*) = 0;
commit-bot@chromium.org28361fa2014-03-28 16:08:05 +0000147
148 /**
commit-bot@chromium.org2a05de02014-03-25 15:17:32 +0000149 * Called at start and end of gpu trace marking
150 * GR_CREATE_GPU_TRACE_MARKER(marker_str, target) will automatically call these at the start
151 * and end of a code block respectively
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000152 */
egdaniel3eee3832014-06-18 13:09:11 -0700153 void addGpuTraceMarker(const GrGpuTraceMarker* marker);
154 void removeGpuTraceMarker(const GrGpuTraceMarker* marker);
155
156 /**
157 * Takes the current active set of markers and stores them for later use. Any current marker
158 * in the active set is removed from the active set and the targets remove function is called.
159 * These functions do not work as a stack so you cannot call save a second time before calling
160 * restore. Also, it is assumed that when restore is called the current active set of markers
161 * is empty. When the stored markers are added back into the active set, the targets add marker
162 * is called.
163 */
164 void saveActiveTraceMarkers();
165 void restoreActiveTraceMarkers();
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000166
167 /**
bsalomon@google.come4617bf2013-04-03 14:56:40 +0000168 * Copies a pixel rectangle from one surface to another. This call may finalize
169 * reserved vertex/index data (as though a draw call was made). The src pixels
170 * copied are specified by srcRect. They are copied to a rect of the same
171 * size in dst with top left at dstPoint. If the src rect is clipped by the
172 * src bounds then pixel values in the dst rect corresponding to area clipped
173 * by the src rect are not overwritten. This method can fail and return false
174 * depending on the type of surface, configs, etc, and the backend-specific
175 * limitations. If rect is clipped out entirely by the src or dst bounds then
176 * true is returned since there is no actual copy necessary to succeed.
177 */
bsalomonf90a02b2014-11-26 12:28:00 -0800178 bool copySurface(GrSurface* dst,
179 GrSurface* src,
180 const SkIRect& srcRect,
181 const SkIPoint& dstPoint);
bsalomon@google.com116ad842013-04-09 15:38:19 +0000182 /**
bsalomonf90a02b2014-11-26 12:28:00 -0800183 * Function that determines whether a copySurface call would succeed without actually
bsalomon@google.com116ad842013-04-09 15:38:19 +0000184 * performing the copy.
185 */
bsalomonf90a02b2014-11-26 12:28:00 -0800186 bool canCopySurface(const GrSurface* dst,
187 const GrSurface* src,
188 const SkIRect& srcRect,
189 const SkIPoint& dstPoint);
bsalomon@google.comeb851172013-04-15 13:51:00 +0000190
191 /**
robertphillips@google.comff175842012-05-14 19:31:39 +0000192 * Release any resources that are cached but not currently in use. This
193 * is intended to give an application some recourse when resources are low.
194 */
195 virtual void purgeResources() {};
196
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000197 ///////////////////////////////////////////////////////////////////////////
198 // Draw execution tracking (for font atlases and other resources)
199 class DrawToken {
200 public:
201 DrawToken(GrDrawTarget* drawTarget, uint32_t drawID) :
202 fDrawTarget(drawTarget), fDrawID(drawID) {}
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000203
bsalomon49f085d2014-09-05 13:34:00 -0700204 bool isIssued() { return fDrawTarget && fDrawTarget->isIssued(fDrawID); }
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000205
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000206 private:
207 GrDrawTarget* fDrawTarget;
208 uint32_t fDrawID; // this may wrap, but we're doing direct comparison
209 // so that should be okay
210 };
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000211
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000212 virtual DrawToken getCurrentDrawToken() { return DrawToken(this, 0); }
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000213
joshualitt3322fa42014-11-07 08:48:51 -0800214 /**
215 * Used to communicate draws to GPUs / subclasses
216 */
217 class DrawInfo {
218 public:
joshualitt4d8da812015-01-28 12:53:54 -0800219 DrawInfo() { fDevBounds = NULL; }
joshualitt3322fa42014-11-07 08:48:51 -0800220 DrawInfo(const DrawInfo& di) { (*this) = di; }
221 DrawInfo& operator =(const DrawInfo& di);
222
223 GrPrimitiveType primitiveType() const { return fPrimitiveType; }
224 int startVertex() const { return fStartVertex; }
225 int startIndex() const { return fStartIndex; }
226 int vertexCount() const { return fVertexCount; }
227 int indexCount() const { return fIndexCount; }
228 int verticesPerInstance() const { return fVerticesPerInstance; }
229 int indicesPerInstance() const { return fIndicesPerInstance; }
230 int instanceCount() const { return fInstanceCount; }
231
joshualitt4d8da812015-01-28 12:53:54 -0800232 void setPrimitiveType(GrPrimitiveType type) { fPrimitiveType = type; }
233 void setStartVertex(int startVertex) { fStartVertex = startVertex; }
234 void setStartIndex(int startIndex) { fStartIndex = startIndex; }
235 void setVertexCount(int vertexCount) { fVertexCount = vertexCount; }
236 void setIndexCount(int indexCount) { fIndexCount = indexCount; }
237 void setVerticesPerInstance(int verticesPerI) { fVerticesPerInstance = verticesPerI; }
238 void setIndicesPerInstance(int indicesPerI) { fIndicesPerInstance = indicesPerI; }
239 void setInstanceCount(int instanceCount) { fInstanceCount = instanceCount; }
240
joshualitt3322fa42014-11-07 08:48:51 -0800241 bool isIndexed() const { return fIndexCount > 0; }
242#ifdef SK_DEBUG
243 bool isInstanced() const; // this version is longer because of asserts
244#else
245 bool isInstanced() const { return fInstanceCount > 0; }
246#endif
247
248 // adds or remove instances
249 void adjustInstanceCount(int instanceOffset);
250 // shifts the start vertex
bsalomon72e3ae42015-04-28 08:08:46 -0700251 void adjustStartVertex(int vertexOffset) {
252 fStartVertex += vertexOffset;
253 SkASSERT(fStartVertex >= 0);
254 }
joshualitt3322fa42014-11-07 08:48:51 -0800255 // shifts the start index
bsalomon72e3ae42015-04-28 08:08:46 -0700256 void adjustStartIndex(int indexOffset) {
257 SkASSERT(this->isIndexed());
258 fStartIndex += indexOffset;
259 SkASSERT(fStartIndex >= 0);
260 }
joshualitt3322fa42014-11-07 08:48:51 -0800261 void setDevBounds(const SkRect& bounds) {
262 fDevBoundsStorage = bounds;
263 fDevBounds = &fDevBoundsStorage;
264 }
joshualitt7eb8c7b2014-11-18 14:24:27 -0800265 const GrVertexBuffer* vertexBuffer() const { return fVertexBuffer.get(); }
266 const GrIndexBuffer* indexBuffer() const { return fIndexBuffer.get(); }
267 void setVertexBuffer(const GrVertexBuffer* vb) {
268 fVertexBuffer.reset(vb);
269 }
270 void setIndexBuffer(const GrIndexBuffer* ib) {
271 fIndexBuffer.reset(ib);
272 }
joshualitt3322fa42014-11-07 08:48:51 -0800273 const SkRect* getDevBounds() const { return fDevBounds; }
274
joshualitt3322fa42014-11-07 08:48:51 -0800275 private:
joshualitt3322fa42014-11-07 08:48:51 -0800276 friend class GrDrawTarget;
277
278 GrPrimitiveType fPrimitiveType;
279
280 int fStartVertex;
281 int fStartIndex;
282 int fVertexCount;
283 int fIndexCount;
284
285 int fInstanceCount;
286 int fVerticesPerInstance;
287 int fIndicesPerInstance;
288
289 SkRect fDevBoundsStorage;
290 SkRect* fDevBounds;
291
joshualitt7eb8c7b2014-11-18 14:24:27 -0800292 GrPendingIOResource<const GrVertexBuffer, kRead_GrIOType> fVertexBuffer;
293 GrPendingIOResource<const GrIndexBuffer, kRead_GrIOType> fIndexBuffer;
joshualitt3322fa42014-11-07 08:48:51 -0800294 };
joshualitt2c93efe2014-11-06 12:57:13 -0800295
296 bool programUnitTest(int maxStages);
297
reed@google.comac10a2d2010-12-22 21:39:39 +0000298protected:
robertphillipsdad77942015-03-03 09:28:16 -0800299 friend class GrTargetCommands; // for PipelineInfo
300
bsalomon@google.com6e4e6502013-02-25 20:12:45 +0000301 GrContext* getContext() { return fContext; }
302 const GrContext* getContext() const { return fContext; }
303
bsalomon@google.combcce8922013-03-25 15:38:39 +0000304 // Subclass must initialize this in its constructor.
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000305 SkAutoTUnref<const GrDrawTargetCaps> fCaps;
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000306
commit-bot@chromium.org2a05de02014-03-25 15:17:32 +0000307 const GrTraceMarkerSet& getActiveTraceMarkers() { return fActiveTraceMarkers; }
308
joshualitt65171342014-10-09 07:25:36 -0700309 // Makes a copy of the dst if it is necessary for the draw. Returns false if a copy is required
310 // but couldn't be made. Otherwise, returns true. This method needs to be protected because it
311 // needs to be accessed by GLPrograms to setup a correct drawstate
bsalomon50785a32015-02-06 07:02:37 -0800312 bool setupDstReadIfNecessary(const GrPipelineBuilder&,
egdaniele36914c2015-02-13 09:00:33 -0800313 const GrProcOptInfo& colorPOI,
314 const GrProcOptInfo& coveragePOI,
joshualitt9853cce2014-11-17 14:22:48 -0800315 GrDeviceCoordTexture* dstCopy,
316 const SkRect* drawBounds);
joshualitt65171342014-10-09 07:25:36 -0700317
egdaniele36914c2015-02-13 09:00:33 -0800318 struct PipelineInfo {
319 PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor,
joshualitt44701df2015-02-23 14:44:57 -0800320 const GrPrimitiveProcessor* primProc,
321 const SkRect* devBounds, GrDrawTarget* target);
egdaniele36914c2015-02-13 09:00:33 -0800322
323 PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor,
joshualitt44701df2015-02-23 14:44:57 -0800324 const GrBatch* batch, const SkRect* devBounds,
325 GrDrawTarget* target);
egdaniele36914c2015-02-13 09:00:33 -0800326
327 bool willBlendWithDst(const GrPrimitiveProcessor* primProc) const {
328 return fPipelineBuilder->willBlendWithDst(primProc);
329 }
330 private:
331 friend class GrDrawTarget;
332
333 bool mustSkipDraw() const { return (NULL == fPipelineBuilder); }
334
335 GrPipelineBuilder* fPipelineBuilder;
336 GrScissorState* fScissor;
337 GrProcOptInfo fColorPOI;
338 GrProcOptInfo fCoveragePOI;
339 GrDeviceCoordTexture fDstCopy;
340 };
341
342 void setupPipeline(const PipelineInfo& pipelineInfo, GrPipeline* pipeline);
343
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000344private:
bsalomonf90a02b2014-11-26 12:28:00 -0800345 /**
346 * This will be called before allocating a texture as a dst for copySurface. This function
347 * populates the dstDesc's config, flags, and origin so as to maximize efficiency and guarantee
348 * success of the copySurface call.
349 */
350 void initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* dstDesc) {
351 if (!this->onInitCopySurfaceDstDesc(src, dstDesc)) {
352 dstDesc->fOrigin = kDefault_GrSurfaceOrigin;
bsalomon6bc1b5f2015-02-23 09:06:38 -0800353 dstDesc->fFlags = kRenderTarget_GrSurfaceFlag;
bsalomonf90a02b2014-11-26 12:28:00 -0800354 dstDesc->fConfig = src->config();
355 }
356 }
357
358 /** Internal implementation of canCopySurface. */
359 bool internalCanCopySurface(const GrSurface* dst,
360 const GrSurface* src,
361 const SkIRect& clippedSrcRect,
362 const SkIPoint& clippedDstRect);
363
egdaniele36914c2015-02-13 09:00:33 -0800364 virtual void onDrawBatch(GrBatch*, const PipelineInfo&) = 0;
joshualitt5478d422014-11-14 16:00:38 -0800365 // TODO copy in order drawbuffer onDrawRect to here
egdaniel8dd688b2015-01-22 10:16:09 -0800366 virtual void onDrawRect(GrPipelineBuilder*,
joshualitt2e3b3e32014-12-09 13:31:14 -0800367 GrColor color,
joshualitt8059eb92014-12-29 15:10:07 -0800368 const SkMatrix& viewMatrix,
joshualitt9853cce2014-11-17 14:22:48 -0800369 const SkRect& rect,
commit-bot@chromium.orgfd03d4a2013-07-17 21:39:42 +0000370 const SkRect* localRect,
joshualitt5478d422014-11-14 16:00:38 -0800371 const SkMatrix* localMatrix) = 0;
commit-bot@chromium.org32184d82013-10-09 15:14:18 +0000372
egdaniel8dd688b2015-01-22 10:16:09 -0800373 virtual void onStencilPath(const GrPipelineBuilder&,
joshualitt56995b52014-12-11 15:44:02 -0800374 const GrPathProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800375 const GrPath*,
bsalomon3e791242014-12-17 13:43:13 -0800376 const GrScissorState&,
joshualitt2c93efe2014-11-06 12:57:13 -0800377 const GrStencilSettings&) = 0;
egdaniele36914c2015-02-13 09:00:33 -0800378 virtual void onDrawPath(const GrPathProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800379 const GrPath*,
joshualitt2c93efe2014-11-06 12:57:13 -0800380 const GrStencilSettings&,
egdaniele36914c2015-02-13 09:00:33 -0800381 const PipelineInfo&) = 0;
382 virtual void onDrawPaths(const GrPathProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800383 const GrPathRange*,
cdalton55b24af2014-11-25 11:00:56 -0800384 const void* indices,
385 PathIndexType,
386 const float transformValues[],
joshualitt2c93efe2014-11-06 12:57:13 -0800387 PathTransformType,
cdalton55b24af2014-11-25 11:00:56 -0800388 int count,
joshualitt2c93efe2014-11-06 12:57:13 -0800389 const GrStencilSettings&,
egdaniele36914c2015-02-13 09:00:33 -0800390 const PipelineInfo&) = 0;
bsalomon@google.com64aef2b2012-06-11 15:36:13 +0000391
bsalomon63b21962014-11-05 07:05:34 -0800392 virtual void onClear(const SkIRect* rect, GrColor color, bool canIgnoreRect,
393 GrRenderTarget* renderTarget) = 0;
394
bsalomonf90a02b2014-11-26 12:28:00 -0800395 /** The subclass will get a chance to copy the surface for falling back to the default
396 implementation, which simply draws a rectangle (and fails if dst isn't a render target). It
397 should assume that any clipping has already been performed on the rect and point. It won't
398 be called if the copy can be skipped. */
399 virtual bool onCopySurface(GrSurface* dst,
400 GrSurface* src,
401 const SkIRect& srcRect,
402 const SkIPoint& dstPoint) = 0;
403
404 /** Indicates whether onCopySurface would succeed. It should assume that any clipping has
405 already been performed on the rect and point. It won't be called if the copy can be
406 skipped. */
407 virtual bool onCanCopySurface(const GrSurface* dst,
408 const GrSurface* src,
409 const SkIRect& srcRect,
410 const SkIPoint& dstPoint) = 0;
411 /**
412 * This will be called before allocating a texture to be a dst for onCopySurface. Only the
413 * dstDesc's config, flags, and origin need be set by the function. If the subclass cannot
414 * create a surface that would succeed its implementation of onCopySurface, it should return
415 * false. The base class will fall back to creating a render target to draw into using the src.
416 */
417 virtual bool onInitCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* dstDesc) = 0;
bsalomon63b21962014-11-05 07:05:34 -0800418
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000419 // Check to see if this set of draw commands has been sent out
420 virtual bool isIssued(uint32_t drawID) { return true; }
joshualitt9853cce2014-11-17 14:22:48 -0800421 void getPathStencilSettingsForFilltype(GrPathRendering::FillType,
egdaniel8dc7c3a2015-04-16 11:22:42 -0700422 const GrStencilAttachment*,
joshualitt9853cce2014-11-17 14:22:48 -0800423 GrStencilSettings*);
joshualitta7024152014-11-03 14:16:35 -0800424 virtual GrClipMaskManager* clipMaskManager() = 0;
egdaniel8dd688b2015-01-22 10:16:09 -0800425 virtual bool setupClip(GrPipelineBuilder*,
bsalomon6be6f7c2015-02-26 13:05:21 -0800426 GrPipelineBuilder::AutoRestoreFragmentProcessors*,
427 GrPipelineBuilder::AutoRestoreStencil*,
428 GrScissorState*,
joshualitt8059eb92014-12-29 15:10:07 -0800429 const SkRect* devBounds) = 0;
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000430
bsalomon@google.com6e4e6502013-02-25 20:12:45 +0000431 // The context owns us, not vice-versa, so this ptr is not ref'ed by DrawTarget.
432 GrContext* fContext;
commit-bot@chromium.org2a05de02014-03-25 15:17:32 +0000433 // To keep track that we always have at least as many debug marker adds as removes
434 int fGpuTraceMarkerCount;
435 GrTraceMarkerSet fActiveTraceMarkers;
egdaniel3eee3832014-06-18 13:09:11 -0700436 GrTraceMarkerSet fStoredTraceMarkers;
reed@google.comfa35e3d2012-06-26 20:16:17 +0000437
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +0000438 typedef SkRefCnt INHERITED;
reed@google.comac10a2d2010-12-22 21:39:39 +0000439};
440
joshualitt329bf482014-10-29 12:31:28 -0700441/*
442 * This class is JUST for clip mask manager. Everyone else should just use draw target above.
443 */
joshualitt6db519c2014-10-29 08:48:18 -0700444class GrClipTarget : public GrDrawTarget {
445public:
joshualitt329bf482014-10-29 12:31:28 -0700446 GrClipTarget(GrContext* context) : INHERITED(context) {
447 fClipMaskManager.setClipTarget(this);
448 }
449
450 /* Clip mask manager needs access to the context.
451 * TODO we only need a very small subset of context in the CMM.
452 */
453 GrContext* getContext() { return INHERITED::getContext(); }
454 const GrContext* getContext() const { return INHERITED::getContext(); }
455
joshualitt6db519c2014-10-29 08:48:18 -0700456 /**
457 * Clip Mask Manager(and no one else) needs to clear private stencil bits.
458 * ClipTarget subclass sets clip bit in the stencil buffer. The subclass
459 * is free to clear the remaining bits to zero if masked clears are more
460 * expensive than clearing all bits.
461 */
462 virtual void clearStencilClip(const SkIRect& rect, bool insideClip, GrRenderTarget* = NULL) = 0;
463
joshualitt3bdd7dc2014-10-31 08:27:39 -0700464 /**
465 * Release any resources that are cached but not currently in use. This
466 * is intended to give an application some recourse when resources are low.
467 */
mtklein36352bf2015-03-25 18:17:31 -0700468 void purgeResources() override {
joshualitt3bdd7dc2014-10-31 08:27:39 -0700469 // The clip mask manager can rebuild all its clip masks so just
470 // get rid of them all.
471 fClipMaskManager.purgeResources();
472 };
473
joshualitt329bf482014-10-29 12:31:28 -0700474protected:
475 GrClipMaskManager fClipMaskManager;
476
joshualitt6db519c2014-10-29 08:48:18 -0700477private:
mtklein36352bf2015-03-25 18:17:31 -0700478 GrClipMaskManager* clipMaskManager() override { return &fClipMaskManager; }
joshualitt329bf482014-10-29 12:31:28 -0700479
egdaniel8dd688b2015-01-22 10:16:09 -0800480 virtual bool setupClip(GrPipelineBuilder*,
bsalomon6be6f7c2015-02-26 13:05:21 -0800481 GrPipelineBuilder::AutoRestoreFragmentProcessors*,
482 GrPipelineBuilder::AutoRestoreStencil*,
joshualitt8059eb92014-12-29 15:10:07 -0800483 GrScissorState* scissorState,
mtklein36352bf2015-03-25 18:17:31 -0700484 const SkRect* devBounds) override;
joshualitt2c93efe2014-11-06 12:57:13 -0800485
joshualitt6db519c2014-10-29 08:48:18 -0700486 typedef GrDrawTarget INHERITED;
487};
488
reed@google.comac10a2d2010-12-22 21:39:39 +0000489#endif