| Index: src/effects/SkLightingImageFilter.cpp
 | 
| diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp
 | 
| index bb2927bbf402809970604e270ef53268645df5ec..c86bf6b628c59917df0424286022670c79d45ac2 100644
 | 
| --- a/src/effects/SkLightingImageFilter.cpp
 | 
| +++ b/src/effects/SkLightingImageFilter.cpp
 | 
| @@ -447,6 +447,7 @@ public:
 | 
|      virtual ~GrGLDistantLight() {}
 | 
|      virtual void setData(const GrGLUniformManager&, const SkLight* light) const SK_OVERRIDE;
 | 
|      virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRIDE;
 | 
| +
 | 
|  private:
 | 
|      typedef GrGLLight INHERITED;
 | 
|      UniformHandle fDirectionUni;
 | 
| @@ -459,6 +460,7 @@ public:
 | 
|      virtual ~GrGLPointLight() {}
 | 
|      virtual void setData(const GrGLUniformManager&, const SkLight* light) const SK_OVERRIDE;
 | 
|      virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRIDE;
 | 
| +
 | 
|  private:
 | 
|      typedef GrGLLight INHERITED;
 | 
|      SkPoint3 fLocation;
 | 
| @@ -473,6 +475,7 @@ public:
 | 
|      virtual void setData(const GrGLUniformManager&, const SkLight* light) const SK_OVERRIDE;
 | 
|      virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRIDE;
 | 
|      virtual void emitLightColor(GrGLShaderBuilder*, const char *surfaceToLight) SK_OVERRIDE;
 | 
| +
 | 
|  private:
 | 
|      typedef GrGLLight INHERITED;
 | 
|  
 | 
| @@ -509,6 +512,8 @@ public:
 | 
|      virtual bool isEqual(const SkLight& other) const {
 | 
|          return fColor == other.fColor;
 | 
|      }
 | 
| +    // Called to know whether the generated GrGLLight will require access to the fragment position.
 | 
| +    virtual bool requiresFragmentPosition() const = 0;
 | 
|  
 | 
|  protected:
 | 
|      SkLight(SkColor color)
 | 
| @@ -553,6 +558,8 @@ public:
 | 
|          return NULL;
 | 
|  #endif
 | 
|      }
 | 
| +    virtual bool requiresFragmentPosition() const SK_OVERRIDE { return false; }
 | 
| +
 | 
|      virtual bool isEqual(const SkLight& other) const SK_OVERRIDE {
 | 
|          if (other.type() != kDistant_LightType) {
 | 
|              return false;
 | 
| @@ -604,6 +611,7 @@ public:
 | 
|          return NULL;
 | 
|  #endif
 | 
|      }
 | 
| +    virtual bool requiresFragmentPosition() const SK_OVERRIDE { return true; }
 | 
|      virtual bool isEqual(const SkLight& other) const SK_OVERRIDE {
 | 
|          if (other.type() != kPoint_LightType) {
 | 
|              return false;
 | 
| @@ -674,6 +682,7 @@ public:
 | 
|          return NULL;
 | 
|  #endif
 | 
|      }
 | 
| +    virtual bool requiresFragmentPosition() const SK_OVERRIDE { return true; }
 | 
|      virtual LightType type() const { return kSpot_LightType; }
 | 
|      const SkPoint3& location() const { return fLocation; }
 | 
|      const SkPoint3& target() const { return fTarget; }
 | 
| @@ -1044,6 +1053,9 @@ GrLightingEffect::GrLightingEffect(GrTexture* texture, const SkLight* light, SkS
 | 
|      , fLight(light)
 | 
|      , fSurfaceScale(surfaceScale) {
 | 
|      fLight->ref();
 | 
| +    if (light->requiresFragmentPosition()) {
 | 
| +        this->setWillReadFragmentPosition();
 | 
| +    }
 | 
|  }
 | 
|  
 | 
|  GrLightingEffect::~GrLightingEffect() {
 | 
| 
 |