Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(287)

Unified Diff: src/gpu/effects/GrSimpleTextureEffect.cpp

Issue 12531015: Adds local coords to GrEffect system. (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/effects/GrSimpleTextureEffect.h ('k') | src/gpu/effects/GrSingleTextureEffect.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/effects/GrSimpleTextureEffect.cpp
===================================================================
--- src/gpu/effects/GrSimpleTextureEffect.cpp (revision 8241)
+++ src/gpu/effects/GrSimpleTextureEffect.cpp (working copy)
@@ -15,41 +15,69 @@
class GrGLSimpleTextureEffect : public GrGLEffect {
public:
- GrGLSimpleTextureEffect(const GrBackendEffectFactory& factory, const GrEffectRef&)
- : INHERITED (factory) {}
+ GrGLSimpleTextureEffect(const GrBackendEffectFactory& factory, const GrDrawEffect& drawEffect)
+ : INHERITED (factory) {
+ GrEffect::CoordsType coordsType =
+ drawEffect.castEffect<GrSimpleTextureEffect>().coordsType();
+ if (GrEffect::kCustom_CoordsType != coordsType) {
+ SkNEW_IN_TLAZY(&fEffectMatrix, GrGLEffectMatrix, (coordsType));
+ }
+ }
virtual void emitCode(GrGLShaderBuilder* builder,
- const GrEffectStage&,
+ const GrDrawEffect& drawEffect,
EffectKey key,
- const char* vertexCoords,
const char* outputColor,
const char* inputColor,
const TextureSamplerArray& samplers) SK_OVERRIDE {
- const char* coordName;
- GrSLType coordType = fEffectMatrix.emitCode(builder, key, vertexCoords, &coordName);
+ const GrSimpleTextureEffect& ste = drawEffect.castEffect<GrSimpleTextureEffect>();
+ const char* fsCoordName;
+ GrSLType fsCoordSLType;
+ if (GrEffect::kCustom_CoordsType == ste.coordsType()) {
+ GrAssert(ste.getMatrix().isIdentity());
+ GrAssert(1 == ste.numVertexAttribs());
+ fsCoordSLType = kVec2f_GrSLType;
+ const char* vsVaryingName;
+ builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsVaryingName, &fsCoordName);
+ const char* attrName =
+ builder->getEffectAttributeName(drawEffect.getVertexAttribIndices()[0])->c_str();
+ builder->vsCodeAppendf("\t%s = %s;", vsVaryingName, attrName);
+ } else {
+ fsCoordSLType = fEffectMatrix.get()->emitCode(builder, key, &fsCoordName);
+ }
builder->fsCodeAppendf("\t%s = ", outputColor);
builder->appendTextureLookupAndModulate(GrGLShaderBuilder::kFragment_ShaderType,
inputColor,
samplers[0],
- coordName,
- coordType);
+ fsCoordName,
+ fsCoordSLType);
builder->fsCodeAppend(";\n");
}
- static inline EffectKey GenKey(const GrEffectStage& stage, const GrGLCaps&) {
- const GrSimpleTextureEffect& ste = GetEffectFromStage<GrSimpleTextureEffect>(stage);
- return GrGLEffectMatrix::GenKey(ste.getMatrix(),
- stage.getCoordChangeMatrix(),
- ste.texture(0));
+ static inline EffectKey GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&) {
+ const GrSimpleTextureEffect& ste = drawEffect.castEffect<GrSimpleTextureEffect>();
+ if (GrEffect::kCustom_CoordsType == ste.coordsType()) {
+ return 1 << GrGLEffectMatrix::kKeyBits;
+ } else {
+ return GrGLEffectMatrix::GenKey(ste.getMatrix(),
+ drawEffect,
+ ste.coordsType(),
+ ste.texture(0));
+ }
}
- virtual void setData(const GrGLUniformManager& uman, const GrEffectStage& stage) SK_OVERRIDE {
- const GrSimpleTextureEffect& ste = GetEffectFromStage<GrSimpleTextureEffect>(stage);
- fEffectMatrix.setData(uman, ste.getMatrix(), stage.getCoordChangeMatrix(), ste.texture(0));
+ virtual void setData(const GrGLUniformManager& uman,
+ const GrDrawEffect& drawEffect) SK_OVERRIDE {
+ const GrSimpleTextureEffect& ste = drawEffect.castEffect<GrSimpleTextureEffect>();
+ if (GrEffect::kCustom_CoordsType == ste.coordsType()) {
+ GrAssert(ste.getMatrix().isIdentity());
+ } else {
+ fEffectMatrix.get()->setData(uman, ste.getMatrix(), drawEffect, ste.texture(0));
+ }
}
private:
- GrGLEffectMatrix fEffectMatrix;
+ SkTLazy<GrGLEffectMatrix> fEffectMatrix;
typedef GrGLEffect INHERITED;
};
@@ -72,6 +100,28 @@
GrTexture* textures[]) {
int texIdx = random->nextBool() ? GrEffectUnitTest::kSkiaPMTextureIdx :
GrEffectUnitTest::kAlphaTextureIdx;
- const SkMatrix& matrix = GrEffectUnitTest::TestMatrix(random);
- return GrSimpleTextureEffect::Create(textures[texIdx], matrix);
+ static const SkShader::TileMode kTileModes[] = {
+ SkShader::kClamp_TileMode,
+ SkShader::kRepeat_TileMode,
+ SkShader::kMirror_TileMode,
+ };
+ SkShader::TileMode tileModes[] = {
+ kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
+ kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))],
+ };
+ GrTextureParams params(tileModes, random->nextBool());
+
+ static const CoordsType kCoordsTypes[] = {
+ kLocal_CoordsType,
+ kPosition_CoordsType,
+ kCustom_CoordsType
+ };
+ CoordsType coordsType = kCoordsTypes[random->nextULessThan(GR_ARRAY_COUNT(kCoordsTypes))];
+
+ if (kCustom_CoordsType == coordsType) {
+ return GrSimpleTextureEffect::CreateWithCustomCoords(textures[texIdx], params);
+ } else {
+ const SkMatrix& matrix = GrEffectUnitTest::TestMatrix(random);
+ return GrSimpleTextureEffect::Create(textures[texIdx], matrix);
+ }
}
« no previous file with comments | « src/gpu/effects/GrSimpleTextureEffect.h ('k') | src/gpu/effects/GrSingleTextureEffect.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698