blob: 6628e372283a1ed1031903081e3e0d69228e34f9 [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"
tomhudson@google.com93813632011-10-27 20:21:16 +000014#include "GrDrawState.h"
bsalomon@google.com934c5702012-03-20 21:17:58 +000015#include "GrIndexBuffer.h"
kkinnunenccdaa042014-08-20 01:36:23 -070016#include "GrPathRendering.h"
commit-bot@chromium.org2a05de02014-03-25 15:17:32 +000017#include "GrTraceMarker.h"
joshualitt7eb8c7b2014-11-18 14:24:27 -080018#include "GrVertexBuffer.h"
reed@google.comac10a2d2010-12-22 21:39:39 +000019
bsalomon@google.com8d67c072012-12-13 20:38:14 +000020#include "SkClipStack.h"
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +000021#include "SkMatrix.h"
sugoi@google.com12b4e272012-12-06 20:13:11 +000022#include "SkPath.h"
commit-bot@chromium.org9b62aa12014-03-25 11:59:40 +000023#include "SkStrokeRec.h"
robertphillips@google.coma2d71482012-08-01 20:08:47 +000024#include "SkTArray.h"
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +000025#include "SkTLazy.h"
commit-bot@chromium.orga0b40282013-09-18 13:00:55 +000026#include "SkTypes.h"
bsalomon@google.com8d67c072012-12-13 20:38:14 +000027#include "SkXfermode.h"
Scroggo97c88c22011-05-11 14:05:25 +000028
robertphillips@google.coma2d71482012-08-01 20:08:47 +000029class GrClipData;
bsalomon@google.comc26d94f2013-03-25 18:19:00 +000030class GrDrawTargetCaps;
bsalomon@google.com64aef2b2012-06-11 15:36:13 +000031class GrPath;
cdaltonb85a0aa2014-07-21 15:32:44 -070032class GrPathRange;
sugoi@google.com12b4e272012-12-06 20:13:11 +000033
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +000034class GrDrawTarget : public SkRefCnt {
bsalomon@google.comf6601872012-08-28 21:11:35 +000035public:
36 SK_DECLARE_INST_COUNT(GrDrawTarget)
37
cdalton55b24af2014-11-25 11:00:56 -080038 typedef GrPathRange::PathIndexType PathIndexType;
39 typedef GrPathRendering::PathTransformType PathTransformType;
kkinnunenccdaa042014-08-20 01:36:23 -070040
reed@google.comac10a2d2010-12-22 21:39:39 +000041 ///////////////////////////////////////////////////////////////////////////
42
bsalomon@google.com6e4e6502013-02-25 20:12:45 +000043 // The context may not be fully constructed and should not be used during GrDrawTarget
44 // construction.
45 GrDrawTarget(GrContext* context);
bsalomon@google.com25fb21f2011-06-21 18:17:25 +000046 virtual ~GrDrawTarget();
reed@google.comac10a2d2010-12-22 21:39:39 +000047
48 /**
bsalomon@google.com18c9c192011-09-22 21:01:31 +000049 * Gets the capabilities of the draw target.
50 */
bsalomon@google.comc26d94f2013-03-25 18:19:00 +000051 const GrDrawTargetCaps* caps() const { return fCaps.get(); }
bsalomon@google.com18c9c192011-09-22 21:01:31 +000052
53 /**
reed@google.comac10a2d2010-12-22 21:39:39 +000054 * Sets the current clip to the region specified by clip. All draws will be
55 * clipped against this clip if kClip_StateBit is enabled.
56 *
bsalomon@google.com5aaa69e2011-03-04 20:29:08 +000057 * Setting the clip may (or may not) zero out the client's stencil bits.
58 *
reed@google.comac10a2d2010-12-22 21:39:39 +000059 * @param description of the clipping region
60 */
robertphillips@google.combeb1af72012-07-26 18:52:16 +000061 void setClip(const GrClipData* clip);
reed@google.comac10a2d2010-12-22 21:39:39 +000062
63 /**
64 * Gets the current clip.
65 *
66 * @return the clip.
67 */
robertphillips@google.combeb1af72012-07-26 18:52:16 +000068 const GrClipData* getClip() const;
reed@google.comac10a2d2010-12-22 21:39:39 +000069
bsalomon@google.coma5d056a2012-03-27 15:59:58 +000070 /**
bsalomonf90a02b2014-11-26 12:28:00 -080071 * There are two types of "sources" of geometry (vertices and indices) for
bsalomon@google.come3d70952012-03-13 12:40:53 +000072 * draw calls made on the target. When performing an indexed draw, the
73 * indices and vertices can use different source types. Once a source is
bsalomon@google.com934c5702012-03-20 21:17:58 +000074 * specified it can be used for multiple draws. However, the time at which
75 * the geometry data is no longer editable depends on the source type.
bsalomon@google.com25fb21f2011-06-21 18:17:25 +000076 *
77 * Sometimes it is necessary to perform a draw while upstack code has
bsalomon@google.come3d70952012-03-13 12:40:53 +000078 * already specified geometry that it isn't finished with. So there are push
79 * and pop methods. This allows the client to push the sources, draw
80 * something using alternate sources, and then pop to restore the original
81 * sources.
bsalomon@google.com1c13c962011-02-14 16:51:21 +000082 *
bsalomon@google.come3d70952012-03-13 12:40:53 +000083 * Aside from pushes and pops, a source remains valid until another source
84 * is set or resetVertexSource / resetIndexSource is called. Drawing from
85 * a reset source is an error.
86 *
bsalomonf90a02b2014-11-26 12:28:00 -080087 * The two types of sources are:
bsalomon@google.come3d70952012-03-13 12:40:53 +000088 *
bsalomonf90a02b2014-11-26 12:28:00 -080089 * 1. Reserve. This is most useful when the caller has data it must
bsalomon@google.com25fb21f2011-06-21 18:17:25 +000090 * transform before drawing and is not long-lived. The caller requests
91 * that the draw target make room for some amount of vertex and/or index
92 * data. The target provides ptrs to hold the vertex and/or index data.
93 *
rmistry@google.comd6176b02012-08-23 18:14:13 +000094 * The data is writable up until the next drawIndexed, drawNonIndexed,
bsalomon@google.come4617bf2013-04-03 14:56:40 +000095 * drawIndexedInstances, drawRect, copySurface, or pushGeometrySource. At
96 * this point the data is frozen and the ptrs are no longer valid.
bsalomon@google.com1c13c962011-02-14 16:51:21 +000097 *
bsalomon@google.come3d70952012-03-13 12:40:53 +000098 * Where the space is allocated and how it is uploaded to the GPU is
99 * subclass-dependent.
100 *
bsalomonf90a02b2014-11-26 12:28:00 -0800101 * 2. Vertex and Index Buffers. This is most useful for geometry that will
bsalomon@google.come3d70952012-03-13 12:40:53 +0000102 * is long-lived. When the data in the buffer is consumed depends on the
rmistry@google.comd6176b02012-08-23 18:14:13 +0000103 * GrDrawTarget subclass. For deferred subclasses the caller has to
bsalomon@google.come3d70952012-03-13 12:40:53 +0000104 * guarantee that the data is still available in the buffers at playback.
105 * (TODO: Make this more automatic as we have done for read/write pixels)
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000106 */
107
108 /**
bsalomon@google.come3d70952012-03-13 12:40:53 +0000109 * Reserves space for vertices and/or indices. Zero can be specifed as
110 * either the vertex or index count if the caller desires to only reserve
rmistry@google.comd6176b02012-08-23 18:14:13 +0000111 * space for only indices or only vertices. If zero is specifed for
bsalomon@google.come3d70952012-03-13 12:40:53 +0000112 * vertexCount then the vertex source will be unmodified and likewise for
113 * indexCount.
reed@google.comac10a2d2010-12-22 21:39:39 +0000114 *
bsalomon@google.come3d70952012-03-13 12:40:53 +0000115 * If the function returns true then the reserve suceeded and the vertices
116 * and indices pointers will point to the space created.
reed@google.comac10a2d2010-12-22 21:39:39 +0000117 *
bsalomon@google.come3d70952012-03-13 12:40:53 +0000118 * If the target cannot make space for the request then this function will
119 * return false. If vertexCount was non-zero then upon failure the vertex
120 * source is reset and likewise for indexCount.
reed@google.comac10a2d2010-12-22 21:39:39 +0000121 *
bsalomon@google.come3d70952012-03-13 12:40:53 +0000122 * The pointers to the space allocated for vertices and indices remain valid
bsalomon@google.come4617bf2013-04-03 14:56:40 +0000123 * until a drawIndexed, drawNonIndexed, drawIndexedInstances, drawRect,
124 * copySurface, or push/popGeomtrySource is called. At that point logically a
125 * snapshot of the data is made and the pointers are invalid.
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000126 *
bsalomon@google.come3d70952012-03-13 12:40:53 +0000127 * @param vertexCount the number of vertices to reserve space for. Can be
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000128 * 0. Vertex size is queried from the current GrDrawState.
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000129 * @param indexCount the number of indices to reserve space for. Can be 0.
bsalomon@google.come3d70952012-03-13 12:40:53 +0000130 * @param vertices will point to reserved vertex space if vertexCount is
rmistry@google.comd6176b02012-08-23 18:14:13 +0000131 * non-zero. Illegal to pass NULL if vertexCount > 0.
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000132 * @param indices will point to reserved index space if indexCount is
133 * non-zero. Illegal to pass NULL if indexCount > 0.
134 */
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000135 bool reserveVertexAndIndexSpace(int vertexCount,
joshualitt9853cce2014-11-17 14:22:48 -0800136 size_t vertexStride,
bsalomon@google.com97805382012-03-13 14:32:07 +0000137 int indexCount,
138 void** vertices,
139 void** indices);
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000140
reed@google.comac10a2d2010-12-22 21:39:39 +0000141 /**
142 * Provides hints to caller about the number of vertices and indices
143 * that can be allocated cheaply. This can be useful if caller is reserving
144 * space but doesn't know exactly how much geometry is needed.
145 *
146 * Also may hint whether the draw target should be flushed first. This is
147 * useful for deferred targets.
148 *
reed@google.comac10a2d2010-12-22 21:39:39 +0000149 * @param vertexCount in: hint about how many vertices the caller would
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000150 * like to allocate. Vertex size is queried from the
151 * current GrDrawState.
reed@google.comac10a2d2010-12-22 21:39:39 +0000152 * out: a hint about the number of vertices that can be
153 * allocated cheaply. Negative means no hint.
154 * Ignored if NULL.
155 * @param indexCount in: hint about how many indices the caller would
156 * like to allocate.
157 * out: a hint about the number of indices that can be
158 * allocated cheaply. Negative means no hint.
159 * Ignored if NULL.
160 *
161 * @return true if target should be flushed based on the input values.
162 */
joshualitt9853cce2014-11-17 14:22:48 -0800163 virtual bool geometryHints(size_t vertexStride, int* vertexCount, int* indexCount) const;
reed@google.comac10a2d2010-12-22 21:39:39 +0000164
165 /**
reed@google.comac10a2d2010-12-22 21:39:39 +0000166 * Sets source of vertex data for the next draw. Data does not have to be
bsalomon@google.com934c5702012-03-20 21:17:58 +0000167 * in the buffer until drawIndexed, drawNonIndexed, or drawIndexedInstances.
reed@google.comac10a2d2010-12-22 21:39:39 +0000168 *
169 * @param buffer vertex buffer containing vertex data. Must be
skia.committer@gmail.comae683922013-02-06 07:01:54 +0000170 * unlocked before draw call. Vertex size is queried
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000171 * from current GrDrawState.
reed@google.comac10a2d2010-12-22 21:39:39 +0000172 */
joshualitt9853cce2014-11-17 14:22:48 -0800173 void setVertexSourceToBuffer(const GrVertexBuffer* buffer, size_t vertexStride);
reed@google.comac10a2d2010-12-22 21:39:39 +0000174
175 /**
176 * Sets source of index data for the next indexed draw. Data does not have
bsalomon@google.com934c5702012-03-20 21:17:58 +0000177 * to be in the buffer until drawIndexed.
reed@google.comac10a2d2010-12-22 21:39:39 +0000178 *
179 * @param buffer index buffer containing indices. Must be unlocked
180 * before indexed draw call.
181 */
182 void setIndexSourceToBuffer(const GrIndexBuffer* buffer);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000183
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000184 /**
185 * Resets vertex source. Drawing from reset vertices is illegal. Set vertex
186 * source to reserved, array, or buffer before next draw. May be able to free
187 * up temporary storage allocated by setVertexSourceToArray or
188 * reserveVertexSpace.
189 */
190 void resetVertexSource();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000191
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000192 /**
193 * Resets index source. Indexed Drawing from reset indices is illegal. Set
194 * index source to reserved, array, or buffer before next indexed draw. May
195 * be able to free up temporary storage allocated by setIndexSourceToArray
196 * or reserveIndexSpace.
197 */
bsalomon@google.com97805382012-03-13 14:32:07 +0000198 void resetIndexSource();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000199
bsalomon@google.com97805382012-03-13 14:32:07 +0000200 /**
201 * Query to find out if the vertex or index source is reserved.
202 */
203 bool hasReservedVerticesOrIndices() const {
bsalomon@google.com73d98aa2012-03-13 14:41:19 +0000204 return kReserved_GeometrySrcType == this->getGeomSrc().fVertexSrc ||
bsalomon@google.com97805382012-03-13 14:32:07 +0000205 kReserved_GeometrySrcType == this->getGeomSrc().fIndexSrc;
206 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000207
208 /**
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000209 * Pushes and resets the vertex/index sources. Any reserved vertex / index
210 * data is finalized (i.e. cannot be updated after the matching pop but can
211 * be drawn from). Must be balanced by a pop.
212 */
213 void pushGeometrySource();
214
215 /**
216 * Pops the vertex / index sources from the matching push.
217 */
218 void popGeometrySource();
bsalomon@google.com64aef2b2012-06-11 15:36:13 +0000219
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000220 /**
reed@google.comac10a2d2010-12-22 21:39:39 +0000221 * Draws indexed geometry using the current state and current vertex / index
222 * sources.
223 *
224 * @param type The type of primitives to draw.
225 * @param startVertex the vertex in the vertex array/buffer corresponding
226 * to index 0
227 * @param startIndex first index to read from index src.
228 * @param vertexCount one greater than the max index.
229 * @param indexCount the number of index elements to read. The index count
230 * is effectively trimmed to the last completely
231 * specified primitive.
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000232 * @param devBounds optional bounds hint. This is a promise from the caller,
233 * not a request for clipping.
reed@google.comac10a2d2010-12-22 21:39:39 +0000234 */
joshualitt9853cce2014-11-17 14:22:48 -0800235 void drawIndexed(GrDrawState*,
joshualitt56995b52014-12-11 15:44:02 -0800236 const GrGeometryProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800237 GrPrimitiveType type,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000238 int startVertex,
239 int startIndex,
240 int vertexCount,
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000241 int indexCount,
242 const SkRect* devBounds = NULL);
reed@google.comac10a2d2010-12-22 21:39:39 +0000243
244 /**
245 * Draws non-indexed geometry using the current state and current vertex
246 * sources.
247 *
248 * @param type The type of primitives to draw.
249 * @param startVertex the vertex in the vertex array/buffer corresponding
250 * to index 0
251 * @param vertexCount one greater than the max index.
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000252 * @param devBounds optional bounds hint. This is a promise from the caller,
253 * not a request for clipping.
reed@google.comac10a2d2010-12-22 21:39:39 +0000254 */
joshualitt9853cce2014-11-17 14:22:48 -0800255 void drawNonIndexed(GrDrawState*,
joshualitt56995b52014-12-11 15:44:02 -0800256 const GrGeometryProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800257 GrPrimitiveType type,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000258 int startVertex,
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000259 int vertexCount,
260 const SkRect* devBounds = NULL);
reed@google.comac10a2d2010-12-22 21:39:39 +0000261
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000262 /**
bsalomon@google.com64aef2b2012-06-11 15:36:13 +0000263 * Draws path into the stencil buffer. The fill must be either even/odd or
264 * winding (not inverse or hairline). It will respect the HW antialias flag
joshualitt92e496f2014-10-31 13:56:50 -0700265 * on the draw state (if possible in the 3D API). Note, we will never have an inverse fill
266 * with stencil path
bsalomon@google.com64aef2b2012-06-11 15:36:13 +0000267 */
joshualitt56995b52014-12-11 15:44:02 -0800268 void stencilPath(GrDrawState*, const GrPathProcessor*, const GrPath*,GrPathRendering::FillType);
bsalomon@google.com64aef2b2012-06-11 15:36:13 +0000269
270 /**
commit-bot@chromium.org32184d82013-10-09 15:14:18 +0000271 * Draws a path. Fill must not be a hairline. It will respect the HW
commit-bot@chromium.orgc4dc0ad2013-10-09 14:11:33 +0000272 * antialias flag on the draw state (if possible in the 3D API).
273 */
joshualitt56995b52014-12-11 15:44:02 -0800274 void drawPath(GrDrawState*, const GrPathProcessor*, const GrPath*, GrPathRendering::FillType);
commit-bot@chromium.orgc4dc0ad2013-10-09 14:11:33 +0000275
276 /**
cdalton55b24af2014-11-25 11:00:56 -0800277 * Draws the aggregate path from combining multiple. Note that this will not
278 * always be equivalent to back-to-back calls to drawPath(). It will respect
279 * the HW antialias flag on the draw state (if possible in the 3D API).
commit-bot@chromium.org9b62aa12014-03-25 11:59:40 +0000280 *
cdalton55b24af2014-11-25 11:00:56 -0800281 * @param pathRange Source paths to draw from
282 * @param indices Array of path indices to draw
283 * @param indexType Data type of the array elements in indexBuffer
284 * @param transformValues Array of transforms for the individual paths
285 * @param transformType Type of transforms in transformBuffer
286 * @param count Number of paths to draw
cdaltonb85a0aa2014-07-21 15:32:44 -0700287 * @param fill Fill type for drawing all the paths
commit-bot@chromium.org9b62aa12014-03-25 11:59:40 +0000288 */
joshualitt2e3b3e32014-12-09 13:31:14 -0800289 void drawPaths(GrDrawState*,
joshualitt56995b52014-12-11 15:44:02 -0800290 const GrPathProcessor*,
joshualitt2e3b3e32014-12-09 13:31:14 -0800291 const GrPathRange* pathRange,
cdalton55b24af2014-11-25 11:00:56 -0800292 const void* indices,
293 PathIndexType indexType,
294 const float transformValues[],
295 PathTransformType transformType,
joshualitt9853cce2014-11-17 14:22:48 -0800296 int count,
joshualitt92e496f2014-10-31 13:56:50 -0700297 GrPathRendering::FillType fill);
cdaltonb85a0aa2014-07-21 15:32:44 -0700298
commit-bot@chromium.org9b62aa12014-03-25 11:59:40 +0000299 /**
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000300 * Helper function for drawing rects. It performs a geometry src push and pop
301 * and thus will finalize any reserved geometry.
skia.committer@gmail.com044679e2013-02-15 07:16:57 +0000302 *
bsalomon@google.comc7818882013-03-20 19:19:53 +0000303 * @param rect the rect to draw
bsalomon@google.comc7818882013-03-20 19:19:53 +0000304 * @param localRect optional rect that specifies local coords to map onto
305 * rect. If NULL then rect serves as the local coords.
joshualitt8fc6c2d2014-12-22 15:27:05 -0800306 * @param localMatrix Optional local matrix. The local coordinates are specified by localRect,
307 * or if it is NULL by rect. This matrix applies to the coordinate implied by
308 * that rectangle before it is input to GrCoordTransforms that read local
309 * coordinates
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000310 */
joshualitt9853cce2014-11-17 14:22:48 -0800311 void drawRect(GrDrawState* ds,
joshualitt2e3b3e32014-12-09 13:31:14 -0800312 GrColor color,
joshualitt8059eb92014-12-29 15:10:07 -0800313 const SkMatrix& viewMatrix,
joshualitt9853cce2014-11-17 14:22:48 -0800314 const SkRect& rect,
commit-bot@chromium.orgfd03d4a2013-07-17 21:39:42 +0000315 const SkRect* localRect,
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000316 const SkMatrix* localMatrix) {
317 AutoGeometryPush agp(this);
joshualitt8059eb92014-12-29 15:10:07 -0800318 this->onDrawRect(ds, color, viewMatrix, rect, localRect, localMatrix);
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000319 }
jvanverth@google.com39768252013-02-14 15:25:44 +0000320
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000321 /**
bsalomon@google.comc7818882013-03-20 19:19:53 +0000322 * Helper for drawRect when the caller doesn't need separate local rects or matrices.
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000323 */
joshualitt8059eb92014-12-29 15:10:07 -0800324 void drawSimpleRect(GrDrawState* ds, GrColor color, const SkMatrix& viewM, const SkRect& rect) {
325 this->drawRect(ds, color, viewM, rect, NULL, NULL);
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000326 }
joshualitt8059eb92014-12-29 15:10:07 -0800327 void drawSimpleRect(GrDrawState* ds, GrColor color, const SkMatrix& viewM,
328 const SkIRect& irect) {
reed@google.com44699382013-10-31 17:28:30 +0000329 SkRect rect = SkRect::Make(irect);
joshualitt8059eb92014-12-29 15:10:07 -0800330 this->drawRect(ds, color, viewM, rect, NULL, NULL);
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000331 }
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000332
333 /**
bsalomon@google.com934c5702012-03-20 21:17:58 +0000334 * This call is used to draw multiple instances of some geometry with a
335 * given number of vertices (V) and indices (I) per-instance. The indices in
336 * the index source must have the form i[k+I] == i[k] + V. Also, all indices
337 * i[kI] ... i[(k+1)I-1] must be elements of the range kV ... (k+1)V-1. As a
338 * concrete example, the following index buffer for drawing a series of
339 * quads each as two triangles each satisfies these conditions with V=4 and
340 * I=6:
341 * (0,1,2,0,2,3, 4,5,6,4,6,7, 8,9,10,8,10,11, ...)
342 *
343 * The call assumes that the pattern of indices fills the entire index
344 * source. The size of the index buffer limits the number of instances that
345 * can be drawn by the GPU in a single draw. However, the caller may specify
346 * any (positive) number for instanceCount and if necessary multiple GPU
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000347 * draws will be issued. Moreover, when drawIndexedInstances is called
bsalomon@google.com934c5702012-03-20 21:17:58 +0000348 * multiple times it may be possible for GrDrawTarget to group them into a
349 * single GPU draw.
350 *
351 * @param type the type of primitives to draw
352 * @param instanceCount the number of instances to draw. Each instance
353 * consists of verticesPerInstance vertices indexed by
354 * indicesPerInstance indices drawn as the primitive
355 * type specified by type.
356 * @param verticesPerInstance The number of vertices in each instance (V
357 * in the above description).
358 * @param indicesPerInstance The number of indices in each instance (I
359 * in the above description).
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000360 * @param devBounds optional bounds hint. This is a promise from the caller,
361 * not a request for clipping.
bsalomon@google.com934c5702012-03-20 21:17:58 +0000362 */
joshualitt9853cce2014-11-17 14:22:48 -0800363 void drawIndexedInstances(GrDrawState*,
joshualitt56995b52014-12-11 15:44:02 -0800364 const GrGeometryProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800365 GrPrimitiveType type,
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000366 int instanceCount,
367 int verticesPerInstance,
368 int indicesPerInstance,
369 const SkRect* devBounds = NULL);
bsalomon@google.com934c5702012-03-20 21:17:58 +0000370
371 /**
bsalomon89c62982014-11-03 12:08:42 -0800372 * Clear the passed in render target. Ignores the draw state and clip. Clears the whole thing if
373 * rect is NULL, otherwise just the rect. If canIgnoreRect is set then the entire render target
374 * can be optionally cleared.
bsalomon@google.com0b335c12011-04-25 19:17:44 +0000375 */
joshualitt9853cce2014-11-17 14:22:48 -0800376 void clear(const SkIRect* rect,
377 GrColor color,
378 bool canIgnoreRect,
bsalomon63b21962014-11-05 07:05:34 -0800379 GrRenderTarget* renderTarget);
skia.committer@gmail.coma9493a32013-04-04 07:01:12 +0000380
bsalomon@google.come4617bf2013-04-03 14:56:40 +0000381 /**
bsalomon89c62982014-11-03 12:08:42 -0800382 * Discards the contents render target.
commit-bot@chromium.org28361fa2014-03-28 16:08:05 +0000383 **/
bsalomon89c62982014-11-03 12:08:42 -0800384 virtual void discard(GrRenderTarget*) = 0;
commit-bot@chromium.org28361fa2014-03-28 16:08:05 +0000385
386 /**
commit-bot@chromium.org2a05de02014-03-25 15:17:32 +0000387 * Called at start and end of gpu trace marking
388 * GR_CREATE_GPU_TRACE_MARKER(marker_str, target) will automatically call these at the start
389 * and end of a code block respectively
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000390 */
egdaniel3eee3832014-06-18 13:09:11 -0700391 void addGpuTraceMarker(const GrGpuTraceMarker* marker);
392 void removeGpuTraceMarker(const GrGpuTraceMarker* marker);
393
394 /**
395 * Takes the current active set of markers and stores them for later use. Any current marker
396 * in the active set is removed from the active set and the targets remove function is called.
397 * These functions do not work as a stack so you cannot call save a second time before calling
398 * restore. Also, it is assumed that when restore is called the current active set of markers
399 * is empty. When the stored markers are added back into the active set, the targets add marker
400 * is called.
401 */
402 void saveActiveTraceMarkers();
403 void restoreActiveTraceMarkers();
commit-bot@chromium.orga3baf3b2014-02-21 18:45:30 +0000404
405 /**
bsalomon@google.come4617bf2013-04-03 14:56:40 +0000406 * Copies a pixel rectangle from one surface to another. This call may finalize
407 * reserved vertex/index data (as though a draw call was made). The src pixels
408 * copied are specified by srcRect. They are copied to a rect of the same
409 * size in dst with top left at dstPoint. If the src rect is clipped by the
410 * src bounds then pixel values in the dst rect corresponding to area clipped
411 * by the src rect are not overwritten. This method can fail and return false
412 * depending on the type of surface, configs, etc, and the backend-specific
413 * limitations. If rect is clipped out entirely by the src or dst bounds then
414 * true is returned since there is no actual copy necessary to succeed.
415 */
bsalomonf90a02b2014-11-26 12:28:00 -0800416 bool copySurface(GrSurface* dst,
417 GrSurface* src,
418 const SkIRect& srcRect,
419 const SkIPoint& dstPoint);
bsalomon@google.com116ad842013-04-09 15:38:19 +0000420 /**
bsalomonf90a02b2014-11-26 12:28:00 -0800421 * Function that determines whether a copySurface call would succeed without actually
bsalomon@google.com116ad842013-04-09 15:38:19 +0000422 * performing the copy.
423 */
bsalomonf90a02b2014-11-26 12:28:00 -0800424 bool canCopySurface(const GrSurface* dst,
425 const GrSurface* src,
426 const SkIRect& srcRect,
427 const SkIPoint& dstPoint);
bsalomon@google.comeb851172013-04-15 13:51:00 +0000428
429 /**
robertphillips@google.comff175842012-05-14 19:31:39 +0000430 * Release any resources that are cached but not currently in use. This
431 * is intended to give an application some recourse when resources are low.
432 */
433 virtual void purgeResources() {};
434
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000435 ////////////////////////////////////////////////////////////////////////////
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000436
commit-bot@chromium.orga0b40282013-09-18 13:00:55 +0000437 class AutoReleaseGeometry : public ::SkNoncopyable {
reed@google.comac10a2d2010-12-22 21:39:39 +0000438 public:
439 AutoReleaseGeometry(GrDrawTarget* target,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000440 int vertexCount,
joshualitt9853cce2014-11-17 14:22:48 -0800441 size_t vertexStride,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000442 int indexCount);
443 AutoReleaseGeometry();
444 ~AutoReleaseGeometry();
bsalomon@google.com5782d712011-01-21 21:03:59 +0000445 bool set(GrDrawTarget* target,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000446 int vertexCount,
joshualitt9853cce2014-11-17 14:22:48 -0800447 size_t vertexStride,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000448 int indexCount);
bsalomon49f085d2014-09-05 13:34:00 -0700449 bool succeeded() const { return SkToBool(fTarget); }
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000450 void* vertices() const { SkASSERT(this->succeeded()); return fVertices; }
451 void* indices() const { SkASSERT(this->succeeded()); return fIndices; }
commit-bot@chromium.org972f9cd2014-03-28 17:58:28 +0000452 SkPoint* positions() const {
453 return static_cast<SkPoint*>(this->vertices());
reed@google.comac10a2d2010-12-22 21:39:39 +0000454 }
455
456 private:
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000457 void reset();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000458
reed@google.comac10a2d2010-12-22 21:39:39 +0000459 GrDrawTarget* fTarget;
reed@google.comac10a2d2010-12-22 21:39:39 +0000460 void* fVertices;
461 void* fIndices;
462 };
463
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000464 ////////////////////////////////////////////////////////////////////////////
reed@google.comac10a2d2010-12-22 21:39:39 +0000465
commit-bot@chromium.orga0b40282013-09-18 13:00:55 +0000466 class AutoClipRestore : public ::SkNoncopyable {
reed@google.comac10a2d2010-12-22 21:39:39 +0000467 public:
468 AutoClipRestore(GrDrawTarget* target) {
469 fTarget = target;
470 fClip = fTarget->getClip();
471 }
472
bsalomon@google.com8d67c072012-12-13 20:38:14 +0000473 AutoClipRestore(GrDrawTarget* target, const SkIRect& newClip);
474
reed@google.comac10a2d2010-12-22 21:39:39 +0000475 ~AutoClipRestore() {
476 fTarget->setClip(fClip);
477 }
478 private:
bsalomon@google.com8d67c072012-12-13 20:38:14 +0000479 GrDrawTarget* fTarget;
480 const GrClipData* fClip;
481 SkTLazy<SkClipStack> fStack;
482 GrClipData fReplacementClip;
reed@google.comac10a2d2010-12-22 21:39:39 +0000483 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000484
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000485 ////////////////////////////////////////////////////////////////////////////
rmistry@google.comd6176b02012-08-23 18:14:13 +0000486
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000487 /**
488 * Saves the geometry src state at construction and restores in the destructor. It also saves
489 * and then restores the vertex attrib state.
490 */
commit-bot@chromium.orga0b40282013-09-18 13:00:55 +0000491 class AutoGeometryPush : public ::SkNoncopyable {
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000492 public:
joshualitt9853cce2014-11-17 14:22:48 -0800493 AutoGeometryPush(GrDrawTarget* target) {
bsalomon49f085d2014-09-05 13:34:00 -0700494 SkASSERT(target);
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000495 fTarget = target;
496 target->pushGeometrySource();
497 }
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000498
499 ~AutoGeometryPush() { fTarget->popGeometrySource(); }
500
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000501 private:
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000502 GrDrawTarget* fTarget;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000503 };
reed@google.comac10a2d2010-12-22 21:39:39 +0000504
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000505 ///////////////////////////////////////////////////////////////////////////
506 // Draw execution tracking (for font atlases and other resources)
507 class DrawToken {
508 public:
509 DrawToken(GrDrawTarget* drawTarget, uint32_t drawID) :
510 fDrawTarget(drawTarget), fDrawID(drawID) {}
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000511
bsalomon49f085d2014-09-05 13:34:00 -0700512 bool isIssued() { return fDrawTarget && fDrawTarget->isIssued(fDrawID); }
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000513
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000514 private:
515 GrDrawTarget* fDrawTarget;
516 uint32_t fDrawID; // this may wrap, but we're doing direct comparison
517 // so that should be okay
518 };
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000519
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000520 virtual DrawToken getCurrentDrawToken() { return DrawToken(this, 0); }
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000521
joshualitt3322fa42014-11-07 08:48:51 -0800522 /**
523 * Used to communicate draws to GPUs / subclasses
524 */
525 class DrawInfo {
526 public:
527 DrawInfo(const DrawInfo& di) { (*this) = di; }
528 DrawInfo& operator =(const DrawInfo& di);
529
530 GrPrimitiveType primitiveType() const { return fPrimitiveType; }
531 int startVertex() const { return fStartVertex; }
532 int startIndex() const { return fStartIndex; }
533 int vertexCount() const { return fVertexCount; }
534 int indexCount() const { return fIndexCount; }
535 int verticesPerInstance() const { return fVerticesPerInstance; }
536 int indicesPerInstance() const { return fIndicesPerInstance; }
537 int instanceCount() const { return fInstanceCount; }
538
539 bool isIndexed() const { return fIndexCount > 0; }
540#ifdef SK_DEBUG
541 bool isInstanced() const; // this version is longer because of asserts
542#else
543 bool isInstanced() const { return fInstanceCount > 0; }
544#endif
545
546 // adds or remove instances
547 void adjustInstanceCount(int instanceOffset);
548 // shifts the start vertex
549 void adjustStartVertex(int vertexOffset);
550 // shifts the start index
551 void adjustStartIndex(int indexOffset);
552
553 void setDevBounds(const SkRect& bounds) {
554 fDevBoundsStorage = bounds;
555 fDevBounds = &fDevBoundsStorage;
556 }
joshualitt7eb8c7b2014-11-18 14:24:27 -0800557 const GrVertexBuffer* vertexBuffer() const { return fVertexBuffer.get(); }
558 const GrIndexBuffer* indexBuffer() const { return fIndexBuffer.get(); }
559 void setVertexBuffer(const GrVertexBuffer* vb) {
560 fVertexBuffer.reset(vb);
561 }
562 void setIndexBuffer(const GrIndexBuffer* ib) {
563 fIndexBuffer.reset(ib);
564 }
joshualitt3322fa42014-11-07 08:48:51 -0800565 const SkRect* getDevBounds() const { return fDevBounds; }
566
joshualitt3322fa42014-11-07 08:48:51 -0800567 private:
568 DrawInfo() { fDevBounds = NULL; }
569
570 friend class GrDrawTarget;
571
572 GrPrimitiveType fPrimitiveType;
573
574 int fStartVertex;
575 int fStartIndex;
576 int fVertexCount;
577 int fIndexCount;
578
579 int fInstanceCount;
580 int fVerticesPerInstance;
581 int fIndicesPerInstance;
582
583 SkRect fDevBoundsStorage;
584 SkRect* fDevBounds;
585
joshualitt7eb8c7b2014-11-18 14:24:27 -0800586 GrPendingIOResource<const GrVertexBuffer, kRead_GrIOType> fVertexBuffer;
587 GrPendingIOResource<const GrIndexBuffer, kRead_GrIOType> fIndexBuffer;
joshualitt3322fa42014-11-07 08:48:51 -0800588 };
joshualitt2c93efe2014-11-06 12:57:13 -0800589
bsalomon371bcbc2014-12-01 08:19:34 -0800590 /**
591 * Used to populate the vertex and index buffer on the draw info before onDraw is called.
592 */
593 virtual void setDrawBuffers(DrawInfo*, size_t vertexStride) = 0;;
joshualitt2c93efe2014-11-06 12:57:13 -0800594 bool programUnitTest(int maxStages);
595
reed@google.comac10a2d2010-12-22 21:39:39 +0000596protected:
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000597 enum GeometrySrcType {
598 kNone_GeometrySrcType, //<! src has not been specified
599 kReserved_GeometrySrcType, //<! src was set using reserve*Space
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000600 kBuffer_GeometrySrcType //<! src was set using set*SourceToBuffer
601 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000602
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000603 struct GeometrySrcState {
604 GeometrySrcType fVertexSrc;
605 union {
606 // valid if src type is buffer
607 const GrVertexBuffer* fVertexBuffer;
608 // valid if src type is reserved or array
609 int fVertexCount;
610 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000611
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000612 GeometrySrcType fIndexSrc;
613 union {
614 // valid if src type is buffer
615 const GrIndexBuffer* fIndexBuffer;
616 // valid if src type is reserved or array
617 int fIndexCount;
618 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000619
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000620 size_t fVertexSize;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000621 };
bsalomon@google.com934c5702012-03-20 21:17:58 +0000622
623 int indexCountInCurrentSource() const {
624 const GeometrySrcState& src = this->getGeomSrc();
625 switch (src.fIndexSrc) {
626 case kNone_GeometrySrcType:
627 return 0;
628 case kReserved_GeometrySrcType:
bsalomon@google.com934c5702012-03-20 21:17:58 +0000629 return src.fIndexCount;
630 case kBuffer_GeometrySrcType:
commit-bot@chromium.org089a7802014-05-02 21:38:22 +0000631 return static_cast<int>(src.fIndexBuffer->gpuMemorySize() / sizeof(uint16_t));
bsalomon@google.com934c5702012-03-20 21:17:58 +0000632 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000633 SkFAIL("Unexpected Index Source.");
bsalomon@google.com934c5702012-03-20 21:17:58 +0000634 return 0;
635 }
636 }
bsalomon@google.coma47a48d2011-04-26 20:22:11 +0000637
bsalomon@google.com6e4e6502013-02-25 20:12:45 +0000638 GrContext* getContext() { return fContext; }
639 const GrContext* getContext() const { return fContext; }
640
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000641 // subclasses must call this in their destructors to ensure all vertex
642 // and index sources have been released (including those held by
643 // pushGeometrySource())
644 void releaseGeometry();
645
646 // accessors for derived classes
647 const GeometrySrcState& getGeomSrc() const { return fGeoSrcStateStack.back(); }
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000648 // it is preferable to call this rather than getGeomSrc()->fVertexSize because of the assert.
649 size_t getVertexSize() const {
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000650 // the vertex layout is only valid if a vertex source has been specified.
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000651 SkASSERT(this->getGeomSrc().fVertexSrc != kNone_GeometrySrcType);
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000652 return this->getGeomSrc().fVertexSize;
bsalomon@google.coma47a48d2011-04-26 20:22:11 +0000653 }
bsalomon@google.com5782d712011-01-21 21:03:59 +0000654
bsalomon@google.combcce8922013-03-25 15:38:39 +0000655 // Subclass must initialize this in its constructor.
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000656 SkAutoTUnref<const GrDrawTargetCaps> fCaps;
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000657
commit-bot@chromium.org2a05de02014-03-25 15:17:32 +0000658 const GrTraceMarkerSet& getActiveTraceMarkers() { return fActiveTraceMarkers; }
659
joshualitt65171342014-10-09 07:25:36 -0700660 // Makes a copy of the dst if it is necessary for the draw. Returns false if a copy is required
661 // but couldn't be made. Otherwise, returns true. This method needs to be protected because it
662 // needs to be accessed by GLPrograms to setup a correct drawstate
joshualitt9853cce2014-11-17 14:22:48 -0800663 bool setupDstReadIfNecessary(GrDrawState*,
664 GrDeviceCoordTexture* dstCopy,
665 const SkRect* drawBounds);
joshualitt65171342014-10-09 07:25:36 -0700666
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000667private:
bsalomonf90a02b2014-11-26 12:28:00 -0800668 /**
669 * This will be called before allocating a texture as a dst for copySurface. This function
670 * populates the dstDesc's config, flags, and origin so as to maximize efficiency and guarantee
671 * success of the copySurface call.
672 */
673 void initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* dstDesc) {
674 if (!this->onInitCopySurfaceDstDesc(src, dstDesc)) {
675 dstDesc->fOrigin = kDefault_GrSurfaceOrigin;
676 dstDesc->fFlags = kRenderTarget_GrSurfaceFlag | kNoStencil_GrSurfaceFlag;
677 dstDesc->fConfig = src->config();
678 }
679 }
680
681 /** Internal implementation of canCopySurface. */
682 bool internalCanCopySurface(const GrSurface* dst,
683 const GrSurface* src,
684 const SkIRect& clippedSrcRect,
685 const SkIPoint& clippedDstRect);
686
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000687 // A subclass can optionally overload this function to be notified before
688 // vertex and index space is reserved.
joshualitt9853cce2014-11-17 14:22:48 -0800689 virtual void willReserveVertexAndIndexSpace(int vertexCount,
690 size_t vertexStride,
691 int indexCount) {}
bsalomon@google.com97805382012-03-13 14:32:07 +0000692
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000693 // implemented by subclass to allocate space for reserved geom
jvanverth@google.coma6338982013-01-31 21:34:25 +0000694 virtual bool onReserveVertexSpace(size_t vertexSize, int vertexCount, void** vertices) = 0;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000695 virtual bool onReserveIndexSpace(int indexCount, void** indices) = 0;
696 // implemented by subclass to handle release of reserved geom space
697 virtual void releaseReservedVertexSpace() = 0;
698 virtual void releaseReservedIndexSpace() = 0;
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000699 // subclass overrides to be notified just before geo src state is pushed/popped.
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000700 virtual void geometrySourceWillPush() = 0;
701 virtual void geometrySourceWillPop(const GeometrySrcState& restoredState) = 0;
702 // subclass called to perform drawing
joshualitt9853cce2014-11-17 14:22:48 -0800703 virtual void onDraw(const GrDrawState&,
joshualitt56995b52014-12-11 15:44:02 -0800704 const GrGeometryProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800705 const DrawInfo&,
bsalomon3e791242014-12-17 13:43:13 -0800706 const GrScissorState&,
joshualitt9176e2c2014-11-20 07:28:52 -0800707 const GrDeviceCoordTexture* dstCopy) = 0;
joshualitt5478d422014-11-14 16:00:38 -0800708 // TODO copy in order drawbuffer onDrawRect to here
joshualitt9853cce2014-11-17 14:22:48 -0800709 virtual void onDrawRect(GrDrawState*,
joshualitt2e3b3e32014-12-09 13:31:14 -0800710 GrColor color,
joshualitt8059eb92014-12-29 15:10:07 -0800711 const SkMatrix& viewMatrix,
joshualitt9853cce2014-11-17 14:22:48 -0800712 const SkRect& rect,
commit-bot@chromium.orgfd03d4a2013-07-17 21:39:42 +0000713 const SkRect* localRect,
joshualitt5478d422014-11-14 16:00:38 -0800714 const SkMatrix* localMatrix) = 0;
commit-bot@chromium.org32184d82013-10-09 15:14:18 +0000715
joshualitt9853cce2014-11-17 14:22:48 -0800716 virtual void onStencilPath(const GrDrawState&,
joshualitt56995b52014-12-11 15:44:02 -0800717 const GrPathProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800718 const GrPath*,
bsalomon3e791242014-12-17 13:43:13 -0800719 const GrScissorState&,
joshualitt2c93efe2014-11-06 12:57:13 -0800720 const GrStencilSettings&) = 0;
joshualitt9853cce2014-11-17 14:22:48 -0800721 virtual void onDrawPath(const GrDrawState&,
joshualitt56995b52014-12-11 15:44:02 -0800722 const GrPathProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800723 const GrPath*,
bsalomon3e791242014-12-17 13:43:13 -0800724 const GrScissorState&,
joshualitt2c93efe2014-11-06 12:57:13 -0800725 const GrStencilSettings&,
commit-bot@chromium.orgc4dc0ad2013-10-09 14:11:33 +0000726 const GrDeviceCoordTexture* dstCopy) = 0;
joshualitt9853cce2014-11-17 14:22:48 -0800727 virtual void onDrawPaths(const GrDrawState&,
joshualitt56995b52014-12-11 15:44:02 -0800728 const GrPathProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800729 const GrPathRange*,
cdalton55b24af2014-11-25 11:00:56 -0800730 const void* indices,
731 PathIndexType,
732 const float transformValues[],
joshualitt2c93efe2014-11-06 12:57:13 -0800733 PathTransformType,
cdalton55b24af2014-11-25 11:00:56 -0800734 int count,
bsalomon3e791242014-12-17 13:43:13 -0800735 const GrScissorState&,
joshualitt2c93efe2014-11-06 12:57:13 -0800736 const GrStencilSettings&,
737 const GrDeviceCoordTexture*) = 0;
bsalomon@google.com64aef2b2012-06-11 15:36:13 +0000738
bsalomon63b21962014-11-05 07:05:34 -0800739 virtual void onClear(const SkIRect* rect, GrColor color, bool canIgnoreRect,
740 GrRenderTarget* renderTarget) = 0;
741
bsalomonf90a02b2014-11-26 12:28:00 -0800742 /** The subclass will get a chance to copy the surface for falling back to the default
743 implementation, which simply draws a rectangle (and fails if dst isn't a render target). It
744 should assume that any clipping has already been performed on the rect and point. It won't
745 be called if the copy can be skipped. */
746 virtual bool onCopySurface(GrSurface* dst,
747 GrSurface* src,
748 const SkIRect& srcRect,
749 const SkIPoint& dstPoint) = 0;
750
751 /** Indicates whether onCopySurface would succeed. It should assume that any clipping has
752 already been performed on the rect and point. It won't be called if the copy can be
753 skipped. */
754 virtual bool onCanCopySurface(const GrSurface* dst,
755 const GrSurface* src,
756 const SkIRect& srcRect,
757 const SkIPoint& dstPoint) = 0;
758 /**
759 * This will be called before allocating a texture to be a dst for onCopySurface. Only the
760 * dstDesc's config, flags, and origin need be set by the function. If the subclass cannot
761 * create a surface that would succeed its implementation of onCopySurface, it should return
762 * false. The base class will fall back to creating a render target to draw into using the src.
763 */
764 virtual bool onInitCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* dstDesc) = 0;
bsalomon63b21962014-11-05 07:05:34 -0800765
bsalomon@google.come3d70952012-03-13 12:40:53 +0000766 // helpers for reserving vertex and index space.
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000767 bool reserveVertexSpace(size_t vertexSize,
bsalomon@google.come3d70952012-03-13 12:40:53 +0000768 int vertexCount,
769 void** vertices);
770 bool reserveIndexSpace(int indexCount, void** indices);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000771
bsalomon@google.come8262622011-11-07 02:30:51 +0000772 // called by drawIndexed and drawNonIndexed. Use a negative indexCount to
773 // indicate non-indexed drawing.
joshualitt9853cce2014-11-17 14:22:48 -0800774 bool checkDraw(const GrDrawState&,
joshualitt56995b52014-12-11 15:44:02 -0800775 const GrGeometryProcessor*,
joshualitt9853cce2014-11-17 14:22:48 -0800776 GrPrimitiveType type,
777 int startVertex,
778 int startIndex,
779 int vertexCount,
bsalomon@google.come8262622011-11-07 02:30:51 +0000780 int indexCount) const;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000781 // called when setting a new vert/idx source to unref prev vb/ib
782 void releasePreviousVertexSource();
783 void releasePreviousIndexSource();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000784
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000785 // Check to see if this set of draw commands has been sent out
786 virtual bool isIssued(uint32_t drawID) { return true; }
joshualitt9853cce2014-11-17 14:22:48 -0800787 void getPathStencilSettingsForFilltype(GrPathRendering::FillType,
788 const GrStencilBuffer*,
789 GrStencilSettings*);
joshualitta7024152014-11-03 14:16:35 -0800790 virtual GrClipMaskManager* clipMaskManager() = 0;
joshualitt8059eb92014-12-29 15:10:07 -0800791 virtual bool setupClip(GrDrawState*,
joshualitt2c93efe2014-11-06 12:57:13 -0800792 GrDrawState::AutoRestoreEffects* are,
793 GrDrawState::AutoRestoreStencil* ars,
joshualitt8059eb92014-12-29 15:10:07 -0800794 GrScissorState* scissorState,
795 const SkRect* devBounds) = 0;
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000796
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000797 enum {
798 kPreallocGeoSrcStateStackCnt = 4,
reed@google.comac10a2d2010-12-22 21:39:39 +0000799 };
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000800 SkSTArray<kPreallocGeoSrcStateStackCnt, GeometrySrcState, true> fGeoSrcStateStack;
801 const GrClipData* fClip;
bsalomon@google.com6e4e6502013-02-25 20:12:45 +0000802 // The context owns us, not vice-versa, so this ptr is not ref'ed by DrawTarget.
803 GrContext* fContext;
commit-bot@chromium.org2a05de02014-03-25 15:17:32 +0000804 // To keep track that we always have at least as many debug marker adds as removes
805 int fGpuTraceMarkerCount;
806 GrTraceMarkerSet fActiveTraceMarkers;
egdaniel3eee3832014-06-18 13:09:11 -0700807 GrTraceMarkerSet fStoredTraceMarkers;
reed@google.comfa35e3d2012-06-26 20:16:17 +0000808
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +0000809 typedef SkRefCnt INHERITED;
reed@google.comac10a2d2010-12-22 21:39:39 +0000810};
811
joshualitt329bf482014-10-29 12:31:28 -0700812/*
813 * This class is JUST for clip mask manager. Everyone else should just use draw target above.
814 */
joshualitt6db519c2014-10-29 08:48:18 -0700815class GrClipTarget : public GrDrawTarget {
816public:
joshualitt329bf482014-10-29 12:31:28 -0700817 GrClipTarget(GrContext* context) : INHERITED(context) {
818 fClipMaskManager.setClipTarget(this);
819 }
820
821 /* Clip mask manager needs access to the context.
822 * TODO we only need a very small subset of context in the CMM.
823 */
824 GrContext* getContext() { return INHERITED::getContext(); }
825 const GrContext* getContext() const { return INHERITED::getContext(); }
826
joshualitt6db519c2014-10-29 08:48:18 -0700827 /**
828 * Clip Mask Manager(and no one else) needs to clear private stencil bits.
829 * ClipTarget subclass sets clip bit in the stencil buffer. The subclass
830 * is free to clear the remaining bits to zero if masked clears are more
831 * expensive than clearing all bits.
832 */
833 virtual void clearStencilClip(const SkIRect& rect, bool insideClip, GrRenderTarget* = NULL) = 0;
834
joshualitt3bdd7dc2014-10-31 08:27:39 -0700835 /**
836 * Release any resources that are cached but not currently in use. This
837 * is intended to give an application some recourse when resources are low.
838 */
mtklein72c9faa2015-01-09 10:06:39 -0800839 void purgeResources() SK_OVERRIDE {
joshualitt3bdd7dc2014-10-31 08:27:39 -0700840 // The clip mask manager can rebuild all its clip masks so just
841 // get rid of them all.
842 fClipMaskManager.purgeResources();
843 };
844
joshualitt329bf482014-10-29 12:31:28 -0700845protected:
846 GrClipMaskManager fClipMaskManager;
847
joshualitt6db519c2014-10-29 08:48:18 -0700848private:
tfarina912ed6e2014-12-14 15:20:10 -0800849 GrClipMaskManager* clipMaskManager() SK_OVERRIDE { return &fClipMaskManager; }
joshualitt329bf482014-10-29 12:31:28 -0700850
joshualitt8059eb92014-12-29 15:10:07 -0800851 virtual bool setupClip(GrDrawState*,
joshualitt2c93efe2014-11-06 12:57:13 -0800852 GrDrawState::AutoRestoreEffects* are,
853 GrDrawState::AutoRestoreStencil* ars,
joshualitt8059eb92014-12-29 15:10:07 -0800854 GrScissorState* scissorState,
855 const SkRect* devBounds) SK_OVERRIDE;
joshualitt2c93efe2014-11-06 12:57:13 -0800856
joshualitt6db519c2014-10-29 08:48:18 -0700857 typedef GrDrawTarget INHERITED;
858};
859
reed@google.comac10a2d2010-12-22 21:39:39 +0000860#endif