Index: src/effects/SkDisplacementMapEffect.cpp |
diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp |
index 0a045f2192270dc490d6cd74a3cfb3f06bfcf3e3..85ea3401a1bc1255e34f73cf9577aec11d9ef276 100644 |
--- a/src/effects/SkDisplacementMapEffect.cpp |
+++ b/src/effects/SkDisplacementMapEffect.cpp |
@@ -14,6 +14,7 @@ |
#include "GrContext.h" |
#include "GrCoordTransform.h" |
#include "GrInvariantOutput.h" |
+#include "effects/GrTextureDomain.h" |
#include "gl/GrGLProcessor.h" |
#include "gl/builders/GrGLProgramBuilder.h" |
#endif |
@@ -314,11 +315,13 @@ public: |
static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKeyBuilder*); |
void setData(const GrGLProgramDataManager&, const GrProcessor&) override; |
+ const GrTextureDomain::GLDomain& glDomain() const { return fGLDomain; } |
private: |
SkDisplacementMapEffect::ChannelSelectorType fXChannelSelector; |
SkDisplacementMapEffect::ChannelSelectorType fYChannelSelector; |
GrGLProgramDataManager::UniformHandle fScaleUni; |
+ GrTextureDomain::GLDomain fGLDomain; |
typedef GrGLFragmentProcessor INHERITED; |
}; |
@@ -330,13 +333,15 @@ public: |
static GrFragmentProcessor* Create( |
SkDisplacementMapEffect::ChannelSelectorType xChannelSelector, |
SkDisplacementMapEffect::ChannelSelectorType yChannelSelector, SkVector scale, |
- GrTexture* displacement, const SkMatrix& offsetMatrix, GrTexture* color) { |
+ GrTexture* displacement, const SkMatrix& offsetMatrix, GrTexture* color, |
+ const SkISize& colorDimensions) { |
return SkNEW_ARGS(GrDisplacementMapEffect, (xChannelSelector, |
yChannelSelector, |
scale, |
displacement, |
offsetMatrix, |
- color)); |
+ color, |
+ colorDimensions)); |
} |
virtual ~GrDisplacementMapEffect(); |
@@ -357,6 +362,7 @@ public: |
const SkVector& scale() const { return fScale; } |
const char* name() const override { return "DisplacementMap"; } |
+ const GrTextureDomain& domain() const { return fDomain; } |
private: |
bool onIsEqual(const GrFragmentProcessor&) const override; |
@@ -367,13 +373,15 @@ private: |
SkDisplacementMapEffect::ChannelSelectorType yChannelSelector, |
const SkVector& scale, |
GrTexture* displacement, const SkMatrix& offsetMatrix, |
- GrTexture* color); |
+ GrTexture* color, |
+ const SkISize& colorDimensions); |
GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
GrCoordTransform fDisplacementTransform; |
GrTextureAccess fDisplacementAccess; |
GrCoordTransform fColorTransform; |
+ GrTextureDomain fDomain; |
GrTextureAccess fColorAccess; |
SkDisplacementMapEffect::ChannelSelectorType fXChannelSelector; |
SkDisplacementMapEffect::ChannelSelectorType fYChannelSelector; |
@@ -442,7 +450,8 @@ bool SkDisplacementMapEffect::filterImageGPU(Proxy* proxy, const SkBitmap& src, |
scale, |
displacement, |
offsetMatrix, |
- color))->unref(); |
+ color, |
+ colorBM.dimensions()))->unref(); |
SkIRect colorBounds = bounds; |
colorBounds.offset(-colorOffset); |
SkMatrix matrix; |
@@ -464,11 +473,14 @@ GrDisplacementMapEffect::GrDisplacementMapEffect( |
const SkVector& scale, |
GrTexture* displacement, |
const SkMatrix& offsetMatrix, |
- GrTexture* color) |
+ GrTexture* color, |
+ const SkISize& colorDimensions) |
: fDisplacementTransform(kLocal_GrCoordSet, offsetMatrix, displacement, |
GrTextureParams::kNone_FilterMode) |
, fDisplacementAccess(displacement) |
, fColorTransform(kLocal_GrCoordSet, color, GrTextureParams::kNone_FilterMode) |
+ , fDomain(GrTextureDomain::MakeTexelDomain(color, SkIRect::MakeSize(colorDimensions)), |
+ GrTextureDomain::kDecal_Mode) |
, fColorAccess(color) |
, fXChannelSelector(xChannelSelector) |
, fYChannelSelector(yChannelSelector) |
@@ -520,10 +532,12 @@ GrFragmentProcessor* GrDisplacementMapEffect::TestCreate(SkRandom* random, |
random->nextRangeU(1, kMaxComponent)); |
SkVector scale = SkVector::Make(random->nextRangeScalar(0, 100.0f), |
random->nextRangeScalar(0, 100.0f)); |
- |
+ SkISize colorDimensions; |
+ colorDimensions.fWidth = random->nextRangeU(0, textures[texIdxColor]->width()); |
+ colorDimensions.fHeight = random->nextRangeU(0, textures[texIdxColor]->height()); |
return GrDisplacementMapEffect::Create(xChannelSelector, yChannelSelector, scale, |
textures[texIdxDispl], SkMatrix::I(), |
- textures[texIdxColor]); |
+ textures[texIdxColor], colorDimensions); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -537,11 +551,12 @@ GrGLDisplacementMapEffect::~GrGLDisplacementMapEffect() { |
} |
void GrGLDisplacementMapEffect::emitCode(GrGLFPBuilder* builder, |
- const GrFragmentProcessor&, |
+ const GrFragmentProcessor& fp, |
const char* outputColor, |
const char* inputColor, |
const TransformedCoordsArray& coords, |
const TextureSamplerArray& samplers) { |
+ const GrTextureDomain& domain = fp.cast<GrDisplacementMapEffect>().domain(); |
sk_ignore_unused_variable(inputColor); |
fScaleUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
@@ -549,7 +564,6 @@ void GrGLDisplacementMapEffect::emitCode(GrGLFPBuilder* builder, |
const char* scaleUni = builder->getUniformCStr(fScaleUni); |
const char* dColor = "dColor"; |
const char* cCoords = "cCoords"; |
- const char* outOfBounds = "outOfBounds"; |
const char* nearZero = "1e-6"; // Since 6.10352e−5 is the smallest half float, use |
// a number smaller than that to approximate 0, but |
// leave room for 32-bit float GPU rounding errors. |
@@ -603,15 +617,7 @@ void GrGLDisplacementMapEffect::emitCode(GrGLFPBuilder* builder, |
} |
fsBuilder->codeAppend("-vec2(0.5));\t\t"); |
- // FIXME : This can be achieved with a "clamp to border" texture repeat mode and |
- // a 0 border color instead of computing if cCoords is out of bounds here. |
- fsBuilder->codeAppendf( |
- "bool %s = (%s.x < 0.0) || (%s.y < 0.0) || (%s.x > 1.0) || (%s.y > 1.0);\t\t", |
- outOfBounds, cCoords, cCoords, cCoords, cCoords); |
- fsBuilder->codeAppendf("%s = %s ? vec4(0.0) : ", outputColor, outOfBounds); |
- |
- // cCoords is always a vec2f |
- fsBuilder->appendTextureLookup(samplers[1], cCoords, kVec2f_GrSLType); |
+ fGLDomain.sampleTexture(fsBuilder, domain, outputColor, SkString(cCoords), samplers[1]); |
fsBuilder->codeAppend(";\n"); |
} |
@@ -624,6 +630,7 @@ void GrGLDisplacementMapEffect::setData(const GrGLProgramDataManager& pdman, |
pdman.set2f(fScaleUni, SkScalarToFloat(scaleX), |
colorTex->origin() == kTopLeft_GrSurfaceOrigin ? |
SkScalarToFloat(scaleY) : SkScalarToFloat(-scaleY)); |
+ fGLDomain.setData(pdman, displacementMap.domain(), colorTex->origin()); |
} |
void GrGLDisplacementMapEffect::GenKey(const GrProcessor& proc, |