180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc. 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef GrInOrderDrawBuffer_DEFINED 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define GrInOrderDrawBuffer_DEFINED 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrDrawTarget.h" 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrAllocPool.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrAllocator.h" 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrPath.h" 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkClipStack.h" 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTemplates.h" 180a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "SkTypes.h" 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrGpu; 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrIndexBufferAllocPool; 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrVertexBufferAllocPool; 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** 25d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * GrInOrderDrawBuffer is an implementation of GrDrawTarget that queues up draws for eventual 26d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * playback into a GrGpu. In theory one draw buffer could playback into another. When index or 27d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * vertex buffers are used as geometry sources it is the callers the draw buffer only holds 28d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * references to the buffers. It is the callers responsibility to ensure that the data is still 29d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * valid when the draw buffer is played back into a GrGpu. Similarly, it is the caller's 30d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * responsibility to ensure that all referenced textures, buffers, and render-targets are associated 31d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * in the GrGpu object that the buffer is played back into. The buffer requires VB and IB pools to 32d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * store geometry. 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrInOrderDrawBuffer : public GrDrawTarget { 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Creates a GrInOrderDrawBuffer 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 40096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * @param gpu the gpu object that this draw buffer flushes to. 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * @param vertexPool pool where vertices for queued draws will be saved when 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * the vertex source is either reserved or array. 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * @param indexPool pool where indices for queued draws will be saved when 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * the index source is either reserved or array. 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 46096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger GrInOrderDrawBuffer(GrGpu* gpu, 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrVertexBufferAllocPool* vertexPool, 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrIndexBufferAllocPool* indexPool); 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual ~GrInOrderDrawBuffer(); 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 53d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * Empties the draw buffer of any queued up draws. This must not be called while inside an 54d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * unbalanced pushGeometrySource(). The current draw state and clip are preserved. 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void reset(); 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 59096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * This plays the queued up draws to its GrGpu target. It also resets this object (i.e. flushing 60d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * is destructive). This buffer must not have an active reserved vertex or index source. Any 61d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * reserved geometry on the target will be finalized because it's geometry source will be pushed 62d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger * before flushing and popped afterwards. 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 6458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger void flush(); 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 660a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger // tracking for draws 670a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger virtual DrawToken getCurrentDrawToken() { return DrawToken(this, fDrawID); } 680a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // overrides from GrDrawTarget 70096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger virtual bool geometryHints(int* vertexCount, 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int* indexCount) const SK_OVERRIDE; 7258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger virtual void clear(const SkIRect* rect, 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrColor color, 740a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger bool canIgnoreRect, 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrRenderTarget* renderTarget = NULL) SK_OVERRIDE; 767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger virtual void initCopySurfaceDstDesc(const GrSurface* src, GrTextureDesc* desc) SK_OVERRIDE; 787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 80d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger virtual void clipWillBeSet(const GrClipData* newClip) SK_OVERRIDE; 81d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru enum Cmd { 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kDraw_Cmd = 1, 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kStencilPath_Cmd = 2, 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kSetState_Cmd = 3, 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kSetClip_Cmd = 4, 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kClear_Cmd = 5, 897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kCopySurface_Cmd = 6, 900a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger kDrawPath_Cmd = 7, 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 93d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger class DrawRecord : public DrawInfo { 94d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger public: 95d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger DrawRecord(const DrawInfo& info) : DrawInfo(info) {} 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const GrVertexBuffer* fVertexBuffer; 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const GrIndexBuffer* fIndexBuffer; 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1000a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger struct StencilPath : public ::SkNoncopyable { 101363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger StencilPath(); 102363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAutoTUnref<const GrPath> fPath; 104363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPath::FillType fFill; 10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1070a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger struct DrawPath : public ::SkNoncopyable { 1080a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger DrawPath(); 1090a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 1100a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkAutoTUnref<const GrPath> fPath; 1110a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkPath::FillType fFill; 1120a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GrDeviceCoordTexture fDstCopy; 1130a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger }; 1140a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 1150a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger struct Clear : public ::SkNoncopyable { 11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Clear() : fRenderTarget(NULL) {} 1170a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger ~Clear() { SkSafeUnref(fRenderTarget); } 11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkIRect fRect; 12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrColor fColor; 1210a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger bool fCanIgnoreRect; 12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrRenderTarget* fRenderTarget; 12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1250a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger struct CopySurface : public ::SkNoncopyable { 1267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkAutoTUnref<GrSurface> fDst; 1277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkAutoTUnref<GrSurface> fSrc; 1287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkIRect fSrcRect; 1297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SkIPoint fDstPoint; 1307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger }; 1317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // overrides from GrDrawTarget 133d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger virtual void onDraw(const DrawInfo&) SK_OVERRIDE; 13458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger virtual void onDrawRect(const SkRect& rect, 1357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const SkMatrix* matrix, 13658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger const SkRect* localRect, 1377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const SkMatrix* localMatrix) SK_OVERRIDE; 1380a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 1390a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger virtual void onStencilPath(const GrPath*, SkPath::FillType) SK_OVERRIDE; 1400a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger virtual void onDrawPath(const GrPath*, SkPath::FillType, 1410a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger const GrDeviceCoordTexture* dstCopy) SK_OVERRIDE; 1420a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 143d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger virtual bool onReserveVertexSpace(size_t vertexSize, 14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int vertexCount, 14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void** vertices) SK_OVERRIDE; 14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual bool onReserveIndexSpace(int indexCount, 14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void** indices) SK_OVERRIDE; 14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void releaseReservedVertexSpace() SK_OVERRIDE; 14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void releaseReservedIndexSpace() SK_OVERRIDE; 15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void onSetVertexSourceToArray(const void* vertexArray, 15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int vertexCount) SK_OVERRIDE; 15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void onSetIndexSourceToArray(const void* indexArray, 15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int indexCount) SK_OVERRIDE; 15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void releaseVertexArray() SK_OVERRIDE; 15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void releaseIndexArray() SK_OVERRIDE; 15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void geometrySourceWillPush() SK_OVERRIDE; 157d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger virtual void geometrySourceWillPop(const GeometrySrcState& restoredState) SK_OVERRIDE; 158096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger virtual void willReserveVertexAndIndexSpace(int vertexCount, 159d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger int indexCount) SK_OVERRIDE; 1607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger virtual bool onCopySurface(GrSurface* dst, 1617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GrSurface* src, 1627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const SkIRect& srcRect, 1637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const SkIPoint& dstPoint) SK_OVERRIDE; 1647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger virtual bool onCanCopySurface(GrSurface* dst, 1657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GrSurface* src, 1667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const SkIRect& srcRect, 1677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const SkIPoint& dstPoint) SK_OVERRIDE; 1687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 169d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger bool quickInsideClip(const SkRect& devBounds); 17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 171d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger // Attempts to concat instances from info onto the previous draw. info must represent an 172d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger // instanced draw. The caller must have already recorded a new draw state and clip if necessary. 173d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger int concatInstancedDraw(const DrawInfo& info); 174d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 175d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger // we lazily record state and clip changes in order to skip clips and states that have no 176d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger // effect. 17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool needsNewState() const; 17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool needsNewClip() const; 17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // these functions record a command 18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void recordState(); 18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void recordClip(); 183d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger DrawRecord* recordDraw(const DrawInfo&); 18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru StencilPath* recordStencilPath(); 1850a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger DrawPath* recordDrawPath(); 18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Clear* recordClear(); 1877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger CopySurface* recordCopySurface(); 18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // TODO: Use a single allocator for commands and records 19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru enum { 19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kCmdPreallocCnt = 32, 19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kDrawPreallocCnt = 8, 19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kStencilPathPreallocCnt = 8, 1940a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger kDrawPathPreallocCnt = 8, 19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kStatePreallocCnt = 8, 19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kClipPreallocCnt = 8, 19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kClearPreallocCnt = 4, 19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kGeoPoolStatePreAllocCnt = 4, 1997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kCopySurfacePreallocCnt = 4, 20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 202d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkSTArray<kCmdPreallocCnt, uint8_t, true> fCmds; 203d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger GrSTAllocator<kDrawPreallocCnt, DrawRecord> fDraws; 204d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger GrSTAllocator<kStatePreallocCnt, StencilPath> fStencilPaths; 2050a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GrSTAllocator<kStatePreallocCnt, DrawPath> fDrawPaths; 206d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger GrSTAllocator<kStatePreallocCnt, GrDrawState::DeferredState> fStates; 207d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger GrSTAllocator<kClearPreallocCnt, Clear> fClears; 2087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GrSTAllocator<kCopySurfacePreallocCnt, CopySurface> fCopySurfaces; 2097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GrSTAllocator<kClipPreallocCnt, SkClipStack> fClips; 2107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GrSTAllocator<kClipPreallocCnt, SkIPoint> fClipOrigins; 21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 212096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger GrDrawTarget* fDstGpu; 21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool fClipSet; 21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 216d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger enum ClipProxyState { 217d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger kUnknown_ClipProxyState, 218d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger kValid_ClipProxyState, 219d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger kInvalid_ClipProxyState 220d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger }; 221d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger ClipProxyState fClipProxyState; 222d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkRect fClipProxy; 223d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrVertexBufferAllocPool& fVertexPool; 22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrIndexBufferAllocPool& fIndexPool; 22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru struct GeometryPoolState { 22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const GrVertexBuffer* fPoolVertexBuffer; 23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int fPoolStartVertex; 23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const GrIndexBuffer* fPoolIndexBuffer; 23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int fPoolStartIndex; 23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // caller may conservatively over reserve vertices / indices. 23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // we release unused space back to allocator if possible 23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // can only do this if there isn't an intervening pushGeometrySource() 23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru size_t fUsedPoolVertexBytes; 23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru size_t fUsedPoolIndexBytes; 23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkSTArray<kGeoPoolStatePreAllocCnt, GeometryPoolState> fGeoPoolStateStack; 24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2410a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger virtual bool isIssued(uint32_t drawID) { return drawID != fDrawID; } 2420a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool fFlushing; 2440a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger uint32_t fDrawID; 24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef GrDrawTarget INHERITED; 24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 250