blob: 0afbe66537d2d54b57c6413cd37dfe404b7e5a66 [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 /**
bsalomon@google.come3d70952012-03-13 12:40:53 +000071 * There are three types of "sources" of geometry (vertices and indices) for
72 * 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 *
87 * The three types of sources are:
88 *
89 * 1. A cpu array (set*SourceToArray). This is useful when the caller
90 * already provided vertex data in a format compatible with a
91 * GrVertexLayout. The data in the array is consumed at the time that
92 * set*SourceToArray is called and subsequent edits to the array will not
93 * be reflected in draws.
bsalomon@google.com1c13c962011-02-14 16:51:21 +000094 *
bsalomon@google.com25fb21f2011-06-21 18:17:25 +000095 * 2. Reserve. This is most useful when the caller has data it must
96 * transform before drawing and is not long-lived. The caller requests
97 * that the draw target make room for some amount of vertex and/or index
98 * data. The target provides ptrs to hold the vertex and/or index data.
99 *
rmistry@google.comd6176b02012-08-23 18:14:13 +0000100 * The data is writable up until the next drawIndexed, drawNonIndexed,
bsalomon@google.come4617bf2013-04-03 14:56:40 +0000101 * drawIndexedInstances, drawRect, copySurface, or pushGeometrySource. At
102 * this point the data is frozen and the ptrs are no longer valid.
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000103 *
bsalomon@google.come3d70952012-03-13 12:40:53 +0000104 * Where the space is allocated and how it is uploaded to the GPU is
105 * subclass-dependent.
106 *
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000107 * 3. Vertex and Index Buffers. This is most useful for geometry that will
bsalomon@google.come3d70952012-03-13 12:40:53 +0000108 * is long-lived. When the data in the buffer is consumed depends on the
rmistry@google.comd6176b02012-08-23 18:14:13 +0000109 * GrDrawTarget subclass. For deferred subclasses the caller has to
bsalomon@google.come3d70952012-03-13 12:40:53 +0000110 * guarantee that the data is still available in the buffers at playback.
111 * (TODO: Make this more automatic as we have done for read/write pixels)
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000112 *
113 * The size of each vertex is determined by querying the current GrDrawState.
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000114 */
115
116 /**
bsalomon@google.come3d70952012-03-13 12:40:53 +0000117 * Reserves space for vertices and/or indices. Zero can be specifed as
118 * either the vertex or index count if the caller desires to only reserve
rmistry@google.comd6176b02012-08-23 18:14:13 +0000119 * space for only indices or only vertices. If zero is specifed for
bsalomon@google.come3d70952012-03-13 12:40:53 +0000120 * vertexCount then the vertex source will be unmodified and likewise for
121 * indexCount.
reed@google.comac10a2d2010-12-22 21:39:39 +0000122 *
bsalomon@google.come3d70952012-03-13 12:40:53 +0000123 * If the function returns true then the reserve suceeded and the vertices
124 * and indices pointers will point to the space created.
reed@google.comac10a2d2010-12-22 21:39:39 +0000125 *
bsalomon@google.come3d70952012-03-13 12:40:53 +0000126 * If the target cannot make space for the request then this function will
127 * return false. If vertexCount was non-zero then upon failure the vertex
128 * source is reset and likewise for indexCount.
reed@google.comac10a2d2010-12-22 21:39:39 +0000129 *
bsalomon@google.come3d70952012-03-13 12:40:53 +0000130 * The pointers to the space allocated for vertices and indices remain valid
bsalomon@google.come4617bf2013-04-03 14:56:40 +0000131 * until a drawIndexed, drawNonIndexed, drawIndexedInstances, drawRect,
132 * copySurface, or push/popGeomtrySource is called. At that point logically a
133 * snapshot of the data is made and the pointers are invalid.
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000134 *
bsalomon@google.come3d70952012-03-13 12:40:53 +0000135 * @param vertexCount the number of vertices to reserve space for. Can be
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000136 * 0. Vertex size is queried from the current GrDrawState.
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000137 * @param indexCount the number of indices to reserve space for. Can be 0.
bsalomon@google.come3d70952012-03-13 12:40:53 +0000138 * @param vertices will point to reserved vertex space if vertexCount is
rmistry@google.comd6176b02012-08-23 18:14:13 +0000139 * non-zero. Illegal to pass NULL if vertexCount > 0.
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000140 * @param indices will point to reserved index space if indexCount is
141 * non-zero. Illegal to pass NULL if indexCount > 0.
142 */
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000143 bool reserveVertexAndIndexSpace(int vertexCount,
joshualitt9853cce2014-11-17 14:22:48 -0800144 size_t vertexStride,
bsalomon@google.com97805382012-03-13 14:32:07 +0000145 int indexCount,
146 void** vertices,
147 void** indices);
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000148
reed@google.comac10a2d2010-12-22 21:39:39 +0000149 /**
150 * Provides hints to caller about the number of vertices and indices
151 * that can be allocated cheaply. This can be useful if caller is reserving
152 * space but doesn't know exactly how much geometry is needed.
153 *
154 * Also may hint whether the draw target should be flushed first. This is
155 * useful for deferred targets.
156 *
reed@google.comac10a2d2010-12-22 21:39:39 +0000157 * @param vertexCount in: hint about how many vertices the caller would
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000158 * like to allocate. Vertex size is queried from the
159 * current GrDrawState.
reed@google.comac10a2d2010-12-22 21:39:39 +0000160 * out: a hint about the number of vertices that can be
161 * allocated cheaply. Negative means no hint.
162 * Ignored if NULL.
163 * @param indexCount in: hint about how many indices the caller would
164 * like to allocate.
165 * out: a hint about the number of indices that can be
166 * allocated cheaply. Negative means no hint.
167 * Ignored if NULL.
168 *
169 * @return true if target should be flushed based on the input values.
170 */
joshualitt9853cce2014-11-17 14:22:48 -0800171 virtual bool geometryHints(size_t vertexStride, int* vertexCount, int* indexCount) const;
reed@google.comac10a2d2010-12-22 21:39:39 +0000172
173 /**
reed@google.comac10a2d2010-12-22 21:39:39 +0000174 * Sets source of vertex data for the next draw. Data does not have to be
bsalomon@google.com934c5702012-03-20 21:17:58 +0000175 * in the buffer until drawIndexed, drawNonIndexed, or drawIndexedInstances.
reed@google.comac10a2d2010-12-22 21:39:39 +0000176 *
177 * @param buffer vertex buffer containing vertex data. Must be
skia.committer@gmail.comae683922013-02-06 07:01:54 +0000178 * unlocked before draw call. Vertex size is queried
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000179 * from current GrDrawState.
reed@google.comac10a2d2010-12-22 21:39:39 +0000180 */
joshualitt9853cce2014-11-17 14:22:48 -0800181 void setVertexSourceToBuffer(const GrVertexBuffer* buffer, size_t vertexStride);
reed@google.comac10a2d2010-12-22 21:39:39 +0000182
183 /**
184 * Sets source of index data for the next indexed draw. Data does not have
bsalomon@google.com934c5702012-03-20 21:17:58 +0000185 * to be in the buffer until drawIndexed.
reed@google.comac10a2d2010-12-22 21:39:39 +0000186 *
187 * @param buffer index buffer containing indices. Must be unlocked
188 * before indexed draw call.
189 */
190 void setIndexSourceToBuffer(const GrIndexBuffer* buffer);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000191
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000192 /**
193 * Resets vertex source. Drawing from reset vertices is illegal. Set vertex
194 * source to reserved, array, or buffer before next draw. May be able to free
195 * up temporary storage allocated by setVertexSourceToArray or
196 * reserveVertexSpace.
197 */
198 void resetVertexSource();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000199
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000200 /**
201 * Resets index source. Indexed Drawing from reset indices is illegal. Set
202 * index source to reserved, array, or buffer before next indexed draw. May
203 * be able to free up temporary storage allocated by setIndexSourceToArray
204 * or reserveIndexSpace.
205 */
bsalomon@google.com97805382012-03-13 14:32:07 +0000206 void resetIndexSource();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000207
bsalomon@google.com97805382012-03-13 14:32:07 +0000208 /**
209 * Query to find out if the vertex or index source is reserved.
210 */
211 bool hasReservedVerticesOrIndices() const {
bsalomon@google.com73d98aa2012-03-13 14:41:19 +0000212 return kReserved_GeometrySrcType == this->getGeomSrc().fVertexSrc ||
bsalomon@google.com97805382012-03-13 14:32:07 +0000213 kReserved_GeometrySrcType == this->getGeomSrc().fIndexSrc;
214 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000215
216 /**
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000217 * Pushes and resets the vertex/index sources. Any reserved vertex / index
218 * data is finalized (i.e. cannot be updated after the matching pop but can
219 * be drawn from). Must be balanced by a pop.
220 */
221 void pushGeometrySource();
222
223 /**
224 * Pops the vertex / index sources from the matching push.
225 */
226 void popGeometrySource();
bsalomon@google.com64aef2b2012-06-11 15:36:13 +0000227
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000228 /**
reed@google.comac10a2d2010-12-22 21:39:39 +0000229 * Draws indexed geometry using the current state and current vertex / index
230 * sources.
231 *
232 * @param type The type of primitives to draw.
233 * @param startVertex the vertex in the vertex array/buffer corresponding
234 * to index 0
235 * @param startIndex first index to read from index src.
236 * @param vertexCount one greater than the max index.
237 * @param indexCount the number of index elements to read. The index count
238 * is effectively trimmed to the last completely
239 * specified primitive.
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000240 * @param devBounds optional bounds hint. This is a promise from the caller,
241 * not a request for clipping.
reed@google.comac10a2d2010-12-22 21:39:39 +0000242 */
joshualitt9853cce2014-11-17 14:22:48 -0800243 void drawIndexed(GrDrawState*,
244 GrPrimitiveType type,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000245 int startVertex,
246 int startIndex,
247 int vertexCount,
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000248 int indexCount,
249 const SkRect* devBounds = NULL);
reed@google.comac10a2d2010-12-22 21:39:39 +0000250
251 /**
252 * Draws non-indexed geometry using the current state and current vertex
253 * sources.
254 *
255 * @param type The type of primitives to draw.
256 * @param startVertex the vertex in the vertex array/buffer corresponding
257 * to index 0
258 * @param vertexCount one greater than the max index.
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000259 * @param devBounds optional bounds hint. This is a promise from the caller,
260 * not a request for clipping.
reed@google.comac10a2d2010-12-22 21:39:39 +0000261 */
joshualitt9853cce2014-11-17 14:22:48 -0800262 void drawNonIndexed(GrDrawState*,
263 GrPrimitiveType type,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000264 int startVertex,
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000265 int vertexCount,
266 const SkRect* devBounds = NULL);
reed@google.comac10a2d2010-12-22 21:39:39 +0000267
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000268 /**
bsalomon@google.com64aef2b2012-06-11 15:36:13 +0000269 * Draws path into the stencil buffer. The fill must be either even/odd or
270 * winding (not inverse or hairline). It will respect the HW antialias flag
joshualitt92e496f2014-10-31 13:56:50 -0700271 * on the draw state (if possible in the 3D API). Note, we will never have an inverse fill
272 * with stencil path
bsalomon@google.com64aef2b2012-06-11 15:36:13 +0000273 */
joshualitt9853cce2014-11-17 14:22:48 -0800274 void stencilPath(GrDrawState*, const GrPath*, GrPathRendering::FillType fill);
bsalomon@google.com64aef2b2012-06-11 15:36:13 +0000275
276 /**
commit-bot@chromium.org32184d82013-10-09 15:14:18 +0000277 * Draws a path. Fill must not be a hairline. It will respect the HW
commit-bot@chromium.orgc4dc0ad2013-10-09 14:11:33 +0000278 * antialias flag on the draw state (if possible in the 3D API).
279 */
joshualitt9853cce2014-11-17 14:22:48 -0800280 void drawPath(GrDrawState*, const GrPath*, GrPathRendering::FillType fill);
commit-bot@chromium.orgc4dc0ad2013-10-09 14:11:33 +0000281
282 /**
cdalton55b24af2014-11-25 11:00:56 -0800283 * Draws the aggregate path from combining multiple. Note that this will not
284 * always be equivalent to back-to-back calls to drawPath(). It will respect
285 * the HW antialias flag on the draw state (if possible in the 3D API).
commit-bot@chromium.org9b62aa12014-03-25 11:59:40 +0000286 *
cdalton55b24af2014-11-25 11:00:56 -0800287 * @param pathRange Source paths to draw from
288 * @param indices Array of path indices to draw
289 * @param indexType Data type of the array elements in indexBuffer
290 * @param transformValues Array of transforms for the individual paths
291 * @param transformType Type of transforms in transformBuffer
292 * @param count Number of paths to draw
cdaltonb85a0aa2014-07-21 15:32:44 -0700293 * @param fill Fill type for drawing all the paths
commit-bot@chromium.org9b62aa12014-03-25 11:59:40 +0000294 */
joshualitt9853cce2014-11-17 14:22:48 -0800295 void drawPaths(GrDrawState*, const GrPathRange* pathRange,
cdalton55b24af2014-11-25 11:00:56 -0800296 const void* indices,
297 PathIndexType indexType,
298 const float transformValues[],
299 PathTransformType transformType,
joshualitt9853cce2014-11-17 14:22:48 -0800300 int count,
joshualitt92e496f2014-10-31 13:56:50 -0700301 GrPathRendering::FillType fill);
cdaltonb85a0aa2014-07-21 15:32:44 -0700302
commit-bot@chromium.org9b62aa12014-03-25 11:59:40 +0000303 /**
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000304 * Helper function for drawing rects. It performs a geometry src push and pop
305 * and thus will finalize any reserved geometry.
skia.committer@gmail.com044679e2013-02-15 07:16:57 +0000306 *
bsalomon@google.comc7818882013-03-20 19:19:53 +0000307 * @param rect the rect to draw
bsalomon@google.comc7818882013-03-20 19:19:53 +0000308 * @param localRect optional rect that specifies local coords to map onto
309 * rect. If NULL then rect serves as the local coords.
310 * @param localMatrix optional matrix applied to localRect. If
skia.committer@gmail.com044679e2013-02-15 07:16:57 +0000311 * srcRect is non-NULL and srcMatrix is non-NULL
312 * then srcRect will be transformed by srcMatrix.
jvanverth@google.com39768252013-02-14 15:25:44 +0000313 * srcMatrix can be NULL when no srcMatrix is desired.
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000314 */
joshualitt9853cce2014-11-17 14:22:48 -0800315 void drawRect(GrDrawState* ds,
316 const SkRect& rect,
commit-bot@chromium.orgfd03d4a2013-07-17 21:39:42 +0000317 const SkRect* localRect,
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000318 const SkMatrix* localMatrix) {
319 AutoGeometryPush agp(this);
joshualitt9853cce2014-11-17 14:22:48 -0800320 this->onDrawRect(ds, rect, localRect, localMatrix);
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000321 }
jvanverth@google.com39768252013-02-14 15:25:44 +0000322
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000323 /**
bsalomon@google.comc7818882013-03-20 19:19:53 +0000324 * Helper for drawRect when the caller doesn't need separate local rects or matrices.
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000325 */
joshualitt9853cce2014-11-17 14:22:48 -0800326 void drawSimpleRect(GrDrawState* ds, const SkRect& rect) {
327 this->drawRect(ds, rect, NULL, NULL);
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000328 }
joshualitt9853cce2014-11-17 14:22:48 -0800329 void drawSimpleRect(GrDrawState* ds, const SkIRect& irect) {
reed@google.com44699382013-10-31 17:28:30 +0000330 SkRect rect = SkRect::Make(irect);
joshualitt9853cce2014-11-17 14:22:48 -0800331 this->drawRect(ds, rect, NULL, NULL);
bsalomon@google.comcf939ae2012-12-13 19:59:23 +0000332 }
bsalomon@google.com86afc2a2011-02-16 16:12:19 +0000333
334 /**
bsalomon@google.com934c5702012-03-20 21:17:58 +0000335 * This call is used to draw multiple instances of some geometry with a
336 * given number of vertices (V) and indices (I) per-instance. The indices in
337 * the index source must have the form i[k+I] == i[k] + V. Also, all indices
338 * i[kI] ... i[(k+1)I-1] must be elements of the range kV ... (k+1)V-1. As a
339 * concrete example, the following index buffer for drawing a series of
340 * quads each as two triangles each satisfies these conditions with V=4 and
341 * I=6:
342 * (0,1,2,0,2,3, 4,5,6,4,6,7, 8,9,10,8,10,11, ...)
343 *
344 * The call assumes that the pattern of indices fills the entire index
345 * source. The size of the index buffer limits the number of instances that
346 * can be drawn by the GPU in a single draw. However, the caller may specify
347 * any (positive) number for instanceCount and if necessary multiple GPU
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000348 * draws will be issued. Moreover, when drawIndexedInstances is called
bsalomon@google.com934c5702012-03-20 21:17:58 +0000349 * multiple times it may be possible for GrDrawTarget to group them into a
350 * single GPU draw.
351 *
352 * @param type the type of primitives to draw
353 * @param instanceCount the number of instances to draw. Each instance
354 * consists of verticesPerInstance vertices indexed by
355 * indicesPerInstance indices drawn as the primitive
356 * type specified by type.
357 * @param verticesPerInstance The number of vertices in each instance (V
358 * in the above description).
359 * @param indicesPerInstance The number of indices in each instance (I
360 * in the above description).
bsalomon@google.comd62e88e2013-02-01 14:19:27 +0000361 * @param devBounds optional bounds hint. This is a promise from the caller,
362 * not a request for clipping.
bsalomon@google.com934c5702012-03-20 21:17:58 +0000363 */
joshualitt9853cce2014-11-17 14:22:48 -0800364 void drawIndexedInstances(GrDrawState*,
365 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 */
joshualitta7024152014-11-03 14:16:35 -0800416 virtual bool copySurface(GrSurface* dst,
417 GrSurface* src,
418 const SkIRect& srcRect,
419 const SkIPoint& dstPoint);
bsalomon@google.com116ad842013-04-09 15:38:19 +0000420 /**
421 * Function that determines whether a copySurface call would succeed without
422 * performing the copy.
423 */
joshualitt9853cce2014-11-17 14:22:48 -0800424 virtual bool canCopySurface(const GrSurface* dst,
425 const GrSurface* src,
joshualitta7024152014-11-03 14:16:35 -0800426 const SkIRect& srcRect,
427 const SkIPoint& dstPoint);
bsalomon@google.com0b335c12011-04-25 19:17:44 +0000428
robertphillips@google.comff175842012-05-14 19:31:39 +0000429 /**
bsalomon@google.comeb851172013-04-15 13:51:00 +0000430 * This is can be called before allocating a texture to be a dst for copySurface. It will
431 * populate the origin, config, and flags fields of the desc such that copySurface is more
432 * likely to succeed and be efficient.
433 */
bsalomonf2703d82014-10-28 14:33:06 -0700434 virtual void initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* desc);
bsalomon@google.comeb851172013-04-15 13:51:00 +0000435
436
437 /**
robertphillips@google.comff175842012-05-14 19:31:39 +0000438 * Release any resources that are cached but not currently in use. This
439 * is intended to give an application some recourse when resources are low.
440 */
441 virtual void purgeResources() {};
442
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000443 ////////////////////////////////////////////////////////////////////////////
bsalomon@google.com1c13c962011-02-14 16:51:21 +0000444
commit-bot@chromium.orga0b40282013-09-18 13:00:55 +0000445 class AutoReleaseGeometry : public ::SkNoncopyable {
reed@google.comac10a2d2010-12-22 21:39:39 +0000446 public:
447 AutoReleaseGeometry(GrDrawTarget* target,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000448 int vertexCount,
joshualitt9853cce2014-11-17 14:22:48 -0800449 size_t vertexStride,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000450 int indexCount);
451 AutoReleaseGeometry();
452 ~AutoReleaseGeometry();
bsalomon@google.com5782d712011-01-21 21:03:59 +0000453 bool set(GrDrawTarget* target,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000454 int vertexCount,
joshualitt9853cce2014-11-17 14:22:48 -0800455 size_t vertexStride,
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000456 int indexCount);
bsalomon49f085d2014-09-05 13:34:00 -0700457 bool succeeded() const { return SkToBool(fTarget); }
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000458 void* vertices() const { SkASSERT(this->succeeded()); return fVertices; }
459 void* indices() const { SkASSERT(this->succeeded()); return fIndices; }
commit-bot@chromium.org972f9cd2014-03-28 17:58:28 +0000460 SkPoint* positions() const {
461 return static_cast<SkPoint*>(this->vertices());
reed@google.comac10a2d2010-12-22 21:39:39 +0000462 }
463
464 private:
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000465 void reset();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000466
reed@google.comac10a2d2010-12-22 21:39:39 +0000467 GrDrawTarget* fTarget;
reed@google.comac10a2d2010-12-22 21:39:39 +0000468 void* fVertices;
469 void* fIndices;
470 };
471
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000472 ////////////////////////////////////////////////////////////////////////////
reed@google.comac10a2d2010-12-22 21:39:39 +0000473
commit-bot@chromium.orga0b40282013-09-18 13:00:55 +0000474 class AutoClipRestore : public ::SkNoncopyable {
reed@google.comac10a2d2010-12-22 21:39:39 +0000475 public:
476 AutoClipRestore(GrDrawTarget* target) {
477 fTarget = target;
478 fClip = fTarget->getClip();
479 }
480
bsalomon@google.com8d67c072012-12-13 20:38:14 +0000481 AutoClipRestore(GrDrawTarget* target, const SkIRect& newClip);
482
reed@google.comac10a2d2010-12-22 21:39:39 +0000483 ~AutoClipRestore() {
484 fTarget->setClip(fClip);
485 }
486 private:
bsalomon@google.com8d67c072012-12-13 20:38:14 +0000487 GrDrawTarget* fTarget;
488 const GrClipData* fClip;
489 SkTLazy<SkClipStack> fStack;
490 GrClipData fReplacementClip;
reed@google.comac10a2d2010-12-22 21:39:39 +0000491 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000492
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000493 ////////////////////////////////////////////////////////////////////////////
rmistry@google.comd6176b02012-08-23 18:14:13 +0000494
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000495 /**
496 * Saves the geometry src state at construction and restores in the destructor. It also saves
497 * and then restores the vertex attrib state.
498 */
commit-bot@chromium.orga0b40282013-09-18 13:00:55 +0000499 class AutoGeometryPush : public ::SkNoncopyable {
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000500 public:
joshualitt9853cce2014-11-17 14:22:48 -0800501 AutoGeometryPush(GrDrawTarget* target) {
bsalomon49f085d2014-09-05 13:34:00 -0700502 SkASSERT(target);
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000503 fTarget = target;
504 target->pushGeometrySource();
505 }
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000506
507 ~AutoGeometryPush() { fTarget->popGeometrySource(); }
508
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000509 private:
bsalomon@google.com0406b9e2013-04-02 21:00:15 +0000510 GrDrawTarget* fTarget;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000511 };
reed@google.comac10a2d2010-12-22 21:39:39 +0000512
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000513 ///////////////////////////////////////////////////////////////////////////
514 // Draw execution tracking (for font atlases and other resources)
515 class DrawToken {
516 public:
517 DrawToken(GrDrawTarget* drawTarget, uint32_t drawID) :
518 fDrawTarget(drawTarget), fDrawID(drawID) {}
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000519
bsalomon49f085d2014-09-05 13:34:00 -0700520 bool isIssued() { return fDrawTarget && fDrawTarget->isIssued(fDrawID); }
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000521
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000522 private:
523 GrDrawTarget* fDrawTarget;
524 uint32_t fDrawID; // this may wrap, but we're doing direct comparison
525 // so that should be okay
526 };
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000527
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000528 virtual DrawToken getCurrentDrawToken() { return DrawToken(this, 0); }
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000529
joshualitt3322fa42014-11-07 08:48:51 -0800530 /**
531 * Used to communicate draws to GPUs / subclasses
532 */
533 class DrawInfo {
534 public:
535 DrawInfo(const DrawInfo& di) { (*this) = di; }
536 DrawInfo& operator =(const DrawInfo& di);
537
538 GrPrimitiveType primitiveType() const { return fPrimitiveType; }
539 int startVertex() const { return fStartVertex; }
540 int startIndex() const { return fStartIndex; }
541 int vertexCount() const { return fVertexCount; }
542 int indexCount() const { return fIndexCount; }
543 int verticesPerInstance() const { return fVerticesPerInstance; }
544 int indicesPerInstance() const { return fIndicesPerInstance; }
545 int instanceCount() const { return fInstanceCount; }
546
547 bool isIndexed() const { return fIndexCount > 0; }
548#ifdef SK_DEBUG
549 bool isInstanced() const; // this version is longer because of asserts
550#else
551 bool isInstanced() const { return fInstanceCount > 0; }
552#endif
553
554 // adds or remove instances
555 void adjustInstanceCount(int instanceOffset);
556 // shifts the start vertex
557 void adjustStartVertex(int vertexOffset);
558 // shifts the start index
559 void adjustStartIndex(int indexOffset);
560
561 void setDevBounds(const SkRect& bounds) {
562 fDevBoundsStorage = bounds;
563 fDevBounds = &fDevBoundsStorage;
564 }
joshualitt7eb8c7b2014-11-18 14:24:27 -0800565 const GrVertexBuffer* vertexBuffer() const { return fVertexBuffer.get(); }
566 const GrIndexBuffer* indexBuffer() const { return fIndexBuffer.get(); }
567 void setVertexBuffer(const GrVertexBuffer* vb) {
568 fVertexBuffer.reset(vb);
569 }
570 void setIndexBuffer(const GrIndexBuffer* ib) {
571 fIndexBuffer.reset(ib);
572 }
joshualitt3322fa42014-11-07 08:48:51 -0800573 const SkRect* getDevBounds() const { return fDevBounds; }
574
joshualitt3322fa42014-11-07 08:48:51 -0800575 private:
576 DrawInfo() { fDevBounds = NULL; }
577
578 friend class GrDrawTarget;
579
580 GrPrimitiveType fPrimitiveType;
581
582 int fStartVertex;
583 int fStartIndex;
584 int fVertexCount;
585 int fIndexCount;
586
587 int fInstanceCount;
588 int fVerticesPerInstance;
589 int fIndicesPerInstance;
590
591 SkRect fDevBoundsStorage;
592 SkRect* fDevBounds;
593
joshualitt7eb8c7b2014-11-18 14:24:27 -0800594 GrPendingIOResource<const GrVertexBuffer, kRead_GrIOType> fVertexBuffer;
595 GrPendingIOResource<const GrIndexBuffer, kRead_GrIOType> fIndexBuffer;
joshualitt3322fa42014-11-07 08:48:51 -0800596 };
joshualitt2c93efe2014-11-06 12:57:13 -0800597
joshualitt7eb8c7b2014-11-18 14:24:27 -0800598 virtual void setDrawBuffers(DrawInfo*) = 0;;
joshualitt2c93efe2014-11-06 12:57:13 -0800599 bool programUnitTest(int maxStages);
600
reed@google.comac10a2d2010-12-22 21:39:39 +0000601protected:
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000602 enum GeometrySrcType {
603 kNone_GeometrySrcType, //<! src has not been specified
604 kReserved_GeometrySrcType, //<! src was set using reserve*Space
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000605 kBuffer_GeometrySrcType //<! src was set using set*SourceToBuffer
606 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000607
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000608 struct GeometrySrcState {
609 GeometrySrcType fVertexSrc;
610 union {
611 // valid if src type is buffer
612 const GrVertexBuffer* fVertexBuffer;
613 // valid if src type is reserved or array
614 int fVertexCount;
615 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000616
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000617 GeometrySrcType fIndexSrc;
618 union {
619 // valid if src type is buffer
620 const GrIndexBuffer* fIndexBuffer;
621 // valid if src type is reserved or array
622 int fIndexCount;
623 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000624
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000625 size_t fVertexSize;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000626 };
bsalomon@google.com934c5702012-03-20 21:17:58 +0000627
628 int indexCountInCurrentSource() const {
629 const GeometrySrcState& src = this->getGeomSrc();
630 switch (src.fIndexSrc) {
631 case kNone_GeometrySrcType:
632 return 0;
633 case kReserved_GeometrySrcType:
bsalomon@google.com934c5702012-03-20 21:17:58 +0000634 return src.fIndexCount;
635 case kBuffer_GeometrySrcType:
commit-bot@chromium.org089a7802014-05-02 21:38:22 +0000636 return static_cast<int>(src.fIndexBuffer->gpuMemorySize() / sizeof(uint16_t));
bsalomon@google.com934c5702012-03-20 21:17:58 +0000637 default:
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000638 SkFAIL("Unexpected Index Source.");
bsalomon@google.com934c5702012-03-20 21:17:58 +0000639 return 0;
640 }
641 }
bsalomon@google.coma47a48d2011-04-26 20:22:11 +0000642
bsalomon@google.com6e4e6502013-02-25 20:12:45 +0000643 GrContext* getContext() { return fContext; }
644 const GrContext* getContext() const { return fContext; }
645
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000646 // subclasses must call this in their destructors to ensure all vertex
647 // and index sources have been released (including those held by
648 // pushGeometrySource())
649 void releaseGeometry();
650
651 // accessors for derived classes
652 const GeometrySrcState& getGeomSrc() const { return fGeoSrcStateStack.back(); }
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000653 // it is preferable to call this rather than getGeomSrc()->fVertexSize because of the assert.
654 size_t getVertexSize() const {
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000655 // the vertex layout is only valid if a vertex source has been specified.
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000656 SkASSERT(this->getGeomSrc().fVertexSrc != kNone_GeometrySrcType);
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000657 return this->getGeomSrc().fVertexSize;
bsalomon@google.coma47a48d2011-04-26 20:22:11 +0000658 }
bsalomon@google.com5782d712011-01-21 21:03:59 +0000659
bsalomon@google.combcce8922013-03-25 15:38:39 +0000660 // Subclass must initialize this in its constructor.
bsalomon@google.comc26d94f2013-03-25 18:19:00 +0000661 SkAutoTUnref<const GrDrawTargetCaps> fCaps;
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000662
commit-bot@chromium.org2a05de02014-03-25 15:17:32 +0000663 const GrTraceMarkerSet& getActiveTraceMarkers() { return fActiveTraceMarkers; }
664
joshualitt65171342014-10-09 07:25:36 -0700665 // Makes a copy of the dst if it is necessary for the draw. Returns false if a copy is required
666 // but couldn't be made. Otherwise, returns true. This method needs to be protected because it
667 // needs to be accessed by GLPrograms to setup a correct drawstate
joshualitt9853cce2014-11-17 14:22:48 -0800668 bool setupDstReadIfNecessary(GrDrawState*,
669 GrDeviceCoordTexture* dstCopy,
670 const SkRect* drawBounds);
joshualitt65171342014-10-09 07:25:36 -0700671
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000672private:
673 // A subclass can optionally overload this function to be notified before
674 // vertex and index space is reserved.
joshualitt9853cce2014-11-17 14:22:48 -0800675 virtual void willReserveVertexAndIndexSpace(int vertexCount,
676 size_t vertexStride,
677 int indexCount) {}
bsalomon@google.com97805382012-03-13 14:32:07 +0000678
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000679 // implemented by subclass to allocate space for reserved geom
jvanverth@google.coma6338982013-01-31 21:34:25 +0000680 virtual bool onReserveVertexSpace(size_t vertexSize, int vertexCount, void** vertices) = 0;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000681 virtual bool onReserveIndexSpace(int indexCount, void** indices) = 0;
682 // implemented by subclass to handle release of reserved geom space
683 virtual void releaseReservedVertexSpace() = 0;
684 virtual void releaseReservedIndexSpace() = 0;
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000685 // subclass overrides to be notified just before geo src state is pushed/popped.
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000686 virtual void geometrySourceWillPush() = 0;
687 virtual void geometrySourceWillPop(const GeometrySrcState& restoredState) = 0;
688 // subclass called to perform drawing
joshualitt9853cce2014-11-17 14:22:48 -0800689 virtual void onDraw(const GrDrawState&,
690 const DrawInfo&,
joshualitt9176e2c2014-11-20 07:28:52 -0800691 const GrClipMaskManager::ScissorState&,
692 const GrDeviceCoordTexture* dstCopy) = 0;
joshualitt5478d422014-11-14 16:00:38 -0800693 // TODO copy in order drawbuffer onDrawRect to here
joshualitt9853cce2014-11-17 14:22:48 -0800694 virtual void onDrawRect(GrDrawState*,
695 const SkRect& rect,
commit-bot@chromium.orgfd03d4a2013-07-17 21:39:42 +0000696 const SkRect* localRect,
joshualitt5478d422014-11-14 16:00:38 -0800697 const SkMatrix* localMatrix) = 0;
commit-bot@chromium.org32184d82013-10-09 15:14:18 +0000698
joshualitt9853cce2014-11-17 14:22:48 -0800699 virtual void onStencilPath(const GrDrawState&,
700 const GrPath*,
joshualitt2c93efe2014-11-06 12:57:13 -0800701 const GrClipMaskManager::ScissorState&,
702 const GrStencilSettings&) = 0;
joshualitt9853cce2014-11-17 14:22:48 -0800703 virtual void onDrawPath(const GrDrawState&,
704 const GrPath*,
joshualitt2c93efe2014-11-06 12:57:13 -0800705 const GrClipMaskManager::ScissorState&,
706 const GrStencilSettings&,
commit-bot@chromium.orgc4dc0ad2013-10-09 14:11:33 +0000707 const GrDeviceCoordTexture* dstCopy) = 0;
joshualitt9853cce2014-11-17 14:22:48 -0800708 virtual void onDrawPaths(const GrDrawState&,
709 const GrPathRange*,
cdalton55b24af2014-11-25 11:00:56 -0800710 const void* indices,
711 PathIndexType,
712 const float transformValues[],
joshualitt2c93efe2014-11-06 12:57:13 -0800713 PathTransformType,
cdalton55b24af2014-11-25 11:00:56 -0800714 int count,
joshualitt2c93efe2014-11-06 12:57:13 -0800715 const GrClipMaskManager::ScissorState&,
716 const GrStencilSettings&,
717 const GrDeviceCoordTexture*) = 0;
bsalomon@google.com64aef2b2012-06-11 15:36:13 +0000718
bsalomon63b21962014-11-05 07:05:34 -0800719 virtual void onClear(const SkIRect* rect, GrColor color, bool canIgnoreRect,
720 GrRenderTarget* renderTarget) = 0;
721
722
bsalomon@google.come3d70952012-03-13 12:40:53 +0000723 // helpers for reserving vertex and index space.
jvanverth@google.comb75b0a02013-02-05 20:33:30 +0000724 bool reserveVertexSpace(size_t vertexSize,
bsalomon@google.come3d70952012-03-13 12:40:53 +0000725 int vertexCount,
726 void** vertices);
727 bool reserveIndexSpace(int indexCount, void** indices);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000728
bsalomon@google.come8262622011-11-07 02:30:51 +0000729 // called by drawIndexed and drawNonIndexed. Use a negative indexCount to
730 // indicate non-indexed drawing.
joshualitt9853cce2014-11-17 14:22:48 -0800731 bool checkDraw(const GrDrawState&,
732 GrPrimitiveType type,
733 int startVertex,
734 int startIndex,
735 int vertexCount,
bsalomon@google.come8262622011-11-07 02:30:51 +0000736 int indexCount) const;
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000737 // called when setting a new vert/idx source to unref prev vb/ib
738 void releasePreviousVertexSource();
739 void releasePreviousIndexSource();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000740
commit-bot@chromium.orga8916ff2013-08-16 15:53:46 +0000741 // Check to see if this set of draw commands has been sent out
742 virtual bool isIssued(uint32_t drawID) { return true; }
joshualitt9853cce2014-11-17 14:22:48 -0800743 void getPathStencilSettingsForFilltype(GrPathRendering::FillType,
744 const GrStencilBuffer*,
745 GrStencilSettings*);
joshualitta7024152014-11-03 14:16:35 -0800746 virtual GrClipMaskManager* clipMaskManager() = 0;
joshualitt2c93efe2014-11-06 12:57:13 -0800747 virtual bool setupClip(const SkRect* devBounds,
748 GrDrawState::AutoRestoreEffects* are,
749 GrDrawState::AutoRestoreStencil* ars,
joshualitt9853cce2014-11-17 14:22:48 -0800750 GrDrawState*,
joshualitt2c93efe2014-11-06 12:57:13 -0800751 GrClipMaskManager::ScissorState* scissorState) = 0;
skia.committer@gmail.com74758112013-08-17 07:01:54 +0000752
bsalomon@google.com25fb21f2011-06-21 18:17:25 +0000753 enum {
754 kPreallocGeoSrcStateStackCnt = 4,
reed@google.comac10a2d2010-12-22 21:39:39 +0000755 };
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000756 SkSTArray<kPreallocGeoSrcStateStackCnt, GeometrySrcState, true> fGeoSrcStateStack;
757 const GrClipData* fClip;
bsalomon@google.com6e4e6502013-02-25 20:12:45 +0000758 // The context owns us, not vice-versa, so this ptr is not ref'ed by DrawTarget.
759 GrContext* fContext;
commit-bot@chromium.org2a05de02014-03-25 15:17:32 +0000760 // To keep track that we always have at least as many debug marker adds as removes
761 int fGpuTraceMarkerCount;
762 GrTraceMarkerSet fActiveTraceMarkers;
egdaniel3eee3832014-06-18 13:09:11 -0700763 GrTraceMarkerSet fStoredTraceMarkers;
reed@google.comfa35e3d2012-06-26 20:16:17 +0000764
commit-bot@chromium.orga4de8c22013-09-09 13:38:37 +0000765 typedef SkRefCnt INHERITED;
reed@google.comac10a2d2010-12-22 21:39:39 +0000766};
767
joshualitt329bf482014-10-29 12:31:28 -0700768/*
769 * This class is JUST for clip mask manager. Everyone else should just use draw target above.
770 */
joshualitt6db519c2014-10-29 08:48:18 -0700771class GrClipTarget : public GrDrawTarget {
772public:
joshualitt329bf482014-10-29 12:31:28 -0700773 GrClipTarget(GrContext* context) : INHERITED(context) {
774 fClipMaskManager.setClipTarget(this);
775 }
776
777 /* Clip mask manager needs access to the context.
778 * TODO we only need a very small subset of context in the CMM.
779 */
780 GrContext* getContext() { return INHERITED::getContext(); }
781 const GrContext* getContext() const { return INHERITED::getContext(); }
782
joshualitt6db519c2014-10-29 08:48:18 -0700783 /**
784 * Clip Mask Manager(and no one else) needs to clear private stencil bits.
785 * ClipTarget subclass sets clip bit in the stencil buffer. The subclass
786 * is free to clear the remaining bits to zero if masked clears are more
787 * expensive than clearing all bits.
788 */
789 virtual void clearStencilClip(const SkIRect& rect, bool insideClip, GrRenderTarget* = NULL) = 0;
790
joshualitt3bdd7dc2014-10-31 08:27:39 -0700791 /**
792 * Release any resources that are cached but not currently in use. This
793 * is intended to give an application some recourse when resources are low.
794 */
795 virtual void purgeResources() SK_OVERRIDE {
796 // The clip mask manager can rebuild all its clip masks so just
797 // get rid of them all.
798 fClipMaskManager.purgeResources();
799 };
800
joshualitt329bf482014-10-29 12:31:28 -0700801protected:
802 GrClipMaskManager fClipMaskManager;
803
joshualitt6db519c2014-10-29 08:48:18 -0700804private:
joshualitta7024152014-11-03 14:16:35 -0800805 GrClipMaskManager* clipMaskManager() { return &fClipMaskManager; }
joshualitt329bf482014-10-29 12:31:28 -0700806
joshualitt2c93efe2014-11-06 12:57:13 -0800807 virtual bool setupClip(const SkRect* devBounds,
808 GrDrawState::AutoRestoreEffects* are,
809 GrDrawState::AutoRestoreStencil* ars,
joshualitt9853cce2014-11-17 14:22:48 -0800810 GrDrawState*,
joshualitt2c93efe2014-11-06 12:57:13 -0800811 GrClipMaskManager::ScissorState* scissorState) SK_OVERRIDE;
812
joshualitt6db519c2014-10-29 08:48:18 -0700813 typedef GrDrawTarget INHERITED;
814};
815
reed@google.comac10a2d2010-12-22 21:39:39 +0000816#endif