| Index: cc/resources/ganesh_rasterizer.cc
|
| diff --git a/cc/resources/ganesh_rasterizer.cc b/cc/resources/ganesh_rasterizer.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ff7db1d7b3cbb4f03f859dcb1777f0c3b7ddf9a6
|
| --- /dev/null
|
| +++ b/cc/resources/ganesh_rasterizer.cc
|
| @@ -0,0 +1,108 @@
|
| +// Copyright 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "cc/resources/ganesh_rasterizer.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "cc/output/context_provider.h"
|
| +#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
|
| +#include "third_party/skia/include/core/SkCanvas.h"
|
| +#include "third_party/skia/include/gpu/GrContext.h"
|
| +#include "third_party/skia/include/gpu/SkGpuDevice.h"
|
| +#include "ui/gfx/size_conversions.h"
|
| +
|
| +namespace cc {
|
| +
|
| +GaneshRasterizer::RasterTask::RasterTask(
|
| + Tile* tile, scoped_ptr<ResourcePool::Resource> resource)
|
| + : tile_(tile), resource_(resource.Pass()) {
|
| +}
|
| +
|
| +GaneshRasterizer::RasterTask::~RasterTask() {
|
| +}
|
| +
|
| +scoped_ptr<GaneshRasterizer> GaneshRasterizer::Create(
|
| + ContextProvider* context_provider,
|
| + ResourceProvider* resource_provider) {
|
| + return make_scoped_ptr(
|
| + new GaneshRasterizer(context_provider, resource_provider));
|
| +}
|
| +
|
| +GaneshRasterizer::GaneshRasterizer(
|
| + ContextProvider* context_provider,
|
| + ResourceProvider* resource_provider)
|
| + : client_(NULL),
|
| + context_provider_(context_provider),
|
| + resource_provider_(resource_provider) {
|
| + DCHECK(context_provider_->Context3d());
|
| + DCHECK(context_provider_->GrContext());
|
| +}
|
| +
|
| +GaneshRasterizer::~GaneshRasterizer() {
|
| +}
|
| +
|
| +void GaneshRasterizer::SetClient(GaneshRasterizerClient* client) {
|
| + client_ = client;
|
| +}
|
| +
|
| +void GaneshRasterizer::PushRasterTask(
|
| + Tile* tile, scoped_ptr<ResourcePool::Resource> resource) {
|
| + raster_tasks_.push_back(new RasterTask(tile, resource.Pass()));
|
| +}
|
| +
|
| +void GaneshRasterizer::FlushRasterTasks(
|
| + RenderingStatsInstrumentation* rendering_stats_instrumentation) {
|
| + TRACE_EVENT0("cc", "GaneshRasterizer::Rasterize");
|
| +
|
| + if (raster_tasks_.empty())
|
| + return;
|
| +
|
| + blink::WebGraphicsContext3D* context = context_provider_->Context3d();
|
| + GrContext* gr_context = context_provider_->GrContext();
|
| +
|
| + context->makeContextCurrent();
|
| + gr_context->resetContext();
|
| + for (RasterTaskVector::iterator it = raster_tasks_.begin();
|
| + it != raster_tasks_.end(); ++it) {
|
| + RasterTask* task = *it;
|
| + Tile* tile = task->tile_;
|
| + ManagedTileState& mts = tile->managed_state();
|
| + DCHECK(mts.raster_mode == GANESH_RASTER_MODE);
|
| + DCHECK_NE(task->resource_->id(), 0u);
|
| + {
|
| + ResourceProvider::ScopedWriteLockGL lock(
|
| + resource_provider_, task->resource_->id());
|
| +
|
| + DCHECK_NE(lock.texture_id(), 0u);
|
| + GrBackendTextureDesc desc;
|
| + desc.fFlags = kRenderTarget_GrBackendTextureFlag;
|
| + desc.fWidth = tile->size().width();
|
| + desc.fHeight = tile->size().height();
|
| + desc.fConfig = kSkia8888_GrPixelConfig;
|
| + desc.fOrigin = kTopLeft_GrSurfaceOrigin;
|
| + desc.fTextureHandle = lock.texture_id();
|
| + skia::RefPtr<GrTexture> texture =
|
| + skia::AdoptRef(gr_context->wrapBackendTexture(desc));
|
| + skia::RefPtr<SkGpuDevice> device =
|
| + skia::AdoptRef(SkGpuDevice::Create(texture.get()));
|
| + CHECK(device);
|
| + skia::RefPtr<SkCanvas> canvas =
|
| + skia::AdoptRef(new SkCanvas(device.get()));
|
| +
|
| + if (tile->opaque_rect().IsEmpty())
|
| + canvas->clear(SK_ColorTRANSPARENT);
|
| +
|
| + tile->picture_pile_->RasterDirect(
|
| + canvas.get(), tile->content_rect_, tile->contents_scale_,
|
| + rendering_stats_instrumentation);
|
| + }
|
| +
|
| + if (client_)
|
| + client_->OnGaneshRasterTaskCompleted(tile, task->resource_.Pass(), false);
|
| + }
|
| + gr_context->flush();
|
| + raster_tasks_.clear();
|
| +}
|
| +
|
| +} // namespace cc
|
|
|