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, &copyRect);
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