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