GrDrawTarget.h revision 97c88c255cff3dbb8343c5d090526fdbedad6dd6
1ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com/* 2ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com Copyright 2010 Google Inc. 3ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 4ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com Licensed under the Apache License, Version 2.0 (the "License"); 5ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com you may not use this file except in compliance with the License. 6ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com You may obtain a copy of the License at 7ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 8ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com http://www.apache.org/licenses/LICENSE-2.0 9ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 10ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com Unless required by applicable law or agreed to in writing, software 11ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com distributed under the License is distributed on an "AS IS" BASIS, 12ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com See the License for the specific language governing permissions and 14ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com limitations under the License. 15ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 16ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 17ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 18ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#ifndef GrDrawTarget_DEFINED 19ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#define GrDrawTarget_DEFINED 20ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 21ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrMatrix.h" 22ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrColor.h" 23ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrRefCnt.h" 24ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrSamplerState.h" 25ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrClip.h" 26d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com#include "GrTexture.h" 27d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com#include "GrStencil.h" 28ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 2997c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo#include "SkXfermode.h" 3097c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo 31ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comclass GrTexture; 32ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comclass GrClipIterator; 33ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comclass GrVertexBuffer; 34ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comclass GrIndexBuffer; 35f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.comclass GrEffect; 36ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 37ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comclass GrDrawTarget : public GrRefCnt { 38ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.compublic: 39ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 405782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * Number of texture stages. Each stage takes as input a color and 415782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * 2D texture coordinates. The color input to the first enabled stage is the 425782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * per-vertex color or the constant color (setColor/setAlpha) if there are 435782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * no per-vertex colors. For subsequent stages the input color is the output 448531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * color from the previous enabled stage. The output color of each stage is 455782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * the input color modulated with the result of a texture lookup. Texture 46c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * lookups are specified by a texture a sampler (setSamplerState). Texture 47c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * coordinates for each stage come from the vertices based on a 48c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * GrVertexLayout bitfield. The output fragment color is the output color of 49c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * the last enabled stage. The presence or absence of texture coordinates 50c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * for each stage in the vertex layout indicates whether a stage is enabled 51c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * or not. 528531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com */ 538531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com enum { 547d34d2eecc40d150d867e37d5160a1bc3cfccbdebsalomon@google.com kNumStages = 2, 558531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com kMaxTexCoords = kNumStages 568531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com }; 575782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com 588531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com /** 59ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com * Bitfield used to indicate which stages are in use. 60ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 61ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com typedef int StageBitfield; 62ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com GR_STATIC_ASSERT(sizeof(StageBitfield)*8 >= kNumStages); 63ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 64ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 65ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Flags that affect rendering. Controlled using enable/disableState(). All 66ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * default to disabled. 67ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 68ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com enum StateBits { 69ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com kDither_StateBit = 0x1,//<! Perform color dithering 70ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com kAntialias_StateBit = 0x2,//<! Perform anti-aliasing. The render- 71ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // target must support some form of AA 72ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // (msaa, coverage sampling, etc). For 73ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // GrGpu-created rendertarget/textures 74ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // this is controlled by parameters 75ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // passed to createTexture. 76ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com kClip_StateBit = 0x4,//<! Controls whether drawing is clipped 77ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // against the region specified by 78ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // setClip. 79d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com kNoColorWrites_StateBit = 0x8,//<! If set it disables writing colors. 80d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com // Useful while performing stencil ops. 81d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com 82d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com // subclass may use additional bits internally 83d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com kDummyStateBit, 84d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com kLastPublicStateBit = kDummyStateBit-1 85ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com }; 86ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 87d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com enum DrawFace { 88d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com kBoth_DrawFace, 89d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com kCCW_DrawFace, 90d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com kCW_DrawFace, 91ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com }; 92ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 93d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com /** 94d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com * The DrawTarget may reserve some of the high bits of the stencil. The draw 95d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com * target will automatically trim reference and mask values so that the 96d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com * client doesn't overwrite these bits. 97d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com * The number of bits available is relative to the currently set render 98d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com *target. 99d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com * @return the number of bits usable by the draw target client. 100d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com */ 101d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com int getUsableStencilBits() const { 102d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com int bits = fCurrDrawState.fRenderTarget->stencilBits(); 103d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com if (bits) { 104d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com return bits - 1; 105d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com } else { 106d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com return 0; 107d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com } 108d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com } 109d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com 110d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com /** 111d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com * Sets the stencil settings to use for the next draw. 1125aaa69e4339e229adfb05e96084a8ec0a590238bbsalomon@google.com * Changing the clip has the side-effect of possibly zeroing 1135aaa69e4339e229adfb05e96084a8ec0a590238bbsalomon@google.com * out the client settable stencil bits. So multipass algorithms 1145aaa69e4339e229adfb05e96084a8ec0a590238bbsalomon@google.com * using stencil should not change the clip between passes. 115d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com * @param settings the stencil settings to use. 116d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com */ 117d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com void setStencil(const GrStencilSettings& settings) { 118d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com fCurrDrawState.fStencilSettings = settings; 119d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com } 120d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com 121d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com /** 122d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com * Shortcut to disable stencil testing and ops. 123d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com */ 124d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com void disableStencil() { 125d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com fCurrDrawState.fStencilSettings.setDisabled(); 126d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com } 127d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com 128ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comprotected: 129ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 1308195f674278e8d785bf57489847b1d05d3c2f7d5reed@google.com struct DrState { 131d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com DrState() { 132d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com // make sure any pad is zero for memcmp 133d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com // all DrState members should default to something 134d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com // valid by the memset 135d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com memset(this, 0, sizeof(DrState)); 13697c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo // This is an exception to our memset, since it will 13797c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo // result in no change. 13897c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo fColorFilterXfermode = SkXfermode::kDstIn_Mode; 139d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com GrAssert((intptr_t)(void*)NULL == 0LL); 140d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com GrAssert(fStencilSettings.isDisabled()); 141d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com } 142ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com uint32_t fFlagBits; 143ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com GrBlendCoeff fSrcBlend; 144ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com GrBlendCoeff fDstBlend; 145080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com GrColor fBlendConstant; 146c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com GrTexture* fTextures[kNumStages]; 147f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com GrEffect* fEffects[kNumStages]; 148c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com GrSamplerState fSamplerStates[kNumStages]; 149c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com GrRenderTarget* fRenderTarget; 150c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com GrColor fColor; 151d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com DrawFace fDrawFace; 15297c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo GrColor fColorFilterColor; 15397c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo SkXfermode::Mode fColorFilterXfermode; 154d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com 155d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com GrStencilSettings fStencilSettings; 1568531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com GrMatrix fViewMatrix; 1578195f674278e8d785bf57489847b1d05d3c2f7d5reed@google.com bool operator ==(const DrState& s) const { 1588195f674278e8d785bf57489847b1d05d3c2f7d5reed@google.com return 0 == memcmp(this, &s, sizeof(DrState)); 159ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 1608195f674278e8d785bf57489847b1d05d3c2f7d5reed@google.com bool operator !=(const DrState& s) const { return !(*this == s); } 161ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com }; 162ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 163ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.compublic: 164ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /////////////////////////////////////////////////////////////////////////// 165ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 166ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrDrawTarget(); 167ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 168ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 169ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Sets the current clip to the region specified by clip. All draws will be 170ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * clipped against this clip if kClip_StateBit is enabled. 171ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 1725aaa69e4339e229adfb05e96084a8ec0a590238bbsalomon@google.com * Setting the clip may (or may not) zero out the client's stencil bits. 1735aaa69e4339e229adfb05e96084a8ec0a590238bbsalomon@google.com * 174ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param description of the clipping region 175ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 176ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void setClip(const GrClip& clip); 177ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 178ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 179ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Gets the current clip. 180ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 181ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @return the clip. 182ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 183ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com const GrClip& getClip() const; 184ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 185ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 186ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Sets the texture used at the next drawing call 187ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 1888531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @param stage The texture stage for which the texture will be set 1898531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * 190ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param texture The texture to set. Can be NULL though there is no advantage 191ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * to settings a NULL texture if doing non-textured drawing 192ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 1938531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com void setTexture(int stage, GrTexture* texture); 194ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 195ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 196ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Retrieves the currently set texture. 197ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 198ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @return The currently set texture. The return value will be NULL if no 199ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * texture has been set, NULL was most recently passed to 200ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * setTexture, or the last setTexture was destroyed. 201ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 2025782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com const GrTexture* getTexture(int stage) const; 2035782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com GrTexture* getTexture(int stage); 204ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 205ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 206ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Sets the rendertarget used at the next drawing call 207ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 2085782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * @param target The render target to set. 209ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 210ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void setRenderTarget(GrRenderTarget* target); 211ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 212ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 213ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Retrieves the currently set rendertarget. 214ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 215ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @return The currently set render target. 216ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 2175782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com const GrRenderTarget* getRenderTarget() const; 2185782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com GrRenderTarget* getRenderTarget(); 219ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 220ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 221c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * Sets the sampler state for a stage used in subsequent draws. 222ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 223d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com * The sampler state determines how texture coordinates are 224c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * intepretted and used to sample the texture. 225ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 226c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * @param stage the stage of the sampler to set 227ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param samplerState Specifies the sampler state. 228ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 2298531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com void setSamplerState(int stage, const GrSamplerState& samplerState); 230ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 231ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 232c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * Concats the matrix of a stage's sampler. 233ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 234c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * @param stage the stage of the sampler to set 235c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * @param matrix the matrix to concat 236ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 23727847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com void preConcatSamplerMatrix(int stage, const GrMatrix& matrix) { 23827847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com GrAssert(stage >= 0 && stage < kNumStages); 23927847dedd9b5c1f48998c40842f3494c0746257fbsalomon@google.com fCurrDrawState.fSamplerStates[stage].preConcatMatrix(matrix); 240c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com } 241ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 242ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 243c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * Gets the matrix of a stage's sampler 2446f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com * 245c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * @param stage the stage to of sampler to get 246c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * @return the sampler state's matrix 2476f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com */ 248c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com const GrMatrix& getSamplerMatrix(int stage) const { 249c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com return fCurrDrawState.fSamplerStates[stage].getMatrix(); 250c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com } 2516f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com 2526f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com /** 253c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * Sets the matrix of a stage's sampler 254c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * 255c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * @param stage the stage of sampler set 256c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com * @param matrix the matrix to set 2576f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com */ 258cd9d69b9ce7eb301a9fd8d91b9f95fd99b07bae5djsollen@google.com void setSamplerMatrix(int stage, const GrMatrix& matrix) { 259c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com fCurrDrawState.fSamplerStates[stage].setMatrix(matrix); 260c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com } 2616f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com 2626f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com /** 263ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Sets the matrix applied to veretx positions. 264ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 265ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * In the post-view-matrix space the rectangle [0,w]x[0,h] 266ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * fully covers the render target. (w and h are the width and height of the 267ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * the rendertarget.) 268ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 269ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param m the matrix used to transform the vertex positions. 270ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 2718531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com void setViewMatrix(const GrMatrix& m); 272ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 273ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 274ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Multiplies the current view matrix by a matrix 275ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 276ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * After this call V' = V*m where V is the old view matrix, 277ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * m is the parameter to this function, and V' is the new view matrix. 278ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * (We consider positions to be column vectors so position vector p is 279ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * transformed by matrix X as p' = X*p.) 280ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 2816f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com * @param m the matrix used to modify the view matrix. 282ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 283c6cf72381b212eb21e61d5c5e14247b483a77753bsalomon@google.com void preConcatViewMatrix(const GrMatrix& m); 284ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 285ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 28606afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com * Multiplies the current view matrix by a matrix 28706afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com * 28806afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com * After this call V' = m*V where V is the old view matrix, 28906afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com * m is the parameter to this function, and V' is the new view matrix. 29006afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com * (We consider positions to be column vectors so position vector p is 29106afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com * transformed by matrix X as p' = X*p.) 29206afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com * 29306afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com * @param m the matrix used to modify the view matrix. 29406afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com */ 29506afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com void postConcatViewMatrix(const GrMatrix& m); 29606afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com 29706afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com /** 2986f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com * Retrieves the current view matrix 2996f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com * @return the current view matrix. 3006f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com */ 3016f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com const GrMatrix& getViewMatrix() const; 3026f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com 3036f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com /** 3046f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com * Retrieves the inverse of the current view matrix. 3056f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com * 3066f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com * If the current view matrix is invertible, return true, and if matrix 3076f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com * is non-null, copy the inverse into it. If the current view matrix is 3086f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com * non-invertible, return false and ignore the matrix parameter. 3096f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com * 3106f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com * @param matrix if not null, will receive a copy of the current inverse. 3116f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com */ 3126f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com bool getViewInverse(GrMatrix* matrix) const; 3136f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com 3146f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com /** 315ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Sets color for next draw to a premultiplied-alpha color. 316ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 317ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param the color to set. 318ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 319ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void setColor(GrColor); 320ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 321ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 32297c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo * Add a color filter that can be represented by a color and a mode. 32397c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo */ 32497c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo void setColorFilter(GrColor, SkXfermode::Mode); 32597c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo 32697c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo /** 327ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Sets the color to be used for the next draw to be 328ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * (r,g,b,a) = (alpha, alpha, alpha, alpha). 329ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 330ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param alpha The alpha value to set as the color. 331ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 332ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void setAlpha(uint8_t alpha); 333ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 334ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 335d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com * Controls whether clockwise, counterclockwise, or both faces are drawn. 336d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com * @param face the face(s) to draw. 337ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 338d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com void setDrawFace(DrawFace face) { fCurrDrawState.fDrawFace = face; } 339ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 340ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 341d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com * Gets whether the target is drawing clockwise, counterclockwise, 342d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com * or both faces. 343d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com * @return the current draw face(s). 344ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 345d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com DrawFace getDrawFace() const { return fCurrDrawState.fDrawFace; } 346ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 347ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 348ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Enable render state settings. 349ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 350ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param flags bitfield of StateBits specifing the states to enable 351ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 352ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void enableState(uint32_t stateBits); 353ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 354ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 355ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Disable render state settings. 356ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 357ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param flags bitfield of StateBits specifing the states to disable 358ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 359ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void disableState(uint32_t stateBits); 360ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 361ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com bool isDitherState() const { 36286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com return 0 != (fCurrDrawState.fFlagBits & kDither_StateBit); 36386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 36486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 36586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com bool isClipState() const { 36686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com return 0 != (fCurrDrawState.fFlagBits & kClip_StateBit); 367ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 368ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 369d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com bool isColorWriteDisabled() const { 370d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com return 0 != (fCurrDrawState.fFlagBits & kNoColorWrites_StateBit); 371d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com } 372d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com 373ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 374ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Sets the blending function coeffecients. 375ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 376ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * The blend function will be: 377ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * D' = sat(S*srcCoef + D*dstCoef) 378ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 379ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * where D is the existing destination color, S is the incoming source 380ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * color, and D' is the new destination color that will be written. sat() 381ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * is the saturation function. 382ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 383ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param srcCoef coeffecient applied to the src color. 384ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param dstCoef coeffecient applied to the dst color. 385ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 386ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com void setBlendFunc(GrBlendCoeff srcCoef, GrBlendCoeff dstCoef); 387ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 388ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 389080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com * Sets the blending function constant referenced by the following blending 390080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com * coeffecients: 391080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com * kConstC_BlendCoeff 392080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com * kIConstC_BlendCoeff 393080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com * kConstA_BlendCoeff 394080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com * kIConstA_BlendCoeff 395080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com * 396080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com * @param constant the constant to set 397080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com */ 398080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com void setBlendConstant(GrColor constant) { fCurrDrawState.fBlendConstant = constant; } 399080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com 400080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com /** 401080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com * Retrieves the last value set by setBlendConstant() 402080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com * @return the blending constant value 403080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com */ 404080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com GrColor getBlendConstant() const { return fCurrDrawState.fBlendConstant; } 405080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com 406080773ca79cbdc230730d295441255e9254d76a6bsalomon@google.com /** 407ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Used to save and restore the GrGpu's drawing state 408ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 409ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com struct SavedDrawState { 410ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com private: 4118195f674278e8d785bf57489847b1d05d3c2f7d5reed@google.com DrState fState; 412ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com friend class GrDrawTarget; 413ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com }; 414ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 415ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 416ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Saves the current draw state. The state can be restored at a later time 417ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * with restoreDrawState. 418ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 419ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * See also AutoStateRestore class. 420ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 421ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param state will hold the state after the function returns. 422ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 423ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void saveCurrentDrawState(SavedDrawState* state) const; 424ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 425ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 426ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Restores previously saved draw state. The client guarantees that state 427ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * was previously passed to saveCurrentDrawState and that the rendertarget 428ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * and texture set at save are still valid. 429ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 430ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * See also AutoStateRestore class. 431ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 432ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param state the previously saved state to restore. 433ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 434ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void restoreDrawState(const SavedDrawState& state); 435ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 436ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 437ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Copies the draw state from another target to this target. 438ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 439ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param srcTarget draw target used as src of the draw state. 440ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 441ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void copyDrawState(const GrDrawTarget& srcTarget); 442ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 443ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 4448531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * The format of vertices is represented as a bitfield of flags. 4458531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * Flags that indicate the layout of vertex data. Vertices always contain 4465782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * positions and may also contain up to kMaxTexCoords sets of 2D texture 4478531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * coordinates and per-vertex colors. Each stage can use any of the texture 4488531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * coordinates as its input texture coordinates or it may use the positions. 4498531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * 4508531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * If no texture coordinates are specified for a stage then the stage is 4518531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * disabled. 452ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 4538531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * Only one type of texture coord can be specified per stage. For 4545782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * example StageTexCoordVertexLayoutBit(0, 2) and 4558531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * StagePosAsTexCoordVertexLayoutBit(0) cannot both be specified. 456ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 4575782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * The order in memory is always (position, texture coord 0, ..., color) 4588531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * with any unused fields omitted. Note that this means that if only texture 4595782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * coordinates 1 is referenced then there is no texture coordinates 0 and 4608531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * the order would be (position, texture coordinate 1[, color]). 4618531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com */ 4625782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com 4638531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com /** 4648531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * Generates a bit indicating that a texture stage uses texture coordinates 4655782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * 4668531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @param stage the stage that will use texture coordinates. 4678531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @param texCoordIdx the index of the texture coordinates to use 468ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 4698531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @return the bit to add to a GrVertexLayout bitfield. 4708531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com */ 4718531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com static int StageTexCoordVertexLayoutBit(int stage, int texCoordIdx) { 4728531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com GrAssert(stage < kNumStages); 4738531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com GrAssert(texCoordIdx < kMaxTexCoords); 4748531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com return 1 << (stage + (texCoordIdx * kNumStages)); 4758531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com } 47686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 47786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com /** 47886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * Determines if blend is effectively disabled. 47986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * 48086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * @return true if blend can be disabled without changing the rendering 48186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * result given the current state including the vertex layout specified 48286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * with the vertex source. 48386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com */ 48486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com bool canDisableBlend() const; 48586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 4868531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.comprivate: 4878531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com static const int TEX_COORD_BIT_CNT = kNumStages*kMaxTexCoords; 4888531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.compublic: 4898531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com /** 4908531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * Generates a bit indicating that a texture stage uses the position 4918531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * as its texture coordinate. 4928531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * 4935782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * @param stage the stage that will use position as texture 4948531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * coordinates. 4958531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * 4968531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @return the bit to add to a GrVertexLayout bitfield. 4978531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com */ 4988531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com static int StagePosAsTexCoordVertexLayoutBit(int stage) { 4998531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com GrAssert(stage < kNumStages); 5005782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com return (1 << (TEX_COORD_BIT_CNT + stage)); 5018531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com } 5028531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.comprivate: 5038531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com static const int STAGE_BIT_CNT = TEX_COORD_BIT_CNT + kNumStages; 5045782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com 5058531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.compublic: 5065782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com 5078531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com /** 5088531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * Additional Bits that can be specified in GrVertexLayout. 509ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 510ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com enum VertexLayoutBits { 5115782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com 5128531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com kColor_VertexLayoutBit = 1 << (STAGE_BIT_CNT + 0), 5138531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com //<! vertices have colors 5148531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com kTextFormat_VertexLayoutBit = 1 << (STAGE_BIT_CNT + 1), 5158531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com //<! use text vertices. (Pos 5168531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com // and tex coords may be 5175782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com // a different type for 5188531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com // text [GrGpuTextVertex vs 5198531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com // GrPoint].) 520ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // for below assert 521d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com kDummyVertexLayoutBit, 522d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com kHighVertexLayoutBit = kDummyVertexLayoutBit - 1 523ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com }; 5248531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com // make sure we haven't exceeded the number of bits in GrVertexLayout. 5254be283f3a82895530d1b70372cd48ddb1c663fd8bsalomon@google.com GR_STATIC_ASSERT(kHighVertexLayoutBit < ((uint64_t)1 << 8*sizeof(GrVertexLayout))); 526ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 527ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 5281c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * There are three paths for specifying geometry (vertices and optionally 5291c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * indices) to the draw target. When indexed drawing the indices and vertices 5301c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * can be each use a different path. 5311c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * 5321c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * 1. Provide a cpu array (set*SourceToArray). This is useful when the 5331c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * caller's client has already provided vertex data in a format 5341c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * the time compatible with a GrVertexLayout. The array must contain the 5351c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * data at set*SourceToArray is called. The source stays in effect for 5361c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * drawIndexed & drawNonIndexed calls until set*SourceToArray is called 5371c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * again or one of the other two paths is chosen. 5381c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * 5391c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * 2. Reserve and Lock. This is most useful when the caller has data it must 5401c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * transform before drawing and will not likely render it again. The 5411c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * caller requests that the draw target make room for some amount of 5421c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * vertex and/or index data. The target provides ptrs to hold the data 5431c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * data. The caller can write the data into the pts up until the first 5441c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * drawIndexed or drawNonIndexed call. At this point the data is frozen 5451c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * and the ptrs are no longer guaranteed to be valid. All subsequent 5461c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * drawIndexed & drawNonIndexed calls will use this data until 5471c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * releaseReserved geometry is called. This must be called before another 5481c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * source is set. 5491c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * 5501c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * 3. Vertex and Index Buffers. This is most useful for geometry that will 5511c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * be rendered multiple times. SetVertexSourceToBuffer & 5521c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * SetIndexSourceToBuffer are used to set the buffer and subsequent 5531c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * drawIndexed and drawNonIndexed calls use this source until another 5541c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * source is set. 5551c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com */ 5561c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com 5571c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com /** 558ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Reserves space for vertices and/or indices. Draw target will use 559ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * reserved vertices / indices at next draw. 560ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 561ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * If succeeds: 562ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * if vertexCount is nonzero, *vertices will be the array 563ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * of vertices to be filled by caller. The next draw will read 564ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * these vertices. 565ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 5668295dc1474db279df08d816b2115e807c681fad5bsalomon@google.com * if indexCount is nonzero, *indices will be the array of indices 567ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * to be filled by caller. The next indexed draw will read from 568ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * these indices. 569ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 5701c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * If a client does not already have a vertex buffer then this is the 5711c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * preferred way to allocate vertex/index array. It allows the subclass of 5721c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * GrDrawTarget to decide whether to put data in buffers, to group vertex 5731c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * data that uses the same state (e.g. for deferred rendering), etc. 574ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 5751c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * Following the first draw after reserveAndLockGeometry the ptrs returned 5761c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * by releaseReservedGeometry are no longer valid and the geometry data 5771c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * cannot be further modified. The contents that were put in the reserved 5781c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * space can be drawn by multiple draws, however. 5791c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * 5801c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * reserveAndLockGeometry must be matched with a releaseReservedGeometry 5811c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * call after all draws that reference the reserved geometry data have 5821c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * been called. 583ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 584ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * AutoGeometryRelease can be used to automatically call the release. 585ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 586ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param vertexCount the number of vertices to reserve space for. Can be 0. 587ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param indexCount the number of indices to reserve space for. Can be 0. 588ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param vertexLayout the format of vertices (ignored if vertexCount == 0). 589ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param vertices will point to reserved vertex space if vertexCount is 590ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * non-zero. Illegal to pass NULL if vertexCount > 0. 591ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param indices will point to reserved index space if indexCount is 592ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * non-zero. Illegal to pass NULL if indexCount > 0. 593ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 594ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @return true if succeeded in allocating space for the vertices and false 595ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * if not. 596ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 597ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com bool reserveAndLockGeometry(GrVertexLayout vertexLayout, 598ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com uint32_t vertexCount, 599ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com uint32_t indexCount, 600ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void** vertices, 601ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void** indices); 602ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 603ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Provides hints to caller about the number of vertices and indices 604ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * that can be allocated cheaply. This can be useful if caller is reserving 605ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * space but doesn't know exactly how much geometry is needed. 606ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 607ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Also may hint whether the draw target should be flushed first. This is 608ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * useful for deferred targets. 609ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 610ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param vertexLayout layout of vertices caller would like to reserve 611ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param vertexCount in: hint about how many vertices the caller would 612ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * like to allocate. 613ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * out: a hint about the number of vertices that can be 614ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * allocated cheaply. Negative means no hint. 615ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Ignored if NULL. 616ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param indexCount in: hint about how many indices the caller would 617ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * like to allocate. 618ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * out: a hint about the number of indices that can be 619ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * allocated cheaply. Negative means no hint. 620ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Ignored if NULL. 621ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 622ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @return true if target should be flushed based on the input values. 623ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 624ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com virtual bool geometryHints(GrVertexLayout vertexLayout, 6251c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com int* vertexCount, 6261c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com int* indexCount) const; 627ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 628ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 629ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Releases reserved vertex/index data from reserveAndLockGeometry(). 630ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 631ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void releaseReservedGeometry(); 632ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 633ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 6341c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * Sets source of vertex data for the next draw. Array must contain 6351c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * the vertex data when this is called. 636ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 637ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param array cpu array containing vertex data. 6381c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * @param size size of the vertex data. 6391c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * @param vertexCount the number of vertices in the array. 640ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 6411c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com void setVertexSourceToArray(GrVertexLayout vertexLayout, 6421c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com const void* vertexArray, 6431c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com int vertexCount); 644ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 645ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 6461c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * Sets source of index data for the next indexed draw. Array must contain 6471c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * the indices when this is called. 648ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 6491c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * @param array cpu array containing index data. 6501c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com * @param indexCount the number of indices in the array. 651ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 6521c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com void setIndexSourceToArray(const void* indexArray, int indexCount); 653ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 654ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 655ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Sets source of vertex data for the next draw. Data does not have to be 656ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * in the buffer until drawIndexed or drawNonIndexed. 657ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 658ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param buffer vertex buffer containing vertex data. Must be 659ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * unlocked before draw call. 660ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param vertexLayout layout of the vertex data in the buffer. 661ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 6621c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com void setVertexSourceToBuffer(GrVertexLayout vertexLayout, 6631c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com const GrVertexBuffer* buffer); 664ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 665ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 666ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Sets source of index data for the next indexed draw. Data does not have 667ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * to be in the buffer until drawIndexed or drawNonIndexed. 668ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 669ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param buffer index buffer containing indices. Must be unlocked 670ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * before indexed draw call. 671ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 672ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void setIndexSourceToBuffer(const GrIndexBuffer* buffer); 673ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 674ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 675ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Draws indexed geometry using the current state and current vertex / index 676ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * sources. 677ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 678ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param type The type of primitives to draw. 679ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param startVertex the vertex in the vertex array/buffer corresponding 680ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * to index 0 681ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param startIndex first index to read from index src. 682ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param vertexCount one greater than the max index. 683ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param indexCount the number of index elements to read. The index count 684ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * is effectively trimmed to the last completely 685ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * specified primitive. 686ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 687ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com virtual void drawIndexed(GrPrimitiveType type, 6881c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com int startVertex, 6891c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com int startIndex, 6901c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com int vertexCount, 6911c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com int indexCount) = 0; 692ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 693ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 694ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Draws non-indexed geometry using the current state and current vertex 695ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * sources. 696ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 697ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param type The type of primitives to draw. 698ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param startVertex the vertex in the vertex array/buffer corresponding 699ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * to index 0 700ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @param vertexCount one greater than the max index. 701ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 702ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com virtual void drawNonIndexed(GrPrimitiveType type, 7031c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com int startVertex, 7041c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com int vertexCount) = 0; 705ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 70686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com /** 70786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * Helper function for drawing rects. This does not use the current index 70886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * and vertex sources. After returning, the vertex and index sources may 70986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * have changed. They should be reestablished before the next drawIndexed 71086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * or drawNonIndexed. This cannot be called between reserving and releasing 71186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * geometry. The GrDrawTarget subclass may be able to perform additional 712d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com * optimizations if drawRect is used rather than drawIndexed or 71386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * drawNonIndexed. 71486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * @param rect the rect to draw 71586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * @param matrix optional matrix applied to rect (before viewMatrix) 716ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com * @param stageEnableBitfield bitmask indicating which stages are enabled. 717ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com * Bit i indicates whether stage i is enabled. 71886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * @param srcRects specifies rects for stages enabled by stageEnableMask. 71986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * if stageEnableMask bit i is 1, srcRects is not NULL, 72086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * and srcRects[i] is not NULL, then srcRects[i] will be 72186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * used as coordinates for stage i. Otherwise, if stage i 72286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * is enabled then rect is used as the coordinates. 72386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * @param srcMatrices optional matrices applied to srcRects. If 72486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * srcRect[i] is non-NULL and srcMatrices[i] is 72586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * non-NULL then srcRect[i] will be transformed by 72686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * srcMatrix[i]. srcMatrices can be NULL when no 72786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * srcMatrices are desired. 72886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com */ 729d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com virtual void drawRect(const GrRect& rect, 73086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com const GrMatrix* matrix, 731ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com StageBitfield stageEnableBitfield, 73286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com const GrRect* srcRects[], 73386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com const GrMatrix* srcMatrices[]); 73486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 73586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com /** 736d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com * Helper for drawRect when the caller doesn't need separate src rects or 73786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * matrices. 73886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com */ 739d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com void drawSimpleRect(const GrRect& rect, 740d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com const GrMatrix* matrix, 741ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com StageBitfield stageEnableBitfield) { 742ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com drawRect(rect, matrix, stageEnableBitfield, NULL, NULL); 74386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 74486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 7450b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com /** 7466aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com * Clear the render target. Ignores the clip and all other draw state 7476aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com * (blend mode, stages, etc). Clears the whole thing if rect is NULL, 7486aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com * otherwise just the rect. 7490b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com */ 7506aa25c3f555dc2a6711365d14279db3ec909e064bsalomon@google.com virtual void clear(const GrIRect* rect, GrColor color) = 0; 7510b335c1ac100aeacf79a4c98a052286fd46661e7bsalomon@google.com 752ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /////////////////////////////////////////////////////////////////////////// 753ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 754ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com class AutoStateRestore : ::GrNoncopyable { 755ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com public: 75606afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com AutoStateRestore(); 757ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com AutoStateRestore(GrDrawTarget* target); 758ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com ~AutoStateRestore(); 759ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 76006afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com /** 76106afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com * if this object is already saving state for param target then 76206afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com * this does nothing. Otherise, it restores previously saved state on 76306afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com * previous target (if any) and saves current state on param target. 76406afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com */ 76506afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com void set(GrDrawTarget* target); 76606afe7b5a1ef03bfc6494c51ab2a1f7a386de5c2bsalomon@google.com 767ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com private: 768ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrDrawTarget* fDrawTarget; 769ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com SavedDrawState fDrawState; 770ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com }; 771ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 772ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /////////////////////////////////////////////////////////////////////////// 7731c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com 7746f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com class AutoViewMatrixRestore : ::GrNoncopyable { 7756f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com public: 7766f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com AutoViewMatrixRestore() { 7776f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com fDrawTarget = NULL; 7786f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com } 7796f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com 7801c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com AutoViewMatrixRestore(GrDrawTarget* target) 7816f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com : fDrawTarget(target), fMatrix(fDrawTarget->getViewMatrix()) { 7826f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com GrAssert(NULL != target); 7836f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com } 7846f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com 7856f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com void set(GrDrawTarget* target) { 7866f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com GrAssert(NULL != target); 7876f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com if (NULL != fDrawTarget) { 7886f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com fDrawTarget->setViewMatrix(fMatrix); 7896f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com } 7906f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com fDrawTarget = target; 7916f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com fMatrix = target->getViewMatrix(); 7926f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com } 7936f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com 7946f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com ~AutoViewMatrixRestore() { 7956f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com if (NULL != fDrawTarget) { 7966f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com fDrawTarget->setViewMatrix(fMatrix); 7976f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com } 7986f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com } 7996f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com 8006f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com private: 8016f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com GrDrawTarget* fDrawTarget; 8026f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com GrMatrix fMatrix; 8036f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com }; 8046f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com 8056f7fbc9fbb584b9b9fa6ed3a677d71ecd49aafcebsalomon@google.com /////////////////////////////////////////////////////////////////////////// 806ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 807ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com class AutoReleaseGeometry : ::GrNoncopyable { 808ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com public: 809ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com AutoReleaseGeometry(GrDrawTarget* target, 810ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrVertexLayout vertexLayout, 811ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com uint32_t vertexCount, 812ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com uint32_t indexCount) { 813a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com fTarget = NULL; 814a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com this->set(target, vertexLayout, vertexCount, indexCount); 815ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 8165782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com 8175782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com AutoReleaseGeometry() { 818a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com fTarget = NULL; 8195782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com } 8205782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com 821ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com ~AutoReleaseGeometry() { 822a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com if (NULL != fTarget) { 823ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fTarget->releaseReservedGeometry(); 824ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 825ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 826ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 8275782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com bool set(GrDrawTarget* target, 8285782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com GrVertexLayout vertexLayout, 8295782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com uint32_t vertexCount, 8305782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com uint32_t indexCount) { 831a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com if (NULL != fTarget) { 8325782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com fTarget->releaseReservedGeometry(); 8335782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com } 8345782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com fTarget = target; 835a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com if (NULL != fTarget) { 836a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com if (!fTarget->reserveAndLockGeometry(vertexLayout, 837a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com vertexCount, 838a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com indexCount, 839a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com &fVertices, 840a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com &fIndices)) { 841a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com fTarget = NULL; 842a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com } 843a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com } 844a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com return NULL != fTarget; 8455782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com } 8465782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com 847a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com bool succeeded() const { return NULL != fTarget; } 848ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void* vertices() const { return fVertices; } 849ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void* indices() const { return fIndices; } 850ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 851ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrPoint* positions() const { 852ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com return static_cast<GrPoint*>(fVertices); 853ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 854ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 855ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com private: 856ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrDrawTarget* fTarget; 857ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void* fVertices; 858ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com void* fIndices; 859ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com }; 860ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 861ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /////////////////////////////////////////////////////////////////////////// 862ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 863ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com class AutoClipRestore : ::GrNoncopyable { 864ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com public: 865ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com AutoClipRestore(GrDrawTarget* target) { 866ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fTarget = target; 867ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fClip = fTarget->getClip(); 868ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 869ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 870ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com ~AutoClipRestore() { 871ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fTarget->setClip(fClip); 872ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 873ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com private: 874ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrDrawTarget* fTarget; 875ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrClip fClip; 876ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com }; 877ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 878ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com //////////////////////////////////////////////////////////////////////////// 8798531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com // Helpers for picking apart vertex layouts 8805782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com 881ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 882ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Helper function to compute the size of a vertex from a vertex layout 883ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @return size of a single vertex. 884ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 885ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com static size_t VertexSize(GrVertexLayout vertexLayout); 8865782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com 8878531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com /** 8888531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * Helper function for determining the index of texture coordinates that 8898531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * is input for a texture stage. Note that a stage may instead use positions 8908531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * as texture coordinates, in which case the result of the function is 8918531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * indistinguishable from the case when the stage is disabled. 8928531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * 8938531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @param stage the stage to query 8948531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @param vertexLayout layout to query 8958531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * 8968531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @return the texture coordinate index or -1 if the stage doesn't use 8978531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * separate (non-position) texture coordinates. 8988531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com */ 8998531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com static int VertexTexCoordsForStage(int stage, GrVertexLayout vertexLayout); 900ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 901ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 902ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Helper function to compute the offset of texture coordinates in a vertex 903ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @return offset of texture coordinates in vertex layout or -1 if the 9045782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * layout has no texture coordinates. Will be 0 if positions are 9058531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * used as texture coordinates for the stage. 906ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 9078531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com static int VertexStageCoordOffset(int stage, GrVertexLayout vertexLayout); 908ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 909ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 910ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Helper function to compute the offset of the color in a vertex 911ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * @return offset of color in vertex layout or -1 if the 912ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * layout has no color. 913ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 914ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com static int VertexColorOffset(GrVertexLayout vertexLayout); 915ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 916ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 9175782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * Helper function to determine if vertex layout contains explicit texture 9188531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * coordinates of some index. 9198531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * 9208531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @param coordIndex the tex coord index to query 9218531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @param vertexLayout layout to query 9228531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * 9235782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * @return true if vertex specifies texture coordinates for the index, 9248531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * false otherwise. 925ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 9265782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com static bool VertexUsesTexCoordIdx(int coordIndex, 9278531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com GrVertexLayout vertexLayout); 9285782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com 929ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com /** 930ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * Helper function to determine if vertex layout contains either explicit or 9318531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * implicit texture coordinates for a stage. 932ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com * 9338531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @param stage the stage to query 9348531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @param vertexLayout layout to query 9358531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * 9365782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * @return true if vertex specifies texture coordinates for the stage, 9378531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * false otherwise. 938ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 9398531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com static bool VertexUsesStage(int stage, GrVertexLayout vertexLayout); 940ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 9418531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com /** 9425782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * Helper function to compute the size of each vertex and the offsets of 9435782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * texture coordinates and color. Determines tex coord offsets by tex coord 9445782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * index rather than by stage. (Each stage can be mapped to any t.c. index 9458531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * by StageTexCoordVertexLayoutBit.) 9468531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * 9478531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @param vertexLayout the layout to query 9488531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @param texCoordOffsetsByIdx after return it is the offset of each 9498531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * tex coord index in the vertex or -1 if 9508531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * index isn't used. 9518531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @return size of a single vertex 9528531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com */ 9538531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com static int VertexSizeAndOffsetsByIdx(GrVertexLayout vertexLayout, 9548531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com int texCoordOffsetsByIdx[kMaxTexCoords], 9558531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com int *colorOffset); 9565782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com 9578531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com /** 9585782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * Helper function to compute the size of each vertex and the offsets of 9595782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * texture coordinates and color. Determines tex coord offsets by stage 9605782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * rather than by index. (Each stage can be mapped to any t.c. index 9615782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com * by StageTexCoordVertexLayoutBit.) If a stage uses positions for 9628531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * tex coords then that stage's offset will be 0 (positions are always at 0). 9638531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * 9648531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @param vertexLayout the layout to query 9658531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @param texCoordOffsetsByStage after return it is the offset of each 9668531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * tex coord index in the vertex or -1 if 9678531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * index isn't used. 9688531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com * @return size of a single vertex 9698531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com */ 9708531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com static int VertexSizeAndOffsetsByStage(GrVertexLayout vertexLayout, 9718531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com int texCoordOffsetsByStage[kNumStages], 9728531c1cea2a9cf7702ef314ccd0a6cd1dd33c76cbsalomon@google.com int *colorOffset); 97386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 97486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com /** 97586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * Accessing positions, texture coords, or colors, of a vertex within an 97686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * array is a hassle involving casts and simple math. These helpers exist 97786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * to keep GrDrawTarget clients' code a bit nicer looking. 97886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com */ 97986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 98086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com /** 98186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * Gets a pointer to a GrPoint of a vertex's position or texture 98286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * coordinate. 98386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * @param vertices the vetex array 98486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * @param vertexIndex the index of the vertex in the array 98586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * @param vertexSize the size of each vertex in the array 98686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * @param offset the offset in bytes of the vertex component. 98786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * Defaults to zero (corresponding to vertex position) 98886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * @return pointer to the vertex component as a GrPoint 98986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com */ 990d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com static GrPoint* GetVertexPoint(void* vertices, 99186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com int vertexIndex, 99286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com int vertexSize, 99386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com int offset = 0) { 99486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com intptr_t start = GrTCast<intptr_t>(vertices); 995d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com return GrTCast<GrPoint*>(start + offset + 99686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com vertexIndex * vertexSize); 99786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 99886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com static const GrPoint* GetVertexPoint(const void* vertices, 99986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com int vertexIndex, 1000d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com int vertexSize, 100186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com int offset = 0) { 100286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com intptr_t start = GrTCast<intptr_t>(vertices); 1003d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com return GrTCast<const GrPoint*>(start + offset + 100486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com vertexIndex * vertexSize); 100586afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 100686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 100786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com /** 100886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * Gets a pointer to a GrColor inside a vertex within a vertex array. 100986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * @param vertices the vetex array 101086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * @param vertexIndex the index of the vertex in the array 101186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * @param vertexSize the size of each vertex in the array 101286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * @param offset the offset in bytes of the vertex color 101386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com * @return pointer to the vertex component as a GrColor 101486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com */ 1015d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com static GrColor* GetVertexColor(void* vertices, 101686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com int vertexIndex, 101786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com int vertexSize, 101886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com int offset) { 101986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com intptr_t start = GrTCast<intptr_t>(vertices); 1020d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com return GrTCast<GrColor*>(start + offset + 102186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com vertexIndex * vertexSize); 102286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 102386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com static const GrColor* GetVertexColor(const void* vertices, 102486afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com int vertexIndex, 1025d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com int vertexSize, 102686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com int offset) { 102786afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com const intptr_t start = GrTCast<intptr_t>(vertices); 1028d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com return GrTCast<const GrColor*>(start + offset + 102986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com vertexIndex * vertexSize); 103086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com } 103186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 10325aaa69e4339e229adfb05e96084a8ec0a590238bbsalomon@google.com static void VertexLayoutUnitTest(); 10335aaa69e4339e229adfb05e96084a8ec0a590238bbsalomon@google.com 1034ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comprotected: 1035a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com // given a vertex layout and a draw state, will a stage be used? 1036a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com static bool StageWillBeUsed(int stage, GrVertexLayout layout, 1037a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com const DrState& state) { 1038a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com return NULL != state.fTextures[stage] && VertexUsesStage(stage, layout); 1039a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com } 1040a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com 1041a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com bool isStageEnabled(int stage) const { 1042a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com return StageWillBeUsed(stage, fGeometrySrc.fVertexLayout, fCurrDrawState); 1043a47a48dca5045d71cbc5de343404045209a13e15bsalomon@google.com } 10445782d712ffc31557d0cb12d5a220cebb783f6895bsalomon@google.com 1045ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // Helpers for GrDrawTarget subclasses that won't have private access to 1046ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // SavedDrawState but need to peek at the state values. 10478195f674278e8d785bf57489847b1d05d3c2f7d5reed@google.com static DrState& accessSavedDrawState(SavedDrawState& sds) 1048ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com { return sds.fState; } 10498195f674278e8d785bf57489847b1d05d3c2f7d5reed@google.com static const DrState& accessSavedDrawState(const SavedDrawState& sds) 1050ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com { return sds.fState; } 1051ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 1052ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com // implemented by subclass 1053bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com virtual bool onAcquireGeometry(GrVertexLayout vertexLayout, 1054bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com void** vertices, 1055bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com void** indices) = 0; 1056ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 1057bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com virtual void onReleaseGeometry() = 0; 1058ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 105986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com // subclass overrides to be notified when clip is set. 106086afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com virtual void clipWillBeSet(const GrClip& clip) = 0; 1061ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 1062bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com virtual void onSetVertexSourceToArray(const void* vertexArray, 1063bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com int vertexCount) = 0; 10641c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com 1065bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com virtual void onSetIndexSourceToArray(const void* indexArray, 1066bcdbbe61e1a3f89545b2c1461164f0f8bf5f0797bsalomon@google.com int indexCount) = 0; 10671c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com 106886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com // Helpers for drawRect, protected so subclasses that override drawRect 106986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com // can use them. 1070ffca400ef6f96a280c3e2c09210f950af64a1f24bsalomon@google.com static GrVertexLayout GetRectVertexLayout(StageBitfield stageEnableBitfield, 107186afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com const GrRect* srcRects[]); 107286afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 107386afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com static void SetRectVertices(const GrRect& rect, 1074d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com const GrMatrix* matrix, 1075d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com const GrRect* srcRects[], 107686afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com const GrMatrix* srcMatrices[], 1077d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com GrVertexLayout layout, 107886afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com void* vertices); 107986afc2ae27fec84c01eb0e81a32766bdaf67dca8bsalomon@google.com 1080ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com enum GeometrySrcType { 10811c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com kReserved_GeometrySrcType, // src was set using reserveAndLockGeometry 10821c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com kArray_GeometrySrcType, // src was set using set*SourceToArray 10831c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com kBuffer_GeometrySrcType // src was set using set*SourceToBuffer 1084ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com }; 1085ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 1086d302f1401b3c9aea094804bad4e76de98782cfe8bsalomon@google.com struct ReservedGeometry { 1087ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com bool fLocked; 1088ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com uint32_t fVertexCount; 1089ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com uint32_t fIndexCount; 1090ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } fReservedGeometry; 1091ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 1092ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com struct GeometrySrc { 10931c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com GeometrySrcType fVertexSrc; 10941c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com const GrVertexBuffer* fVertexBuffer; // valid if src type is buffer 10951c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com GeometrySrcType fIndexSrc; 10961c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com const GrIndexBuffer* fIndexBuffer; // valid if src type is buffer 10971c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com GrVertexLayout fVertexLayout; 1098ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } fGeometrySrc; 1099ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 1100ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrClip fClip; 1101ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 11028195f674278e8d785bf57489847b1d05d3c2f7d5reed@google.com DrState fCurrDrawState; 1103ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 11041c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com // Not meant for external use. Only setVertexSourceToBuffer and 11051c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com // setIndexSourceToBuffer will work since GrDrawTarget subclasses don't 11061c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com // support nested reserveAndLockGeometry (and cpu arrays internally use the 11071c13c9668a889e56a0c85b51b9f28139c25b76ffbsalomon@google.com // same path). 1108ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com class AutoGeometrySrcRestore { 1109ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com public: 1110ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com AutoGeometrySrcRestore(GrDrawTarget* target) { 1111ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fTarget = target; 1112ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fGeometrySrc = fTarget->fGeometrySrc; 1113ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 1114ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com ~AutoGeometrySrcRestore() { 1115ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fTarget->fGeometrySrc = fGeometrySrc; 1116ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 1117ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com private: 1118ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrDrawTarget *fTarget; 1119ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GeometrySrc fGeometrySrc; 1120ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 1121ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com AutoGeometrySrcRestore(); 1122ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com AutoGeometrySrcRestore(const AutoGeometrySrcRestore&); 1123ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com AutoGeometrySrcRestore& operator =(AutoGeometrySrcRestore&); 1124ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com }; 1125ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}; 1126ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 1127ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif 1128