Remove uniform var pointers from custom effects
Review URL: http://codereview.appspot.com/6374067/
git-svn-id: http://skia.googlecode.com/svn/trunk@4616 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/effects/GrConvolutionEffect.cpp b/src/gpu/effects/GrConvolutionEffect.cpp
index 3804d57..a16313e 100644
--- a/src/gpu/effects/GrConvolutionEffect.cpp
+++ b/src/gpu/effects/GrConvolutionEffect.cpp
@@ -11,21 +11,27 @@
#include "gl/GrGLTexture.h"
#include "GrProgramStageFactory.h"
+// For brevity, and these definitions are likely to move to a different class soon.
+typedef GrGLShaderBuilder::UniformHandle UniformHandle;
+static const UniformHandle kInvalidUniformHandle = GrGLShaderBuilder::kInvalidUniformHandle;
+
class GrGLConvolutionEffect : public GrGLProgramStage {
public:
GrGLConvolutionEffect(const GrProgramStageFactory& factory,
const GrCustomStage& stage);
- virtual void setupVariables(GrGLShaderBuilder* state,
+ virtual void setupVariables(GrGLShaderBuilder* builder,
int stage) SK_OVERRIDE;
- virtual void emitVS(GrGLShaderBuilder* state,
+ virtual void emitVS(GrGLShaderBuilder* builder,
const char* vertexCoords) SK_OVERRIDE;
- virtual void emitFS(GrGLShaderBuilder* state,
+ virtual void emitFS(GrGLShaderBuilder* builder,
const char* outputColor,
const char* inputColor,
const char* samplerName) SK_OVERRIDE;
- virtual void initUniforms(const GrGLInterface*, int programID) SK_OVERRIDE;
+ virtual void initUniforms(const GrGLShaderBuilder*,
+ const GrGLInterface*,
+ int programID) SK_OVERRIDE;
virtual void setData(const GrGLInterface*,
const GrCustomStage&,
@@ -37,11 +43,11 @@
private:
int width() const { return Gr1DKernelEffect::WidthFromRadius(fRadius); }
- int fRadius;
- const GrGLShaderVar* fKernelVar;
- GrGLint fKernelLocation;
- const GrGLShaderVar* fImageIncrementVar;
- GrGLint fImageIncrementLocation;
+ int fRadius;
+ UniformHandle fKernelUni;
+ GrGLint fKernelLocation;
+ UniformHandle fImageIncrementUni;
+ GrGLint fImageIncrementLocation;
typedef GrGLProgramStage INHERITED;
};
@@ -49,72 +55,72 @@
GrGLConvolutionEffect::GrGLConvolutionEffect(const GrProgramStageFactory& factory,
const GrCustomStage& stage)
: GrGLProgramStage(factory)
- , fKernelVar(NULL)
+ , fKernelUni(kInvalidUniformHandle)
, fKernelLocation(0)
- , fImageIncrementVar(NULL)
+ , fImageIncrementUni(kInvalidUniformHandle)
, fImageIncrementLocation(0) {
const GrConvolutionEffect& c =
static_cast<const GrConvolutionEffect&>(stage);
fRadius = c.radius();
}
-void GrGLConvolutionEffect::setupVariables(GrGLShaderBuilder* state,
+void GrGLConvolutionEffect::setupVariables(GrGLShaderBuilder* builder,
int stage) {
- fImageIncrementVar = &state->addUniform(GrGLShaderBuilder::kFragment_ShaderType |
- GrGLShaderBuilder::kVertex_ShaderType,
- kVec2f_GrSLType, "uImageIncrement", stage);
- fKernelVar = &state->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
- kFloat_GrSLType, "uKernel", stage, this->width());
+ fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType |
+ GrGLShaderBuilder::kVertex_ShaderType,
+ kVec2f_GrSLType, "uImageIncrement", stage);
+ fKernelUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
+ kFloat_GrSLType, "uKernel", stage, this->width());
fImageIncrementLocation = kUseUniform;
fKernelLocation = kUseUniform;
}
-void GrGLConvolutionEffect::emitVS(GrGLShaderBuilder* state,
+void GrGLConvolutionEffect::emitVS(GrGLShaderBuilder* builder,
const char* vertexCoords) {
- SkString* code = &state->fVSCode;
- code->appendf("\t\t%s -= vec2(%d, %d) * %s;\n",
- vertexCoords, fRadius, fRadius,
- fImageIncrementVar->getName().c_str());
+ SkString* code = &builder->fVSCode;
+ const char* imgInc = builder->getUniformCStr(fImageIncrementUni);
+ code->appendf("\t\t%s -= vec2(%d, %d) * %s;\n", vertexCoords, fRadius, fRadius, imgInc);
}
-void GrGLConvolutionEffect::emitFS(GrGLShaderBuilder* state,
+void GrGLConvolutionEffect::emitFS(GrGLShaderBuilder* builder,
const char* outputColor,
const char* inputColor,
const char* samplerName) {
- SkString* code = &state->fFSCode;
+ SkString* code = &builder->fFSCode;
code->appendf("\t\t%s = vec4(0, 0, 0, 0);\n", outputColor);
- code->appendf("\t\tvec2 coord = %s;\n", state->fSampleCoords.c_str());
+ code->appendf("\t\tvec2 coord = %s;\n", builder->fSampleCoords.c_str());
int width = this ->width();
+ const GrGLShaderVar& kernel = builder->getUniformVariable(fKernelUni);
+ const char* imgInc = builder->getUniformCStr(fImageIncrementUni);
// Manually unroll loop because some drivers don't; yields 20-30% speedup.
for (int i = 0; i < width; i++) {
SkString index;
SkString kernelIndex;
index.appendS32(i);
- fKernelVar->appendArrayAccess(index.c_str(), &kernelIndex);
+ kernel.appendArrayAccess(index.c_str(), &kernelIndex);
code->appendf("\t\t%s += ", outputColor);
- state->emitTextureLookup(samplerName, "coord");
+ builder->emitTextureLookup(samplerName, "coord");
code->appendf(" * %s;\n", kernelIndex.c_str());
- code->appendf("\t\tcoord += %s;\n",
- fImageIncrementVar->getName().c_str());
+ code->appendf("\t\tcoord += %s;\n", imgInc);
}
- if (state->fModulate.size()) {
+ if (builder->fModulate.size()) {
code->appendf("\t\t%s = %s%s;\n", outputColor, outputColor,
- state->fModulate.c_str());
+ builder->fModulate.c_str());
}
}
-void GrGLConvolutionEffect::initUniforms(const GrGLInterface* gl,
+void GrGLConvolutionEffect::initUniforms(const GrGLShaderBuilder* builder,
+ const GrGLInterface* gl,
int programID) {
- GR_GL_CALL_RET(gl, fImageIncrementLocation,
- GetUniformLocation(programID,
- fImageIncrementVar->getName().c_str()));
- GR_GL_CALL_RET(gl, fKernelLocation,
- GetUniformLocation(programID, fKernelVar->getName().c_str()));
+ const char* kernel = builder->getUniformCStr(fKernelUni);
+ const char* imgInc = builder->getUniformCStr(fImageIncrementUni);
+ GR_GL_CALL_RET(gl, fImageIncrementLocation, GetUniformLocation(programID, imgInc));
+ GR_GL_CALL_RET(gl, fKernelLocation, GetUniformLocation(programID, kernel));
}
void GrGLConvolutionEffect::setData(const GrGLInterface* gl,
diff --git a/src/gpu/effects/GrGradientEffects.cpp b/src/gpu/effects/GrGradientEffects.cpp
index 3125657..57767b3 100644
--- a/src/gpu/effects/GrGradientEffects.cpp
+++ b/src/gpu/effects/GrGradientEffects.cpp
@@ -19,9 +19,9 @@
const GrCustomStage&) : INHERITED (factory) { }
virtual ~GrGLRadialGradient() { }
- virtual void emitVS(GrGLShaderBuilder* state,
+ virtual void emitVS(GrGLShaderBuilder* builder,
const char* vertexCoords) SK_OVERRIDE { }
- virtual void emitFS(GrGLShaderBuilder* state,
+ virtual void emitFS(GrGLShaderBuilder* builder,
const char* outputColor,
const char* inputColor,
const char* samplerName) SK_OVERRIDE;
@@ -34,15 +34,15 @@
};
-void GrGLRadialGradient::emitFS(GrGLShaderBuilder* state,
+void GrGLRadialGradient::emitFS(GrGLShaderBuilder* builder,
const char* outputColor,
const char* inputColor,
const char* samplerName) {
- state->fSampleCoords.printf("vec2(length(%s.xy), 0.5)",
- state->fSampleCoords.c_str());
- state->fComplexCoord = true;
+ builder->fSampleCoords.printf("vec2(length(%s.xy), 0.5)",
+ builder->fSampleCoords.c_str());
+ builder->fComplexCoord = true;
- state->emitDefaultFetch(outputColor, samplerName);
+ builder->emitDefaultFetch(outputColor, samplerName);
}
@@ -69,6 +69,10 @@
/////////////////////////////////////////////////////////////////////
+// For brevity, and these definitions are likely to move to a different class soon.
+typedef GrGLShaderBuilder::UniformHandle UniformHandle;
+static const UniformHandle kInvalidUniformHandle = GrGLShaderBuilder::kInvalidUniformHandle;
+
class GrGLRadial2Gradient : public GrGLProgramStage {
public:
@@ -77,15 +81,17 @@
const GrCustomStage&);
virtual ~GrGLRadial2Gradient() { }
- virtual void setupVariables(GrGLShaderBuilder* state,
+ virtual void setupVariables(GrGLShaderBuilder* builder,
int stage) SK_OVERRIDE;
- virtual void emitVS(GrGLShaderBuilder* state,
+ virtual void emitVS(GrGLShaderBuilder* builder,
const char* vertexCoords) SK_OVERRIDE;
- virtual void emitFS(GrGLShaderBuilder* state,
+ virtual void emitFS(GrGLShaderBuilder* builder,
const char* outputColor,
const char* inputColor,
const char* samplerName) SK_OVERRIDE;
- virtual void initUniforms(const GrGLInterface*, int programID) SK_OVERRIDE;
+ virtual void initUniforms(const GrGLShaderBuilder* builder,
+ const GrGLInterface*,
+ int programID) SK_OVERRIDE;
virtual void setData(const GrGLInterface*,
const GrCustomStage&,
const GrRenderTarget*,
@@ -97,10 +103,10 @@
protected:
- const GrGLShaderVar* fVSParamVar;
- GrGLint fVSParamLocation;
- const GrGLShaderVar* fFSParamVar;
- GrGLint fFSParamLocation;
+ UniformHandle fVSParamUni;
+ GrGLint fVSParamLocation;
+ UniformHandle fFSParamUni;
+ GrGLint fFSParamLocation;
const char* fVSVaryingName;
const char* fFSVaryingName;
@@ -126,8 +132,8 @@
const GrProgramStageFactory& factory,
const GrCustomStage& baseData)
: INHERITED(factory)
- , fVSParamVar(NULL)
- , fFSParamVar(NULL)
+ , fVSParamUni(kInvalidUniformHandle)
+ , fFSParamUni(kInvalidUniformHandle)
, fVSVaryingName(NULL)
, fFSVaryingName(NULL)
, fCachedCenter(GR_ScalarMax)
@@ -139,37 +145,37 @@
fIsDegenerate = data.isDegenerate();
}
-void GrGLRadial2Gradient::setupVariables(GrGLShaderBuilder* state, int stage) {
+void GrGLRadial2Gradient::setupVariables(GrGLShaderBuilder* builder, int stage) {
// 2 copies of uniform array, 1 for each of vertex & fragment shader,
// to work around Xoom bug. Doesn't seem to cause performance decrease
// in test apps, but need to keep an eye on it.
- fVSParamVar = &state->addUniform(GrGLShaderBuilder::kVertex_ShaderType,
- kFloat_GrSLType, "uRadial2VSParams", stage, 6);
- fFSParamVar = &state->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
- kFloat_GrSLType, "uRadial2FSParams", stage, 6);
+ fVSParamUni = builder->addUniform(GrGLShaderBuilder::kVertex_ShaderType,
+ kFloat_GrSLType, "uRadial2VSParams", stage, 6);
+ fFSParamUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
+ kFloat_GrSLType, "uRadial2FSParams", stage, 6);
fVSParamLocation = GrGLProgramStage::kUseUniform;
fFSParamLocation = GrGLProgramStage::kUseUniform;
// For radial gradients without perspective we can pass the linear
// part of the quadratic as a varying.
- if (state->fVaryingDims == state->fCoordDims) {
- state->addVarying(kFloat_GrSLType, "Radial2BCoeff", stage,
+ if (builder->fVaryingDims == builder->fCoordDims) {
+ builder->addVarying(kFloat_GrSLType, "Radial2BCoeff", stage,
&fVSVaryingName, &fFSVaryingName);
}
}
-void GrGLRadial2Gradient::emitVS(GrGLShaderBuilder* state,
+void GrGLRadial2Gradient::emitVS(GrGLShaderBuilder* builder,
const char* vertexCoords) {
- SkString* code = &state->fVSCode;
+ SkString* code = &builder->fVSCode;
SkString p2;
SkString p3;
- fVSParamVar->appendArrayAccess(2, &p2);
- fVSParamVar->appendArrayAccess(3, &p3);
+ builder->getUniformVariable(fVSParamUni).appendArrayAccess(2, &p2);
+ builder->getUniformVariable(fVSParamUni).appendArrayAccess(3, &p3);
// For radial gradients without perspective we can pass the linear
// part of the quadratic as a varying.
- if (state->fVaryingDims == state->fCoordDims) {
+ if (builder->fVaryingDims == builder->fCoordDims) {
// r2Var = 2 * (r2Parm[2] * varCoord.x - r2Param[3])
code->appendf("\t%s = 2.0 *(%s * %s.x - %s);\n",
fVSVaryingName, p2.c_str(),
@@ -177,11 +183,11 @@
}
}
-void GrGLRadial2Gradient::emitFS(GrGLShaderBuilder* state,
+void GrGLRadial2Gradient::emitFS(GrGLShaderBuilder* builder,
const char* outputColor,
const char* inputColor,
const char* samplerName) {
- SkString* code = &state->fFSCode;
+ SkString* code = &builder->fFSCode;
SkString cName("c");
SkString ac4Name("ac4");
SkString rootName("root");
@@ -191,32 +197,32 @@
SkString p3;
SkString p4;
SkString p5;
- fFSParamVar->appendArrayAccess(0, &p0);
- fFSParamVar->appendArrayAccess(1, &p1);
- fFSParamVar->appendArrayAccess(2, &p2);
- fFSParamVar->appendArrayAccess(3, &p3);
- fFSParamVar->appendArrayAccess(4, &p4);
- fFSParamVar->appendArrayAccess(5, &p5);
+ builder->getUniformVariable(fFSParamUni).appendArrayAccess(0, &p0);
+ builder->getUniformVariable(fFSParamUni).appendArrayAccess(1, &p1);
+ builder->getUniformVariable(fFSParamUni).appendArrayAccess(2, &p2);
+ builder->getUniformVariable(fFSParamUni).appendArrayAccess(3, &p3);
+ builder->getUniformVariable(fFSParamUni).appendArrayAccess(4, &p4);
+ builder->getUniformVariable(fFSParamUni).appendArrayAccess(5, &p5);
// If we we're able to interpolate the linear component,
// bVar is the varying; otherwise compute it
SkString bVar;
- if (state->fCoordDims == state->fVaryingDims) {
+ if (builder->fCoordDims == builder->fVaryingDims) {
bVar = fFSVaryingName;
- GrAssert(2 == state->fVaryingDims);
+ GrAssert(2 == builder->fVaryingDims);
} else {
- GrAssert(3 == state->fVaryingDims);
+ GrAssert(3 == builder->fVaryingDims);
bVar = "b";
//bVar.appendS32(stageNum);
code->appendf("\tfloat %s = 2.0 * (%s * %s.x - %s);\n",
bVar.c_str(), p2.c_str(),
- state->fSampleCoords.c_str(), p3.c_str());
+ builder->fSampleCoords.c_str(), p3.c_str());
}
// c = (x^2)+(y^2) - params[4]
code->appendf("\tfloat %s = dot(%s, %s) - %s;\n",
- cName.c_str(), state->fSampleCoords.c_str(),
- state->fSampleCoords.c_str(),
+ cName.c_str(), builder->fSampleCoords.c_str(),
+ builder->fSampleCoords.c_str(),
p4.c_str());
// If we aren't degenerate, emit some extra code, and accept a slightly
@@ -236,25 +242,27 @@
// x coord is: (-b + params[5] * sqrt(b^2-4ac)) * params[1]
// y coord is 0.5 (texture is effectively 1D)
- state->fSampleCoords.printf("vec2((-%s + %s * %s) * %s, 0.5)",
- bVar.c_str(), p5.c_str(),
- rootName.c_str(), p1.c_str());
+ builder->fSampleCoords.printf("vec2((-%s + %s * %s) * %s, 0.5)",
+ bVar.c_str(), p5.c_str(),
+ rootName.c_str(), p1.c_str());
} else {
// x coord is: -c/b
// y coord is 0.5 (texture is effectively 1D)
- state->fSampleCoords.printf("vec2((-%s / %s), 0.5)",
- cName.c_str(), bVar.c_str());
+ builder->fSampleCoords.printf("vec2((-%s / %s), 0.5)",
+ cName.c_str(), bVar.c_str());
}
- state->fComplexCoord = true;
+ builder->fComplexCoord = true;
- state->emitDefaultFetch(outputColor, samplerName);
+ builder->emitDefaultFetch(outputColor, samplerName);
}
-void GrGLRadial2Gradient::initUniforms(const GrGLInterface* gl, int programID) {
- GR_GL_CALL_RET(gl, fVSParamLocation,
- GetUniformLocation(programID, fVSParamVar->getName().c_str()));
- GR_GL_CALL_RET(gl, fFSParamLocation,
- GetUniformLocation(programID, fFSParamVar->getName().c_str()));
+void GrGLRadial2Gradient::initUniforms(const GrGLShaderBuilder* builder,
+ const GrGLInterface* gl,
+ int programID) {
+ const char* vsParam = builder->getUniformCStr(fVSParamUni);
+ const char* fsParam = builder->getUniformCStr(fFSParamUni);
+ GR_GL_CALL_RET(gl, fVSParamLocation, GetUniformLocation(programID, vsParam));
+ GR_GL_CALL_RET(gl, fFSParamLocation, GetUniformLocation(programID, fsParam));
}
void GrGLRadial2Gradient::setData(const GrGLInterface* gl,
@@ -335,15 +343,17 @@
const GrCustomStage&);
virtual ~GrGLConical2Gradient() { }
- virtual void setupVariables(GrGLShaderBuilder* state,
+ virtual void setupVariables(GrGLShaderBuilder* builder,
int stage) SK_OVERRIDE;
- virtual void emitVS(GrGLShaderBuilder* state,
+ virtual void emitVS(GrGLShaderBuilder* builder,
const char* vertexCoords) SK_OVERRIDE;
- virtual void emitFS(GrGLShaderBuilder* state,
+ virtual void emitFS(GrGLShaderBuilder* builder,
const char* outputColor,
const char* inputColor,
const char* samplerName) SK_OVERRIDE;
- virtual void initUniforms(const GrGLInterface*, int programID) SK_OVERRIDE;
+ virtual void initUniforms(const GrGLShaderBuilder* builder,
+ const GrGLInterface*,
+ int programID) SK_OVERRIDE;
virtual void setData(const GrGLInterface*,
const GrCustomStage&,
const GrRenderTarget*,
@@ -355,10 +365,10 @@
protected:
- const GrGLShaderVar* fVSParamVar;
- GrGLint fVSParamLocation;
- const GrGLShaderVar* fFSParamVar;
- GrGLint fFSParamLocation;
+ UniformHandle fVSParamUni;
+ GrGLint fVSParamLocation;
+ UniformHandle fFSParamUni;
+ GrGLint fFSParamLocation;
const char* fVSVaryingName;
const char* fFSVaryingName;
@@ -384,8 +394,8 @@
const GrProgramStageFactory& factory,
const GrCustomStage& baseData)
: INHERITED(factory)
- , fVSParamVar(NULL)
- , fFSParamVar(NULL)
+ , fVSParamUni(kInvalidUniformHandle)
+ , fFSParamUni(kInvalidUniformHandle)
, fVSVaryingName(NULL)
, fFSVaryingName(NULL)
, fCachedCenter(GR_ScalarMax)
@@ -397,39 +407,39 @@
fIsDegenerate = data.isDegenerate();
}
-void GrGLConical2Gradient::setupVariables(GrGLShaderBuilder* state, int stage) {
+void GrGLConical2Gradient::setupVariables(GrGLShaderBuilder* builder, int stage) {
// 2 copies of uniform array, 1 for each of vertex & fragment shader,
// to work around Xoom bug. Doesn't seem to cause performance decrease
// in test apps, but need to keep an eye on it.
- fVSParamVar = &state->addUniform(GrGLShaderBuilder::kVertex_ShaderType,
- kFloat_GrSLType, "uConical2VSParams", stage, 6);
- fFSParamVar = &state->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
- kFloat_GrSLType, "uConical2FSParams", stage, 6);
+ fVSParamUni = builder->addUniform(GrGLShaderBuilder::kVertex_ShaderType,
+ kFloat_GrSLType, "uConical2VSParams", stage, 6);
+ fFSParamUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
+ kFloat_GrSLType, "uConical2FSParams", stage, 6);
fVSParamLocation = GrGLProgramStage::kUseUniform;
fFSParamLocation = GrGLProgramStage::kUseUniform;
// For radial gradients without perspective we can pass the linear
// part of the quadratic as a varying.
- if (state->fVaryingDims == state->fCoordDims) {
- state->addVarying(kFloat_GrSLType, "Conical2BCoeff", stage,
- &fVSVaryingName, &fFSVaryingName);
+ if (builder->fVaryingDims == builder->fCoordDims) {
+ builder->addVarying(kFloat_GrSLType, "Conical2BCoeff", stage,
+ &fVSVaryingName, &fFSVaryingName);
}
}
-void GrGLConical2Gradient::emitVS(GrGLShaderBuilder* state,
+void GrGLConical2Gradient::emitVS(GrGLShaderBuilder* builder,
const char* vertexCoords) {
- SkString* code = &state->fVSCode;
+ SkString* code = &builder->fVSCode;
SkString p2; // distance between centers
SkString p3; // start radius
SkString p5; // difference in radii (r1 - r0)
- fVSParamVar->appendArrayAccess(2, &p2);
- fVSParamVar->appendArrayAccess(3, &p3);
- fVSParamVar->appendArrayAccess(5, &p5);
+ builder->getUniformVariable(fVSParamUni).appendArrayAccess(2, &p2);
+ builder->getUniformVariable(fVSParamUni).appendArrayAccess(3, &p3);
+ builder->getUniformVariable(fVSParamUni).appendArrayAccess(5, &p5);
// For radial gradients without perspective we can pass the linear
// part of the quadratic as a varying.
- if (state->fVaryingDims == state->fCoordDims) {
+ if (builder->fVaryingDims == builder->fCoordDims) {
// r2Var = -2 * (r2Parm[2] * varCoord.x - r2Param[3] * r2Param[5])
code->appendf("\t%s = -2.0 * (%s * %s.x + %s * %s);\n",
fVSVaryingName, p2.c_str(),
@@ -437,11 +447,11 @@
}
}
-void GrGLConical2Gradient::emitFS(GrGLShaderBuilder* state,
+void GrGLConical2Gradient::emitFS(GrGLShaderBuilder* builder,
const char* outputColor,
const char* inputColor,
const char* samplerName) {
- SkString* code = &state->fFSCode;
+ SkString* code = &builder->fFSCode;
SkString cName("c");
SkString ac4Name("ac4");
@@ -456,24 +466,25 @@
SkString p3; // start radius
SkString p4; // start radius squared
SkString p5; // difference in radii (r1 - r0)
- fFSParamVar->appendArrayAccess(0, &p0);
- fFSParamVar->appendArrayAccess(1, &p1);
- fFSParamVar->appendArrayAccess(2, &p2);
- fFSParamVar->appendArrayAccess(3, &p3);
- fFSParamVar->appendArrayAccess(4, &p4);
- fFSParamVar->appendArrayAccess(5, &p5);
+
+ builder->getUniformVariable(fVSParamUni).appendArrayAccess(0, &p0);
+ builder->getUniformVariable(fVSParamUni).appendArrayAccess(1, &p1);
+ builder->getUniformVariable(fVSParamUni).appendArrayAccess(2, &p2);
+ builder->getUniformVariable(fVSParamUni).appendArrayAccess(3, &p3);
+ builder->getUniformVariable(fVSParamUni).appendArrayAccess(4, &p4);
+ builder->getUniformVariable(fVSParamUni).appendArrayAccess(5, &p5);
// If we we're able to interpolate the linear component,
// bVar is the varying; otherwise compute it
SkString bVar;
- if (state->fCoordDims == state->fVaryingDims) {
+ if (builder->fCoordDims == builder->fVaryingDims) {
bVar = fFSVaryingName;
- GrAssert(2 == state->fVaryingDims);
+ GrAssert(2 == builder->fVaryingDims);
} else {
- GrAssert(3 == state->fVaryingDims);
+ GrAssert(3 == builder->fVaryingDims);
bVar = "b";
code->appendf("\tfloat %s = -2.0 * (%s * %s.x + %s * %s);\n",
- bVar.c_str(), p2.c_str(), state->fSampleCoords.c_str(),
+ bVar.c_str(), p2.c_str(), builder->fSampleCoords.c_str(),
p3.c_str(), p5.c_str());
}
@@ -483,7 +494,7 @@
// c = (x^2)+(y^2) - params[4]
code->appendf("\tfloat %s = dot(%s, %s) - %s;\n", cName.c_str(),
- state->fSampleCoords.c_str(), state->fSampleCoords.c_str(),
+ builder->fSampleCoords.c_str(), builder->fSampleCoords.c_str(),
p4.c_str());
// Non-degenerate case (quadratic)
@@ -527,8 +538,8 @@
// y coord is 0.5 (texture is effectively 1D)
code->appendf("\t\t");
- state->fSampleCoords.printf("vec2(%s, 0.5)", tName.c_str());
- state->emitDefaultFetch(outputColor, samplerName);
+ builder->fSampleCoords.printf("vec2(%s, 0.5)", tName.c_str());
+ builder->emitDefaultFetch(outputColor, samplerName);
// otherwise, if r(t) for the larger root was <= 0, try the other root
code->appendf("\t\t} else {\n");
@@ -541,8 +552,8 @@
// y coord is 0.5 (texture is effectively 1D)
code->appendf("\t\t\t");
- state->fSampleCoords.printf("vec2(%s, 0.5)", tName.c_str());
- state->emitDefaultFetch(outputColor, samplerName);
+ builder->fSampleCoords.printf("vec2(%s, 0.5)", tName.c_str());
+ builder->emitDefaultFetch(outputColor, samplerName);
// end if (r(t) > 0) for smaller root
code->appendf("\t\t\t}\n");
@@ -560,18 +571,20 @@
code->appendf("\tif (%s * %s + %s > 0.0) {\n", tName.c_str(),
p5.c_str(), p3.c_str());
code->appendf("\t");
- state->fSampleCoords.printf("vec2(%s, 0.5)", tName.c_str());
- state->emitDefaultFetch(outputColor, samplerName);
+ builder->fSampleCoords.printf("vec2(%s, 0.5)", tName.c_str());
+ builder->emitDefaultFetch(outputColor, samplerName);
code->appendf("\t}\n");
}
- state->fComplexCoord = true;
+ builder->fComplexCoord = true;
}
-void GrGLConical2Gradient::initUniforms(const GrGLInterface* gl, int programID) {
- GR_GL_CALL_RET(gl, fVSParamLocation,
- GetUniformLocation(programID, fVSParamVar->getName().c_str()));
- GR_GL_CALL_RET(gl, fFSParamLocation,
- GetUniformLocation(programID, fFSParamVar->getName().c_str()));
+void GrGLConical2Gradient::initUniforms(const GrGLShaderBuilder* builder,
+ const GrGLInterface* gl,
+ int programID) {
+ const char* vsParam = builder->getUniformCStr(fVSParamUni);
+ const char* fsParam = builder->getUniformCStr(fFSParamUni);
+ GR_GL_CALL_RET(gl, fVSParamLocation, GetUniformLocation(programID, vsParam));
+ GR_GL_CALL_RET(gl, fFSParamLocation, GetUniformLocation(programID, fsParam));
}
void GrGLConical2Gradient::setData(const GrGLInterface* gl,
@@ -655,9 +668,9 @@
const GrCustomStage&) : INHERITED (factory) { }
virtual ~GrGLSweepGradient() { }
- virtual void emitVS(GrGLShaderBuilder* state,
+ virtual void emitVS(GrGLShaderBuilder* builder,
const char* vertexCoords) SK_OVERRIDE { }
- virtual void emitFS(GrGLShaderBuilder* state,
+ virtual void emitFS(GrGLShaderBuilder* builder,
const char* outputColor,
const char* inputColor,
const char* samplerName) SK_OVERRIDE;
@@ -670,16 +683,16 @@
};
-void GrGLSweepGradient::emitFS(GrGLShaderBuilder* state,
+void GrGLSweepGradient::emitFS(GrGLShaderBuilder* builder,
const char* outputColor,
const char* inputColor,
const char* samplerName) {
- state->fSampleCoords.printf(
+ builder->fSampleCoords.printf(
"vec2(atan(- %s.y, - %s.x) * 0.1591549430918 + 0.5, 0.5)",
- state->fSampleCoords.c_str(), state->fSampleCoords.c_str());
- state->fComplexCoord = true;
+ builder->fSampleCoords.c_str(), builder->fSampleCoords.c_str());
+ builder->fComplexCoord = true;
- state->emitDefaultFetch(outputColor, samplerName);
+ builder->emitDefaultFetch(outputColor, samplerName);
}
/////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/effects/GrMorphologyEffect.cpp b/src/gpu/effects/GrMorphologyEffect.cpp
index 180b5eb..6699989 100644
--- a/src/gpu/effects/GrMorphologyEffect.cpp
+++ b/src/gpu/effects/GrMorphologyEffect.cpp
@@ -18,7 +18,7 @@
GrGLMorphologyEffect (const GrProgramStageFactory& factory,
const GrCustomStage& stage);
- virtual void setupVariables(GrGLShaderBuilder* state,
+ virtual void setupVariables(GrGLShaderBuilder* builder,
int stage) SK_OVERRIDE;
virtual void emitVS(GrGLShaderBuilder* state,
const char* vertexCoords) SK_OVERRIDE;
@@ -29,8 +29,10 @@
static inline StageKey GenKey(const GrCustomStage& s);
- virtual void initUniforms(const GrGLInterface*, int programID) SK_OVERRIDE;
- virtual void setData(const GrGLInterface*,
+ virtual void initUniforms(const GrGLShaderBuilder*,
+ const GrGLInterface*,
+ int programID) SK_OVERRIDE;
+ virtual void setData(const GrGLInterface*,
const GrCustomStage&,
const GrRenderTarget*,
int stageNum) SK_OVERRIDE;
@@ -40,7 +42,7 @@
int fRadius;
GrMorphologyEffect::MorphologyType fType;
- const GrGLShaderVar* fImageIncrementVar;
+ GrGLShaderBuilder::UniformHandle fImageIncrementUni;
GrGLint fImageIncrementLocation;
typedef GrGLProgramStage INHERITED;
@@ -49,50 +51,47 @@
GrGLMorphologyEffect ::GrGLMorphologyEffect(const GrProgramStageFactory& factory,
const GrCustomStage& stage)
: GrGLProgramStage(factory)
- , fImageIncrementVar(NULL)
+ , fImageIncrementUni(GrGLShaderBuilder::kInvalidUniformHandle)
, fImageIncrementLocation(0) {
const GrMorphologyEffect& m = static_cast<const GrMorphologyEffect&>(stage);
fRadius = m.radius();
fType = m.type();
}
-void GrGLMorphologyEffect::setupVariables(GrGLShaderBuilder* state, int stage) {
- fImageIncrementVar = &state->addUniform(GrGLShaderBuilder::kFragment_ShaderType |
- GrGLShaderBuilder::kVertex_ShaderType,
- kVec2f_GrSLType, "uImageIncrement", stage);
+void GrGLMorphologyEffect::setupVariables(GrGLShaderBuilder* builder, int stage) {
+ fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType |
+ GrGLShaderBuilder::kVertex_ShaderType,
+ kVec2f_GrSLType, "uImageIncrement", stage);
}
-void GrGLMorphologyEffect::emitVS(GrGLShaderBuilder* state,
+void GrGLMorphologyEffect::emitVS(GrGLShaderBuilder* builder,
const char* vertexCoords) {
- SkString* code = &state->fVSCode;
- code->appendf("\t\t%s -= vec2(%d, %d) * %s;\n",
- vertexCoords, fRadius, fRadius,
- fImageIncrementVar->getName().c_str());
+ SkString* code = &builder->fVSCode;
+ const char* imgInc = builder->getUniformCStr(fImageIncrementUni);
+ code->appendf("\t\t%s -= vec2(%d, %d) * %s;\n", vertexCoords, fRadius, fRadius, imgInc);
}
-void GrGLMorphologyEffect::initUniforms(const GrGLInterface* gl,
+void GrGLMorphologyEffect::initUniforms(const GrGLShaderBuilder* builder,
+ const GrGLInterface* gl,
int programID) {
- GR_GL_CALL_RET(gl, fImageIncrementLocation,
- GetUniformLocation(programID,
- fImageIncrementVar->getName().c_str()));
+ const char* imgInc = builder->getUniformCStr(fImageIncrementUni);
+ GR_GL_CALL_RET(gl, fImageIncrementLocation, GetUniformLocation(programID, imgInc));
}
-void GrGLMorphologyEffect ::emitFS(GrGLShaderBuilder* state,
+void GrGLMorphologyEffect ::emitFS(GrGLShaderBuilder* builder,
const char* outputColor,
const char* inputColor,
const char* samplerName) {
- SkString* code = &state->fFSCode;
- // const char* texFunc = "texture2D";
- // bool complexCoord = false;
+ SkString* code = &builder->fFSCode;
const char* func;
switch (fType) {
case GrContext::kErode_MorphologyType:
- state->fFSCode.appendf("\t\tvec4 value = vec4(1, 1, 1, 1);\n");
+ code->appendf("\t\tvec4 value = vec4(1, 1, 1, 1);\n");
func = "min";
break;
case GrContext::kDilate_MorphologyType:
- state->fFSCode.appendf("\t\tvec4 value = vec4(0, 0, 0, 0);\n");
+ code->appendf("\t\tvec4 value = vec4(0, 0, 0, 0);\n");
func = "max";
break;
default:
@@ -100,19 +99,16 @@
func = ""; // suppress warning
break;
}
+ const char* imgInc = builder->getUniformCStr(fImageIncrementUni);
- code->appendf("\t\tvec2 coord = %s;\n", state->fSampleCoords.c_str());
+ code->appendf("\t\tvec2 coord = %s;\n", builder->fSampleCoords.c_str());
code->appendf("\t\tfor (int i = 0; i < %d; i++) {\n", this->width());
- state->fFSCode.appendf("\t\t\tvalue = %s(value, ", func);
- state->emitTextureLookup(samplerName, "coord");
- state->fFSCode.appendf(");\n");
- code->appendf("\t\t\tcoord += %s;\n",
- fImageIncrementVar->getName().c_str());
+ code->appendf("\t\t\tvalue = %s(value, ", func);
+ builder->emitTextureLookup(samplerName, "coord");
+ code->appendf(");\n");
+ code->appendf("\t\t\tcoord += %s;\n", imgInc);
code->appendf("\t\t}\n");
-
- state->fFSCode.appendf("\t\t%s = value%s;\n",
- outputColor,
- state->fModulate.c_str());
+ code->appendf("\t\t%s = value%s;\n", outputColor, builder->fModulate.c_str());
}
GrGLProgramStage::StageKey GrGLMorphologyEffect::GenKey(