| Index: cc/resources/gpu_rasterizer.cc
|
| diff --git a/cc/resources/gpu_rasterizer.cc b/cc/resources/gpu_rasterizer.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4cae56b3179f609da8d47c605ac02cb9f329fb93
|
| --- /dev/null
|
| +++ b/cc/resources/gpu_rasterizer.cc
|
| @@ -0,0 +1,128 @@
|
| +// 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/gpu_rasterizer.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "cc/output/context_provider.h"
|
| +#include "cc/resources/resource_format.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 {
|
| +
|
| +namespace {
|
| +
|
| +GrPixelConfig toGrFormat(ResourceFormat format) {
|
| + switch (format) {
|
| + case RGBA_8888:
|
| + return kRGBA_8888_GrPixelConfig;
|
| + case BGRA_8888:
|
| + return kBGRA_8888_GrPixelConfig;
|
| + case RGBA_4444:
|
| + return kRGBA_4444_GrPixelConfig;
|
| + default:
|
| + break; // If you break here, you're gonna have a bad time.
|
| + }
|
| + DCHECK(false) << "Unsupported resource format.";
|
| + return kSkia8888_GrPixelConfig;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +GpuRasterizer::RasterTask::RasterTask(
|
| + Tile* tile, scoped_ptr<ScopedResource> resource)
|
| + : tile_(tile), resource_(resource.Pass()) {
|
| +}
|
| +
|
| +GpuRasterizer::RasterTask::~RasterTask() { }
|
| +
|
| +GpuRasterizer::Queue::Queue() { }
|
| +
|
| +GpuRasterizer::Queue::~Queue() { }
|
| +
|
| +void GpuRasterizer::Queue::Append(
|
| + Tile* tile, scoped_ptr<ScopedResource> resource) {
|
| + raster_tasks_.push_back(new RasterTask(tile, resource.Pass()));
|
| +}
|
| +
|
| +scoped_ptr<GpuRasterizer> GpuRasterizer::Create(
|
| + ContextProvider* context_provider,
|
| + ResourceProvider* resource_provider) {
|
| + return make_scoped_ptr(
|
| + new GpuRasterizer(context_provider, resource_provider));
|
| +}
|
| +
|
| +GpuRasterizer::GpuRasterizer(
|
| + ContextProvider* context_provider,
|
| + ResourceProvider* resource_provider)
|
| + : context_provider_(context_provider),
|
| + resource_provider_(resource_provider) {
|
| +}
|
| +
|
| +GpuRasterizer::~GpuRasterizer() {
|
| +}
|
| +
|
| +void GpuRasterizer::SetClient(GpuRasterizerClient* client) {
|
| + client_ = client;
|
| +}
|
| +
|
| +void GpuRasterizer::Rasterize(
|
| + const Queue& queue,
|
| + RenderingStatsInstrumentation* rendering_stats_instrumentation) {
|
| + TRACE_EVENT0("cc", "GpuRasterizer::Rasterize");
|
| +
|
| + if (queue.raster_tasks_.empty())
|
| + return;
|
| +
|
| + blink::WebGraphicsContext3D* context = context_provider_->Context3d();
|
| + GrContext* gr_context = context_provider_->GrContext();
|
| + CHECK(client_);
|
| + CHECK(context);
|
| + CHECK(gr_context);
|
| +
|
| + context->makeContextCurrent();
|
| + gr_context->resetContext();
|
| + for (RasterTaskVector::const_iterator it = queue.raster_tasks_.begin();
|
| + it != queue.raster_tasks_.end(); ++it) {
|
| + RasterTask* task = *it;
|
| + Tile* tile = task->tile_;
|
| + 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 = toGrFormat(lock.format());
|
| + 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);
|
| + }
|
| +
|
| + client_->OnGpuRasterTaskCompleted(tile, task->resource_.Pass());
|
| + }
|
| + gr_context->flush();
|
| +}
|
| +
|
| +} // namespace cc
|
|
|