Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3534)

Unified Diff: cc/resources/ganesh_rasterizer.cc

Issue 69343005: Added preliminary support for tile rasterization with Ganesh (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Ported scissoring fix from gr_layer patch. Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..b39dc41dc44eb7941fd44f17b6e5a154c0ac1a19
--- /dev/null
+++ b/cc/resources/ganesh_rasterizer.cc
@@ -0,0 +1,113 @@
+// 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 {
+
+scoped_ptr<GaneshRasterizer> GaneshRasterizer::Create(
+ ContextProvider* context_provider,
+ ResourceProvider* resource_provider) {
+ if (!context_provider ||
vmpstr 2013/11/22 21:29:12 Should these just be dchecks? or is there a valid
slavi 2013/11/23 01:27:19 Done.
+ !context_provider->Context3d() ||
+ !context_provider->GrContext())
+ return scoped_ptr<cc::GaneshRasterizer>();
+ 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) {
+ DCHECK(client);
+ DCHECK(!client_);
vmpstr 2013/11/22 21:29:12 With these two dchecks, it seems that client shoul
slavi 2013/11/23 01:27:19 This class get's instantiated before TileManager (
+ client_ = client;
+}
+
+GaneshRasterizer::RasterTask* GaneshRasterizer::CreateRasterTask(
+ Tile* tile, scoped_ptr<ResourcePool::Resource> resource) {
+ return new RasterTask(tile, resource.Pass());
+}
+
+void GaneshRasterizer::Rasterize(
+ RasterTaskVector& tasks,
+ RenderingStatsInstrumentation* rendering_stats_instrumentation) {
+ TRACE_EVENT0("cc", "GaneshRasterizer::Rasterize");
+
+ DCHECK(client_);
+
+ if (tasks.empty())
+ return;
+
+ blink::WebGraphicsContext3D* context = context_provider_->Context3d();
+ GrContext* gr_context = context_provider_->GrContext();
+
+ context->makeContextCurrent();
+ gr_context->resetContext();
+ for (RasterTaskVector::iterator it = tasks.begin(); it != 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);
+
+ // TODO(skaslev) Remove this marker.
+ {
+ SkPaint paint;
+ paint.setColor(SkColorSetRGB(255, 127, 0));
+ canvas->drawRect(SkRect::MakeXYWH(5, 5, 15, 15), paint);
+ }
+ }
+
+ client_->OnGaneshRasterTaskCompleted(tile, task->resource_.Pass(), false);
+ }
+ gr_context->flush();
+}
+
+} // namespace cc

Powered by Google App Engine
This is Rietveld 408576698