aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/effects/GrConvolutionEffect.cpp
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-07-16 13:36:18 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-07-16 13:36:18 +0000
commit032b221dadb6eb8283ac2d1bc8913ee7bb5cfe7a (patch)
tree7b97452a7937949417cc40a4817cf4c4ede8e4ab /src/gpu/effects/GrConvolutionEffect.cpp
parent96cbd2c4d2ea7e138b65923a46fb77bc096a6782 (diff)
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
Diffstat (limited to 'src/gpu/effects/GrConvolutionEffect.cpp')
-rw-r--r--src/gpu/effects/GrConvolutionEffect.cpp80
1 files changed, 43 insertions, 37 deletions
diff --git a/src/gpu/effects/GrConvolutionEffect.cpp b/src/gpu/effects/GrConvolutionEffect.cpp
index 3804d57130..a16313eac8 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 @@ public:
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 @@ private:
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,