diff options
author | Brian Salomon <bsalomon@google.com> | 2017-12-15 11:41:09 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-12-15 17:06:08 +0000 |
commit | 0215e39d7e415d0530231df6ad20d5f215c72152 (patch) | |
tree | 91fec56dae447ceb15e1743117a8ff272c60a7c3 /src/gpu/effects/GrDistanceFieldGeoProc.h | |
parent | 29c14a760682e2c449fa043b5e8b69937cb58f3a (diff) |
Transform vertices for distance field glyphs on CPU.
This allows batching of DF draws with different view matrices.
For perspective matrices this means the transformed position vertex
attribute must have w values. Currently, non-perspective DF draws still
use 2 component positions, though this could be changed in the future.
Consequently, perspective draws can batch with other perspective draws
but not non-perspective draws.
Adds a GM to test batching and reusing the same blobs with both perspective
and non-perspective matrices.
Change-Id: I0e42c5449ebf3a5a54025dbcdec824d904d5bd9e
Reviewed-on: https://skia-review.googlesource.com/79900
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Jim Van Verth <jvanverth@google.com>
Diffstat (limited to 'src/gpu/effects/GrDistanceFieldGeoProc.h')
-rw-r--r-- | src/gpu/effects/GrDistanceFieldGeoProc.h | 66 |
1 files changed, 30 insertions, 36 deletions
diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.h b/src/gpu/effects/GrDistanceFieldGeoProc.h index a09938242f..f3fd67606b 100644 --- a/src/gpu/effects/GrDistanceFieldGeoProc.h +++ b/src/gpu/effects/GrDistanceFieldGeoProc.h @@ -19,24 +19,27 @@ class GrInvariantOutput; enum GrDistanceFieldEffectFlags { kSimilarity_DistanceFieldEffectFlag = 0x01, // ctm is similarity matrix kScaleOnly_DistanceFieldEffectFlag = 0x02, // ctm has only scale and translate - kUseLCD_DistanceFieldEffectFlag = 0x04, // use lcd text - kBGR_DistanceFieldEffectFlag = 0x08, // lcd display has bgr order - kPortrait_DistanceFieldEffectFlag = 0x10, // lcd display is in portrait mode (not used yet) - kGammaCorrect_DistanceFieldEffectFlag = 0x20, // assume gamma-correct output (linear blending) - kAliased_DistanceFieldEffectFlag = 0x40, // monochrome output + kPerspective_DistanceFieldEffectFlag = 0x04, // ctm has perspective (and positions are x,y,w) + kUseLCD_DistanceFieldEffectFlag = 0x08, // use lcd text + kBGR_DistanceFieldEffectFlag = 0x10, // lcd display has bgr order + kPortrait_DistanceFieldEffectFlag = 0x20, // lcd display is in portrait mode (not used yet) + kGammaCorrect_DistanceFieldEffectFlag = 0x40, // assume gamma-correct output (linear blending) + kAliased_DistanceFieldEffectFlag = 0x80, // monochrome output - kInvalid_DistanceFieldEffectFlag = 0x80, // invalid state (for initialization) + kInvalid_DistanceFieldEffectFlag = 0x100, // invalid state (for initialization) kUniformScale_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag | kScaleOnly_DistanceFieldEffectFlag, // The subset of the flags relevant to GrDistanceFieldA8TextGeoProc kNonLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag | kScaleOnly_DistanceFieldEffectFlag | + kPerspective_DistanceFieldEffectFlag | kGammaCorrect_DistanceFieldEffectFlag | kAliased_DistanceFieldEffectFlag, // The subset of the flags relevant to GrDistanceFieldLCDTextGeoProc kLCD_DistanceFieldEffectMask = kSimilarity_DistanceFieldEffectFlag | kScaleOnly_DistanceFieldEffectFlag | + kPerspective_DistanceFieldEffectFlag | kUseLCD_DistanceFieldEffectFlag | kBGR_DistanceFieldEffectFlag | kGammaCorrect_DistanceFieldEffectFlag, @@ -52,23 +55,22 @@ class GrDistanceFieldA8TextGeoProc : public GrGeometryProcessor { public: static constexpr int kMaxTextures = 4; + /** The local matrix should be identity if local coords are not required by the GrPipeline. */ #ifdef SK_GAMMA_APPLY_TO_A8 - static sk_sp<GrGeometryProcessor> Make(GrColor color, const SkMatrix& viewMatrix, + static sk_sp<GrGeometryProcessor> Make(GrColor color, const sk_sp<GrTextureProxy> proxies[kMaxTextures], const GrSamplerState& params, float lum, uint32_t flags, - bool usesLocalCoords) { - return sk_sp<GrGeometryProcessor>( - new GrDistanceFieldA8TextGeoProc(color, viewMatrix, proxies, - params, lum, flags, usesLocalCoords)); + const SkMatrix& localMatrixIfUsesLocalCoords) { + return sk_sp<GrGeometryProcessor>(new GrDistanceFieldA8TextGeoProc( + color, proxies, params, lum, flags, localMatrixIfUsesLocalCoords)); } #else - static sk_sp<GrGeometryProcessor> Make(GrColor color, const SkMatrix& viewMatrix, + static sk_sp<GrGeometryProcessor> Make(GrColor color, const sk_sp<GrTextureProxy> proxies[kMaxTextures], const GrSamplerState& params, uint32_t flags, - bool usesLocalCoords) { - return sk_sp<GrGeometryProcessor>( - new GrDistanceFieldA8TextGeoProc(color, viewMatrix, proxies, - params, flags, usesLocalCoords)); + const SkMatrix& localMatrixIfUsesLocalCoords) { + return sk_sp<GrGeometryProcessor>(new GrDistanceFieldA8TextGeoProc( + color, proxies, params, flags, localMatrixIfUsesLocalCoords)); } #endif @@ -80,8 +82,7 @@ public: const Attribute* inColor() const { return fInColor; } const Attribute* inTextureCoords() const { return fInTextureCoords; } GrColor color() const { return fColor; } - const SkMatrix& viewMatrix() const { return fViewMatrix; } - bool usesLocalCoords() const { return fUsesLocalCoords; } + const SkMatrix& localMatrix() const { return fLocalMatrix; } #ifdef SK_GAMMA_APPLY_TO_A8 float getDistanceAdjust() const { return fDistanceAdjust; } #endif @@ -94,16 +95,14 @@ public: GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override; private: - GrDistanceFieldA8TextGeoProc(GrColor, const SkMatrix& viewMatrix, - const sk_sp<GrTextureProxy> proxies[kMaxTextures], + GrDistanceFieldA8TextGeoProc(GrColor, const sk_sp<GrTextureProxy> proxies[kMaxTextures], const GrSamplerState& params, #ifdef SK_GAMMA_APPLY_TO_A8 float distanceAdjust, #endif - uint32_t flags, bool usesLocalCoords); + uint32_t flags, const SkMatrix& localMatrix); GrColor fColor; - SkMatrix fViewMatrix; TextureSampler fTextureSamplers[kMaxTextures]; #ifdef SK_GAMMA_APPLY_TO_A8 float fDistanceAdjust; @@ -112,7 +111,7 @@ private: const Attribute* fInPosition; const Attribute* fInColor; const Attribute* fInTextureCoords; - bool fUsesLocalCoords; + SkMatrix fLocalMatrix; GR_DECLARE_GEOMETRY_PROCESSOR_TEST @@ -129,6 +128,7 @@ class GrDistanceFieldPathGeoProc : public GrGeometryProcessor { public: static constexpr int kMaxTextures = 4; + /** The local matrix should be identity if local coords are not required by the GrPipeline. */ static sk_sp<GrGeometryProcessor> Make(GrColor color, const SkMatrix& matrix, const sk_sp<GrTextureProxy> proxies[kMaxTextures], const GrSamplerState& params, uint32_t flags) { @@ -197,16 +197,13 @@ public: static constexpr int kMaxTextures = 4; static sk_sp<GrGeometryProcessor> Make(GrColor color, - const SkMatrix& viewMatrix, const sk_sp<GrTextureProxy> proxies[kMaxTextures], const GrSamplerState& params, DistanceAdjust distanceAdjust, uint32_t flags, - bool usesLocalCoords) { - return sk_sp<GrGeometryProcessor>( - new GrDistanceFieldLCDTextGeoProc(color, viewMatrix, proxies, - params, distanceAdjust, - flags, usesLocalCoords)); + const SkMatrix& localMatrixIfUsesLocalCoords) { + return sk_sp<GrGeometryProcessor>(new GrDistanceFieldLCDTextGeoProc( + color, proxies, params, distanceAdjust, flags, localMatrixIfUsesLocalCoords)); } ~GrDistanceFieldLCDTextGeoProc() override {} @@ -218,9 +215,8 @@ public: const Attribute* inTextureCoords() const { return fInTextureCoords; } DistanceAdjust getDistanceAdjust() const { return fDistanceAdjust; } GrColor color() const { return fColor; } - const SkMatrix& viewMatrix() const { return fViewMatrix; } uint32_t getFlags() const { return fFlags; } - bool usesLocalCoords() const { return fUsesLocalCoords; } + const SkMatrix& localMatrix() const { return fLocalMatrix; } void addNewProxies(const sk_sp<GrTextureProxy> proxies[kMaxTextures], const GrSamplerState& p); @@ -229,20 +225,18 @@ public: GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override; private: - GrDistanceFieldLCDTextGeoProc(GrColor, const SkMatrix& viewMatrix, - const sk_sp<GrTextureProxy> proxies[kMaxTextures], + GrDistanceFieldLCDTextGeoProc(GrColor, const sk_sp<GrTextureProxy> proxies[kMaxTextures], const GrSamplerState& params, DistanceAdjust wa, uint32_t flags, - bool usesLocalCoords); + const SkMatrix& localMatrix); GrColor fColor; - SkMatrix fViewMatrix; TextureSampler fTextureSamplers[kMaxTextures]; DistanceAdjust fDistanceAdjust; uint32_t fFlags; const Attribute* fInPosition; const Attribute* fInColor; const Attribute* fInTextureCoords; - bool fUsesLocalCoords; + const SkMatrix fLocalMatrix; GR_DECLARE_GEOMETRY_PROCESSOR_TEST |