Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(502)

Side by Side Diff: src/gpu/GrInOrderDrawBuffer.h

Issue 773433002: Add a base class for GrIODB that handles geometry data (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: cleanup Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/GrFlushToGpuDrawTarget.cpp ('k') | src/gpu/GrInOrderDrawBuffer.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef GrInOrderDrawBuffer_DEFINED 8 #ifndef GrInOrderDrawBuffer_DEFINED
9 #define GrInOrderDrawBuffer_DEFINED 9 #define GrInOrderDrawBuffer_DEFINED
10 10
11 #include "GrDrawTarget.h" 11 #include "GrFlushToGpuDrawTarget.h"
12 #include "GrGpu.h"
13 #include "GrIndexBuffer.h"
14 #include "GrOptDrawState.h" 12 #include "GrOptDrawState.h"
15 #include "GrPath.h" 13 #include "GrPath.h"
16 #include "GrPathRange.h"
17 #include "GrRenderTarget.h"
18 #include "GrSurface.h"
19 #include "GrTRecorder.h" 14 #include "GrTRecorder.h"
20 #include "GrVertexBuffer.h"
21
22 #include "SkClipStack.h"
23 #include "SkTemplates.h"
24 #include "SkTypes.h"
25
26 class GrIndexBufferAllocPool;
27 class GrVertexBufferAllocPool;
28 15
29 /** 16 /**
30 * GrInOrderDrawBuffer is an implementation of GrDrawTarget that queues up draws for eventual 17 * GrInOrderDrawBuffer is an implementation of GrDrawTarget that queues up draws for eventual
31 * playback into a GrGpu. In theory one draw buffer could playback into another. When index or 18 * playback into a GrGpu. In theory one draw buffer could playback into another. When index or
32 * vertex buffers are used as geometry sources it is the callers the draw buffer only holds 19 * vertex buffers are used as geometry sources it is the callers the draw buffer only holds
33 * references to the buffers. It is the callers responsibility to ensure that th e data is still 20 * references to the buffers. It is the callers responsibility to ensure that th e data is still
34 * valid when the draw buffer is played back into a GrGpu. Similarly, it is the caller's 21 * valid when the draw buffer is played back into a GrGpu. Similarly, it is the caller's
35 * responsibility to ensure that all referenced textures, buffers, and render-ta rgets are associated 22 * responsibility to ensure that all referenced textures, buffers, and render-ta rgets are associated
36 * in the GrGpu object that the buffer is played back into. The buffer requires VB and IB pools to 23 * in the GrGpu object that the buffer is played back into. The buffer requires VB and IB pools to
37 * store geometry. 24 * store geometry.
38 */ 25 */
39 class GrInOrderDrawBuffer : public GrClipTarget { 26 class GrInOrderDrawBuffer : public GrFlushToGpuDrawTarget {
40 public: 27 public:
41 28
42 /** 29 /**
43 * Creates a GrInOrderDrawBuffer 30 * Creates a GrInOrderDrawBuffer
44 * 31 *
45 * @param gpu the gpu object that this draw buffer flushes to. 32 * @param gpu the gpu object that this draw buffer flushes to.
46 * @param vertexPool pool where vertices for queued draws will be saved when 33 * @param vertexPool pool where vertices for queued draws will be saved when
47 * the vertex source is either reserved or array. 34 * the vertex source is either reserved or array.
48 * @param indexPool pool where indices for queued draws will be saved when 35 * @param indexPool pool where indices for queued draws will be saved when
49 * the index source is either reserved or array. 36 * the index source is either reserved or array.
50 */ 37 */
51 GrInOrderDrawBuffer(GrGpu* gpu, 38 GrInOrderDrawBuffer(GrGpu* gpu,
52 GrVertexBufferAllocPool* vertexPool, 39 GrVertexBufferAllocPool* vertexPool,
53 GrIndexBufferAllocPool* indexPool); 40 GrIndexBufferAllocPool* indexPool);
54 41
55 ~GrInOrderDrawBuffer() SK_OVERRIDE; 42 ~GrInOrderDrawBuffer() SK_OVERRIDE;
56 43
57 /**
58 * Empties the draw buffer of any queued up draws. This must not be called w hile inside an
59 * unbalanced pushGeometrySource(). The current draw state and clip are pres erved.
60 */
61 void reset();
62
63 /**
64 * This plays the queued up draws to its GrGpu target. It also resets this o bject (i.e. flushing
65 * is destructive). This buffer must not have an active reserved vertex or i ndex source. Any
66 * reserved geometry on the target will be finalized because it's geometry s ource will be pushed
67 * before flushing and popped afterwards.
68 */
69 void flush();
70
71 // tracking for draws 44 // tracking for draws
72 DrawToken getCurrentDrawToken() { return DrawToken(this, fDrawID); } 45 DrawToken getCurrentDrawToken() { return DrawToken(this, fDrawID); }
73 46
74 // overrides from GrDrawTarget
75 bool geometryHints(size_t vertexStride,
76 int* vertexCount,
77 int* indexCount) const SK_OVERRIDE;
78
79 void clearStencilClip(const SkIRect& rect, 47 void clearStencilClip(const SkIRect& rect,
80 bool insideClip, 48 bool insideClip,
81 GrRenderTarget* renderTarget) SK_OVERRIDE; 49 GrRenderTarget* renderTarget) SK_OVERRIDE;
82 50
83 void discard(GrRenderTarget*) SK_OVERRIDE; 51 void discard(GrRenderTarget*) SK_OVERRIDE;
84 52
85 private: 53 private:
86 typedef GrClipMaskManager::ScissorState ScissorState; 54 typedef GrClipMaskManager::ScissorState ScissorState;
87 enum { 55 enum {
88 kDraw_Cmd = 1, 56 kDraw_Cmd = 1,
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 178
211 void execute(GrInOrderDrawBuffer*, const GrOptDrawState*) SK_OVERRIDE; 179 void execute(GrInOrderDrawBuffer*, const GrOptDrawState*) SK_OVERRIDE;
212 180
213 const GrOptDrawState fState; 181 const GrOptDrawState fState;
214 GrGpu::DrawType fDrawType; 182 GrGpu::DrawType fDrawType;
215 }; 183 };
216 184
217 typedef void* TCmdAlign; // This wouldn't be enough align if a command used long double. 185 typedef void* TCmdAlign; // This wouldn't be enough align if a command used long double.
218 typedef GrTRecorder<Cmd, TCmdAlign> CmdBuffer; 186 typedef GrTRecorder<Cmd, TCmdAlign> CmdBuffer;
219 187
188 void onReset() SK_OVERRIDE;
189 void onFlush() SK_OVERRIDE;
190
220 // overrides from GrDrawTarget 191 // overrides from GrDrawTarget
221 void onDraw(const GrDrawState&, 192 void onDraw(const GrDrawState&,
222 const DrawInfo&, 193 const DrawInfo&,
223 const ScissorState&, 194 const ScissorState&,
224 const GrDeviceCoordTexture* dstCopy) SK_OVERRIDE; 195 const GrDeviceCoordTexture* dstCopy) SK_OVERRIDE;
225 void onDrawRect(GrDrawState*, 196 void onDrawRect(GrDrawState*,
226 const SkRect& rect, 197 const SkRect& rect,
227 const SkRect* localRect, 198 const SkRect* localRect,
228 const SkMatrix* localMatrix) SK_OVERRIDE; 199 const SkMatrix* localMatrix) SK_OVERRIDE;
229 200
(...skipping 13 matching lines...) Expand all
243 const float transformValues[], 214 const float transformValues[],
244 PathTransformType, 215 PathTransformType,
245 int count, 216 int count,
246 const ScissorState&, 217 const ScissorState&,
247 const GrStencilSettings&, 218 const GrStencilSettings&,
248 const GrDeviceCoordTexture*) SK_OVERRIDE; 219 const GrDeviceCoordTexture*) SK_OVERRIDE;
249 void onClear(const SkIRect* rect, 220 void onClear(const SkIRect* rect,
250 GrColor color, 221 GrColor color,
251 bool canIgnoreRect, 222 bool canIgnoreRect,
252 GrRenderTarget* renderTarget) SK_OVERRIDE; 223 GrRenderTarget* renderTarget) SK_OVERRIDE;
253 void setDrawBuffers(DrawInfo*) SK_OVERRIDE;
254
255 bool onReserveVertexSpace(size_t vertexSize, int vertexCount, void** vertice s) SK_OVERRIDE;
256 bool onReserveIndexSpace(int indexCount, void** indices) SK_OVERRIDE;
257 void releaseReservedVertexSpace() SK_OVERRIDE;
258 void releaseReservedIndexSpace() SK_OVERRIDE;
259 void geometrySourceWillPush() SK_OVERRIDE;
260 void geometrySourceWillPop(const GeometrySrcState& restoredState) SK_OVERRID E;
261 void willReserveVertexAndIndexSpace(int vertexCount,
262 size_t vertexStride,
263 int indexCount) SK_OVERRIDE;
264 bool onCopySurface(GrSurface* dst, 224 bool onCopySurface(GrSurface* dst,
265 GrSurface* src, 225 GrSurface* src,
266 const SkIRect& srcRect, 226 const SkIRect& srcRect,
267 const SkIPoint& dstPoint) SK_OVERRIDE; 227 const SkIPoint& dstPoint) SK_OVERRIDE;
268 bool onCanCopySurface(const GrSurface* dst, 228 bool onCanCopySurface(const GrSurface* dst,
269 const GrSurface* src, 229 const GrSurface* src,
270 const SkIRect& srcRect, 230 const SkIRect& srcRect,
271 const SkIPoint& dstPoint) SK_OVERRIDE; 231 const SkIPoint& dstPoint) SK_OVERRIDE;
272 bool onInitCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* desc) SK_ OVERRIDE; 232 bool onInitCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* desc) SK_ OVERRIDE;
273 233
(...skipping 13 matching lines...) Expand all
287 // Records any trace markers for a command after adding it to the buffer. 247 // Records any trace markers for a command after adding it to the buffer.
288 void recordTraceMarkersIfNecessary(); 248 void recordTraceMarkersIfNecessary();
289 249
290 virtual bool isIssued(uint32_t drawID) { return drawID != fDrawID; } 250 virtual bool isIssued(uint32_t drawID) { return drawID != fDrawID; }
291 251
292 // TODO: Use a single allocator for commands and records 252 // TODO: Use a single allocator for commands and records
293 enum { 253 enum {
294 kCmdBufferInitialSizeInBytes = 8 * 1024, 254 kCmdBufferInitialSizeInBytes = 8 * 1024,
295 kPathIdxBufferMinReserve = 2 * 64, // 64 uint16_t's 255 kPathIdxBufferMinReserve = 2 * 64, // 64 uint16_t's
296 kPathXformBufferMinReserve = 2 * 64, // 64 two-float transforms 256 kPathXformBufferMinReserve = 2 * 64, // 64 two-float transforms
297 kGeoPoolStatePreAllocCnt = 4,
298 }; 257 };
299 258
300 struct GeometryPoolState {
301 const GrVertexBuffer* fPoolVertexBuffer;
302 int fPoolStartVertex;
303 const GrIndexBuffer* fPoolIndexBuffer;
304 int fPoolStartIndex;
305 // caller may conservatively over reserve vertices / indices.
306 // we release unused space back to allocator if possible
307 // can only do this if there isn't an intervening pushGeometrySource()
308 size_t fUsedPoolVertexBytes;
309 size_t fUsedPoolIndexBytes;
310 };
311
312 typedef SkSTArray<kGeoPoolStatePreAllocCnt, GeometryPoolState> GeoPoolStateS tack;
313
314 CmdBuffer fCmdBuffer; 259 CmdBuffer fCmdBuffer;
315 const GrOptDrawState* fPrevState; 260 const GrOptDrawState* fPrevState;
316 SkTArray<GrTraceMarkerSet, false> fGpuCmdMarkers; 261 SkTArray<GrTraceMarkerSet, false> fGpuCmdMarkers;
317 GrGpu* fDstGpu;
318 GrVertexBufferAllocPool& fVertexPool;
319 GrIndexBufferAllocPool& fIndexPool;
320 SkTDArray<char> fPathIndexBuffer; 262 SkTDArray<char> fPathIndexBuffer;
321 SkTDArray<float> fPathTransformBuffer; 263 SkTDArray<float> fPathTransformBuffer;
322 GeoPoolStateStack fGeoPoolStateStack;
323 bool fFlushing;
324 uint32_t fDrawID; 264 uint32_t fDrawID;
325 265
326 typedef GrClipTarget INHERITED; 266 typedef GrFlushToGpuDrawTarget INHERITED;
327 }; 267 };
328 268
329 #endif 269 #endif
OLDNEW
« no previous file with comments | « src/gpu/GrFlushToGpuDrawTarget.cpp ('k') | src/gpu/GrInOrderDrawBuffer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698