GrInOrderDrawBuffer.cpp revision 25fb21f5df904c6f111bbf8f07e6a6c339416d09
1ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com/*
21da0746fa155cdca982ae8deb68cc64f540c92dfbsalomon@google.com    Copyright 2011 Google Inc.
3ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
4ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    Licensed under the Apache License, Version 2.0 (the "License");
5ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    you may not use this file except in compliance with the License.
6ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    You may obtain a copy of the License at
7ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
8ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com         http://www.apache.org/licenses/LICENSE-2.0
9ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
10ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    Unless required by applicable law or agreed to in writing, software
11ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    distributed under the License is distributed on an "AS IS" BASIS,
12ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    See the License for the specific language governing permissions and
14ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    limitations under the License.
15ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */
16ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
17ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
18ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrInOrderDrawBuffer.h"
19ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrTexture.h"
201c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com#include "GrBufferAllocPool.h"
2186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com#include "GrIndexBuffer.h"
2286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com#include "GrVertexBuffer.h"
23ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrGpu.h"
24ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
251c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.comGrInOrderDrawBuffer::GrInOrderDrawBuffer(GrVertexBufferAllocPool* vertexPool,
2625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                                         GrIndexBufferAllocPool* indexPool)
2725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    : fDraws(&fDrawStorage)
2825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    , fStates(&fStateStorage)
2925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    , fClears(&fClearStorage)
3025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    , fClips(&fClipStorage)
3125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    , fClipSet(true)
3225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
3325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    , fLastRectVertexLayout(0)
3425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    , fQuadIndexBuffer(NULL)
3525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    , fMaxQuads(0)
3625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    , fCurrQuad(0)
3725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
3825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    , fVertexPool(*vertexPool)
3925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    , fIndexPool(*indexPool)
4025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    , fGeoPoolStateStack(&fGeoStackStorage) {
4125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
421c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    GrAssert(NULL != vertexPool);
431c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    GrAssert(NULL != indexPool);
4425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
4525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GeometryPoolState& poolState = fGeoPoolStateStack.push_back();
4625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fUsedPoolVertexBytes = 0;
4725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fUsedPoolIndexBytes = 0;
4825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com#if GR_DEBUG
4925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fPoolVertexBuffer = (GrVertexBuffer*)~0;
5025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fPoolStartVertex = ~0;
5125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fPoolIndexBuffer = (GrIndexBuffer*)~0;
5225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fPoolStartIndex = ~0;
5325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com#endif
54ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
55ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
56ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comGrInOrderDrawBuffer::~GrInOrderDrawBuffer() {
5786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    this->reset();
5886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    GrSafeUnref(fQuadIndexBuffer);
59ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
60ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
61ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comvoid GrInOrderDrawBuffer::initializeDrawStateAndClip(const GrDrawTarget& target) {
62ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    this->copyDrawState(target);
63ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    this->setClip(target.getClip());
64ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
65ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
6686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.comvoid GrInOrderDrawBuffer::setQuadIndexBuffer(const GrIndexBuffer* indexBuffer) {
6786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    bool newIdxBuffer = fQuadIndexBuffer != indexBuffer;
6886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    if (newIdxBuffer) {
6986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        GrSafeUnref(fQuadIndexBuffer);
7086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        fQuadIndexBuffer = indexBuffer;
7186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        GrSafeRef(fQuadIndexBuffer);
7286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        fCurrQuad = 0;
7386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        fMaxQuads = (NULL == indexBuffer) ? 0 : indexBuffer->maxQuads();
7486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    } else {
75d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        GrAssert((NULL == indexBuffer && 0 == fMaxQuads) ||
7686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                 (indexBuffer->maxQuads() == fMaxQuads));
7786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    }
7886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com}
7986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
80d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.comvoid GrInOrderDrawBuffer::drawRect(const GrRect& rect,
8186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                   const GrMatrix* matrix,
82ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com                                   StageBitfield stageEnableBitfield,
8386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                   const GrRect* srcRects[],
8486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                                   const GrMatrix* srcMatrices[]) {
85d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com
8686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    GrAssert(!(NULL == fQuadIndexBuffer && fCurrQuad));
8786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    GrAssert(!(fDraws.empty() && fCurrQuad));
8886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    GrAssert(!(0 != fMaxQuads && NULL == fQuadIndexBuffer));
8986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
9086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    // if we have a quad IB then either append to the previous run of
9186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    // rects or start a new run
9286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    if (fMaxQuads) {
93d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com
9486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        bool appendToPreviousDraw = false;
95ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com        GrVertexLayout layout = GetRectVertexLayout(stageEnableBitfield, srcRects);
9686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        AutoReleaseGeometry geo(this, layout, 4, 0);
9786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        AutoViewMatrixRestore avmr(this);
9886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        GrMatrix combinedMatrix = this->getViewMatrix();
9986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        this->setViewMatrix(GrMatrix::I());
10086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        if (NULL != matrix) {
10186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            combinedMatrix.preConcat(*matrix);
10286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        }
10386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
10486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        SetRectVertices(rect, &combinedMatrix, srcRects, srcMatrices, layout, geo.vertices());
10586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
10686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        // we don't want to miss an opportunity to batch rects together
10786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        // simply because the clip has changed if the clip doesn't affect
10886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        // the rect.
10986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        bool disabledClip = false;
11086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        if (this->isClipState() && fClip.isRect()) {
111d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com
1120b50b2ed462505c452de8b6d978c4e522e0f9fe1bsalomon@google.com            GrRect clipRect = fClip.getRect(0);
11386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            // If the clip rect touches the edge of the viewport, extended it
11486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            // out (close) to infinity to avoid bogus intersections.
115d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com            // We might consider a more exact clip to viewport if this
11686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            // conservative test fails.
11786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            const GrRenderTarget* target = this->getRenderTarget();
11886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            if (0 >= clipRect.fLeft) {
11986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                clipRect.fLeft = GR_ScalarMin;
12086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            }
12186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            if (target->width() <= clipRect.fRight) {
12286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                clipRect.fRight = GR_ScalarMax;
12386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            }
12486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            if (0 >= clipRect.top()) {
12586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                clipRect.fTop = GR_ScalarMin;
12686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            }
12786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            if (target->height() <= clipRect.fBottom) {
12886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                clipRect.fBottom = GR_ScalarMax;
12986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            }
13086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            int stride = VertexSize(layout);
13186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            bool insideClip = true;
13286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            for (int v = 0; v < 4; ++v) {
13386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                const GrPoint& p = *GetVertexPoint(geo.vertices(), v, stride);
13486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                if (!clipRect.contains(p)) {
13586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                    insideClip = false;
13686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                    break;
13786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                }
13886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            }
13986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            if (insideClip) {
14086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                this->disableState(kClip_StateBit);
14186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                disabledClip = true;
14286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            }
14386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        }
144d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com        if (!needsNewClip() && !needsNewState() && fCurrQuad > 0 &&
14586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            fCurrQuad < fMaxQuads && layout == fLastRectVertexLayout) {
14686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
14786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            int vsize = VertexSize(layout);
148d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com
14986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            Draw& lastDraw = fDraws.back();
15086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
15186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            GrAssert(lastDraw.fIndexBuffer == fQuadIndexBuffer);
15286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            GrAssert(kTriangles_PrimitiveType == lastDraw.fPrimitiveType);
15386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            GrAssert(0 == lastDraw.fVertexCount % 4);
15486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            GrAssert(0 == lastDraw.fIndexCount % 6);
15586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            GrAssert(0 == lastDraw.fStartIndex);
15686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
15725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com            GeometryPoolState& poolState = fGeoPoolStateStack.back();
1586aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com            bool clearSinceLastDraw =
1596aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com                            fClears.count() &&
1606aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com                            fClears.back().fBeforeDrawIdx == fDraws.count();
1616aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com
16225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com            appendToPreviousDraw =
16325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                !clearSinceLastDraw &&
16425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                lastDraw.fVertexBuffer == poolState.fPoolVertexBuffer &&
16525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                (fCurrQuad * 4 + lastDraw.fStartVertex) == poolState.fPoolStartVertex;
16625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
16786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            if (appendToPreviousDraw) {
16886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                lastDraw.fVertexCount += 4;
16986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                lastDraw.fIndexCount += 6;
17086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com                fCurrQuad += 1;
17125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                // we reserved above, so we should be the first
17225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                // use of this vertex reserveation.
17325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                GrAssert(0 == poolState.fUsedPoolVertexBytes);
17425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                poolState.fUsedPoolVertexBytes = 4 * vsize;
17586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            }
17686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        }
17786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        if (!appendToPreviousDraw) {
17886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            this->setIndexSourceToBuffer(fQuadIndexBuffer);
17986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            drawIndexed(kTriangles_PrimitiveType, 0, 0, 4, 6);
18086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            fCurrQuad = 1;
18186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            fLastRectVertexLayout = layout;
18286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        }
18386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        if (disabledClip) {
18486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com            this->enableState(kClip_StateBit);
18586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        }
18686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    } else {
187ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com        INHERITED::drawRect(rect, matrix, stageEnableBitfield, srcRects, srcMatrices);
18886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    }
18986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com}
19086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
19125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrInOrderDrawBuffer::onDrawIndexed(GrPrimitiveType primitiveType,
19225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                                        int startVertex,
19325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                                        int startIndex,
19425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                                        int vertexCount,
19525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                                        int indexCount) {
196ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
197ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    if (!vertexCount || !indexCount) {
198ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        return;
199ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
200ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
20186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    fCurrQuad = 0;
20286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
20325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GeometryPoolState& poolState = fGeoPoolStateStack.back();
20425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
205ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    Draw& draw = fDraws.push_back();
2061c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    draw.fPrimitiveType = primitiveType;
207ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    draw.fStartVertex   = startVertex;
208ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    draw.fStartIndex    = startIndex;
209ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    draw.fVertexCount   = vertexCount;
210ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    draw.fIndexCount    = indexCount;
21186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
21286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    draw.fClipChanged = this->needsNewClip();
21386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    if (draw.fClipChanged) {
21486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com       this->pushClip();
21586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    }
21686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
21786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    draw.fStateChanged = this->needsNewState();
21886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    if (draw.fStateChanged) {
21986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        this->pushState();
22086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    }
221ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
22225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    draw.fVertexLayout = this->getGeomSrc().fVertexLayout;
22325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    switch (this->getGeomSrc().fVertexSrc) {
2241c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    case kBuffer_GeometrySrcType:
22525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com        draw.fVertexBuffer = this->getGeomSrc().fVertexBuffer;
226ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        break;
22725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    case kReserved_GeometrySrcType: // fallthrough
22825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    case kArray_GeometrySrcType: {
229ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        size_t vertexBytes = (vertexCount + startVertex) *
23025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                             VertexSize(this->getGeomSrc().fVertexLayout);
23125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com        poolState.fUsedPoolVertexBytes =
23225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                            GrMax(poolState.fUsedPoolVertexBytes, vertexBytes);
23325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com        draw.fVertexBuffer = poolState.fPoolVertexBuffer;
23425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com        draw.fStartVertex += poolState.fPoolStartVertex;
235ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        break;
23625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    }
2371c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    default:
2381c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        GrCrash("unknown geom src type");
239ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
24086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    draw.fVertexBuffer->ref();
241ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
24225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    switch (this->getGeomSrc().fIndexSrc) {
2431c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    case kBuffer_GeometrySrcType:
24425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com        draw.fIndexBuffer = this->getGeomSrc().fIndexBuffer;
245ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        break;
24625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    case kReserved_GeometrySrcType: // fallthrough
24725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    case kArray_GeometrySrcType: {
248ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        size_t indexBytes = (indexCount + startIndex) * sizeof(uint16_t);
24925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com        poolState.fUsedPoolIndexBytes =
25025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                            GrMax(poolState.fUsedPoolIndexBytes, indexBytes);
25125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com        draw.fIndexBuffer = poolState.fPoolIndexBuffer;
25225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com        draw.fStartIndex += poolState.fPoolStartVertex;
253ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        break;
25425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    }
2551c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    default:
2561c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        GrCrash("unknown geom src type");
257ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
25886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    draw.fIndexBuffer->ref();
259ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
260ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
26125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrInOrderDrawBuffer::onDrawNonIndexed(GrPrimitiveType primitiveType,
26225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                                           int startVertex,
26325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                                           int vertexCount) {
264ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    if (!vertexCount) {
265ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        return;
266ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
267ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
26886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    fCurrQuad = 0;
26986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
27025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GeometryPoolState& poolState = fGeoPoolStateStack.back();
27125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
272ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    Draw& draw = fDraws.push_back();
2731c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    draw.fPrimitiveType = primitiveType;
274ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    draw.fStartVertex   = startVertex;
275ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    draw.fStartIndex    = 0;
276ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    draw.fVertexCount   = vertexCount;
277ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    draw.fIndexCount    = 0;
278ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
27986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    draw.fClipChanged = this->needsNewClip();
28086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    if (draw.fClipChanged) {
28186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        this->pushClip();
28286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    }
28386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
28486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    draw.fStateChanged = this->needsNewState();
28586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    if (draw.fStateChanged) {
28686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        this->pushState();
28786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    }
288ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
28925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    draw.fVertexLayout = this->getGeomSrc().fVertexLayout;
29025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    switch (this->getGeomSrc().fVertexSrc) {
2911c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    case kBuffer_GeometrySrcType:
29225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com        draw.fVertexBuffer = this->getGeomSrc().fVertexBuffer;
293ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        break;
29425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    case kReserved_GeometrySrcType: // fallthrough
29525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    case kArray_GeometrySrcType: {
296ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        size_t vertexBytes = (vertexCount + startVertex) *
29725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                             VertexSize(this->getGeomSrc().fVertexLayout);
29825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com        poolState.fUsedPoolVertexBytes =
29925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                            GrMax(poolState.fUsedPoolVertexBytes, vertexBytes);
30025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com        draw.fVertexBuffer = poolState.fPoolVertexBuffer;
30125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com        draw.fStartVertex += poolState.fPoolStartVertex;
302ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        break;
30325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    }
3041c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    default:
3051c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        GrCrash("unknown geom src type");
306ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
30786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    draw.fVertexBuffer->ref();
30886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    draw.fIndexBuffer = NULL;
309ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
310ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
3116aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.comvoid GrInOrderDrawBuffer::clear(const GrIRect* rect, GrColor color) {
3126aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com    GrIRect r;
3136aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com    if (NULL == rect) {
3146aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com        // We could do something smart and remove previous draws and clears to
3156aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com        // the current render target. If we get that smart we have to make sure
3166aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com        // those draws aren't read before this clear (render-to-texture).
3176aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com        r.setLTRB(0, 0,
3186aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com                  this->getRenderTarget()->width(),
3196aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com                  this->getRenderTarget()->height());
3206aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com        rect = &r;
3216aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com    }
3220b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com    Clear& clr = fClears.push_back();
3230b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com    clr.fColor = color;
3240b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com    clr.fBeforeDrawIdx = fDraws.count();
3256aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com    clr.fRect = *rect;
3260b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com}
3270b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com
328ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comvoid GrInOrderDrawBuffer::reset() {
32925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GrAssert(1 == fGeoPoolStateStack.count());
33025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    this->resetVertexSource();
33125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    this->resetIndexSource();
332ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    uint32_t numStates = fStates.count();
333ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    for (uint32_t i = 0; i < numStates; ++i) {
3341da0746fa155cdca982ae8deb68cc64f540c92dfbsalomon@google.com        const DrState& dstate = this->accessSavedDrawState(fStates[i]);
3358531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com        for (int s = 0; s < kNumStages; ++s) {
3361da0746fa155cdca982ae8deb68cc64f540c92dfbsalomon@google.com            GrSafeUnref(dstate.fTextures[s]);
337ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        }
3381da0746fa155cdca982ae8deb68cc64f540c92dfbsalomon@google.com        GrSafeUnref(dstate.fRenderTarget);
339ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
34086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    int numDraws = fDraws.count();
34186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    for (int d = 0; d < numDraws; ++d) {
34286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        // we always have a VB, but not always an IB
34386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        GrAssert(NULL != fDraws[d].fVertexBuffer);
34486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        fDraws[d].fVertexBuffer->unref();
34586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        GrSafeUnref(fDraws[d].fIndexBuffer);
34686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    }
347ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    fDraws.reset();
348ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    fStates.reset();
3491c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com
3500b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com    fClears.reset();
3510b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com
3521c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    fVertexPool.reset();
3531c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    fIndexPool.reset();
3541c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com
355ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    fClips.reset();
35686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
35786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    fCurrQuad = 0;
358ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
359ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
360ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comvoid GrInOrderDrawBuffer::playback(GrDrawTarget* target) {
36125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GrAssert(kReserved_GeometrySrcType != this->getGeomSrc().fVertexSrc);
36225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GrAssert(kReserved_GeometrySrcType != this->getGeomSrc().fIndexSrc);
363ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    GrAssert(NULL != target);
364ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    GrAssert(target != this); // not considered and why?
365ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
366898d9e5dc677ae69b701b4fb6bab77ab10002cefbsalomon@google.com    int numDraws = fDraws.count();
367ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    if (!numDraws) {
368ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        return;
369ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
370ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
3711c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    fVertexPool.unlock();
3721c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    fIndexPool.unlock();
373ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
374ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    GrDrawTarget::AutoStateRestore asr(target);
375ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    GrDrawTarget::AutoClipRestore acr(target);
37625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    AutoGeometryPush agp(target);
377ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
3786a77cc5dde4bc01a0a9ba9ac32140146247d113fbsalomon@google.com    int currState = ~0;
3796a77cc5dde4bc01a0a9ba9ac32140146247d113fbsalomon@google.com    int currClip  = ~0;
3806a77cc5dde4bc01a0a9ba9ac32140146247d113fbsalomon@google.com    int currClear = 0;
381ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
382898d9e5dc677ae69b701b4fb6bab77ab10002cefbsalomon@google.com    for (int i = 0; i < numDraws; ++i) {
3830b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com        while (currClear < fClears.count() &&
3840b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com               i == fClears[currClear].fBeforeDrawIdx) {
3856aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com            target->clear(&fClears[currClear].fRect, fClears[currClear].fColor);
3860b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com            ++currClear;
3870b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com        }
3880b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com
389ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        const Draw& draw = fDraws[i];
3901c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        if (draw.fStateChanged) {
391ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com            ++currState;
392ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com            target->restoreDrawState(fStates[currState]);
393ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        }
394ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        if (draw.fClipChanged) {
395ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com            ++currClip;
396ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com            target->setClip(fClips[currClip]);
397ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        }
3981c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com
3991c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        target->setVertexSourceToBuffer(draw.fVertexLayout, draw.fVertexBuffer);
4001c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com
4011c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        if (draw.fIndexCount) {
4021c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com            target->setIndexSourceToBuffer(draw.fIndexBuffer);
403ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        }
4041c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com
405ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        if (draw.fIndexCount) {
4061c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com            target->drawIndexed(draw.fPrimitiveType,
407ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                draw.fStartVertex,
408ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                draw.fStartIndex,
409ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                draw.fVertexCount,
410ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                draw.fIndexCount);
411ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        } else {
4121c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com            target->drawNonIndexed(draw.fPrimitiveType,
413ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                   draw.fStartVertex,
414ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                   draw.fVertexCount);
415ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        }
416ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
4170b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com    while (currClear < fClears.count()) {
4180b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com        GrAssert(fDraws.count() == fClears[currClear].fBeforeDrawIdx);
4196aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com        target->clear(&fClears[currClear].fRect, fClears[currClear].fColor);
4200b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com        ++currClear;
4210b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com    }
422ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
423ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
424ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.combool GrInOrderDrawBuffer::geometryHints(GrVertexLayout vertexLayout,
4251c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                                        int* vertexCount,
4261c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                                        int* indexCount) const {
4271c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    // we will recommend a flush if the data could fit in a single
4281c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    // preallocated buffer but none are left and it can't fit
4291c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    // in the current buffer (which may not be prealloced).
430ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    bool flush = false;
431ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    if (NULL != indexCount) {
4321c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        int32_t currIndices = fIndexPool.currentBufferIndices();
4331c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        if (*indexCount > currIndices &&
4341c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com            (!fIndexPool.preallocatedBuffersRemaining() &&
4351c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com             *indexCount <= fIndexPool.preallocatedBufferIndices())) {
4361c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com
4371c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com            flush = true;
4381c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        }
4391c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        *indexCount = currIndices;
440ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
441ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    if (NULL != vertexCount) {
4421c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        int32_t currVertices = fVertexPool.currentBufferVertices(vertexLayout);
4431c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        if (*vertexCount > currVertices &&
4441c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com            (!fVertexPool.preallocatedBuffersRemaining() &&
4451c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com             *vertexCount <= fVertexPool.preallocatedBufferVertices(vertexLayout))) {
4461c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com
4471c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com            flush = true;
448ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        }
4491c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com        *vertexCount = currVertices;
450ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
451ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    return flush;
452ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
453ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
45425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.combool GrInOrderDrawBuffer::onReserveVertexSpace(GrVertexLayout vertexLayout,
45525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                                               int vertexCount,
45625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                                               void** vertices) {
45725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GeometryPoolState& poolState = fGeoPoolStateStack.back();
45825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GrAssert(vertexCount > 0);
45925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GrAssert(NULL != vertices);
46025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GrAssert(0 == poolState.fUsedPoolVertexBytes);
46125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
46225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    *vertices = fVertexPool.makeSpace(vertexLayout,
46325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                                      vertexCount,
46425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                                      &poolState.fPoolVertexBuffer,
46525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                                      &poolState.fPoolStartVertex);
46625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    return NULL != *vertices;
46725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com}
46825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
46925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.combool GrInOrderDrawBuffer::onReserveIndexSpace(int indexCount, void** indices) {
47025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GeometryPoolState& poolState = fGeoPoolStateStack.back();
47125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GrAssert(indexCount > 0);
47225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GrAssert(NULL != indices);
47325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GrAssert(0 == poolState.fUsedPoolIndexBytes);
47425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
47525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    *indices = fIndexPool.makeSpace(indexCount,
47625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                                    &poolState.fPoolIndexBuffer,
47725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                                    &poolState.fPoolStartIndex);
47825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    return NULL != *indices;
479ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
480ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
48125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrInOrderDrawBuffer::releaseReservedVertexSpace() {
48225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GeometryPoolState& poolState = fGeoPoolStateStack.back();
48325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    const GeometrySrcState& geoSrc = this->getGeomSrc();
48425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
48525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GrAssert(kReserved_GeometrySrcType == geoSrc.fVertexSrc);
48625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
48725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    size_t reservedVertexBytes = VertexSize(geoSrc.fVertexLayout) *
48825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                                 geoSrc.fVertexCount;
48925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    fVertexPool.putBack(reservedVertexBytes -
49025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                        poolState.fUsedPoolVertexBytes);
49125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fUsedPoolVertexBytes = 0;
49225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fPoolVertexBuffer = 0;
49325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com}
494ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
49525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrInOrderDrawBuffer::releaseReservedIndexSpace() {
49625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GeometryPoolState& poolState = fGeoPoolStateStack.back();
49725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    const GeometrySrcState& geoSrc = this->getGeomSrc();
4981c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com
49925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GrAssert(kReserved_GeometrySrcType == geoSrc.fIndexSrc);
50025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
50125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    size_t reservedIndexBytes = sizeof(uint16_t) * geoSrc.fIndexCount;
50225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    fIndexPool.putBack(reservedIndexBytes - poolState.fUsedPoolIndexBytes);
50325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fUsedPoolIndexBytes = 0;
50425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fPoolStartVertex = 0;
5051c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com}
50625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
507bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.comvoid GrInOrderDrawBuffer::onSetVertexSourceToArray(const void* vertexArray,
508bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com                                                   int vertexCount) {
50925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
51025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GeometryPoolState& poolState = fGeoPoolStateStack.back();
51125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GrAssert(0 == poolState.fUsedPoolVertexBytes);
5121c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com#if GR_DEBUG
5131c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    bool success =
5141c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com#endif
51525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    fVertexPool.appendVertices(this->getGeomSrc().fVertexLayout,
5161c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                               vertexCount,
5171c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                               vertexArray,
51825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                               &poolState.fPoolVertexBuffer,
51925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                               &poolState.fPoolStartVertex);
5201c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    GR_DEBUGASSERT(success);
5211c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com}
5221c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com
523bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.comvoid GrInOrderDrawBuffer::onSetIndexSourceToArray(const void* indexArray,
524bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com                                                  int indexCount) {
52525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GeometryPoolState& poolState = fGeoPoolStateStack.back();
52625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GrAssert(0 == poolState.fUsedPoolIndexBytes);
5271c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com#if GR_DEBUG
5281c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    bool success =
5291c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com#endif
5301c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    fIndexPool.appendIndices(indexCount,
5311c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com                             indexArray,
53225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                             &poolState.fPoolIndexBuffer,
53325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                             &poolState.fPoolStartIndex);
5341c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com    GR_DEBUGASSERT(success);
535ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
536ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
53725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrInOrderDrawBuffer::geometrySourceWillPush() {
53825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GeometryPoolState& poolState = fGeoPoolStateStack.push_back();
53925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fUsedPoolVertexBytes = 0;
54025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fUsedPoolIndexBytes = 0;
54125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com#if GR_DEBUG
54225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fPoolVertexBuffer = (GrVertexBuffer*)~0;
54325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fPoolStartVertex = ~0;
54425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fPoolIndexBuffer = (GrIndexBuffer*)~0;
54525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fPoolStartIndex = ~0;
54625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com#endif
54725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com}
54825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
54925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrInOrderDrawBuffer::releaseVertexArray() {
55025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GeometryPoolState& poolState = fGeoPoolStateStack.back();
55125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    const GeometrySrcState& geoSrc = this->getGeomSrc();
55225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
55325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    size_t reservedVertexBytes = VertexSize(geoSrc.fVertexLayout) *
55425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    geoSrc.fVertexCount;
55525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    fVertexPool.putBack(reservedVertexBytes - poolState.fUsedPoolVertexBytes);
55625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
55725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fUsedPoolVertexBytes = 0;
55825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com}
55925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
56025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrInOrderDrawBuffer::releaseIndexArray() {
56125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GeometryPoolState& poolState = fGeoPoolStateStack.back();
56225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    const GeometrySrcState& geoSrc = this->getGeomSrc();
56325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
56425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    size_t reservedIndexBytes = sizeof(uint16_t) * geoSrc.fIndexCount;
56525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    fIndexPool.putBack(reservedIndexBytes - poolState.fUsedPoolIndexBytes);
56625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
56725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    poolState.fUsedPoolIndexBytes = 0;
56825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com}
56925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
57025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrInOrderDrawBuffer::geometrySourceWillPop(
57125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                                        const GeometrySrcState& restoredState) {
57225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GrAssert(fGeoPoolStateStack.count() > 1);
57325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    fGeoPoolStateStack.pop_back();
57425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    GeometryPoolState& poolState = fGeoPoolStateStack.back();
57525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    // we have to assume that any slack we had in our vertex/index data
57625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    // is now unreleasable because data may have been appended later in the
57725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    // pool.
57825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    if (kReserved_GeometrySrcType == restoredState.fVertexSrc ||
57925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com        kArray_GeometrySrcType == restoredState.fVertexSrc) {
58025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com        poolState.fUsedPoolVertexBytes =
58125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com            VertexSize(restoredState.fVertexLayout) *
58225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com            restoredState.fVertexCount;
58325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    }
58425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    if (kReserved_GeometrySrcType == restoredState.fIndexSrc ||
58525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com        kArray_GeometrySrcType == restoredState.fIndexSrc) {
58625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com        poolState.fUsedPoolVertexBytes = sizeof(uint16_t) *
58725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com                                         restoredState.fIndexCount;
58825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com    }
58925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com}
59025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com
59186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.combool GrInOrderDrawBuffer::needsNewState() const {
59286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     if (fStates.empty()) {
59386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        return true;
59486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     } else {
59586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com         const DrState& old = this->accessSavedDrawState(fStates.back());
59686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        return old != fCurrDrawState;
59786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     }
598ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
599ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
60086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.comvoid GrInOrderDrawBuffer::pushState() {
60186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    for (int s = 0; s < kNumStages; ++s) {
60286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com        GrSafeRef(fCurrDrawState.fTextures[s]);
60386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    }
6041da0746fa155cdca982ae8deb68cc64f540c92dfbsalomon@google.com    GrSafeRef(fCurrDrawState.fRenderTarget);
60586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    this->saveCurrentDrawState(&fStates.push_back());
60686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com }
607d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com
60886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.combool GrInOrderDrawBuffer::needsNewClip() const {
60986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com   if (fCurrDrawState.fFlagBits & kClip_StateBit) {
61086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com       if (fClips.empty() || (fClipSet && fClips.back() != fClip)) {
61186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com           return true;
61286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com       }
613ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
614ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    return false;
615ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
616d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com
61786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.comvoid GrInOrderDrawBuffer::pushClip() {
61886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    fClips.push_back() = fClip;
61986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    fClipSet = false;
62086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com}
621d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com
62286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.comvoid GrInOrderDrawBuffer::clipWillBeSet(const GrClip& newClip)  {
62386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    fClipSet = true;
624ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
625