GrInOrderDrawBuffer.cpp revision 2a05de0c049a8648942a55016126a1f92e1c14d6
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 7ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 8ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrInOrderDrawBuffer.h" 9fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org 101c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com#include "GrBufferAllocPool.h" 11c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com#include "GrDrawTargetCaps.h" 12ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com#include "GrGpu.h" 1386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com#include "GrIndexBuffer.h" 14ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com#include "GrPath.h" 15fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org#include "GrPoint.h" 16ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com#include "GrRenderTarget.h" 176e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com#include "GrTemplates.h" 18ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com#include "GrTexture.h" 1986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com#include "GrVertexBuffer.h" 20ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 216e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.comGrInOrderDrawBuffer::GrInOrderDrawBuffer(GrGpu* gpu, 22471d471dcd7422e5dd9c822c1092b2ba4721dcfebsalomon@google.com GrVertexBufferAllocPool* vertexPool, 2325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GrIndexBufferAllocPool* indexPool) 246e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com : GrDrawTarget(gpu->getContext()) 256e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com , fDstGpu(gpu) 2697805382d89b717de3355312a79a957ea4a864c9bsalomon@google.com , fClipSet(true) 27d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com , fClipProxyState(kUnknown_ClipProxyState) 286970557055acaed619d7bb89451868e1570249b2robertphillips@google.com , fVertexPool(*vertexPool) 296970557055acaed619d7bb89451868e1570249b2robertphillips@google.com , fIndexPool(*indexPool) 30a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org , fFlushing(false) 31a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org , fDrawID(0) { 3218c9c198f571997463d9a7134dbd88298e592ec2bsalomon@google.com 336e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com fDstGpu->ref(); 34bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fCaps.reset(SkRef(fDstGpu->caps())); 3518c9c198f571997463d9a7134dbd88298e592ec2bsalomon@google.com 36f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL != vertexPool); 37f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL != indexPool); 3825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 3925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometryPoolState& poolState = fGeoPoolStateStack.push_back(); 4025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com poolState.fUsedPoolVertexBytes = 0; 4125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com poolState.fUsedPoolIndexBytes = 0; 42515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 4325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com poolState.fPoolVertexBuffer = (GrVertexBuffer*)~0; 4425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com poolState.fPoolStartVertex = ~0; 4525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com poolState.fPoolIndexBuffer = (GrIndexBuffer*)~0; 4625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com poolState.fPoolStartIndex = ~0; 4725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com#endif 48a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com this->reset(); 49ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 50ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 51ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comGrInOrderDrawBuffer::~GrInOrderDrawBuffer() { 5286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com this->reset(); 534a018bb20bf969a38ec11d9506843f06366dfa7cbsalomon@google.com // This must be called by before the GrDrawTarget destructor 544a018bb20bf969a38ec11d9506843f06366dfa7cbsalomon@google.com this->releaseGeometry(); 556e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com fDstGpu->unref(); 56ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 57ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 58934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com//////////////////////////////////////////////////////////////////////////////// 59934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com 60d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.comnamespace { 61d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.comvoid get_vertex_bounds(const void* vertices, 62d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com size_t vertexSize, 63d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com int vertexCount, 64d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com SkRect* bounds) { 65f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(vertexSize >= sizeof(GrPoint)); 66f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(vertexCount > 0); 67d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com const GrPoint* point = static_cast<const GrPoint*>(vertices); 68d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com bounds->fLeft = bounds->fRight = point->fX; 69d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com bounds->fTop = bounds->fBottom = point->fY; 70d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com for (int i = 1; i < vertexCount; ++i) { 71d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com point = reinterpret_cast<GrPoint*>(reinterpret_cast<intptr_t>(point) + vertexSize); 72d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com bounds->growToInclude(point->fX, point->fY); 73d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 74d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com} 75934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com} 76934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com 779b855c7c95ce9fff7a447e4a6bdf8a469c1f3097jvanverth@google.com 78429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.comnamespace { 799b855c7c95ce9fff7a447e4a6bdf8a469c1f3097jvanverth@google.com 80429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.comextern const GrVertexAttrib kRectPosColorUVAttribs[] = { 81429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding}, 82429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com {kVec4ub_GrVertexAttribType, sizeof(GrPoint), kColor_GrVertexAttribBinding}, 83c9f3b38f67893b22c3e02a6a934bc676e36c5cfcrmistry@google.com {kVec2f_GrVertexAttribType, sizeof(GrPoint)+sizeof(GrColor), 84429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com kLocalCoord_GrVertexAttribBinding}, 85429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com}; 869b855c7c95ce9fff7a447e4a6bdf8a469c1f3097jvanverth@google.com 87429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.comextern const GrVertexAttrib kRectPosUVAttribs[] = { 88429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding}, 89429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com {kVec2f_GrVertexAttribType, sizeof(GrPoint), kLocalCoord_GrVertexAttribBinding}, 90429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com}; 91054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com 92429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.comstatic void set_vertex_attributes(GrDrawState* drawState, 93429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com bool hasColor, bool hasUVs, 94429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com int* colorOffset, int* localOffset) { 95429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com *colorOffset = -1; 96429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com *localOffset = -1; 97d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 98d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // Using per-vertex colors allows batching across colors. (A lot of rects in a row differing 99d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // only in color is a common occurrence in tables). However, having per-vertex colors disables 100d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // blending optimizations because we don't know if the color will be solid or not. These 101d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // optimizations help determine whether coverage and color can be blended correctly when 102d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // dual-source blending isn't available. This comes into play when there is coverage. If colors 103d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // were a stage it could take a hint that every vertex's color will be opaque. 104429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com if (hasColor && hasUVs) { 105429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com *colorOffset = sizeof(GrPoint); 106429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com *localOffset = sizeof(GrPoint) + sizeof(GrColor); 107429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com drawState->setVertexAttribs<kRectPosColorUVAttribs>(3); 108429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com } else if (hasColor) { 109429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com *colorOffset = sizeof(GrPoint); 110429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com drawState->setVertexAttribs<kRectPosColorUVAttribs>(2); 111429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com } else if (hasUVs) { 112429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com *localOffset = sizeof(GrPoint); 113429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com drawState->setVertexAttribs<kRectPosUVAttribs>(2); 114429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com } else { 115429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com drawState->setVertexAttribs<kRectPosUVAttribs>(1); 116429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com } 117429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com} 118429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com 119429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com}; 120429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com 1212a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.orgenum { 1222a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org kTraceCmdBit = 0x80, 1232a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org kCmdMask = 0x7f, 1242a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org}; 1252a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org 1262a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.orgstatic uint8_t add_trace_bit(uint8_t cmd) { 1272a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org return cmd | kTraceCmdBit; 1282a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org} 1292a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org 1302a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.orgstatic uint8_t strip_trace_bit(uint8_t cmd) { 1312a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org return cmd & kCmdMask; 1322a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org} 1332a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org 1342a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.orgstatic bool cmd_has_trace_marker(uint8_t cmd) { 1352a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org return cmd & kTraceCmdBit; 1362a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org} 1372a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org 138fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.orgvoid GrInOrderDrawBuffer::onDrawRect(const SkRect& rect, 139429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com const SkMatrix* matrix, 140fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org const SkRect* localRect, 141429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com const SkMatrix* localMatrix) { 142429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com GrDrawState::AutoColorRestore acr; 143429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com 144429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com GrDrawState* drawState = this->drawState(); 145429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com 146429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com GrColor color = drawState->getColor(); 147429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com 148429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com int colorOffset, localOffset; 149429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com set_vertex_attributes(drawState, 150429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com this->caps()->dualSourceBlendingSupport() || drawState->hasSolidCoverage(), 151429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com NULL != localRect, 152429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com &colorOffset, &localOffset); 153429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com if (colorOffset >= 0) { 154d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // We set the draw state's color to white here. This is done so that any batching performed 155d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // in our subclass's onDraw() won't get a false from GrDrawState::op== due to a color 156d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // mismatch. TODO: Once vertex layout is owned by GrDrawState it should skip comparing the 157c9f3b38f67893b22c3e02a6a934bc676e36c5cfcrmistry@google.com // constant color in its op== when the kColor layout bit is set and then we can remove 158429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com // this. 1599b855c7c95ce9fff7a447e4a6bdf8a469c1f3097jvanverth@google.com acr.set(drawState, 0xFFFFFFFF); 160d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 161d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 162b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com AutoReleaseGeometry geo(this, 4, 0); 163d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (!geo.succeeded()) { 164d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com GrPrintf("Failed to get space for vertices!\n"); 165d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com return; 166d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 1678b129aa3379ece6c43d9ce2ad0cdeafb089b7eb5robertphillips@google.com 168d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // Go to device coords to allow batching across matrix changes 169d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com SkMatrix combinedMatrix; 170d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (NULL != matrix) { 171d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com combinedMatrix = *matrix; 172d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } else { 173d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com combinedMatrix.reset(); 174d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 1759b855c7c95ce9fff7a447e4a6bdf8a469c1f3097jvanverth@google.com combinedMatrix.postConcat(drawState->getViewMatrix()); 1763976825a21532e254311b90b4a9046e25717e335jvanverth@google.com // When the caller has provided an explicit source rect for a stage then we don't want to 177d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // modify that stage's matrix. Otherwise if the effect is generating its source rect from 178d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // the vertex positions then we have to account for the view matrix change. 179137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com GrDrawState::AutoViewMatrixRestore avmr; 180137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com if (!avmr.setIdentity(drawState)) { 181d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com return; 182d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 183d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 1849b855c7c95ce9fff7a447e4a6bdf8a469c1f3097jvanverth@google.com size_t vsize = drawState->getVertexSize(); 185d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 186d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com geo.positions()->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, vsize); 187d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com combinedMatrix.mapPointsWithStride(geo.positions(), vsize, 4); 188d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 189d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com SkRect devBounds; 190d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // since we already computed the dev verts, set the bounds hint. This will help us avoid 191d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // unnecessary clipping in our onDraw(). 192d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com get_vertex_bounds(geo.vertices(), vsize, 4, &devBounds); 193d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 194c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com if (localOffset >= 0) { 195c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com GrPoint* coords = GrTCast<GrPoint*>(GrTCast<intptr_t>(geo.vertices()) + localOffset); 196c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com coords->setRectFan(localRect->fLeft, localRect->fTop, 197c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com localRect->fRight, localRect->fBottom, 1989b855c7c95ce9fff7a447e4a6bdf8a469c1f3097jvanverth@google.com vsize); 199c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com if (NULL != localMatrix) { 200c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com localMatrix->mapPointsWithStride(coords, vsize, 4); 201e3d3216fe17b6afb2e613271b5246a2766e12df6bsalomon@google.com } 202d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 20386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 204d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (colorOffset >= 0) { 205d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com GrColor* vertColor = GrTCast<GrColor*>(GrTCast<intptr_t>(geo.vertices()) + colorOffset); 206d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com for (int i = 0; i < 4; ++i) { 207d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com *vertColor = color; 208d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com vertColor = (GrColor*) ((intptr_t) vertColor + vsize); 209d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 210d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 211d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com 2126e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com this->setIndexSourceToBuffer(this->getContext()->getQuadIndexBuffer()); 213d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com this->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 4, 6, &devBounds); 2149b855c7c95ce9fff7a447e4a6bdf8a469c1f3097jvanverth@google.com 2159b855c7c95ce9fff7a447e4a6bdf8a469c1f3097jvanverth@google.com // to ensure that stashing the drawState ptr is valid 216f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(this->drawState() == drawState); 217d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com} 218fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 219d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.combool GrInOrderDrawBuffer::quickInsideClip(const SkRect& devBounds) { 220d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (!this->getDrawState().isClipState()) { 221d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com return true; 222d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 223d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (kUnknown_ClipProxyState == fClipProxyState) { 224d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com SkIRect rect; 225d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com bool iior; 226d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com this->getClip()->getConservativeBounds(this->getDrawState().getRenderTarget(), &rect, &iior); 227d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (iior) { 228d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // The clip is a rect. We will remember that in fProxyClip. It is common for an edge (or 229d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // all edges) of the clip to be at the edge of the RT. However, we get that clipping for 230d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // free via the viewport. We don't want to think that clipping must be enabled in this 231d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // case. So we extend the clip outward from the edge to avoid these false negatives. 232d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fClipProxyState = kValid_ClipProxyState; 2334469938e92d779dff05e745559e67907bbf21e78reed@google.com fClipProxy = SkRect::Make(rect); 234d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 235d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (fClipProxy.fLeft <= 0) { 236d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fClipProxy.fLeft = SK_ScalarMin; 23786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 238d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (fClipProxy.fTop <= 0) { 239d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fClipProxy.fTop = SK_ScalarMin; 24086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 241d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (fClipProxy.fRight >= this->getDrawState().getRenderTarget()->width()) { 242d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fClipProxy.fRight = SK_ScalarMax; 243d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 244d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (fClipProxy.fBottom >= this->getDrawState().getRenderTarget()->height()) { 245d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fClipProxy.fBottom = SK_ScalarMax; 246d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 247d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } else { 248d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fClipProxyState = kInvalid_ClipProxyState; 24986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 25086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 251d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (kValid_ClipProxyState == fClipProxyState) { 252d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com return fClipProxy.contains(devBounds); 253d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 254d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com SkPoint originOffset = {SkIntToScalar(this->getClip()->fOrigin.fX), 255d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com SkIntToScalar(this->getClip()->fOrigin.fY)}; 256d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com SkRect clipSpaceBounds = devBounds; 257d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com clipSpaceBounds.offset(originOffset); 258d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com return this->getClip()->fClipStack->quickContains(clipSpaceBounds); 25986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com} 26086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 261d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.comint GrInOrderDrawBuffer::concatInstancedDraw(const DrawInfo& info) { 262f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(info.isInstanced()); 263934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com 264934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com const GeometrySrcState& geomSrc = this->getGeomSrc(); 265b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com const GrDrawState& drawState = this->getDrawState(); 266934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com 267d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // we only attempt to concat the case when reserved verts are used with a client-specified index 268d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // buffer. To make this work with client-specified VBs we'd need to know if the VB was updated 269d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // between draws. 270d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (kReserved_GeometrySrcType != geomSrc.fVertexSrc || 271d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com kBuffer_GeometrySrcType != geomSrc.fIndexSrc) { 272d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com return 0; 273d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 274d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // Check if there is a draw info that is compatible that uses the same VB from the pool and 275d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // the same IB 2762a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org if (kDraw_Cmd != strip_trace_bit(fCmds.back())) { 277d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com return 0; 278d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 279934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com 280d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com DrawRecord* draw = &fDraws.back(); 281d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com GeometryPoolState& poolState = fGeoPoolStateStack.back(); 282d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com const GrVertexBuffer* vertexBuffer = poolState.fPoolVertexBuffer; 283d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 284d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (!draw->isInstanced() || 285d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com draw->verticesPerInstance() != info.verticesPerInstance() || 286d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com draw->indicesPerInstance() != info.indicesPerInstance() || 287d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com draw->fVertexBuffer != vertexBuffer || 288b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com draw->fIndexBuffer != geomSrc.fIndexBuffer) { 289d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com return 0; 290d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 291d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // info does not yet account for the offset from the start of the pool's VB while the previous 292d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // draw record does. 293d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com int adjustedStartVertex = poolState.fPoolStartVertex + info.startVertex(); 294d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (draw->startVertex() + draw->vertexCount() != adjustedStartVertex) { 295d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com return 0; 296d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 297a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com 298f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(poolState.fPoolStartVertex == draw->startVertex() + draw->vertexCount()); 299934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com 300d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // how many instances can be concat'ed onto draw given the size of the index buffer 301d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com int instancesToConcat = this->indexCountInCurrentSource() / info.indicesPerInstance(); 302d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com instancesToConcat -= draw->instanceCount(); 303d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com instancesToConcat = GrMin(instancesToConcat, info.instanceCount()); 304934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com 305d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // update the amount of reserved vertex data actually referenced in draws 306ae683921ffda9108147a29da7319c7eee4dc9245skia.committer@gmail.com size_t vertexBytes = instancesToConcat * info.verticesPerInstance() * 307b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com drawState.getVertexSize(); 308d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com poolState.fUsedPoolVertexBytes = GrMax(poolState.fUsedPoolVertexBytes, vertexBytes); 309934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com 310d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com draw->adjustInstanceCount(instancesToConcat); 3112a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org 3122a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org // update last fGpuCmdMarkers to include any additional trace markers that have been added 3132a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org if (this->getActiveTraceMarkers().count() > 0) { 3142a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org if (cmd_has_trace_marker(fCmds.back())) { 3152a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org fGpuCmdMarkers.back().addSet(this->getActiveTraceMarkers()); 3162a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org } else { 3172a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org fGpuCmdMarkers.push_back(this->getActiveTraceMarkers()); 3182a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org fCmds.back() = add_trace_bit(fCmds.back()); 3192a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org } 3202a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org } 3212a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org 322d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com return instancesToConcat; 323d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com} 324934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com 325d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.comclass AutoClipReenable { 326d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.compublic: 327d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com AutoClipReenable() : fDrawState(NULL) {} 328d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com ~AutoClipReenable() { 329d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (NULL != fDrawState) { 330d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fDrawState->enableState(GrDrawState::kClip_StateBit); 331d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 332934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com } 333d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com void set(GrDrawState* drawState) { 334d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (drawState->isClipState()) { 335d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fDrawState = drawState; 336d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com drawState->disableState(GrDrawState::kClip_StateBit); 337d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 338d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 339d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.comprivate: 340d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com GrDrawState* fDrawState; 341d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com}; 342934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com 34374749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.comvoid GrInOrderDrawBuffer::onDraw(const DrawInfo& info) { 344ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 34525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometryPoolState& poolState = fGeoPoolStateStack.back(); 346b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com const GrDrawState& drawState = this->getDrawState(); 347d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com AutoClipReenable acr; 348d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 349b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com if (drawState.isClipState() && 350d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com NULL != info.getDevBounds() && 351d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com this->quickInsideClip(*info.getDevBounds())) { 352d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com acr.set(this->drawState()); 353d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 35425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 355a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com if (this->needsNewClip()) { 356a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com this->recordClip(); 35786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 358a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com if (this->needsNewState()) { 359a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com this->recordState(); 36086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 361ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 362d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com DrawRecord* draw; 363d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (info.isInstanced()) { 364d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com int instancesConcated = this->concatInstancedDraw(info); 365d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (info.instanceCount() > instancesConcated) { 366d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com draw = this->recordDraw(info); 367d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com draw->adjustInstanceCount(-instancesConcated); 368d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } else { 369d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com return; 370d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 371d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } else { 372d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com draw = this->recordDraw(info); 373d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 37474749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com 37525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com switch (this->getGeomSrc().fVertexSrc) { 37674749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com case kBuffer_GeometrySrcType: 37774749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com draw->fVertexBuffer = this->getGeomSrc().fVertexBuffer; 37874749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com break; 37974749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com case kReserved_GeometrySrcType: // fallthrough 38074749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com case kArray_GeometrySrcType: { 381ae683921ffda9108147a29da7319c7eee4dc9245skia.committer@gmail.com size_t vertexBytes = (info.vertexCount() + info.startVertex()) * 382b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com drawState.getVertexSize(); 38374749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com poolState.fUsedPoolVertexBytes = GrMax(poolState.fUsedPoolVertexBytes, vertexBytes); 38474749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com draw->fVertexBuffer = poolState.fPoolVertexBuffer; 385d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com draw->adjustStartVertex(poolState.fPoolStartVertex); 38674749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com break; 38774749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com } 38874749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com default: 38974749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com GrCrash("unknown geom src type"); 390ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 391a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com draw->fVertexBuffer->ref(); 392ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 39374749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com if (info.isIndexed()) { 39474749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com switch (this->getGeomSrc().fIndexSrc) { 39574749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com case kBuffer_GeometrySrcType: 39674749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com draw->fIndexBuffer = this->getGeomSrc().fIndexBuffer; 39774749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com break; 39874749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com case kReserved_GeometrySrcType: // fallthrough 39974749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com case kArray_GeometrySrcType: { 40074749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com size_t indexBytes = (info.indexCount() + info.startIndex()) * sizeof(uint16_t); 40174749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com poolState.fUsedPoolIndexBytes = GrMax(poolState.fUsedPoolIndexBytes, indexBytes); 40274749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com draw->fIndexBuffer = poolState.fPoolIndexBuffer; 403d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com draw->adjustStartIndex(poolState.fPoolStartIndex); 40474749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com break; 40574749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com } 40674749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com default: 40774749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com GrCrash("unknown geom src type"); 40874749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com } 40974749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com draw->fIndexBuffer->ref(); 41074749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com } else { 41174749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com draw->fIndexBuffer = NULL; 412ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 413ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 414ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 41532184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.orgGrInOrderDrawBuffer::StencilPath::StencilPath() {} 41632184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.orgGrInOrderDrawBuffer::DrawPath::DrawPath() {} 4179b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.orgGrInOrderDrawBuffer::DrawPaths::DrawPaths() {} 4189b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.orgGrInOrderDrawBuffer::DrawPaths::~DrawPaths() { 4199b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org if (fTransforms) { 4209b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org SkDELETE_ARRAY(fTransforms); 4219b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org } 4229b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org for (size_t i = 0; i < fPathCount; ++i) { 4239b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org fPaths[i]->unref(); 4249b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org } 4259b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org SkDELETE_ARRAY(fPaths); 4269b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org} 4275f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com 42832184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.orgvoid GrInOrderDrawBuffer::onStencilPath(const GrPath* path, SkPath::FillType fill) { 429ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com if (this->needsNewClip()) { 430ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com this->recordClip(); 431ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com } 432ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com // Only compare the subset of GrDrawState relevant to path stenciling? 433ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com if (this->needsNewState()) { 434ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com this->recordState(); 435ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com } 436ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com StencilPath* sp = this->recordStencilPath(); 437ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com sp->fPath.reset(path); 438ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com path->ref(); 439ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com sp->fFill = fill; 44064aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com} 44164aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com 44232184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.orgvoid GrInOrderDrawBuffer::onDrawPath(const GrPath* path, 443c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org SkPath::FillType fill, const GrDeviceCoordTexture* dstCopy) { 444c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org if (this->needsNewClip()) { 445c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org this->recordClip(); 446c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org } 447c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org // TODO: Only compare the subset of GrDrawState relevant to path covering? 448c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org if (this->needsNewState()) { 449c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org this->recordState(); 450c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org } 45132184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org DrawPath* cp = this->recordDrawPath(); 452c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org cp->fPath.reset(path); 453c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org path->ref(); 454c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org cp->fFill = fill; 455c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org if (NULL != dstCopy) { 456c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org cp->fDstCopy = *dstCopy; 457c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org } 458c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org} 459c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org 4609b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.orgvoid GrInOrderDrawBuffer::onDrawPaths(size_t pathCount, const GrPath** paths, 4619b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org const SkMatrix* transforms, 4629b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org SkPath::FillType fill, 4639b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org SkStrokeRec::Style stroke, 4649b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org const GrDeviceCoordTexture* dstCopy) { 4659b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org SkASSERT(pathCount); 4669b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org 4679b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org if (this->needsNewClip()) { 4689b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org this->recordClip(); 4699b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org } 4709b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org if (this->needsNewState()) { 4719b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org this->recordState(); 4729b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org } 4739b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org DrawPaths* dp = this->recordDrawPaths(); 4749b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org dp->fPathCount = pathCount; 4759b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org dp->fPaths = SkNEW_ARRAY(const GrPath*, pathCount); 4769b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org memcpy(dp->fPaths, paths, sizeof(GrPath*) * pathCount); 4779b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org for (size_t i = 0; i < pathCount; ++i) { 4789b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org dp->fPaths[i]->ref(); 4799b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org } 4809b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org 4819b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org dp->fTransforms = SkNEW_ARRAY(SkMatrix, pathCount); 4829b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org memcpy(dp->fTransforms, transforms, sizeof(SkMatrix) * pathCount); 4839b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org 4849b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org dp->fFill = fill; 4859b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org dp->fStroke = stroke; 4869b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org 4879b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org if (NULL != dstCopy) { 4889b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org dp->fDstCopy = *dstCopy; 4899b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org } 4909b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org} 4919b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org 49218bb41e9563748fbde07c1540da9314cbb7d1dc8skia.committer@gmail.comvoid GrInOrderDrawBuffer::clear(const SkIRect* rect, GrColor color, 49356ce48ade325f6f49acb0da31d6252806e4ed7efrobertphillips@google.com bool canIgnoreRect, GrRenderTarget* renderTarget) { 494fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org SkIRect r; 4951b3ce47c7b6c14c84d7aaee249b33f9d3b473050bsalomon@google.com if (NULL == renderTarget) { 4961b3ce47c7b6c14c84d7aaee249b33f9d3b473050bsalomon@google.com renderTarget = this->drawState()->getRenderTarget(); 497f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL != renderTarget); 4981b3ce47c7b6c14c84d7aaee249b33f9d3b473050bsalomon@google.com } 4996aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com if (NULL == rect) { 5006aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com // We could do something smart and remove previous draws and clears to 5016aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com // the current render target. If we get that smart we have to make sure 5026aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com // those draws aren't read before this clear (render-to-texture). 5031b3ce47c7b6c14c84d7aaee249b33f9d3b473050bsalomon@google.com r.setLTRB(0, 0, renderTarget->width(), renderTarget->height()); 5046aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com rect = &r; 5056aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com } 506a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com Clear* clr = this->recordClear(); 507a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com clr->fColor = color; 508a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com clr->fRect = *rect; 50956ce48ade325f6f49acb0da31d6252806e4ed7efrobertphillips@google.com clr->fCanIgnoreRect = canIgnoreRect; 510a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com clr->fRenderTarget = renderTarget; 5111b3ce47c7b6c14c84d7aaee249b33f9d3b473050bsalomon@google.com renderTarget->ref(); 5120b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com} 5130b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com 514ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comvoid GrInOrderDrawBuffer::reset() { 515f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(1 == fGeoPoolStateStack.count()); 51625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->resetVertexSource(); 51725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->resetIndexSource(); 51886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com int numDraws = fDraws.count(); 51986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com for (int d = 0; d < numDraws; ++d) { 52086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com // we always have a VB, but not always an IB 521f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL != fDraws[d].fVertexBuffer); 52286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com fDraws[d].fVertexBuffer->unref(); 523a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.org SkSafeUnref(fDraws[d].fIndexBuffer); 52486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 525a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com fCmds.reset(); 526ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fDraws.reset(); 527ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com fStencilPaths.reset(); 5289b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org fDrawPath.reset(); 52932184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org fDrawPaths.reset(); 530ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fStates.reset(); 5310b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com fClears.reset(); 5321c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com fVertexPool.reset(); 5331c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com fIndexPool.reset(); 534ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fClips.reset(); 535beb1af78d016d2700c350487a383c6bcfa7e2e20robertphillips@google.com fClipOrigins.reset(); 536116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com fCopySurfaces.reset(); 5372a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org fGpuCmdMarkers.reset(); 538a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com fClipSet = true; 539ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 540ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 5411267fbd95290f58443652ca8d947bde50b212618robertphillips@google.comvoid GrInOrderDrawBuffer::flush() { 5421267fbd95290f58443652ca8d947bde50b212618robertphillips@google.com if (fFlushing) { 5431267fbd95290f58443652ca8d947bde50b212618robertphillips@google.com return; 5441267fbd95290f58443652ca8d947bde50b212618robertphillips@google.com } 5451267fbd95290f58443652ca8d947bde50b212618robertphillips@google.com 546f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(kReserved_GeometrySrcType != this->getGeomSrc().fVertexSrc); 547f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(kReserved_GeometrySrcType != this->getGeomSrc().fIndexSrc); 5483f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com 549a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com int numCmds = fCmds.count(); 550358e427763f0971af436f07170c641f747b94595bsalomon@google.com if (0 == numCmds) { 5511267fbd95290f58443652ca8d947bde50b212618robertphillips@google.com return; 552ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 5536e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com 5546e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com GrAutoTRestore<bool> flushRestore(&fFlushing); 5556e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com fFlushing = true; 556ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 5571c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com fVertexPool.unlock(); 5581c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com fIndexPool.unlock(); 559ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 5606e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com GrDrawTarget::AutoClipRestore acr(fDstGpu); 5616e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com AutoGeometryAndStatePush agasp(fDstGpu, kPreserve_ASRInit); 562ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com 563ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrDrawState playbackState; 5646e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com GrDrawState* prevDrawState = fDstGpu->drawState(); 565a5d056ae0b04021dfb44c2c7a3d6a34e060261b8bsalomon@google.com prevDrawState->ref(); 5666e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com fDstGpu->setDrawState(&playbackState); 567ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 568beb1af78d016d2700c350487a383c6bcfa7e2e20robertphillips@google.com GrClipData clipData; 569beb1af78d016d2700c350487a383c6bcfa7e2e20robertphillips@google.com 570ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com int currState = 0; 571ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com int currClip = 0; 572ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com int currClear = 0; 573ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com int currDraw = 0; 574ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com int currStencilPath = 0; 57532184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org int currDrawPath = 0; 5769b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org int currDrawPaths = 0; 577116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com int currCopySurface = 0; 5782a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org int currCmdMarker = 0; 579a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com 580a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com for (int c = 0; c < numCmds; ++c) { 5812a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org GrGpuTraceMarker newMarker("", -1); 5822a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org if (cmd_has_trace_marker(fCmds[c])) { 5832a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org SkString traceString = fGpuCmdMarkers[currCmdMarker].toString(); 5842a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org newMarker.fMarker = traceString.c_str(); 5852a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org fDstGpu->addGpuTraceMarker(&newMarker); 5862a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org ++currCmdMarker; 5872a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org } 5882a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org switch (strip_trace_bit(fCmds[c])) { 589a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com case kDraw_Cmd: { 59074749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com const DrawRecord& draw = fDraws[currDraw]; 5916e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com fDstGpu->setVertexSourceToBuffer(draw.fVertexBuffer); 592d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (draw.isIndexed()) { 5936e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com fDstGpu->setIndexSourceToBuffer(draw.fIndexBuffer); 594a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com } 5956e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com fDstGpu->executeDraw(draw); 596a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com ++currDraw; 597a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com break; 598a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com } 599ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com case kStencilPath_Cmd: { 600ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com const StencilPath& sp = fStencilPaths[currStencilPath]; 60132184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org fDstGpu->stencilPath(sp.fPath.get(), sp.fFill); 602ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com ++currStencilPath; 603ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com break; 604ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com } 60532184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org case kDrawPath_Cmd: { 6069b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org const DrawPath& cp = fDrawPath[currDrawPath]; 60732184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org fDstGpu->executeDrawPath(cp.fPath.get(), cp.fFill, 608c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org NULL != cp.fDstCopy.texture() ? &cp.fDstCopy : NULL); 60932184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org ++currDrawPath; 610c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org break; 611c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org } 6129b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org case kDrawPaths_Cmd: { 6139b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org DrawPaths& dp = fDrawPaths[currDrawPaths]; 6149b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org const GrDeviceCoordTexture* dstCopy = 6159b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org NULL != dp.fDstCopy.texture() ? &dp.fDstCopy : NULL; 6169b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org fDstGpu->executeDrawPaths(dp.fPathCount, dp.fPaths, 6179b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org dp.fTransforms, dp.fFill, dp.fStroke, 6189b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org dstCopy); 6199b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org ++currDrawPaths; 6209b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org break; 6219b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org } 622a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com case kSetState_Cmd: 623ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fStates[currState].restoreTo(&playbackState); 624a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com ++currState; 625a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com break; 626a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com case kSetClip_Cmd: 627beb1af78d016d2700c350487a383c6bcfa7e2e20robertphillips@google.com clipData.fClipStack = &fClips[currClip]; 628beb1af78d016d2700c350487a383c6bcfa7e2e20robertphillips@google.com clipData.fOrigin = fClipOrigins[currClip]; 6296e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com fDstGpu->setClip(&clipData); 630a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com ++currClip; 631a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com break; 632a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com case kClear_Cmd: 6336e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com fDstGpu->clear(&fClears[currClear].fRect, 6346e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com fClears[currClear].fColor, 63556ce48ade325f6f49acb0da31d6252806e4ed7efrobertphillips@google.com fClears[currClear].fCanIgnoreRect, 6366e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com fClears[currClear].fRenderTarget); 637a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com ++currClear; 638a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com break; 639116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com case kCopySurface_Cmd: 640116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com fDstGpu->copySurface(fCopySurfaces[currCopySurface].fDst.get(), 641116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com fCopySurfaces[currCopySurface].fSrc.get(), 642116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com fCopySurfaces[currCopySurface].fSrcRect, 643116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com fCopySurfaces[currCopySurface].fDstPoint); 644116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com ++currCopySurface; 645116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com break; 646ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 6472a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org if (cmd_has_trace_marker(fCmds[c])) { 6482a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org fDstGpu->removeGpuTraceMarker(&newMarker); 6492a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org } 650ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 651a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com // we should have consumed all the states, clips, etc. 652f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fStates.count() == currState); 653f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fClips.count() == currClip); 654f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fClipOrigins.count() == currClip); 655f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fClears.count() == currClear); 656f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fDraws.count() == currDraw); 657f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fCopySurfaces.count() == currCopySurface); 6582a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org SkASSERT(fGpuCmdMarkers.count() == currCmdMarker); 659a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com 6606e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com fDstGpu->setDrawState(prevDrawState); 661a5d056ae0b04021dfb44c2c7a3d6a34e060261b8bsalomon@google.com prevDrawState->unref(); 66255e4a2005eae1e4f677ec145c577c615a63cf05dbsalomon@google.com this->reset(); 663a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org ++fDrawID; 664ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 665ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 666116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.combool GrInOrderDrawBuffer::onCopySurface(GrSurface* dst, 667116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com GrSurface* src, 668116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com const SkIRect& srcRect, 669116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com const SkIPoint& dstPoint) { 670116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com if (fDstGpu->canCopySurface(dst, src, srcRect, dstPoint)) { 671116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com CopySurface* cs = this->recordCopySurface(); 672116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com cs->fDst.reset(SkRef(dst)); 673116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com cs->fSrc.reset(SkRef(src)); 674116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com cs->fSrcRect = srcRect; 675116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com cs->fDstPoint = dstPoint; 676116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com return true; 677116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com } else { 678116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com return false; 679116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com } 680116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com} 681116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com 682116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.combool GrInOrderDrawBuffer::onCanCopySurface(GrSurface* dst, 683116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com GrSurface* src, 684116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com const SkIRect& srcRect, 685116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com const SkIPoint& dstPoint) { 686116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com return fDstGpu->canCopySurface(dst, src, srcRect, dstPoint); 687116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com} 688116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com 689eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.comvoid GrInOrderDrawBuffer::initCopySurfaceDstDesc(const GrSurface* src, GrTextureDesc* desc) { 690eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.com fDstGpu->initCopySurfaceDstDesc(src, desc); 691eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.com} 692eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.com 6939528bdb0dccee915505bcf99cb10659f85e2604brobertphillips@google.comvoid GrInOrderDrawBuffer::willReserveVertexAndIndexSpace(int vertexCount, 6949528bdb0dccee915505bcf99cb10659f85e2604brobertphillips@google.com int indexCount) { 6956e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com // We use geometryHints() to know whether to flush the draw buffer. We 6966e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com // can't flush if we are inside an unbalanced pushGeometrySource. 6976e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com // Moreover, flushing blows away vertex and index data that was 6986e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com // previously reserved. So if the vertex or index data is pulled from 6996e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com // reserved space and won't be released by this request then we can't 7006e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com // flush. 7016e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com bool insideGeoPush = fGeoPoolStateStack.count() > 1; 7026e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com 7036e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com bool unreleasedVertexSpace = 7046e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com !vertexCount && 7056e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com kReserved_GeometrySrcType == this->getGeomSrc().fVertexSrc; 7066e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com 7076e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com bool unreleasedIndexSpace = 7086e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com !indexCount && 7096e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com kReserved_GeometrySrcType == this->getGeomSrc().fIndexSrc; 7106e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com 7116e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com // we don't want to finalize any reserved geom on the target since 7126e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com // we don't know that the client has finished writing to it. 7136e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com bool targetHasReservedGeom = fDstGpu->hasReservedVerticesOrIndices(); 7146e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com 7156e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com int vcount = vertexCount; 7166e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com int icount = indexCount; 7176e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com 7186e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com if (!insideGeoPush && 7196e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com !unreleasedVertexSpace && 7206e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com !unreleasedIndexSpace && 7216e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com !targetHasReservedGeom && 7226e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com this->geometryHints(&vcount, &icount)) { 7236e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com 7246e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com this->flush(); 72597805382d89b717de3355312a79a957ea4a864c9bsalomon@google.com } 72697805382d89b717de3355312a79a957ea4a864c9bsalomon@google.com} 72797805382d89b717de3355312a79a957ea4a864c9bsalomon@google.com 728b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.combool GrInOrderDrawBuffer::geometryHints(int* vertexCount, 7291c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com int* indexCount) const { 7301c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com // we will recommend a flush if the data could fit in a single 7311c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com // preallocated buffer but none are left and it can't fit 7321c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com // in the current buffer (which may not be prealloced). 733ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com bool flush = false; 734ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com if (NULL != indexCount) { 7351c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com int32_t currIndices = fIndexPool.currentBufferIndices(); 7361c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com if (*indexCount > currIndices && 7371c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com (!fIndexPool.preallocatedBuffersRemaining() && 7381c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com *indexCount <= fIndexPool.preallocatedBufferIndices())) { 7391c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com 7401c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com flush = true; 7411c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com } 7421c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com *indexCount = currIndices; 743ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 744ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com if (NULL != vertexCount) { 745b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com size_t vertexSize = this->getDrawState().getVertexSize(); 746a63389843dd18003382d61c2e4610af09ed07d38jvanverth@google.com int32_t currVertices = fVertexPool.currentBufferVertices(vertexSize); 7471c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com if (*vertexCount > currVertices && 7481c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com (!fVertexPool.preallocatedBuffersRemaining() && 749a63389843dd18003382d61c2e4610af09ed07d38jvanverth@google.com *vertexCount <= fVertexPool.preallocatedBufferVertices(vertexSize))) { 7501c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com 7511c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com flush = true; 752ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 7531c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com *vertexCount = currVertices; 754ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 755ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com return flush; 756ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 757ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 758a63389843dd18003382d61c2e4610af09ed07d38jvanverth@google.combool GrInOrderDrawBuffer::onReserveVertexSpace(size_t vertexSize, 75925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com int vertexCount, 76025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com void** vertices) { 76125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometryPoolState& poolState = fGeoPoolStateStack.back(); 762f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(vertexCount > 0); 763f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL != vertices); 764f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(0 == poolState.fUsedPoolVertexBytes); 765fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 766a63389843dd18003382d61c2e4610af09ed07d38jvanverth@google.com *vertices = fVertexPool.makeSpace(vertexSize, 76725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com vertexCount, 76825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com &poolState.fPoolVertexBuffer, 76925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com &poolState.fPoolStartVertex); 77025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com return NULL != *vertices; 77125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 772fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 77325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.combool GrInOrderDrawBuffer::onReserveIndexSpace(int indexCount, void** indices) { 77425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometryPoolState& poolState = fGeoPoolStateStack.back(); 775f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(indexCount > 0); 776f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL != indices); 777f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(0 == poolState.fUsedPoolIndexBytes); 77825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 77925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com *indices = fIndexPool.makeSpace(indexCount, 78025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com &poolState.fPoolIndexBuffer, 78125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com &poolState.fPoolStartIndex); 78225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com return NULL != *indices; 783ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 784ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 78525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrInOrderDrawBuffer::releaseReservedVertexSpace() { 78625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometryPoolState& poolState = fGeoPoolStateStack.back(); 787fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com const GeometrySrcState& geoSrc = this->getGeomSrc(); 788d57d71a5b857c273d9cf834856e10e663c1ccb91bsalomon@google.com 789d57d71a5b857c273d9cf834856e10e663c1ccb91bsalomon@google.com // If we get a release vertex space call then our current source should either be reserved 790d57d71a5b857c273d9cf834856e10e663c1ccb91bsalomon@google.com // or array (which we copied into reserved space). 791f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(kReserved_GeometrySrcType == geoSrc.fVertexSrc || 792d57d71a5b857c273d9cf834856e10e663c1ccb91bsalomon@google.com kArray_GeometrySrcType == geoSrc.fVertexSrc); 7933f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com 7943f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com // When the caller reserved vertex buffer space we gave it back a pointer 7953f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com // provided by the vertex buffer pool. At each draw we tracked the largest 7963f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com // offset into the pool's pointer that was referenced. Now we return to the 7973f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com // pool any portion at the tail of the allocation that no draw referenced. 798b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com size_t reservedVertexBytes = geoSrc.fVertexSize * geoSrc.fVertexCount; 799fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com fVertexPool.putBack(reservedVertexBytes - 80025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com poolState.fUsedPoolVertexBytes); 80125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com poolState.fUsedPoolVertexBytes = 0; 8023f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com poolState.fPoolVertexBuffer = NULL; 8033f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com poolState.fPoolStartVertex = 0; 80425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 805ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 80625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrInOrderDrawBuffer::releaseReservedIndexSpace() { 80725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometryPoolState& poolState = fGeoPoolStateStack.back(); 808fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com const GeometrySrcState& geoSrc = this->getGeomSrc(); 8091c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com 810d57d71a5b857c273d9cf834856e10e663c1ccb91bsalomon@google.com // If we get a release index space call then our current source should either be reserved 811d57d71a5b857c273d9cf834856e10e663c1ccb91bsalomon@google.com // or array (which we copied into reserved space). 812f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(kReserved_GeometrySrcType == geoSrc.fIndexSrc || 813d57d71a5b857c273d9cf834856e10e663c1ccb91bsalomon@google.com kArray_GeometrySrcType == geoSrc.fIndexSrc); 8143f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com 8153f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com // Similar to releaseReservedVertexSpace we return any unused portion at 8163f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com // the tail 81725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com size_t reservedIndexBytes = sizeof(uint16_t) * geoSrc.fIndexCount; 81825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com fIndexPool.putBack(reservedIndexBytes - poolState.fUsedPoolIndexBytes); 81925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com poolState.fUsedPoolIndexBytes = 0; 8203f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com poolState.fPoolIndexBuffer = NULL; 8213f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com poolState.fPoolStartIndex = 0; 8221c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com} 823fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 824bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.comvoid GrInOrderDrawBuffer::onSetVertexSourceToArray(const void* vertexArray, 825bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com int vertexCount) { 82625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 82725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometryPoolState& poolState = fGeoPoolStateStack.back(); 828f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(0 == poolState.fUsedPoolVertexBytes); 829515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 8301c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com bool success = 8311c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com#endif 832b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com fVertexPool.appendVertices(this->getVertexSize(), 8331c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com vertexCount, 8341c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com vertexArray, 83525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com &poolState.fPoolVertexBuffer, 83625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com &poolState.fPoolStartVertex); 8371c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com GR_DEBUGASSERT(success); 8381c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com} 8391c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com 840bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.comvoid GrInOrderDrawBuffer::onSetIndexSourceToArray(const void* indexArray, 841bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com int indexCount) { 84225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometryPoolState& poolState = fGeoPoolStateStack.back(); 843f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(0 == poolState.fUsedPoolIndexBytes); 844515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 8451c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com bool success = 8461c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com#endif 8471c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com fIndexPool.appendIndices(indexCount, 8481c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com indexArray, 84925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com &poolState.fPoolIndexBuffer, 85025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com &poolState.fPoolStartIndex); 8511c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com GR_DEBUGASSERT(success); 852ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 853ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 8543f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.comvoid GrInOrderDrawBuffer::releaseVertexArray() { 8553f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com // When the client provides an array as the vertex source we handled it 8563f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com // by copying their array into reserved space. 8573f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com this->GrInOrderDrawBuffer::releaseReservedVertexSpace(); 8583f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com} 8593f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com 8603f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.comvoid GrInOrderDrawBuffer::releaseIndexArray() { 8613f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com // When the client provides an array as the index source we handled it 8623f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com // by copying their array into reserved space. 8633f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com this->GrInOrderDrawBuffer::releaseReservedIndexSpace(); 8643f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com} 8653f5a95e9745c5ea1f960d1454cf7df5942fa5dedbsalomon@google.com 86625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrInOrderDrawBuffer::geometrySourceWillPush() { 86725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometryPoolState& poolState = fGeoPoolStateStack.push_back(); 86825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com poolState.fUsedPoolVertexBytes = 0; 86925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com poolState.fUsedPoolIndexBytes = 0; 870515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 87125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com poolState.fPoolVertexBuffer = (GrVertexBuffer*)~0; 87225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com poolState.fPoolStartVertex = ~0; 87325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com poolState.fPoolIndexBuffer = (GrIndexBuffer*)~0; 87425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com poolState.fPoolStartIndex = ~0; 87525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com#endif 87625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 87725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 87825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrInOrderDrawBuffer::geometrySourceWillPop( 87925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com const GeometrySrcState& restoredState) { 880f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fGeoPoolStateStack.count() > 1); 88125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com fGeoPoolStateStack.pop_back(); 88225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometryPoolState& poolState = fGeoPoolStateStack.back(); 88325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com // we have to assume that any slack we had in our vertex/index data 88425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com // is now unreleasable because data may have been appended later in the 88525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com // pool. 88625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com if (kReserved_GeometrySrcType == restoredState.fVertexSrc || 88725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com kArray_GeometrySrcType == restoredState.fVertexSrc) { 888b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com poolState.fUsedPoolVertexBytes = restoredState.fVertexSize * restoredState.fVertexCount; 88925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } 89025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com if (kReserved_GeometrySrcType == restoredState.fIndexSrc || 89125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com kArray_GeometrySrcType == restoredState.fIndexSrc) { 892fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com poolState.fUsedPoolIndexBytes = sizeof(uint16_t) * 89325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com restoredState.fIndexCount; 89425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } 89525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 89625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 89786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.combool GrInOrderDrawBuffer::needsNewState() const { 898ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com return fStates.empty() || !fStates.back().isEqual(this->getDrawState()); 899ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 900ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 90186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.combool GrInOrderDrawBuffer::needsNewClip() const { 902f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fClips.count() == fClipOrigins.count()); 903358e427763f0971af436f07170c641f747b94595bsalomon@google.com if (this->getDrawState().isClipState()) { 904fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com if (fClipSet && 905358e427763f0971af436f07170c641f747b94595bsalomon@google.com (fClips.empty() || 90602ddc8b85ace91b15feb329a6a1d5d62b2b846c6bsalomon@google.com fClips.back() != *this->getClip()->fClipStack || 90702ddc8b85ace91b15feb329a6a1d5d62b2b846c6bsalomon@google.com fClipOrigins.back() != this->getClip()->fOrigin)) { 90886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com return true; 90986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 910ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 911ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com return false; 912ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 913d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com 9142a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.orgvoid GrInOrderDrawBuffer::addToCmdBuffer(uint8_t cmd) { 9152a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org SkASSERT(!cmd_has_trace_marker(cmd)); 9162a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); 9172a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org if (activeTraceMarkers.count() > 0) { 9182a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org fCmds.push_back(add_trace_bit(cmd)); 9192a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org fGpuCmdMarkers.push_back(activeTraceMarkers); 9202a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org } else { 9212a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org fCmds.push_back(cmd); 9222a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org } 9232a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org} 9242a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org 925a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.comvoid GrInOrderDrawBuffer::recordClip() { 9262a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org fClips.push_back(*this->getClip()->fClipStack); 92702ddc8b85ace91b15feb329a6a1d5d62b2b846c6bsalomon@google.com fClipOrigins.push_back() = this->getClip()->fOrigin; 92886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com fClipSet = false; 9292a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org this->addToCmdBuffer(kSetClip_Cmd); 930a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com} 931a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com 932a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.comvoid GrInOrderDrawBuffer::recordState() { 933ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fStates.push_back().saveFrom(this->getDrawState()); 9342a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org this->addToCmdBuffer(kSetState_Cmd); 935a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com} 936a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com 93774749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.comGrInOrderDrawBuffer::DrawRecord* GrInOrderDrawBuffer::recordDraw(const DrawInfo& info) { 9382a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org this->addToCmdBuffer(kDraw_Cmd); 939d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com return &fDraws.push_back(info); 94074749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com} 94174749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com 942ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.comGrInOrderDrawBuffer::StencilPath* GrInOrderDrawBuffer::recordStencilPath() { 9432a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org this->addToCmdBuffer(kStencilPath_Cmd); 944ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com return &fStencilPaths.push_back(); 945ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com} 946ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com 94732184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.orgGrInOrderDrawBuffer::DrawPath* GrInOrderDrawBuffer::recordDrawPath() { 9482a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org this->addToCmdBuffer(kDrawPath_Cmd); 9499b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org return &fDrawPath.push_back(); 9509b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org} 9519b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org 9529b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.orgGrInOrderDrawBuffer::DrawPaths* GrInOrderDrawBuffer::recordDrawPaths() { 9532a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org this->addToCmdBuffer(kDrawPaths_Cmd); 95432184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org return &fDrawPaths.push_back(); 955c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org} 956c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org 957a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.comGrInOrderDrawBuffer::Clear* GrInOrderDrawBuffer::recordClear() { 9582a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org this->addToCmdBuffer(kClear_Cmd); 959a4f6b10818819a16bc94738e2eda42dfec332c43bsalomon@google.com return &fClears.push_back(); 96086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com} 961d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com 962116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.comGrInOrderDrawBuffer::CopySurface* GrInOrderDrawBuffer::recordCopySurface() { 9632a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org this->addToCmdBuffer(kCopySurface_Cmd); 964116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com return &fCopySurfaces.push_back(); 965116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com} 966116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com 967116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com 968beb1af78d016d2700c350487a383c6bcfa7e2e20robertphillips@google.comvoid GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { 969beb1af78d016d2700c350487a383c6bcfa7e2e20robertphillips@google.com INHERITED::clipWillBeSet(newClipData); 97086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com fClipSet = true; 971d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fClipProxyState = kUnknown_ClipProxyState; 972ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 973