GrDrawTarget.h revision 72e3ae486c66871c2043eac4f08d85d419fbca2a
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; 3464aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.comclass GrPath; 35b85a0aab6905af8b329539b7573a7555b727d5e5cdaltonclass GrPathRange; 36e36914cb205699526988127a827d1a76c9a98d39egdanielclass GrPipeline; 3712b4e27ae1a29460e91a59f38122483e1faec697sugoi@google.com 38a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.orgclass GrDrawTarget : public SkRefCnt { 39bcce8926524827775539874346dd424a9510dbc9bsalomon@google.compublic: 40bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com SK_DECLARE_INST_COUNT(GrDrawTarget) 41bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com 4255b24afc178e641e17a5664beba7ab2b4982c91acdalton typedef GrPathRange::PathIndexType PathIndexType; 4355b24afc178e641e17a5664beba7ab2b4982c91acdalton typedef GrPathRendering::PathTransformType PathTransformType; 44ccdaa0422501e5cbcba53d6bd19f2736f1beaef3kkinnunen 45ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /////////////////////////////////////////////////////////////////////////// 46ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 476e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com // The context may not be fully constructed and should not be used during GrDrawTarget 486e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com // construction. 496e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com GrDrawTarget(GrContext* context); 5072e3ae486c66871c2043eac4f08d85d419fbca2absalomon virtual ~GrDrawTarget() {} 51ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 52ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 5318c9c198f571997463d9a7134dbd88298e592ec2bsalomon@google.com * Gets the capabilities of the draw target. 5418c9c198f571997463d9a7134dbd88298e592ec2bsalomon@google.com */ 55c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com const GrDrawTargetCaps* caps() const { return fCaps.get(); } 5618c9c198f571997463d9a7134dbd88298e592ec2bsalomon@google.com 574d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt // TODO devbounds should live on the batch 5844701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt void drawBatch(GrPipelineBuilder*, GrBatch*, const SkRect* devBounds = NULL); 594d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt 6086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com /** 6164aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com * Draws path into the stencil buffer. The fill must be either even/odd or 6264aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com * winding (not inverse or hairline). It will respect the HW antialias flag 638dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel * on the GrPipelineBuilder (if possible in the 3D API). Note, we will never have an inverse 648dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel * fill with stencil path 6564aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com */ 668dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel void stencilPath(GrPipelineBuilder*, const GrPathProcessor*, const GrPath*, 678dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel GrPathRendering::FillType); 6864aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com 6964aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com /** 7032184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org * Draws a path. Fill must not be a hairline. It will respect the HW 718dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel * antialias flag on the GrPipelineBuilder (if possible in the 3D API). 72c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org */ 738dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel void drawPath(GrPipelineBuilder*, const GrPathProcessor*, const GrPath*, 748dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel GrPathRendering::FillType); 75c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org 76c4dc0ad8e252a7e30d19b47d3d0d9f2c69faf854commit-bot@chromium.org /** 7755b24afc178e641e17a5664beba7ab2b4982c91acdalton * Draws the aggregate path from combining multiple. Note that this will not 7855b24afc178e641e17a5664beba7ab2b4982c91acdalton * always be equivalent to back-to-back calls to drawPath(). It will respect 798dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel * the HW antialias flag on the GrPipelineBuilder (if possible in the 3D API). 809b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org * 8155b24afc178e641e17a5664beba7ab2b4982c91acdalton * @param pathRange Source paths to draw from 8255b24afc178e641e17a5664beba7ab2b4982c91acdalton * @param indices Array of path indices to draw 8355b24afc178e641e17a5664beba7ab2b4982c91acdalton * @param indexType Data type of the array elements in indexBuffer 8455b24afc178e641e17a5664beba7ab2b4982c91acdalton * @param transformValues Array of transforms for the individual paths 8555b24afc178e641e17a5664beba7ab2b4982c91acdalton * @param transformType Type of transforms in transformBuffer 8655b24afc178e641e17a5664beba7ab2b4982c91acdalton * @param count Number of paths to draw 87b85a0aab6905af8b329539b7573a7555b727d5e5cdalton * @param fill Fill type for drawing all the paths 88b85a0aab6905af8b329539b7573a7555b727d5e5cdalton */ 898dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel void drawPaths(GrPipelineBuilder*, 9056995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt const GrPathProcessor*, 912e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt const GrPathRange* pathRange, 9255b24afc178e641e17a5664beba7ab2b4982c91acdalton const void* indices, 9355b24afc178e641e17a5664beba7ab2b4982c91acdalton PathIndexType indexType, 9455b24afc178e641e17a5664beba7ab2b4982c91acdalton const float transformValues[], 9555b24afc178e641e17a5664beba7ab2b4982c91acdalton PathTransformType transformType, 969853ccef19c200be93a6211f32589fa82a53067cjoshualitt int count, 9792e496f96abbd664888f0c8a7d546ab02e703bf7joshualitt GrPathRendering::FillType fill); 98b85a0aab6905af8b329539b7573a7555b727d5e5cdalton 999b62aa156bcf1db6f11af9302bf8bb8ef2567142commit-bot@chromium.org /** 10072e3ae486c66871c2043eac4f08d85d419fbca2absalomon * Helper function for drawing rects. 101044679ef8c08e1f01afadf5bc08251fe8597df81skia.committer@gmail.com * 102c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com * @param rect the rect to draw 103c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com * @param localRect optional rect that specifies local coords to map onto 104c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com * rect. If NULL then rect serves as the local coords. 1058fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt * @param localMatrix Optional local matrix. The local coordinates are specified by localRect, 1068fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt * or if it is NULL by rect. This matrix applies to the coordinate implied by 1078fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt * that rectangle before it is input to GrCoordTransforms that read local 1088fc6c2d82c1f30ff82274334c01f0799def6a609joshualitt * coordinates 10986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com */ 1104d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt void drawRect(GrPipelineBuilder* pipelineBuilder, 1112e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt GrColor color, 1128059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& viewMatrix, 1139853ccef19c200be93a6211f32589fa82a53067cjoshualitt const SkRect& rect, 114fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org const SkRect* localRect, 1150406b9e1faee06c6ecb2732a1bcf3b0e53104e07bsalomon@google.com const SkMatrix* localMatrix) { 1164d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt this->onDrawRect(pipelineBuilder, color, viewMatrix, rect, localRect, localMatrix); 1170406b9e1faee06c6ecb2732a1bcf3b0e53104e07bsalomon@google.com } 1183976825a21532e254311b90b4a9046e25717e335jvanverth@google.com 119cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com /** 120c78188896e28a4ae49e406a7422b345ae177dafebsalomon@google.com * Helper for drawRect when the caller doesn't need separate local rects or matrices. 121cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com */ 1228dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel void drawSimpleRect(GrPipelineBuilder* ds, GrColor color, const SkMatrix& viewM, 1238dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel const SkRect& rect) { 1248059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt this->drawRect(ds, color, viewM, rect, NULL, NULL); 125cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com } 1268dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel void drawSimpleRect(GrPipelineBuilder* ds, GrColor color, const SkMatrix& viewM, 1278059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkIRect& irect) { 1284469938e92d779dff05e745559e67907bbf21e78reed@google.com SkRect rect = SkRect::Make(irect); 1298059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt this->drawRect(ds, color, viewM, rect, NULL, NULL); 130cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com } 13186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 132934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com 133934c570297c1b1f99cb4ca8d012d468a7eddf73fbsalomon@google.com /** 1348dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel * Clear the passed in render target. Ignores the GrPipelineBuilder and clip. Clears the whole 1358dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel * thing if rect is NULL, otherwise just the rect. If canIgnoreRect is set then the entire 1368dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel * render target can be optionally cleared. 1370b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com */ 1389853ccef19c200be93a6211f32589fa82a53067cjoshualitt void clear(const SkIRect* rect, 1399853ccef19c200be93a6211f32589fa82a53067cjoshualitt GrColor color, 1409853ccef19c200be93a6211f32589fa82a53067cjoshualitt bool canIgnoreRect, 14163b21962867af0f98e12a3ccbe5eef76b7ecc3aabsalomon GrRenderTarget* renderTarget); 142a9493a3c78f6eb82635ece960b4f16918b885428skia.committer@gmail.com 143e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com /** 14489c62980c1eb50b2090f33312086c7e8c66739b4bsalomon * Discards the contents render target. 14528361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org **/ 14689c62980c1eb50b2090f33312086c7e8c66739b4bsalomon virtual void discard(GrRenderTarget*) = 0; 14728361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org 14828361fad1054d59ed4e6a320c7a8b8782a1487c7commit-bot@chromium.org /** 1492a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org * Called at start and end of gpu trace marking 1502a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org * GR_CREATE_GPU_TRACE_MARKER(marker_str, target) will automatically call these at the start 1512a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org * and end of a code block respectively 152a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org */ 1533eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel void addGpuTraceMarker(const GrGpuTraceMarker* marker); 1543eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel void removeGpuTraceMarker(const GrGpuTraceMarker* marker); 1553eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel 1563eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel /** 1573eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel * Takes the current active set of markers and stores them for later use. Any current marker 1583eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel * in the active set is removed from the active set and the targets remove function is called. 1593eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel * These functions do not work as a stack so you cannot call save a second time before calling 1603eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel * restore. Also, it is assumed that when restore is called the current active set of markers 1613eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel * is empty. When the stored markers are added back into the active set, the targets add marker 1623eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel * is called. 1633eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel */ 1643eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel void saveActiveTraceMarkers(); 1653eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel void restoreActiveTraceMarkers(); 166a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org 167a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org /** 168e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com * Copies a pixel rectangle from one surface to another. This call may finalize 169e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com * reserved vertex/index data (as though a draw call was made). The src pixels 170e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com * copied are specified by srcRect. They are copied to a rect of the same 171e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com * size in dst with top left at dstPoint. If the src rect is clipped by the 172e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com * src bounds then pixel values in the dst rect corresponding to area clipped 173e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com * by the src rect are not overwritten. This method can fail and return false 174e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com * depending on the type of surface, configs, etc, and the backend-specific 175e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com * limitations. If rect is clipped out entirely by the src or dst bounds then 176e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com * true is returned since there is no actual copy necessary to succeed. 177e4617bf6d45cdde07f89e341ebf5c485916bf0b2bsalomon@google.com */ 178f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon bool copySurface(GrSurface* dst, 179f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon GrSurface* src, 180f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon const SkIRect& srcRect, 181f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon const SkIPoint& dstPoint); 182116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com /** 183f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon * Function that determines whether a copySurface call would succeed without actually 184116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com * performing the copy. 185116ad84d3126b0db22b2312ca59ed70e5c56f6fcbsalomon@google.com */ 186f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon bool canCopySurface(const GrSurface* dst, 187f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon const GrSurface* src, 188f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon const SkIRect& srcRect, 189f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon const SkIPoint& dstPoint); 190eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.com 191eb85117c05471e1a55ce387cbc38279f857a4584bsalomon@google.com /** 192ff17584e1c15f68ccc296be517e8a6776a9ddabdrobertphillips@google.com * Release any resources that are cached but not currently in use. This 193ff17584e1c15f68ccc296be517e8a6776a9ddabdrobertphillips@google.com * is intended to give an application some recourse when resources are low. 194ff17584e1c15f68ccc296be517e8a6776a9ddabdrobertphillips@google.com */ 195ff17584e1c15f68ccc296be517e8a6776a9ddabdrobertphillips@google.com virtual void purgeResources() {}; 196ff17584e1c15f68ccc296be517e8a6776a9ddabdrobertphillips@google.com 197a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org /////////////////////////////////////////////////////////////////////////// 198a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org // Draw execution tracking (for font atlases and other resources) 199a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org class DrawToken { 200a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org public: 201a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org DrawToken(GrDrawTarget* drawTarget, uint32_t drawID) : 202a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org fDrawTarget(drawTarget), fDrawID(drawID) {} 2037475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com 20449f085dddff10473b6ebf832a974288300224e60bsalomon bool isIssued() { return fDrawTarget && fDrawTarget->isIssued(fDrawID); } 2057475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com 206a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org private: 207a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org GrDrawTarget* fDrawTarget; 208a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org uint32_t fDrawID; // this may wrap, but we're doing direct comparison 209a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org // so that should be okay 210a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org }; 2117475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com 212a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org virtual DrawToken getCurrentDrawToken() { return DrawToken(this, 0); } 2137475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com 2143322fa432a96fdc94d54f2475faf918dfa05b919joshualitt /** 2153322fa432a96fdc94d54f2475faf918dfa05b919joshualitt * Used to communicate draws to GPUs / subclasses 2163322fa432a96fdc94d54f2475faf918dfa05b919joshualitt */ 2173322fa432a96fdc94d54f2475faf918dfa05b919joshualitt class DrawInfo { 2183322fa432a96fdc94d54f2475faf918dfa05b919joshualitt public: 2194d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt DrawInfo() { fDevBounds = NULL; } 2203322fa432a96fdc94d54f2475faf918dfa05b919joshualitt DrawInfo(const DrawInfo& di) { (*this) = di; } 2213322fa432a96fdc94d54f2475faf918dfa05b919joshualitt DrawInfo& operator =(const DrawInfo& di); 2223322fa432a96fdc94d54f2475faf918dfa05b919joshualitt 2233322fa432a96fdc94d54f2475faf918dfa05b919joshualitt GrPrimitiveType primitiveType() const { return fPrimitiveType; } 2243322fa432a96fdc94d54f2475faf918dfa05b919joshualitt int startVertex() const { return fStartVertex; } 2253322fa432a96fdc94d54f2475faf918dfa05b919joshualitt int startIndex() const { return fStartIndex; } 2263322fa432a96fdc94d54f2475faf918dfa05b919joshualitt int vertexCount() const { return fVertexCount; } 2273322fa432a96fdc94d54f2475faf918dfa05b919joshualitt int indexCount() const { return fIndexCount; } 2283322fa432a96fdc94d54f2475faf918dfa05b919joshualitt int verticesPerInstance() const { return fVerticesPerInstance; } 2293322fa432a96fdc94d54f2475faf918dfa05b919joshualitt int indicesPerInstance() const { return fIndicesPerInstance; } 2303322fa432a96fdc94d54f2475faf918dfa05b919joshualitt int instanceCount() const { return fInstanceCount; } 2313322fa432a96fdc94d54f2475faf918dfa05b919joshualitt 2324d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt void setPrimitiveType(GrPrimitiveType type) { fPrimitiveType = type; } 2334d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt void setStartVertex(int startVertex) { fStartVertex = startVertex; } 2344d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt void setStartIndex(int startIndex) { fStartIndex = startIndex; } 2354d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt void setVertexCount(int vertexCount) { fVertexCount = vertexCount; } 2364d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt void setIndexCount(int indexCount) { fIndexCount = indexCount; } 2374d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt void setVerticesPerInstance(int verticesPerI) { fVerticesPerInstance = verticesPerI; } 2384d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt void setIndicesPerInstance(int indicesPerI) { fIndicesPerInstance = indicesPerI; } 2394d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt void setInstanceCount(int instanceCount) { fInstanceCount = instanceCount; } 2404d8da81562852e0ff7e18b66ee1cebd50ad81ee8joshualitt 2413322fa432a96fdc94d54f2475faf918dfa05b919joshualitt bool isIndexed() const { return fIndexCount > 0; } 2423322fa432a96fdc94d54f2475faf918dfa05b919joshualitt#ifdef SK_DEBUG 2433322fa432a96fdc94d54f2475faf918dfa05b919joshualitt bool isInstanced() const; // this version is longer because of asserts 2443322fa432a96fdc94d54f2475faf918dfa05b919joshualitt#else 2453322fa432a96fdc94d54f2475faf918dfa05b919joshualitt bool isInstanced() const { return fInstanceCount > 0; } 2463322fa432a96fdc94d54f2475faf918dfa05b919joshualitt#endif 2473322fa432a96fdc94d54f2475faf918dfa05b919joshualitt 2483322fa432a96fdc94d54f2475faf918dfa05b919joshualitt // adds or remove instances 2493322fa432a96fdc94d54f2475faf918dfa05b919joshualitt void adjustInstanceCount(int instanceOffset); 2503322fa432a96fdc94d54f2475faf918dfa05b919joshualitt // shifts the start vertex 25172e3ae486c66871c2043eac4f08d85d419fbca2absalomon void adjustStartVertex(int vertexOffset) { 25272e3ae486c66871c2043eac4f08d85d419fbca2absalomon fStartVertex += vertexOffset; 25372e3ae486c66871c2043eac4f08d85d419fbca2absalomon SkASSERT(fStartVertex >= 0); 25472e3ae486c66871c2043eac4f08d85d419fbca2absalomon } 2553322fa432a96fdc94d54f2475faf918dfa05b919joshualitt // shifts the start index 25672e3ae486c66871c2043eac4f08d85d419fbca2absalomon void adjustStartIndex(int indexOffset) { 25772e3ae486c66871c2043eac4f08d85d419fbca2absalomon SkASSERT(this->isIndexed()); 25872e3ae486c66871c2043eac4f08d85d419fbca2absalomon fStartIndex += indexOffset; 25972e3ae486c66871c2043eac4f08d85d419fbca2absalomon SkASSERT(fStartIndex >= 0); 26072e3ae486c66871c2043eac4f08d85d419fbca2absalomon } 2613322fa432a96fdc94d54f2475faf918dfa05b919joshualitt void setDevBounds(const SkRect& bounds) { 2623322fa432a96fdc94d54f2475faf918dfa05b919joshualitt fDevBoundsStorage = bounds; 2633322fa432a96fdc94d54f2475faf918dfa05b919joshualitt fDevBounds = &fDevBoundsStorage; 2643322fa432a96fdc94d54f2475faf918dfa05b919joshualitt } 2657eb8c7b00a5d776bebaf33a8687357df95c1aa43joshualitt const GrVertexBuffer* vertexBuffer() const { return fVertexBuffer.get(); } 2667eb8c7b00a5d776bebaf33a8687357df95c1aa43joshualitt const GrIndexBuffer* indexBuffer() const { return fIndexBuffer.get(); } 2677eb8c7b00a5d776bebaf33a8687357df95c1aa43joshualitt void setVertexBuffer(const GrVertexBuffer* vb) { 2687eb8c7b00a5d776bebaf33a8687357df95c1aa43joshualitt fVertexBuffer.reset(vb); 2697eb8c7b00a5d776bebaf33a8687357df95c1aa43joshualitt } 2707eb8c7b00a5d776bebaf33a8687357df95c1aa43joshualitt void setIndexBuffer(const GrIndexBuffer* ib) { 2717eb8c7b00a5d776bebaf33a8687357df95c1aa43joshualitt fIndexBuffer.reset(ib); 2727eb8c7b00a5d776bebaf33a8687357df95c1aa43joshualitt } 2733322fa432a96fdc94d54f2475faf918dfa05b919joshualitt const SkRect* getDevBounds() const { return fDevBounds; } 2743322fa432a96fdc94d54f2475faf918dfa05b919joshualitt 2753322fa432a96fdc94d54f2475faf918dfa05b919joshualitt private: 2763322fa432a96fdc94d54f2475faf918dfa05b919joshualitt friend class GrDrawTarget; 2773322fa432a96fdc94d54f2475faf918dfa05b919joshualitt 2783322fa432a96fdc94d54f2475faf918dfa05b919joshualitt GrPrimitiveType fPrimitiveType; 2793322fa432a96fdc94d54f2475faf918dfa05b919joshualitt 2803322fa432a96fdc94d54f2475faf918dfa05b919joshualitt int fStartVertex; 2813322fa432a96fdc94d54f2475faf918dfa05b919joshualitt int fStartIndex; 2823322fa432a96fdc94d54f2475faf918dfa05b919joshualitt int fVertexCount; 2833322fa432a96fdc94d54f2475faf918dfa05b919joshualitt int fIndexCount; 2843322fa432a96fdc94d54f2475faf918dfa05b919joshualitt 2853322fa432a96fdc94d54f2475faf918dfa05b919joshualitt int fInstanceCount; 2863322fa432a96fdc94d54f2475faf918dfa05b919joshualitt int fVerticesPerInstance; 2873322fa432a96fdc94d54f2475faf918dfa05b919joshualitt int fIndicesPerInstance; 2883322fa432a96fdc94d54f2475faf918dfa05b919joshualitt 2893322fa432a96fdc94d54f2475faf918dfa05b919joshualitt SkRect fDevBoundsStorage; 2903322fa432a96fdc94d54f2475faf918dfa05b919joshualitt SkRect* fDevBounds; 2913322fa432a96fdc94d54f2475faf918dfa05b919joshualitt 2927eb8c7b00a5d776bebaf33a8687357df95c1aa43joshualitt GrPendingIOResource<const GrVertexBuffer, kRead_GrIOType> fVertexBuffer; 2937eb8c7b00a5d776bebaf33a8687357df95c1aa43joshualitt GrPendingIOResource<const GrIndexBuffer, kRead_GrIOType> fIndexBuffer; 2943322fa432a96fdc94d54f2475faf918dfa05b919joshualitt }; 2952c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt 2962c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt bool programUnitTest(int maxStages); 2972c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt 298ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comprotected: 299dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips friend class GrTargetCommands; // for PipelineInfo 300dad7794dcbf205a6d0f3c5c44e251897f5256f09robertphillips 3016e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com GrContext* getContext() { return fContext; } 3026e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com const GrContext* getContext() const { return fContext; } 3036e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com 304bcce8926524827775539874346dd424a9510dbc9bsalomon@google.com // Subclass must initialize this in its constructor. 305c26d94fd7dc0b00cd6d0e42d28285f4a38aff021bsalomon@google.com SkAutoTUnref<const GrDrawTargetCaps> fCaps; 30602ddc8b85ace91b15feb329a6a1d5d62b2b846c6bsalomon@google.com 3072a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org const GrTraceMarkerSet& getActiveTraceMarkers() { return fActiveTraceMarkers; } 3082a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org 309651713408c5a5d9565665967ad09981250c7a8c9joshualitt // Makes a copy of the dst if it is necessary for the draw. Returns false if a copy is required 310651713408c5a5d9565665967ad09981250c7a8c9joshualitt // but couldn't be made. Otherwise, returns true. This method needs to be protected because it 311651713408c5a5d9565665967ad09981250c7a8c9joshualitt // needs to be accessed by GLPrograms to setup a correct drawstate 31250785a3d10b53bea5beb6e18431a2449860be237bsalomon bool setupDstReadIfNecessary(const GrPipelineBuilder&, 313e36914cb205699526988127a827d1a76c9a98d39egdaniel const GrProcOptInfo& colorPOI, 314e36914cb205699526988127a827d1a76c9a98d39egdaniel const GrProcOptInfo& coveragePOI, 3159853ccef19c200be93a6211f32589fa82a53067cjoshualitt GrDeviceCoordTexture* dstCopy, 3169853ccef19c200be93a6211f32589fa82a53067cjoshualitt const SkRect* drawBounds); 317651713408c5a5d9565665967ad09981250c7a8c9joshualitt 318e36914cb205699526988127a827d1a76c9a98d39egdaniel struct PipelineInfo { 319e36914cb205699526988127a827d1a76c9a98d39egdaniel PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor, 32044701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt const GrPrimitiveProcessor* primProc, 32144701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt const SkRect* devBounds, GrDrawTarget* target); 322e36914cb205699526988127a827d1a76c9a98d39egdaniel 323e36914cb205699526988127a827d1a76c9a98d39egdaniel PipelineInfo(GrPipelineBuilder* pipelineBuilder, GrScissorState* scissor, 32444701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt const GrBatch* batch, const SkRect* devBounds, 32544701df5ce572ac3cccec785cf52103d3d5d14a5joshualitt GrDrawTarget* target); 326e36914cb205699526988127a827d1a76c9a98d39egdaniel 327e36914cb205699526988127a827d1a76c9a98d39egdaniel bool willBlendWithDst(const GrPrimitiveProcessor* primProc) const { 328e36914cb205699526988127a827d1a76c9a98d39egdaniel return fPipelineBuilder->willBlendWithDst(primProc); 329e36914cb205699526988127a827d1a76c9a98d39egdaniel } 330e36914cb205699526988127a827d1a76c9a98d39egdaniel private: 331e36914cb205699526988127a827d1a76c9a98d39egdaniel friend class GrDrawTarget; 332e36914cb205699526988127a827d1a76c9a98d39egdaniel 333e36914cb205699526988127a827d1a76c9a98d39egdaniel bool mustSkipDraw() const { return (NULL == fPipelineBuilder); } 334e36914cb205699526988127a827d1a76c9a98d39egdaniel 335e36914cb205699526988127a827d1a76c9a98d39egdaniel GrPipelineBuilder* fPipelineBuilder; 336e36914cb205699526988127a827d1a76c9a98d39egdaniel GrScissorState* fScissor; 337e36914cb205699526988127a827d1a76c9a98d39egdaniel GrProcOptInfo fColorPOI; 338e36914cb205699526988127a827d1a76c9a98d39egdaniel GrProcOptInfo fCoveragePOI; 339e36914cb205699526988127a827d1a76c9a98d39egdaniel GrDeviceCoordTexture fDstCopy; 340e36914cb205699526988127a827d1a76c9a98d39egdaniel }; 341e36914cb205699526988127a827d1a76c9a98d39egdaniel 342e36914cb205699526988127a827d1a76c9a98d39egdaniel void setupPipeline(const PipelineInfo& pipelineInfo, GrPipeline* pipeline); 343e36914cb205699526988127a827d1a76c9a98d39egdaniel 34402ddc8b85ace91b15feb329a6a1d5d62b2b846c6bsalomon@google.comprivate: 345f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon /** 346f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon * This will be called before allocating a texture as a dst for copySurface. This function 347f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon * populates the dstDesc's config, flags, and origin so as to maximize efficiency and guarantee 348f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon * success of the copySurface call. 349f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon */ 350f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon void initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* dstDesc) { 351f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon if (!this->onInitCopySurfaceDstDesc(src, dstDesc)) { 352f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon dstDesc->fOrigin = kDefault_GrSurfaceOrigin; 3536bc1b5fab8554a9cb643277b4867965dd4535cd6bsalomon dstDesc->fFlags = kRenderTarget_GrSurfaceFlag; 354f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon dstDesc->fConfig = src->config(); 355f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon } 356f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon } 357f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon 358f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon /** Internal implementation of canCopySurface. */ 359f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon bool internalCanCopySurface(const GrSurface* dst, 360f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon const GrSurface* src, 361f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon const SkIRect& clippedSrcRect, 362f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon const SkIPoint& clippedDstRect); 363f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon 364e36914cb205699526988127a827d1a76c9a98d39egdaniel virtual void onDrawBatch(GrBatch*, const PipelineInfo&) = 0; 3655478d427c6e67c986a3390162c8fec77c466058ajoshualitt // TODO copy in order drawbuffer onDrawRect to here 3668dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel virtual void onDrawRect(GrPipelineBuilder*, 3672e3b3e369d79e78f7635d4c20e83a47ab571bdf2joshualitt GrColor color, 3688059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkMatrix& viewMatrix, 3699853ccef19c200be93a6211f32589fa82a53067cjoshualitt const SkRect& rect, 370fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org const SkRect* localRect, 3715478d427c6e67c986a3390162c8fec77c466058ajoshualitt const SkMatrix* localMatrix) = 0; 37232184d81629e39809bb9e915286d8fe971a8ed68commit-bot@chromium.org 3738dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel virtual void onStencilPath(const GrPipelineBuilder&, 37456995b5cc00c9c83bd5fcf86bca9a67e939a96cbjoshualitt const GrPathProcessor*, 3759853ccef19c200be93a6211f32589fa82a53067cjoshualitt const GrPath*, 3763e79124a69d4806f0a1a776090bff718e1b90970bsalomon const GrScissorState&, 3772c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt const GrStencilSettings&) = 0; 378e36914cb205699526988127a827d1a76c9a98d39egdaniel virtual void onDrawPath(const GrPathProcessor*, 3799853ccef19c200be93a6211f32589fa82a53067cjoshualitt const GrPath*, 3802c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt const GrStencilSettings&, 381e36914cb205699526988127a827d1a76c9a98d39egdaniel const PipelineInfo&) = 0; 382e36914cb205699526988127a827d1a76c9a98d39egdaniel virtual void onDrawPaths(const GrPathProcessor*, 3839853ccef19c200be93a6211f32589fa82a53067cjoshualitt const GrPathRange*, 38455b24afc178e641e17a5664beba7ab2b4982c91acdalton const void* indices, 38555b24afc178e641e17a5664beba7ab2b4982c91acdalton PathIndexType, 38655b24afc178e641e17a5664beba7ab2b4982c91acdalton const float transformValues[], 3872c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt PathTransformType, 38855b24afc178e641e17a5664beba7ab2b4982c91acdalton int count, 3892c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt const GrStencilSettings&, 390e36914cb205699526988127a827d1a76c9a98d39egdaniel const PipelineInfo&) = 0; 39164aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com 39263b21962867af0f98e12a3ccbe5eef76b7ecc3aabsalomon virtual void onClear(const SkIRect* rect, GrColor color, bool canIgnoreRect, 39363b21962867af0f98e12a3ccbe5eef76b7ecc3aabsalomon GrRenderTarget* renderTarget) = 0; 39463b21962867af0f98e12a3ccbe5eef76b7ecc3aabsalomon 395f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon /** The subclass will get a chance to copy the surface for falling back to the default 396f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon implementation, which simply draws a rectangle (and fails if dst isn't a render target). It 397f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon should assume that any clipping has already been performed on the rect and point. It won't 398f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon be called if the copy can be skipped. */ 399f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon virtual bool onCopySurface(GrSurface* dst, 400f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon GrSurface* src, 401f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon const SkIRect& srcRect, 402f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon const SkIPoint& dstPoint) = 0; 403f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon 404f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon /** Indicates whether onCopySurface would succeed. It should assume that any clipping has 405f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon already been performed on the rect and point. It won't be called if the copy can be 406f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon skipped. */ 407f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon virtual bool onCanCopySurface(const GrSurface* dst, 408f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon const GrSurface* src, 409f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon const SkIRect& srcRect, 410f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon const SkIPoint& dstPoint) = 0; 411f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon /** 412f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon * This will be called before allocating a texture to be a dst for onCopySurface. Only the 413f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon * dstDesc's config, flags, and origin need be set by the function. If the subclass cannot 414f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon * create a surface that would succeed its implementation of onCopySurface, it should return 415f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon * false. The base class will fall back to creating a render target to draw into using the src. 416f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon */ 417f90a02b42ac7a1ed59460760c6ce03f6f975f22bbsalomon virtual bool onInitCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* dstDesc) = 0; 41863b21962867af0f98e12a3ccbe5eef76b7ecc3aabsalomon 419a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org // Check to see if this set of draw commands has been sent out 420a8916ffd90c04dc6cc1fb9ba94af2ff950284fadcommit-bot@chromium.org virtual bool isIssued(uint32_t drawID) { return true; } 4219853ccef19c200be93a6211f32589fa82a53067cjoshualitt void getPathStencilSettingsForFilltype(GrPathRendering::FillType, 4228dc7c3a839b38b73af34cc2674a06f49eb1ce527egdaniel const GrStencilAttachment*, 4239853ccef19c200be93a6211f32589fa82a53067cjoshualitt GrStencilSettings*); 424a702415d9e80f5631181143c293498de924e8ae4joshualitt virtual GrClipMaskManager* clipMaskManager() = 0; 4258dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel virtual bool setupClip(GrPipelineBuilder*, 4266be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon GrPipelineBuilder::AutoRestoreFragmentProcessors*, 4276be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon GrPipelineBuilder::AutoRestoreStencil*, 4286be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon GrScissorState*, 4298059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt const SkRect* devBounds) = 0; 4307475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com 4316e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com // The context owns us, not vice-versa, so this ptr is not ref'ed by DrawTarget. 4326e4e65066a7c0dbc9bfbfe4b8f5d49c3d8a79b59bsalomon@google.com GrContext* fContext; 4332a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org // To keep track that we always have at least as many debug marker adds as removes 4342a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org int fGpuTraceMarkerCount; 4352a05de0c049a8648942a55016126a1f92e1c14d6commit-bot@chromium.org GrTraceMarkerSet fActiveTraceMarkers; 4363eee3834fba1d2e29dfb61adcb97e4624b6a3ac8egdaniel GrTraceMarkerSet fStoredTraceMarkers; 437fa35e3ddcc9d130ce87c927218bdf27879c38711reed@google.com 438a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.org typedef SkRefCnt INHERITED; 439ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}; 440ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 441329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt/* 442329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt * This class is JUST for clip mask manager. Everyone else should just use draw target above. 443329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt */ 4446db519c42471aaaa8a8e1a3ece314014481ab832joshualittclass GrClipTarget : public GrDrawTarget { 4456db519c42471aaaa8a8e1a3ece314014481ab832joshualittpublic: 446329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt GrClipTarget(GrContext* context) : INHERITED(context) { 447329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt fClipMaskManager.setClipTarget(this); 448329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt } 449329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt 450329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt /* Clip mask manager needs access to the context. 451329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt * TODO we only need a very small subset of context in the CMM. 452329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt */ 453329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt GrContext* getContext() { return INHERITED::getContext(); } 454329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt const GrContext* getContext() const { return INHERITED::getContext(); } 455329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt 4566db519c42471aaaa8a8e1a3ece314014481ab832joshualitt /** 4576db519c42471aaaa8a8e1a3ece314014481ab832joshualitt * Clip Mask Manager(and no one else) needs to clear private stencil bits. 4586db519c42471aaaa8a8e1a3ece314014481ab832joshualitt * ClipTarget subclass sets clip bit in the stencil buffer. The subclass 4596db519c42471aaaa8a8e1a3ece314014481ab832joshualitt * is free to clear the remaining bits to zero if masked clears are more 4606db519c42471aaaa8a8e1a3ece314014481ab832joshualitt * expensive than clearing all bits. 4616db519c42471aaaa8a8e1a3ece314014481ab832joshualitt */ 4626db519c42471aaaa8a8e1a3ece314014481ab832joshualitt virtual void clearStencilClip(const SkIRect& rect, bool insideClip, GrRenderTarget* = NULL) = 0; 4636db519c42471aaaa8a8e1a3ece314014481ab832joshualitt 4643bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt /** 4653bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt * Release any resources that are cached but not currently in use. This 4663bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt * is intended to give an application some recourse when resources are low. 4673bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt */ 46836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void purgeResources() override { 4693bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt // The clip mask manager can rebuild all its clip masks so just 4703bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt // get rid of them all. 4713bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt fClipMaskManager.purgeResources(); 4723bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt }; 4733bdd7dce5e8393aeed0a64b583e1077f5159d516joshualitt 474329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualittprotected: 475329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt GrClipMaskManager fClipMaskManager; 476329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt 4776db519c42471aaaa8a8e1a3ece314014481ab832joshualittprivate: 47836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein GrClipMaskManager* clipMaskManager() override { return &fClipMaskManager; } 479329bf4862e9d5e05363c2b071d8ca475a0ef1952joshualitt 4808dd688b7569df569a672a8a67b2db86a9d376cfcegdaniel virtual bool setupClip(GrPipelineBuilder*, 4816be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon GrPipelineBuilder::AutoRestoreFragmentProcessors*, 4826be6f7cb66b277e7b1ce13d09b635fb8e09a2f68bsalomon GrPipelineBuilder::AutoRestoreStencil*, 4838059eb9f6e24ed609393fbda4ad71edea03ac258joshualitt GrScissorState* scissorState, 48436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const SkRect* devBounds) override; 4852c93efeb6f2dd652eb2575c04124d82952f020c7joshualitt 4866db519c42471aaaa8a8e1a3ece314014481ab832joshualitt typedef GrDrawTarget INHERITED; 4876db519c42471aaaa8a8e1a3ece314014481ab832joshualitt}; 4886db519c42471aaaa8a8e1a3ece314014481ab832joshualitt 489ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif 490