105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#ifndef GrInOrderDrawBuffer_DEFINED 1205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define GrInOrderDrawBuffer_DEFINED 1305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 1405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrDrawTarget.h" 1505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrAllocPool.h" 1605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrAllocator.h" 1705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrClip.h" 1805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrGpu; 2005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass GrIndexBufferAllocPool; 211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrVertexBufferAllocPool; 2205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/** 2405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * GrInOrderDrawBuffer is an implementation of GrDrawTarget that queues up 2505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * draws for eventual playback into a GrGpu. In theory one draw buffer could 2605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * playback into another. When index or vertex buffers are used as geometry 2705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * sources it is the callers the draw buffer only holds references to the 2805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * buffers. It is the callers responsibility to ensure that the data is still 2905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * valid when the draw buffer is played back into a GrGpu. Similarly, it is the 3005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * caller's responsibility to ensure that all referenced textures, buffers, 3105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * and rendertargets are associated in the GrGpu object that the buffer is 3205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * played back into. The buffer requires VB and IB pools to store geometry. 3305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 3405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 3505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass GrInOrderDrawBuffer : public GrDrawTarget { 3605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic: 3705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 3805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 3905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Creates a GrInOrderDrawBuffer 4005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * @param gpu the gpu object where this will be played back 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * (possible indirectly). GrResources used with the draw 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * buffer are created by this gpu object. 4405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param vertexPool pool where vertices for queued draws will be saved when 4505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * the vertex source is either reserved or array. 4605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param indexPool pool where indices for queued draws will be saved when 4705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * the index source is either reserved or array. 4805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrInOrderDrawBuffer(const GrGpu* gpu, 501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrVertexBufferAllocPool* vertexPool, 5105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger GrIndexBufferAllocPool* indexPool); 5205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 5305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger virtual ~GrInOrderDrawBuffer(); 5405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 5505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 5605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Copies the draw state and clip from target to this draw buffer. 5705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 5805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param target the target whose clip and state should be copied. 5905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 6005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void initializeDrawStateAndClip(const GrDrawTarget& target); 6105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 6205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 6305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Provides the buffer with an index buffer that can be used for quad rendering. 6405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * The buffer may be able to batch consecutive drawRects if this is provided. 6505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param indexBuffer index buffer with quad indices. 6605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 6705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void setQuadIndexBuffer(const GrIndexBuffer* indexBuffer); 6805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 6905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 7005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Empties the draw buffer of any queued up draws. 7105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 7205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void reset(); 7305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 7405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 7505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * plays the queued up draws to another target. Does not empty this buffer so 7605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * that it can be played back multiple times. 7705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param target the target to receive the playback 7805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 7905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void playback(GrDrawTarget* target); 8005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 8105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger // overrides from GrDrawTarget 8205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger virtual void drawRect(const GrRect& rect, 8305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger const GrMatrix* matrix = NULL, 841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger StageMask stageEnableMask = 0, 8505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger const GrRect* srcRects[] = NULL, 8605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger const GrMatrix* srcMatrices[] = NULL); 8705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 8805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger virtual bool geometryHints(GrVertexLayout vertexLayout, 8905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int* vertexCount, 9005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int* indexCount) const; 9105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 9235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger virtual void clear(const GrIRect* rect, GrColor color); 9335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 9405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate: 9505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 9605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger struct Draw { 9705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger GrPrimitiveType fPrimitiveType; 9805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int fStartVertex; 9905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int fStartIndex; 10005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int fVertexCount; 10105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int fIndexCount; 10205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger bool fStateChanged; 10305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger bool fClipChanged; 10405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger GrVertexLayout fVertexLayout; 10505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger const GrVertexBuffer* fVertexBuffer; 10605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger const GrIndexBuffer* fIndexBuffer; 10705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger }; 10805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 10935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger struct Clear { 11035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger int fBeforeDrawIdx; 11135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger GrIRect fRect; 11235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger GrColor fColor; 11335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger }; 11435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // overrides from GrDrawTarget 1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void onDrawIndexed(GrPrimitiveType primitiveType, 1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int startVertex, 1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int startIndex, 1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int vertexCount, 1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int indexCount); 1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void onDrawNonIndexed(GrPrimitiveType primitiveType, 1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int startVertex, 1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int vertexCount); 1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool onReserveVertexSpace(GrVertexLayout layout, 1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int vertexCount, 1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void** vertices); 1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool onReserveIndexSpace(int indexCount, void** indices); 1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void releaseReservedVertexSpace(); 1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void releaseReservedIndexSpace(); 13087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger virtual void onSetVertexSourceToArray(const void* vertexArray, 1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int vertexCount); 13287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger virtual void onSetIndexSourceToArray(const void* indexArray, 13387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger int indexCount); 1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void releaseVertexArray(); 1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void releaseIndexArray(); 1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void geometrySourceWillPush(); 1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void geometrySourceWillPop(const GeometrySrcState& restoredState); 1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void clipWillBeSet(const GrClip& newClip); 13905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 14005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger bool needsNewState() const; 14105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger bool needsNewClip() const; 14205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 14305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void pushState(); 14405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void pushClip(); 1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger enum { 1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger kDrawPreallocCnt = 8, 1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger kStatePreallocCnt = 8, 1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger kClipPreallocCnt = 8, 1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger kClearPreallocCnt = 4, 1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger kGeoPoolStatePreAllocCnt = 4, 1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger }; 15305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrSTAllocator<kDrawPreallocCnt, Draw> fDraws; 1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrSTAllocator<kStatePreallocCnt, SavedDrawState> fStates; 1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrSTAllocator<kClearPreallocCnt, Clear> fClears; 1571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrSTAllocator<kClipPreallocCnt, GrClip> fClips; 1581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 15905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger bool fClipSet; 16005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 16105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger GrVertexLayout fLastRectVertexLayout; 16205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger const GrIndexBuffer* fQuadIndexBuffer; 16305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int fMaxQuads; 16405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int fCurrQuad; 16505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 16605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger GrVertexBufferAllocPool& fVertexPool; 16705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 16805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger GrIndexBufferAllocPool& fIndexPool; 16935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 1701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger struct GeometryPoolState { 1711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const GrVertexBuffer* fPoolVertexBuffer; 1721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int fPoolStartVertex; 1731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const GrIndexBuffer* fPoolIndexBuffer; 1741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int fPoolStartIndex; 1751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // caller may conservatively over reserve vertices / indices. 1761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // we release unused space back to allocator if possible 1771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // can only do this if there isn't an intervening pushGeometrySource() 1781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger size_t fUsedPoolVertexBytes; 1791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger size_t fUsedPoolIndexBytes; 1801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger }; 1811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkSTArray<kGeoPoolStatePreAllocCnt, GeometryPoolState> fGeoPoolStateStack; 18205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 18305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger typedef GrDrawTarget INHERITED; 18405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}; 18505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 18605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif 187