GrDrawState.h revision b8b705b1b983a2ee3a254bed4dd03f926101e4e7
19381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com/* 29381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com * Copyright 2011 Google Inc. 39381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com * 49381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com * Use of this source code is governed by a BSD-style license that can be 59381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com * found in the LICENSE file. 69381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com */ 79381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com 89381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com#ifndef GrDrawState_DEFINED 99381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com#define GrDrawState_DEFINED 109381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com 112eaaefd7e6a58339b3f93333f1e9cc92252cc303bsalomon@google.com#include "GrBackendEffectFactory.h" 129381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com#include "GrColor.h" 1308283afc265f1153834256fc1012519813ba6b73bsalomon@google.com#include "GrEffectStage.h" 14cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com#include "GrRefCnt.h" 15cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com#include "GrRenderTarget.h" 169381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com#include "GrStencil.h" 17cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com#include "GrTemplates.h" 1864aef2bacd1f5c25ffd9347aabd6265c9b60c0f4bsalomon@google.com#include "GrTexture.h" 1968b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com#include "effects/GrSimpleTextureEffect.h" 209381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com 21cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com#include "SkMatrix.h" 229381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com#include "SkXfermode.h" 239381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com 24af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.comclass GrPaint; 259381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com 26b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com/** 27b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * Types used to describe format of vertices in arrays 28b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com */ 29b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.comenum GrVertexAttribType { 30b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kFloat_GrVertexAttribType = 0, 31b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kVec2f_GrVertexAttribType, 32b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kVec3f_GrVertexAttribType, 33b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kVec4f_GrVertexAttribType, 34b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kVec4ub_GrVertexAttribType, // vector of 4 unsigned bytes, e.g. colors 35b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 36b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kLast_GrVertexAttribType = kVec4ub_GrVertexAttribType 37b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com}; 38b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.comstatic const int kGrVertexAttribTypeCount = kLast_GrVertexAttribType + 1; 39b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 40b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.comstruct GrVertexAttrib { 41b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com GrVertexAttrib() {} 42b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com GrVertexAttrib(GrVertexAttribType type, size_t offset) : 43b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com fType(type), fOffset(offset) {} 44b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com bool operator==(const GrVertexAttrib& other) const { 45b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com return fType == other.fType && fOffset == other.fOffset; 46b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com }; 47b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com bool operator!=(const GrVertexAttrib& other) const { return !(*this == other); } 48b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 49b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com GrVertexAttribType fType; 50b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com size_t fOffset; 51b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com}; 52b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 53b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.comtemplate <int N> 54b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.comclass GrVertexAttribArray : public SkSTArray<N, GrVertexAttrib, true> {}; 55b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 56b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com/** 57b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * Type used to describe how attributes bind to program usage 58b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com */ 59b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.comtypedef int GrAttribBindings; 60b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 612e3d144dfdbc4596d33baef7396316f88f412cc8bsalomon@google.comclass GrDrawState : public GrRefCnt { 622e3d144dfdbc4596d33baef7396316f88f412cc8bsalomon@google.compublic: 63fa35e3ddcc9d130ce87c927218bdf27879c38711reed@google.com SK_DECLARE_INST_COUNT(GrDrawState) 64d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 659381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com /** 661322134a3a7232e4ae3433733ed425fd9966bd5cbsalomon@google.com * Total number of effect stages. Each stage can host a GrEffect. A stage is enabled if it has a 671322134a3a7232e4ae3433733ed425fd9966bd5cbsalomon@google.com * GrEffect. The effect produces an output color in the fragment shader. It's inputs are the 681322134a3a7232e4ae3433733ed425fd9966bd5cbsalomon@google.com * output from the previous enabled stage and a position. The position is either derived from 691322134a3a7232e4ae3433733ed425fd9966bd5cbsalomon@google.com * the interpolated vertex positions or explicit per-vertex coords, depending upon the 70b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * GrAttribBindings used to draw. 71bf5cad4e9c5808493b35cb9b0000a2d36b7f9b78robertphillips@google.com * 721322134a3a7232e4ae3433733ed425fd9966bd5cbsalomon@google.com * The stages are divided into two sets, color-computing and coverage-computing. The final color 731322134a3a7232e4ae3433733ed425fd9966bd5cbsalomon@google.com * stage produces the final pixel color. The coverage-computing stages function exactly as the 741322134a3a7232e4ae3433733ed425fd9966bd5cbsalomon@google.com * color-computing but the output of the final coverage stage is treated as a fractional pixel 751322134a3a7232e4ae3433733ed425fd9966bd5cbsalomon@google.com * coverage rather than as input to the src/dst color blend step. 761322134a3a7232e4ae3433733ed425fd9966bd5cbsalomon@google.com * 771322134a3a7232e4ae3433733ed425fd9966bd5cbsalomon@google.com * The input color to the first enabled color-stage is either the constant color or interpolated 78b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * per-vertex colors, depending upon GrAttribBindings. The input to the first coverage stage is 791322134a3a7232e4ae3433733ed425fd9966bd5cbsalomon@google.com * either a constant coverage (usually full-coverage), interpolated per-vertex coverage, or 801322134a3a7232e4ae3433733ed425fd9966bd5cbsalomon@google.com * edge-AA computed coverage. (This latter is going away as soon as it can be rewritten as a 811322134a3a7232e4ae3433733ed425fd9966bd5cbsalomon@google.com * GrEffect). 821322134a3a7232e4ae3433733ed425fd9966bd5cbsalomon@google.com * 83cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com * See the documentation of kCoverageDrawing_StateBit for information about disabling the 84cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com * the color / coverage distinction. 85cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com * 861322134a3a7232e4ae3433733ed425fd9966bd5cbsalomon@google.com * Stages 0 through GrPaint::kTotalStages-1 are reserved for stages copied from the client's 871322134a3a7232e4ae3433733ed425fd9966bd5cbsalomon@google.com * GrPaint. Stages GrPaint::kTotalStages through kNumStages-2 are earmarked for use by 881322134a3a7232e4ae3433733ed425fd9966bd5cbsalomon@google.com * GrTextContext and GrPathRenderer-derived classes. kNumStages-1 is earmarked for clipping 89dfdb7e5240276493077b7c6e1f3cc8b8a0e195babsalomon@google.com * by GrClipMaskManager. 909381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com */ 919381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com enum { 92580711694654b8edc70028d09c4211445b661466twiz@google.com kNumStages = 5, 939381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com }; 949381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com 95ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrDrawState() { 9675847199c25121c9989e8dba103ac6002d2132d6reed@google.com#if GR_DEBUG 97b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com VertexAttributesUnitTest(); 9875847199c25121c9989e8dba103ac6002d2132d6reed@google.com#endif 9952a5dcb43b5acbde377f664807b0f75af8bb1666bsalomon@google.com this->reset(); 10052a5dcb43b5acbde377f664807b0f75af8bb1666bsalomon@google.com } 10146f7afb9867200b568c21736da8a8bbb56b20e30bsalomon@google.com 102ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrDrawState(const GrDrawState& state) { 10346f7afb9867200b568c21736da8a8bbb56b20e30bsalomon@google.com *this = state; 10446f7afb9867200b568c21736da8a8bbb56b20e30bsalomon@google.com } 10546f7afb9867200b568c21736da8a8bbb56b20e30bsalomon@google.com 1069ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com virtual ~GrDrawState() { 1077d6afdd795eb4c7ce8f5a327117cfdba5f957ddbtomhudson@google.com this->disableStages(); 1089ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com } 1099ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com 11052a5dcb43b5acbde377f664807b0f75af8bb1666bsalomon@google.com /** 1117d6afdd795eb4c7ce8f5a327117cfdba5f957ddbtomhudson@google.com * Resets to the default state. 11208283afc265f1153834256fc1012519813ba6b73bsalomon@google.com * GrEffects will be removed from all stages. 113d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com */ 11452a5dcb43b5acbde377f664807b0f75af8bb1666bsalomon@google.com void reset() { 1159ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com 1167d6afdd795eb4c7ce8f5a327117cfdba5f957ddbtomhudson@google.com this->disableStages(); 11752a5dcb43b5acbde377f664807b0f75af8bb1666bsalomon@google.com 118ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fRenderTarget.reset(NULL); 119ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com 120b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com this->setDefaultVertexAttribs(); 121b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 122ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fColor = 0xffffffff; 123ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fViewMatrix.reset(); 124ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fSrcBlend = kOne_GrBlendCoeff; 125ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fDstBlend = kZero_GrBlendCoeff; 126ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fBlendConstant = 0x0; 127ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fFlagBits = 0x0; 128ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fVertexEdgeType = kHairLine_EdgeType; 129ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fStencilSettings.setDisabled(); 130ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fFirstCoverageStage = kNumStages; 131ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fCoverage = 0xffffffff; 132ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fColorFilterMode = SkXfermode::kDst_Mode; 133ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fColorFilterColor = 0x0; 134ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fDrawFace = kBoth_DrawFace; 135af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com } 136af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com 137af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com /** 138af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com * Initializes the GrDrawState based on a GrPaint. Note that GrDrawState 1391e269b5a08610da13c3aee23809bb45b17e7b663bsalomon@google.com * encompasses more than GrPaint. Aspects of GrDrawState that have no 140af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com * GrPaint equivalents are not modified. GrPaint has fewer stages than 141af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com * GrDrawState. The extra GrDrawState stages are disabled. 142af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com */ 143af84e748cedbf43e2d0e8d2eac9b7800c8d8ca19bsalomon@google.com void setFromPaint(const GrPaint& paint); 1448f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 1458f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 146b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /// @name Vertex Attributes 147cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com //// 148cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com 149b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com enum { 150b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kVertexAttribCnt = 6, 151b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com }; 152b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com 153b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /** 154b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * The format of vertices is represented as an array of vertex attribute 155b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * pair, with each pair representing the type of the attribute and the 156b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * offset in the vertex structure (see GrVertexAttrib, above). 157b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com * 158b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * This will only set up the vertex geometry. To bind the attributes in 159b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * the shaders, attribute indices and attribute bindings need to be set 160b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * as well. 161b75b0a0b8492e14c7728e0a0881f87dc64ce60f9jvanverth@google.com */ 162cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com 163cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com /** 164b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * Sets vertex attributes for next draw. 165cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * 166b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * @param attribs the array of vertex attributes to set. 167b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * @param count the number of attributes being set. 168b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * limited to a count of kVertexAttribCnt. 169cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com */ 170b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com void setVertexAttribs(const GrVertexAttrib attribs[], int count); 171cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com 172b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com const GrVertexAttrib* getVertexAttribs() const { return fVertexAttribs.begin(); } 173b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com int getVertexAttribCount() const { return fVertexAttribs.count(); } 174b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 175b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com size_t getVertexSize() const; 176cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com 177cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com /** 178b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * Sets default vertex attributes for next draw. 179cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * 180b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * This will also set default vertex attribute indices and bindings 181cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com */ 182b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com void setDefaultVertexAttribs(); 183cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com 184b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com //////////////////////////////////////////////////////////////////////////// 185b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com // Helpers for picking apart vertex attributes 186d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 187b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com // helper array to let us check the expected so we know what bound attrib indices 188b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com // we care about 189b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com static const size_t kVertexAttribSizes[kGrVertexAttribTypeCount]; 190cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com 191cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com /** 192cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * Accessing positions, texture coords, or colors, of a vertex within an 193cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * array is a hassle involving casts and simple math. These helpers exist 194cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * to keep GrDrawTarget clients' code a bit nicer looking. 195cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com */ 196cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com 197cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com /** 198cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * Gets a pointer to a GrPoint of a vertex's position or texture 199cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * coordinate. 200b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * @param vertices the vertex array 201cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * @param vertexIndex the index of the vertex in the array 202cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * @param vertexSize the size of each vertex in the array 203cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * @param offset the offset in bytes of the vertex component. 204cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * Defaults to zero (corresponding to vertex position) 205cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * @return pointer to the vertex component as a GrPoint 206cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com */ 207cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com static GrPoint* GetVertexPoint(void* vertices, 208cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com int vertexIndex, 209cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com int vertexSize, 210cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com int offset = 0) { 211cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com intptr_t start = GrTCast<intptr_t>(vertices); 212cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com return GrTCast<GrPoint*>(start + offset + 213cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com vertexIndex * vertexSize); 214cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com } 215cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com static const GrPoint* GetVertexPoint(const void* vertices, 216cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com int vertexIndex, 217cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com int vertexSize, 218cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com int offset = 0) { 219cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com intptr_t start = GrTCast<intptr_t>(vertices); 220cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com return GrTCast<const GrPoint*>(start + offset + 221cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com vertexIndex * vertexSize); 222cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com } 223cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com 224cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com /** 225cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * Gets a pointer to a GrColor inside a vertex within a vertex array. 226cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * @param vertices the vetex array 227cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * @param vertexIndex the index of the vertex in the array 228cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * @param vertexSize the size of each vertex in the array 229cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * @param offset the offset in bytes of the vertex color 230cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com * @return pointer to the vertex component as a GrColor 231cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com */ 232cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com static GrColor* GetVertexColor(void* vertices, 233cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com int vertexIndex, 234cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com int vertexSize, 235cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com int offset) { 236cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com intptr_t start = GrTCast<intptr_t>(vertices); 237cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com return GrTCast<GrColor*>(start + offset + 238cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com vertexIndex * vertexSize); 239cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com } 240cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com static const GrColor* GetVertexColor(const void* vertices, 241cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com int vertexIndex, 242cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com int vertexSize, 243cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com int offset) { 244cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com const intptr_t start = GrTCast<intptr_t>(vertices); 245cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com return GrTCast<const GrColor*>(start + offset + 246cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com vertexIndex * vertexSize); 247cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com } 248cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com 249b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /// @} 250b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 251b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /////////////////////////////////////////////////////////////////////////// 252b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /// @name Attribute Bindings 253b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com //// 254b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 255b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /** 256b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * The vertex data used by the current program is represented as a bitfield 257b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * of flags. Programs always use positions and may also use texture 258b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * coordinates, per-vertex colors, per-vertex coverage and edge data. Each 259b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * stage can use the explicit texture coordinates as its input texture 260b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * coordinates or it may use the positions as texture coordinates. 261b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com */ 262b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 263b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /** 264b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * Generates a bit indicating that a texture stage uses texture coordinates 265b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * 266b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * @param stageIdx the stage that will use texture coordinates. 267b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * 268b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * @return the bit to add to a GrAttribBindings bitfield. 269b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com */ 270b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com static int ExplicitTexCoordAttribBindingsBit(int stageIdx) { 271b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com GrAssert(stageIdx < kNumStages); 272b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com return (1 << stageIdx); 273b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com } 274b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 275b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com static bool StageBindsExplicitTexCoords(GrAttribBindings bindings, int stageIdx); 276b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 277b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /** 278b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * Additional Bits that can be specified in GrAttribBindings. 279b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com */ 280b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com enum AttribBindingsBits { 281b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /* program uses colors (GrColor) */ 282b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kColor_AttribBindingsBit = 1 << (kNumStages + 0), 283b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /* program uses coverage (GrColor) 284b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com */ 285b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kCoverage_AttribBindingsBit = 1 << (kNumStages + 1), 286b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /* program uses edge data. Distance to the edge is used to 287b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * compute a coverage. See GrDrawState::setVertexEdgeType(). 288b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com */ 289b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kEdge_AttribBindingsBit = 1 << (kNumStages + 2), 290b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com // for below assert 291b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kDummyAttribBindingsBit, 292b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kHighAttribBindingsBit = kDummyAttribBindingsBit - 1 293b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com }; 294b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com // make sure we haven't exceeded the number of bits in GrAttribBindings. 295b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com GR_STATIC_ASSERT(kHighAttribBindingsBit < ((uint64_t)1 << 8*sizeof(GrAttribBindings))); 296b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 297b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com enum AttribBindings { 298b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kDefault_AttribBindings = 0 299b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com }; 300b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 301b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /** 302b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * Sets attribute bindings for next draw. 303b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * 304b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * @param bindings the attribute bindings to set. 305b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com */ 306b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com void setAttribBindings(GrAttribBindings bindings) { fCommon.fAttribBindings = bindings; } 307b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 308b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com GrAttribBindings getAttribBindings() const { return fCommon.fAttribBindings; } 309b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 310b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com //////////////////////////////////////////////////////////////////////////// 311b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com // Helpers for picking apart attribute bindings 312b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 313b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /** 314b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * Helper function to determine if program uses explicit texture 315b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * coordinates. 316b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * 317b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * @param bindings attribute bindings to query 318b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * 319b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * @return true if program uses texture coordinates, 320b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * false otherwise. 321b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com */ 322b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com static bool AttributesBindExplicitTexCoords(GrAttribBindings bindings); 323b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 324b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /** 325b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * Determines whether src alpha is guaranteed to be one for all src pixels 326b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com */ 327b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com bool srcAlphaWillBeOne(GrAttribBindings) const; 328b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 329b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /** 330b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * Determines whether the output coverage is guaranteed to be one for all pixels hit by a draw. 331b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com */ 332b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com bool hasSolidCoverage(GrAttribBindings) const; 333b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 334b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com static void VertexAttributesUnitTest(); 335b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 336b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /// @} 337b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 338b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /////////////////////////////////////////////////////////////////////////// 339b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /// @name Vertex Attribute Indices 340b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com //// 341b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 342b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /** 343b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * Vertex attribute indices map the data set in the vertex attribute array 344b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * to the bindings specified in the attribute bindings. Each binding type 345b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * has an associated index in the attribute array. This index is used to 346b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * look up the vertex attribute data from the array, and potentially as the 347b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * attribute index if we're binding attributes in GL. 348b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * 349b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * Indices which do not have active attribute bindings will be ignored. 350b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com */ 351b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 352b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com enum AttribIndex { 353b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kPosition_AttribIndex = 0, 354b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kColor_AttribIndex, 355b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kCoverage_AttribIndex, 356b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kEdge_AttribIndex, 357b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kTexCoord_AttribIndex, 358b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 359b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kLast_AttribIndex = kTexCoord_AttribIndex 360b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com }; 361b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com static const int kAttribIndexCount = kLast_AttribIndex + 1; 362b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 363b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com // these are used when vertex color and coverage isn't set 364b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com enum { 365b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kColorOverrideAttribIndexValue = GrDrawState::kVertexAttribCnt, 366b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com kCoverageOverrideAttribIndexValue = GrDrawState::kVertexAttribCnt+1, 367b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com }; 368b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 369b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com //////////////////////////////////////////////////////////////////////////// 370b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com // Helpers to set attribute indices. These should match the index in the 371b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com // current attribute index array. 372b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 373b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com /** 374b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * Sets index for next draw. This is used to look up the offset 375b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * from the current vertex attribute array and to bind the attributes. 376b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * 377b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * @param index the attribute index we're setting 378b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * @param value the value of the index 379b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com */ 380b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com void setAttribIndex(AttribIndex index, int value) { fAttribIndices[index] = value; } 381b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 382b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com int getAttribIndex(AttribIndex index) const { return fAttribIndices[index]; } 383cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com 384cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com /// @} 385cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com 386cc78238f0b6aa1a7b3fc767758d9eeef4c1bffa9jvanverth@google.com /////////////////////////////////////////////////////////////////////////// 3878f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @name Color 3888f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com //// 3898f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 3908f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 3918f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Sets color for next draw to a premultiplied-alpha color. 3928f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 3938f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * @param color the color to set. 3948f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 395ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com void setColor(GrColor color) { fCommon.fColor = color; } 3968f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 397ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrColor getColor() const { return fCommon.fColor; } 3988f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 3998f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 4008f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Sets the color to be used for the next draw to be 4018f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * (r,g,b,a) = (alpha, alpha, alpha, alpha). 4028f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 4038f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * @param alpha The alpha value to set as the color. 4048f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 4058f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com void setAlpha(uint8_t a) { 4068f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com this->setColor((a << 24) | (a << 16) | (a << 8) | a); 4078f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 4088f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 4098f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 4108f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Add a color filter that can be represented by a color and a mode. Applied 4118f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * after color-computing texture stages. 4128f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 4138f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com void setColorFilter(GrColor c, SkXfermode::Mode mode) { 414ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fColorFilterColor = c; 415ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fColorFilterMode = mode; 4168f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 4178f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 418ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrColor getColorFilterColor() const { return fCommon.fColorFilterColor; } 419ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com SkXfermode::Mode getColorFilterMode() const { return fCommon.fColorFilterMode; } 4208f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 4215b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com /** 4225b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com * Constructor sets the color to be 'color' which is undone by the destructor. 4235b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com */ 4245b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com class AutoColorRestore : public ::GrNoncopyable { 4255b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com public: 426d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com AutoColorRestore() : fDrawState(NULL) {} 427d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 4285b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com AutoColorRestore(GrDrawState* drawState, GrColor color) { 429d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fDrawState = NULL; 430d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com this->set(drawState, color); 431d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 432d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 433d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com void reset() { 434d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com if (NULL != fDrawState) { 435d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fDrawState->setColor(fOldColor); 436d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com fDrawState = NULL; 437d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 438d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com } 439d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 440d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com void set(GrDrawState* drawState, GrColor color) { 441d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com this->reset(); 4425b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com fDrawState = drawState; 4435b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com fOldColor = fDrawState->getColor(); 4445b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com fDrawState->setColor(color); 4455b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com } 446d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com 447d62e88e5af39347a8fc2a5abdf5feb67d7ea256dbsalomon@google.com ~AutoColorRestore() { this->reset(); } 4485b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com private: 4495b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com GrDrawState* fDrawState; 4505b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com GrColor fOldColor; 4515b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com }; 4525b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com 4538f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @} 4548f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 4558f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 4562401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com /// @name Coverage 4572401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com //// 4582401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com 4592401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com /** 460d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com * Sets a constant fractional coverage to be applied to the draw. The 4612401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com * initial value (after construction or reset()) is 0xff. The constant 4622401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com * coverage is ignored when per-vertex coverage is provided. 4632401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com */ 4642401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com void setCoverage(uint8_t coverage) { 465ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fCoverage = GrColorPackRGBA(coverage, coverage, coverage, coverage); 4662401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com } 4672401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com 4682401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com /** 4692401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com * Version of above that specifies 4 channel per-vertex color. The value 4702401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com * should be premultiplied. 4712401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com */ 4722401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com void setCoverage4(GrColor coverage) { 473ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fCoverage = coverage; 4742401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com } 4752401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com 4762401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com GrColor getCoverage() const { 477ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com return fCommon.fCoverage; 4782401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com } 4792401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com 4802401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com /// @} 4812401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com 4822401ae8fd3c1f6282f571b5a7e0a499e9f4c09abbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 483adc6536fe5baff2216fb76ecda6cc81c61109d5cbsalomon@google.com /// @name Effect Stages 4848f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com //// 4858f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 486adc6536fe5baff2216fb76ecda6cc81c61109d5cbsalomon@google.com const GrEffectRef* setEffect(int stageIdx, const GrEffectRef* effect) { 487adc6536fe5baff2216fb76ecda6cc81c61109d5cbsalomon@google.com fStages[stageIdx].setEffect(effect); 488adc6536fe5baff2216fb76ecda6cc81c61109d5cbsalomon@google.com return effect; 489adc6536fe5baff2216fb76ecda6cc81c61109d5cbsalomon@google.com } 490adc6536fe5baff2216fb76ecda6cc81c61109d5cbsalomon@google.com 4918f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 49268b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com * Creates a GrSimpleTextureEffect. 4931e8f016305805d4d8cad74aba3a21b78486f9d6ftomhudson@google.com */ 494b9086a026844e4cfd08b219e49ce3f12294cba98bsalomon@google.com void createTextureEffect(int stageIdx, GrTexture* texture, const SkMatrix& matrix) { 49508283afc265f1153834256fc1012519813ba6b73bsalomon@google.com GrAssert(!this->getStage(stageIdx).getEffect()); 49668b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com GrEffectRef* effect = GrSimpleTextureEffect::Create(texture, matrix); 497adc6536fe5baff2216fb76ecda6cc81c61109d5cbsalomon@google.com this->setEffect(stageIdx, effect)->unref(); 498dfdb7e5240276493077b7c6e1f3cc8b8a0e195babsalomon@google.com } 49908283afc265f1153834256fc1012519813ba6b73bsalomon@google.com void createTextureEffect(int stageIdx, 50008283afc265f1153834256fc1012519813ba6b73bsalomon@google.com GrTexture* texture, 501b9086a026844e4cfd08b219e49ce3f12294cba98bsalomon@google.com const SkMatrix& matrix, 502dfdb7e5240276493077b7c6e1f3cc8b8a0e195babsalomon@google.com const GrTextureParams& params) { 50308283afc265f1153834256fc1012519813ba6b73bsalomon@google.com GrAssert(!this->getStage(stageIdx).getEffect()); 50468b58c95384dd6c2fd389a5b4bbf8fc468819454bsalomon@google.com GrEffectRef* effect = GrSimpleTextureEffect::Create(texture, matrix, params); 505adc6536fe5baff2216fb76ecda6cc81c61109d5cbsalomon@google.com this->setEffect(stageIdx, effect)->unref(); 5061ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com } 5071ce49fc91714ce8974d11246d29ebe7b97b5fe98bsalomon@google.com 5087d6afdd795eb4c7ce8f5a327117cfdba5f957ddbtomhudson@google.com bool stagesDisabled() { 5097d6afdd795eb4c7ce8f5a327117cfdba5f957ddbtomhudson@google.com for (int i = 0; i < kNumStages; ++i) { 51008283afc265f1153834256fc1012519813ba6b73bsalomon@google.com if (NULL != fStages[i].getEffect()) { 5117d6afdd795eb4c7ce8f5a327117cfdba5f957ddbtomhudson@google.com return false; 5127d6afdd795eb4c7ce8f5a327117cfdba5f957ddbtomhudson@google.com } 5137d6afdd795eb4c7ce8f5a327117cfdba5f957ddbtomhudson@google.com } 5143eee8fbe0f280bc1dea59dc0b0ebd8021b51137ftomhudson@google.com return true; 5157d6afdd795eb4c7ce8f5a327117cfdba5f957ddbtomhudson@google.com } 516676e66096c60615bac52f365111596de5c4ca8a6tomhudson@google.com 517adc6536fe5baff2216fb76ecda6cc81c61109d5cbsalomon@google.com void disableStage(int stageIdx) { this->setEffect(stageIdx, NULL); } 518676e66096c60615bac52f365111596de5c4ca8a6tomhudson@google.com 519972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com /** 520f271cc7183fe48ac64d2d9a454eb013c91b42d53bsalomon@google.com * Release all the GrEffects referred to by this draw state. 521972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com */ 5227d6afdd795eb4c7ce8f5a327117cfdba5f957ddbtomhudson@google.com void disableStages() { 523972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com for (int i = 0; i < kNumStages; ++i) { 524676e66096c60615bac52f365111596de5c4ca8a6tomhudson@google.com this->disableStage(i); 525972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com } 526972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com } 527972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com 5287d6afdd795eb4c7ce8f5a327117cfdba5f957ddbtomhudson@google.com class AutoStageDisable : public ::GrNoncopyable { 529972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com public: 5307d6afdd795eb4c7ce8f5a327117cfdba5f957ddbtomhudson@google.com AutoStageDisable(GrDrawState* ds) : fDrawState(ds) {} 5317d6afdd795eb4c7ce8f5a327117cfdba5f957ddbtomhudson@google.com ~AutoStageDisable() { 532972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com if (NULL != fDrawState) { 5337d6afdd795eb4c7ce8f5a327117cfdba5f957ddbtomhudson@google.com fDrawState->disableStages(); 534972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com } 535972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com } 536972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com private: 537972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com GrDrawState* fDrawState; 538972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com }; 539972265db219ce25b5159879c75e6c62efaf0fa79robertphillips@google.com 5408f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 54108283afc265f1153834256fc1012519813ba6b73bsalomon@google.com * Returns the current stage by index. 5428f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 54308283afc265f1153834256fc1012519813ba6b73bsalomon@google.com const GrEffectStage& getStage(int stageIdx) const { 54408283afc265f1153834256fc1012519813ba6b73bsalomon@google.com GrAssert((unsigned)stageIdx < kNumStages); 54508283afc265f1153834256fc1012519813ba6b73bsalomon@google.com return fStages[stageIdx]; 5468f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 5478f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 5488f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 549288d9549b42a4eb934e814790f2b7a81f017a9c5bsalomon@google.com * Called when the source coord system is changing. preConcat gives the transformation from the 550288d9549b42a4eb934e814790f2b7a81f017a9c5bsalomon@google.com * old coord system to the new coord system. 5518f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 552b9086a026844e4cfd08b219e49ce3f12294cba98bsalomon@google.com void preConcatStageMatrices(const SkMatrix& preConcat) { 553cabe00eaced87016647029b6fee08f24dcd062f3bsalomon@google.com this->preConcatStageMatrices(~0U, preConcat); 554cabe00eaced87016647029b6fee08f24dcd062f3bsalomon@google.com } 555cabe00eaced87016647029b6fee08f24dcd062f3bsalomon@google.com /** 556cabe00eaced87016647029b6fee08f24dcd062f3bsalomon@google.com * Version of above that applies the update matrix selectively to stages via a mask. 557cabe00eaced87016647029b6fee08f24dcd062f3bsalomon@google.com */ 558cabe00eaced87016647029b6fee08f24dcd062f3bsalomon@google.com void preConcatStageMatrices(uint32_t stageMask, const SkMatrix& preConcat) { 5598f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com for (int i = 0; i < kNumStages; ++i) { 560cabe00eaced87016647029b6fee08f24dcd062f3bsalomon@google.com if (((1 << i) & stageMask) && this->isStageEnabled(i)) { 56108283afc265f1153834256fc1012519813ba6b73bsalomon@google.com fStages[i].preConcatCoordChange(preConcat); 5628f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 5638f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 5648f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 5658f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 566e3d3216fe17b6afb2e613271b5246a2766e12df6bsalomon@google.com /** 567288d9549b42a4eb934e814790f2b7a81f017a9c5bsalomon@google.com * Called when the source coord system is changing. preConcatInverse is the inverse of the 568288d9549b42a4eb934e814790f2b7a81f017a9c5bsalomon@google.com * transformation from the old coord system to the new coord system. Returns false if the matrix 569288d9549b42a4eb934e814790f2b7a81f017a9c5bsalomon@google.com * cannot be inverted. 570e3d3216fe17b6afb2e613271b5246a2766e12df6bsalomon@google.com */ 571b9086a026844e4cfd08b219e49ce3f12294cba98bsalomon@google.com bool preConcatStageMatricesWithInverse(const SkMatrix& preConcatInverse) { 572b9086a026844e4cfd08b219e49ce3f12294cba98bsalomon@google.com SkMatrix inv; 573e3d3216fe17b6afb2e613271b5246a2766e12df6bsalomon@google.com bool computed = false; 574e3d3216fe17b6afb2e613271b5246a2766e12df6bsalomon@google.com for (int i = 0; i < kNumStages; ++i) { 575e3d3216fe17b6afb2e613271b5246a2766e12df6bsalomon@google.com if (this->isStageEnabled(i)) { 576288d9549b42a4eb934e814790f2b7a81f017a9c5bsalomon@google.com if (!computed && !preConcatInverse.invert(&inv)) { 577e3d3216fe17b6afb2e613271b5246a2766e12df6bsalomon@google.com return false; 578e3d3216fe17b6afb2e613271b5246a2766e12df6bsalomon@google.com } else { 579e3d3216fe17b6afb2e613271b5246a2766e12df6bsalomon@google.com computed = true; 580e3d3216fe17b6afb2e613271b5246a2766e12df6bsalomon@google.com } 58108283afc265f1153834256fc1012519813ba6b73bsalomon@google.com fStages[i].preConcatCoordChange(preConcatInverse); 582e3d3216fe17b6afb2e613271b5246a2766e12df6bsalomon@google.com } 583e3d3216fe17b6afb2e613271b5246a2766e12df6bsalomon@google.com } 584e3d3216fe17b6afb2e613271b5246a2766e12df6bsalomon@google.com return true; 585e3d3216fe17b6afb2e613271b5246a2766e12df6bsalomon@google.com } 586e3d3216fe17b6afb2e613271b5246a2766e12df6bsalomon@google.com 5878f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @} 5888f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 5898f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 5908f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @name Coverage / Color Stages 5918f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com //// 5928f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 5938f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 5948f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * A common pattern is to compute a color with the initial stages and then 5958f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * modulate that color by a coverage value in later stage(s) (AA, mask- 596d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com * filters, glyph mask, etc). Color-filters, xfermodes, etc should be 597d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com * computed based on the pre-coverage-modulated color. The division of 598d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com * stages between color-computing and coverage-computing is specified by 5998f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * this method. Initially this is kNumStages (all stages 6008f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * are color-computing). 6018f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 6028f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com void setFirstCoverageStage(int firstCoverageStage) { 6038f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com GrAssert((unsigned)firstCoverageStage <= kNumStages); 604ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fFirstCoverageStage = firstCoverageStage; 6058f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 6068f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 6078f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 6088f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Gets the index of the first coverage-computing stage. 6098f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 6108f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com int getFirstCoverageStage() const { 611ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com return fCommon.fFirstCoverageStage; 6128f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 6138f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 6148f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com ///@} 6158f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 6168f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 6178f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @name Blending 6188f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com //// 6198f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 6208f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 6211e269b5a08610da13c3aee23809bb45b17e7b663bsalomon@google.com * Sets the blending function coefficients. 6228f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 6238f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * The blend function will be: 6248f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * D' = sat(S*srcCoef + D*dstCoef) 6258f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 6268f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * where D is the existing destination color, S is the incoming source 6278f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * color, and D' is the new destination color that will be written. sat() 6288f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * is the saturation function. 6298f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 6301e269b5a08610da13c3aee23809bb45b17e7b663bsalomon@google.com * @param srcCoef coefficient applied to the src color. 6311e269b5a08610da13c3aee23809bb45b17e7b663bsalomon@google.com * @param dstCoef coefficient applied to the dst color. 6328f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 6338f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com void setBlendFunc(GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff) { 634ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fSrcBlend = srcCoeff; 635ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fDstBlend = dstCoeff; 6368f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com #if GR_DEBUG 6378f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com switch (dstCoeff) { 63847059542e7aa153926377456a6c611e55c8e428cbsalomon@google.com case kDC_GrBlendCoeff: 63947059542e7aa153926377456a6c611e55c8e428cbsalomon@google.com case kIDC_GrBlendCoeff: 64047059542e7aa153926377456a6c611e55c8e428cbsalomon@google.com case kDA_GrBlendCoeff: 64147059542e7aa153926377456a6c611e55c8e428cbsalomon@google.com case kIDA_GrBlendCoeff: 6428f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com GrPrintf("Unexpected dst blend coeff. Won't work correctly with" 6438f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com "coverage stages.\n"); 6448f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com break; 6458f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com default: 6468f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com break; 6478f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 6488f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com switch (srcCoeff) { 64947059542e7aa153926377456a6c611e55c8e428cbsalomon@google.com case kSC_GrBlendCoeff: 65047059542e7aa153926377456a6c611e55c8e428cbsalomon@google.com case kISC_GrBlendCoeff: 65147059542e7aa153926377456a6c611e55c8e428cbsalomon@google.com case kSA_GrBlendCoeff: 65247059542e7aa153926377456a6c611e55c8e428cbsalomon@google.com case kISA_GrBlendCoeff: 6538f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com GrPrintf("Unexpected src blend coeff. Won't work correctly with" 6548f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com "coverage stages.\n"); 6558f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com break; 6568f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com default: 6578f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com break; 6588f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 6598f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com #endif 6608f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 6618f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 662ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrBlendCoeff getSrcBlendCoeff() const { return fCommon.fSrcBlend; } 663ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrBlendCoeff getDstBlendCoeff() const { return fCommon.fDstBlend; } 6648f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 6658f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com void getDstBlendCoeff(GrBlendCoeff* srcBlendCoeff, 6668f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com GrBlendCoeff* dstBlendCoeff) const { 667ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com *srcBlendCoeff = fCommon.fSrcBlend; 668ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com *dstBlendCoeff = fCommon.fDstBlend; 6698f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 6708f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 6718f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 6728f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Sets the blending function constant referenced by the following blending 6731e269b5a08610da13c3aee23809bb45b17e7b663bsalomon@google.com * coefficients: 67447059542e7aa153926377456a6c611e55c8e428cbsalomon@google.com * kConstC_GrBlendCoeff 67547059542e7aa153926377456a6c611e55c8e428cbsalomon@google.com * kIConstC_GrBlendCoeff 67647059542e7aa153926377456a6c611e55c8e428cbsalomon@google.com * kConstA_GrBlendCoeff 67747059542e7aa153926377456a6c611e55c8e428cbsalomon@google.com * kIConstA_GrBlendCoeff 6788f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 6798f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * @param constant the constant to set 6808f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 681ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com void setBlendConstant(GrColor constant) { fCommon.fBlendConstant = constant; } 6828f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 6838f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 6848f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Retrieves the last value set by setBlendConstant() 6858f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * @return the blending constant value 6868f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 687ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrColor getBlendConstant() const { return fCommon.fBlendConstant; } 6888f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 6892b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com /** 6902b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * Determines whether multiplying the computed per-pixel color by the pixel's fractional 6912b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * coverage before the blend will give the correct final destination color. In general it 6922b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * will not as coverage is applied after blending. 6932b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com */ 6942b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com bool canTweakAlphaForCoverage() const; 6952b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com 6962b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com /** 6972b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * Optimizations for blending / coverage to that can be applied based on the current state. 6982b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com */ 6992b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com enum BlendOptFlags { 7002b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com /** 7012b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * No optimization 7022b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com */ 7032b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com kNone_BlendOpt = 0, 7042b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com /** 7052b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * Don't draw at all 7062b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com */ 7072b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com kSkipDraw_BlendOptFlag = 0x1, 7082b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com /** 7092b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * Emit the src color, disable HW blending (replace dst with src) 7102b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com */ 7112b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com kDisableBlend_BlendOptFlag = 0x2, 7122b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com /** 7132b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * The coverage value does not have to be computed separately from alpha, the the output 7142b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * color can be the modulation of the two. 7152b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com */ 7162b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com kCoverageAsAlpha_BlendOptFlag = 0x4, 7172b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com /** 7182b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * Instead of emitting a src color, emit coverage in the alpha channel and r,g,b are 7192b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * "don't cares". 7202b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com */ 7212b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com kEmitCoverage_BlendOptFlag = 0x8, 7222b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com /** 7232b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * Emit transparent black instead of the src color, no need to compute coverage. 7242b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com */ 7252b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com kEmitTransBlack_BlendOptFlag = 0x10, 7262b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com }; 7272b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com GR_DECL_BITFIELD_OPS_FRIENDS(BlendOptFlags); 7282b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com 7292b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com /** 7302b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * Determines what optimizations can be applied based on the blend. The coefficients may have 7312b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * to be tweaked in order for the optimization to work. srcCoeff and dstCoeff are optional 7322b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * params that receive the tweaked coefficients. Normally the function looks at the current 7332b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * state to see if coverage is enabled. By setting forceCoverage the caller can speculatively 7342b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * determine the blend optimizations that would be used if there was partial pixel coverage. 7352b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * 7362b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * Subclasses of GrDrawTarget that actually draw (as opposed to those that just buffer for 7372b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com * playback) must call this function and respect the flags that replace the output color. 7382b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com */ 7392b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com BlendOptFlags getBlendOpts(bool forceCoverage = false, 7402b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com GrBlendCoeff* srcCoeff = NULL, 7412b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com GrBlendCoeff* dstCoeff = NULL) const; 7422b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com 7438f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @} 7448f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 7458f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 7468f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @name View Matrix 7478f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com //// 7488f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 7498f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 750a72eef322c686954cdffa849dc26d8133b802f1drobertphillips@google.com * Sets the matrix applied to vertex positions. 7518f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 7528f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * In the post-view-matrix space the rectangle [0,w]x[0,h] 7538f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * fully covers the render target. (w and h are the width and height of the 754ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com * the render-target.) 7558f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 756ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com void setViewMatrix(const SkMatrix& m) { fCommon.fViewMatrix = m; } 7578f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 7588f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 7598f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Gets a writable pointer to the view matrix. 7608f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 761ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com SkMatrix* viewMatrix() { return &fCommon.fViewMatrix; } 7628f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 7638f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 7648f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Multiplies the current view matrix by a matrix 7658f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 7668f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * After this call V' = V*m where V is the old view matrix, 7678f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * m is the parameter to this function, and V' is the new view matrix. 7688f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * (We consider positions to be column vectors so position vector p is 7698f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * transformed by matrix X as p' = X*p.) 7708f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 7718f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * @param m the matrix used to modify the view matrix. 7728f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 773ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com void preConcatViewMatrix(const SkMatrix& m) { fCommon.fViewMatrix.preConcat(m); } 7748f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 7758f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 7768f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Multiplies the current view matrix by a matrix 7778f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 7788f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * After this call V' = m*V where V is the old view matrix, 7798f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * m is the parameter to this function, and V' is the new view matrix. 7808f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * (We consider positions to be column vectors so position vector p is 7818f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * transformed by matrix X as p' = X*p.) 7828f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 7838f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * @param m the matrix used to modify the view matrix. 7848f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 785ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com void postConcatViewMatrix(const SkMatrix& m) { fCommon.fViewMatrix.postConcat(m); } 7868f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 7878f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 7888f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Retrieves the current view matrix 7898f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * @return the current view matrix. 7908f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 791ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com const SkMatrix& getViewMatrix() const { return fCommon.fViewMatrix; } 7928f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 7938f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 7948f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Retrieves the inverse of the current view matrix. 7958f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 7968f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * If the current view matrix is invertible, return true, and if matrix 7978f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * is non-null, copy the inverse into it. If the current view matrix is 7988f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * non-invertible, return false and ignore the matrix parameter. 7998f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 8008f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * @param matrix if not null, will receive a copy of the current inverse. 8018f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 802b9086a026844e4cfd08b219e49ce3f12294cba98bsalomon@google.com bool getViewInverse(SkMatrix* matrix) const { 8038f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com // TODO: determine whether we really need to leave matrix unmodified 8048f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com // at call sites when inversion fails. 805b9086a026844e4cfd08b219e49ce3f12294cba98bsalomon@google.com SkMatrix inverse; 806ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com if (fCommon.fViewMatrix.invert(&inverse)) { 8078f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com if (matrix) { 8088f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com *matrix = inverse; 8098f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 8108f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com return true; 8118f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 8128f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com return false; 8138f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 8148f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 8155b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com //////////////////////////////////////////////////////////////////////////// 8165b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com 8175b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com /** 8182fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com * Preconcats the current view matrix and restores the previous view matrix in the destructor. 819c196b522d06919885c6bbe28b7b06d2e5b2cb9bfbsalomon@google.com * Effect matrices are automatically adjusted to compensate. 8205b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com */ 8218f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com class AutoViewMatrixRestore : public ::GrNoncopyable { 8228f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com public: 8238f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com AutoViewMatrixRestore() : fDrawState(NULL) {} 8242fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com 8252fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com AutoViewMatrixRestore(GrDrawState* ds, 826b9086a026844e4cfd08b219e49ce3f12294cba98bsalomon@google.com const SkMatrix& preconcatMatrix, 8272fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com uint32_t explicitCoordStageMask = 0) { 8288f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com fDrawState = NULL; 8292fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com this->set(ds, preconcatMatrix, explicitCoordStageMask); 8308f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 8312fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com 8322fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com ~AutoViewMatrixRestore() { this->restore(); } 8332fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com 834a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com /** 835a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com * Can be called prior to destructor to restore the original matrix. 836a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com */ 8372fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com void restore(); 838f467ce7bc33af5f496e0619387551aedec6d2517skia.committer@gmail.com 8392fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com void set(GrDrawState* drawState, 840b9086a026844e4cfd08b219e49ce3f12294cba98bsalomon@google.com const SkMatrix& preconcatMatrix, 8412fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com uint32_t explicitCoordStageMask = 0); 8422fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com 843ded4f4b163f5aa19c22c871178c55ecb34623846bsalomon@google.com bool isSet() const { return NULL != fDrawState; } 8442fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com 8458f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com private: 846288d9549b42a4eb934e814790f2b7a81f017a9c5bsalomon@google.com GrDrawState* fDrawState; 847b9086a026844e4cfd08b219e49ce3f12294cba98bsalomon@google.com SkMatrix fViewMatrix; 84808283afc265f1153834256fc1012519813ba6b73bsalomon@google.com GrEffectStage::SavedCoordChange fSavedCoordChanges[GrDrawState::kNumStages]; 849288d9549b42a4eb934e814790f2b7a81f017a9c5bsalomon@google.com uint32_t fRestoreMask; 8509381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com }; 8519381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com 8525b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com //////////////////////////////////////////////////////////////////////////// 8535b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com 8545b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com /** 8552fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com * This sets the view matrix to identity and adjusts stage matrices to compensate. The 8562fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com * destructor undoes the changes, restoring the view matrix that was set before the 8572fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com * constructor. It is similar to passing the inverse of the current view matrix to 8582fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com * AutoViewMatrixRestore, but lazily computes the inverse only if necessary. 8595b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com */ 8605b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com class AutoDeviceCoordDraw : ::GrNoncopyable { 8615b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com public: 8622fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com AutoDeviceCoordDraw() : fDrawState(NULL) {} 8635b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com /** 8642fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com * If a stage's texture matrix is applied to explicit per-vertex coords, rather than to 8652fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com * positions, then we don't want to modify its matrix. The explicitCoordStageMask is used 8662fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com * to specify such stages. 8675b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com */ 8685b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com AutoDeviceCoordDraw(GrDrawState* drawState, 8692fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com uint32_t explicitCoordStageMask = 0) { 8702fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com fDrawState = NULL; 8712fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com this->set(drawState, explicitCoordStageMask); 8722fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com } 8732fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com 874a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com ~AutoDeviceCoordDraw() { this->restore(); } 875a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com 8762fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com bool set(GrDrawState* drawState, uint32_t explicitCoordStageMask = 0); 8772fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com 878a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com /** 879a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com * Returns true if this object was successfully initialized on to a GrDrawState. It may 880a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com * return false because a non-default constructor or set() were never called or because 881a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com * the view matrix was not invertible. 882a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com */ 8835b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com bool succeeded() const { return NULL != fDrawState; } 8842fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com 885a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com /** 886a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com * Returns the matrix that was set previously set on the drawState. This is only valid 887a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com * if succeeded returns true. 888a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com */ 889b9086a026844e4cfd08b219e49ce3f12294cba98bsalomon@google.com const SkMatrix& getOriginalMatrix() const { 890a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com GrAssert(this->succeeded()); 891a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com return fViewMatrix; 892a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com } 8932fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com 894a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com /** 895a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com * Can be called prior to destructor to restore the original matrix. 896a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com */ 897a834746cc1bd92301fd0840a221ca1623c0bbb29bsalomon@google.com void restore(); 8982fdcdeb86788206c23410109b3e2b7976747fd11bsalomon@google.com 8995b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com private: 900288d9549b42a4eb934e814790f2b7a81f017a9c5bsalomon@google.com GrDrawState* fDrawState; 901b9086a026844e4cfd08b219e49ce3f12294cba98bsalomon@google.com SkMatrix fViewMatrix; 90208283afc265f1153834256fc1012519813ba6b73bsalomon@google.com GrEffectStage::SavedCoordChange fSavedCoordChanges[GrDrawState::kNumStages]; 903288d9549b42a4eb934e814790f2b7a81f017a9c5bsalomon@google.com uint32_t fRestoreMask; 9045b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com }; 9055b3e890c376f2211218c43edd11939cfc78fd60absalomon@google.com 9068f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @} 9078f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 9088f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 9098f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @name Render Target 9108f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com //// 9118f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 9128f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 913ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com * Sets the render-target used at the next drawing call 9148f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 9158f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * @param target The render target to set. 9168f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 917d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com void setRenderTarget(GrRenderTarget* target) { 918ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fRenderTarget.reset(SkSafeRef(target)); 9199ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com } 9208f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 9218f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 922ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com * Retrieves the currently set render-target. 9238f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 9248f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * @return The currently set render target. 9258f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 926ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com const GrRenderTarget* getRenderTarget() const { return fRenderTarget.get(); } 927ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrRenderTarget* getRenderTarget() { return fRenderTarget.get(); } 9288f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 9298f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com class AutoRenderTargetRestore : public ::GrNoncopyable { 9308f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com public: 931cadbcb8e536f89babb4e165bfdca18384e97d582bsalomon@google.com AutoRenderTargetRestore() : fDrawState(NULL), fSavedTarget(NULL) {} 9328f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com AutoRenderTargetRestore(GrDrawState* ds, GrRenderTarget* newTarget) { 9338f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com fDrawState = NULL; 9347460b378d68217167013ca889a4cdcae742908e7robertphillips@google.com fSavedTarget = NULL; 9358f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com this->set(ds, newTarget); 9368f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 9379ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com ~AutoRenderTargetRestore() { this->restore(); } 9389ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com 9399ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com void restore() { 9408f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com if (NULL != fDrawState) { 9418f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com fDrawState->setRenderTarget(fSavedTarget); 9429ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com fDrawState = NULL; 9438f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 9449ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com GrSafeSetNull(fSavedTarget); 9459ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com } 9469ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com 9479ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com void set(GrDrawState* ds, GrRenderTarget* newTarget) { 9489ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com this->restore(); 9499ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com 9508f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com if (NULL != ds) { 9519ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com GrAssert(NULL == fSavedTarget); 9528f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com fSavedTarget = ds->getRenderTarget(); 9539ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com SkSafeRef(fSavedTarget); 9548f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com ds->setRenderTarget(newTarget); 9559ec075366ed94802a142fc5e948d19a774f85b43robertphillips@google.com fDrawState = ds; 9568f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 9578f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 9588f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com private: 9598f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com GrDrawState* fDrawState; 9608f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com GrRenderTarget* fSavedTarget; 9618f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com }; 9628f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 9638f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @} 9648f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 9658f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 9668f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @name Stencil 9678f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com //// 9688f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 9698f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 9708f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Sets the stencil settings to use for the next draw. 9718f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Changing the clip has the side-effect of possibly zeroing 9728f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * out the client settable stencil bits. So multipass algorithms 9738f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * using stencil should not change the clip between passes. 9748f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * @param settings the stencil settings to use. 9758f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 9768f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com void setStencil(const GrStencilSettings& settings) { 977ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fStencilSettings = settings; 9788f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 9798f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 9808f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 9818f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Shortcut to disable stencil testing and ops. 9828f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 9838f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com void disableStencil() { 984ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fStencilSettings.setDisabled(); 9858f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 9868f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 987ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com const GrStencilSettings& getStencil() const { return fCommon.fStencilSettings; } 9888f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 989ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrStencilSettings* stencil() { return &fCommon.fStencilSettings; } 9908f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 9918f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @} 9928f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 9938f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 9948f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com // @name Edge AA 9951e269b5a08610da13c3aee23809bb45b17e7b663bsalomon@google.com // Edge equations can be specified to perform anti-aliasing. Because the 9967ffe6810c6787f7a353ef3fe8fab3fc6440aae19bsalomon@google.com // edges are specified as per-vertex data, vertices that are shared by 9977ffe6810c6787f7a353ef3fe8fab3fc6440aae19bsalomon@google.com // multiple edges must be split. 9988f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com // 9998f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com //// 10008f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 10018f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 10029381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com * When specifying edges as vertex data this enum specifies what type of 100381712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com * edges are in use. The edges are always 4 SkScalars in memory, even when 10049381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com * the edge type requires fewer than 4. 100593c9660cd158c5d0cab0ba4223e4257f699d5bb8bsalomon@google.com * 100693c9660cd158c5d0cab0ba4223e4257f699d5bb8bsalomon@google.com * TODO: Fix the fact that HairLine and Circle edge types use y-down coords. 100793c9660cd158c5d0cab0ba4223e4257f699d5bb8bsalomon@google.com * (either adjust in VS or use origin_upper_left in GLSL) 10089381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com */ 10099381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com enum VertexEdgeType { 10109381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com /* 1-pixel wide line 10119381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com 2D implicit line eq (a*x + b*y +c = 0). 4th component unused */ 10129381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com kHairLine_EdgeType, 1013d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com /* Quadratic specified by u^2-v canonical coords (only 2 101469cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com components used). Coverage based on signed distance with negative 101593c9660cd158c5d0cab0ba4223e4257f699d5bb8bsalomon@google.com being inside, positive outside. Edge specified in window space 101693c9660cd158c5d0cab0ba4223e4257f699d5bb8bsalomon@google.com (y-down) */ 101769cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com kQuad_EdgeType, 101869cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com /* Same as above but for hairline quadratics. Uses unsigned distance. 101969cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com Coverage is min(0, 1-distance). */ 102069cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com kHairQuad_EdgeType, 102193c9660cd158c5d0cab0ba4223e4257f699d5bb8bsalomon@google.com /* Circle specified as center_x, center_y, outer_radius, inner_radius 102293c9660cd158c5d0cab0ba4223e4257f699d5bb8bsalomon@google.com all in window space (y-down). */ 102393c9660cd158c5d0cab0ba4223e4257f699d5bb8bsalomon@google.com kCircle_EdgeType, 102446d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com /* Axis-aligned ellipse specified as center_x, center_y, x_radius, x_radius/y_radius 102546d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com all in window space (y-down). */ 102646d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com kEllipse_EdgeType, 102769cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 102869cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com kVertexEdgeTypeCnt 10299381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com }; 10309381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com 10319381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com /** 1032d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com * Determines the interpretation per-vertex edge data when the 1033b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com * kEdge_AttribBindingsBit is set (see GrDrawTarget). When per-vertex edges 10348f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * are not specified the value of this setting has no effect. 10358f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 10368f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com void setVertexEdgeType(VertexEdgeType type) { 103769cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com GrAssert(type >=0 && type < kVertexEdgeTypeCnt); 1038ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fVertexEdgeType = type; 10398f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 10408f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 1041ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com VertexEdgeType getVertexEdgeType() const { return fCommon.fVertexEdgeType; } 10428f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 10438f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @} 10448f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 10458f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 10468f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @name State Flags 10478f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com //// 10488f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 10498f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 10508f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Flags that affect rendering. Controlled using enable/disableState(). All 10518f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * default to disabled. 10528f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 10538f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com enum StateBits { 10548f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 10558f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Perform dithering. TODO: Re-evaluate whether we need this bit 10568f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 10578f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com kDither_StateBit = 0x01, 10588f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 1059cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com * Perform HW anti-aliasing. This means either HW FSAA, if supported by the render target, 1060cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com * or smooth-line rendering if a line primitive is drawn and line smoothing is supported by 1061cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com * the 3D API. 10628f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 10638f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com kHWAntialias_StateBit = 0x02, 10648f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 10658f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Draws will respect the clip, otherwise the clip is ignored. 10668f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 10678f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com kClip_StateBit = 0x04, 10688f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 10698f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Disables writing to the color buffer. Useful when performing stencil 10708f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * operations. 10718f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 10728f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com kNoColorWrites_StateBit = 0x08, 10730342a85091fd430c90a142d155dc9642aa729d9ebsalomon@google.com 1074cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com /** 1075cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com * Usually coverage is applied after color blending. The color is blended using the coeffs 1076cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com * specified by setBlendFunc(). The blended color is then combined with dst using coeffs 1077cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com * of src_coverage, 1-src_coverage. Sometimes we are explicitly drawing a coverage mask. In 1078cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com * this case there is no distinction between coverage and color and the caller needs direct 1079cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com * control over the blend coeffs. When set, there will be a single blend step controlled by 1080cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com * setBlendFunc() which will use coverage*color as the src color. 1081cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com */ 1082cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com kCoverageDrawing_StateBit = 0x10, 1083cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com 10848f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com // Users of the class may add additional bits to the vector 10858f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com kDummyStateBit, 10868f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com kLastPublicStateBit = kDummyStateBit-1, 10878f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com }; 10888f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 10898f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com void resetStateFlags() { 1090ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fFlagBits = 0; 10910fec61d19ca9088d54f58bd0a67150171b83d66cbsalomon@google.com } 10920fec61d19ca9088d54f58bd0a67150171b83d66cbsalomon@google.com 10938f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 10948f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Enable render state settings. 10958f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 10961e269b5a08610da13c3aee23809bb45b17e7b663bsalomon@google.com * @param stateBits bitfield of StateBits specifying the states to enable 10978f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 10988f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com void enableState(uint32_t stateBits) { 1099ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fFlagBits |= stateBits; 11008f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 11010fec61d19ca9088d54f58bd0a67150171b83d66cbsalomon@google.com 11028f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 11038f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Disable render state settings. 11048f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * 11051e269b5a08610da13c3aee23809bb45b17e7b663bsalomon@google.com * @param stateBits bitfield of StateBits specifying the states to disable 11068f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 11078f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com void disableState(uint32_t stateBits) { 1108ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fFlagBits &= ~(stateBits); 11098f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 11100fec61d19ca9088d54f58bd0a67150171b83d66cbsalomon@google.com 1111d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com /** 1112d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com * Enable or disable stateBits based on a boolean. 1113d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com * 11141e269b5a08610da13c3aee23809bb45b17e7b663bsalomon@google.com * @param stateBits bitfield of StateBits to enable or disable 1115d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com * @param enable if true enable stateBits, otherwise disable 1116d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com */ 1117d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com void setState(uint32_t stateBits, bool enable) { 1118d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com if (enable) { 1119d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com this->enableState(stateBits); 1120d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com } else { 1121d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com this->disableState(stateBits); 1122d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com } 1123d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com } 1124d5d69ffaea117428972db48796f7e75f0d1dab34bsalomon@google.com 11258f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com bool isDitherState() const { 1126ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com return 0 != (fCommon.fFlagBits & kDither_StateBit); 11278f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 11280fec61d19ca9088d54f58bd0a67150171b83d66cbsalomon@google.com 11298f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com bool isHWAntialiasState() const { 1130ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com return 0 != (fCommon.fFlagBits & kHWAntialias_StateBit); 11318f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 11320fec61d19ca9088d54f58bd0a67150171b83d66cbsalomon@google.com 11338f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com bool isClipState() const { 1134ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com return 0 != (fCommon.fFlagBits & kClip_StateBit); 11358f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 11360fec61d19ca9088d54f58bd0a67150171b83d66cbsalomon@google.com 11378f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com bool isColorWriteDisabled() const { 1138ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com return 0 != (fCommon.fFlagBits & kNoColorWrites_StateBit); 11398f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 11408f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 1141cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com bool isCoverageDrawing() const { 1142ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com return 0 != (fCommon.fFlagBits & kCoverageDrawing_StateBit); 1143cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com } 1144cf939ae54842fc7408ee68a41427086962b4c3dcbsalomon@google.com 11458f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com bool isStateFlagEnabled(uint32_t stateBit) const { 1146ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com return 0 != (stateBit & fCommon.fFlagBits); 11478f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 11488f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 11498f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @} 11508f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 11518f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 11528f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @name Face Culling 11538f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com //// 11548f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 11558f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com enum DrawFace { 1156978c8c61ba1e792567e9d8e6629c2c4ee59727b7bsalomon@google.com kInvalid_DrawFace = -1, 1157978c8c61ba1e792567e9d8e6629c2c4ee59727b7bsalomon@google.com 11588f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com kBoth_DrawFace, 11598f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com kCCW_DrawFace, 11608f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com kCW_DrawFace, 11618f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com }; 11628f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 11638f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 11648f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Controls whether clockwise, counterclockwise, or both faces are drawn. 11658f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * @param face the face(s) to draw. 11668f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 11678f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com void setDrawFace(DrawFace face) { 1168978c8c61ba1e792567e9d8e6629c2c4ee59727b7bsalomon@google.com GrAssert(kInvalid_DrawFace != face); 1169ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon.fDrawFace = face; 11708f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com } 11718f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 11728f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /** 11738f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * Gets whether the target is drawing clockwise, counterclockwise, 11748f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * or both faces. 11758f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com * @return the current draw face(s). 11768f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com */ 1177ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com DrawFace getDrawFace() const { return fCommon.fDrawFace; } 1178d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 11798f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /// @} 11808f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 11818f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com /////////////////////////////////////////////////////////////////////////// 118262b09687857c923b1044be0aef4dd900f8379b22tomhudson@google.com 1183f13f58804659175925042a291304d483a4fd9278tomhudson@google.com bool isStageEnabled(int s) const { 1184f13f58804659175925042a291304d483a4fd9278tomhudson@google.com GrAssert((unsigned)s < kNumStages); 118508283afc265f1153834256fc1012519813ba6b73bsalomon@google.com return (NULL != fStages[s].getEffect()); 1186f13f58804659175925042a291304d483a4fd9278tomhudson@google.com } 1187f13f58804659175925042a291304d483a4fd9278tomhudson@google.com 11889381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com bool operator ==(const GrDrawState& s) const { 1189ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com if (fRenderTarget.get() != s.fRenderTarget.get() || fCommon != s.fCommon) { 11908fe84b53a64b5d92f3aabdd8e7fc7b2ee15c0a75bsalomon@google.com return false; 11918fe84b53a64b5d92f3aabdd8e7fc7b2ee15c0a75bsalomon@google.com } 1192b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com if (fVertexAttribs.count() != s.fVertexAttribs.count()) { 1193b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com return false; 1194b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com } 1195b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com for (int i = 0; i < fVertexAttribs.count(); ++i) { 1196b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com if (fVertexAttribs[i] != s.fVertexAttribs[i]) { 1197b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com return false; 1198b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com } 1199b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com } 1200b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com for (int i = 0; i < kAttribIndexCount; ++i) { 1201b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com if ((i == kPosition_AttribIndex || 1202b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com s.fCommon.fAttribBindings & kAttribIndexMasks[i]) && 1203b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com fAttribIndices[i] != s.fAttribIndices[i]) { 1204b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com return false; 1205b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com } 1206b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com } 120762b09687857c923b1044be0aef4dd900f8379b22tomhudson@google.com for (int i = 0; i < kNumStages; i++) { 1208f2f8fc37265a6ef06897117451a3a9238287c13bbsalomon@google.com bool enabled = this->isStageEnabled(i); 1209f2f8fc37265a6ef06897117451a3a9238287c13bbsalomon@google.com if (enabled != s.isStageEnabled(i)) { 1210f2f8fc37265a6ef06897117451a3a9238287c13bbsalomon@google.com return false; 1211f2f8fc37265a6ef06897117451a3a9238287c13bbsalomon@google.com } 121208283afc265f1153834256fc1012519813ba6b73bsalomon@google.com if (enabled && this->fStages[i] != s.fStages[i]) { 121362b09687857c923b1044be0aef4dd900f8379b22tomhudson@google.com return false; 121462b09687857c923b1044be0aef4dd900f8379b22tomhudson@google.com } 121562b09687857c923b1044be0aef4dd900f8379b22tomhudson@google.com } 121662b09687857c923b1044be0aef4dd900f8379b22tomhudson@google.com return true; 12179381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com } 12189381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com bool operator !=(const GrDrawState& s) const { return !(*this == s); } 121962b09687857c923b1044be0aef4dd900f8379b22tomhudson@google.com 1220ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrDrawState& operator= (const GrDrawState& s) { 1221ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com this->setRenderTarget(s.fRenderTarget.get()); 1222ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon = s.fCommon; 1223b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com fVertexAttribs = s.fVertexAttribs; 1224b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com for (int i = 0; i < kAttribIndexCount; i++) { 1225b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com fAttribIndices[i] = s.fAttribIndices[i]; 1226b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com } 122762b09687857c923b1044be0aef4dd900f8379b22tomhudson@google.com for (int i = 0; i < kNumStages; i++) { 1228e742bf0ab19659145325ac894f7e0b78c8efbd89tomhudson@google.com if (s.isStageEnabled(i)) { 122908283afc265f1153834256fc1012519813ba6b73bsalomon@google.com this->fStages[i] = s.fStages[i]; 123062b09687857c923b1044be0aef4dd900f8379b22tomhudson@google.com } 123162b09687857c923b1044be0aef4dd900f8379b22tomhudson@google.com } 123262b09687857c923b1044be0aef4dd900f8379b22tomhudson@google.com return *this; 123362b09687857c923b1044be0aef4dd900f8379b22tomhudson@google.com } 123462b09687857c923b1044be0aef4dd900f8379b22tomhudson@google.com 123562b09687857c923b1044be0aef4dd900f8379b22tomhudson@google.comprivate: 12362e3d144dfdbc4596d33baef7396316f88f412cc8bsalomon@google.com 1237ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com /** Fields that are identical in GrDrawState and GrDrawState::DeferredState. */ 1238ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com struct CommonState { 1239ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com // These fields are roughly sorted by decreasing likelihood of being different in op== 1240ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrColor fColor; 1241b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com GrAttribBindings fAttribBindings; 1242ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com SkMatrix fViewMatrix; 1243ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrBlendCoeff fSrcBlend; 1244ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrBlendCoeff fDstBlend; 1245ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrColor fBlendConstant; 1246ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com uint32_t fFlagBits; 1247ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com VertexEdgeType fVertexEdgeType; 1248ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrStencilSettings fStencilSettings; 1249ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com int fFirstCoverageStage; 1250ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrColor fCoverage; 1251ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com SkXfermode::Mode fColorFilterMode; 1252ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrColor fColorFilterColor; 1253ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com DrawFace fDrawFace; 1254ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com bool operator== (const CommonState& other) const { 1255ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com return fColor == other.fColor && 1256b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com fAttribBindings == other.fAttribBindings && 1257ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fViewMatrix.cheapEqualTo(other.fViewMatrix) && 1258ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fSrcBlend == other.fSrcBlend && 1259ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fDstBlend == other.fDstBlend && 1260ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fBlendConstant == other.fBlendConstant && 1261ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fFlagBits == other.fFlagBits && 1262ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fVertexEdgeType == other.fVertexEdgeType && 1263ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fStencilSettings == other.fStencilSettings && 1264ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fFirstCoverageStage == other.fFirstCoverageStage && 1265ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCoverage == other.fCoverage && 1266ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fColorFilterMode == other.fColorFilterMode && 1267ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fColorFilterColor == other.fColorFilterColor && 1268ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fDrawFace == other.fDrawFace; 1269ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com } 1270ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com bool operator!= (const CommonState& other) const { return !(*this == other); } 1271ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com }; 1272ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com 1273ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com /** GrDrawState uses GrEffectStages to hold stage state which holds a ref on GrEffectRef. 1274ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com DeferredState must directly reference GrEffects, however. */ 1275ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com struct SavedEffectStage { 1276ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com SavedEffectStage() : fEffect(NULL) {} 1277ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com const GrEffect* fEffect; 1278ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrEffectStage::SavedCoordChange fCoordChange; 1279ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com }; 1280ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com 1281ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.compublic: 1282ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com /** 1283ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com * DeferredState contains all of the data of a GrDrawState but does not hold refs on GrResource 1284ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com * objects. Resources are allowed to hit zero ref count while in DeferredStates. Their internal 1285ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com * dispose mechanism returns them to the cache. This allows recycling resources through the 1286ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com * the cache while they are in a deferred draw queue. 1287ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com */ 1288ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com class DeferredState { 1289ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com public: 1290ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com DeferredState() : fRenderTarget(NULL) { 1291ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GR_DEBUGCODE(fInitialized = false;) 1292ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com } 1293ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com // TODO: Remove this when DeferredState no longer holds a ref to the RT 1294ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com ~DeferredState() { SkSafeUnref(fRenderTarget); } 1295ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com 1296ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com void saveFrom(const GrDrawState& drawState) { 1297ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fCommon = drawState.fCommon; 1298ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com // TODO: Here we will copy the GrRenderTarget pointer without taking a ref. 1299ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fRenderTarget = drawState.fRenderTarget.get(); 1300ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com SkSafeRef(fRenderTarget); 1301b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com fVertexAttribs = drawState.fVertexAttribs; 1302b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com for (int i = 0; i < kAttribIndexCount; i++) { 1303b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com fAttribIndices[i] = drawState.fAttribIndices[i]; 1304b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com } 1305ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com // Here we ref the effects directly rather than the effect-refs. TODO: When the effect- 1306ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com // ref gets fully unref'ed it will cause the underlying effect to unref its resources 1307ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com // and recycle them to the cache (if no one else is holding a ref to the resources). 1308ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com for (int i = 0; i < kNumStages; ++i) { 1309ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fStages[i].saveFrom(drawState.fStages[i]); 1310ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com } 1311ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GR_DEBUGCODE(fInitialized = true;) 1312ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com } 1313ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com 1314ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com void restoreTo(GrDrawState* drawState) { 1315ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GrAssert(fInitialized); 1316ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com drawState->fCommon = fCommon; 1317ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com drawState->setRenderTarget(fRenderTarget); 1318b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com drawState->fVertexAttribs = fVertexAttribs; 1319b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com for (int i = 0; i < kAttribIndexCount; i++) { 1320b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com drawState->fAttribIndices[i] = fAttribIndices[i]; 1321b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com } 1322ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com for (int i = 0; i < kNumStages; ++i) { 1323ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com fStages[i].restoreTo(&drawState->fStages[i]); 1324ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com } 1325ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com } 1326ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com 1327ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com bool isEqual(const GrDrawState& state) const { 1328ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com if (fRenderTarget != state.fRenderTarget.get() || fCommon != state.fCommon) { 1329ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com return false; 1330ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com } 1331b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com for (int i = 0; i < kAttribIndexCount; ++i) { 1332b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com if ((i == kPosition_AttribIndex || 1333b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com state.fCommon.fAttribBindings & kAttribIndexMasks[i]) && 1334b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com fAttribIndices[i] != state.fAttribIndices[i]) { 1335b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com return false; 1336b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com } 1337b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com } 1338b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com if (fVertexAttribs.count() != state.fVertexAttribs.count()) { 1339b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com return false; 1340b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com } 1341b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com for (int i = 0; i < fVertexAttribs.count(); ++i) 1342b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com if (fVertexAttribs[i] != state.fVertexAttribs[i]) { 1343b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com return false; 1344b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com } 1345ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com for (int i = 0; i < kNumStages; ++i) { 1346dcd69bfca1d8e85ef5abc4e54f1e4b820d38e428bsalomon@google.com if (!fStages[i].isEqual(state.fStages[i])) { 1347ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com return false; 1348ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com } 1349ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com } 1350ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com return true; 1351ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com } 1352ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com 1353ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com private: 1354b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com GrRenderTarget* fRenderTarget; 1355b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com CommonState fCommon; 1356b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com int fAttribIndices[kAttribIndexCount]; 1357b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com GrVertexAttribArray<kVertexAttribCnt> fVertexAttribs; 1358b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com GrEffectStage::DeferredStage fStages[kNumStages]; 1359ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com 1360ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com GR_DEBUGCODE(bool fInitialized;) 1361ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com }; 1362ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.com 1363ca43208e4aaac817fbc8265542f995f24a3fb7bfbsalomon@google.comprivate: 1364b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com // helper array to let us check the current bindings so we know what bound attrib indices 1365b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com // we care about 1366b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com static const GrAttribBindings kAttribIndexMasks[kAttribIndexCount]; 1367b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com 1368b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com SkAutoTUnref<GrRenderTarget> fRenderTarget; 1369b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com CommonState fCommon; 1370b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com int fAttribIndices[kAttribIndexCount]; 1371b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com GrVertexAttribArray<kVertexAttribCnt> fVertexAttribs; 1372b8b705b1b983a2ee3a254bed4dd03f926101e4e7jvanverth@google.com GrEffectStage fStages[kNumStages]; 13738f9cbd62ec108d410b91155dcf6a4789c641246fbsalomon@google.com 1374fa35e3ddcc9d130ce87c927218bdf27879c38711reed@google.com typedef GrRefCnt INHERITED; 13759381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com}; 13769381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com 13772b446734cfa8201e5478648988de86b646cb9544bsalomon@google.comGR_MAKE_BITFIELD_OPS(GrDrawState::BlendOptFlags); 13782b446734cfa8201e5478648988de86b646cb9544bsalomon@google.com 13799381363050ec9d3e724076a8e9152bfa9a8de1d1tomhudson@google.com#endif 1380