| Index: cc/output/gl_renderer.cc
 | 
| diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
 | 
| index 5a15efa89fd9d3587b53d491c9b175b592bb7f34..2612f10e98f17b7472f9ef31a04f70fcc1689538 100644
 | 
| --- a/cc/output/gl_renderer.cc
 | 
| +++ b/cc/output/gl_renderer.cc
 | 
| @@ -624,7 +624,7 @@ void GLRenderer::DrawDebugBorderQuad(const DrawingFrame* frame,
 | 
|  static skia::RefPtr<SkImage> ApplyImageFilter(
 | 
|      scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context,
 | 
|      ResourceProvider* resource_provider,
 | 
| -    const gfx::Point& origin,
 | 
| +    const gfx::Rect& rect,
 | 
|      const gfx::Vector2dF& scale,
 | 
|      SkImageFilter* filter,
 | 
|      ScopedResource* source_texture_resource) {
 | 
| @@ -693,7 +693,12 @@ static skia::RefPtr<SkImage> ApplyImageFilter(
 | 
|    paint.setImageFilter(filter);
 | 
|    canvas->clear(SK_ColorTRANSPARENT);
 | 
|  
 | 
| -  canvas->translate(SkIntToScalar(-origin.x()), SkIntToScalar(-origin.y()));
 | 
| +  // The origin of the filter is top-left and the origin of the source is
 | 
| +  // bottom-left, but the orientation is the same, so we must translate the
 | 
| +  // filter so that it renders at the bottom of the texture to avoid
 | 
| +  // misregistration.
 | 
| +  int y_translate = source.height() - rect.height() - rect.origin().y();
 | 
| +  canvas->translate(-rect.origin().x(), y_translate);
 | 
|    canvas->scale(scale.x(), scale.y());
 | 
|    canvas->drawSprite(source, 0, 0, &paint);
 | 
|  
 | 
| @@ -858,13 +863,9 @@ skia::RefPtr<SkImage> GLRenderer::ApplyBackgroundFilters(
 | 
|    skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter(
 | 
|        quad->background_filters, background_texture->size());
 | 
|  
 | 
| -  skia::RefPtr<SkImage> background_with_filters =
 | 
| -      ApplyImageFilter(ScopedUseGrContext::Create(this, frame),
 | 
| -                       resource_provider_,
 | 
| -                       quad->rect.origin(),
 | 
| -                       quad->filters_scale,
 | 
| -                       filter.get(),
 | 
| -                       background_texture);
 | 
| +  skia::RefPtr<SkImage> background_with_filters = ApplyImageFilter(
 | 
| +      ScopedUseGrContext::Create(this, frame), resource_provider_, quad->rect,
 | 
| +      quad->filters_scale, filter.get(), background_texture);
 | 
|    return background_with_filters;
 | 
|  }
 | 
|  
 | 
| @@ -970,12 +971,9 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame,
 | 
|          // in the compositor.
 | 
|          use_color_matrix = true;
 | 
|        } else {
 | 
| -        filter_image = ApplyImageFilter(ScopedUseGrContext::Create(this, frame),
 | 
| -                                        resource_provider_,
 | 
| -                                        quad->rect.origin(),
 | 
| -                                        quad->filters_scale,
 | 
| -                                        filter.get(),
 | 
| -                                        contents_texture);
 | 
| +        filter_image = ApplyImageFilter(
 | 
| +            ScopedUseGrContext::Create(this, frame), resource_provider_,
 | 
| +            quad->rect, quad->filters_scale, filter.get(), contents_texture);
 | 
|        }
 | 
|      }
 | 
|    }
 | 
| @@ -2711,6 +2709,8 @@ bool GLRenderer::BindFramebufferToTexture(DrawingFrame* frame,
 | 
|                                            const gfx::Rect& target_rect) {
 | 
|    DCHECK(texture->id());
 | 
|  
 | 
| +  // Explicitly release lock, otherwise we can crash when try to lock
 | 
| +  // same texture again.
 | 
|    current_framebuffer_lock_ = nullptr;
 | 
|  
 | 
|    SetStencilEnabled(false);
 | 
| 
 |