| Index: cc/output/skia_renderer.cc
|
| diff --git a/cc/output/software_renderer.cc b/cc/output/skia_renderer.cc
|
| similarity index 70%
|
| copy from cc/output/software_renderer.cc
|
| copy to cc/output/skia_renderer.cc
|
| index 13d13418b200149d5245614386e93e7c6cac619e..3de7f8f55fd332579f50137fcb327c115f064726 100644
|
| --- a/cc/output/software_renderer.cc
|
| +++ b/cc/output/skia_renderer.cc
|
| @@ -2,7 +2,7 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "cc/output/software_renderer.h"
|
| +#include "cc/output/skia_renderer.h"
|
|
|
| #include "base/memory/ptr_util.h"
|
| #include "base/trace_event/trace_event.h"
|
| @@ -20,6 +20,7 @@
|
| #include "cc/quads/solid_color_draw_quad.h"
|
| #include "cc/quads/texture_draw_quad.h"
|
| #include "cc/quads/tile_draw_quad.h"
|
| +#include "gpu/command_buffer/client/gles2_interface.h"
|
| #include "skia/ext/opacity_filter_canvas.h"
|
| #include "third_party/skia/include/core/SkCanvas.h"
|
| #include "third_party/skia/include/core/SkColor.h"
|
| @@ -29,6 +30,7 @@
|
| #include "third_party/skia/include/core/SkPoint.h"
|
| #include "third_party/skia/include/core/SkShader.h"
|
| #include "third_party/skia/include/effects/SkLayerRasterizer.h"
|
| +#include "third_party/skia/include/gpu/GrContext.h"
|
| #include "ui/gfx/geometry/rect_conversions.h"
|
| #include "ui/gfx/skia_util.h"
|
| #include "ui/gfx/transform.h"
|
| @@ -52,26 +54,25 @@ bool IsScaleAndIntegerTranslate(const SkMatrix& matrix) {
|
|
|
| } // anonymous namespace
|
|
|
| -std::unique_ptr<SoftwareRenderer> SoftwareRenderer::Create(
|
| +std::unique_ptr<SkiaRenderer> SkiaRenderer::Create(
|
| RendererClient* client,
|
| const RendererSettings* settings,
|
| OutputSurface* output_surface,
|
| ResourceProvider* resource_provider,
|
| bool use_image_hijack_canvas) {
|
| - return base::WrapUnique(new SoftwareRenderer(client, settings, output_surface,
|
| - resource_provider,
|
| - use_image_hijack_canvas));
|
| + return base::WrapUnique(new SkiaRenderer(client, settings, output_surface,
|
| + resource_provider,
|
| + use_image_hijack_canvas));
|
| }
|
|
|
| -SoftwareRenderer::SoftwareRenderer(RendererClient* client,
|
| - const RendererSettings* settings,
|
| - OutputSurface* output_surface,
|
| - ResourceProvider* resource_provider,
|
| - bool use_image_hijack_canvas)
|
| +SkiaRenderer::SkiaRenderer(RendererClient* client,
|
| + const RendererSettings* settings,
|
| + OutputSurface* output_surface,
|
| + ResourceProvider* resource_provider,
|
| + bool use_image_hijack_canvas)
|
| : DirectRenderer(client, settings, output_surface, resource_provider),
|
| is_scissor_enabled_(false),
|
| is_backbuffer_discarded_(false),
|
| - output_device_(output_surface->software_device()),
|
| current_canvas_(nullptr),
|
| use_image_hijack_canvas_(use_image_hijack_canvas) {
|
| if (resource_provider_) {
|
| @@ -79,7 +80,7 @@ SoftwareRenderer::SoftwareRenderer(RendererClient* client,
|
| capabilities_.best_texture_format =
|
| resource_provider_->best_texture_format();
|
| }
|
| - // The updater can access bitmaps while the SoftwareRenderer is using them.
|
| + // The updater can access bitmaps while the SkiaRenderer is using them.
|
| capabilities_.allow_partial_texture_updates = true;
|
| capabilities_.using_partial_swap = true;
|
|
|
| @@ -88,44 +89,91 @@ SoftwareRenderer::SoftwareRenderer(RendererClient* client,
|
| capabilities_.allow_rasterize_on_demand = true;
|
| }
|
|
|
| -SoftwareRenderer::~SoftwareRenderer() {}
|
| +SkiaRenderer::~SkiaRenderer() {}
|
|
|
| -const RendererCapabilitiesImpl& SoftwareRenderer::Capabilities() const {
|
| +const RendererCapabilitiesImpl& SkiaRenderer::Capabilities() const {
|
| return capabilities_;
|
| }
|
|
|
| -void SoftwareRenderer::BeginDrawingFrame(DrawingFrame* frame) {
|
| - TRACE_EVENT0("cc", "SoftwareRenderer::BeginDrawingFrame");
|
| - root_canvas_ = output_device_->BeginPaint(frame->root_damage_rect);
|
| +void SkiaRenderer::BeginDrawingFrame(DrawingFrame* frame) {
|
| + TRACE_EVENT0("cc", "SkiaRenderer::BeginDrawingFrame");
|
| +
|
| + // ----- BEGIN COPYPASTA FROM GL RENDERER
|
| + bool use_sync_query_ = false;
|
| + scoped_refptr<ResourceProvider::Fence> read_lock_fence;
|
| + if (use_sync_query_) {
|
| +#if 0
|
| + // Block until oldest sync query has passed if the number of pending queries
|
| + // ever reach kMaxPendingSyncQueries.
|
| + if (pending_sync_queries_.size() >= kMaxPendingSyncQueries) {
|
| + LOG(ERROR) << "Reached limit of pending sync queries.";
|
| +
|
| + pending_sync_queries_.front()->Wait();
|
| + DCHECK(!pending_sync_queries_.front()->IsPending());
|
| + }
|
| +
|
| + while (!pending_sync_queries_.empty()) {
|
| + if (pending_sync_queries_.front()->IsPending())
|
| + break;
|
| +
|
| + available_sync_queries_.push_back(PopFront(&pending_sync_queries_));
|
| + }
|
| +
|
| + current_sync_query_ = available_sync_queries_.empty()
|
| + ? base::WrapUnique(new SyncQuery(gl_))
|
| + : PopFront(&available_sync_queries_);
|
| +
|
| + read_lock_fence = current_sync_query_->Begin();
|
| +#endif
|
| + } else {
|
| + read_lock_fence = make_scoped_refptr(new ResourceProvider::SynchronousFence(
|
| + output_surface_->context_provider()->ContextGL()));
|
| + }
|
| + resource_provider_->SetReadLockFence(read_lock_fence.get());
|
| +
|
| + // Insert WaitSyncTokenCHROMIUM on quad resources prior to drawing the frame,
|
| + // so that drawing can proceed without GL context switching interruptions.
|
| + ResourceProvider* resource_provider = resource_provider_;
|
| + for (const auto& pass : *frame->render_passes_in_draw_order) {
|
| + for (const auto& quad : pass->quad_list) {
|
| + for (ResourceId resource_id : quad->resources)
|
| + resource_provider->WaitSyncTokenIfNeeded(resource_id);
|
| + }
|
| + }
|
| + // ----- END COPYPASTA FROM GL RENDERER
|
| }
|
|
|
| -void SoftwareRenderer::FinishDrawingFrame(DrawingFrame* frame) {
|
| - TRACE_EVENT0("cc", "SoftwareRenderer::FinishDrawingFrame");
|
| +void SkiaRenderer::FinishDrawingFrame(DrawingFrame* frame) {
|
| + TRACE_EVENT0("cc", "SkiaRenderer::FinishDrawingFrame");
|
| + current_framebuffer_surface_lock_ = nullptr;
|
| current_framebuffer_lock_ = nullptr;
|
| - current_framebuffer_canvas_.reset();
|
| - current_canvas_ = NULL;
|
| - root_canvas_ = NULL;
|
| -
|
| - output_device_->EndPaint();
|
| + current_canvas_ = nullptr;
|
| }
|
|
|
| -void SoftwareRenderer::SwapBuffers(const CompositorFrameMetadata& metadata) {
|
| - TRACE_EVENT0("cc,benchmark", "SoftwareRenderer::SwapBuffers");
|
| +void SkiaRenderer::SwapBuffers(const CompositorFrameMetadata& metadata) {
|
| + TRACE_EVENT0("cc,benchmark", "SkiaRenderer::SwapBuffers");
|
| CompositorFrame compositor_frame;
|
| compositor_frame.metadata = metadata;
|
| +
|
| + compositor_frame.gl_frame_data = base::WrapUnique(new GLFrameData);
|
| + gfx::Size surface_size = output_surface_->SurfaceSize();
|
| + // TODO(enne): add in partial swap stuff here from gl renderer
|
| + compositor_frame.gl_frame_data->size = surface_size;
|
| + compositor_frame.gl_frame_data->sub_buffer_rect = gfx::Rect(surface_size);
|
| +
|
| output_surface_->SwapBuffers(&compositor_frame);
|
| }
|
|
|
| -bool SoftwareRenderer::FlippedFramebuffer(const DrawingFrame* frame) const {
|
| +bool SkiaRenderer::FlippedFramebuffer(const DrawingFrame* frame) const {
|
| return false;
|
| }
|
|
|
| -void SoftwareRenderer::EnsureScissorTestEnabled() {
|
| +void SkiaRenderer::EnsureScissorTestEnabled() {
|
| is_scissor_enabled_ = true;
|
| SetClipRect(scissor_rect_);
|
| }
|
|
|
| -void SoftwareRenderer::EnsureScissorTestDisabled() {
|
| +void SkiaRenderer::EnsureScissorTestDisabled() {
|
| // There is no explicit notion of enabling/disabling scissoring in software
|
| // rendering, but the underlying effect we want is to clear any existing
|
| // clipRect on the current SkCanvas. This is done by setting clipRect to
|
| @@ -137,39 +185,72 @@ void SoftwareRenderer::EnsureScissorTestDisabled() {
|
| SetClipRect(gfx::Rect(size.width(), size.height()));
|
| }
|
|
|
| -void SoftwareRenderer::Finish() {}
|
| +void SkiaRenderer::Finish() {}
|
|
|
| -void SoftwareRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) {
|
| +void SkiaRenderer::BindFramebufferToOutputSurface(DrawingFrame* frame) {
|
| DCHECK(!output_surface_->HasExternalStencilTest());
|
| current_framebuffer_lock_ = nullptr;
|
| - current_framebuffer_canvas_.reset();
|
| +
|
| + // TODO(enne): Probably don't need to recreate this every frame?
|
| + GrBackendRenderTargetDesc desc;
|
| + desc.fWidth = frame->device_viewport_rect.width();
|
| + desc.fHeight = frame->device_viewport_rect.height();
|
| + desc.fConfig = kRGBA_8888_GrPixelConfig;
|
| + desc.fOrigin = kBottomLeft_GrSurfaceOrigin;
|
| + desc.fSampleCnt = 1;
|
| + desc.fStencilBits = 8;
|
| + desc.fRenderTargetHandle = 0;
|
| +
|
| + GrContext* gr_context = output_surface_->context_provider()->GrContext();
|
| +
|
| + // Copypasta from resource_provider
|
| + // Use unknown pixel geometry to disable LCD text.
|
| + bool use_distance_field_text = false;
|
| + bool can_use_lcd_text = true;
|
| + uint32_t flags =
|
| + use_distance_field_text ? SkSurfaceProps::kUseDistanceFieldFonts_Flag : 0;
|
| + SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry);
|
| + if (can_use_lcd_text) {
|
| + // LegacyFontHost will get LCD text and skia figures out what type to use.
|
| + surface_props =
|
| + SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType);
|
| + }
|
| + root_surface_ =
|
| + SkSurface::MakeFromBackendRenderTarget(gr_context, desc, &surface_props);
|
| + root_canvas_ = root_surface_->getCanvas();
|
| +
|
| current_canvas_ = root_canvas_;
|
| }
|
|
|
| -bool SoftwareRenderer::BindFramebufferToTexture(
|
| - DrawingFrame* frame,
|
| - const ScopedResource* texture) {
|
| +bool SkiaRenderer::BindFramebufferToTexture(DrawingFrame* frame,
|
| + const ScopedResource* texture) {
|
| DCHECK(texture->id());
|
|
|
| // Explicitly release lock, otherwise we can crash when try to lock
|
| // same texture again.
|
| + current_framebuffer_surface_lock_ = nullptr;
|
| current_framebuffer_lock_ = nullptr;
|
| current_framebuffer_lock_ =
|
| - base::WrapUnique(new ResourceProvider::ScopedWriteLockSoftware(
|
| - resource_provider_, texture->id()));
|
| - current_framebuffer_canvas_ =
|
| - sk_make_sp<SkCanvas>(current_framebuffer_lock_->sk_bitmap());
|
| - current_canvas_ = current_framebuffer_canvas_.get();
|
| + base::WrapUnique(new ResourceProvider::ScopedWriteLockGL(
|
| + resource_provider_, texture->id(), false));
|
| +
|
| + current_framebuffer_surface_lock_ =
|
| + base::WrapUnique(new ResourceProvider::ScopedSkSurfaceProvider(
|
| + output_surface_->context_provider(), current_framebuffer_lock_.get(),
|
| + false, false, true, 0));
|
| +
|
| + current_canvas_ =
|
| + current_framebuffer_surface_lock_->sk_surface()->getCanvas();
|
| return true;
|
| }
|
|
|
| -void SoftwareRenderer::SetScissorTestRect(const gfx::Rect& scissor_rect) {
|
| +void SkiaRenderer::SetScissorTestRect(const gfx::Rect& scissor_rect) {
|
| is_scissor_enabled_ = true;
|
| scissor_rect_ = scissor_rect;
|
| SetClipRect(scissor_rect);
|
| }
|
|
|
| -void SoftwareRenderer::SetClipRect(const gfx::Rect& rect) {
|
| +void SkiaRenderer::SetClipRect(const gfx::Rect& rect) {
|
| if (!current_canvas_)
|
| return;
|
| // Skia applies the current matrix to clip rects so we reset it temporary.
|
| @@ -179,7 +260,7 @@ void SoftwareRenderer::SetClipRect(const gfx::Rect& rect) {
|
| current_canvas_->setMatrix(current_matrix);
|
| }
|
|
|
| -void SoftwareRenderer::ClearCanvas(SkColor color) {
|
| +void SkiaRenderer::ClearCanvas(SkColor color) {
|
| if (!current_canvas_)
|
| return;
|
| // SkCanvas::clear doesn't respect the current clipping region
|
| @@ -190,7 +271,7 @@ void SoftwareRenderer::ClearCanvas(SkColor color) {
|
| current_canvas_->clear(color);
|
| }
|
|
|
| -void SoftwareRenderer::ClearFramebuffer(DrawingFrame* frame) {
|
| +void SkiaRenderer::ClearFramebuffer(DrawingFrame* frame) {
|
| if (frame->current_render_pass->has_transparent_background) {
|
| ClearCanvas(SkColorSetARGB(0, 0, 0, 0));
|
| } else {
|
| @@ -202,7 +283,7 @@ void SoftwareRenderer::ClearFramebuffer(DrawingFrame* frame) {
|
| }
|
| }
|
|
|
| -void SoftwareRenderer::PrepareSurfaceForPass(
|
| +void SkiaRenderer::PrepareSurfaceForPass(
|
| DrawingFrame* frame,
|
| SurfaceInitializationMode initialization_mode,
|
| const gfx::Rect& render_pass_scissor) {
|
| @@ -221,29 +302,30 @@ void SoftwareRenderer::PrepareSurfaceForPass(
|
| }
|
| }
|
|
|
| -bool SoftwareRenderer::IsSoftwareResource(ResourceId resource_id) const {
|
| +// TODO(enne): doot dee doo
|
| +bool SkiaRenderer::IsSoftwareResource(ResourceId resource_id) const {
|
| switch (resource_provider_->GetResourceType(resource_id)) {
|
| case ResourceProvider::RESOURCE_TYPE_GPU_MEMORY_BUFFER:
|
| case ResourceProvider::RESOURCE_TYPE_GL_TEXTURE:
|
| - return false;
|
| - case ResourceProvider::RESOURCE_TYPE_BITMAP:
|
| return true;
|
| + case ResourceProvider::RESOURCE_TYPE_BITMAP:
|
| + return false;
|
| }
|
|
|
| LOG(FATAL) << "Invalid resource type.";
|
| return false;
|
| }
|
|
|
| -void SoftwareRenderer::DoDrawQuad(DrawingFrame* frame,
|
| - const DrawQuad* quad,
|
| - const gfx::QuadF* draw_region) {
|
| +void SkiaRenderer::DoDrawQuad(DrawingFrame* frame,
|
| + const DrawQuad* quad,
|
| + const gfx::QuadF* draw_region) {
|
| if (!current_canvas_)
|
| return;
|
| if (draw_region) {
|
| current_canvas_->save();
|
| }
|
|
|
| - TRACE_EVENT0("cc", "SoftwareRenderer::DoDrawQuad");
|
| + TRACE_EVENT0("cc", "SkiaRenderer::DoDrawQuad");
|
| gfx::Transform quad_rect_matrix;
|
| QuadRectTransform(&quad_rect_matrix,
|
| quad->shared_quad_state->quad_to_target_transform,
|
| @@ -261,10 +343,9 @@ void SoftwareRenderer::DoDrawQuad(DrawingFrame* frame,
|
| !IsScaleAndIntegerTranslate(sk_device_matrix)) {
|
| // TODO(danakj): Until we can enable AA only on exterior edges of the
|
| // layer, disable AA if any interior edges are present. crbug.com/248175
|
| - bool all_four_edges_are_exterior = quad->IsTopEdge() &&
|
| - quad->IsLeftEdge() &&
|
| - quad->IsBottomEdge() &&
|
| - quad->IsRightEdge();
|
| + bool all_four_edges_are_exterior =
|
| + quad->IsTopEdge() && quad->IsLeftEdge() && quad->IsBottomEdge() &&
|
| + quad->IsRightEdge();
|
| if (settings_->allow_antialiasing &&
|
| (settings_->force_antialiasing || all_four_edges_are_exterior))
|
| current_paint_.setAntiAlias(true);
|
| @@ -334,14 +415,13 @@ void SoftwareRenderer::DoDrawQuad(DrawingFrame* frame,
|
| }
|
| }
|
|
|
| -void SoftwareRenderer::DrawDebugBorderQuad(const DrawingFrame* frame,
|
| - const DebugBorderDrawQuad* quad) {
|
| +void SkiaRenderer::DrawDebugBorderQuad(const DrawingFrame* frame,
|
| + const DebugBorderDrawQuad* quad) {
|
| // We need to apply the matrix manually to have pixel-sized stroke width.
|
| SkPoint vertices[4];
|
| gfx::RectFToSkRect(QuadVertexRect()).toQuad(vertices);
|
| SkPoint transformed_vertices[4];
|
| - current_canvas_->getTotalMatrix().mapPoints(transformed_vertices,
|
| - vertices,
|
| + current_canvas_->getTotalMatrix().mapPoints(transformed_vertices, vertices,
|
| 4);
|
| current_canvas_->resetMatrix();
|
|
|
| @@ -350,17 +430,16 @@ void SoftwareRenderer::DrawDebugBorderQuad(const DrawingFrame* frame,
|
| SkColorGetA(quad->color));
|
| current_paint_.setStyle(SkPaint::kStroke_Style);
|
| current_paint_.setStrokeWidth(quad->width);
|
| - current_canvas_->drawPoints(SkCanvas::kPolygon_PointMode,
|
| - 4, transformed_vertices, current_paint_);
|
| + current_canvas_->drawPoints(SkCanvas::kPolygon_PointMode, 4,
|
| + transformed_vertices, current_paint_);
|
| }
|
|
|
| -void SoftwareRenderer::DrawPictureQuad(const DrawingFrame* frame,
|
| - const PictureDrawQuad* quad) {
|
| +void SkiaRenderer::DrawPictureQuad(const DrawingFrame* frame,
|
| + const PictureDrawQuad* quad) {
|
| SkMatrix content_matrix;
|
| - content_matrix.setRectToRect(
|
| - gfx::RectFToSkRect(quad->tex_coord_rect),
|
| - gfx::RectFToSkRect(QuadVertexRect()),
|
| - SkMatrix::kFill_ScaleToFit);
|
| + content_matrix.setRectToRect(gfx::RectFToSkRect(quad->tex_coord_rect),
|
| + gfx::RectFToSkRect(QuadVertexRect()),
|
| + SkMatrix::kFill_ScaleToFit);
|
| current_canvas_->concat(content_matrix);
|
|
|
| const bool needs_transparency =
|
| @@ -368,7 +447,7 @@ void SoftwareRenderer::DrawPictureQuad(const DrawingFrame* frame,
|
| const bool disable_image_filtering =
|
| frame->disable_picture_quad_image_filtering || quad->nearest_neighbor;
|
|
|
| - TRACE_EVENT0("cc", "SoftwareRenderer::DrawPictureQuad");
|
| + TRACE_EVENT0("cc", "SkiaRenderer::DrawPictureQuad");
|
|
|
| RasterSource::PlaybackSettings playback_settings;
|
| playback_settings.playback_to_shared_canvas = true;
|
| @@ -393,8 +472,8 @@ void SoftwareRenderer::DrawPictureQuad(const DrawingFrame* frame,
|
| }
|
| }
|
|
|
| -void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame* frame,
|
| - const SolidColorDrawQuad* quad) {
|
| +void SkiaRenderer::DrawSolidColorQuad(const DrawingFrame* frame,
|
| + const SolidColorDrawQuad* quad) {
|
| gfx::RectF visible_quad_vertex_rect = MathUtil::ScaleRectProportional(
|
| QuadVertexRect(), gfx::RectF(quad->rect), gfx::RectF(quad->visible_rect));
|
| current_paint_.setColor(quad->color);
|
| @@ -404,23 +483,20 @@ void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame* frame,
|
| current_paint_);
|
| }
|
|
|
| -void SoftwareRenderer::DrawTextureQuad(const DrawingFrame* frame,
|
| - const TextureDrawQuad* quad) {
|
| +void SkiaRenderer::DrawTextureQuad(const DrawingFrame* frame,
|
| + const TextureDrawQuad* quad) {
|
| if (!IsSoftwareResource(quad->resource_id())) {
|
| DrawUnsupportedQuad(frame, quad);
|
| return;
|
| }
|
|
|
| // TODO(skaslev): Add support for non-premultiplied alpha.
|
| - ResourceProvider::ScopedReadLockSoftware lock(resource_provider_,
|
| - quad->resource_id());
|
| - if (!lock.valid())
|
| - return;
|
| - const SkBitmap* bitmap = lock.sk_bitmap();
|
| - gfx::RectF uv_rect = gfx::ScaleRect(gfx::BoundingRect(quad->uv_top_left,
|
| - quad->uv_bottom_right),
|
| - bitmap->width(),
|
| - bitmap->height());
|
| + ResourceProvider::ScopedReadLockSkImage lock(resource_provider_,
|
| + quad->resource_id());
|
| + const SkImage* image = lock.sk_image();
|
| + gfx::RectF uv_rect = gfx::ScaleRect(
|
| + gfx::BoundingRect(quad->uv_top_left, quad->uv_bottom_right),
|
| + image->width(), image->height());
|
| gfx::RectF visible_uv_rect = MathUtil::ScaleRectProportional(
|
| uv_rect, gfx::RectF(quad->rect), gfx::RectF(quad->visible_rect));
|
| SkRect sk_uv_rect = gfx::RectFToSkRect(visible_uv_rect);
|
| @@ -431,8 +507,8 @@ void SoftwareRenderer::DrawTextureQuad(const DrawingFrame* frame,
|
| if (quad->y_flipped)
|
| current_canvas_->scale(1, -1);
|
|
|
| - bool blend_background = quad->background_color != SK_ColorTRANSPARENT &&
|
| - !bitmap->isOpaque();
|
| + bool blend_background =
|
| + quad->background_color != SK_ColorTRANSPARENT && !image->isOpaque();
|
| bool needs_layer = blend_background && (current_paint_.getAlpha() != 0xFF);
|
| if (needs_layer) {
|
| current_canvas_->saveLayerAlpha(&quad_rect, current_paint_.getAlpha());
|
| @@ -445,23 +521,20 @@ void SoftwareRenderer::DrawTextureQuad(const DrawingFrame* frame,
|
| }
|
| current_paint_.setFilterQuality(
|
| quad->nearest_neighbor ? kNone_SkFilterQuality : kLow_SkFilterQuality);
|
| - current_canvas_->drawBitmapRect(*bitmap, sk_uv_rect, quad_rect,
|
| - ¤t_paint_);
|
| + current_canvas_->drawImageRect(image, sk_uv_rect, quad_rect, ¤t_paint_);
|
| if (needs_layer)
|
| current_canvas_->restore();
|
| }
|
|
|
| -void SoftwareRenderer::DrawTileQuad(const DrawingFrame* frame,
|
| - const TileDrawQuad* quad) {
|
| +void SkiaRenderer::DrawTileQuad(const DrawingFrame* frame,
|
| + const TileDrawQuad* quad) {
|
| // |resource_provider_| can be NULL in resourceless software draws, which
|
| // should never produce tile quads in the first place.
|
| DCHECK(resource_provider_);
|
| DCHECK(IsSoftwareResource(quad->resource_id()));
|
|
|
| - ResourceProvider::ScopedReadLockSoftware lock(resource_provider_,
|
| - quad->resource_id());
|
| - if (!lock.valid())
|
| - return;
|
| + ResourceProvider::ScopedReadLockSkImage lock(resource_provider_,
|
| + quad->resource_id());
|
|
|
| gfx::RectF visible_tex_coord_rect = MathUtil::ScaleRectProportional(
|
| quad->tex_coord_rect, gfx::RectF(quad->rect),
|
| @@ -472,20 +545,21 @@ void SoftwareRenderer::DrawTileQuad(const DrawingFrame* frame,
|
| SkRect uv_rect = gfx::RectFToSkRect(visible_tex_coord_rect);
|
| current_paint_.setFilterQuality(
|
| quad->nearest_neighbor ? kNone_SkFilterQuality : kLow_SkFilterQuality);
|
| - current_canvas_->drawBitmapRect(*lock.sk_bitmap(), uv_rect,
|
| - gfx::RectFToSkRect(visible_quad_vertex_rect),
|
| - ¤t_paint_);
|
| + current_canvas_->drawImageRect(lock.sk_image(), uv_rect,
|
| + gfx::RectFToSkRect(visible_quad_vertex_rect),
|
| + ¤t_paint_);
|
| }
|
|
|
| -void SoftwareRenderer::DrawRenderPassQuad(const DrawingFrame* frame,
|
| - const RenderPassDrawQuad* quad) {
|
| +void SkiaRenderer::DrawRenderPassQuad(const DrawingFrame* frame,
|
| + const RenderPassDrawQuad* quad) {
|
| +#if 0
|
| ScopedResource* content_texture =
|
| render_pass_textures_[quad->render_pass_id].get();
|
| DCHECK(content_texture);
|
| DCHECK(content_texture->id());
|
| DCHECK(IsSoftwareResource(content_texture->id()));
|
|
|
| - ResourceProvider::ScopedReadLockSoftware lock(resource_provider_,
|
| + ResourceProvider::ScopedReadLockGL lock(resource_provider_,
|
| content_texture->id());
|
| if (!lock.valid())
|
| return;
|
| @@ -536,10 +610,10 @@ void SoftwareRenderer::DrawRenderPassQuad(const DrawingFrame* frame,
|
| SkShader::kClamp_TileMode, &content_mat);
|
| }
|
|
|
| - std::unique_ptr<ResourceProvider::ScopedReadLockSoftware> mask_lock;
|
| + std::unique_ptr<ResourceProvider::ScopedReadLockGL> mask_lock;
|
| if (quad->mask_resource_id()) {
|
| - mask_lock = std::unique_ptr<ResourceProvider::ScopedReadLockSoftware>(
|
| - new ResourceProvider::ScopedReadLockSoftware(resource_provider_,
|
| + mask_lock = std::unique_ptr<ResourceProvider::ScopedReadLockGL>(
|
| + new ResourceProvider::ScopedReadLockGL(resource_provider_,
|
| quad->mask_resource_id()));
|
|
|
| if (!mask_lock->valid())
|
| @@ -578,10 +652,11 @@ void SoftwareRenderer::DrawRenderPassQuad(const DrawingFrame* frame,
|
| }
|
| current_paint_.setShader(std::move(shader));
|
| current_canvas_->drawRect(dest_visible_rect, current_paint_);
|
| +#endif
|
| }
|
|
|
| -void SoftwareRenderer::DrawUnsupportedQuad(const DrawingFrame* frame,
|
| - const DrawQuad* quad) {
|
| +void SkiaRenderer::DrawUnsupportedQuad(const DrawingFrame* frame,
|
| + const DrawQuad* quad) {
|
| #ifdef NDEBUG
|
| current_paint_.setColor(SK_ColorWHITE);
|
| #else
|
| @@ -592,9 +667,10 @@ void SoftwareRenderer::DrawUnsupportedQuad(const DrawingFrame* frame,
|
| current_paint_);
|
| }
|
|
|
| -void SoftwareRenderer::CopyCurrentRenderPassToBitmap(
|
| +void SkiaRenderer::CopyCurrentRenderPassToBitmap(
|
| DrawingFrame* frame,
|
| std::unique_ptr<CopyOutputRequest> request) {
|
| +#if 0
|
| gfx::Rect copy_rect = frame->current_render_pass->output_rect;
|
| if (request->has_area())
|
| copy_rect.Intersect(request->area());
|
| @@ -607,9 +683,10 @@ void SoftwareRenderer::CopyCurrentRenderPassToBitmap(
|
| bitmap.get(), window_copy_rect.x(), window_copy_rect.y());
|
|
|
| request->SendBitmapResult(std::move(bitmap));
|
| +#endif
|
| }
|
|
|
| -void SoftwareRenderer::DiscardBackbuffer() {
|
| +void SkiaRenderer::DiscardBackbuffer() {
|
| if (is_backbuffer_discarded_)
|
| return;
|
|
|
| @@ -621,7 +698,7 @@ void SoftwareRenderer::DiscardBackbuffer() {
|
| client_->SetFullRootLayerDamage();
|
| }
|
|
|
| -void SoftwareRenderer::EnsureBackbuffer() {
|
| +void SkiaRenderer::EnsureBackbuffer() {
|
| if (!is_backbuffer_discarded_)
|
| return;
|
|
|
| @@ -629,14 +706,18 @@ void SoftwareRenderer::EnsureBackbuffer() {
|
| is_backbuffer_discarded_ = false;
|
| }
|
|
|
| -void SoftwareRenderer::DidChangeVisibility() {
|
| +void SkiaRenderer::DidChangeVisibility() {
|
| if (visible())
|
| EnsureBackbuffer();
|
| else
|
| DiscardBackbuffer();
|
| }
|
|
|
| -bool SoftwareRenderer::ShouldApplyBackgroundFilters(
|
| +void SkiaRenderer::FinishDrawingQuadList() {
|
| + current_canvas_->flush();
|
| +}
|
| +
|
| +bool SkiaRenderer::ShouldApplyBackgroundFilters(
|
| const RenderPassDrawQuad* quad) const {
|
| if (quad->background_filters.IsEmpty())
|
| return false;
|
| @@ -650,11 +731,10 @@ bool SoftwareRenderer::ShouldApplyBackgroundFilters(
|
| // If non-null, auto_bounds will be filled with the automatically-computed
|
| // destination bounds. If null, the output will be the same size as the
|
| // input bitmap.
|
| -sk_sp<SkImage> SoftwareRenderer::ApplyImageFilter(
|
| - SkImageFilter* filter,
|
| - const RenderPassDrawQuad* quad,
|
| - const SkBitmap& to_filter,
|
| - SkIRect* auto_bounds) const {
|
| +sk_sp<SkImage> SkiaRenderer::ApplyImageFilter(SkImageFilter* filter,
|
| + const RenderPassDrawQuad* quad,
|
| + const SkBitmap& to_filter,
|
| + SkIRect* auto_bounds) const {
|
| if (!filter)
|
| return nullptr;
|
|
|
| @@ -687,8 +767,7 @@ sk_sp<SkImage> SoftwareRenderer::ApplyImageFilter(
|
| return surface->makeImageSnapshot();
|
| }
|
|
|
| -SkBitmap SoftwareRenderer::GetBackdropBitmap(
|
| - const gfx::Rect& bounding_rect) const {
|
| +SkBitmap SkiaRenderer::GetBackdropBitmap(const gfx::Rect& bounding_rect) const {
|
| SkBitmap bitmap;
|
| bitmap.setInfo(SkImageInfo::MakeN32Premul(bounding_rect.width(),
|
| bounding_rect.height()));
|
| @@ -696,7 +775,7 @@ SkBitmap SoftwareRenderer::GetBackdropBitmap(
|
| return bitmap;
|
| }
|
|
|
| -gfx::Rect SoftwareRenderer::GetBackdropBoundingBoxForRenderPassQuad(
|
| +gfx::Rect SkiaRenderer::GetBackdropBoundingBoxForRenderPassQuad(
|
| const DrawingFrame* frame,
|
| const RenderPassDrawQuad* quad,
|
| const gfx::Transform& contents_device_transform) const {
|
| @@ -714,10 +793,11 @@ gfx::Rect SoftwareRenderer::GetBackdropBoundingBoxForRenderPassQuad(
|
| return backdrop_rect;
|
| }
|
|
|
| -sk_sp<SkShader> SoftwareRenderer::GetBackgroundFilterShader(
|
| +sk_sp<SkShader> SkiaRenderer::GetBackgroundFilterShader(
|
| const DrawingFrame* frame,
|
| const RenderPassDrawQuad* quad,
|
| SkShader::TileMode content_tile_mode) const {
|
| +#if 0
|
| if (!ShouldApplyBackgroundFilters(quad))
|
| return nullptr;
|
|
|
| @@ -755,6 +835,9 @@ sk_sp<SkShader> SoftwareRenderer::GetBackgroundFilterShader(
|
|
|
| return filter_backdrop_image->makeShader(content_tile_mode, content_tile_mode,
|
| &filter_backdrop_transform);
|
| +#else
|
| + return nullptr;
|
| +#endif
|
| }
|
|
|
| } // namespace cc
|
|
|