Index: cc/output/gl_renderer.cc |
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
index e614d8b56131bd8402fde62e17b13980da162268..fe11f9dd792cfb8d0b95dba9bc416522a94ef9b0 100644 |
--- a/cc/output/gl_renderer.cc |
+++ b/cc/output/gl_renderer.cc |
@@ -28,12 +28,10 @@ |
#include "cc/output/render_surface_filters.h" |
#include "cc/output/static_geometry_binding.h" |
#include "cc/quads/draw_polygon.h" |
-#include "cc/quads/picture_draw_quad.h" |
#include "cc/quads/render_pass.h" |
#include "cc/quads/stream_video_draw_quad.h" |
#include "cc/quads/texture_draw_quad.h" |
#include "cc/resources/layer_quad.h" |
-#include "cc/resources/scoped_gpu_raster.h" |
#include "cc/resources/scoped_resource.h" |
#include "cc/resources/texture_mailbox_deleter.h" |
#include "gpu/GLES2/gl2extchromium.h" |
@@ -158,40 +156,6 @@ static GLint GetActiveTextureUnit(GLES2Interface* gl) { |
return active_unit; |
} |
-class GLRenderer::ScopedUseGrContext { |
- public: |
- static scoped_ptr<ScopedUseGrContext> Create(GLRenderer* renderer, |
- DrawingFrame* frame) { |
- return make_scoped_ptr(new ScopedUseGrContext(renderer, frame)); |
- } |
- |
- ~ScopedUseGrContext() { |
- // Pass context control back to GLrenderer. |
- scoped_gpu_raster_ = nullptr; |
- renderer_->RestoreGLState(); |
- renderer_->RestoreFramebuffer(frame_); |
- } |
- |
- GrContext* context() const { |
- return renderer_->output_surface_->context_provider()->GrContext(); |
- } |
- |
- private: |
- ScopedUseGrContext(GLRenderer* renderer, DrawingFrame* frame) |
- : scoped_gpu_raster_( |
- new ScopedGpuRaster(renderer->output_surface_->context_provider())), |
- renderer_(renderer), |
- frame_(frame) { |
- // scoped_gpu_raster_ passes context control to Skia. |
- } |
- |
- scoped_ptr<ScopedGpuRaster> scoped_gpu_raster_; |
- GLRenderer* renderer_; |
- DrawingFrame* frame_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ScopedUseGrContext); |
-}; |
- |
struct GLRenderer::PendingAsyncReadPixels { |
PendingAsyncReadPixels() : buffer(0) {} |
@@ -521,6 +485,7 @@ void GLRenderer::DoDrawQuad(DrawingFrame* frame, |
switch (quad->material) { |
case DrawQuad::INVALID: |
+ case DrawQuad::UNUSED_SPACE_FOR_PICTURE_CONTENT: |
NOTREACHED(); |
break; |
case DrawQuad::CHECKERBOARD: |
@@ -534,10 +499,6 @@ void GLRenderer::DoDrawQuad(DrawingFrame* frame, |
DrawIOSurfaceQuad(frame, IOSurfaceDrawQuad::MaterialCast(quad), |
clip_region); |
break; |
- case DrawQuad::PICTURE_CONTENT: |
- // PictureDrawQuad should only be used for resourceless software draws. |
- NOTREACHED(); |
- break; |
case DrawQuad::RENDER_PASS: |
DrawRenderPassQuad(frame, RenderPassDrawQuad::MaterialCast(quad), |
clip_region); |
@@ -661,100 +622,6 @@ void GLRenderer::DrawDebugBorderQuad(const DrawingFrame* frame, |
GLC(gl_, gl_->DrawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, 0)); |
} |
-static skia::RefPtr<SkImage> ApplyImageFilter( |
- scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context, |
- ResourceProvider* resource_provider, |
- const gfx::Rect& rect, |
- const gfx::Vector2dF& scale, |
- SkImageFilter* filter, |
- ScopedResource* source_texture_resource) { |
- if (!filter) |
- return skia::RefPtr<SkImage>(); |
- |
- if (!use_gr_context) |
- return skia::RefPtr<SkImage>(); |
- |
- ResourceProvider::ScopedReadLockGL lock(resource_provider, |
- source_texture_resource->id()); |
- |
- // Wrap the source texture in a Ganesh platform texture. |
- GrBackendTextureDesc backend_texture_description; |
- backend_texture_description.fWidth = source_texture_resource->size().width(); |
- backend_texture_description.fHeight = |
- source_texture_resource->size().height(); |
- backend_texture_description.fConfig = kSkia8888_GrPixelConfig; |
- backend_texture_description.fTextureHandle = lock.texture_id(); |
- backend_texture_description.fOrigin = kBottomLeft_GrSurfaceOrigin; |
- skia::RefPtr<GrTexture> texture = |
- skia::AdoptRef(use_gr_context->context()->wrapBackendTexture( |
- backend_texture_description)); |
- if (!texture) { |
- TRACE_EVENT_INSTANT0("cc", |
- "ApplyImageFilter wrap background texture failed", |
- TRACE_EVENT_SCOPE_THREAD); |
- return skia::RefPtr<SkImage>(); |
- } |
- |
- SkImageInfo info = |
- SkImageInfo::MakeN32Premul(source_texture_resource->size().width(), |
- source_texture_resource->size().height()); |
- // Place the platform texture inside an SkBitmap. |
- SkBitmap source; |
- source.setInfo(info); |
- skia::RefPtr<SkGrPixelRef> pixel_ref = |
- skia::AdoptRef(new SkGrPixelRef(info, texture.get())); |
- source.setPixelRef(pixel_ref.get()); |
- |
- // Create a scratch texture for backing store. |
- GrTextureDesc desc; |
- desc.fFlags = kRenderTarget_GrTextureFlagBit | kNoStencil_GrTextureFlagBit; |
- desc.fSampleCnt = 0; |
- desc.fWidth = source.width(); |
- desc.fHeight = source.height(); |
- desc.fConfig = kSkia8888_GrPixelConfig; |
- desc.fOrigin = kBottomLeft_GrSurfaceOrigin; |
- skia::RefPtr<GrTexture> backing_store = |
- skia::AdoptRef(use_gr_context->context()->refScratchTexture( |
- desc, GrContext::kExact_ScratchTexMatch)); |
- if (!backing_store) { |
- TRACE_EVENT_INSTANT0("cc", |
- "ApplyImageFilter scratch texture allocation failed", |
- TRACE_EVENT_SCOPE_THREAD); |
- return skia::RefPtr<SkImage>(); |
- } |
- |
- // Create surface to draw into. |
- skia::RefPtr<SkSurface> surface = skia::AdoptRef( |
- SkSurface::NewRenderTargetDirect(backing_store->asRenderTarget())); |
- skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas()); |
- |
- // Draw the source bitmap through the filter to the canvas. |
- SkPaint paint; |
- paint.setImageFilter(filter); |
- canvas->clear(SK_ColorTRANSPARENT); |
- |
- // 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); |
- |
- skia::RefPtr<SkImage> image = skia::AdoptRef(surface->newImageSnapshot()); |
- if (!image || !image->getTexture()) { |
- return skia::RefPtr<SkImage>(); |
- } |
- |
- // Flush the GrContext to ensure all buffered GL calls are drawn to the |
- // backing store before we access and return it, and have cc begin using the |
- // GL context again. |
- canvas->flush(); |
- |
- return image; |
-} |
- |
bool GLRenderer::CanApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode) { |
return use_blend_equation_advanced_ || |
blend_mode == SkXfermode::kScreen_Mode || |
@@ -837,24 +704,6 @@ void GLRenderer::RestoreBlendFuncToDefault(SkXfermode::Mode blend_mode) { |
} |
} |
-bool GLRenderer::ShouldApplyBackgroundFilters(DrawingFrame* frame, |
- const RenderPassDrawQuad* quad) { |
- if (quad->background_filters.IsEmpty()) |
- return false; |
- |
- // TODO(danakj): We only allow background filters on an opaque render surface |
- // because other surfaces may contain translucent pixels, and the contents |
- // behind those translucent pixels wouldn't have the filter applied. |
- if (frame->current_render_pass->has_transparent_background) |
- return false; |
- |
- // TODO(ajuma): Add support for reference filters once |
- // FilterOperations::GetOutsets supports reference filters. |
- if (quad->background_filters.HasReferenceFilter()) |
- return false; |
- return true; |
-} |
- |
// This takes a gfx::Rect and a clip region quad in the same space, |
// and returns a quad with the same proportions in the space -0.5->0.5. |
bool GetScaledRegion(const gfx::Rect& rect, |
@@ -906,12 +755,6 @@ gfx::Rect GLRenderer::GetBackdropBoundingBoxForRenderPassQuad( |
gfx::Rect backdrop_rect = gfx::ToEnclosingRect(MathUtil::MapClippedRect( |
contents_device_transform, scaled_region.BoundingBox())); |
- if (ShouldApplyBackgroundFilters(frame, quad)) { |
- int top, right, bottom, left; |
- quad->background_filters.GetOutsets(&top, &right, &bottom, &left); |
- backdrop_rect.Inset(-left, -top, -right, -bottom); |
- } |
- |
if (!backdrop_rect.IsEmpty() && use_aa) { |
const int kOutsetForAntialiasing = 1; |
backdrop_rect.Inset(-kOutsetForAntialiasing, -kOutsetForAntialiasing); |
@@ -938,20 +781,6 @@ scoped_ptr<ScopedResource> GLRenderer::GetBackdropTexture( |
return device_background_texture.Pass(); |
} |
-skia::RefPtr<SkImage> GLRenderer::ApplyBackgroundFilters( |
- DrawingFrame* frame, |
- const RenderPassDrawQuad* quad, |
- ScopedResource* background_texture) { |
- DCHECK(ShouldApplyBackgroundFilters(frame, quad)); |
- 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, |
- quad->filters_scale, filter.get(), background_texture); |
- return background_with_filters; |
-} |
- |
void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
const RenderPassDrawQuad* quad, |
const gfx::QuadF* clip_region) { |
@@ -981,7 +810,6 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
SkXfermode::Mode blend_mode = quad->shared_quad_state->blend_mode; |
bool use_shaders_for_blending = |
!CanApplyBlendModeUsingBlendFunc(blend_mode) || |
- ShouldApplyBackgroundFilters(frame, quad) || |
settings_->force_blending_with_shaders; |
scoped_ptr<ScopedResource> background_texture; |
@@ -1004,13 +832,6 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
// amount of memory used by render surfaces: |
// LayerTreeHost::CalculateMemoryForRenderSurfaces. |
background_texture = GetBackdropTexture(background_rect); |
- |
- if (ShouldApplyBackgroundFilters(frame, quad) && background_texture) { |
- // Apply the background filters to R, so that it is applied in the |
- // pixels' coordinate space. |
- background_image = |
- ApplyBackgroundFilters(frame, quad, background_texture.get()); |
- } |
} |
if (!background_texture) { |
@@ -1021,11 +842,6 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
// Reset original background texture if there is not any mask |
if (!quad->mask_resource_id) |
background_texture.reset(); |
- } else if (CanApplyBlendModeUsingBlendFunc(blend_mode) && |
- ShouldApplyBackgroundFilters(frame, quad)) { |
- // Something went wrong with applying background filters to the backdrop. |
- use_shaders_for_blending = false; |
- background_texture.reset(); |
} |
} |
// Need original background texture for mask? |
@@ -1042,29 +858,7 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
skia::RefPtr<SkImage> filter_image; |
SkScalar color_matrix[20]; |
bool use_color_matrix = false; |
- if (!quad->filters.IsEmpty()) { |
- skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( |
- quad->filters, contents_texture->size()); |
- if (filter) { |
- skia::RefPtr<SkColorFilter> cf; |
- |
- { |
- SkColorFilter* colorfilter_rawptr = NULL; |
- filter->asColorFilter(&colorfilter_rawptr); |
- cf = skia::AdoptRef(colorfilter_rawptr); |
- } |
- |
- if (cf && cf->asColorMatrix(color_matrix) && !filter->getInput(0)) { |
- // We have a single color matrix as a filter; apply it locally |
- // in the compositor. |
- use_color_matrix = true; |
- } else { |
- filter_image = ApplyImageFilter( |
- ScopedUseGrContext::Create(this, frame), resource_provider_, |
- quad->rect, quad->filters_scale, filter.get(), contents_texture); |
- } |
- } |
- } |
+ DCHECK(quad->filters.IsEmpty()); |
scoped_ptr<ResourceProvider::ScopedSamplerGL> mask_resource_lock; |
unsigned mask_texture_id = 0; |