aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/effects/GrDistanceFieldGeoProc.cpp
diff options
context:
space:
mode:
authorGravatar Jim Van Verth <jvanverth@google.com>2017-09-07 14:48:04 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-09-08 14:17:53 +0000
commit7f754260f7fc2ae0326a072dd2f0429e584f8ca0 (patch)
tree7df7a94cdf828e3832723c6756c3faceab82d9ca /src/gpu/effects/GrDistanceFieldGeoProc.cpp
parent7231c50f9c21cb13f428efe2a3bdbcf29543799a (diff)
Add multitexture support to text and path shaders
This does not add additional textures to the atlases, just adds the ability to access those textures in the shaders. Bug: skia:3550 Change-Id: I636b329a6f748b6753f5f92a70066fb412623df2 Reviewed-on: https://skia-review.googlesource.com/43000 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Jim Van Verth <jvanverth@google.com>
Diffstat (limited to 'src/gpu/effects/GrDistanceFieldGeoProc.cpp')
-rw-r--r--src/gpu/effects/GrDistanceFieldGeoProc.cpp97
1 files changed, 40 insertions, 57 deletions
diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.cpp b/src/gpu/effects/GrDistanceFieldGeoProc.cpp
index 81b33262da..b8f0386820 100644
--- a/src/gpu/effects/GrDistanceFieldGeoProc.cpp
+++ b/src/gpu/effects/GrDistanceFieldGeoProc.cpp
@@ -7,6 +7,7 @@
#include "GrDistanceFieldGeoProc.h"
+#include "GrAtlasedShaderHelpers.h"
#include "GrTexture.h"
#include "SkDistanceFieldGen.h"
#include "glsl/GrGLSLFragmentShaderBuilder.h"
@@ -78,17 +79,10 @@ public:
// add varyings
GrGLSLVertToFrag uv(kVec2f_GrSLType);
- varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision);
- vertBuilder->codeAppendf("%s = float2(%s.x, %s.y) * %s;", uv.vsOut(),
- dfTexEffect.inTextureCoords()->fName,
- dfTexEffect.inTextureCoords()->fName,
- atlasSizeInvName);
-
GrGLSLVertToFrag st(kVec2f_GrSLType);
- varyingHandler->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision);
- vertBuilder->codeAppendf("%s = float2(%s.x, %s.y);", st.vsOut(),
- dfTexEffect.inTextureCoords()->fName,
- dfTexEffect.inTextureCoords()->fName);
+ GrGLSLVertToFrag texIdx(kFloat_GrSLType);
+ append_index_uv_varyings(args, dfTexEffect.inTextureCoords()->fName, atlasSizeInvName,
+ &uv, &st, &texIdx);
bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFieldEffectMask) ==
kUniformScale_DistanceFieldEffectMask;
@@ -100,12 +94,12 @@ public:
// Use highp to work around aliasing issues
fragBuilder->codeAppendf("highp float2 uv = %s;\n", uv.fsIn());
+ fragBuilder->codeAppend("float4 texColor;");
+ append_multitexture_lookup(args, dfTexEffect.numTextureSamplers(),
+ texIdx, "uv", "texColor");
- fragBuilder->codeAppend("float texColor = ");
- fragBuilder->appendTextureLookup(args.fTexSamplers[0], "uv", kVec2f_GrSLType);
- fragBuilder->codeAppend(".r;");
fragBuilder->codeAppend("float distance = "
- SK_DistanceFieldMultiplier "*(texColor - " SK_DistanceFieldThreshold ");");
+ SK_DistanceFieldMultiplier "*(texColor.r - " SK_DistanceFieldThreshold ");");
#ifdef SK_GAMMA_APPLY_TO_A8
// adjust width based on gamma
fragBuilder->codeAppendf("distance -= %s;", distanceAdjustUniName);
@@ -197,7 +191,7 @@ public:
pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
}
- SkASSERT(dfa8gp.numTextureSamplers() == 1);
+ SkASSERT(dfa8gp.numTextureSamplers() >= 1);
GrTexture* atlas = dfa8gp.textureSampler(0).peekTexture();
SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height()));
@@ -216,6 +210,7 @@ public:
uint32_t key = dfTexEffect.getFlags();
key |= ComputePosKey(dfTexEffect.viewMatrix()) << 16;
b->add32(key);
+ b->add32(dfTexEffect.numTextureSamplers());
}
private:
@@ -332,17 +327,10 @@ public:
&atlasSizeInvName);
GrGLSLVertToFrag uv(kVec2f_GrSLType);
- varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision);
- vertBuilder->codeAppendf("%s = float2(%s.x, %s.y) * %s;", uv.vsOut(),
- dfTexEffect.inTextureCoords()->fName,
- dfTexEffect.inTextureCoords()->fName,
- atlasSizeInvName);
-
GrGLSLVertToFrag st(kVec2f_GrSLType);
- varyingHandler->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision);
- vertBuilder->codeAppendf("%s = float2(%s.x, %s.y);", st.vsOut(),
- dfTexEffect.inTextureCoords()->fName,
- dfTexEffect.inTextureCoords()->fName);
+ GrGLSLVertToFrag texIdx(kFloat_GrSLType);
+ append_index_uv_varyings(args, dfTexEffect.inTextureCoords()->fName, atlasSizeInvName,
+ &uv, &st, &texIdx);
// setup pass through color
varyingHandler->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutputColor);
@@ -365,12 +353,12 @@ public:
// Use highp to work around aliasing issues
fragBuilder->codeAppendf("highp float2 uv = %s;", uv.fsIn());
+ fragBuilder->codeAppend("float4 texColor;");
+ append_multitexture_lookup(args, dfTexEffect.numTextureSamplers(),
+ texIdx, "uv", "texColor");
- fragBuilder->codeAppend("float texColor = ");
- fragBuilder->appendTextureLookup(args.fTexSamplers[0], "uv", kVec2f_GrSLType);
- fragBuilder->codeAppend(".r;");
fragBuilder->codeAppend("float distance = "
- SK_DistanceFieldMultiplier "*(texColor - " SK_DistanceFieldThreshold ");");
+ SK_DistanceFieldMultiplier "*(texColor.r - " SK_DistanceFieldThreshold ");");
fragBuilder->codeAppend("float afwidth;");
bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFieldEffectMask) ==
@@ -452,7 +440,7 @@ public:
pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
}
- SkASSERT(dfpgp.numTextureSamplers() == 1);
+ SkASSERT(dfpgp.numTextureSamplers() >= 1);
GrTexture* atlas = dfpgp.textureSampler(0).peekTexture();
SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height()));
@@ -472,6 +460,7 @@ public:
uint32_t key = dfTexEffect.getFlags();
key |= ComputePosKey(dfTexEffect.viewMatrix()) << 16;
b->add32(key);
+ b->add32(dfTexEffect.numTextureSamplers());
}
private:
@@ -599,17 +588,10 @@ public:
// set up varyings
GrGLSLVertToFrag uv(kVec2f_GrSLType);
- varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision);
- vertBuilder->codeAppendf("%s = float2(%s.x, %s.y) * %s;", uv.vsOut(),
- dfTexEffect.inTextureCoords()->fName,
- dfTexEffect.inTextureCoords()->fName,
- atlasSizeInvName);
-
GrGLSLVertToFrag st(kVec2f_GrSLType);
- varyingHandler->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision);
- vertBuilder->codeAppendf("%s = float2(%s.x, %s.y);", st.vsOut(),
- dfTexEffect.inTextureCoords()->fName,
- dfTexEffect.inTextureCoords()->fName);
+ GrGLSLVertToFrag texIdx(kFloat_GrSLType);
+ append_index_uv_varyings(args, dfTexEffect.inTextureCoords()->fName, atlasSizeInvName,
+ &uv, &st, &texIdx);
GrGLSLVertToFrag delta(kFloat_GrSLType);
varyingHandler->addVarying("Delta", &delta, kHigh_GrSLPrecision);
@@ -660,26 +642,26 @@ public:
fragBuilder->codeAppendf("float2 offset = %s*Jdx;", delta.fsIn());
}
+ // sample the texture by index
+ fragBuilder->codeAppend("float4 texColor;");
+ append_multitexture_lookup(args, dfTexEffect.numTextureSamplers(),
+ texIdx, "uv", "texColor");
+
// green is distance to uv center
- fragBuilder->codeAppend("\tfloat4 texColor = ");
- fragBuilder->appendTextureLookup(args.fTexSamplers[0], "uv", kVec2f_GrSLType);
- fragBuilder->codeAppend(";\n");
- fragBuilder->codeAppend("\tfloat3 distance;\n");
- fragBuilder->codeAppend("\tdistance.y = texColor.r;\n");
+ fragBuilder->codeAppend("float3 distance;");
+ fragBuilder->codeAppend("distance.y = texColor.r;");
// red is distance to left offset
- fragBuilder->codeAppend("\tfloat2 uv_adjusted = uv - offset;\n");
- fragBuilder->codeAppend("\ttexColor = ");
- fragBuilder->appendTextureLookup(args.fTexSamplers[0], "uv_adjusted", kVec2f_GrSLType);
- fragBuilder->codeAppend(";\n");
- fragBuilder->codeAppend("\tdistance.x = texColor.r;\n");
+ fragBuilder->codeAppend("float2 uv_adjusted = uv - offset;");
+ append_multitexture_lookup(args, dfTexEffect.numTextureSamplers(),
+ texIdx, "uv_adjusted", "texColor");
+ fragBuilder->codeAppend("distance.x = texColor.r;");
// blue is distance to right offset
- fragBuilder->codeAppend("\tuv_adjusted = uv + offset;\n");
- fragBuilder->codeAppend("\ttexColor = ");
- fragBuilder->appendTextureLookup(args.fTexSamplers[0], "uv_adjusted", kVec2f_GrSLType);
- fragBuilder->codeAppend(";\n");
- fragBuilder->codeAppend("\tdistance.z = texColor.r;\n");
+ fragBuilder->codeAppend("uv_adjusted = uv + offset;");
+ append_multitexture_lookup(args, dfTexEffect.numTextureSamplers(),
+ texIdx, "uv_adjusted", "texColor");
+ fragBuilder->codeAppend("distance.z = texColor.r;");
- fragBuilder->codeAppend("\tdistance = "
+ fragBuilder->codeAppend("distance = "
"float3(" SK_DistanceFieldMultiplier ")*(distance - float3(" SK_DistanceFieldThreshold"));");
// adjust width based on gamma
@@ -757,7 +739,7 @@ public:
pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
}
- SkASSERT(dflcd.numTextureSamplers() == 1);
+ SkASSERT(dflcd.numTextureSamplers() >= 1);
GrTexture* atlas = dflcd.textureSampler(0).peekTexture();
SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height()));
@@ -777,6 +759,7 @@ public:
uint32_t key = dfTexEffect.getFlags();
key |= ComputePosKey(dfTexEffect.viewMatrix()) << 16;
b->add32(key);
+ b->add32(dfTexEffect.numTextureSamplers());
}
private: