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