GrDrawTarget.h revision e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2010 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */
7ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
8ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#ifndef GrDrawTarget_DEFINED
9ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#define GrDrawTarget_DEFINED
10ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
1144701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt#include "GrClip.h"
126db519c42471aaaa8a8e1a3ece314014481ab832joshualitt#include "GrClipMaskManager.h"
132a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org#include "GrContext.h"
148072caa80384292858d31ae34b7e19768875866bjoshualitt#include "GrPathProcessor.h"
158072caa80384292858d31ae34b7e19768875866bjoshualitt#include "GrPrimitiveProcessor.h"
16934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com#include "GrIndexBuffer.h"
17ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen#include "GrPathRendering.h"
188dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel#include "GrPipelineBuilder.h"
192a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org#include "GrTraceMarker.h"
207eb8c7b00a5d776bebaf33a8687357df95c1aa43joshualitt#include "GrVertexBuffer.h"
21ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
228d67c0711b52226db59158a0cfce09f35badd96absalomon@google.com#include "SkClipStack.h"
23a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.org#include "SkMatrix.h"
2412b4e27ae1a29460e91a59f38122483e1faec697sugoi@google.com#include "SkPath.h"
259b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org#include "SkStrokeRec.h"
26a2d71482db8b6d752a51c96da74768d7dfc27932robertphillips@google.com#include "SkTArray.h"
27a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.org#include "SkTLazy.h"
28a0b40280a49a8a43af7929ead3b3489951c58501commit-bot@chromium.org#include "SkTypes.h"
298d67c0711b52226db59158a0cfce09f35badd96absalomon@google.com#include "SkXfermode.h"
3097c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo
314d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualittclass GrBatch;
3244701df5ce572ac3cccec785cf52103d3d5d14a5joshualittclass GrClip;
33c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.comclass GrDrawTargetCaps;
34a73239a0096370221d3dfababf339dd6d3fed84fbsalomonclass GrIndexBufferAllocPool;
3564aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.comclass GrPath;
36b85a0aab6905af8b329539b7573a7555b727d5e5cdaltonclass GrPathRange;
37e36914cb205699526988127a827d1a76c9a98d39egdanielclass GrPipeline;
38a73239a0096370221d3dfababf339dd6d3fed84fbsalomonclass GrVertexBufferAllocPool;
3912b4e27ae1a29460e91a59f38122483e1faec697sugoi@google.com
40a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.orgclass GrDrawTarget : public SkRefCnt {
41bcce8926524827775539874346dd424a9510dbc9bsalomon@google.compublic:
42bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com    SK_DECLARE_INST_COUNT(GrDrawTarget)
43bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com
4455b24afc178e641e17a5664beba7ab2b4982c91acdalton    typedef GrPathRange::PathIndexType PathIndexType;
4555b24afc178e641e17a5664beba7ab2b4982c91acdalton    typedef GrPathRendering::PathTransformType PathTransformType;
46ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen
47ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    ///////////////////////////////////////////////////////////////////////////
48ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
496e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com    // The context may not be fully constructed and should not be used during GrDrawTarget
506e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com    // construction.
51a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    GrDrawTarget(GrContext* context, GrVertexBufferAllocPool*, GrIndexBufferAllocPool*);
52a73239a0096370221d3dfababf339dd6d3fed84fbsalomon
5372e3ae486c66871c2043eac4f08d85d419fbca2absalomon    virtual ~GrDrawTarget() {}
54ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
55ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    /**
56a73239a0096370221d3dfababf339dd6d3fed84fbsalomon     * Empties the draw buffer of any queued up draws.
57a73239a0096370221d3dfababf339dd6d3fed84fbsalomon     */
58a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    void reset();
59a73239a0096370221d3dfababf339dd6d3fed84fbsalomon
60a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    /**
61a73239a0096370221d3dfababf339dd6d3fed84fbsalomon     * This plays any queued up draws to its GrGpu target. It also resets this object (i.e. flushing
62a73239a0096370221d3dfababf339dd6d3fed84fbsalomon     * is destructive).
63a73239a0096370221d3dfababf339dd6d3fed84fbsalomon     */
64a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    void flush();
65a73239a0096370221d3dfababf339dd6d3fed84fbsalomon
66a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    /**
6718c9c198f571997463d9a7134dbd88298e592ec2bsalomon@google.com     * Gets the capabilities of the draw target.
6818c9c198f571997463d9a7134dbd88298e592ec2bsalomon@google.com     */
69c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com    const GrDrawTargetCaps* caps() const { return fCaps.get(); }
7018c9c198f571997463d9a7134dbd88298e592ec2bsalomon@google.com
7199c7c07e0f1f7b78980eb21d84bebda8b45a7178joshualitt    void drawBatch(GrPipelineBuilder*, GrBatch*);
724d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt
7386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com    /**
7464aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com     * Draws path into the stencil buffer. The fill must be either even/odd or
7564aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com     * winding (not inverse or hairline). It will respect the HW antialias flag
768dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel     * on the GrPipelineBuilder (if possible in the 3D API).  Note, we will never have an inverse
778dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel     * fill with stencil path
7864aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com     */
798dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel    void stencilPath(GrPipelineBuilder*, const GrPathProcessor*, const GrPath*,
808dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel                     GrPathRendering::FillType);
8164aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com
8264aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com    /**
8332184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org     * Draws a path. Fill must not be a hairline. It will respect the HW
848dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel     * antialias flag on the GrPipelineBuilder (if possible in the 3D API).
85c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org     */
868dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel    void drawPath(GrPipelineBuilder*, const GrPathProcessor*, const GrPath*,
878dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel                  GrPathRendering::FillType);
88c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org
89c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org    /**
9055b24afc178e641e17a5664beba7ab2b4982c91acdalton     * Draws the aggregate path from combining multiple. Note that this will not
9155b24afc178e641e17a5664beba7ab2b4982c91acdalton     * always be equivalent to back-to-back calls to drawPath(). It will respect
928dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel     * the HW antialias flag on the GrPipelineBuilder (if possible in the 3D API).
939b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org     *
9455b24afc178e641e17a5664beba7ab2b4982c91acdalton     * @param pathRange       Source paths to draw from
9555b24afc178e641e17a5664beba7ab2b4982c91acdalton     * @param indices         Array of path indices to draw
9655b24afc178e641e17a5664beba7ab2b4982c91acdalton     * @param indexType       Data type of the array elements in indexBuffer
9755b24afc178e641e17a5664beba7ab2b4982c91acdalton     * @param transformValues Array of transforms for the individual paths
9855b24afc178e641e17a5664beba7ab2b4982c91acdalton     * @param transformType   Type of transforms in transformBuffer
9955b24afc178e641e17a5664beba7ab2b4982c91acdalton     * @param count           Number of paths to draw
100b85a0aab6905af8b329539b7573a7555b727d5e5cdalton     * @param fill            Fill type for drawing all the paths
101b85a0aab6905af8b329539b7573a7555b727d5e5cdalton     */
1028dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel    void drawPaths(GrPipelineBuilder*,
10356995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt                   const GrPathProcessor*,
1042e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt                   const GrPathRange* pathRange,
10555b24afc178e641e17a5664beba7ab2b4982c91acdalton                   const void* indices,
10655b24afc178e641e17a5664beba7ab2b4982c91acdalton                   PathIndexType indexType,
10755b24afc178e641e17a5664beba7ab2b4982c91acdalton                   const float transformValues[],
10855b24afc178e641e17a5664beba7ab2b4982c91acdalton                   PathTransformType transformType,
1099853ccef19c200be93a6211f32589fa82a53067cjoshualitt                   int count,
11092e496f96abbd664888f0c8a7d546ab02e703bf7joshualitt                   GrPathRendering::FillType fill);
111b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
1129b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org    /**
11372e3ae486c66871c2043eac4f08d85d419fbca2absalomon     * Helper function for drawing rects.
114044679ef8c08e1f01afadf5bc08251fe8597df81skia.committer@gmail.com     *
115c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com     * @param rect        the rect to draw
116c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com     * @param localRect   optional rect that specifies local coords to map onto
117c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com     *                    rect. If NULL then rect serves as the local coords.
1188fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt     * @param localMatrix Optional local matrix. The local coordinates are specified by localRect,
1198fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt     *                    or if it is NULL by rect. This matrix applies to the coordinate implied by
1208fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt     *                    that rectangle before it is input to GrCoordTransforms that read local
1218fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt     *                    coordinates
12286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com     */
1234d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt    void drawRect(GrPipelineBuilder* pipelineBuilder,
1242e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt                  GrColor color,
1258059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                  const SkMatrix& viewMatrix,
1269853ccef19c200be93a6211f32589fa82a53067cjoshualitt                  const SkRect& rect,
127fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org                  const SkRect* localRect,
1280406b9e1faee06c6ecb2732a1bcf3b0e53104e07bsalomon@google.com                  const SkMatrix* localMatrix) {
1294d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt        this->onDrawRect(pipelineBuilder, color, viewMatrix, rect, localRect, localMatrix);
1300406b9e1faee06c6ecb2732a1bcf3b0e53104e07bsalomon@google.com    }
1313976825a21532e254311b90b4a9046e25717e335jvanverth@google.com
132cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com    /**
133c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com     * Helper for drawRect when the caller doesn't need separate local rects or matrices.
134cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com     */
1358dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel    void drawSimpleRect(GrPipelineBuilder* ds, GrColor color, const SkMatrix& viewM,
1368dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel                        const SkRect& rect) {
1378059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt        this->drawRect(ds, color, viewM, rect, NULL, NULL);
138cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com    }
1398dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel    void drawSimpleRect(GrPipelineBuilder* ds, GrColor color, const SkMatrix& viewM,
1408059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                        const SkIRect& irect) {
1414469938e92d779dff05e745559e67907bbf21e78reed@google.com        SkRect rect = SkRect::Make(irect);
1428059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt        this->drawRect(ds, color, viewM, rect, NULL, NULL);
143cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com    }
14486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com
145934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com
146934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com    /**
1478dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel     * Clear the passed in render target. Ignores the GrPipelineBuilder and clip. Clears the whole
1488dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel     * thing if rect is NULL, otherwise just the rect. If canIgnoreRect is set then the entire
1498dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel     * render target can be optionally cleared.
1500b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com     */
1519853ccef19c200be93a6211f32589fa82a53067cjoshualitt    void clear(const SkIRect* rect,
1529853ccef19c200be93a6211f32589fa82a53067cjoshualitt               GrColor color,
1539853ccef19c200be93a6211f32589fa82a53067cjoshualitt               bool canIgnoreRect,
15463b21962867af0f98e12a3ccbe5eef76b7ecc3aabsalomon               GrRenderTarget* renderTarget);
155a9493a3c78f6eb82635ece960b4f16918b885428skia.committer@gmail.com
156e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com    /**
15789c62980c1eb50b2090f33312086c7e8c66739b4bsalomon     * Discards the contents render target.
15828361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org     **/
15989c62980c1eb50b2090f33312086c7e8c66739b4bsalomon    virtual void discard(GrRenderTarget*) = 0;
16028361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org
16128361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org    /**
1622a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org     * Called at start and end of gpu trace marking
1632a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org     * GR_CREATE_GPU_TRACE_MARKER(marker_str, target) will automatically call these at the start
1642a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org     * and end of a code block respectively
165a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org     */
1663eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel    void addGpuTraceMarker(const GrGpuTraceMarker* marker);
1673eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel    void removeGpuTraceMarker(const GrGpuTraceMarker* marker);
1683eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel
1693eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel    /**
1703eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel     * Takes the current active set of markers and stores them for later use. Any current marker
1713eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel     * in the active set is removed from the active set and the targets remove function is called.
1723eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel     * These functions do not work as a stack so you cannot call save a second time before calling
1733eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel     * restore. Also, it is assumed that when restore is called the current active set of markers
1743eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel     * is empty. When the stored markers are added back into the active set, the targets add marker
1753eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel     * is called.
1763eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel     */
1773eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel    void saveActiveTraceMarkers();
1783eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel    void restoreActiveTraceMarkers();
179a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org
180a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org    /**
181e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com     * Copies a pixel rectangle from one surface to another. This call may finalize
182e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com     * reserved vertex/index data (as though a draw call was made). The src pixels
183e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com     * copied are specified by srcRect. They are copied to a rect of the same
184e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com     * size in dst with top left at dstPoint. If the src rect is clipped by the
185e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com     * src bounds then  pixel values in the dst rect corresponding to area clipped
186e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com     * by the src rect are not overwritten. This method can fail and return false
187e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com     * depending on the type of surface, configs, etc, and the backend-specific
188e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com     * limitations. If rect is clipped out entirely by the src or dst bounds then
189e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com     * true is returned since there is no actual copy necessary to succeed.
190e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com     */
191f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon    bool copySurface(GrSurface* dst,
192f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon                     GrSurface* src,
193f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon                     const SkIRect& srcRect,
194f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon                     const SkIPoint& dstPoint);
195116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com    /**
196f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon     * Function that determines whether a copySurface call would succeed without actually
197116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com     * performing the copy.
198116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com     */
199f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon    bool canCopySurface(const GrSurface* dst,
200f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon                        const GrSurface* src,
201f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon                        const SkIRect& srcRect,
202f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon                        const SkIPoint& dstPoint);
203eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.com
204eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.com    /**
205ff17584e1c15f68ccc296be517e8a6776a9ddabdrobertphillips@google.com     * Release any resources that are cached but not currently in use. This
206ff17584e1c15f68ccc296be517e8a6776a9ddabdrobertphillips@google.com     * is intended to give an application some recourse when resources are low.
207ff17584e1c15f68ccc296be517e8a6776a9ddabdrobertphillips@google.com     */
208ff17584e1c15f68ccc296be517e8a6776a9ddabdrobertphillips@google.com    virtual void purgeResources() {};
209ff17584e1c15f68ccc296be517e8a6776a9ddabdrobertphillips@google.com
210a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org    ///////////////////////////////////////////////////////////////////////////
211a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org    // Draw execution tracking (for font atlases and other resources)
212a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org    class DrawToken {
213a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org    public:
214a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org        DrawToken(GrDrawTarget* drawTarget, uint32_t drawID) :
215a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org                  fDrawTarget(drawTarget), fDrawID(drawID) {}
2167475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com
21749f085dddff10473b6ebf832a974288300224e60bsalomon        bool isIssued() { return fDrawTarget && fDrawTarget->isIssued(fDrawID); }
2187475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com
219a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org    private:
220a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org        GrDrawTarget*  fDrawTarget;
221a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org        uint32_t       fDrawID;   // this may wrap, but we're doing direct comparison
222a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org                                  // so that should be okay
223a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org    };
2247475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com
225a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org    virtual DrawToken getCurrentDrawToken() { return DrawToken(this, 0); }
2267475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com
2273322fa432a96fdc94d54f2475faf918dfa05b919joshualitt    /**
228b5238a7571c243ba4a154a62575570c3078b3741bsalomon     * Used to communicate draw index vertex offsets and counts toto GPUs / subclasses
2293322fa432a96fdc94d54f2475faf918dfa05b919joshualitt     */
2303322fa432a96fdc94d54f2475faf918dfa05b919joshualitt    class DrawInfo {
2313322fa432a96fdc94d54f2475faf918dfa05b919joshualitt    public:
232b5238a7571c243ba4a154a62575570c3078b3741bsalomon        DrawInfo() {}
2333322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        DrawInfo(const DrawInfo& di) { (*this) = di; }
2343322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        DrawInfo& operator =(const DrawInfo& di);
2353322fa432a96fdc94d54f2475faf918dfa05b919joshualitt
236b5238a7571c243ba4a154a62575570c3078b3741bsalomon        void init(GrPrimitiveType primType, const GrVertexBuffer* vertexBuffer, int startVertex,
237b5238a7571c243ba4a154a62575570c3078b3741bsalomon                  int vertexCount) {
238b5238a7571c243ba4a154a62575570c3078b3741bsalomon            SkASSERT(vertexBuffer);
239b5238a7571c243ba4a154a62575570c3078b3741bsalomon            SkASSERT(vertexCount);
240b5238a7571c243ba4a154a62575570c3078b3741bsalomon            SkASSERT(startVertex >= 0);
241b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fPrimitiveType = primType;
242b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fVertexBuffer.reset(SkRef(vertexBuffer));
243b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fIndexBuffer.reset(NULL);
244b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fStartVertex = startVertex;
245b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fStartIndex = 0;
246b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fVertexCount = vertexCount;
247b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fIndexCount = 0;
248b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fInstanceCount = 0;
249b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fVerticesPerInstance = 0;
250b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fIndicesPerInstance = 0;
251b5238a7571c243ba4a154a62575570c3078b3741bsalomon        }
252b5238a7571c243ba4a154a62575570c3078b3741bsalomon
253b5238a7571c243ba4a154a62575570c3078b3741bsalomon        void initIndexed(GrPrimitiveType primType,
254b5238a7571c243ba4a154a62575570c3078b3741bsalomon                         const GrVertexBuffer* vertexBuffer,
255b5238a7571c243ba4a154a62575570c3078b3741bsalomon                         const GrIndexBuffer* indexBuffer,
256b5238a7571c243ba4a154a62575570c3078b3741bsalomon                         int startVertex,
257b5238a7571c243ba4a154a62575570c3078b3741bsalomon                         int startIndex,
258b5238a7571c243ba4a154a62575570c3078b3741bsalomon                         int vertexCount,
259b5238a7571c243ba4a154a62575570c3078b3741bsalomon                         int indexCount) {
260b5238a7571c243ba4a154a62575570c3078b3741bsalomon            SkASSERT(indexBuffer);
261b5238a7571c243ba4a154a62575570c3078b3741bsalomon            SkASSERT(vertexBuffer);
262b5238a7571c243ba4a154a62575570c3078b3741bsalomon            SkASSERT(indexCount);
263b5238a7571c243ba4a154a62575570c3078b3741bsalomon            SkASSERT(vertexCount);
264b5238a7571c243ba4a154a62575570c3078b3741bsalomon            SkASSERT(startIndex >= 0);
265b5238a7571c243ba4a154a62575570c3078b3741bsalomon            SkASSERT(startVertex >= 0);
266b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fPrimitiveType = primType;
267b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fVertexBuffer.reset(SkRef(vertexBuffer));
268b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fIndexBuffer.reset(SkRef(indexBuffer));
269b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fStartVertex = startVertex;
270b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fStartIndex = startIndex;
271b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fVertexCount = vertexCount;
272b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fIndexCount = indexCount;
273b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fInstanceCount = 0;
274b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fVerticesPerInstance = 0;
275b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fIndicesPerInstance = 0;
276b5238a7571c243ba4a154a62575570c3078b3741bsalomon        }
277b5238a7571c243ba4a154a62575570c3078b3741bsalomon
278b5238a7571c243ba4a154a62575570c3078b3741bsalomon        void initInstanced(GrPrimitiveType primType,
279b5238a7571c243ba4a154a62575570c3078b3741bsalomon                           const GrVertexBuffer* vertexBuffer,
280b5238a7571c243ba4a154a62575570c3078b3741bsalomon                           const GrIndexBuffer* indexBuffer,
281b5238a7571c243ba4a154a62575570c3078b3741bsalomon                           int startVertex,
282b5238a7571c243ba4a154a62575570c3078b3741bsalomon                           int verticesPerInstance,
283b5238a7571c243ba4a154a62575570c3078b3741bsalomon                           int indicesPerInstance,
284b5238a7571c243ba4a154a62575570c3078b3741bsalomon                           int instanceCount) {
285b5238a7571c243ba4a154a62575570c3078b3741bsalomon            SkASSERT(vertexBuffer);
286b5238a7571c243ba4a154a62575570c3078b3741bsalomon            SkASSERT(indexBuffer);
287b5238a7571c243ba4a154a62575570c3078b3741bsalomon            SkASSERT(instanceCount);
288b5238a7571c243ba4a154a62575570c3078b3741bsalomon            SkASSERT(verticesPerInstance);
289b5238a7571c243ba4a154a62575570c3078b3741bsalomon            SkASSERT(indicesPerInstance);
290b5238a7571c243ba4a154a62575570c3078b3741bsalomon            SkASSERT(startVertex >= 0);
291b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fPrimitiveType = primType;
292b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fVertexBuffer.reset(SkRef(vertexBuffer));
293b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fIndexBuffer.reset(SkRef(indexBuffer));
294b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fStartVertex = startVertex;
295b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fStartIndex = 0;
296b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fVerticesPerInstance = verticesPerInstance;
297b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fIndicesPerInstance = indicesPerInstance;
298b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fInstanceCount = instanceCount;
299b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fVertexCount = instanceCount * fVerticesPerInstance;
300b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fIndexCount = instanceCount * fIndicesPerInstance;
301b5238a7571c243ba4a154a62575570c3078b3741bsalomon        }
302b5238a7571c243ba4a154a62575570c3078b3741bsalomon
303b5238a7571c243ba4a154a62575570c3078b3741bsalomon        /** Variation of the above that may be used when the total number of instances may exceed
304b5238a7571c243ba4a154a62575570c3078b3741bsalomon            the number of instances supported by the index buffer. To be used with
305b5238a7571c243ba4a154a62575570c3078b3741bsalomon            nextInstances() to draw in max-sized batches.*/
306b5238a7571c243ba4a154a62575570c3078b3741bsalomon        void initInstanced(GrPrimitiveType primType,
307b5238a7571c243ba4a154a62575570c3078b3741bsalomon                           const GrVertexBuffer* vertexBuffer,
308b5238a7571c243ba4a154a62575570c3078b3741bsalomon                           const GrIndexBuffer* indexBuffer,
309b5238a7571c243ba4a154a62575570c3078b3741bsalomon                           int startVertex,
310b5238a7571c243ba4a154a62575570c3078b3741bsalomon                           int verticesPerInstance,
311b5238a7571c243ba4a154a62575570c3078b3741bsalomon                           int indicesPerInstance,
312b5238a7571c243ba4a154a62575570c3078b3741bsalomon                           int* instancesRemaining,
313b5238a7571c243ba4a154a62575570c3078b3741bsalomon                           int maxInstancesPerDraw) {
314b5238a7571c243ba4a154a62575570c3078b3741bsalomon            int instanceCount = SkTMin(*instancesRemaining, maxInstancesPerDraw);
315b5238a7571c243ba4a154a62575570c3078b3741bsalomon            *instancesRemaining -= instanceCount;
316b5238a7571c243ba4a154a62575570c3078b3741bsalomon            this->initInstanced(primType, vertexBuffer, indexBuffer, startVertex,
317b5238a7571c243ba4a154a62575570c3078b3741bsalomon                                verticesPerInstance, indicesPerInstance, instanceCount);
318b5238a7571c243ba4a154a62575570c3078b3741bsalomon        }
319b5238a7571c243ba4a154a62575570c3078b3741bsalomon
3203322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        GrPrimitiveType primitiveType() const { return fPrimitiveType; }
3213322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        int startVertex() const { return fStartVertex; }
3223322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        int startIndex() const { return fStartIndex; }
3233322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        int vertexCount() const { return fVertexCount; }
3243322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        int indexCount() const { return fIndexCount; }
325b5238a7571c243ba4a154a62575570c3078b3741bsalomon
326b5238a7571c243ba4a154a62575570c3078b3741bsalomon        /** These return 0 if initInstanced was not used to initialize the DrawInfo. */
3273322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        int verticesPerInstance() const { return fVerticesPerInstance; }
3283322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        int indicesPerInstance() const { return fIndicesPerInstance; }
3293322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        int instanceCount() const { return fInstanceCount; }
3303322fa432a96fdc94d54f2475faf918dfa05b919joshualitt
3313322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        bool isIndexed() const { return fIndexCount > 0; }
3323322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        bool isInstanced() const { return fInstanceCount > 0; }
333b5238a7571c243ba4a154a62575570c3078b3741bsalomon
334b5238a7571c243ba4a154a62575570c3078b3741bsalomon        /** Called after using this draw info to draw the next set of instances.
335b5238a7571c243ba4a154a62575570c3078b3741bsalomon            The vertex offset is advanced while the index buffer is reused at the same
336b5238a7571c243ba4a154a62575570c3078b3741bsalomon            position. instancesRemaining is number of instances that remain, maxInstances is
337b5238a7571c243ba4a154a62575570c3078b3741bsalomon            the most number of instances that can be used with the index buffer. If there
338b5238a7571c243ba4a154a62575570c3078b3741bsalomon            are no instances remaining, the DrawInfo is unmodified and false is returned.*/
339b5238a7571c243ba4a154a62575570c3078b3741bsalomon        bool nextInstances(int* instancesRemaining, int maxInstances) {
340b5238a7571c243ba4a154a62575570c3078b3741bsalomon            SkASSERT(this->isInstanced());
341b5238a7571c243ba4a154a62575570c3078b3741bsalomon            if (!*instancesRemaining) {
342b5238a7571c243ba4a154a62575570c3078b3741bsalomon                return false;
343b5238a7571c243ba4a154a62575570c3078b3741bsalomon            }
344b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fStartVertex += fVertexCount;
345b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fInstanceCount = SkTMin(*instancesRemaining, maxInstances);
346b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fVertexCount = fInstanceCount * fVerticesPerInstance;
347b5238a7571c243ba4a154a62575570c3078b3741bsalomon            fIndexCount = fInstanceCount * fIndicesPerInstance;
348b5238a7571c243ba4a154a62575570c3078b3741bsalomon            *instancesRemaining -= fInstanceCount;
349b5238a7571c243ba4a154a62575570c3078b3741bsalomon            return true;
3503322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        }
351b5238a7571c243ba4a154a62575570c3078b3741bsalomon
3527eb8c7b00a5d776bebaf33a8687357df95c1aa43joshualitt        const GrVertexBuffer* vertexBuffer() const { return fVertexBuffer.get(); }
3537eb8c7b00a5d776bebaf33a8687357df95c1aa43joshualitt        const GrIndexBuffer* indexBuffer() const { return fIndexBuffer.get(); }
3543322fa432a96fdc94d54f2475faf918dfa05b919joshualitt
3553322fa432a96fdc94d54f2475faf918dfa05b919joshualitt    private:
3563322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        friend class GrDrawTarget;
3573322fa432a96fdc94d54f2475faf918dfa05b919joshualitt
3583322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        GrPrimitiveType         fPrimitiveType;
3593322fa432a96fdc94d54f2475faf918dfa05b919joshualitt
3603322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        int                     fStartVertex;
3613322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        int                     fStartIndex;
3623322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        int                     fVertexCount;
3633322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        int                     fIndexCount;
3643322fa432a96fdc94d54f2475faf918dfa05b919joshualitt
3653322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        int                     fInstanceCount;
3663322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        int                     fVerticesPerInstance;
3673322fa432a96fdc94d54f2475faf918dfa05b919joshualitt        int                     fIndicesPerInstance;
3683322fa432a96fdc94d54f2475faf918dfa05b919joshualitt
3697eb8c7b00a5d776bebaf33a8687357df95c1aa43joshualitt        GrPendingIOResource<const GrVertexBuffer, kRead_GrIOType> fVertexBuffer;
3707eb8c7b00a5d776bebaf33a8687357df95c1aa43joshualitt        GrPendingIOResource<const GrIndexBuffer, kRead_GrIOType>  fIndexBuffer;
3713322fa432a96fdc94d54f2475faf918dfa05b919joshualitt    };
3722c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt
3732c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt    bool programUnitTest(int maxStages);
3742c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt
375ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comprotected:
376e46760e8b2b2fc4a11a43a3b7cc9da7166c83c46joshualitt    friend class GrCommandBuilder; // for PipelineInfo
377dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips    friend class GrTargetCommands; // for PipelineInfo
378dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips
3796e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com    GrContext* getContext() { return fContext; }
3806e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com    const GrContext* getContext() const { return fContext; }
3816e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com
382a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    GrGpu* getGpu() {
383a73239a0096370221d3dfababf339dd6d3fed84fbsalomon        SkASSERT(fContext && fContext->getGpu());
384a73239a0096370221d3dfababf339dd6d3fed84fbsalomon        return fContext->getGpu();
385a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    }
386a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    const GrGpu* getGpu() const {
387a73239a0096370221d3dfababf339dd6d3fed84fbsalomon        SkASSERT(fContext && fContext->getGpu());
388a73239a0096370221d3dfababf339dd6d3fed84fbsalomon        return fContext->getGpu();
389a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    }
390a73239a0096370221d3dfababf339dd6d3fed84fbsalomon
391a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    GrVertexBufferAllocPool* getVertexAllocPool() { return fVertexPool; }
392a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    GrIndexBufferAllocPool* getIndexAllocPool() { return fIndexPool; }
39302ddc8b85ace91b15feb329a6a1d5d62b2b846c6bsalomon@google.com
3942a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org    const GrTraceMarkerSet& getActiveTraceMarkers() { return fActiveTraceMarkers; }
3952a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org
396651713408c5a5d9565665967ad09981250c7a8c9joshualitt    // Makes a copy of the dst if it is necessary for the draw. Returns false if a copy is required
397651713408c5a5d9565665967ad09981250c7a8c9joshualitt    // but couldn't be made. Otherwise, returns true.  This method needs to be protected because it
398651713408c5a5d9565665967ad09981250c7a8c9joshualitt    // needs to be accessed by GLPrograms to setup a correct drawstate
39950785a3d10b53bea5beb6e18431a2449860be237bsalomon    bool setupDstReadIfNecessary(const GrPipelineBuilder&,
400e36914cb205699526988127a827d1a76c9a98d39egdaniel                                 const GrProcOptInfo& colorPOI,
401e36914cb205699526988127a827d1a76c9a98d39egdaniel                                 const GrProcOptInfo& coveragePOI,
4029853ccef19c200be93a6211f32589fa82a53067cjoshualitt                                 GrDeviceCoordTexture* dstCopy,
4039853ccef19c200be93a6211f32589fa82a53067cjoshualitt                                 const SkRect* drawBounds);
404651713408c5a5d9565665967ad09981250c7a8c9joshualitt
405e36914cb205699526988127a827d1a76c9a98d39egdaniel    struct PipelineInfo {
406e36914cb205699526988127a827d1a76c9a98d39egdaniel        PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor,
40744701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt                     const GrPrimitiveProcessor* primProc,
40844701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt                     const SkRect* devBounds, GrDrawTarget* target);
409e36914cb205699526988127a827d1a76c9a98d39egdaniel
410e36914cb205699526988127a827d1a76c9a98d39egdaniel        PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor,
41144701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt                     const GrBatch* batch, const SkRect* devBounds,
41244701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt                     GrDrawTarget* target);
413e36914cb205699526988127a827d1a76c9a98d39egdaniel
414e36914cb205699526988127a827d1a76c9a98d39egdaniel        bool willBlendWithDst(const GrPrimitiveProcessor* primProc) const {
415e36914cb205699526988127a827d1a76c9a98d39egdaniel            return fPipelineBuilder->willBlendWithDst(primProc);
416e36914cb205699526988127a827d1a76c9a98d39egdaniel        }
417e36914cb205699526988127a827d1a76c9a98d39egdaniel    private:
418e36914cb205699526988127a827d1a76c9a98d39egdaniel        friend class GrDrawTarget;
419e36914cb205699526988127a827d1a76c9a98d39egdaniel
420e36914cb205699526988127a827d1a76c9a98d39egdaniel        bool mustSkipDraw() const { return (NULL == fPipelineBuilder); }
421e36914cb205699526988127a827d1a76c9a98d39egdaniel
422e36914cb205699526988127a827d1a76c9a98d39egdaniel        GrPipelineBuilder*      fPipelineBuilder;
423e36914cb205699526988127a827d1a76c9a98d39egdaniel        GrScissorState*         fScissor;
424e36914cb205699526988127a827d1a76c9a98d39egdaniel        GrProcOptInfo           fColorPOI;
425e36914cb205699526988127a827d1a76c9a98d39egdaniel        GrProcOptInfo           fCoveragePOI;
426e36914cb205699526988127a827d1a76c9a98d39egdaniel        GrDeviceCoordTexture    fDstCopy;
427e36914cb205699526988127a827d1a76c9a98d39egdaniel    };
428e36914cb205699526988127a827d1a76c9a98d39egdaniel
429e36914cb205699526988127a827d1a76c9a98d39egdaniel    void setupPipeline(const PipelineInfo& pipelineInfo, GrPipeline* pipeline);
430e36914cb205699526988127a827d1a76c9a98d39egdaniel
43102ddc8b85ace91b15feb329a6a1d5d62b2b846c6bsalomon@google.comprivate:
432a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    virtual void onReset() = 0;
433f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon
434a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    virtual void onFlush() = 0;
435f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon
436e36914cb205699526988127a827d1a76c9a98d39egdaniel    virtual void onDrawBatch(GrBatch*, const PipelineInfo&) = 0;
4375478d427c6e67c986a3390162c8fec77c466058ajoshualitt    // TODO copy in order drawbuffer onDrawRect to here
4388dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel    virtual void onDrawRect(GrPipelineBuilder*,
4392e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt                            GrColor color,
4408059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                            const SkMatrix& viewMatrix,
4419853ccef19c200be93a6211f32589fa82a53067cjoshualitt                            const SkRect& rect,
442fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org                            const SkRect* localRect,
4435478d427c6e67c986a3390162c8fec77c466058ajoshualitt                            const SkMatrix* localMatrix) = 0;
44432184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org
4458dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel    virtual void onStencilPath(const GrPipelineBuilder&,
44656995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt                               const GrPathProcessor*,
4479853ccef19c200be93a6211f32589fa82a53067cjoshualitt                               const GrPath*,
4483e79124a69d4806f0a1a776090bff718e1b90970bsalomon                               const GrScissorState&,
4492c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt                               const GrStencilSettings&) = 0;
450e36914cb205699526988127a827d1a76c9a98d39egdaniel    virtual void onDrawPath(const GrPathProcessor*,
4519853ccef19c200be93a6211f32589fa82a53067cjoshualitt                            const GrPath*,
4522c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt                            const GrStencilSettings&,
453e36914cb205699526988127a827d1a76c9a98d39egdaniel                            const PipelineInfo&) = 0;
454e36914cb205699526988127a827d1a76c9a98d39egdaniel    virtual void onDrawPaths(const GrPathProcessor*,
4559853ccef19c200be93a6211f32589fa82a53067cjoshualitt                             const GrPathRange*,
45655b24afc178e641e17a5664beba7ab2b4982c91acdalton                             const void* indices,
45755b24afc178e641e17a5664beba7ab2b4982c91acdalton                             PathIndexType,
45855b24afc178e641e17a5664beba7ab2b4982c91acdalton                             const float transformValues[],
4592c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt                             PathTransformType,
46055b24afc178e641e17a5664beba7ab2b4982c91acdalton                             int count,
4612c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt                             const GrStencilSettings&,
462e36914cb205699526988127a827d1a76c9a98d39egdaniel                             const PipelineInfo&) = 0;
46364aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com
46463b21962867af0f98e12a3ccbe5eef76b7ecc3aabsalomon    virtual void onClear(const SkIRect* rect, GrColor color, bool canIgnoreRect,
46563b21962867af0f98e12a3ccbe5eef76b7ecc3aabsalomon                         GrRenderTarget* renderTarget) = 0;
46663b21962867af0f98e12a3ccbe5eef76b7ecc3aabsalomon
467a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    /** The subclass's copy surface implementation. It should assume that any clipping has already
468a73239a0096370221d3dfababf339dd6d3fed84fbsalomon        been performed on the rect and point and that the GrGpu supports the copy. */
469a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    virtual void onCopySurface(GrSurface* dst,
470f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon                               GrSurface* src,
471f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon                               const SkIRect& srcRect,
472f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon                               const SkIPoint& dstPoint) = 0;
473f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon
474a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org    // Check to see if this set of draw commands has been sent out
475a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org    virtual bool       isIssued(uint32_t drawID) { return true; }
4769853ccef19c200be93a6211f32589fa82a53067cjoshualitt    void getPathStencilSettingsForFilltype(GrPathRendering::FillType,
4778dc7c3a839b38b73af34cc2674a06f49eb1ce527egdaniel                                           const GrStencilAttachment*,
4789853ccef19c200be93a6211f32589fa82a53067cjoshualitt                                           GrStencilSettings*);
479a702415d9e80f5631181143c293498de924e8ae4joshualitt    virtual GrClipMaskManager* clipMaskManager() = 0;
4808dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel    virtual bool setupClip(GrPipelineBuilder*,
4816be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon                           GrPipelineBuilder::AutoRestoreFragmentProcessors*,
4826be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon                           GrPipelineBuilder::AutoRestoreStencil*,
4836be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon                           GrScissorState*,
4848059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                           const SkRect* devBounds) = 0;
4857475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com
4866e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com    // The context owns us, not vice-versa, so this ptr is not ref'ed by DrawTarget.
4876e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com    GrContext*                                                      fContext;
488a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    SkAutoTUnref<const GrDrawTargetCaps>                            fCaps;
4892a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org    // To keep track that we always have at least as many debug marker adds as removes
4902a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org    int                                                             fGpuTraceMarkerCount;
4912a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org    GrTraceMarkerSet                                                fActiveTraceMarkers;
4923eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel    GrTraceMarkerSet                                                fStoredTraceMarkers;
493a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    GrVertexBufferAllocPool*                                        fVertexPool;
494a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    GrIndexBufferAllocPool*                                         fIndexPool;
495a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    bool                                                            fFlushing;
496fa35e3ddcc9d130ce87c927218bdf27879c38711reed@google.com
497a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.org    typedef SkRefCnt INHERITED;
498ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com};
499ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
500329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt/*
501329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt * This class is JUST for clip mask manager.  Everyone else should just use draw target above.
502329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt */
5036db519c42471aaaa8a8e1a3ece314014481ab832joshualittclass GrClipTarget : public GrDrawTarget {
5046db519c42471aaaa8a8e1a3ece314014481ab832joshualittpublic:
505a73239a0096370221d3dfababf339dd6d3fed84fbsalomon    GrClipTarget(GrContext* context,
506a73239a0096370221d3dfababf339dd6d3fed84fbsalomon                 GrVertexBufferAllocPool* vpool,
507a73239a0096370221d3dfababf339dd6d3fed84fbsalomon                 GrIndexBufferAllocPool* ipool)
508a73239a0096370221d3dfababf339dd6d3fed84fbsalomon        : INHERITED(context, vpool, ipool) {
509329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt        fClipMaskManager.setClipTarget(this);
510329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt    }
511329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt
512329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt    /* Clip mask manager needs access to the context.
513329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt     * TODO we only need a very small subset of context in the CMM.
514329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt     */
515329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt    GrContext* getContext() { return INHERITED::getContext(); }
516329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt    const GrContext* getContext() const { return INHERITED::getContext(); }
517329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt
5186db519c42471aaaa8a8e1a3ece314014481ab832joshualitt    /**
5196db519c42471aaaa8a8e1a3ece314014481ab832joshualitt     * Clip Mask Manager(and no one else) needs to clear private stencil bits.
5206db519c42471aaaa8a8e1a3ece314014481ab832joshualitt     * ClipTarget subclass sets clip bit in the stencil buffer. The subclass
5216db519c42471aaaa8a8e1a3ece314014481ab832joshualitt     * is free to clear the remaining bits to zero if masked clears are more
5226db519c42471aaaa8a8e1a3ece314014481ab832joshualitt     * expensive than clearing all bits.
5236db519c42471aaaa8a8e1a3ece314014481ab832joshualitt     */
5246db519c42471aaaa8a8e1a3ece314014481ab832joshualitt    virtual void clearStencilClip(const SkIRect& rect, bool insideClip, GrRenderTarget* = NULL) = 0;
5256db519c42471aaaa8a8e1a3ece314014481ab832joshualitt
5263bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt    /**
5273bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt     * Release any resources that are cached but not currently in use. This
5283bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt     * is intended to give an application some recourse when resources are low.
5293bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt     */
53036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void purgeResources() override {
5313bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt        // The clip mask manager can rebuild all its clip masks so just
5323bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt        // get rid of them all.
5333bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt        fClipMaskManager.purgeResources();
5343bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt    };
5353bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt
536329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualittprotected:
537329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt    GrClipMaskManager           fClipMaskManager;
538329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt
5396db519c42471aaaa8a8e1a3ece314014481ab832joshualittprivate:
54036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    GrClipMaskManager* clipMaskManager() override { return &fClipMaskManager; }
541329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt
5428dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel    virtual bool setupClip(GrPipelineBuilder*,
5436be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon                           GrPipelineBuilder::AutoRestoreFragmentProcessors*,
5446be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon                           GrPipelineBuilder::AutoRestoreStencil*,
5458059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt                           GrScissorState* scissorState,
54636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                           const SkRect* devBounds) override;
5472c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt
5486db519c42471aaaa8a8e1a3ece314014481ab832joshualitt    typedef GrDrawTarget INHERITED;
5496db519c42471aaaa8a8e1a3ece314014481ab832joshualitt};
5506db519c42471aaaa8a8e1a3ece314014481ab832joshualitt
551ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif
552