blob: 2da63d80ad4ec8b8bc9f3ad6cbace90b5f474f67 [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
bsalomon@google.com8d67c072012-12-13 20:38:14 +000011#include "GrClipData.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;
robertphillips@google.coma2d71482012-08-01 20:08:47 +000032class GrClipData;
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);
bsalomon@google.com25fb21f2011-06-21 18:17:25 +000050 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
57 /**
reed@google.comac10a2d2010-12-22 21:39:39 +000058 * Sets the current clip to the region specified by clip. All draws will be
59 * clipped against this clip if kClip_StateBit is enabled.
60 *
bsalomon@google.com5aaa69e2011-03-04 20:29:08 +000061 * Setting the clip may (or may not) zero out the client's stencil bits.
62 *
reed@google.comac10a2d2010-12-22 21:39:39 +000063 * @param description of the clipping region
64 */
robertphillips@google.combeb1af72012-07-26 18:52:16 +000065 void setClip(const GrClipData* clip);
reed@google.comac10a2d2010-12-22 21:39:39 +000066
67 /**
68 * Gets the current clip.
69 *
70 * @return the clip.
71 */
robertphillips@google.combeb1af72012-07-26 18:52:16 +000072 const GrClipData* getClip() const;
reed@google.comac10a2d2010-12-22 21:39:39 +000073
bsalomon@google.coma5d056a2012-03-27 15:59:58 +000074 /**
bsalomonf90a02b2014-11-26 12:28:00 -080075 * There are two types of "sources" of geometry (vertices and indices) for
bsalomon@google.come3d70952012-03-13 12:40:53 +000076 * draw calls made on the target. When performing an indexed draw, the
77 * indices and vertices can use different source types. Once a source is
bsalomon@google.com934c5702012-03-20 21:17:58 +000078 * specified it can be used for multiple draws. However, the time at which
79 * the geometry data is no longer editable depends on the source type.
bsalomon@google.com25fb21f2011-06-21 18:17:25 +000080 *
81 * Sometimes it is necessary to perform a draw while upstack code has
bsalomon@google.come3d70952012-03-13 12:40:53 +000082 * already specified geometry that it isn't finished with. So there are push
83 * and pop methods. This allows the client to push the sources, draw
84 * something using alternate sources, and then pop to restore the original
85 * sources.
bsalomon@google.com1c13c962011-02-14 16:51:21 +000086 *
bsalomon@google.come3d70952012-03-13 12:40:53 +000087 * Aside from pushes and pops, a source remains valid until another source
88 * is set or resetVertexSource / resetIndexSource is called. Drawing from
89 * a reset source is an error.
90 *
bsalomonf90a02b2014-11-26 12:28:00 -080091 * The two types of sources are:
bsalomon@google.come3d70952012-03-13 12:40:53 +000092 *
bsalomonf90a02b2014-11-26 12:28:00 -080093 * 1. Reserve. This is most useful when the caller has data it must
bsalomon@google.com25fb21f2011-06-21 18:17:25 +000094 * transform before drawing and is not long-lived. The caller requests
95 * that the draw target make room for some amount of vertex and/or index
96 * data. The target provides ptrs to hold the vertex and/or index data.
97 *
rmistry@google.comd6176b02012-08-23 18:14:13 +000098 * The data is writable up until the next drawIndexed, drawNonIndexed,
bsalomon@google.come4617bf2013-04-03 14:56:40 +000099 * drawIndexedInstances, drawRect, copySurface, or pushGeometrySource. At
100 * this point the data is frozen and the ptrs are no longer valid.
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000101 *
bsalomon@google.come3d70952012-03-13 12:40:53 +0000102 * Where the space is allocated and how it is uploaded to the GPU is
103 * subclass-dependent.
104 *
bsalomonf90a02b2014-11-26 12:28:00 -0800105 * 2. Vertex and Index Buffers. This is most useful for geometry that will
bsalomon@google.come3d70952012-03-13 12:40:53 +0000106 * is long-lived. When the data in the buffer is consumed depends on the
rmistry@google.comd6176b02012-08-23 18:14:13 +0000107 * GrDrawTarget subclass. For deferred subclasses the caller has to
bsalomon@google.come3d70952012-03-13 12:40:53 +0000108 * guarantee that the data is still available in the buffers at playback.
109 * (TODO: Make this more automatic as we have done for read/write pixels)
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000110 */
111
112 /**
bsalomon@google.come3d70952012-03-13 12:40:53 +0000113 * Reserves space for vertices and/or indices. Zero can be specifed as
114 * either the vertex or index count if the caller desires to only reserve
rmistry@google.comd6176b02012-08-23 18:14:13 +0000115 * space for only indices or only vertices. If zero is specifed for
bsalomon@google.come3d70952012-03-13 12:40:53 +0000116 * vertexCount then the vertex source will be unmodified and likewise for
117 * indexCount.
reed@google.comac10a2d2010-12-22 21:39:39 +0000118 *
bsalomon@google.come3d70952012-03-13 12:40:53 +0000119 * If the function returns true then the reserve suceeded and the vertices
120 * and indices pointers will point to the space created.
reed@google.comac10a2d2010-12-22 21:39:39 +0000121 *
bsalomon@google.come3d70952012-03-13 12:40:53 +0000122 * If the target cannot make space for the request then this function will
123 * return false. If vertexCount was non-zero then upon failure the vertex
124 * source is reset and likewise for indexCount.
reed@google.comac10a2d2010-12-22 21:39:39 +0000125 *
bsalomon@google.come3d70952012-03-13 12:40:53 +0000126 * The pointers to the space allocated for vertices and indices remain valid
bsalomon@google.come4617bf2013-04-03 14:56:40 +0000127 * until a drawIndexed, drawNonIndexed, drawIndexedInstances, drawRect,
128 * copySurface, or push/popGeomtrySource is called. At that point logically a
129 * snapshot of the data is made and the pointers are invalid.
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000130 *
bsalomon@google.come3d70952012-03-13 12:40:53 +0000131 * @param vertexCount the number of vertices to reserve space for. Can be
egdaniel8dd688b2015-01-22 10:16:09 -0800132 * 0. Vertex size is queried from the current GrPipelineBuilder.
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000133 * @param indexCount the number of indices to reserve space for. Can be 0.
bsalomon@google.come3d70952012-03-13 12:40:53 +0000134 * @param vertices will point to reserved vertex space if vertexCount is
rmistry@google.comd6176b02012-08-23 18:14:13 +0000135 * non-zero. Illegal to pass NULL if vertexCount > 0.
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000136 * @param indices will point to reserved index space if indexCount is
137 * non-zero. Illegal to pass NULL if indexCount > 0.
138 */
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000139 bool reserveVertexAndIndexSpace(int vertexCount,
joshualitt9853cce2014-11-17 14:22:48 -0800140 size_t vertexStride,
bsalomon@google.com97805382012-03-13 14:32:07 +0000141 int indexCount,
142 void** vertices,
143 void** indices);
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000144
reed@google.comac10a2d2010-12-22 21:39:39 +0000145 /**
146 * Provides hints to caller about the number of vertices and indices
147 * that can be allocated cheaply. This can be useful if caller is reserving
148 * space but doesn't know exactly how much geometry is needed.
149 *
150 * Also may hint whether the draw target should be flushed first. This is
151 * useful for deferred targets.
152 *
reed@google.comac10a2d2010-12-22 21:39:39 +0000153 * @param vertexCount in: hint about how many vertices the caller would
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000154 * like to allocate. Vertex size is queried from the
egdaniel8dd688b2015-01-22 10:16:09 -0800155 * current GrPipelineBuilder.
reed@google.comac10a2d2010-12-22 21:39:39 +0000156 * out: a hint about the number of vertices that can be
157 * allocated cheaply. Negative means no hint.
158 * Ignored if NULL.
159 * @param indexCount in: hint about how many indices the caller would
160 * like to allocate.
161 * out: a hint about the number of indices that can be
162 * allocated cheaply. Negative means no hint.
163 * Ignored if NULL.
164 *
165 * @return true if target should be flushed based on the input values.
166 */
joshualitt9853cce2014-11-17 14:22:48 -0800167 virtual bool geometryHints(size_t vertexStride, int* vertexCount, int* indexCount) const;
reed@google.comac10a2d2010-12-22 21:39:39 +0000168
169 /**
reed@google.comac10a2d2010-12-22 21:39:39 +0000170 * Sets source of vertex data for the next draw. Data does not have to be
bsalomon@google.com934c5702012-03-20 21:17:58 +0000171 * in the buffer until drawIndexed, drawNonIndexed, or drawIndexedInstances.
reed@google.comac10a2d2010-12-22 21:39:39 +0000172 *
173 * @param buffer vertex buffer containing vertex data. Must be
skia.committer@gmail.comae683922013-02-06 07:01:54 +0000174 * unlocked before draw call. Vertex size is queried
egdaniel8dd688b2015-01-22 10:16:09 -0800175 * from current GrPipelineBuilder.
reed@google.comac10a2d2010-12-22 21:39:39 +0000176 */
joshualitt9853cce2014-11-17 14:22:48 -0800177 void setVertexSourceToBuffer(const GrVertexBuffer* buffer, size_t vertexStride);
reed@google.comac10a2d2010-12-22 21:39:39 +0000178
179 /**
180 * Sets source of index data for the next indexed draw. Data does not have
bsalomon@google.com934c5702012-03-20 21:17:58 +0000181 * to be in the buffer until drawIndexed.
reed@google.comac10a2d2010-12-22 21:39:39 +0000182 *
183 * @param buffer index buffer containing indices. Must be unlocked
184 * before indexed draw call.
185 */
186 void setIndexSourceToBuffer(const GrIndexBuffer* buffer);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000187
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000188 /**
189 * Resets vertex source. Drawing from reset vertices is illegal. Set vertex
190 * source to reserved, array, or buffer before next draw. May be able to free
191 * up temporary storage allocated by setVertexSourceToArray or
192 * reserveVertexSpace.
193 */
194 void resetVertexSource();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000195
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000196 /**
197 * Resets index source. Indexed Drawing from reset indices is illegal. Set
198 * index source to reserved, array, or buffer before next indexed draw. May
199 * be able to free up temporary storage allocated by setIndexSourceToArray
200 * or reserveIndexSpace.
201 */
bsalomon@google.com97805382012-03-13 14:32:07 +0000202 void resetIndexSource();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000203
bsalomon@google.com97805382012-03-13 14:32:07 +0000204 /**
205 * Query to find out if the vertex or index source is reserved.
206 */
207 bool hasReservedVerticesOrIndices() const {
bsalomon@google.com73d98aa2012-03-13 14:41:19 +0000208 return kReserved_GeometrySrcType == this->getGeomSrc().fVertexSrc ||
bsalomon@google.com97805382012-03-13 14:32:07 +0000209 kReserved_GeometrySrcType == this->getGeomSrc().fIndexSrc;
210 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000211
212 /**
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000213 * Pushes and resets the vertex/index sources. Any reserved vertex / index
214 * data is finalized (i.e. cannot be updated after the matching pop but can
215 * be drawn from). Must be balanced by a pop.
216 */
217 void pushGeometrySource();
218
219 /**
220 * Pops the vertex / index sources from the matching push.
221 */
222 void popGeometrySource();
bsalomon@google.com64aef2b2012-06-11 15:36:13 +0000223
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000224 /**
reed@google.comac10a2d2010-12-22 21:39:39 +0000225 * Draws indexed geometry using the current state and current vertex / index
226 * sources.
227 *
228 * @param type The type of primitives to draw.
229 * @param startVertex the vertex in the vertex array/buffer corresponding
230 * to index 0
231 * @param startIndex first index to read from index src.
232 * @param vertexCount one greater than the max index.
233 * @param indexCount the number of index elements to read. The index count
234 * is effectively trimmed to the last completely
235 * specified primitive.
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000236 * @param devBounds optional bounds hint. This is a promise from the caller,
237 * not a request for clipping.
reed@google.comac10a2d2010-12-22 21:39:39 +0000238 */
egdaniel8dd688b2015-01-22 10:16:09 -0800239 void drawIndexed(GrPipelineBuilder*,
joshualitt56995b52014-12-11 15:44:02 -0800240 const GrGeometryProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800241 GrPrimitiveType type,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000242 int startVertex,
243 int startIndex,
244 int vertexCount,
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000245 int indexCount,
246 const SkRect* devBounds = NULL);
reed@google.comac10a2d2010-12-22 21:39:39 +0000247
248 /**
249 * Draws non-indexed geometry using the current state and current vertex
250 * sources.
251 *
252 * @param type The type of primitives to draw.
253 * @param startVertex the vertex in the vertex array/buffer corresponding
254 * to index 0
255 * @param vertexCount one greater than the max index.
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000256 * @param devBounds optional bounds hint. This is a promise from the caller,
257 * not a request for clipping.
reed@google.comac10a2d2010-12-22 21:39:39 +0000258 */
egdaniel8dd688b2015-01-22 10:16:09 -0800259 void drawNonIndexed(GrPipelineBuilder*,
joshualitt56995b52014-12-11 15:44:02 -0800260 const GrGeometryProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800261 GrPrimitiveType type,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000262 int startVertex,
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000263 int vertexCount,
264 const SkRect* devBounds = NULL);
reed@google.comac10a2d2010-12-22 21:39:39 +0000265
joshualitt4d8da812015-01-28 12:53:54 -0800266 // TODO devbounds should live on the batch
267 void drawBatch(GrPipelineBuilder*,
268 GrBatch*,
269 const SkRect* devBounds = NULL);
270
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000271 /**
bsalomon@google.com64aef2b2012-06-11 15:36:13 +0000272 * Draws path into the stencil buffer. The fill must be either even/odd or
273 * winding (not inverse or hairline). It will respect the HW antialias flag
egdaniel8dd688b2015-01-22 10:16:09 -0800274 * on the GrPipelineBuilder (if possible in the 3D API). Note, we will never have an inverse
275 * fill with stencil path
bsalomon@google.com64aef2b2012-06-11 15:36:13 +0000276 */
egdaniel8dd688b2015-01-22 10:16:09 -0800277 void stencilPath(GrPipelineBuilder*, const GrPathProcessor*, const GrPath*,
278 GrPathRendering::FillType);
bsalomon@google.com64aef2b2012-06-11 15:36:13 +0000279
280 /**
commit-bot@chromium.org32184d82013-10-09 15:14:18 +0000281 * Draws a path. Fill must not be a hairline. It will respect the HW
egdaniel8dd688b2015-01-22 10:16:09 -0800282 * antialias flag on the GrPipelineBuilder (if possible in the 3D API).
commit-bot@chromium.orgc4dc0ad2013-10-09 14:11:33 +0000283 */
egdaniel8dd688b2015-01-22 10:16:09 -0800284 void drawPath(GrPipelineBuilder*, const GrPathProcessor*, const GrPath*,
285 GrPathRendering::FillType);
commit-bot@chromium.orgc4dc0ad2013-10-09 14:11:33 +0000286
287 /**
cdalton55b24af2014-11-25 11:00:56 -0800288 * Draws the aggregate path from combining multiple. Note that this will not
289 * always be equivalent to back-to-back calls to drawPath(). It will respect
egdaniel8dd688b2015-01-22 10:16:09 -0800290 * the HW antialias flag on the GrPipelineBuilder (if possible in the 3D API).
commit-bot@chromium.org9b62aa12014-03-25 11:59:40 +0000291 *
cdalton55b24af2014-11-25 11:00:56 -0800292 * @param pathRange Source paths to draw from
293 * @param indices Array of path indices to draw
294 * @param indexType Data type of the array elements in indexBuffer
295 * @param transformValues Array of transforms for the individual paths
296 * @param transformType Type of transforms in transformBuffer
297 * @param count Number of paths to draw
cdaltonb85a0aa2014-07-21 15:32:44 -0700298 * @param fill Fill type for drawing all the paths
commit-bot@chromium.org9b62aa12014-03-25 11:59:40 +0000299 */
egdaniel8dd688b2015-01-22 10:16:09 -0800300 void drawPaths(GrPipelineBuilder*,
joshualitt56995b52014-12-11 15:44:02 -0800301 const GrPathProcessor*,
joshualitt2e3b3e32014-12-09 13:31:14 -0800302 const GrPathRange* pathRange,
cdalton55b24af2014-11-25 11:00:56 -0800303 const void* indices,
304 PathIndexType indexType,
305 const float transformValues[],
306 PathTransformType transformType,
joshualitt9853cce2014-11-17 14:22:48 -0800307 int count,
joshualitt92e496f2014-10-31 13:56:50 -0700308 GrPathRendering::FillType fill);
cdaltonb85a0aa2014-07-21 15:32:44 -0700309
commit-bot@chromium.org9b62aa12014-03-25 11:59:40 +0000310 /**
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000311 * Helper function for drawing rects. It performs a geometry src push and pop
312 * and thus will finalize any reserved geometry.
skia.committer@gmail.com044679e2013-02-15 07:16:57 +0000313 *
bsalomon@google.comc7818882013-03-20 19:19:53 +0000314 * @param rect the rect to draw
bsalomon@google.comc7818882013-03-20 19:19:53 +0000315 * @param localRect optional rect that specifies local coords to map onto
316 * rect. If NULL then rect serves as the local coords.
joshualitt8fc6c2d2014-12-22 15:27:05 -0800317 * @param localMatrix Optional local matrix. The local coordinates are specified by localRect,
318 * or if it is NULL by rect. This matrix applies to the coordinate implied by
319 * that rectangle before it is input to GrCoordTransforms that read local
320 * coordinates
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000321 */
joshualitt4d8da812015-01-28 12:53:54 -0800322 void drawRect(GrPipelineBuilder* pipelineBuilder,
joshualitt2e3b3e32014-12-09 13:31:14 -0800323 GrColor color,
joshualitt8059eb92014-12-29 15:10:07 -0800324 const SkMatrix& viewMatrix,
joshualitt9853cce2014-11-17 14:22:48 -0800325 const SkRect& rect,
commit-bot@chromium.orgfd03d4a2013-07-17 21:39:42 +0000326 const SkRect* localRect,
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000327 const SkMatrix* localMatrix) {
328 AutoGeometryPush agp(this);
joshualitt4d8da812015-01-28 12:53:54 -0800329 this->onDrawRect(pipelineBuilder, color, viewMatrix, rect, localRect, localMatrix);
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000330 }
jvanverth@google.com39768252013-02-14 15:25:44 +0000331
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000332 /**
bsalomon@google.comc7818882013-03-20 19:19:53 +0000333 * Helper for drawRect when the caller doesn't need separate local rects or matrices.
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000334 */
egdaniel8dd688b2015-01-22 10:16:09 -0800335 void drawSimpleRect(GrPipelineBuilder* ds, GrColor color, const SkMatrix& viewM,
336 const SkRect& rect) {
joshualitt8059eb92014-12-29 15:10:07 -0800337 this->drawRect(ds, color, viewM, rect, NULL, NULL);
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000338 }
egdaniel8dd688b2015-01-22 10:16:09 -0800339 void drawSimpleRect(GrPipelineBuilder* ds, GrColor color, const SkMatrix& viewM,
joshualitt8059eb92014-12-29 15:10:07 -0800340 const SkIRect& irect) {
reed@google.com44699382013-10-31 17:28:30 +0000341 SkRect rect = SkRect::Make(irect);
joshualitt8059eb92014-12-29 15:10:07 -0800342 this->drawRect(ds, color, viewM, rect, NULL, NULL);
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000343 }
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000344
345 /**
bsalomon@google.com934c5702012-03-20 21:17:58 +0000346 * This call is used to draw multiple instances of some geometry with a
347 * given number of vertices (V) and indices (I) per-instance. The indices in
348 * the index source must have the form i[k+I] == i[k] + V. Also, all indices
349 * i[kI] ... i[(k+1)I-1] must be elements of the range kV ... (k+1)V-1. As a
350 * concrete example, the following index buffer for drawing a series of
351 * quads each as two triangles each satisfies these conditions with V=4 and
352 * I=6:
353 * (0,1,2,0,2,3, 4,5,6,4,6,7, 8,9,10,8,10,11, ...)
354 *
355 * The call assumes that the pattern of indices fills the entire index
356 * source. The size of the index buffer limits the number of instances that
357 * can be drawn by the GPU in a single draw. However, the caller may specify
358 * any (positive) number for instanceCount and if necessary multiple GPU
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000359 * draws will be issued. Moreover, when drawIndexedInstances is called
bsalomon@google.com934c5702012-03-20 21:17:58 +0000360 * multiple times it may be possible for GrDrawTarget to group them into a
361 * single GPU draw.
362 *
363 * @param type the type of primitives to draw
364 * @param instanceCount the number of instances to draw. Each instance
365 * consists of verticesPerInstance vertices indexed by
366 * indicesPerInstance indices drawn as the primitive
367 * type specified by type.
368 * @param verticesPerInstance The number of vertices in each instance (V
369 * in the above description).
370 * @param indicesPerInstance The number of indices in each instance (I
371 * in the above description).
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000372 * @param devBounds optional bounds hint. This is a promise from the caller,
373 * not a request for clipping.
bsalomon@google.com934c5702012-03-20 21:17:58 +0000374 */
egdaniel8dd688b2015-01-22 10:16:09 -0800375 void drawIndexedInstances(GrPipelineBuilder*,
joshualitt56995b52014-12-11 15:44:02 -0800376 const GrGeometryProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800377 GrPrimitiveType type,
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000378 int instanceCount,
379 int verticesPerInstance,
380 int indicesPerInstance,
381 const SkRect* devBounds = NULL);
bsalomon@google.com934c5702012-03-20 21:17:58 +0000382
383 /**
egdaniel8dd688b2015-01-22 10:16:09 -0800384 * Clear the passed in render target. Ignores the GrPipelineBuilder and clip. Clears the whole
385 * thing if rect is NULL, otherwise just the rect. If canIgnoreRect is set then the entire
386 * render target can be optionally cleared.
bsalomon@google.com0b335c12011-04-25 19:17:44 +0000387 */
joshualitt9853cce2014-11-17 14:22:48 -0800388 void clear(const SkIRect* rect,
389 GrColor color,
390 bool canIgnoreRect,
bsalomon63b21962014-11-05 07:05:34 -0800391 GrRenderTarget* renderTarget);
skia.committer@gmail.coma9493a32013-04-04 07:01:12 +0000392
bsalomon@google.come4617bf2013-04-03 14:56:40 +0000393 /**
bsalomon89c62982014-11-03 12:08:42 -0800394 * Discards the contents render target.
commit-bot@chromium.org28361fa2014-03-28 16:08:05 +0000395 **/
bsalomon89c62982014-11-03 12:08:42 -0800396 virtual void discard(GrRenderTarget*) = 0;
commit-bot@chromium.org28361fa2014-03-28 16:08:05 +0000397
398 /**
commit-bot@chromium.org2a05de02014-03-25 15:17:32 +0000399 * Called at start and end of gpu trace marking
400 * GR_CREATE_GPU_TRACE_MARKER(marker_str, target) will automatically call these at the start
401 * and end of a code block respectively
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000402 */
egdaniel3eee3832014-06-18 13:09:11 -0700403 void addGpuTraceMarker(const GrGpuTraceMarker* marker);
404 void removeGpuTraceMarker(const GrGpuTraceMarker* marker);
405
406 /**
407 * Takes the current active set of markers and stores them for later use. Any current marker
408 * in the active set is removed from the active set and the targets remove function is called.
409 * These functions do not work as a stack so you cannot call save a second time before calling
410 * restore. Also, it is assumed that when restore is called the current active set of markers
411 * is empty. When the stored markers are added back into the active set, the targets add marker
412 * is called.
413 */
414 void saveActiveTraceMarkers();
415 void restoreActiveTraceMarkers();
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000416
417 /**
bsalomon@google.come4617bf2013-04-03 14:56:40 +0000418 * Copies a pixel rectangle from one surface to another. This call may finalize
419 * reserved vertex/index data (as though a draw call was made). The src pixels
420 * copied are specified by srcRect. They are copied to a rect of the same
421 * size in dst with top left at dstPoint. If the src rect is clipped by the
422 * src bounds then pixel values in the dst rect corresponding to area clipped
423 * by the src rect are not overwritten. This method can fail and return false
424 * depending on the type of surface, configs, etc, and the backend-specific
425 * limitations. If rect is clipped out entirely by the src or dst bounds then
426 * true is returned since there is no actual copy necessary to succeed.
427 */
bsalomonf90a02b2014-11-26 12:28:00 -0800428 bool copySurface(GrSurface* dst,
429 GrSurface* src,
430 const SkIRect& srcRect,
431 const SkIPoint& dstPoint);
bsalomon@google.com116ad842013-04-09 15:38:19 +0000432 /**
bsalomonf90a02b2014-11-26 12:28:00 -0800433 * Function that determines whether a copySurface call would succeed without actually
bsalomon@google.com116ad842013-04-09 15:38:19 +0000434 * performing the copy.
435 */
bsalomonf90a02b2014-11-26 12:28:00 -0800436 bool canCopySurface(const GrSurface* dst,
437 const GrSurface* src,
438 const SkIRect& srcRect,
439 const SkIPoint& dstPoint);
bsalomon@google.comeb851172013-04-15 13:51:00 +0000440
441 /**
robertphillips@google.comff175842012-05-14 19:31:39 +0000442 * Release any resources that are cached but not currently in use. This
443 * is intended to give an application some recourse when resources are low.
444 */
445 virtual void purgeResources() {};
446
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000447 ////////////////////////////////////////////////////////////////////////////
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000448
commit-bot@chromium.orga0b40282013-09-18 13:00:55 +0000449 class AutoReleaseGeometry : public ::SkNoncopyable {
reed@google.comac10a2d2010-12-22 21:39:39 +0000450 public:
451 AutoReleaseGeometry(GrDrawTarget* target,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000452 int vertexCount,
joshualitt9853cce2014-11-17 14:22:48 -0800453 size_t vertexStride,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000454 int indexCount);
455 AutoReleaseGeometry();
456 ~AutoReleaseGeometry();
bsalomon@google.com5782d712011-01-21 21:03:59 +0000457 bool set(GrDrawTarget* target,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000458 int vertexCount,
joshualitt9853cce2014-11-17 14:22:48 -0800459 size_t vertexStride,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000460 int indexCount);
bsalomon49f085d2014-09-05 13:34:00 -0700461 bool succeeded() const { return SkToBool(fTarget); }
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000462 void* vertices() const { SkASSERT(this->succeeded()); return fVertices; }
463 void* indices() const { SkASSERT(this->succeeded()); return fIndices; }
commit-bot@chromium.org972f9cd2014-03-28 17:58:28 +0000464 SkPoint* positions() const {
465 return static_cast<SkPoint*>(this->vertices());
reed@google.comac10a2d2010-12-22 21:39:39 +0000466 }
467
468 private:
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000469 void reset();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000470
reed@google.comac10a2d2010-12-22 21:39:39 +0000471 GrDrawTarget* fTarget;
reed@google.comac10a2d2010-12-22 21:39:39 +0000472 void* fVertices;
473 void* fIndices;
474 };
475
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000476 ////////////////////////////////////////////////////////////////////////////
reed@google.comac10a2d2010-12-22 21:39:39 +0000477
commit-bot@chromium.orga0b40282013-09-18 13:00:55 +0000478 class AutoClipRestore : public ::SkNoncopyable {
reed@google.comac10a2d2010-12-22 21:39:39 +0000479 public:
480 AutoClipRestore(GrDrawTarget* target) {
481 fTarget = target;
482 fClip = fTarget->getClip();
483 }
484
bsalomon@google.com8d67c072012-12-13 20:38:14 +0000485 AutoClipRestore(GrDrawTarget* target, const SkIRect& newClip);
486
reed@google.comac10a2d2010-12-22 21:39:39 +0000487 ~AutoClipRestore() {
488 fTarget->setClip(fClip);
489 }
490 private:
bsalomon@google.com8d67c072012-12-13 20:38:14 +0000491 GrDrawTarget* fTarget;
492 const GrClipData* fClip;
493 SkTLazy<SkClipStack> fStack;
494 GrClipData fReplacementClip;
reed@google.comac10a2d2010-12-22 21:39:39 +0000495 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000496
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000497 ////////////////////////////////////////////////////////////////////////////
rmistry@google.comd6176b02012-08-23 18:14:13 +0000498
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000499 /**
500 * Saves the geometry src state at construction and restores in the destructor. It also saves
501 * and then restores the vertex attrib state.
502 */
commit-bot@chromium.orga0b40282013-09-18 13:00:55 +0000503 class AutoGeometryPush : public ::SkNoncopyable {
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000504 public:
joshualitt9853cce2014-11-17 14:22:48 -0800505 AutoGeometryPush(GrDrawTarget* target) {
bsalomon49f085d2014-09-05 13:34:00 -0700506 SkASSERT(target);
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000507 fTarget = target;
508 target->pushGeometrySource();
509 }
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000510
511 ~AutoGeometryPush() { fTarget->popGeometrySource(); }
512
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000513 private:
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000514 GrDrawTarget* fTarget;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000515 };
reed@google.comac10a2d2010-12-22 21:39:39 +0000516
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000517 ///////////////////////////////////////////////////////////////////////////
518 // Draw execution tracking (for font atlases and other resources)
519 class DrawToken {
520 public:
521 DrawToken(GrDrawTarget* drawTarget, uint32_t drawID) :
522 fDrawTarget(drawTarget), fDrawID(drawID) {}
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000523
bsalomon49f085d2014-09-05 13:34:00 -0700524 bool isIssued() { return fDrawTarget && fDrawTarget->isIssued(fDrawID); }
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000525
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000526 private:
527 GrDrawTarget* fDrawTarget;
528 uint32_t fDrawID; // this may wrap, but we're doing direct comparison
529 // so that should be okay
530 };
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000531
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000532 virtual DrawToken getCurrentDrawToken() { return DrawToken(this, 0); }
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000533
joshualitt3322fa42014-11-07 08:48:51 -0800534 /**
535 * Used to communicate draws to GPUs / subclasses
536 */
537 class DrawInfo {
538 public:
joshualitt4d8da812015-01-28 12:53:54 -0800539 DrawInfo() { fDevBounds = NULL; }
joshualitt3322fa42014-11-07 08:48:51 -0800540 DrawInfo(const DrawInfo& di) { (*this) = di; }
541 DrawInfo& operator =(const DrawInfo& di);
542
543 GrPrimitiveType primitiveType() const { return fPrimitiveType; }
544 int startVertex() const { return fStartVertex; }
545 int startIndex() const { return fStartIndex; }
546 int vertexCount() const { return fVertexCount; }
547 int indexCount() const { return fIndexCount; }
548 int verticesPerInstance() const { return fVerticesPerInstance; }
549 int indicesPerInstance() const { return fIndicesPerInstance; }
550 int instanceCount() const { return fInstanceCount; }
551
joshualitt4d8da812015-01-28 12:53:54 -0800552 void setPrimitiveType(GrPrimitiveType type) { fPrimitiveType = type; }
553 void setStartVertex(int startVertex) { fStartVertex = startVertex; }
554 void setStartIndex(int startIndex) { fStartIndex = startIndex; }
555 void setVertexCount(int vertexCount) { fVertexCount = vertexCount; }
556 void setIndexCount(int indexCount) { fIndexCount = indexCount; }
557 void setVerticesPerInstance(int verticesPerI) { fVerticesPerInstance = verticesPerI; }
558 void setIndicesPerInstance(int indicesPerI) { fIndicesPerInstance = indicesPerI; }
559 void setInstanceCount(int instanceCount) { fInstanceCount = instanceCount; }
560
joshualitt3322fa42014-11-07 08:48:51 -0800561 bool isIndexed() const { return fIndexCount > 0; }
562#ifdef SK_DEBUG
563 bool isInstanced() const; // this version is longer because of asserts
564#else
565 bool isInstanced() const { return fInstanceCount > 0; }
566#endif
567
568 // adds or remove instances
569 void adjustInstanceCount(int instanceOffset);
570 // shifts the start vertex
571 void adjustStartVertex(int vertexOffset);
572 // shifts the start index
573 void adjustStartIndex(int indexOffset);
574
575 void setDevBounds(const SkRect& bounds) {
576 fDevBoundsStorage = bounds;
577 fDevBounds = &fDevBoundsStorage;
578 }
joshualitt7eb8c7b2014-11-18 14:24:27 -0800579 const GrVertexBuffer* vertexBuffer() const { return fVertexBuffer.get(); }
580 const GrIndexBuffer* indexBuffer() const { return fIndexBuffer.get(); }
581 void setVertexBuffer(const GrVertexBuffer* vb) {
582 fVertexBuffer.reset(vb);
583 }
584 void setIndexBuffer(const GrIndexBuffer* ib) {
585 fIndexBuffer.reset(ib);
586 }
joshualitt3322fa42014-11-07 08:48:51 -0800587 const SkRect* getDevBounds() const { return fDevBounds; }
588
joshualitt3322fa42014-11-07 08:48:51 -0800589 private:
joshualitt3322fa42014-11-07 08:48:51 -0800590 friend class GrDrawTarget;
591
592 GrPrimitiveType fPrimitiveType;
593
594 int fStartVertex;
595 int fStartIndex;
596 int fVertexCount;
597 int fIndexCount;
598
599 int fInstanceCount;
600 int fVerticesPerInstance;
601 int fIndicesPerInstance;
602
603 SkRect fDevBoundsStorage;
604 SkRect* fDevBounds;
605
joshualitt7eb8c7b2014-11-18 14:24:27 -0800606 GrPendingIOResource<const GrVertexBuffer, kRead_GrIOType> fVertexBuffer;
607 GrPendingIOResource<const GrIndexBuffer, kRead_GrIOType> fIndexBuffer;
joshualitt3322fa42014-11-07 08:48:51 -0800608 };
joshualitt2c93efe2014-11-06 12:57:13 -0800609
bsalomon371bcbc2014-12-01 08:19:34 -0800610 /**
611 * Used to populate the vertex and index buffer on the draw info before onDraw is called.
612 */
613 virtual void setDrawBuffers(DrawInfo*, size_t vertexStride) = 0;;
joshualitt2c93efe2014-11-06 12:57:13 -0800614 bool programUnitTest(int maxStages);
615
reed@google.comac10a2d2010-12-22 21:39:39 +0000616protected:
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000617 enum GeometrySrcType {
618 kNone_GeometrySrcType, //<! src has not been specified
619 kReserved_GeometrySrcType, //<! src was set using reserve*Space
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000620 kBuffer_GeometrySrcType //<! src was set using set*SourceToBuffer
621 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000622
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000623 struct GeometrySrcState {
624 GeometrySrcType fVertexSrc;
625 union {
626 // valid if src type is buffer
627 const GrVertexBuffer* fVertexBuffer;
628 // valid if src type is reserved or array
629 int fVertexCount;
630 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000631
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000632 GeometrySrcType fIndexSrc;
633 union {
634 // valid if src type is buffer
635 const GrIndexBuffer* fIndexBuffer;
636 // valid if src type is reserved or array
637 int fIndexCount;
638 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000639
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000640 size_t fVertexSize;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000641 };
bsalomon@google.com934c5702012-03-20 21:17:58 +0000642
643 int indexCountInCurrentSource() const {
644 const GeometrySrcState& src = this->getGeomSrc();
645 switch (src.fIndexSrc) {
646 case kNone_GeometrySrcType:
647 return 0;
648 case kReserved_GeometrySrcType:
bsalomon@google.com934c5702012-03-20 21:17:58 +0000649 return src.fIndexCount;
650 case kBuffer_GeometrySrcType:
commit-bot@chromium.org089a7802014-05-02 21:38:22 +0000651 return static_cast<int>(src.fIndexBuffer->gpuMemorySize() / sizeof(uint16_t));
bsalomon@google.com934c5702012-03-20 21:17:58 +0000652 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000653 SkFAIL("Unexpected Index Source.");
bsalomon@google.com934c5702012-03-20 21:17:58 +0000654 return 0;
655 }
656 }
bsalomon@google.coma47a48d2011-04-26 20:22:11 +0000657
bsalomon@google.com6e4e6502013-02-25 20:12:45 +0000658 GrContext* getContext() { return fContext; }
659 const GrContext* getContext() const { return fContext; }
660
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000661 // subclasses must call this in their destructors to ensure all vertex
662 // and index sources have been released (including those held by
663 // pushGeometrySource())
664 void releaseGeometry();
665
666 // accessors for derived classes
667 const GeometrySrcState& getGeomSrc() const { return fGeoSrcStateStack.back(); }
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000668 // it is preferable to call this rather than getGeomSrc()->fVertexSize because of the assert.
669 size_t getVertexSize() const {
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000670 // the vertex layout is only valid if a vertex source has been specified.
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000671 SkASSERT(this->getGeomSrc().fVertexSrc != kNone_GeometrySrcType);
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000672 return this->getGeomSrc().fVertexSize;
bsalomon@google.coma47a48d2011-04-26 20:22:11 +0000673 }
bsalomon@google.com5782d712011-01-21 21:03:59 +0000674
bsalomon@google.combcce8922013-03-25 15:38:39 +0000675 // Subclass must initialize this in its constructor.
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000676 SkAutoTUnref<const GrDrawTargetCaps> fCaps;
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000677
commit-bot@chromium.org2a05de02014-03-25 15:17:32 +0000678 const GrTraceMarkerSet& getActiveTraceMarkers() { return fActiveTraceMarkers; }
679
joshualitt65171342014-10-09 07:25:36 -0700680 // Makes a copy of the dst if it is necessary for the draw. Returns false if a copy is required
681 // but couldn't be made. Otherwise, returns true. This method needs to be protected because it
682 // needs to be accessed by GLPrograms to setup a correct drawstate
bsalomon50785a32015-02-06 07:02:37 -0800683 bool setupDstReadIfNecessary(const GrPipelineBuilder&,
egdaniele36914c2015-02-13 09:00:33 -0800684 const GrProcOptInfo& colorPOI,
685 const GrProcOptInfo& coveragePOI,
joshualitt9853cce2014-11-17 14:22:48 -0800686 GrDeviceCoordTexture* dstCopy,
687 const SkRect* drawBounds);
joshualitt65171342014-10-09 07:25:36 -0700688
egdaniele36914c2015-02-13 09:00:33 -0800689 struct PipelineInfo {
690 PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor,
691 const GrPrimitiveProcessor* primProc, const SkRect* devBounds,
692 GrDrawTarget* target);
693
694 PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor,
695 const GrBatch* batch, const SkRect* devBounds, GrDrawTarget* target);
696
697 bool willBlendWithDst(const GrPrimitiveProcessor* primProc) const {
698 return fPipelineBuilder->willBlendWithDst(primProc);
699 }
700 private:
701 friend class GrDrawTarget;
702
703 bool mustSkipDraw() const { return (NULL == fPipelineBuilder); }
704
705 GrPipelineBuilder* fPipelineBuilder;
706 GrScissorState* fScissor;
707 GrProcOptInfo fColorPOI;
708 GrProcOptInfo fCoveragePOI;
709 GrDeviceCoordTexture fDstCopy;
710 };
711
712 void setupPipeline(const PipelineInfo& pipelineInfo, GrPipeline* pipeline);
713
robertphillips54fac8b2015-02-16 09:35:50 -0800714 // A subclass can optionally overload this function to be notified before
715 // vertex and index space is reserved.
716 virtual void willReserveVertexAndIndexSpace(int vertexCount,
717 size_t vertexStride,
718 int indexCount) {}
719
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000720private:
bsalomonf90a02b2014-11-26 12:28:00 -0800721 /**
722 * This will be called before allocating a texture as a dst for copySurface. This function
723 * populates the dstDesc's config, flags, and origin so as to maximize efficiency and guarantee
724 * success of the copySurface call.
725 */
726 void initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* dstDesc) {
727 if (!this->onInitCopySurfaceDstDesc(src, dstDesc)) {
728 dstDesc->fOrigin = kDefault_GrSurfaceOrigin;
bsalomon6bc1b5f2015-02-23 09:06:38 -0800729 dstDesc->fFlags = kRenderTarget_GrSurfaceFlag;
bsalomonf90a02b2014-11-26 12:28:00 -0800730 dstDesc->fConfig = src->config();
731 }
732 }
733
734 /** Internal implementation of canCopySurface. */
735 bool internalCanCopySurface(const GrSurface* dst,
736 const GrSurface* src,
737 const SkIRect& clippedSrcRect,
738 const SkIPoint& clippedDstRect);
739
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000740 // implemented by subclass to allocate space for reserved geom
jvanverth@google.coma6338982013-01-31 21:34:25 +0000741 virtual bool onReserveVertexSpace(size_t vertexSize, int vertexCount, void** vertices) = 0;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000742 virtual bool onReserveIndexSpace(int indexCount, void** indices) = 0;
743 // implemented by subclass to handle release of reserved geom space
744 virtual void releaseReservedVertexSpace() = 0;
745 virtual void releaseReservedIndexSpace() = 0;
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000746 // subclass overrides to be notified just before geo src state is pushed/popped.
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000747 virtual void geometrySourceWillPush() = 0;
748 virtual void geometrySourceWillPop(const GeometrySrcState& restoredState) = 0;
749 // subclass called to perform drawing
egdaniele36914c2015-02-13 09:00:33 -0800750 virtual void onDraw(const GrGeometryProcessor*, const DrawInfo&, const PipelineInfo&) = 0;
751 virtual void onDrawBatch(GrBatch*, const PipelineInfo&) = 0;
joshualitt5478d422014-11-14 16:00:38 -0800752 // TODO copy in order drawbuffer onDrawRect to here
egdaniel8dd688b2015-01-22 10:16:09 -0800753 virtual void onDrawRect(GrPipelineBuilder*,
joshualitt2e3b3e32014-12-09 13:31:14 -0800754 GrColor color,
joshualitt8059eb92014-12-29 15:10:07 -0800755 const SkMatrix& viewMatrix,
joshualitt9853cce2014-11-17 14:22:48 -0800756 const SkRect& rect,
commit-bot@chromium.orgfd03d4a2013-07-17 21:39:42 +0000757 const SkRect* localRect,
joshualitt5478d422014-11-14 16:00:38 -0800758 const SkMatrix* localMatrix) = 0;
commit-bot@chromium.org32184d82013-10-09 15:14:18 +0000759
egdaniel8dd688b2015-01-22 10:16:09 -0800760 virtual void onStencilPath(const GrPipelineBuilder&,
joshualitt56995b52014-12-11 15:44:02 -0800761 const GrPathProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800762 const GrPath*,
bsalomon3e791242014-12-17 13:43:13 -0800763 const GrScissorState&,
joshualitt2c93efe2014-11-06 12:57:13 -0800764 const GrStencilSettings&) = 0;
egdaniele36914c2015-02-13 09:00:33 -0800765 virtual void onDrawPath(const GrPathProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800766 const GrPath*,
joshualitt2c93efe2014-11-06 12:57:13 -0800767 const GrStencilSettings&,
egdaniele36914c2015-02-13 09:00:33 -0800768 const PipelineInfo&) = 0;
769 virtual void onDrawPaths(const GrPathProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800770 const GrPathRange*,
cdalton55b24af2014-11-25 11:00:56 -0800771 const void* indices,
772 PathIndexType,
773 const float transformValues[],
joshualitt2c93efe2014-11-06 12:57:13 -0800774 PathTransformType,
cdalton55b24af2014-11-25 11:00:56 -0800775 int count,
joshualitt2c93efe2014-11-06 12:57:13 -0800776 const GrStencilSettings&,
egdaniele36914c2015-02-13 09:00:33 -0800777 const PipelineInfo&) = 0;
bsalomon@google.com64aef2b2012-06-11 15:36:13 +0000778
bsalomon63b21962014-11-05 07:05:34 -0800779 virtual void onClear(const SkIRect* rect, GrColor color, bool canIgnoreRect,
780 GrRenderTarget* renderTarget) = 0;
781
bsalomonf90a02b2014-11-26 12:28:00 -0800782 /** The subclass will get a chance to copy the surface for falling back to the default
783 implementation, which simply draws a rectangle (and fails if dst isn't a render target). It
784 should assume that any clipping has already been performed on the rect and point. It won't
785 be called if the copy can be skipped. */
786 virtual bool onCopySurface(GrSurface* dst,
787 GrSurface* src,
788 const SkIRect& srcRect,
789 const SkIPoint& dstPoint) = 0;
790
791 /** Indicates whether onCopySurface would succeed. It should assume that any clipping has
792 already been performed on the rect and point. It won't be called if the copy can be
793 skipped. */
794 virtual bool onCanCopySurface(const GrSurface* dst,
795 const GrSurface* src,
796 const SkIRect& srcRect,
797 const SkIPoint& dstPoint) = 0;
798 /**
799 * This will be called before allocating a texture to be a dst for onCopySurface. Only the
800 * dstDesc's config, flags, and origin need be set by the function. If the subclass cannot
801 * create a surface that would succeed its implementation of onCopySurface, it should return
802 * false. The base class will fall back to creating a render target to draw into using the src.
803 */
804 virtual bool onInitCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* dstDesc) = 0;
bsalomon63b21962014-11-05 07:05:34 -0800805
bsalomon@google.come3d70952012-03-13 12:40:53 +0000806 // helpers for reserving vertex and index space.
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000807 bool reserveVertexSpace(size_t vertexSize,
bsalomon@google.come3d70952012-03-13 12:40:53 +0000808 int vertexCount,
809 void** vertices);
810 bool reserveIndexSpace(int indexCount, void** indices);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000811
bsalomon@google.come8262622011-11-07 02:30:51 +0000812 // called by drawIndexed and drawNonIndexed. Use a negative indexCount to
813 // indicate non-indexed drawing.
egdaniel8dd688b2015-01-22 10:16:09 -0800814 bool checkDraw(const GrPipelineBuilder&,
joshualitt56995b52014-12-11 15:44:02 -0800815 const GrGeometryProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800816 GrPrimitiveType type,
817 int startVertex,
818 int startIndex,
819 int vertexCount,
bsalomon@google.come8262622011-11-07 02:30:51 +0000820 int indexCount) const;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000821 // called when setting a new vert/idx source to unref prev vb/ib
822 void releasePreviousVertexSource();
823 void releasePreviousIndexSource();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000824
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000825 // Check to see if this set of draw commands has been sent out
826 virtual bool isIssued(uint32_t drawID) { return true; }
joshualitt9853cce2014-11-17 14:22:48 -0800827 void getPathStencilSettingsForFilltype(GrPathRendering::FillType,
828 const GrStencilBuffer*,
829 GrStencilSettings*);
joshualitta7024152014-11-03 14:16:35 -0800830 virtual GrClipMaskManager* clipMaskManager() = 0;
egdaniel8dd688b2015-01-22 10:16:09 -0800831 virtual bool setupClip(GrPipelineBuilder*,
832 GrPipelineBuilder::AutoRestoreEffects* are,
833 GrPipelineBuilder::AutoRestoreStencil* ars,
joshualitt8059eb92014-12-29 15:10:07 -0800834 GrScissorState* scissorState,
835 const SkRect* devBounds) = 0;
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000836
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000837 enum {
838 kPreallocGeoSrcStateStackCnt = 4,
reed@google.comac10a2d2010-12-22 21:39:39 +0000839 };
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000840 SkSTArray<kPreallocGeoSrcStateStackCnt, GeometrySrcState, true> fGeoSrcStateStack;
841 const GrClipData* fClip;
bsalomon@google.com6e4e6502013-02-25 20:12:45 +0000842 // The context owns us, not vice-versa, so this ptr is not ref'ed by DrawTarget.
843 GrContext* fContext;
commit-bot@chromium.org2a05de02014-03-25 15:17:32 +0000844 // To keep track that we always have at least as many debug marker adds as removes
845 int fGpuTraceMarkerCount;
846 GrTraceMarkerSet fActiveTraceMarkers;
egdaniel3eee3832014-06-18 13:09:11 -0700847 GrTraceMarkerSet fStoredTraceMarkers;
reed@google.comfa35e3d2012-06-26 20:16:17 +0000848
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +0000849 typedef SkRefCnt INHERITED;
reed@google.comac10a2d2010-12-22 21:39:39 +0000850};
851
joshualitt329bf482014-10-29 12:31:28 -0700852/*
853 * This class is JUST for clip mask manager. Everyone else should just use draw target above.
854 */
joshualitt6db519c2014-10-29 08:48:18 -0700855class GrClipTarget : public GrDrawTarget {
856public:
joshualitt329bf482014-10-29 12:31:28 -0700857 GrClipTarget(GrContext* context) : INHERITED(context) {
858 fClipMaskManager.setClipTarget(this);
859 }
860
861 /* Clip mask manager needs access to the context.
862 * TODO we only need a very small subset of context in the CMM.
863 */
864 GrContext* getContext() { return INHERITED::getContext(); }
865 const GrContext* getContext() const { return INHERITED::getContext(); }
866
joshualitt6db519c2014-10-29 08:48:18 -0700867 /**
868 * Clip Mask Manager(and no one else) needs to clear private stencil bits.
869 * ClipTarget subclass sets clip bit in the stencil buffer. The subclass
870 * is free to clear the remaining bits to zero if masked clears are more
871 * expensive than clearing all bits.
872 */
873 virtual void clearStencilClip(const SkIRect& rect, bool insideClip, GrRenderTarget* = NULL) = 0;
874
joshualitt3bdd7dc2014-10-31 08:27:39 -0700875 /**
876 * Release any resources that are cached but not currently in use. This
877 * is intended to give an application some recourse when resources are low.
878 */
mtklein72c9faa2015-01-09 10:06:39 -0800879 void purgeResources() SK_OVERRIDE {
joshualitt3bdd7dc2014-10-31 08:27:39 -0700880 // The clip mask manager can rebuild all its clip masks so just
881 // get rid of them all.
882 fClipMaskManager.purgeResources();
883 };
884
joshualitt329bf482014-10-29 12:31:28 -0700885protected:
886 GrClipMaskManager fClipMaskManager;
887
joshualitt6db519c2014-10-29 08:48:18 -0700888private:
tfarina912ed6e2014-12-14 15:20:10 -0800889 GrClipMaskManager* clipMaskManager() SK_OVERRIDE { return &fClipMaskManager; }
joshualitt329bf482014-10-29 12:31:28 -0700890
egdaniel8dd688b2015-01-22 10:16:09 -0800891 virtual bool setupClip(GrPipelineBuilder*,
892 GrPipelineBuilder::AutoRestoreEffects* are,
893 GrPipelineBuilder::AutoRestoreStencil* ars,
joshualitt8059eb92014-12-29 15:10:07 -0800894 GrScissorState* scissorState,
895 const SkRect* devBounds) SK_OVERRIDE;
joshualitt2c93efe2014-11-06 12:57:13 -0800896
joshualitt6db519c2014-10-29 08:48:18 -0700897 typedef GrDrawTarget INHERITED;
898};
899
reed@google.comac10a2d2010-12-22 21:39:39 +0000900#endif