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..cbf53f08e3d6467060a5d4410a9993110446b009 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 { |
@@ -58,10 +61,13 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
int layer_id, |
const void* tile_id, |
int source_frame_number, |
+ bool use_gpu_rasterization, |
RenderingStatsInstrumentation* rendering_stats, |
const RasterWorkerPool::RasterTask::Reply& reply, |
TaskVector* dependencies) |
- : internal::RasterWorkerPoolTask(resource, dependencies), |
+ : internal::RasterWorkerPoolTask(resource, |
+ dependencies, |
+ use_gpu_rasterization), |
picture_pile_(picture_pile), |
content_rect_(content_rect), |
contents_scale_(contents_scale), |
@@ -118,9 +124,6 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
if (analysis_.is_solid_color) |
return false; |
- PicturePileImpl* picture_clone = |
- picture_pile_->GetCloneForDrawingOnThread(thread_index); |
- |
SkBitmap bitmap; |
switch (resource()->format()) { |
case RGBA_4444: |
@@ -148,6 +151,13 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
SkBitmapDevice device(bitmap); |
SkCanvas canvas(&device); |
+ Raster(picture_pile_->GetCloneForDrawingOnThread(thread_index), &canvas); |
+ ChangeBitmapConfigIfNeeded(bitmap, buffer); |
+ |
+ return true; |
+ } |
+ |
+ void Raster(PicturePileImpl* picture_pile, SkCanvas* canvas) { |
reveman
2013/12/17 23:03:16
can this be private?
alokp
2013/12/18 22:49:22
Done.
|
skia::RefPtr<SkDrawFilter> draw_filter; |
switch (raster_mode_) { |
case LOW_QUALITY_RASTER_MODE: |
@@ -162,8 +172,7 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
default: |
NOTREACHED(); |
} |
- |
- canvas.setDrawFilter(draw_filter.get()); |
+ canvas->setDrawFilter(draw_filter.get()); |
base::TimeDelta prev_rasterize_time = |
rendering_stats_->impl_thread_rendering_stats().rasterize_time; |
@@ -172,13 +181,9 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
// lowres tiles are not required for activation and therefore |
// introduce noise in the measurement (sometimes they get rasterized |
// before we draw and sometimes they aren't) |
- if (tile_resolution_ == HIGH_RESOLUTION) { |
- picture_clone->RasterToBitmap( |
- &canvas, content_rect_, contents_scale_, rendering_stats_); |
- } else { |
- picture_clone->RasterToBitmap( |
- &canvas, content_rect_, contents_scale_, NULL); |
- } |
+ RenderingStatsInstrumentation* stats = tile_resolution_ == HIGH_RESOLUTION ? |
+ rendering_stats_ : NULL; |
+ picture_pile->RasterToBitmap(canvas, content_rect_, contents_scale_, stats); |
if (rendering_stats_->record_rendering_stats()) { |
base::TimeDelta current_rasterize_time = |
@@ -190,21 +195,43 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
100000, |
100); |
} |
- |
- ChangeBitmapConfigIfNeeded(bitmap, buffer); |
- |
- return true; |
} |
// Overridden from internal::RasterWorkerPoolTask: |
virtual bool RunOnWorkerThread(unsigned thread_index, |
void* buffer, |
gfx::Size size, |
- int stride) |
- OVERRIDE { |
+ int stride) OVERRIDE { |
+ DCHECK(!use_gpu_rasterization()); |
RunAnalysisOnThread(thread_index); |
return RunRasterOnThread(thread_index, buffer, size, stride); |
} |
+ |
+ virtual void RunOnOriginThread(ResourceProvider* resource_provider, |
+ ContextProvider* context_provider) OVERRIDE { |
+ DCHECK(use_gpu_rasterization()); |
+ 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()); |
+ 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())); |
+ |
+ Raster(picture_pile_, canvas.get()); |
+ } |
+ |
virtual void CompleteOnOriginThread() OVERRIDE { |
reply_.Run(analysis_, !HasFinishedRunning() || WasCanceled()); |
} |
@@ -222,6 +249,17 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { |
return res.PassAs<base::Value>(); |
} |
+ 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; |
+ } |
+ |
void ChangeBitmapConfigIfNeeded(const SkBitmap& bitmap, |
void* buffer) { |
TRACE_EVENT0("cc", "RasterWorkerPoolTaskImpl::ChangeBitmapConfigIfNeeded"); |
@@ -325,12 +363,14 @@ const char* kWorkerThreadNamePrefix = "CompositorRaster"; |
namespace internal { |
-RasterWorkerPoolTask::RasterWorkerPoolTask( |
- const Resource* resource, TaskVector* dependencies) |
+RasterWorkerPoolTask::RasterWorkerPoolTask(const Resource* resource, |
+ TaskVector* dependencies, |
+ bool use_gpu_rasterization) |
: did_run_(false), |
did_complete_(false), |
was_canceled_(false), |
- resource_(resource) { |
+ resource_(resource), |
+ use_gpu_rasterization_(use_gpu_rasterization) { |
dependencies_.swap(*dependencies); |
} |
@@ -431,6 +471,7 @@ 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) { |
@@ -444,6 +485,7 @@ RasterWorkerPool::RasterTask RasterWorkerPool::CreateRasterTask( |
layer_id, |
tile_id, |
source_frame_number, |
+ use_gpu_rasterization, |
rendering_stats, |
reply, |
&dependencies->tasks_)); |
@@ -462,10 +504,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) { |
} |
@@ -497,6 +541,24 @@ bool RasterWorkerPool::IsRasterTaskRequiredForActivation( |
raster_tasks_required_for_activation_.end(); |
} |
+void RasterWorkerPool::RunGpuRasterizationTasks(RasterTaskVector& tasks) { |
+ if (tasks.empty()) return; |
reveman
2013/12/17 23:03:16
nit: move "return" to next line.
alokp
2013/12/18 22:49:22
Done.
|
+ |
+ blink::WebGraphicsContext3D* context = context_provider_->Context3d(); |
+ context->makeContextCurrent(); |
+ |
+ GrContext* gr_context = context_provider_->GrContext(); |
+ gr_context->resetContext(); |
+ |
+ for (RasterTaskVector::iterator it = tasks.begin(); it != tasks.end(); ++it) { |
+ internal::RasterWorkerPoolTask* task = (*it).get(); |
+ DCHECK(task->use_gpu_rasterization()); |
+ task->RunOnOriginThread(resource_provider_, context_provider_); |
vmpstr
2013/12/17 22:52:45
This kind of looks weird to me... We have a task->
alokp
2013/12/17 23:26:08
I admit - it is awkward. I also do not like must-r
|
+ } |
+ |
+ gr_context->flush(); |
+} |
+ |
scoped_refptr<internal::WorkerPoolTask> |
RasterWorkerPool::CreateRasterFinishedTask() { |
return make_scoped_refptr( |