1ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2010 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 8ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 9ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 10ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 11ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrDrawTarget.h" 1226e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com#include "GrContext.h" 13c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com#include "GrDrawTargetCaps.h" 14c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org#include "GrPath.h" 158f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com#include "GrRenderTarget.h" 1686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com#include "GrTexture.h" 1725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com#include "GrVertexBuffer.h" 18ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 195f74cf8c49701f514b69dc6f1a8b5c0ffd78af0asugoi@google.com#include "SkStrokeRec.h" 2012b4e27ae1a29460e91a59f38122483e1faec697sugoi@google.com 21ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com//////////////////////////////////////////////////////////////////////////////// 22ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 23d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.comGrDrawTarget::DrawInfo& GrDrawTarget::DrawInfo::operator =(const DrawInfo& di) { 24d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fPrimitiveType = di.fPrimitiveType; 25d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fStartVertex = di.fStartVertex; 26d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fStartIndex = di.fStartIndex; 27d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fVertexCount = di.fVertexCount; 28d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fIndexCount = di.fIndexCount; 29d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 30d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fInstanceCount = di.fInstanceCount; 31d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fVerticesPerInstance = di.fVerticesPerInstance; 32d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fIndicesPerInstance = di.fIndicesPerInstance; 33d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 34d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (NULL != di.fDevBounds) { 35f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(di.fDevBounds == &di.fDevBoundsStorage); 36d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fDevBoundsStorage = di.fDevBoundsStorage; 37d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fDevBounds = &fDevBoundsStorage; 38d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } else { 39d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fDevBounds = NULL; 40d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 4126e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com 4226e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com fDstCopy = di.fDstCopy; 4326e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com 44d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com return *this; 45d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com} 46d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 47515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 48d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.combool GrDrawTarget::DrawInfo::isInstanced() const { 49d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (fInstanceCount > 0) { 50f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(0 == fIndexCount % fIndicesPerInstance); 51f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(0 == fVertexCount % fVerticesPerInstance); 52f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fIndexCount / fIndicesPerInstance == fInstanceCount); 53f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fVertexCount / fVerticesPerInstance == fInstanceCount); 54d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // there is no way to specify a non-zero start index to drawIndexedInstances(). 55f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(0 == fStartIndex); 56d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com return true; 57d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } else { 58f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(!fVerticesPerInstance); 59f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(!fIndicesPerInstance); 60d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com return false; 61d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 62d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com} 63d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com#endif 64d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 65d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.comvoid GrDrawTarget::DrawInfo::adjustInstanceCount(int instanceOffset) { 66f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(this->isInstanced()); 67f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(instanceOffset + fInstanceCount >= 0); 68d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fInstanceCount += instanceOffset; 69d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fVertexCount = fVerticesPerInstance * fInstanceCount; 70d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fIndexCount = fIndicesPerInstance * fInstanceCount; 71d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com} 72d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 73d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.comvoid GrDrawTarget::DrawInfo::adjustStartVertex(int vertexOffset) { 74d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fStartVertex += vertexOffset; 75f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fStartVertex >= 0); 76d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com} 77d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 78d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.comvoid GrDrawTarget::DrawInfo::adjustStartIndex(int indexOffset) { 79f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(this->isIndexed()); 80d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fStartIndex += indexOffset; 81f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fStartIndex >= 0); 82d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com} 83d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 84d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com//////////////////////////////////////////////////////////////////////////////// 85d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 8625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com#define DEBUG_INVAL_BUFFER 0xdeadcafe 8725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com#define DEBUG_INVAL_START_IDX -1 8825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 896e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.comGrDrawTarget::GrDrawTarget(GrContext* context) 906e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com : fClip(NULL) 91a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org , fContext(context) 922a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org , fGpuTraceMarkerCount(0) { 93f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL != context); 946e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com 95a5d056ae0b04021dfb44c2c7a3d6a34e060261b8bsalomon@google.com fDrawState = &fDefaultDrawState; 96a5d056ae0b04021dfb44c2c7a3d6a34e060261b8bsalomon@google.com // We assume that fDrawState always owns a ref to the object it points at. 97a5d056ae0b04021dfb44c2c7a3d6a34e060261b8bsalomon@google.com fDefaultDrawState.ref(); 9825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometrySrcState& geoSrc = fGeoSrcStateStack.push_back(); 99515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 10025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fVertexCount = DEBUG_INVAL_START_IDX; 10125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fVertexBuffer = (GrVertexBuffer*)DEBUG_INVAL_BUFFER; 10225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fIndexCount = DEBUG_INVAL_START_IDX; 10325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fIndexBuffer = (GrIndexBuffer*)DEBUG_INVAL_BUFFER; 104ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif 10525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fVertexSrc = kNone_GeometrySrcType; 10625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fIndexSrc = kNone_GeometrySrcType; 10725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 10825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 10925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comGrDrawTarget::~GrDrawTarget() { 110f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(1 == fGeoSrcStateStack.count()); 1110e51577a14f903ffeafa117a75954baeb173ffb9humper@google.com SkDEBUGCODE(GeometrySrcState& geoSrc = fGeoSrcStateStack.back()); 112f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(kNone_GeometrySrcType == geoSrc.fIndexSrc); 113f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(kNone_GeometrySrcType == geoSrc.fVertexSrc); 114a5d056ae0b04021dfb44c2c7a3d6a34e060261b8bsalomon@google.com fDrawState->unref(); 1154a018bb20bf969a38ec11d9506843f06366dfa7cbsalomon@google.com} 1164a018bb20bf969a38ec11d9506843f06366dfa7cbsalomon@google.com 1174a018bb20bf969a38ec11d9506843f06366dfa7cbsalomon@google.comvoid GrDrawTarget::releaseGeometry() { 11825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com int popCnt = fGeoSrcStateStack.count() - 1; 11925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com while (popCnt) { 12025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->popGeometrySource(); 12125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com --popCnt; 12225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } 1234a018bb20bf969a38ec11d9506843f06366dfa7cbsalomon@google.com this->resetVertexSource(); 1244a018bb20bf969a38ec11d9506843f06366dfa7cbsalomon@google.com this->resetIndexSource(); 125ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 126ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 127beb1af78d016d2700c350487a383c6bcfa7e2e20robertphillips@google.comvoid GrDrawTarget::setClip(const GrClipData* clip) { 12886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com clipWillBeSet(clip); 129ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fClip = clip; 130ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 131ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 132beb1af78d016d2700c350487a383c6bcfa7e2e20robertphillips@google.comconst GrClipData* GrDrawTarget::getClip() const { 133ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com return fClip; 134ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 135ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 136a5d056ae0b04021dfb44c2c7a3d6a34e060261b8bsalomon@google.comvoid GrDrawTarget::setDrawState(GrDrawState* drawState) { 137f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL != fDrawState); 138a5d056ae0b04021dfb44c2c7a3d6a34e060261b8bsalomon@google.com if (NULL == drawState) { 139a5d056ae0b04021dfb44c2c7a3d6a34e060261b8bsalomon@google.com drawState = &fDefaultDrawState; 140a5d056ae0b04021dfb44c2c7a3d6a34e060261b8bsalomon@google.com } 141a5d056ae0b04021dfb44c2c7a3d6a34e060261b8bsalomon@google.com if (fDrawState != drawState) { 142a5d056ae0b04021dfb44c2c7a3d6a34e060261b8bsalomon@google.com fDrawState->unref(); 143a5d056ae0b04021dfb44c2c7a3d6a34e060261b8bsalomon@google.com drawState->ref(); 144a5d056ae0b04021dfb44c2c7a3d6a34e060261b8bsalomon@google.com fDrawState = drawState; 145a5d056ae0b04021dfb44c2c7a3d6a34e060261b8bsalomon@google.com } 146a5d056ae0b04021dfb44c2c7a3d6a34e060261b8bsalomon@google.com} 147a5d056ae0b04021dfb44c2c7a3d6a34e060261b8bsalomon@google.com 148b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.combool GrDrawTarget::reserveVertexSpace(size_t vertexSize, 14925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com int vertexCount, 15025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com void** vertices) { 15125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); 15225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com bool acquired = false; 15325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com if (vertexCount > 0) { 154f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL != vertices); 15525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->releasePreviousVertexSource(); 15625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fVertexSrc = kNone_GeometrySrcType; 157ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 158b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com acquired = this->onReserveVertexSpace(vertexSize, 15925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com vertexCount, 16025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com vertices); 16125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } 16225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com if (acquired) { 16325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fVertexSrc = kReserved_GeometrySrcType; 16425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fVertexCount = vertexCount; 165b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com geoSrc.fVertexSize = vertexSize; 16625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } else if (NULL != vertices) { 16725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com *vertices = NULL; 16825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } 16925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com return acquired; 17025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 17125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 17225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.combool GrDrawTarget::reserveIndexSpace(int indexCount, 17325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com void** indices) { 17425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); 17525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com bool acquired = false; 17625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com if (indexCount > 0) { 177f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL != indices); 17825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->releasePreviousIndexSource(); 17925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fIndexSrc = kNone_GeometrySrcType; 180d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 18125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com acquired = this->onReserveIndexSpace(indexCount, indices); 182ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 18325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com if (acquired) { 18425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fIndexSrc = kReserved_GeometrySrcType; 18525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fIndexCount = indexCount; 18625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } else if (NULL != indices) { 18725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com *indices = NULL; 18825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } 18925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com return acquired; 190d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 191ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 192ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 193b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.combool GrDrawTarget::reserveVertexAndIndexSpace(int vertexCount, 194e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com int indexCount, 195e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com void** vertices, 196e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com void** indices) { 197b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com size_t vertexSize = this->drawState()->getVertexSize(); 198b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com this->willReserveVertexAndIndexSpace(vertexCount, indexCount); 199e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com if (vertexCount) { 200b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com if (!this->reserveVertexSpace(vertexSize, vertexCount, vertices)) { 201e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com if (indexCount) { 202e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com this->resetIndexSource(); 203e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com } 204e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com return false; 205e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com } 206e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com } 207e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com if (indexCount) { 208e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com if (!this->reserveIndexSpace(indexCount, indices)) { 209e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com if (vertexCount) { 210e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com this->resetVertexSource(); 211e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com } 212e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com return false; 213e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com } 214e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com } 215e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com return true; 216e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com} 217e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com 218b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.combool GrDrawTarget::geometryHints(int32_t* vertexCount, 219ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com int32_t* indexCount) const { 220ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com if (NULL != vertexCount) { 221ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com *vertexCount = -1; 222ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 223ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com if (NULL != indexCount) { 224ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com *indexCount = -1; 225ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 226ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com return false; 227ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 228ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 22925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrDrawTarget::releasePreviousVertexSource() { 23025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); 23125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com switch (geoSrc.fVertexSrc) { 23225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com case kNone_GeometrySrcType: 23325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com break; 23425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com case kArray_GeometrySrcType: 23525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->releaseVertexArray(); 23625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com break; 23725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com case kReserved_GeometrySrcType: 23825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->releaseReservedVertexSpace(); 23925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com break; 24025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com case kBuffer_GeometrySrcType: 24125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fVertexBuffer->unref(); 242515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 24325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fVertexBuffer = (GrVertexBuffer*)DEBUG_INVAL_BUFFER; 24425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com#endif 24525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com break; 24625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com default: 24788cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("Unknown Vertex Source Type."); 24825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com break; 24925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } 25025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 25125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 25225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrDrawTarget::releasePreviousIndexSource() { 25325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); 25425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com switch (geoSrc.fIndexSrc) { 25525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com case kNone_GeometrySrcType: // these two don't require 25625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com break; 25725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com case kArray_GeometrySrcType: 25825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->releaseIndexArray(); 25925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com break; 26025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com case kReserved_GeometrySrcType: 26125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->releaseReservedIndexSpace(); 26225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com break; 26325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com case kBuffer_GeometrySrcType: 26425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fIndexBuffer->unref(); 265515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 26625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fIndexBuffer = (GrIndexBuffer*)DEBUG_INVAL_BUFFER; 26725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com#endif 26825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com break; 26925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com default: 27088cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("Unknown Index Source Type."); 27125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com break; 27225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } 273ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 274ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 275b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.comvoid GrDrawTarget::setVertexSourceToArray(const void* vertexArray, 2761c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com int vertexCount) { 27725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->releasePreviousVertexSource(); 27825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); 27925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fVertexSrc = kArray_GeometrySrcType; 280b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com geoSrc.fVertexSize = this->drawState()->getVertexSize(); 28125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fVertexCount = vertexCount; 282bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com this->onSetVertexSourceToArray(vertexArray, vertexCount); 283ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 284ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 2851c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.comvoid GrDrawTarget::setIndexSourceToArray(const void* indexArray, 2861c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com int indexCount) { 28725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->releasePreviousIndexSource(); 28825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); 28925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fIndexSrc = kArray_GeometrySrcType; 29025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fIndexCount = indexCount; 291bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com this->onSetIndexSourceToArray(indexArray, indexCount); 292ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 293ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 294b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.comvoid GrDrawTarget::setVertexSourceToBuffer(const GrVertexBuffer* buffer) { 29525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->releasePreviousVertexSource(); 29625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); 29725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fVertexSrc = kBuffer_GeometrySrcType; 29825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fVertexBuffer = buffer; 29925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com buffer->ref(); 300b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com geoSrc.fVertexSize = this->drawState()->getVertexSize(); 301ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 302ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 303ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comvoid GrDrawTarget::setIndexSourceToBuffer(const GrIndexBuffer* buffer) { 30425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->releasePreviousIndexSource(); 30525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); 30625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fIndexSrc = kBuffer_GeometrySrcType; 30725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fIndexBuffer = buffer; 30825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com buffer->ref(); 309ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 310ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 31125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrDrawTarget::resetVertexSource() { 31225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->releasePreviousVertexSource(); 31325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); 31425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fVertexSrc = kNone_GeometrySrcType; 31525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 31625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 31725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrDrawTarget::resetIndexSource() { 31825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->releasePreviousIndexSource(); 31925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); 32025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com geoSrc.fIndexSrc = kNone_GeometrySrcType; 32125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 32225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 32325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrDrawTarget::pushGeometrySource() { 32425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->geometrySourceWillPush(); 32525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GeometrySrcState& newState = fGeoSrcStateStack.push_back(); 32625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com newState.fIndexSrc = kNone_GeometrySrcType; 32725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com newState.fVertexSrc = kNone_GeometrySrcType; 328515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 32925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com newState.fVertexCount = ~0; 33025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com newState.fVertexBuffer = (GrVertexBuffer*)~0; 33125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com newState.fIndexCount = ~0; 33225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com newState.fIndexBuffer = (GrIndexBuffer*)~0; 33325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com#endif 33425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 33525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 33625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrDrawTarget::popGeometrySource() { 33725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com // if popping last element then pops are unbalanced with pushes 338f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fGeoSrcStateStack.count() > 1); 339d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 34025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->geometrySourceWillPop(fGeoSrcStateStack.fromBack(1)); 34125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->releasePreviousVertexSource(); 34225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->releasePreviousIndexSource(); 34325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com fGeoSrcStateStack.pop_back(); 34425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 34525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 34625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com//////////////////////////////////////////////////////////////////////////////// 34725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 348e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.combool GrDrawTarget::checkDraw(GrPrimitiveType type, int startVertex, 349e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com int startIndex, int vertexCount, 350e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com int indexCount) const { 351cddaf340f1474cc1ff429b8ef9bc8739c72f80babsalomon@google.com const GrDrawState& drawState = this->getDrawState(); 352515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 353e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com const GeometrySrcState& geoSrc = fGeoSrcStateStack.back(); 35425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com int maxVertex = startVertex + vertexCount; 35525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com int maxValidVertex; 35625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com switch (geoSrc.fVertexSrc) { 35725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com case kNone_GeometrySrcType: 35888cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("Attempting to draw without vertex src."); 35925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com case kReserved_GeometrySrcType: // fallthrough 36025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com case kArray_GeometrySrcType: 36125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com maxValidVertex = geoSrc.fVertexCount; 36225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com break; 36325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com case kBuffer_GeometrySrcType: 364089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org maxValidVertex = static_cast<int>(geoSrc.fVertexBuffer->gpuMemorySize() / geoSrc.fVertexSize); 36525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com break; 36625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } 36725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com if (maxVertex > maxValidVertex) { 36888cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("Drawing outside valid vertex range."); 36925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } 370e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com if (indexCount > 0) { 371e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com int maxIndex = startIndex + indexCount; 372e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com int maxValidIndex; 373e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com switch (geoSrc.fIndexSrc) { 374e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com case kNone_GeometrySrcType: 37588cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("Attempting to draw indexed geom without index src."); 376e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com case kReserved_GeometrySrcType: // fallthrough 377e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com case kArray_GeometrySrcType: 378e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com maxValidIndex = geoSrc.fIndexCount; 379e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com break; 380e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com case kBuffer_GeometrySrcType: 381089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org maxValidIndex = static_cast<int>(geoSrc.fIndexBuffer->gpuMemorySize() / sizeof(uint16_t)); 382e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com break; 383e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com } 384e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com if (maxIndex > maxValidIndex) { 38588cb22b6b4816c7a9ca6c5b795965b4606f9eb7bcommit-bot@chromium.org SkFAIL("Index reads outside valid index range."); 386e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com } 38725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } 388b4725b4ee617a6a2524765f79310714a5dad4b6absalomon@google.com 389f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL != drawState.getRenderTarget()); 390eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com 391eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com for (int s = 0; s < drawState.numColorStages(); ++s) { 392eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com const GrEffectRef& effect = *drawState.getColorStage(s).getEffect(); 393eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com int numTextures = effect->numTextures(); 394eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com for (int t = 0; t < numTextures; ++t) { 395eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com GrTexture* texture = effect->texture(t); 396f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(texture->asRenderTarget() != drawState.getRenderTarget()); 397eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com } 398eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com } 399eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com for (int s = 0; s < drawState.numCoverageStages(); ++s) { 400eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com const GrEffectRef& effect = *drawState.getCoverageStage(s).getEffect(); 401eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com int numTextures = effect->numTextures(); 402eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com for (int t = 0; t < numTextures; ++t) { 403eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com GrTexture* texture = effect->texture(t); 404f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(texture->asRenderTarget() != drawState.getRenderTarget()); 405b4725b4ee617a6a2524765f79310714a5dad4b6absalomon@google.com } 406b4725b4ee617a6a2524765f79310714a5dad4b6absalomon@google.com } 407ff6ea2663f76aa85ec55ddd0f00ca7906f1bc4e3commit-bot@chromium.org 408f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(drawState.validateVertexAttribs()); 40925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com#endif 4108f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com if (NULL == drawState.getRenderTarget()) { 4110ba52fcf93d52a3f230d1f185eea0c8719c176fbbsalomon@google.com return false; 4120ba52fcf93d52a3f230d1f185eea0c8719c176fbbsalomon@google.com } 413e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com return true; 414e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com} 415e826262939dac3e67cb5ce66d4b9faeb8e2538e6bsalomon@google.com 416c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.orgbool GrDrawTarget::setupDstReadIfNecessary(GrDeviceCoordTexture* dstCopy, const SkRect* drawBounds) { 417b515881446c303a50d9b2dd38b9163b4e5c625a2bsalomon@google.com if (this->caps()->dstReadInShaderSupport() || !this->getDrawState().willEffectReadDstColor()) { 41826e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com return true; 41926e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com } 42026e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com GrRenderTarget* rt = this->drawState()->getRenderTarget(); 421fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org SkIRect copyRect; 422c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org const GrClipData* clip = this->getClip(); 423c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org clip->getConservativeBounds(rt, ©Rect); 424c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org 425c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org if (NULL != drawBounds) { 426c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org SkIRect drawIBounds; 427c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org drawBounds->roundOut(&drawIBounds); 428bb5c46591c50d05418467cd1c4e927ceb85c2ba9commit-bot@chromium.org if (!copyRect.intersect(drawIBounds)) { 429515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 430bb5c46591c50d05418467cd1c4e927ceb85c2ba9commit-bot@chromium.org GrPrintf("Missed an early reject. Bailing on draw from setupDstReadIfNecessary.\n"); 431bb5c46591c50d05418467cd1c4e927ceb85c2ba9commit-bot@chromium.org#endif 432bb5c46591c50d05418467cd1c4e927ceb85c2ba9commit-bot@chromium.org return false; 433bb5c46591c50d05418467cd1c4e927ceb85c2ba9commit-bot@chromium.org } 434bb5c46591c50d05418467cd1c4e927ceb85c2ba9commit-bot@chromium.org } else { 435515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 436bb5c46591c50d05418467cd1c4e927ceb85c2ba9commit-bot@chromium.org //GrPrintf("No dev bounds when dst copy is made.\n"); 437bb5c46591c50d05418467cd1c4e927ceb85c2ba9commit-bot@chromium.org#endif 438bb5c46591c50d05418467cd1c4e927ceb85c2ba9commit-bot@chromium.org } 43905a2ee052c9ef4c781b7b590b00b3d2da3b3449askia.committer@gmail.com 44063150afcc0c4120370db6f5566cd404584345668commit-bot@chromium.org // MSAA consideration: When there is support for reading MSAA samples in the shader we could 44163150afcc0c4120370db6f5566cd404584345668commit-bot@chromium.org // have per-sample dst values by making the copy multisampled. 44226e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com GrTextureDesc desc; 443eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.com this->initCopySurfaceDstDesc(rt, &desc); 444bb5c46591c50d05418467cd1c4e927ceb85c2ba9commit-bot@chromium.org desc.fWidth = copyRect.width(); 445bb5c46591c50d05418467cd1c4e927ceb85c2ba9commit-bot@chromium.org desc.fHeight = copyRect.height(); 44626e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com 44726e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com GrAutoScratchTexture ast(fContext, desc, GrContext::kApprox_ScratchTexMatch); 44826e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com 44926e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com if (NULL == ast.texture()) { 45026e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com GrPrintf("Failed to create temporary copy of destination texture.\n"); 45126e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com return false; 45226e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com } 453e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com SkIPoint dstPoint = {0, 0}; 454e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com if (this->copySurface(ast.texture(), rt, copyRect, dstPoint)) { 455c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org dstCopy->setTexture(ast.texture()); 456c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org dstCopy->setOffset(copyRect.fLeft, copyRect.fTop); 457e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com return true; 458e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com } else { 459e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com return false; 460e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com } 46126e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com} 46226e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com 463d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.comvoid GrDrawTarget::drawIndexed(GrPrimitiveType type, 464d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com int startVertex, 465d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com int startIndex, 466d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com int vertexCount, 467d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com int indexCount, 468d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com const SkRect* devBounds) { 46974749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com if (indexCount > 0 && this->checkDraw(type, startVertex, startIndex, vertexCount, indexCount)) { 47074749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com DrawInfo info; 47174749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com info.fPrimitiveType = type; 47274749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com info.fStartVertex = startVertex; 47374749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com info.fStartIndex = startIndex; 47474749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com info.fVertexCount = vertexCount; 47574749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com info.fIndexCount = indexCount; 476d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 477d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fInstanceCount = 0; 478d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fVerticesPerInstance = 0; 479d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fIndicesPerInstance = 0; 480d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 481d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (NULL != devBounds) { 482d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.setDevBounds(*devBounds); 483d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 48426e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com // TODO: We should continue with incorrect blending. 48526e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com if (!this->setupDstReadIfNecessary(&info)) { 48626e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com return; 48726e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com } 48874749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com this->onDraw(info); 4898214587a79c0a4398664289c4d1ce2c0bf542b42bsalomon@google.com } 49025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 49125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 49225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrDrawTarget::drawNonIndexed(GrPrimitiveType type, 49325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com int startVertex, 494d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com int vertexCount, 495d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com const SkRect* devBounds) { 49674749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com if (vertexCount > 0 && this->checkDraw(type, startVertex, -1, vertexCount, -1)) { 49774749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com DrawInfo info; 49874749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com info.fPrimitiveType = type; 49974749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com info.fStartVertex = startVertex; 50074749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com info.fStartIndex = 0; 50174749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com info.fVertexCount = vertexCount; 50274749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com info.fIndexCount = 0; 503d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 504d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fInstanceCount = 0; 505d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fVerticesPerInstance = 0; 506d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fIndicesPerInstance = 0; 507d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 508d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (NULL != devBounds) { 509d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.setDevBounds(*devBounds); 510d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 51126e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com // TODO: We should continue with incorrect blending. 51226e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com if (!this->setupDstReadIfNecessary(&info)) { 51326e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com return; 51426e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com } 51574749cd45c29b4f5300e2518f2c2c765ce8ae208bsalomon@google.com this->onDraw(info); 5168214587a79c0a4398664289c4d1ce2c0bf542b42bsalomon@google.com } 51725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 51825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 51932184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.orgvoid GrDrawTarget::stencilPath(const GrPath* path, SkPath::FillType fill) { 52064aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com // TODO: extract portions of checkDraw that are relevant to path stenciling. 521f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL != path); 522c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org SkASSERT(this->caps()->pathRenderingSupport()); 523f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(!SkPath::IsInverseFillType(fill)); 52432184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org this->onStencilPath(path, fill); 52564aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com} 52664aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com 52732184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.orgvoid GrDrawTarget::drawPath(const GrPath* path, SkPath::FillType fill) { 528c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org // TODO: extract portions of checkDraw that are relevant to path rendering. 529c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org SkASSERT(NULL != path); 530c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org SkASSERT(this->caps()->pathRenderingSupport()); 531c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org const GrDrawState* drawState = &getDrawState(); 532c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org 533c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org SkRect devBounds; 534c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org if (SkPath::IsInverseFillType(fill)) { 535c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org devBounds = SkRect::MakeWH(SkIntToScalar(drawState->getRenderTarget()->width()), 536c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org SkIntToScalar(drawState->getRenderTarget()->height())); 537c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org } else { 538c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org devBounds = path->getBounds(); 539c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org } 540c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org SkMatrix viewM = drawState->getViewMatrix(); 541c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org viewM.mapRect(&devBounds); 542c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org 543c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org GrDeviceCoordTexture dstCopy; 544c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org if (!this->setupDstReadIfNecessary(&dstCopy, &devBounds)) { 545c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org return; 546c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org } 547c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org 54832184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org this->onDrawPath(path, fill, dstCopy.texture() ? &dstCopy : NULL); 549c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org} 550c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org 551ecc45365b6429ee4cbe1748dc6667b862d5f0f71commit-bot@chromium.orgvoid GrDrawTarget::drawPaths(int pathCount, const GrPath** paths, 5529b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org const SkMatrix* transforms, 5539b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org SkPath::FillType fill, SkStrokeRec::Style stroke) { 5549b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org SkASSERT(pathCount > 0); 5559b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org SkASSERT(NULL != paths); 5569b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org SkASSERT(NULL != paths[0]); 5579b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org SkASSERT(this->caps()->pathRenderingSupport()); 5589b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org SkASSERT(!SkPath::IsInverseFillType(fill)); 5599b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org 5609b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org const GrDrawState* drawState = &getDrawState(); 5619b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org 5629b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org SkRect devBounds; 563ecc45365b6429ee4cbe1748dc6667b862d5f0f71commit-bot@chromium.org for (int i = 0; i < pathCount; ++i) { 5649b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org SkRect mappedPathBounds; 5659b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org transforms[i].mapRect(&mappedPathBounds, paths[i]->getBounds()); 5669b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org devBounds.join(mappedPathBounds); 5679b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org } 5689b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org 5699b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org SkMatrix viewM = drawState->getViewMatrix(); 5709b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org viewM.mapRect(&devBounds); 5719b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org 5729b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org GrDeviceCoordTexture dstCopy; 5739b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org if (!this->setupDstReadIfNecessary(&dstCopy, &devBounds)) { 5749b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org return; 5759b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org } 5769b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org 5779b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org this->onDrawPaths(pathCount, paths, transforms, fill, stroke, 5789b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org dstCopy.texture() ? &dstCopy : NULL); 5799b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org} 5809b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org 5813eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdanieltypedef GrTraceMarkerSet::Iter TMIter; 5823eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdanielvoid GrDrawTarget::saveActiveTraceMarkers() { 5833eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel if (this->caps()->gpuTracingSupport()) { 5843eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel SkASSERT(0 == fStoredTraceMarkers.count()); 5853eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel fStoredTraceMarkers.addSet(fActiveTraceMarkers); 5863eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel for (TMIter iter = fStoredTraceMarkers.begin(); iter != fStoredTraceMarkers.end(); ++iter) { 5873eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel this->removeGpuTraceMarker(&(*iter)); 5883eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel } 5893eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel } 5903eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel} 5913eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel 5923eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdanielvoid GrDrawTarget::restoreActiveTraceMarkers() { 5933eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel if (this->caps()->gpuTracingSupport()) { 5943eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel SkASSERT(0 == fActiveTraceMarkers.count()); 5953eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel for (TMIter iter = fStoredTraceMarkers.begin(); iter != fStoredTraceMarkers.end(); ++iter) { 5963eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel this->addGpuTraceMarker(&(*iter)); 5973eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel } 5983eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel for (TMIter iter = fActiveTraceMarkers.begin(); iter != fActiveTraceMarkers.end(); ++iter) { 5993eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel this->fStoredTraceMarkers.remove(*iter); 6003eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel } 6013eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel } 6023eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel} 6033eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel 6043eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdanielvoid GrDrawTarget::addGpuTraceMarker(const GrGpuTraceMarker* marker) { 605a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org if (this->caps()->gpuTracingSupport()) { 6062a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org SkASSERT(fGpuTraceMarkerCount >= 0); 6072a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org this->fActiveTraceMarkers.add(*marker); 6082a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org this->didAddGpuTraceMarker(); 6092a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org ++fGpuTraceMarkerCount; 610a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org } 611a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org} 612a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org 6133eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdanielvoid GrDrawTarget::removeGpuTraceMarker(const GrGpuTraceMarker* marker) { 614a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org if (this->caps()->gpuTracingSupport()) { 6152a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org SkASSERT(fGpuTraceMarkerCount >= 1); 6162a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org this->fActiveTraceMarkers.remove(*marker); 6172a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org this->didRemoveGpuTraceMarker(); 6182a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org --fGpuTraceMarkerCount; 619a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org } 620a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org} 621a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org 62225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com//////////////////////////////////////////////////////////////////////////////// 62386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 62486c1f71625970610e768d3bf26c933db2cd685babsalomon@google.combool GrDrawTarget::willUseHWAALines() const { 6252b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com // There is a conflict between using smooth lines and our use of premultiplied alpha. Smooth 6262b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com // lines tweak the incoming alpha value but not in a premul-alpha way. So we only use them when 6272b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com // our alpha is 0xff and tweaking the color for partial coverage is OK 628bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com if (!this->caps()->hwAALineSupport() || 6298f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com !this->getDrawState().isHWAntialiasState()) { 63086c1f71625970610e768d3bf26c933db2cd685babsalomon@google.com return false; 63186c1f71625970610e768d3bf26c933db2cd685babsalomon@google.com } 6322b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com GrDrawState::BlendOptFlags opts = this->getDrawState().getBlendOpts(); 6332b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com return (GrDrawState::kDisableBlend_BlendOptFlag & opts) && 6342b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com (GrDrawState::kCoverageAsAlpha_BlendOptFlag & opts); 635d46e2423a71d38b8a057cec2356741e35b03334dbsalomon@google.com} 636d46e2423a71d38b8a057cec2356741e35b03334dbsalomon@google.com 637d46e2423a71d38b8a057cec2356741e35b03334dbsalomon@google.combool GrDrawTarget::canApplyCoverage() const { 63886c1f71625970610e768d3bf26c933db2cd685babsalomon@google.com // we can correctly apply coverage if a) we have dual source blending 63986c1f71625970610e768d3bf26c933db2cd685babsalomon@google.com // or b) one of our blend optimizations applies. 640bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com return this->caps()->dualSourceBlendingSupport() || 6412b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com GrDrawState::kNone_BlendOpt != this->getDrawState().getBlendOpts(true); 642471d471dcd7422e5dd9c822c1092b2ba4721dcfebsalomon@google.com} 643471d471dcd7422e5dd9c822c1092b2ba4721dcfebsalomon@google.com 644934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com//////////////////////////////////////////////////////////////////////////////// 645934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com 646934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.comvoid GrDrawTarget::drawIndexedInstances(GrPrimitiveType type, 647934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com int instanceCount, 648934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com int verticesPerInstance, 649d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com int indicesPerInstance, 650d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com const SkRect* devBounds) { 651934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com if (!verticesPerInstance || !indicesPerInstance) { 652934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com return; 653934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com } 654934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com 655d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com int maxInstancesPerDraw = this->indexCountInCurrentSource() / indicesPerInstance; 656d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (!maxInstancesPerDraw) { 657934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com return; 658934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com } 659934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com 660d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com DrawInfo info; 661d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fPrimitiveType = type; 662d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fStartIndex = 0; 663d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fStartVertex = 0; 664d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fIndicesPerInstance = indicesPerInstance; 665d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fVerticesPerInstance = verticesPerInstance; 666d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 667d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com // Set the same bounds for all the draws. 668d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (NULL != devBounds) { 669d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.setDevBounds(*devBounds); 670d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 67126e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com // TODO: We should continue with incorrect blending. 67226e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com if (!this->setupDstReadIfNecessary(&info)) { 67326e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com return; 67426e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com } 675d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 676934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com while (instanceCount) { 677972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org info.fInstanceCount = SkTMin(instanceCount, maxInstancesPerDraw); 678d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fVertexCount = info.fInstanceCount * verticesPerInstance; 679d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fIndexCount = info.fInstanceCount * indicesPerInstance; 680d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 681d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (this->checkDraw(type, 682d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fStartVertex, 683d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fStartIndex, 684d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fVertexCount, 685d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fIndexCount)) { 686d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com this->onDraw(info); 687d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 688d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com info.fStartVertex += info.fVertexCount; 689d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com instanceCount -= info.fInstanceCount; 690934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com } 691934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com} 6923d0835b6ac0003c18147b6e9ca76a497b92d1d40bsalomon@google.com 69325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com//////////////////////////////////////////////////////////////////////////////// 69425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 695429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.comnamespace { 696429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com 697429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com// position + (optional) texture coord 698429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.comextern const GrVertexAttrib gBWRectPosUVAttribs[] = { 699429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding}, 700972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org {kVec2f_GrVertexAttribType, sizeof(SkPoint), kLocalCoord_GrVertexAttribBinding} 701429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com}; 702429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com 703429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.comvoid set_vertex_attributes(GrDrawState* drawState, bool hasUVs) { 704429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com if (hasUVs) { 705429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com drawState->setVertexAttribs<gBWRectPosUVAttribs>(2); 706429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com } else { 707429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com drawState->setVertexAttribs<gBWRectPosUVAttribs>(1); 708429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com } 709429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com} 710429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com 711429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com}; 712429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com 713fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.orgvoid GrDrawTarget::onDrawRect(const SkRect& rect, 7140406b9e1faee06c6ecb2732a1bcf3b0e53104e07bsalomon@google.com const SkMatrix* matrix, 715fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org const SkRect* localRect, 7160406b9e1faee06c6ecb2732a1bcf3b0e53104e07bsalomon@google.com const SkMatrix* localMatrix) { 717dea2f8d86378b791a2de94384a18e29f13f65a3ebsalomon@google.com 718d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com GrDrawState::AutoViewMatrixRestore avmr; 719d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (NULL != matrix) { 720c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com avmr.set(this->drawState(), *matrix); 72186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 722a31082685544d0ae4c0b203d7f5ff960640ed8dfbsalomon@google.com 723429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com set_vertex_attributes(this->drawState(), NULL != localRect); 724429033038271147ed66b4bc2675ac98a5ccfa75crobertphillips@google.com 725b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com AutoReleaseGeometry geo(this, 4, 0); 726d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (!geo.succeeded()) { 727d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com GrPrintf("Failed to get space for vertices!\n"); 728d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com return; 72986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 73086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 7319b855c7c95ce9fff7a447e4a6bdf8a469c1f3097jvanverth@google.com size_t vsize = this->drawState()->getVertexSize(); 732d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com geo.positions()->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, vsize); 733c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com if (NULL != localRect) { 734972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org SkPoint* coords = GrTCast<SkPoint*>(GrTCast<intptr_t>(geo.vertices()) + 735972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org sizeof(SkPoint)); 736c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com coords->setRectFan(localRect->fLeft, localRect->fTop, 737c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com localRect->fRight, localRect->fBottom, 738c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com vsize); 739c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com if (NULL != localMatrix) { 740c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com localMatrix->mapPointsWithStride(coords, vsize, 4); 74186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 74286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 7433ae0e6c2b213d45c370846a4d4182a6754ca493ecommit-bot@chromium.org SkRect bounds; 7443ae0e6c2b213d45c370846a4d4182a6754ca493ecommit-bot@chromium.org this->getDrawState().getViewMatrix().mapRect(&bounds, rect); 7458b129aa3379ece6c43d9ce2ad0cdeafb089b7eb5robertphillips@google.com 7463ae0e6c2b213d45c370846a4d4182a6754ca493ecommit-bot@chromium.org this->drawNonIndexed(kTriangleFan_GrPrimitiveType, 0, 4, &bounds); 74786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com} 74886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 74902ddc8b85ace91b15feb329a6a1d5d62b2b846c6bsalomon@google.comvoid GrDrawTarget::clipWillBeSet(const GrClipData* clipData) { 75002ddc8b85ace91b15feb329a6a1d5d62b2b846c6bsalomon@google.com} 75102ddc8b85ace91b15feb329a6a1d5d62b2b846c6bsalomon@google.com 75225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com//////////////////////////////////////////////////////////////////////////////// 7537ac249bdc7a86bc44610e02abeeaa0c14ba8163absalomon@google.com 75406afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.comGrDrawTarget::AutoStateRestore::AutoStateRestore() { 75506afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com fDrawTarget = NULL; 75606afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com} 757ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 758873ea0c93f202600ec2591bc1e2e5d7a1e05f59dbsalomon@google.comGrDrawTarget::AutoStateRestore::AutoStateRestore(GrDrawTarget* target, 759137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com ASRInit init, 760137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com const SkMatrix* vm) { 761873ea0c93f202600ec2591bc1e2e5d7a1e05f59dbsalomon@google.com fDrawTarget = NULL; 762137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com this->set(target, init, vm); 763ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 764ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 765ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comGrDrawTarget::AutoStateRestore::~AutoStateRestore() { 7667d34d2eecc40d150d867e37d5160a1bc3cfccbdebsalomon@google.com if (NULL != fDrawTarget) { 767873ea0c93f202600ec2591bc1e2e5d7a1e05f59dbsalomon@google.com fDrawTarget->setDrawState(fSavedState); 768873ea0c93f202600ec2591bc1e2e5d7a1e05f59dbsalomon@google.com fSavedState->unref(); 7697d34d2eecc40d150d867e37d5160a1bc3cfccbdebsalomon@google.com } 770ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 7717d34d2eecc40d150d867e37d5160a1bc3cfccbdebsalomon@google.com 772137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.comvoid GrDrawTarget::AutoStateRestore::set(GrDrawTarget* target, ASRInit init, const SkMatrix* vm) { 773f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL == fDrawTarget); 774137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com fDrawTarget = target; 775137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com fSavedState = target->drawState(); 776f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fSavedState); 777137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com fSavedState->ref(); 778137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com if (kReset_ASRInit == init) { 779137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com if (NULL == vm) { 780137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com // calls the default cons 781137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com fTempState.init(); 782137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com } else { 783137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com SkNEW_IN_TLAZY(&fTempState, GrDrawState, (*vm)); 784137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com } 785137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com } else { 786f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(kPreserve_ASRInit == init); 787137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com if (NULL == vm) { 788137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com fTempState.set(*fSavedState); 789137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com } else { 790137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com SkNEW_IN_TLAZY(&fTempState, GrDrawState, (*fSavedState, *vm)); 791137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com } 792137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com } 793137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com target->setDrawState(fTempState.get()); 794137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com} 795137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com 796137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.combool GrDrawTarget::AutoStateRestore::setIdentity(GrDrawTarget* target, ASRInit init) { 797f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL == fDrawTarget); 798873ea0c93f202600ec2591bc1e2e5d7a1e05f59dbsalomon@google.com fDrawTarget = target; 799873ea0c93f202600ec2591bc1e2e5d7a1e05f59dbsalomon@google.com fSavedState = target->drawState(); 800f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fSavedState); 801873ea0c93f202600ec2591bc1e2e5d7a1e05f59dbsalomon@google.com fSavedState->ref(); 802873ea0c93f202600ec2591bc1e2e5d7a1e05f59dbsalomon@google.com if (kReset_ASRInit == init) { 803873ea0c93f202600ec2591bc1e2e5d7a1e05f59dbsalomon@google.com // calls the default cons 804873ea0c93f202600ec2591bc1e2e5d7a1e05f59dbsalomon@google.com fTempState.init(); 805873ea0c93f202600ec2591bc1e2e5d7a1e05f59dbsalomon@google.com } else { 806f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(kPreserve_ASRInit == init); 807873ea0c93f202600ec2591bc1e2e5d7a1e05f59dbsalomon@google.com // calls the copy cons 808873ea0c93f202600ec2591bc1e2e5d7a1e05f59dbsalomon@google.com fTempState.set(*fSavedState); 809137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com if (!fTempState.get()->setIdentityViewMatrix()) { 810137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com // let go of any resources held by the temp 811137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com fTempState.get()->reset(); 812137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com fDrawTarget = NULL; 813137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com fSavedState->unref(); 814137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com fSavedState = NULL; 815137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com return false; 816137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com } 81706afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com } 818873ea0c93f202600ec2591bc1e2e5d7a1e05f59dbsalomon@google.com target->setDrawState(fTempState.get()); 819137f1347abaf0bb6a945e91c2f6cb49f0ee69bc3bsalomon@google.com return true; 82006afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com} 8217ac249bdc7a86bc44610e02abeeaa0c14ba8163absalomon@google.com 82225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com//////////////////////////////////////////////////////////////////////////////// 82325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 82425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comGrDrawTarget::AutoReleaseGeometry::AutoReleaseGeometry( 82525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com GrDrawTarget* target, 82625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com int vertexCount, 82725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com int indexCount) { 82825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com fTarget = NULL; 829b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com this->set(target, vertexCount, indexCount); 83025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 831d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 83225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comGrDrawTarget::AutoReleaseGeometry::AutoReleaseGeometry() { 83325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com fTarget = NULL; 83425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 83525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 83625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comGrDrawTarget::AutoReleaseGeometry::~AutoReleaseGeometry() { 83725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->reset(); 83825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 83925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 84025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.combool GrDrawTarget::AutoReleaseGeometry::set(GrDrawTarget* target, 84125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com int vertexCount, 84225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com int indexCount) { 84325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com this->reset(); 84425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com fTarget = target; 84525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com bool success = true; 84625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com if (NULL != fTarget) { 84725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com fTarget = target; 848b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com success = target->reserveVertexAndIndexSpace(vertexCount, 849e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com indexCount, 850e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com &fVertices, 851e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com &fIndices); 852e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com if (!success) { 853e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com fTarget = NULL; 854e3d7095c2374a423815e662020459832f389a40fbsalomon@google.com this->reset(); 85525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } 85625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } 857f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(success == (NULL != fTarget)); 85825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com return success; 85925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 86025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 86125fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.comvoid GrDrawTarget::AutoReleaseGeometry::reset() { 86225fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com if (NULL != fTarget) { 86325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com if (NULL != fVertices) { 86425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com fTarget->resetVertexSource(); 86525fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } 86625fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com if (NULL != fIndices) { 86725fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com fTarget->resetIndexSource(); 86825fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } 86925fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com fTarget = NULL; 87025fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com } 871cb0c5ab54d69f813f4faf4c7ac2092358bc663aabsalomon@google.com fVertices = NULL; 872cb0c5ab54d69f813f4faf4c7ac2092358bc663aabsalomon@google.com fIndices = NULL; 87325fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com} 87425fb21f5df904c6f111bbf8f07e6a6c339416d09bsalomon@google.com 8758d67c0711b52226db59158a0cfce09f35badd96absalomon@google.comGrDrawTarget::AutoClipRestore::AutoClipRestore(GrDrawTarget* target, const SkIRect& newClip) { 8768d67c0711b52226db59158a0cfce09f35badd96absalomon@google.com fTarget = target; 8778d67c0711b52226db59158a0cfce09f35badd96absalomon@google.com fClip = fTarget->getClip(); 8788d67c0711b52226db59158a0cfce09f35badd96absalomon@google.com fStack.init(); 8798d67c0711b52226db59158a0cfce09f35badd96absalomon@google.com fStack.get()->clipDevRect(newClip, SkRegion::kReplace_Op); 8808d67c0711b52226db59158a0cfce09f35badd96absalomon@google.com fReplacementClip.fClipStack = fStack.get(); 8818d67c0711b52226db59158a0cfce09f35badd96absalomon@google.com target->setClip(&fReplacementClip); 8828d67c0711b52226db59158a0cfce09f35badd96absalomon@google.com} 8838d67c0711b52226db59158a0cfce09f35badd96absalomon@google.com 884116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.comnamespace { 885116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com// returns true if the read/written rect intersects the src/dst and false if not. 886116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.combool clip_srcrect_and_dstpoint(const GrSurface* dst, 887116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com const GrSurface* src, 888e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com const SkIRect& srcRect, 889116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com const SkIPoint& dstPoint, 890116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com SkIRect* clippedSrcRect, 891116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com SkIPoint* clippedDstPoint) { 892116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com *clippedSrcRect = srcRect; 893116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com *clippedDstPoint = dstPoint; 894a9493a3c78f6eb82635ece960b4f16918b885428skia.committer@gmail.com 895116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com // clip the left edge to src and dst bounds, adjusting dstPoint if necessary 896116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com if (clippedSrcRect->fLeft < 0) { 897116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com clippedDstPoint->fX -= clippedSrcRect->fLeft; 898116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com clippedSrcRect->fLeft = 0; 899e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com } 900116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com if (clippedDstPoint->fX < 0) { 901116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com clippedSrcRect->fLeft -= clippedDstPoint->fX; 902116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com clippedDstPoint->fX = 0; 903e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com } 904e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com 905116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com // clip the top edge to src and dst bounds, adjusting dstPoint if necessary 906116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com if (clippedSrcRect->fTop < 0) { 907116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com clippedDstPoint->fY -= clippedSrcRect->fTop; 908116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com clippedSrcRect->fTop = 0; 909e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com } 910116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com if (clippedDstPoint->fY < 0) { 911116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com clippedSrcRect->fTop -= clippedDstPoint->fY; 912116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com clippedDstPoint->fY = 0; 913e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com } 914a9493a3c78f6eb82635ece960b4f16918b885428skia.committer@gmail.com 915e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com // clip the right edge to the src and dst bounds. 916116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com if (clippedSrcRect->fRight > src->width()) { 917116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com clippedSrcRect->fRight = src->width(); 918e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com } 919116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com if (clippedDstPoint->fX + clippedSrcRect->width() > dst->width()) { 920116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com clippedSrcRect->fRight = clippedSrcRect->fLeft + dst->width() - clippedDstPoint->fX; 921e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com } 922e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com 923e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com // clip the bottom edge to the src and dst bounds. 924116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com if (clippedSrcRect->fBottom > src->height()) { 925116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com clippedSrcRect->fBottom = src->height(); 926e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com } 927116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com if (clippedDstPoint->fY + clippedSrcRect->height() > dst->height()) { 928116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com clippedSrcRect->fBottom = clippedSrcRect->fTop + dst->height() - clippedDstPoint->fY; 929e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com } 930a9493a3c78f6eb82635ece960b4f16918b885428skia.committer@gmail.com 931e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com // The above clipping steps may have inverted the rect if it didn't intersect either the src or 932e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com // dst bounds. 933116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com return !clippedSrcRect->isEmpty(); 934116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com} 935116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com} 936116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com 937116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.combool GrDrawTarget::copySurface(GrSurface* dst, 938116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com GrSurface* src, 939116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com const SkIRect& srcRect, 940116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com const SkIPoint& dstPoint) { 941f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL != dst); 942f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL != src); 943116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com 944116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com SkIRect clippedSrcRect; 945116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com SkIPoint clippedDstPoint; 946116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com // If the rect is outside the src or dst then we've already succeeded. 947116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com if (!clip_srcrect_and_dstpoint(dst, 948116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com src, 949116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com srcRect, 950116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com dstPoint, 951116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com &clippedSrcRect, 952116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com &clippedDstPoint)) { 953f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(this->canCopySurface(dst, src, srcRect, dstPoint)); 954e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com return true; 955e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com } 956e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com 957e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com bool result = this->onCopySurface(dst, src, clippedSrcRect, clippedDstPoint); 958f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(result == this->canCopySurface(dst, src, clippedSrcRect, clippedDstPoint)); 959e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com return result; 960e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com} 961e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com 962e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.combool GrDrawTarget::canCopySurface(GrSurface* dst, 963e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com GrSurface* src, 964e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com const SkIRect& srcRect, 965e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com const SkIPoint& dstPoint) { 966f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL != dst); 967f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL != src); 968116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com 969116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com SkIRect clippedSrcRect; 970116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com SkIPoint clippedDstPoint; 971116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com // If the rect is outside the src or dst then we're guaranteed success 972116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com if (!clip_srcrect_and_dstpoint(dst, 973116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com src, 974116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com srcRect, 975116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com dstPoint, 976116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com &clippedSrcRect, 977116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com &clippedDstPoint)) { 978116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com return true; 979116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com } 980116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com return this->onCanCopySurface(dst, src, clippedSrcRect, clippedDstPoint); 981116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com} 982116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com 983116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.combool GrDrawTarget::onCanCopySurface(GrSurface* dst, 984116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com GrSurface* src, 985116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com const SkIRect& srcRect, 986116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com const SkIPoint& dstPoint) { 987e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com // Check that the read/write rects are contained within the src/dst bounds. 988f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(!srcRect.isEmpty()); 989f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(SkIRect::MakeWH(src->width(), src->height()).contains(srcRect)); 990f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(dstPoint.fX >= 0 && dstPoint.fY >= 0); 991f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(dstPoint.fX + srcRect.width() <= dst->width() && 992e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com dstPoint.fY + srcRect.height() <= dst->height()); 993e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com 994116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com return !dst->isSameAs(src) && NULL != dst->asRenderTarget() && NULL != src->asTexture(); 995e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com} 996e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com 997e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.combool GrDrawTarget::onCopySurface(GrSurface* dst, 998e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com GrSurface* src, 999e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com const SkIRect& srcRect, 1000e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com const SkIPoint& dstPoint) { 1001116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com if (!GrDrawTarget::onCanCopySurface(dst, src, srcRect, dstPoint)) { 1002e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com return false; 1003e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com } 1004e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com 1005e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com GrRenderTarget* rt = dst->asRenderTarget(); 1006e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com GrTexture* tex = src->asTexture(); 1007e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com 1008e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com GrDrawTarget::AutoStateRestore asr(this, kReset_ASRInit); 1009e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com this->drawState()->setRenderTarget(rt); 1010e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com SkMatrix matrix; 1011e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com matrix.setTranslate(SkIntToScalar(srcRect.fLeft - dstPoint.fX), 1012e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com SkIntToScalar(srcRect.fTop - dstPoint.fY)); 1013e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com matrix.postIDiv(tex->width(), tex->height()); 1014eb6879f50a5564eeb981ec5616b55bf685eb76fcbsalomon@google.com this->drawState()->addColorTextureEffect(tex, matrix); 1015e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com SkIRect dstRect = SkIRect::MakeXYWH(dstPoint.fX, 1016e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com dstPoint.fY, 1017e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com srcRect.width(), 1018e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com srcRect.height()); 1019e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com this->drawSimpleRect(dstRect); 1020e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com return true; 1021e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com} 1022e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com 1023eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.comvoid GrDrawTarget::initCopySurfaceDstDesc(const GrSurface* src, GrTextureDesc* desc) { 1024eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.com // Make the dst of the copy be a render target because the default copySurface draws to the dst. 1025eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.com desc->fOrigin = kDefault_GrSurfaceOrigin; 1026eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.com desc->fFlags = kRenderTarget_GrTextureFlagBit | kNoStencil_GrTextureFlagBit; 1027eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.com desc->fConfig = src->config(); 1028eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.com} 1029eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.com 1030bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 1031bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com 1032c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.comvoid GrDrawTargetCaps::reset() { 10334744231c149989666d70956527495bddb2e5dd8bcommit-bot@chromium.org fMipMapSupport = false; 1034bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fNPOTTextureTileSupport = false; 1035bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fTwoSidedStencilSupport = false; 1036bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fStencilWrapOpsSupport = false; 1037bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fHWAALineSupport = false; 1038bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fShaderDerivativeSupport = false; 1039bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fGeometryShaderSupport = false; 1040e60ed08a3568b5e253dfb5dec2b52d13a16fff1cskia.committer@gmail.com fDualSourceBlendingSupport = false; 1041c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org fPathRenderingSupport = false; 1042b835652599356556401b68ac26b57044160a7289commit-bot@chromium.org fDstReadInShaderSupport = false; 104328361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org fDiscardRenderTargetSupport = false; 1044b835652599356556401b68ac26b57044160a7289commit-bot@chromium.org fReuseScratchTextures = true; 1045a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org fGpuTracingSupport = false; 1046bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com 1047160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org fMapBufferFlags = kNone_MapFlags; 1048160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org 1049bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fMaxRenderTargetSize = 0; 1050bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fMaxTextureSize = 0; 1051bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fMaxSampleCount = 0; 10527388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org 10537388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org memset(fConfigRenderSupport, 0, sizeof(fConfigRenderSupport)); 10546e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org memset(fConfigTextureSupport, 0, sizeof(fConfigTextureSupport)); 1055bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com} 1056bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com 1057c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.comGrDrawTargetCaps& GrDrawTargetCaps::operator=(const GrDrawTargetCaps& other) { 10584744231c149989666d70956527495bddb2e5dd8bcommit-bot@chromium.org fMipMapSupport = other.fMipMapSupport; 1059bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fNPOTTextureTileSupport = other.fNPOTTextureTileSupport; 1060bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fTwoSidedStencilSupport = other.fTwoSidedStencilSupport; 1061bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fStencilWrapOpsSupport = other.fStencilWrapOpsSupport; 1062bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fHWAALineSupport = other.fHWAALineSupport; 1063bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fShaderDerivativeSupport = other.fShaderDerivativeSupport; 1064bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fGeometryShaderSupport = other.fGeometryShaderSupport; 1065bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fDualSourceBlendingSupport = other.fDualSourceBlendingSupport; 1066c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org fPathRenderingSupport = other.fPathRenderingSupport; 1067b835652599356556401b68ac26b57044160a7289commit-bot@chromium.org fDstReadInShaderSupport = other.fDstReadInShaderSupport; 106828361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org fDiscardRenderTargetSupport = other.fDiscardRenderTargetSupport; 1069b835652599356556401b68ac26b57044160a7289commit-bot@chromium.org fReuseScratchTextures = other.fReuseScratchTextures; 1070a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org fGpuTracingSupport = other.fGpuTracingSupport; 1071bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com 1072160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org fMapBufferFlags = other.fMapBufferFlags; 1073160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org 1074bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fMaxRenderTargetSize = other.fMaxRenderTargetSize; 1075bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fMaxTextureSize = other.fMaxTextureSize; 1076bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com fMaxSampleCount = other.fMaxSampleCount; 1077bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com 10787388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org memcpy(fConfigRenderSupport, other.fConfigRenderSupport, sizeof(fConfigRenderSupport)); 10796e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org memcpy(fConfigTextureSupport, other.fConfigTextureSupport, sizeof(fConfigTextureSupport)); 10807388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org 1081bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com return *this; 1082bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com} 1083bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com 1084160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.orgstatic SkString map_flags_to_string(uint32_t flags) { 1085160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org SkString str; 1086160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org if (GrDrawTargetCaps::kNone_MapFlags == flags) { 1087160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org str = "none"; 1088160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org } else { 1089160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org SkASSERT(GrDrawTargetCaps::kCanMap_MapFlag & flags); 1090160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org SkDEBUGCODE(flags &= ~GrDrawTargetCaps::kCanMap_MapFlag); 1091160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org str = "can_map"; 1092160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org 1093160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org if (GrDrawTargetCaps::kSubset_MapFlag & flags) { 1094160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org str.append(" partial"); 1095160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org } else { 1096160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org str.append(" full"); 1097160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org } 1098160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org SkDEBUGCODE(flags &= ~GrDrawTargetCaps::kSubset_MapFlag); 1099160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org } 1100160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org SkASSERT(0 == flags); // Make sure we handled all the flags. 1101160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org return str; 1102160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org} 1103160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org 11048b656c6db40a99af241e38eae853f887413040cccommit-bot@chromium.orgSkString GrDrawTargetCaps::dump() const { 11058b656c6db40a99af241e38eae853f887413040cccommit-bot@chromium.org SkString r; 110618c9c198f571997463d9a7134dbd88298e592ec2bsalomon@google.com static const char* gNY[] = {"NO", "YES"}; 110728361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org r.appendf("MIP Map Support : %s\n", gNY[fMipMapSupport]); 110828361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org r.appendf("NPOT Texture Tile Support : %s\n", gNY[fNPOTTextureTileSupport]); 110928361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org r.appendf("Two Sided Stencil Support : %s\n", gNY[fTwoSidedStencilSupport]); 111028361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org r.appendf("Stencil Wrap Ops Support : %s\n", gNY[fStencilWrapOpsSupport]); 111128361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org r.appendf("HW AA Lines Support : %s\n", gNY[fHWAALineSupport]); 111228361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org r.appendf("Shader Derivative Support : %s\n", gNY[fShaderDerivativeSupport]); 111328361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org r.appendf("Geometry Shader Support : %s\n", gNY[fGeometryShaderSupport]); 111428361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org r.appendf("Dual Source Blending Support : %s\n", gNY[fDualSourceBlendingSupport]); 111528361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org r.appendf("Path Rendering Support : %s\n", gNY[fPathRenderingSupport]); 111628361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org r.appendf("Dst Read In Shader Support : %s\n", gNY[fDstReadInShaderSupport]); 111728361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org r.appendf("Discard Render Target Support: %s\n", gNY[fDiscardRenderTargetSupport]); 111828361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org r.appendf("Reuse Scratch Textures : %s\n", gNY[fReuseScratchTextures]); 111928361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org r.appendf("Gpu Tracing Support : %s\n", gNY[fGpuTracingSupport]); 112028361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org r.appendf("Max Texture Size : %d\n", fMaxTextureSize); 112128361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org r.appendf("Max Render Target Size : %d\n", fMaxRenderTargetSize); 112228361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org r.appendf("Max Sample Count : %d\n", fMaxSampleCount); 11237388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org 1124160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org r.appendf("Map Buffer Support : %s\n", map_flags_to_string(fMapBufferFlags).c_str()); 1125160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org 11267388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org static const char* kConfigNames[] = { 11277388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org "Unknown", // kUnknown_GrPixelConfig 11287388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org "Alpha8", // kAlpha_8_GrPixelConfig, 11297388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org "Index8", // kIndex_8_GrPixelConfig, 11307388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org "RGB565", // kRGB_565_GrPixelConfig, 11317388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org "RGBA444", // kRGBA_4444_GrPixelConfig, 11327388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org "RGBA8888", // kRGBA_8888_GrPixelConfig, 11337388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org "BGRA8888", // kBGRA_8888_GrPixelConfig, 11346e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org "ETC1", // kETC1_GrPixelConfig, 11356e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org "LATC", // kLATC_GrPixelConfig, 11367388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org }; 11377388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org GR_STATIC_ASSERT(0 == kUnknown_GrPixelConfig); 11387388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org GR_STATIC_ASSERT(1 == kAlpha_8_GrPixelConfig); 11397388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org GR_STATIC_ASSERT(2 == kIndex_8_GrPixelConfig); 11407388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org GR_STATIC_ASSERT(3 == kRGB_565_GrPixelConfig); 11417388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org GR_STATIC_ASSERT(4 == kRGBA_4444_GrPixelConfig); 11427388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org GR_STATIC_ASSERT(5 == kRGBA_8888_GrPixelConfig); 11437388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org GR_STATIC_ASSERT(6 == kBGRA_8888_GrPixelConfig); 11446e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org GR_STATIC_ASSERT(7 == kETC1_GrPixelConfig); 11456e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org GR_STATIC_ASSERT(8 == kLATC_GrPixelConfig); 11467388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org GR_STATIC_ASSERT(SK_ARRAY_COUNT(kConfigNames) == kGrPixelConfigCnt); 11477388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org 11489901727f213e459901a175c119b2fad8816002a0commit-bot@chromium.org SkASSERT(!fConfigRenderSupport[kUnknown_GrPixelConfig][0]); 11499901727f213e459901a175c119b2fad8816002a0commit-bot@chromium.org SkASSERT(!fConfigRenderSupport[kUnknown_GrPixelConfig][1]); 11506e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org 11516e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org for (size_t i = 1; i < SK_ARRAY_COUNT(kConfigNames); ++i) { 11526e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org r.appendf("%s is renderable: %s, with MSAA: %s\n", 11536e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org kConfigNames[i], 11546e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org gNY[fConfigRenderSupport[i][0]], 11556e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org gNY[fConfigRenderSupport[i][1]]); 11567388051d745590d7759e7ed49c233caec6bea0f7commit-bot@chromium.org } 115742dc8136914ee0777bb9110a5e04a75016687c0dcommit-bot@chromium.org 11586e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org SkASSERT(!fConfigTextureSupport[kUnknown_GrPixelConfig]); 11596e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org 11606e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org for (size_t i = 1; i < SK_ARRAY_COUNT(kConfigNames); ++i) { 11616e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org r.appendf("%s is uploadable to a texture: %s\n", 11626e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org kConfigNames[i], 11636e7ddaae0a077a777b8b8872ec27f8faab275536commit-bot@chromium.org gNY[fConfigTextureSupport[i]]); 116442dc8136914ee0777bb9110a5e04a75016687c0dcommit-bot@chromium.org } 116542dc8136914ee0777bb9110a5e04a75016687c0dcommit-bot@chromium.org 11668b656c6db40a99af241e38eae853f887413040cccommit-bot@chromium.org return r; 116718c9c198f571997463d9a7134dbd88298e592ec2bsalomon@google.com} 1168