Index: src/gpu/effects/GrConvolutionEffect.cpp |
diff --git a/src/gpu/effects/GrConvolutionEffect.cpp b/src/gpu/effects/GrConvolutionEffect.cpp |
index e7fb8e5403d9c6bc60c6f2a923d252c83e757b6d..7c06c063e3dea602c0a7bcb5ae6cb09b5f8184dd 100644 |
--- a/src/gpu/effects/GrConvolutionEffect.cpp |
+++ b/src/gpu/effects/GrConvolutionEffect.cpp |
@@ -12,10 +12,6 @@ |
#include "gl/GrGLTexture.h" |
#include "GrTBackendEffectFactory.h" |
-// For brevity |
-typedef GrGLUniformManager::UniformHandle UniformHandle; |
-static const UniformHandle kInvalidUniformHandle = GrGLUniformManager::kInvalidUniformHandle; |
- |
class GrGLConvolutionEffect : public GrGLEffect { |
public: |
GrGLConvolutionEffect(const GrBackendEffectFactory&, const GrDrawEffect&); |
@@ -27,7 +23,7 @@ public: |
const char* inputColor, |
const TextureSamplerArray&) SK_OVERRIDE; |
- virtual void setData(const GrGLUniformManager& uman, const GrDrawEffect&) SK_OVERRIDE; |
+ virtual void setData(const GrGLContext& context, const GrDrawEffect&) SK_OVERRIDE; |
static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); |
@@ -39,9 +35,9 @@ private: |
int fRadius; |
bool fUseBounds; |
Gr1DKernelEffect::Direction fDirection; |
- UniformHandle fKernelUni; |
- UniformHandle fImageIncrementUni; |
- UniformHandle fBoundsUni; |
+ GrGLUniform* fKernelUni; |
+ GrGLUniform* fImageIncrementUni; |
+ GrGLUniform* fBoundsUni; |
GrGLEffectMatrix fEffectMatrix; |
typedef GrGLEffect INHERITED; |
@@ -50,9 +46,9 @@ private: |
GrGLConvolutionEffect::GrGLConvolutionEffect(const GrBackendEffectFactory& factory, |
const GrDrawEffect& drawEffect) |
: INHERITED(factory) |
- , fKernelUni(kInvalidUniformHandle) |
- , fImageIncrementUni(kInvalidUniformHandle) |
- , fBoundsUni(kInvalidUniformHandle) |
+ , fKernelUni(NULL) |
+ , fImageIncrementUni(NULL) |
+ , fBoundsUni(NULL) |
, fEffectMatrix(drawEffect.castEffect<GrConvolutionEffect>().coordsType()) { |
const GrConvolutionEffect& c = drawEffect.castEffect<GrConvolutionEffect>(); |
fRadius = c.radius(); |
@@ -68,39 +64,46 @@ void GrGLConvolutionEffect::emitCode(GrGLShaderBuilder* builder, |
const TextureSamplerArray& samplers) { |
const char* coords; |
fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords); |
- fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
- kVec2f_GrSLType, "ImageIncrement"); |
+ GrGLShaderBuilder::Uniform* imageIncrementUni = |
+ builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
+ kVec2f_GrSLType, "ImageIncrement"); |
+ fImageIncrementUni = imageIncrementUni->glUniform(); |
+ |
+ GrGLShaderBuilder::Uniform* boundsUni = NULL; |
+ |
if (this->useBounds()) { |
- fBoundsUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
- kVec2f_GrSLType, "Bounds"); |
+ boundsUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
+ kVec2f_GrSLType, "Bounds"); |
+ fBoundsUni = boundsUni->glUniform(); |
} |
- fKernelUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_ShaderType, |
- kFloat_GrSLType, "Kernel", this->width()); |
+ |
+ GrGLShaderBuilder::Uniform* kernelUni = |
+ builder->addUniformArray(GrGLShaderBuilder::kFragment_ShaderType, |
+ kFloat_GrSLType, "Kernel", this->width()); |
+ fKernelUni = kernelUni->glUniform(); |
builder->fsCodeAppendf("\t\t%s = vec4(0, 0, 0, 0);\n", outputColor); |
int width = this->width(); |
- const GrGLShaderVar& kernel = builder->getUniformVariable(fKernelUni); |
- const char* imgInc = builder->getUniformCStr(fImageIncrementUni); |
- builder->fsCodeAppendf("\t\tvec2 coord = %s - %d.0 * %s;\n", coords, fRadius, imgInc); |
+ builder->fsCodeAppendf("\t\tvec2 coord = %s - %d.0 * %s;\n", coords, fRadius, imageIncrementUni->c_str()); |
// 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); |
- kernel.appendArrayAccess(index.c_str(), &kernelIndex); |
+ kernelUni->appendArrayAccess(index.c_str(), &kernelIndex); |
builder->fsCodeAppendf("\t\t%s += ", outputColor); |
builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, samplers[0], "coord"); |
if (this->useBounds()) { |
- const char* bounds = builder->getUniformCStr(fBoundsUni); |
+ const char* bounds = boundsUni->c_str(); |
const char* component = this->direction() == Gr1DKernelEffect::kY_Direction ? "y" : "x"; |
builder->fsCodeAppendf(" * float(coord.%s >= %s.x && coord.%s <= %s.y)", |
component, bounds, component, bounds); |
} |
builder->fsCodeAppendf(" * %s;\n", kernelIndex.c_str()); |
- builder->fsCodeAppendf("\t\tcoord += %s;\n", imgInc); |
+ builder->fsCodeAppendf("\t\tcoord += %s;\n", imageIncrementUni->c_str()); |
} |
SkString modulate; |
@@ -108,7 +111,7 @@ void GrGLConvolutionEffect::emitCode(GrGLShaderBuilder* builder, |
builder->fsCodeAppend(modulate.c_str()); |
} |
-void GrGLConvolutionEffect::setData(const GrGLUniformManager& uman, |
+void GrGLConvolutionEffect::setData(const GrGLContext& context, |
const GrDrawEffect& drawEffect) { |
const GrConvolutionEffect& conv = drawEffect.castEffect<GrConvolutionEffect>(); |
GrTexture& texture = *conv.texture(0); |
@@ -126,18 +129,18 @@ void GrGLConvolutionEffect::setData(const GrGLUniformManager& uman, |
default: |
GrCrash("Unknown filter direction."); |
} |
- uman.set2fv(fImageIncrementUni, 0, 1, imageIncrement); |
+ fImageIncrementUni->set2fv(context, 0, 1, imageIncrement); |
if (conv.useBounds()) { |
const float* bounds = conv.bounds(); |
if (Gr1DKernelEffect::kY_Direction == conv.direction() && |
texture.origin() != kTopLeft_GrSurfaceOrigin) { |
- uman.set2f(fBoundsUni, 1.0f - bounds[1], 1.0f - bounds[0]); |
+ fBoundsUni->set2f(context, 1.0f - bounds[1], 1.0f - bounds[0]); |
} else { |
- uman.set2f(fBoundsUni, bounds[0], bounds[1]); |
+ fBoundsUni->set2f(context, bounds[0], bounds[1]); |
} |
} |
- uman.set1fv(fKernelUni, 0, this->width(), conv.kernel()); |
- fEffectMatrix.setData(uman, conv.getMatrix(), drawEffect, conv.texture(0)); |
+ fKernelUni->set1fv(context, 0, this->width(), conv.kernel()); |
+ fEffectMatrix.setData(context, conv.getMatrix(), drawEffect, conv.texture(0)); |
} |
GrGLEffect::EffectKey GrGLConvolutionEffect::GenKey(const GrDrawEffect& drawEffect, |