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

Unified Diff: cc/resources/raster_worker_pool.cc

Issue 110883015: Add preliminary support for hw-accelerated tile rasterization. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years 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/raster_worker_pool.cc
diff --git a/cc/resources/raster_worker_pool.cc b/cc/resources/raster_worker_pool.cc
index 06fd18e62e0ec2bdc9d440ee0ae6eb925c867ef4..7aadd188acef0c36e593404bf01d3bf087d0e43c 100644
--- a/cc/resources/raster_worker_pool.cc
+++ b/cc/resources/raster_worker_pool.cc
@@ -13,6 +13,9 @@
#include "skia/ext/lazy_pixel_ref.h"
#include "skia/ext/paint_simplifier.h"
#include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/gpu/GrContext.h"
+#include "third_party/skia/include/gpu/SkGpuDevice.h"
+#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
namespace cc {
@@ -47,20 +50,20 @@ class DisableLCDTextFilter : public SkDrawFilter {
}
};
-class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
+class RasterWorkerPoolTaskSW : public internal::RasterWorkerPoolTask {
public:
- RasterWorkerPoolTaskImpl(const Resource* resource,
- PicturePileImpl* picture_pile,
- gfx::Rect content_rect,
- float contents_scale,
- RasterMode raster_mode,
- TileResolution tile_resolution,
- int layer_id,
- const void* tile_id,
- int source_frame_number,
- RenderingStatsInstrumentation* rendering_stats,
- const RasterWorkerPool::RasterTask::Reply& reply,
- TaskVector* dependencies)
+ RasterWorkerPoolTaskSW(const Resource* resource,
+ PicturePileImpl* picture_pile,
+ gfx::Rect content_rect,
+ float contents_scale,
+ RasterMode raster_mode,
+ TileResolution tile_resolution,
+ int layer_id,
+ const void* tile_id,
+ int source_frame_number,
+ RenderingStatsInstrumentation* rendering_stats,
+ const RasterWorkerPool::RasterTask::Reply& reply,
+ TaskVector* dependencies)
: internal::RasterWorkerPoolTask(resource, dependencies),
picture_pile_(picture_pile),
content_rect_(content_rect),
@@ -75,7 +78,7 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
void RunAnalysisOnThread(unsigned thread_index) {
TRACE_EVENT1("cc",
- "RasterWorkerPoolTaskImpl::RunAnalysisOnThread",
+ "RasterWorkerPoolTaskSW::RunAnalysisOnThread",
"data",
TracedValue::FromValue(DataAsValue().release()));
@@ -103,7 +106,7 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
gfx::Size size,
int stride) {
TRACE_EVENT2(
- "cc", "RasterWorkerPoolTaskImpl::RunRasterOnThread",
+ "cc", "RasterWorkerPoolTaskSW::RunRasterOnThread",
"data",
TracedValue::FromValue(DataAsValue().release()),
"raster_mode",
@@ -205,12 +208,15 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
RunAnalysisOnThread(thread_index);
return RunRasterOnThread(thread_index, buffer, size, stride);
}
+ virtual void RunOnOriginThread() OVERRIDE {
+ NOTREACHED();
+ }
virtual void CompleteOnOriginThread() OVERRIDE {
reply_.Run(analysis_, !HasFinishedRunning() || WasCanceled());
}
protected:
- virtual ~RasterWorkerPoolTaskImpl() {}
+ virtual ~RasterWorkerPoolTaskSW() {}
private:
scoped_ptr<base::Value> DataAsValue() const {
@@ -248,7 +254,91 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
RenderingStatsInstrumentation* rendering_stats_;
const RasterWorkerPool::RasterTask::Reply reply_;
- DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskImpl);
+ DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskSW);
+};
+
+class RasterWorkerPoolTaskGPU : public internal::RasterWorkerPoolTask {
reveman 2013/12/17 00:28:48 Could we use RasterWorkerPoolTaskImpl for this ins
alokp 2013/12/17 22:12:15 Done.
+ public:
+ RasterWorkerPoolTaskGPU(const Resource* resource,
+ PicturePileImpl* picture_pile,
+ gfx::Rect content_rect,
+ float contents_scale,
+ ResourceProvider* resource_provider,
+ ContextProvider* context_provider,
+ RenderingStatsInstrumentation* rendering_stats,
+ const RasterWorkerPool::RasterTask::Reply& reply,
+ TaskVector* dependencies)
+ : internal::RasterWorkerPoolTask(resource, dependencies),
+ picture_pile_(picture_pile),
+ content_rect_(content_rect),
+ contents_scale_(contents_scale),
+ resource_provider_(resource_provider),
+ context_provider_(context_provider),
+ rendering_stats_(rendering_stats),
+ reply_(reply) {}
+
+ // Overridden from internal::RasterWorkerPoolTask:
+ virtual bool RunOnWorkerThread(unsigned thread_index,
+ void* buffer,
+ gfx::Size size,
+ int stride) OVERRIDE {
+ NOTREACHED();
+ return false;
+ }
+ virtual void RunOnOriginThread() OVERRIDE {
+ DCHECK_NE(resource()->id(), 0u);
+ ResourceProvider::ScopedWriteLockGL lock(resource_provider_,
+ resource()->id());
+ DCHECK_NE(lock.texture_id(), 0u);
+
+ GrBackendTextureDesc desc;
+ desc.fFlags = kRenderTarget_GrBackendTextureFlag;
+ desc.fWidth = content_rect_.width();
+ desc.fHeight = content_rect_.height();
+ desc.fConfig = ToGrFormat(resource()->format());
reveman 2013/12/17 00:28:48 How are GrPixelConfig formats used by Ganesh? Some
alokp 2013/12/17 22:12:15 Swizzling is never required when rasterizing with
+ desc.fOrigin = kTopLeft_GrSurfaceOrigin;
+ desc.fTextureHandle = lock.texture_id();
+
+ GrContext* gr_context = context_provider_->GrContext();
+ skia::RefPtr<GrTexture> texture =
+ skia::AdoptRef(gr_context->wrapBackendTexture(desc));
+ skia::RefPtr<SkGpuDevice> device =
+ skia::AdoptRef(SkGpuDevice::Create(texture.get()));
+ skia::RefPtr<SkCanvas> canvas = skia::AdoptRef(new SkCanvas(device.get()));
+
+ canvas->clear(SK_ColorTRANSPARENT);
+ picture_pile_->RasterDirect(canvas.get(),
+ content_rect_,
+ contents_scale_,
+ rendering_stats_);
+ gr_context->flush();
reveman 2013/12/17 00:28:48 as you have a flush in CompleteOriginThreadTasks,
alokp 2013/12/17 22:12:15 Done.
+ }
+ virtual void CompleteOnOriginThread() OVERRIDE {
+ reply_.Run(PicturePileImpl::Analysis(), false);
+ }
+
+ protected:
+ virtual ~RasterWorkerPoolTaskGPU() {}
+
+ static 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;
+ }
+ DCHECK(false) << "Unsupported resource format.";
+ return kSkia8888_GrPixelConfig;
+ }
+
+ private:
+ scoped_refptr<PicturePileImpl> picture_pile_;
+ gfx::Rect content_rect_;
+ float contents_scale_;
+ ResourceProvider* resource_provider_;
+ ContextProvider* context_provider_;
+ RenderingStatsInstrumentation* rendering_stats_;
+ const RasterWorkerPool::RasterTask::Reply reply_;
};
class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask {
@@ -397,9 +487,15 @@ RasterWorkerPool::RasterTask::Queue::Queue() {
RasterWorkerPool::RasterTask::Queue::~Queue() {
}
-void RasterWorkerPool::RasterTask::Queue::Append(
- const RasterTask& task, bool required_for_activation) {
+void RasterWorkerPool::RasterTask::Queue::Append(const RasterTask& task,
+ bool required_for_activation) {
DCHECK(!task.is_null());
+
+ if (task.must_run_on_origin_thread_) {
+ origin_thread_tasks_.push_back(task.internal_);
+ return;
+ }
+
tasks_.push_back(task.internal_);
if (required_for_activation)
tasks_required_for_activation_.insert(task.internal_.get());
@@ -409,8 +505,10 @@ RasterWorkerPool::RasterTask::RasterTask() {
}
RasterWorkerPool::RasterTask::RasterTask(
- internal::RasterWorkerPoolTask* internal)
- : internal_(internal) {
+ internal::RasterWorkerPoolTask* internal,
+ bool must_run_on_origin_thread)
+ : internal_(internal),
+ must_run_on_origin_thread_(must_run_on_origin_thread) {
}
void RasterWorkerPool::RasterTask::Reset() {
@@ -420,7 +518,6 @@ void RasterWorkerPool::RasterTask::Reset() {
RasterWorkerPool::RasterTask::~RasterTask() {
}
-// static
RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask(
const Resource* resource,
PicturePileImpl* picture_pile,
@@ -431,22 +528,36 @@ RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask(
int layer_id,
const void* tile_id,
int source_frame_number,
+ bool use_gpu_rasterization,
RenderingStatsInstrumentation* rendering_stats,
const RasterTask::Reply& reply,
Task::Set* dependencies) {
- return RasterTask(
- new RasterWorkerPoolTaskImpl(resource,
- picture_pile,
- content_rect,
- contents_scale,
- raster_mode,
- tile_resolution,
- layer_id,
- tile_id,
- source_frame_number,
- rendering_stats,
- reply,
- &dependencies->tasks_));
+ internal::RasterWorkerPoolTask* impl = NULL;
+ if (use_gpu_rasterization) {
+ impl = new RasterWorkerPoolTaskGPU(resource,
+ picture_pile,
+ content_rect,
+ contents_scale,
+ resource_provider_,
+ context_provider_,
+ rendering_stats,
+ reply,
+ &dependencies->tasks_);
+ } else {
+ impl = new RasterWorkerPoolTaskSW(resource,
+ picture_pile,
+ content_rect,
+ contents_scale,
+ raster_mode,
+ tile_resolution,
+ layer_id,
+ tile_id,
+ source_frame_number,
+ rendering_stats,
+ reply,
+ &dependencies->tasks_);
+ }
+ return RasterTask(impl, use_gpu_rasterization);
vmpstr 2013/12/17 21:04:37 This might be echoing some of David's comments, bu
alokp 2013/12/17 22:12:15 Done.
}
// static
@@ -462,10 +573,12 @@ RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask(
}
RasterWorkerPool::RasterWorkerPool(ResourceProvider* resource_provider,
+ ContextProvider* context_provider,
size_t num_threads)
: WorkerPool(num_threads, kWorkerThreadNamePrefix),
client_(NULL),
resource_provider_(resource_provider),
+ context_provider_(context_provider),
weak_ptr_factory_(this) {
}
@@ -484,6 +597,26 @@ void RasterWorkerPool::Shutdown() {
weak_ptr_factory_.InvalidateWeakPtrs();
}
+void RasterWorkerPool::CompleteOriginThreadTasks(RasterTask::Queue* queue) {
reveman 2013/12/17 00:28:48 I think this needs to be RunTasksOnOriginThread (O
alokp 2013/12/17 22:12:15 Done.
+ if (queue->origin_thread_tasks_.empty())
+ return;
+
+ blink::WebGraphicsContext3D* context = context_provider_->Context3d();
+ GrContext* gr_context = context_provider_->GrContext();
+ context->makeContextCurrent();
+ gr_context->resetContext();
+
+ for (RasterTaskVector::iterator it = queue->origin_thread_tasks_.begin();
+ it != queue->origin_thread_tasks_.end(); ++it) {
+ internal::RasterWorkerPoolTask* task = (*it).get();
+ task->RunOnOriginThread();
+ task->CompleteOnOriginThread();
reveman 2013/12/17 00:28:48 Task completion needs to be delayed until ::CheckF
alokp 2013/12/17 22:12:15 AFAICT ImageRasterWorkerPool never calls CheckForC
+ }
+
+ gr_context->flush();
+ queue->origin_thread_tasks_.clear();
+}
+
void RasterWorkerPool::SetRasterTasks(RasterTask::Queue* queue) {
raster_tasks_.swap(queue->tasks_);
raster_tasks_required_for_activation_.swap(

Powered by Google App Engine
This is Rietveld 408576698