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