aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-11-05 16:36:02 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-11-05 16:36:02 +0000
commitdbe49f735484f8862e378b63d0a074a301093dd0 (patch)
tree1508f66f4b524f176fe0d94b9cd0ccd1f5b549a6
parent4187a2fc71e9f72401e5314a1dca41a556096c51 (diff)
Remove default texture coords / texture matrix
Review URL: https://codereview.appspot.com/6775100 git-svn-id: http://skia.googlecode.com/svn/trunk@6293 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r--include/gpu/GrBackendEffectFactory.h1
-rw-r--r--include/gpu/GrEffectStage.h27
-rw-r--r--src/effects/SkBlendImageFilter.cpp2
-rw-r--r--src/effects/SkColorMatrixFilter.cpp5
-rw-r--r--src/effects/SkLightingImageFilter.cpp1
-rw-r--r--src/effects/SkMagnifierImageFilter.cpp1
-rw-r--r--src/effects/SkMatrixConvolutionImageFilter.cpp2
-rw-r--r--src/effects/SkMorphologyImageFilter.cpp1
-rw-r--r--src/effects/SkTableColorFilter.cpp2
-rw-r--r--src/effects/gradients/SkGradientShader.cpp1
-rw-r--r--src/gpu/SkGpuDevice.cpp4
-rw-r--r--src/gpu/effects/GrConfigConversionEffect.cpp3
-rw-r--r--src/gpu/effects/GrConvolutionEffect.cpp1
-rw-r--r--src/gpu/effects/GrSingleTextureEffect.cpp4
-rw-r--r--src/gpu/effects/GrTextureDomainEffect.cpp1
-rw-r--r--src/gpu/gl/GrGLEffect.cpp2
-rw-r--r--src/gpu/gl/GrGLEffect.h17
-rw-r--r--src/gpu/gl/GrGLProgram.cpp66
-rw-r--r--src/gpu/gl/GrGLProgram.h43
-rw-r--r--src/gpu/gl/GrGLShaderBuilder.cpp34
-rw-r--r--src/gpu/gl/GrGLShaderBuilder.h33
-rw-r--r--src/gpu/gl/GrGpuGL.h11
-rw-r--r--src/gpu/gl/GrGpuGL_program.cpp114
-rw-r--r--tests/GLProgramsTest.cpp30
24 files changed, 44 insertions, 362 deletions
diff --git a/include/gpu/GrBackendEffectFactory.h b/include/gpu/GrBackendEffectFactory.h
index f0854affa7..07467abd7d 100644
--- a/include/gpu/GrBackendEffectFactory.h
+++ b/include/gpu/GrBackendEffectFactory.h
@@ -32,6 +32,7 @@ class GrBackendEffectFactory : public GrNoncopyable {
public:
typedef uint32_t EffectKey;
enum {
+ kNoEffectKey = 0,
kEffectKeyBits = 12,
/**
* Some aspects of the generated code may be determined by the particular textures that are
diff --git a/include/gpu/GrEffectStage.h b/include/gpu/GrEffectStage.h
index f62faee530..e42f19834a 100644
--- a/include/gpu/GrEffectStage.h
+++ b/include/gpu/GrEffectStage.h
@@ -47,7 +47,7 @@ public:
return false;
}
- return fMatrix == other.fMatrix && fCoordChangeMatrix == other.fCoordChangeMatrix;
+ return fCoordChangeMatrix == other.fCoordChangeMatrix;
}
bool operator !=(const GrEffectStage& s) const { return !(*this == s); }
@@ -55,7 +55,6 @@ public:
GrEffectStage& operator =(const GrEffectStage& other) {
GrSafeAssign(fEffect, other.fEffect);
if (NULL != fEffect) {
- fMatrix = other.fMatrix;
fCoordChangeMatrix = other.fCoordChangeMatrix;
}
return *this;
@@ -101,20 +100,6 @@ public:
}
/**
- * Gets the texture matrix. This is will be removed soon and be managed by GrEffect.
- */
- const SkMatrix& getMatrix() const { return fMatrix; }
-
- /**
- * Gets the matrix to apply at draw time. This is the original texture matrix combined with
- * any coord system changes. This will be removed when the matrix is managed by GrEffect.
- */
- void getTotalMatrix(SkMatrix* matrix) const {
- *matrix = fMatrix;
- matrix->preConcat(fCoordChangeMatrix);
- }
-
- /**
* Gets the matrix representing all changes of coordinate system since the GrEffect was
* installed in the stage.
*/
@@ -127,15 +112,6 @@ public:
const GrEffect* setEffect(const GrEffect* effect) {
GrAssert(0 == fSavedCoordChangeCnt);
GrSafeAssign(fEffect, effect);
- fMatrix.reset();
- fCoordChangeMatrix.reset();
- return effect;
- }
-
- const GrEffect* setEffect(const GrEffect* effect, const SkMatrix& matrix) {
- GrAssert(0 == fSavedCoordChangeCnt);
- GrSafeAssign(fEffect, effect);
- fMatrix = matrix;
fCoordChangeMatrix.reset();
return effect;
}
@@ -144,7 +120,6 @@ public:
private:
SkMatrix fCoordChangeMatrix;
- SkMatrix fMatrix; // TODO: remove this, store in GrEffect
const GrEffect* fEffect;
GR_DEBUGCODE(mutable int fSavedCoordChangeCnt;)
diff --git a/src/effects/SkBlendImageFilter.cpp b/src/effects/SkBlendImageFilter.cpp
index 6056e611cb..1394a0a0b5 100644
--- a/src/effects/SkBlendImageFilter.cpp
+++ b/src/effects/SkBlendImageFilter.cpp
@@ -14,6 +14,7 @@
#include "SkGrPixelRef.h"
#include "gl/GrGLEffect.h"
#include "gl/GrGLEffectMatrix.h"
+#include "effects/GrSingleTextureEffect.h"
#include "GrTBackendEffectFactory.h"
#endif
@@ -246,7 +247,6 @@ GrGLBlendEffect::GrGLBlendEffect(const GrBackendEffectFactory& factory,
const GrEffect& effect)
: INHERITED(factory),
fMode(static_cast<const GrBlendEffect&>(effect).mode()) {
- fRequiresTextureMatrix = false;
}
GrGLBlendEffect::~GrGLBlendEffect() {
diff --git a/src/effects/SkColorMatrixFilter.cpp b/src/effects/SkColorMatrixFilter.cpp
index fa724cad11..435d7ee2f1 100644
--- a/src/effects/SkColorMatrixFilter.cpp
+++ b/src/effects/SkColorMatrixFilter.cpp
@@ -349,10 +349,7 @@ public:
const GrEffect& effect)
: INHERITED(factory)
, fMatrixHandle(GrGLUniformManager::kInvalidUniformHandle)
- , fVectorHandle(GrGLUniformManager::kInvalidUniformHandle) {
- // no texture
- fRequiresTextureMatrix = false;
- }
+ , fVectorHandle(GrGLUniformManager::kInvalidUniformHandle) {}
virtual void emitCode(GrGLShaderBuilder* builder,
const GrEffectStage&,
diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp
index c90f8f3250..48f16b3ff8 100644
--- a/src/effects/SkLightingImageFilter.cpp
+++ b/src/effects/SkLightingImageFilter.cpp
@@ -1067,7 +1067,6 @@ GrGLLightingEffect::GrGLLightingEffect(const GrBackendEffectFactory& factory,
, fSurfaceScaleUni(kInvalidUniformHandle) {
const GrLightingEffect& m = static_cast<const GrLightingEffect&>(effect);
fLight = m.light()->createGLLight();
- fRequiresTextureMatrix = false;
}
GrGLLightingEffect::~GrGLLightingEffect() {
diff --git a/src/effects/SkMagnifierImageFilter.cpp b/src/effects/SkMagnifierImageFilter.cpp
index 73a50be70b..8cb1030ce0 100644
--- a/src/effects/SkMagnifierImageFilter.cpp
+++ b/src/effects/SkMagnifierImageFilter.cpp
@@ -107,7 +107,6 @@ GrGLMagnifierEffect::GrGLMagnifierEffect(const GrBackendEffectFactory& factory,
, fOffsetVar(GrGLUniformManager::kInvalidUniformHandle)
, fZoomVar(GrGLUniformManager::kInvalidUniformHandle)
, fInsetVar(GrGLUniformManager::kInvalidUniformHandle) {
- fRequiresTextureMatrix = false;
}
void GrGLMagnifierEffect::emitCode(GrGLShaderBuilder* builder,
diff --git a/src/effects/SkMatrixConvolutionImageFilter.cpp b/src/effects/SkMatrixConvolutionImageFilter.cpp
index 0bca260e37..079b764b22 100644
--- a/src/effects/SkMatrixConvolutionImageFilter.cpp
+++ b/src/effects/SkMatrixConvolutionImageFilter.cpp
@@ -15,6 +15,7 @@
#if SK_SUPPORT_GPU
#include "gl/GrGLEffect.h"
#include "gl/GrGLEffectMatrix.h"
+#include "effects/GrSingleTextureEffect.h"
#include "GrTBackendEffectFactory.h"
#include "GrTexture.h"
#include "SkMatrix.h"
@@ -330,7 +331,6 @@ GrGLMatrixConvolutionEffect::GrGLMatrixConvolutionEffect(const GrBackendEffectFa
fKernelSize = m.kernelSize();
fTileMode = m.tileMode();
fConvolveAlpha = m.convolveAlpha();
- fRequiresTextureMatrix = false;
}
static void appendTextureLookup(GrGLShaderBuilder* builder,
diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp
index 897b1cdb08..a497346b88 100644
--- a/src/effects/SkMorphologyImageFilter.cpp
+++ b/src/effects/SkMorphologyImageFilter.cpp
@@ -302,7 +302,6 @@ GrGLMorphologyEffect::GrGLMorphologyEffect(const GrBackendEffectFactory& factory
const GrMorphologyEffect& m = static_cast<const GrMorphologyEffect&>(effect);
fRadius = m.radius();
fType = m.type();
- fRequiresTextureMatrix = false;
}
void GrGLMorphologyEffect::emitCode(GrGLShaderBuilder* builder,
diff --git a/src/effects/SkTableColorFilter.cpp b/src/effects/SkTableColorFilter.cpp
index c23f2a5953..0ae7e1950b 100644
--- a/src/effects/SkTableColorFilter.cpp
+++ b/src/effects/SkTableColorFilter.cpp
@@ -270,8 +270,6 @@ private:
GLColorTableEffect::GLColorTableEffect(
const GrBackendEffectFactory& factory, const GrEffect& effect)
: INHERITED(factory) {
- // texture coords are computed from the incoming color.
- fRequiresTextureMatrix = false;
}
void GLColorTableEffect::emitCode(GrGLShaderBuilder* builder,
diff --git a/src/effects/gradients/SkGradientShader.cpp b/src/effects/gradients/SkGradientShader.cpp
index 198f9a5d2f..15c751052c 100644
--- a/src/effects/gradients/SkGradientShader.cpp
+++ b/src/effects/gradients/SkGradientShader.cpp
@@ -679,7 +679,6 @@ GrGLGradientEffect::GrGLGradientEffect(const GrBackendEffectFactory& factory)
: INHERITED(factory)
, fCachedYCoord(SK_ScalarMax)
, fFSYUni(GrGLUniformManager::kInvalidUniformHandle) {
- fRequiresTextureMatrix = false;
}
GrGLGradientEffect::~GrGLGradientEffect() { }
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index fd30c54a0f..14eeace563 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -1456,10 +1456,8 @@ void apply_effect(GrContext* context,
GrContext::AutoRenderTarget art(context, dstTexture->asRenderTarget());
GrContext::AutoClip acs(context, rect);
- SkMatrix sampleM;
- sampleM.setIDiv(srcTexture->width(), srcTexture->height());
GrPaint paint;
- paint.colorStage(0)->setEffect(effect, sampleM);
+ paint.colorStage(0)->setEffect(effect);
context->drawRect(paint, rect);
}
diff --git a/src/gpu/effects/GrConfigConversionEffect.cpp b/src/gpu/effects/GrConfigConversionEffect.cpp
index a2aad29400..d42896d210 100644
--- a/src/gpu/effects/GrConfigConversionEffect.cpp
+++ b/src/gpu/effects/GrConfigConversionEffect.cpp
@@ -19,7 +19,6 @@ public:
const GrConfigConversionEffect& effect = static_cast<const GrConfigConversionEffect&>(s);
fSwapRedAndBlue = effect.swapsRedAndBlue();
fPMConversion = effect.pmConversion();
- fRequiresTextureMatrix = false;
}
virtual void emitCode(GrGLShaderBuilder* builder,
@@ -261,7 +260,7 @@ bool GrConfigConversionEffect::InstallEffect(GrTexture* texture,
// If we returned a GrConfigConversionEffect that was equivalent to a GrSingleTextureEffect
// then we may pollute our texture cache with redundant shaders. So in the case that no
// conversions were requested we instead return a GrSingleTextureEffect.
- stage->setEffect(SkNEW_ARGS(GrSingleTextureEffect, (texture, matrix)), matrix)->unref();
+ stage->setEffect(SkNEW_ARGS(GrSingleTextureEffect, (texture, matrix)))->unref();
return true;
} else {
if (kRGBA_8888_GrPixelConfig != texture->config() &&
diff --git a/src/gpu/effects/GrConvolutionEffect.cpp b/src/gpu/effects/GrConvolutionEffect.cpp
index 0ab215c126..047dc4165e 100644
--- a/src/gpu/effects/GrConvolutionEffect.cpp
+++ b/src/gpu/effects/GrConvolutionEffect.cpp
@@ -51,7 +51,6 @@ GrGLConvolutionEffect::GrGLConvolutionEffect(const GrBackendEffectFactory& facto
const GrConvolutionEffect& c =
static_cast<const GrConvolutionEffect&>(effect);
fRadius = c.radius();
- fRequiresTextureMatrix = false;
}
void GrGLConvolutionEffect::emitCode(GrGLShaderBuilder* builder,
diff --git a/src/gpu/effects/GrSingleTextureEffect.cpp b/src/gpu/effects/GrSingleTextureEffect.cpp
index 0afa18451b..05eff6b3d4 100644
--- a/src/gpu/effects/GrSingleTextureEffect.cpp
+++ b/src/gpu/effects/GrSingleTextureEffect.cpp
@@ -16,9 +16,7 @@
class GrGLSingleTextureEffect : public GrGLEffect {
public:
GrGLSingleTextureEffect(const GrBackendEffectFactory& factory, const GrEffect&)
- : INHERITED (factory) {
- fRequiresTextureMatrix = false;
- }
+ : INHERITED (factory) {}
virtual void emitCode(GrGLShaderBuilder* builder,
const GrEffectStage&,
diff --git a/src/gpu/effects/GrTextureDomainEffect.cpp b/src/gpu/effects/GrTextureDomainEffect.cpp
index 9909c3a649..f5152e6d91 100644
--- a/src/gpu/effects/GrTextureDomainEffect.cpp
+++ b/src/gpu/effects/GrTextureDomainEffect.cpp
@@ -39,7 +39,6 @@ GrGLTextureDomainEffect::GrGLTextureDomainEffect(const GrBackendEffectFactory& f
const GrEffect&)
: INHERITED(factory)
, fNameUni(GrGLUniformManager::kInvalidUniformHandle) {
- fRequiresTextureMatrix = false;
fPrevDomain[0] = SK_FloatNaN;
}
diff --git a/src/gpu/gl/GrGLEffect.cpp b/src/gpu/gl/GrGLEffect.cpp
index 5e0875b71c..0bbf1f7ccb 100644
--- a/src/gpu/gl/GrGLEffect.cpp
+++ b/src/gpu/gl/GrGLEffect.cpp
@@ -10,8 +10,6 @@
GrGLEffect::GrGLEffect(const GrBackendEffectFactory& factory)
: fFactory(factory) {
-
- fRequiresTextureMatrix = true;
}
GrGLEffect::~GrGLEffect() {
diff --git a/src/gpu/gl/GrGLEffect.h b/src/gpu/gl/GrGLEffect.h
index 0fd5722cb8..f2142c5b22 100644
--- a/src/gpu/gl/GrGLEffect.h
+++ b/src/gpu/gl/GrGLEffect.h
@@ -9,7 +9,6 @@
#define GrGLEffect_DEFINED
#include "GrBackendEffectFactory.h"
-#include "GrGLProgram.h"
#include "GrGLShaderBuilder.h"
#include "GrGLShaderVar.h"
#include "GrGLSL.h"
@@ -35,6 +34,7 @@ public:
typedef GrBackendEffectFactory::EffectKey EffectKey;
enum {
+ kNoEffectKey = GrBackendEffectFactory::kNoEffectKey,
// the number of bits in EffectKey available to GenKey
kEffectKeyBits = GrBackendEffectFactory::kEffectKeyBits,
};
@@ -54,9 +54,10 @@ public:
@param key The key that was computed by GenKey() from the generating GrEffect.
Only the bits indicated by GrBackendEffectFactory::kEffectKeyBits are
guaranteed to match the value produced by GenKey();
- @param vertexCoords A vec2 of texture coordinates in the VS, which may be altered. This will
- be removed soon and stages will be responsible for computing their own
- coords.
+ @param vertexCoords A vec2 in the VS that holds the position in local coords. This is either
+ the pre-view-matrix vertex position or if explicit per-vertex texture
+ coords are used with a stage then it is those coordinates. See
+ GrVertexLayout.
@param outputColor A predefined vec4 in the FS in which the stage should place its output
color (or coverage).
@param inputColor A vec4 that holds the input color to the stage in the FS. This may be
@@ -87,15 +88,7 @@ public:
static EffectKey GenTextureKey(const GrEffect&, const GrGLCaps&);
- bool requiresTextureMatrix() const { return fRequiresTextureMatrix; }
-
-
protected:
- // HACK: This is a temporary field that allows GrGLEffect subclasses to opt into the new
- // shader gen where a texture matrix is not automatically inserted. It defaults to true and is
- // set to false in a subclass to opt into the new behavior.
- bool fRequiresTextureMatrix;
-
const GrBackendEffectFactory& fFactory;
};
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
index 911b5e4547..0283a5ae13 100644
--- a/src/gpu/gl/GrGLProgram.cpp
+++ b/src/gpu/gl/GrGLProgram.cpp
@@ -10,7 +10,6 @@
#include "GrAllocator.h"
#include "GrEffect.h"
#include "GrGLEffect.h"
-#include "gl/GrGLShaderBuilder.h"
#include "GrGLShaderVar.h"
#include "GrBackendEffectFactory.h"
#include "SkTrace.h"
@@ -23,8 +22,6 @@ SK_DEFINE_INST_COUNT(GrGLProgram)
#define PRINT_SHADERS 0
-typedef GrGLProgram::Desc::StageDesc StageDesc;
-
#define COL_ATTR_NAME "aColor"
#define COV_ATTR_NAME "aCoverage"
#define EDGE_ATTR_NAME "aEdge"
@@ -80,9 +77,6 @@ GrGLProgram::GrGLProgram(const GrGLContextInfo& gl,
for (int s = 0; s < GrDrawState::kNumStages; ++s) {
fEffects[s] = NULL;
- fTextureMatrices[s] = SkMatrix::InvalidMatrix();
- // this is arbitrary, just initialize to something
- fTextureOrigin[s] = GrSurface::kBottomLeft_Origin;
}
this->genProgram(stages);
@@ -602,7 +596,7 @@ bool GrGLProgram::genProgram(const GrEffectStage* stages[]) {
if (needComputedColor) {
SkString outColor;
for (int s = 0; s < fDesc.fFirstCoverageStage; ++s) {
- if (fDesc.fStages[s].isEnabled()) {
+ if (GrGLEffect::kNoEffectKey != fDesc.fEffectKeys[s]) {
// create var to hold stage result
outColor = "color";
outColor.appendS32(s);
@@ -621,7 +615,7 @@ bool GrGLProgram::genProgram(const GrEffectStage* stages[]) {
builder.setCurrentStage(s);
fEffects[s] = GenStageCode(*stages[s],
- fDesc.fStages[s],
+ fDesc.fEffectKeys[s],
&fUniforms.fStages[s],
inColor.size() ? inColor.c_str() : NULL,
outColor.c_str(),
@@ -698,7 +692,7 @@ bool GrGLProgram::genProgram(const GrEffectStage* stages[]) {
SkString outCoverage;
const int& startStage = fDesc.fFirstCoverageStage;
for (int s = startStage; s < GrDrawState::kNumStages; ++s) {
- if (fDesc.fStages[s].isEnabled()) {
+ if (fDesc.fEffectKeys[s]) {
// create var to hold stage output
outCoverage = "coverage";
outCoverage.appendS32(s);
@@ -726,7 +720,7 @@ bool GrGLProgram::genProgram(const GrEffectStage* stages[]) {
}
builder.setCurrentStage(s);
fEffects[s] = GenStageCode(*stages[s],
- fDesc.fStages[s],
+ fDesc.fEffectKeys[s],
&fUniforms.fStages[s],
inCoverage.size() ? inCoverage.c_str() : NULL,
outCoverage.c_str(),
@@ -897,7 +891,7 @@ void GrGLProgram::initSamplerUniforms() {
// TODO: Move this function to GrGLShaderBuilder
GrGLEffect* GrGLProgram::GenStageCode(const GrEffectStage& stage,
- const StageDesc& desc,
+ GrGLEffect::EffectKey key,
StageUniforms* uniforms,
const char* fsInColor, // NULL means no incoming color
const char* fsOutColor,
@@ -907,51 +901,7 @@ GrGLEffect* GrGLProgram::GenStageCode(const GrEffectStage& stage,
const GrEffect* effect = stage.getEffect();
GrGLEffect* glEffect = effect->getFactory().createGLInstance(*effect);
- /// Vertex Shader Stuff
-
- const char* vertexCoords;
-
- // Has the effect not yet been updated to insert its own texture matrix if necessary.
- if (glEffect->requiresTextureMatrix()) {
- // Decide whether we need a matrix to transform texture coords and whether the varying needs
- // a perspective coord.
- const char* matName = NULL;
- GrSLType texCoordVaryingType;
- if (desc.fOptFlags & StageDesc::kIdentityMatrix_OptFlagBit) {
- texCoordVaryingType = kVec2f_GrSLType;
- } else {
- uniforms->fTextureMatrixUni = builder->addUniform(GrGLShaderBuilder::kVertex_ShaderType,
- kMat33f_GrSLType, "TexM", &matName);
- builder->getUniformVariable(uniforms->fTextureMatrixUni);
-
- if (desc.fOptFlags & StageDesc::kNoPerspective_OptFlagBit) {
- texCoordVaryingType = kVec2f_GrSLType;
- } else {
- texCoordVaryingType = kVec3f_GrSLType;
- }
- }
- const char *varyingVSName, *varyingFSName;
- builder->addVarying(texCoordVaryingType,
- "Stage",
- &varyingVSName,
- &varyingFSName);
- builder->setupTextureAccess(varyingFSName, texCoordVaryingType);
-
- if (!matName) {
- GrAssert(kVec2f_GrSLType == texCoordVaryingType);
- builder->fVSCode.appendf("\t%s = %s;\n", varyingVSName, vsInCoord);
- } else {
- // varying = texMatrix * texCoord
- builder->fVSCode.appendf("\t%s = (%s * vec3(%s, 1))%s;\n",
- varyingVSName, matName, vsInCoord,
- vector_all_coords(GrSLTypeToVecLength(texCoordVaryingType)));
- }
- vertexCoords = varyingVSName;
- } else {
- vertexCoords = vsInCoord;
- }
-
- // setup texture samplers for gl effect
+ // setup texture samplers for GL effect
int numTextures = effect->numTextures();
SkSTArray<8, GrGLShaderBuilder::TextureSampler> textureSamplers;
textureSamplers.push_back_n(numTextures);
@@ -965,8 +915,8 @@ GrGLEffect* GrGLProgram::GenStageCode(const GrEffectStage& stage,
builder->fFSCode.appendf("\t{ // %s \n", glEffect->name());
glEffect->emitCode(builder,
stage,
- desc.fEffectKey,
- vertexCoords,
+ key,
+ vsInCoord,
fsOutColor,
fsInColor,
textureSamplers);
diff --git a/src/gpu/gl/GrGLProgram.h b/src/gpu/gl/GrGLProgram.h
index bc7b3bc4a2..d385e6070e 100644
--- a/src/gpu/gl/GrGLProgram.h
+++ b/src/gpu/gl/GrGLProgram.h
@@ -10,6 +10,7 @@
#define GrGLProgram_DEFINED
#include "GrDrawState.h"
+#include "GrGLEffect.h"
#include "GrGLContextInfo.h"
#include "GrGLSL.h"
#include "GrGLTexture.h"
@@ -73,8 +74,7 @@ public:
void setData(const GrDrawState& drawState);
// Parameters that affect code generation
- // These structs should be kept compact; they are the input to an
- // expensive hash key generator.
+ // This structs should be kept compact; it is input to an expensive hash key generator.
struct Desc {
Desc() {
// since we use this as part of a key we can't have any uninitialized
@@ -87,30 +87,6 @@ public:
return reinterpret_cast<const uint32_t*>(this);
}
- struct StageDesc {
- enum OptFlagBits {
- kNoPerspective_OptFlagBit = 1 << 0,
- kIdentityMatrix_OptFlagBit = 1 << 1,
- kIsEnabled_OptFlagBit = 1 << 7
- };
-
- uint8_t fOptFlags;
-
- /** Non-zero if this stage has an effect */
- GrBackendEffectFactory::EffectKey fEffectKey;
-
- inline bool isEnabled() const {
- return SkToBool(fOptFlags & kIsEnabled_OptFlagBit);
- }
- inline void setEnabled(bool newValue) {
- if (newValue) {
- fOptFlags |= kIsEnabled_OptFlagBit;
- } else {
- fOptFlags &= ~kIsEnabled_OptFlagBit;
- }
- }
- };
-
// Specifies where the initial color comes from before the stages are applied.
enum ColorInput {
kSolidWhite_ColorInput,
@@ -137,7 +113,8 @@ public:
// stripped of bits that don't affect program generation
GrVertexLayout fVertexLayout;
- StageDesc fStages[GrDrawState::kNumStages];
+ /** Non-zero if this stage has an effect */
+ GrGLEffect::EffectKey fEffectKeys[GrDrawState::kNumStages];
// To enable experimental geometry shader code (not for use in
// production)
@@ -155,9 +132,6 @@ public:
};
GR_STATIC_ASSERT(!(sizeof(Desc) % 4));
- // for code readability
- typedef Desc::StageDesc StageDesc;
-
private:
struct StageUniforms;
@@ -175,7 +149,7 @@ private:
void genInputColor(GrGLShaderBuilder* builder, SkString* inColor);
static GrGLEffect* GenStageCode(const GrEffectStage& stage,
- const StageDesc& desc, // TODO: Eliminate this
+ GrGLEffect::EffectKey key,
StageUniforms* stageUniforms, // TODO: Eliminate this
const char* fsInColor, // NULL means no incoming color
const char* fsOutColor,
@@ -207,11 +181,7 @@ private:
const char* adjustInColor(const SkString& inColor) const;
struct StageUniforms {
- UniformHandle fTextureMatrixUni;
SkTArray<UniformHandle, true> fSamplerUniforms;
- StageUniforms() {
- fTextureMatrixUni = GrGLUniformManager::kInvalidUniformHandle;
- }
};
struct Uniforms {
@@ -249,9 +219,6 @@ private:
GrColor fCoverage;
GrColor fColorFilterColor;
int fRTHeight;
- /// When it is sent to GL, the texture matrix will be flipped if the texture origin requires.
- SkMatrix fTextureMatrices[GrDrawState::kNumStages];
- GrSurface::Origin fTextureOrigin[GrDrawState::kNumStages];
GrGLEffect* fEffects[GrDrawState::kNumStages];
diff --git a/src/gpu/gl/GrGLShaderBuilder.cpp b/src/gpu/gl/GrGLShaderBuilder.cpp
index 07cdbffb28..8239740128 100644
--- a/src/gpu/gl/GrGLShaderBuilder.cpp
+++ b/src/gpu/gl/GrGLShaderBuilder.cpp
@@ -94,49 +94,19 @@ GrGLShaderBuilder::GrGLShaderBuilder(const GrGLContextInfo& ctx, GrGLUniformMana
, fUniformManager(uniformManager)
, fCurrentStageIdx(kNonStageIdx)
, fSetupFragPosition(false)
- , fRTHeightUniform(GrGLUniformManager::kInvalidUniformHandle)
- , fTexCoordVaryingType(kVoid_GrSLType) {
+ , fRTHeightUniform(GrGLUniformManager::kInvalidUniformHandle) {
fPositionVar = &fVSAttrs.push_back();
fPositionVar->set(kVec2f_GrSLType, GrGLShaderVar::kAttribute_TypeModifier, "aPosition");
}
-void GrGLShaderBuilder::setupTextureAccess(const char* varyingFSName, GrSLType varyingType) {
- // FIXME: We don't know how the effect will manipulate the coords. So we give up on using
- // projective texturing and always give the stage 2D coords. This will be fixed when effects
- // are responsible for setting up their own tex coords / tex matrices.
- switch (varyingType) {
- case kVec2f_GrSLType:
- fDefaultTexCoordsName = varyingFSName;
- fTexCoordVaryingType = kVec2f_GrSLType;
- break;
- case kVec3f_GrSLType: {
- fDefaultTexCoordsName = "inCoord";
- GrAssert(kNonStageIdx != fCurrentStageIdx);
- fDefaultTexCoordsName.appendS32(fCurrentStageIdx);
- fTexCoordVaryingType = kVec3f_GrSLType;
- fFSCode.appendf("\t%s %s = %s.xy / %s.z;\n",
- GrGLShaderVar::TypeString(kVec2f_GrSLType),
- fDefaultTexCoordsName.c_str(),
- varyingFSName,
- varyingFSName);
- break;
- }
- default:
- GrCrash("Tex coords must either be Vec2f or Vec3f");
- }
-}
-
void GrGLShaderBuilder::appendTextureLookup(SkString* out,
const GrGLShaderBuilder::TextureSampler& sampler,
const char* coordName,
GrSLType varyingType) const {
GrAssert(NULL != sampler.textureAccess());
+ GrAssert(NULL != coordName);
- if (NULL == coordName) {
- coordName = fDefaultTexCoordsName.c_str();
- varyingType = kVec2f_GrSLType;
- }
out->appendf("%s(%s, %s)",
sample_function_name(varyingType),
this->getUniformCStr(sampler.fSamplerUniform),
diff --git a/src/gpu/gl/GrGLShaderBuilder.h b/src/gpu/gl/GrGLShaderBuilder.h
index 6fdec63e36..852079a09e 100644
--- a/src/gpu/gl/GrGLShaderBuilder.h
+++ b/src/gpu/gl/GrGLShaderBuilder.h
@@ -77,18 +77,12 @@ public:
GrGLShaderBuilder(const GrGLContextInfo&, GrGLUniformManager&);
- /** Determines whether we should use texture2D() or texture2Dproj(), and if an explicit divide
- is required for the sample coordinates, creates the new variable and emits the code to
- initialize it. This should only be called by GrGLProgram.*/
- void setupTextureAccess(const char* varyingFSName, GrSLType varyingType);
-
- /** Appends a texture sample with projection if necessary; if coordName is not
- specified, uses fSampleCoords. coordType must either be Vec2f or Vec3f. The latter is
- interpreted as projective texture coords. The vec length and swizzle order of the result
- depends on the GrTextureAccess associated with the TextureSampler. */
+ /** Appends a 2D texture sample with projection if necessary. coordType must either be Vec2f or
+ Vec3f. The latter is interpreted as projective texture coords. The vec length and swizzle
+ order of the result depends on the GrTextureAccess associated with the TextureSampler. */
void appendTextureLookup(SkString* out,
const TextureSampler&,
- const char* coordName = NULL,
+ const char* coordName,
GrSLType coordType = kVec2f_GrSLType) const;
/** Does the work of appendTextureLookup and modulates the result by modulation. The result is
@@ -98,18 +92,9 @@ public:
void appendTextureLookupAndModulate(SkString* out,
const char* modulation,
const TextureSampler&,
- const char* coordName = NULL,
+ const char* coordName,
GrSLType coordType = kVec2f_GrSLType) const;
- /** Gets the name of the default texture coords which are always kVec2f */
- const char* defaultTexCoordsName() const { return fDefaultTexCoordsName.c_str(); }
-
- /* Returns true if the texture matrix from which the default texture coords are computed has
- perspective. */
- bool defaultTextureMatrixIsPerspective() const {
- return fTexCoordVaryingType == kVec3f_GrSLType;
- }
-
/** Emits a helper function outside of main(). Currently ShaderType must be
kFragment_ShaderType. */
void emitFunction(ShaderType shader,
@@ -233,14 +218,6 @@ private:
GrGLUniformManager::UniformHandle fRTHeightUniform;
GrGLShaderVar* fPositionVar;
-
- /// Per-stage settings - only valid while we're inside GrGLProgram::genStageCode().
- //@{
- GrSLType fTexCoordVaryingType; // the type, either Vec2f or Vec3f, of the coords passed
- // as a varying from the VS to the FS.
- SkString fDefaultTexCoordsName; // the name of the default 2D coords value.
- //@}
-
};
#endif
diff --git a/src/gpu/gl/GrGpuGL.h b/src/gpu/gl/GrGpuGL.h
index 34af3fd5bb..7f74d8e65c 100644
--- a/src/gpu/gl/GrGpuGL.h
+++ b/src/gpu/gl/GrGpuGL.h
@@ -145,18 +145,10 @@ private:
const GrGLContextInfo& glContextInfo() const { return fGLContextInfo; }
- // adjusts texture matrix to account for orientation
- static void AdjustTextureMatrix(const GrTexture* texture, SkMatrix* matrix);
-
- // This helper determines if what optimizations can be applied to the matrix after any coord
- // adjustments are applied. The return is a bitfield of GrGLProgram::StageDesc::OptFlags.
- static int TextureMatrixOptFlags(const GrGLTexture* texture, const GrEffectStage& sampler);
-
static bool BlendCoeffReferencesConstant(GrBlendCoeff coeff);
// for readability of function impls
typedef GrGLProgram::Desc ProgramDesc;
- typedef ProgramDesc::StageDesc StageDesc;
class ProgramCache : public ::GrNoncopyable {
public:
@@ -214,9 +206,6 @@ private:
const GrTextureParams& params,
GrGLTexture* nextTexture);
- // sets the texture matrix for the currently bound program
- void flushTextureMatrix(int stageIdx);
-
// sets the color specified by GrDrawState::setColor()
void flushColor(GrColor color);
diff --git a/src/gpu/gl/GrGpuGL_program.cpp b/src/gpu/gl/GrGpuGL_program.cpp
index 17a3036e49..73f60ca989 100644
--- a/src/gpu/gl/GrGpuGL_program.cpp
+++ b/src/gpu/gl/GrGpuGL_program.cpp
@@ -159,85 +159,6 @@ void GrGpuGL::flushViewMatrix(DrawType type) {
///////////////////////////////////////////////////////////////////////////////
-// helpers for texture matrices
-
-void GrGpuGL::AdjustTextureMatrix(const GrTexture* texture, SkMatrix* matrix) {
- GrAssert(NULL != texture);
- GrAssert(NULL != matrix);
- if (GrSurface::kBottomLeft_Origin == texture->origin()) {
- SkMatrix invY;
- invY.setAll(SK_Scalar1, 0, 0,
- 0, -SK_Scalar1, SK_Scalar1,
- 0, 0, SkMatrix::I()[8]);
- matrix->postConcat(invY);
- }
-}
-
-int GrGpuGL::TextureMatrixOptFlags(const GrGLTexture* texture,
- const GrEffectStage& stage) {
- GrAssert(NULL != texture);
- SkMatrix matrix;
- stage.getTotalMatrix(&matrix);
-
- bool canBeIndentity = GrSurface::kTopLeft_Origin == texture->origin();
-
- if (canBeIndentity && matrix.isIdentity()) {
- return GrGLProgram::StageDesc::kIdentityMatrix_OptFlagBit;
- } else if (!matrix.hasPerspective()) {
- return GrGLProgram::StageDesc::kNoPerspective_OptFlagBit;
- }
- return 0;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-void GrGpuGL::flushTextureMatrix(int s) {
- const GrDrawState& drawState = this->getDrawState();
-
- // FIXME: Still assuming only a single texture per effect
- const GrEffect* effect = drawState.getStage(s).getEffect();
- if (0 == effect->numTextures()) {
- return;
- }
- const GrGLTexture* texture = static_cast<const GrGLTexture*>(effect->texture(0));
- if (NULL != texture) {
-
- bool originChange = fCurrentProgram->fTextureOrigin[s] != texture->origin();
-
- UniformHandle matrixUni = fCurrentProgram->fUniforms.fStages[s].fTextureMatrixUni;
-
- const SkMatrix& hwMatrix = fCurrentProgram->fTextureMatrices[s];
- SkMatrix samplerMatrix;
- drawState.getStage(s).getTotalMatrix(&samplerMatrix);
-
- if (kInvalidUniformHandle != matrixUni &&
- (originChange || !hwMatrix.cheapEqualTo(samplerMatrix))) {
-
- SkMatrix m = samplerMatrix;
- AdjustTextureMatrix(texture, &m);
-
- // ES doesn't allow you to pass true to the transpose param,
- // so do our own transpose
- GrGLfloat mt[] = {
- SkScalarToFloat(m[SkMatrix::kMScaleX]),
- SkScalarToFloat(m[SkMatrix::kMSkewY]),
- SkScalarToFloat(m[SkMatrix::kMPersp0]),
- SkScalarToFloat(m[SkMatrix::kMSkewX]),
- SkScalarToFloat(m[SkMatrix::kMScaleY]),
- SkScalarToFloat(m[SkMatrix::kMPersp1]),
- SkScalarToFloat(m[SkMatrix::kMTransX]),
- SkScalarToFloat(m[SkMatrix::kMTransY]),
- SkScalarToFloat(m[SkMatrix::kMPersp2])
- };
-
- fCurrentProgram->fUniformManager.setMatrix3f(matrixUni, mt);
- fCurrentProgram->fTextureMatrices[s] = samplerMatrix;
- }
-
- fCurrentProgram->fTextureOrigin[s] = texture->origin();
- }
-}
-
void GrGpuGL::flushColor(GrColor color) {
const ProgramDesc& desc = fCurrentProgram->getDesc();
const GrDrawState& drawState = this->getDrawState();
@@ -386,8 +307,6 @@ bool GrGpuGL::flushGraphicsState(DrawType type) {
for (int s = 0; s < GrDrawState::kNumStages; ++s) {
if (this->isStageEnabled(s)) {
this->flushBoundTextureAndParams(s);
-
- this->flushTextureMatrix(s);
}
}
}
@@ -640,40 +559,15 @@ void GrGpuGL::buildProgram(bool isPoints,
}
for (int s = 0; s < GrDrawState::kNumStages; ++s) {
- StageDesc& stageDesc = desc->fStages[s];
- stageDesc.fOptFlags = 0;
- stageDesc.setEnabled(this->isStageEnabled(s));
-
- bool skip = s < drawState.getFirstCoverageStage() ? skipColor :
- skipCoverage;
-
- if (!skip && stageDesc.isEnabled()) {
+ bool skip = s < drawState.getFirstCoverageStage() ? skipColor : skipCoverage;
+ if (!skip && drawState.isStageEnabled(s)) {
lastEnabledStage = s;
- const GrEffectStage& stage = drawState.getStage(s);
- // FIXME: Still assuming one texture per effect
const GrEffect* effect = drawState.getStage(s).getEffect();
-
- if (effect->numTextures() > 0) {
- const GrGLTexture* texture = static_cast<const GrGLTexture*>(effect->texture(0));
- SkMatrix samplerMatrix;
- stage.getTotalMatrix(&samplerMatrix);
- if (NULL != texture) {
- // We call this helper function rather then simply checking the client-specified
- // texture matrix. This is because we may have to concat a y-inversion to account
- // for texture orientation.
- stageDesc.fOptFlags |= TextureMatrixOptFlags(texture, stage);
- }
- } else {
- // Set identity to do the minimal amount of extra work for the no texture case.
- // This will go away when effects manage their own texture matrix.
- stageDesc.fOptFlags |= StageDesc::kIdentityMatrix_OptFlagBit;
- }
const GrBackendEffectFactory& factory = effect->getFactory();
- stageDesc.fEffectKey = factory.glEffectKey(stage, this->glCaps());
+ desc->fEffectKeys[s] = factory.glEffectKey(drawState.getStage(s), this->glCaps());
} else {
- stageDesc.fOptFlags = 0;
- stageDesc.fEffectKey = 0;
+ desc->fEffectKeys[s] = 0;
}
}
diff --git a/tests/GLProgramsTest.cpp b/tests/GLProgramsTest.cpp
index 56dbea4eda..a14c95cdba 100644
--- a/tests/GLProgramsTest.cpp
+++ b/tests/GLProgramsTest.cpp
@@ -31,8 +31,6 @@ bool random_bool(GrRandom* r) {
return r->nextF() > .5f;
}
-typedef GrGLProgram::StageDesc StageDesc;
-
const GrEffect* create_random_effect(GrRandom* random,
GrContext* context,
GrTexture* dummyTextures[]) {
@@ -59,13 +57,6 @@ bool GrGpuGL::programUnitTest() {
dummyDesc.fHeight = 22;
SkAutoTUnref<GrTexture> dummyTexture2(this->createTexture(dummyDesc, NULL, 0));
- // GrGLSLGeneration glslGeneration =
- GrGetGLSLGeneration(this->glBinding(), this->glInterface());
- static const int STAGE_OPTS[] = {
- 0,
- StageDesc::kNoPerspective_OptFlagBit,
- };
-
static const int NUM_TESTS = 512;
GrRandom random;
@@ -118,7 +109,6 @@ bool GrGpuGL::programUnitTest() {
GrEffectStage stages[GrDrawState::kNumStages];
for (int s = 0; s < GrDrawState::kNumStages; ++s) {
- StageDesc& stageDesc = pdesc.fStages[s];
// enable the stage?
if (random_bool(&random)) {
// use separate tex coords?
@@ -126,24 +116,18 @@ bool GrGpuGL::programUnitTest() {
int t = random_int(&random, GrDrawState::kMaxTexCoords);
pdesc.fVertexLayout |= StageTexCoordVertexLayoutBit(s, t);
}
- stageDesc.setEnabled(true);
- }
- // use text-formatted verts?
- if (random_bool(&random)) {
- pdesc.fVertexLayout |= kTextFormat_VertexLayoutBit;
- }
-
- stageDesc.fEffectKey = 0;
- stageDesc.fOptFlags |= STAGE_OPTS[random_int(&random, GR_ARRAY_COUNT(STAGE_OPTS))];
+ // use text-formatted verts?
+ if (random_bool(&random)) {
+ pdesc.fVertexLayout |= kTextFormat_VertexLayoutBit;
+ }
- if (stageDesc.isEnabled()) {
GrTexture* dummyTextures[] = {dummyTexture1.get(), dummyTexture2.get()};
SkAutoTUnref<const GrEffect> effect(create_random_effect(&random,
- getContext(),
- dummyTextures));
+ getContext(),
+ dummyTextures));
stages[s].setEffect(effect.get());
if (NULL != stages[s].getEffect()) {
- stageDesc.fEffectKey =
+ pdesc.fEffectKeys[s] =
stages[s].getEffect()->getFactory().glEffectKey(stages[s], this->glCaps());
}
}