| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |