1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 7ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 8ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#ifndef GrInOrderDrawBuffer_DEFINED 9ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#define GrInOrderDrawBuffer_DEFINED 10ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 11ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrDrawTarget.h" 12ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrAllocPool.h" 13ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrAllocator.h" 14b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon#include "GrIndexBuffer.h" 15b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon#include "GrRenderTarget.h" 16ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com#include "GrPath.h" 17b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon#include "GrPathRange.h" 18b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon#include "GrSurface.h" 19b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon#include "GrVertexBuffer.h" 20ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 21641f8b19a6799b6d73ac17b9c2d2f8a5e6f5ad4drobertphillips@google.com#include "SkClipStack.h" 22ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com#include "SkTemplates.h" 23a0b40280a49a8a43af7929ead3b3489951c58501commit-bot@chromium.org#include "SkTypes.h" 24ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com 25471d471dcd7422e5dd9c822c1092b2ba4721dcfebsalomon@google.comclass GrGpu; 261c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.comclass GrIndexBufferAllocPool; 27471d471dcd7422e5dd9c822c1092b2ba4721dcfebsalomon@google.comclass GrVertexBufferAllocPool; 281c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com 291c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com/** 3055e4a2005eae1e4f677ec145c577c615a63cf05dbsalomon@google.com * GrInOrderDrawBuffer is an implementation of GrDrawTarget that queues up draws for eventual 3155e4a2005eae1e4f677ec145c577c615a63cf05dbsalomon@google.com * playback into a GrGpu. In theory one draw buffer could playback into another. When index or 3255e4a2005eae1e4f677ec145c577c615a63cf05dbsalomon@google.com * vertex buffers are used as geometry sources it is the callers the draw buffer only holds 3355e4a2005eae1e4f677ec145c577c615a63cf05dbsalomon@google.com * references to the buffers. It is the callers responsibility to ensure that the data is still 3455e4a2005eae1e4f677ec145c577c615a63cf05dbsalomon@google.com * valid when the draw buffer is played back into a GrGpu. Similarly, it is the caller's 3555e4a2005eae1e4f677ec145c577c615a63cf05dbsalomon@google.com * responsibility to ensure that all referenced textures, buffers, and render-targets are associated 3655e4a2005eae1e4f677ec145c577c615a63cf05dbsalomon@google.com * in the GrGpu object that the buffer is played back into. The buffer requires VB and IB pools to 3755e4a2005eae1e4f677ec145c577c615a63cf05dbsalomon@google.com * store geometry. 3807d3a6575b86845ded0d4bd785aec8f4c2cc99dcskia.committer@gmail.com */ 39ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comclass GrInOrderDrawBuffer : public GrDrawTarget { 40ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.compublic: 41ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 4286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com /** 4386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * Creates a GrInOrderDrawBuffer 4486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * 456e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com * @param gpu the gpu object that this draw buffer flushes to. 4686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * @param vertexPool pool where vertices for queued draws will be saved when 4786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * the vertex source is either reserved or array. 4886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * @param indexPool pool where indices for queued draws will be saved when 4986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * the index source is either reserved or array. 5086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com */ 516e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com GrInOrderDrawBuffer(GrGpu* gpu, 52471d471dcd7422e5dd9c822c1092b2ba4721dcfebsalomon@google.com GrVertexBufferAllocPool* vertexPool, 531c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com GrIndexBufferAllocPool* indexPool); 54ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 55ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com virtual ~GrInOrderDrawBuffer(); 56ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 5786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com /** 5855e4a2005eae1e4f677ec145c577c615a63cf05dbsalomon@google.com * Empties the draw buffer of any queued up draws. This must not be called while inside an 5955e4a2005eae1e4f677ec145c577c615a63cf05dbsalomon@google.com * unbalanced pushGeometrySource(). The current draw state and clip are preserved. 6086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com */ 6186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com void reset(); 6286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 6386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com /** 646e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com * This plays the queued up draws to its GrGpu target. It also resets this object (i.e. flushing 6555e4a2005eae1e4f677ec145c577c615a63cf05dbsalomon@google.com * is destructive). This buffer must not have an active reserved vertex or index source. Any 6655e4a2005eae1e4f677ec145c577c615a63cf05dbsalomon@google.com * reserved geometry on the target will be finalized because it's geometry source will be pushed 6755e4a2005eae1e4f677ec145c577c615a63cf05dbsalomon@google.com * before flushing and popped afterwards. 6886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com */ 691267fbd95290f58443652ca8d947bde50b212618robertphillips@google.com void flush(); 7097805382d89b717de3355312a79a957ea4a864c9bsalomon@google.com 71a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org // tracking for draws 72a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org virtual DrawToken getCurrentDrawToken() { return DrawToken(this, fDrawID); } 73a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org 7486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com // overrides from GrDrawTarget 75b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com virtual bool geometryHints(int* vertexCount, 7697805382d89b717de3355312a79a957ea4a864c9bsalomon@google.com int* indexCount) const SK_OVERRIDE; 77fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org virtual void clear(const SkIRect* rect, 78c82a8b7aa4ec19fba508c394920a9e88d3e5bd12robertphillips@google.com GrColor color, 7956ce48ade325f6f49acb0da31d6252806e4ed7efrobertphillips@google.com bool canIgnoreRect, 8028361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org GrRenderTarget* renderTarget) SK_OVERRIDE; 8128361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org 8228361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org virtual void discard(GrRenderTarget*) SK_OVERRIDE; 830b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com 84eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.com virtual void initCopySurfaceDstDesc(const GrSurface* src, GrTextureDesc* desc) SK_OVERRIDE; 85eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.com 8697805382d89b717de3355312a79a957ea4a864c9bsalomon@google.comprotected: 8702ddc8b85ace91b15feb329a6a1d5d62b2b846c6bsalomon@google.com virtual void clipWillBeSet(const GrClipData* newClip) SK_OVERRIDE; 8802ddc8b85ace91b15feb329a6a1d5d62b2b846c6bsalomon@google.com 89ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comprivate: 90a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com enum Cmd { 91ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com kDraw_Cmd = 1, 92ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com kStencilPath_Cmd = 2, 93ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com kSetState_Cmd = 3, 94ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com kSetClip_Cmd = 4, 95ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com kClear_Cmd = 5, 96116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com kCopySurface_Cmd = 6, 9732184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org kDrawPath_Cmd = 7, 989b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org kDrawPaths_Cmd = 8, 99a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com }; 100a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com 101b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon class Draw : public DrawInfo { 102d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com public: 103b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon Draw(const DrawInfo& info, const GrVertexBuffer* vb, const GrIndexBuffer* ib) 104b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon : DrawInfo(info) 10545725db1d82615d43408ec488549aec6218f80e4bsalomon , fVertexBuffer(vb) 10645725db1d82615d43408ec488549aec6218f80e4bsalomon , fIndexBuffer(ib) {} 107b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon 108b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon const GrVertexBuffer* vertexBuffer() const { return fVertexBuffer.get(); } 109b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon const GrIndexBuffer* indexBuffer() const { return fIndexBuffer.get(); } 110b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon 111b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon private: 11245725db1d82615d43408ec488549aec6218f80e4bsalomon GrPendingIOResource<const GrVertexBuffer, GrIORef::kRead_IOType> fVertexBuffer; 11345725db1d82615d43408ec488549aec6218f80e4bsalomon GrPendingIOResource<const GrIndexBuffer, GrIORef::kRead_IOType> fIndexBuffer; 114ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com }; 115ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 116a0b40280a49a8a43af7929ead3b3489951c58501commit-bot@chromium.org struct StencilPath : public ::SkNoncopyable { 11745725db1d82615d43408ec488549aec6218f80e4bsalomon StencilPath(const GrPath* path) : fPath(path) {} 118b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon 119b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon const GrPath* path() const { return fPath.get(); } 1205f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 121b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon SkPath::FillType fFill; 122b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon 123b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon private: 12445725db1d82615d43408ec488549aec6218f80e4bsalomon GrPendingIOResource<const GrPath, GrIORef::kRead_IOType> fPath; 125ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com }; 126ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com 12732184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org struct DrawPath : public ::SkNoncopyable { 12845725db1d82615d43408ec488549aec6218f80e4bsalomon DrawPath(const GrPath* path) : fPath(path) {} 129b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon 130b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon const GrPath* path() const { return fPath.get(); } 131c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org 132b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon SkPath::FillType fFill; 133b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GrDeviceCoordTexture fDstCopy; 134b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon 135b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon private: 13645725db1d82615d43408ec488549aec6218f80e4bsalomon GrPendingIOResource<const GrPath, GrIORef::kRead_IOType> fPath; 137c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org }; 138c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org 1399b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org struct DrawPaths : public ::SkNoncopyable { 140b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon DrawPaths(const GrPathRange* pathRange) 14145725db1d82615d43408ec488549aec6218f80e4bsalomon : fPathRange(pathRange) {} 142b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon 143b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon ~DrawPaths() { 144b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon if (fTransforms) { 145b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon SkDELETE_ARRAY(fTransforms); 146b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon } 147b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon if (fIndices) { 148b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon SkDELETE_ARRAY(fIndices); 149b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon } 150b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon } 151b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon 152b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon const GrPathRange* pathRange() const { return fPathRange.get(); } 153b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon 154b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon uint32_t* fIndices; 155b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon size_t fCount; 156b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon float* fTransforms; 157b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon PathTransformType fTransformsType; 158b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon SkPath::FillType fFill; 159b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GrDeviceCoordTexture fDstCopy; 160b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon 161b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon private: 16245725db1d82615d43408ec488549aec6218f80e4bsalomon GrPendingIOResource<const GrPathRange, GrIORef::kRead_IOType> fPathRange; 1639b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org }; 1649b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org 16528361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org // This is also used to record a discard by setting the color to GrColor_ILLEGAL 166a0b40280a49a8a43af7929ead3b3489951c58501commit-bot@chromium.org struct Clear : public ::SkNoncopyable { 16745725db1d82615d43408ec488549aec6218f80e4bsalomon Clear(GrRenderTarget* rt) : fRenderTarget(rt) {} 168b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon ~Clear() { } 169b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GrRenderTarget* renderTarget() const { return fRenderTarget.get(); } 170b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon 171b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon SkIRect fRect; 172b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GrColor fColor; 173b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon bool fCanIgnoreRect; 174c82a8b7aa4ec19fba508c394920a9e88d3e5bd12robertphillips@google.com 175b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon private: 17645725db1d82615d43408ec488549aec6218f80e4bsalomon GrPendingIOResource<GrRenderTarget, GrIORef::kWrite_IOType> fRenderTarget; 1770b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com }; 1780b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com 179a0b40280a49a8a43af7929ead3b3489951c58501commit-bot@chromium.org struct CopySurface : public ::SkNoncopyable { 18045725db1d82615d43408ec488549aec6218f80e4bsalomon CopySurface(GrSurface* dst, GrSurface* src) : fDst(dst), fSrc(src) {} 181b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon 182b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GrSurface* dst() const { return fDst.get(); } 183b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GrSurface* src() const { return fSrc.get(); } 184b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon 185b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon SkIPoint fDstPoint; 186b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon SkIRect fSrcRect; 187b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon 188b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon private: 18945725db1d82615d43408ec488549aec6218f80e4bsalomon GrPendingIOResource<GrSurface, GrIORef::kWrite_IOType> fDst; 19045725db1d82615d43408ec488549aec6218f80e4bsalomon GrPendingIOResource<GrSurface, GrIORef::kRead_IOType> fSrc; 191116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com }; 192116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com 193f0480b1e697dcaee8b4004ca5b494917c939cde7bsalomon struct Clip : public ::SkNoncopyable { 194f0480b1e697dcaee8b4004ca5b494917c939cde7bsalomon SkClipStack fStack; 195f0480b1e697dcaee8b4004ca5b494917c939cde7bsalomon SkIPoint fOrigin; 196f0480b1e697dcaee8b4004ca5b494917c939cde7bsalomon }; 197f0480b1e697dcaee8b4004ca5b494917c939cde7bsalomon 19825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com // overrides from GrDrawTarget 19974749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com virtual void onDraw(const DrawInfo&) SK_OVERRIDE; 200fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org virtual void onDrawRect(const SkRect& rect, 201fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org const SkRect* localRect, 2020406b9e1faee06c6ecb2732a1bcf3b0e53104e07bsalomon@google.com const SkMatrix* localMatrix) SK_OVERRIDE; 20332184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org 20432184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org virtual void onStencilPath(const GrPath*, SkPath::FillType) SK_OVERRIDE; 20532184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org virtual void onDrawPath(const GrPath*, SkPath::FillType, 206c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org const GrDeviceCoordTexture* dstCopy) SK_OVERRIDE; 207b85a0aab6905af8b329539b7573a7555b727d5e5cdalton virtual void onDrawPaths(const GrPathRange*, 208b85a0aab6905af8b329539b7573a7555b727d5e5cdalton const uint32_t indices[], int count, 209b85a0aab6905af8b329539b7573a7555b727d5e5cdalton const float transforms[], PathTransformType, 210b85a0aab6905af8b329539b7573a7555b727d5e5cdalton SkPath::FillType, const GrDeviceCoordTexture*) SK_OVERRIDE; 21132184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org 212a63389843dd18003382d61c2e4610af09ed07d38jvanverth@google.com virtual bool onReserveVertexSpace(size_t vertexSize, 21325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com int vertexCount, 21413f1b6f1569bb5c639ca762f6b153133173c6295bsalomon@google.com void** vertices) SK_OVERRIDE; 21513f1b6f1569bb5c639ca762f6b153133173c6295bsalomon@google.com virtual bool onReserveIndexSpace(int indexCount, 21613f1b6f1569bb5c639ca762f6b153133173c6295bsalomon@google.com void** indices) SK_OVERRIDE; 21713f1b6f1569bb5c639ca762f6b153133173c6295bsalomon@google.com virtual void releaseReservedVertexSpace() SK_OVERRIDE; 21813f1b6f1569bb5c639ca762f6b153133173c6295bsalomon@google.com virtual void releaseReservedIndexSpace() SK_OVERRIDE; 219bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com virtual void onSetVertexSourceToArray(const void* vertexArray, 22013f1b6f1569bb5c639ca762f6b153133173c6295bsalomon@google.com int vertexCount) SK_OVERRIDE; 221bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com virtual void onSetIndexSourceToArray(const void* indexArray, 22213f1b6f1569bb5c639ca762f6b153133173c6295bsalomon@google.com int indexCount) SK_OVERRIDE; 22313f1b6f1569bb5c639ca762f6b153133173c6295bsalomon@google.com virtual void releaseVertexArray() SK_OVERRIDE; 22413f1b6f1569bb5c639ca762f6b153133173c6295bsalomon@google.com virtual void releaseIndexArray() SK_OVERRIDE; 22513f1b6f1569bb5c639ca762f6b153133173c6295bsalomon@google.com virtual void geometrySourceWillPush() SK_OVERRIDE; 22602ddc8b85ace91b15feb329a6a1d5d62b2b846c6bsalomon@google.com virtual void geometrySourceWillPop(const GeometrySrcState& restoredState) SK_OVERRIDE; 227b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com virtual void willReserveVertexAndIndexSpace(int vertexCount, 22802ddc8b85ace91b15feb329a6a1d5d62b2b846c6bsalomon@google.com int indexCount) SK_OVERRIDE; 229116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com virtual bool onCopySurface(GrSurface* dst, 230116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com GrSurface* src, 231116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com const SkIRect& srcRect, 232116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com const SkIPoint& dstPoint) SK_OVERRIDE; 233116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com virtual bool onCanCopySurface(GrSurface* dst, 234116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com GrSurface* src, 235116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com const SkIRect& srcRect, 236116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com const SkIPoint& dstPoint) SK_OVERRIDE; 237116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com 238d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com bool quickInsideClip(const SkRect& devBounds); 23902ddc8b85ace91b15feb329a6a1d5d62b2b846c6bsalomon@google.com 2402a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org virtual void didAddGpuTraceMarker() SK_OVERRIDE {} 2412a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org virtual void didRemoveGpuTraceMarker() SK_OVERRIDE {} 242a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org 243d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // Attempts to concat instances from info onto the previous draw. info must represent an 244d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // instanced draw. The caller must have already recorded a new draw state and clip if necessary. 245d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com int concatInstancedDraw(const DrawInfo& info); 2461c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com 247838f62db0a77487f6732ed13a0972a1e646ae16absalomon // Determines whether the current draw operation requieres a new drawstate and if so records it. 248838f62db0a77487f6732ed13a0972a1e646ae16absalomon void recordStateIfNecessary(); 249838f62db0a77487f6732ed13a0972a1e646ae16absalomon // We lazily record clip changes in order to skip clips that have no effect. 25086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com bool needsNewClip() const; 251ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 252a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com // these functions record a command 253ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com void recordState(); 254ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com void recordClip(); 255b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon Draw* recordDraw(const DrawInfo&, const GrVertexBuffer*, const GrIndexBuffer*); 256b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon StencilPath* recordStencilPath(const GrPath*); 257b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon DrawPath* recordDrawPath(const GrPath*); 258b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon DrawPaths* recordDrawPaths(const GrPathRange*); 259b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon Clear* recordClear(GrRenderTarget*); 260b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon CopySurface* recordCopySurface(GrSurface* dst, GrSurface* src); 261b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon 262b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon virtual bool isIssued(uint32_t drawID) { return drawID != fDrawID; } 263b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon void addToCmdBuffer(uint8_t cmd); 264934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com 265116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com // TODO: Use a single allocator for commands and records 2664b90c62dfcda5866808ceedee46358b3d9792c93bsalomon@google.com enum { 267a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com kCmdPreallocCnt = 32, 268bce3d6dbb91c3e67f1010556c2b8aaf6d7a49267bsalomon kDrawPreallocCnt = 16, 269ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com kStencilPathPreallocCnt = 8, 27032184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org kDrawPathPreallocCnt = 8, 2719b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org kDrawPathsPreallocCnt = 8, 2724b90c62dfcda5866808ceedee46358b3d9792c93bsalomon@google.com kStatePreallocCnt = 8, 2734b90c62dfcda5866808ceedee46358b3d9792c93bsalomon@google.com kClipPreallocCnt = 8, 274bce3d6dbb91c3e67f1010556c2b8aaf6d7a49267bsalomon kClearPreallocCnt = 8, 2754b90c62dfcda5866808ceedee46358b3d9792c93bsalomon@google.com kGeoPoolStatePreAllocCnt = 4, 276116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com kCopySurfacePreallocCnt = 4, 2774b90c62dfcda5866808ceedee46358b3d9792c93bsalomon@google.com }; 278ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 279b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon typedef GrTAllocator<Draw> DrawAllocator; 280b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon typedef GrTAllocator<StencilPath> StencilPathAllocator; 281b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon typedef GrTAllocator<DrawPath> DrawPathAllocator; 282b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon typedef GrTAllocator<DrawPaths> DrawPathsAllocator; 283b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon typedef GrTAllocator<GrDrawState> StateAllocator; 284b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon typedef GrTAllocator<Clear> ClearAllocator; 285b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon typedef GrTAllocator<CopySurface> CopySurfaceAllocator; 286b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon typedef GrTAllocator<Clip> ClipAllocator; 287b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon 288b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GrSTAllocator<kDrawPreallocCnt, Draw> fDraws; 289b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GrSTAllocator<kStencilPathPreallocCnt, StencilPath> fStencilPaths; 290b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GrSTAllocator<kDrawPathPreallocCnt, DrawPath> fDrawPath; 291b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GrSTAllocator<kDrawPathsPreallocCnt, DrawPaths> fDrawPaths; 292b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GrSTAllocator<kStatePreallocCnt, GrDrawState> fStates; 293b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GrSTAllocator<kClearPreallocCnt, Clear> fClears; 294b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GrSTAllocator<kCopySurfacePreallocCnt, CopySurface> fCopySurfaces; 295b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GrSTAllocator<kClipPreallocCnt, Clip> fClips; 296b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon 297b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon SkTArray<GrTraceMarkerSet, false> fGpuCmdMarkers; 298b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon SkSTArray<kCmdPreallocCnt, uint8_t, true> fCmds; 299b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GrDrawTarget* fDstGpu; 300b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon bool fClipSet; 30186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 302d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com enum ClipProxyState { 303d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com kUnknown_ClipProxyState, 304d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com kValid_ClipProxyState, 305d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com kInvalid_ClipProxyState 306d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com }; 307934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com 308b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon ClipProxyState fClipProxyState; 309b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon SkRect fClipProxy; 310b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GrVertexBufferAllocPool& fVertexPool; 311b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GrIndexBufferAllocPool& fIndexPool; 312934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com 31325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com struct GeometryPoolState { 314b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon const GrVertexBuffer* fPoolVertexBuffer; 315b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon int fPoolStartVertex; 316b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon const GrIndexBuffer* fPoolIndexBuffer; 317b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon int fPoolStartIndex; 31825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com // caller may conservatively over reserve vertices / indices. 31925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com // we release unused space back to allocator if possible 32025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com // can only do this if there isn't an intervening pushGeometrySource() 321b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon size_t fUsedPoolVertexBytes; 322b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon size_t fUsedPoolIndexBytes; 32325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com }; 324a55847ba22ae4a673af022e7d88404e080195464bsalomon@google.com 325b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon typedef SkSTArray<kGeoPoolStatePreAllocCnt, GeometryPoolState> GeoPoolStateStack; 3262a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org 327b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon GeoPoolStateStack fGeoPoolStateStack; 328b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon bool fFlushing; 329b3e3a955b6628acc540ef14854b57abb089e62dfbsalomon uint32_t fDrawID; 330c82a8b7aa4ec19fba508c394920a9e88d3e5bd12robertphillips@google.com 33186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com typedef GrDrawTarget INHERITED; 332ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}; 333ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 334ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif 335