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( |