Index: cc/resources/gpu_raster_worker_pool.cc |
diff --git a/cc/resources/gpu_raster_worker_pool.cc b/cc/resources/gpu_raster_worker_pool.cc |
index d0f97219c713c9039e750972784e9838780cabda..6063a68eb8ab018e6602bd20926e7f93becd0d94 100644 |
--- a/cc/resources/gpu_raster_worker_pool.cc |
+++ b/cc/resources/gpu_raster_worker_pool.cc |
@@ -13,6 +13,8 @@ |
#include "cc/resources/resource_provider.h" |
#include "cc/resources/scoped_gpu_raster.h" |
#include "gpu/command_buffer/client/gles2_interface.h" |
+#include "third_party/skia/include/core/SkMultiPictureDraw.h" |
+#include "third_party/skia/include/core/SkPictureRecorder.h" |
#include "third_party/skia/include/core/SkSurface.h" |
#include "third_party/skia/include/gpu/GrContext.h" |
#include "third_party/skia/include/utils/SkNullCanvas.h" |
@@ -23,19 +25,20 @@ namespace { |
class RasterBufferImpl : public RasterBuffer { |
public: |
RasterBufferImpl(ResourceProvider* resource_provider, |
- const Resource* resource) |
+ const Resource* resource, |
+ SkMultiPictureDraw* multi_picture_draw) |
: resource_provider_(resource_provider), |
resource_(resource), |
- surface_(resource_provider->LockForWriteToSkSurface(resource->id())) {} |
+ surface_(resource_provider->LockForWriteToSkSurface(resource->id())), |
+ multi_picture_draw_(multi_picture_draw) {} |
virtual ~RasterBufferImpl() { |
resource_provider_->UnlockForWriteToSkSurface(resource_->id()); |
} |
// Overridden from RasterBuffer: |
virtual skia::RefPtr<SkCanvas> AcquireSkCanvas() OVERRIDE { |
- skia::RefPtr<SkCanvas> canvas = surface_ |
- ? skia::SharePtr(surface_->getCanvas()) |
- : skia::AdoptRef(SkCreateNullCanvas()); |
+ skia::RefPtr<SkCanvas> canvas = skia::SharePtr(recorder_.beginRecording( |
+ resource_->size().width(), resource_->size().height())); |
// Balanced with restore() call in ReleaseSkCanvas. save()/restore() calls |
// are needed to ensure that canvas returns to its previous state after use. |
@@ -45,12 +48,21 @@ class RasterBufferImpl : public RasterBuffer { |
virtual void ReleaseSkCanvas(const skia::RefPtr<SkCanvas>& canvas) OVERRIDE { |
// Balanced with save() call in AcquireSkCanvas. |
canvas->restore(); |
+ |
+ // Add the canvas and recorded picture to |multi_picture_draw_|. |
+ skia::RefPtr<SkCanvas> real_canvas = |
+ surface_ ? skia::SharePtr(surface_->getCanvas()) |
+ : skia::AdoptRef(SkCreateNullCanvas()); |
reveman
2014/09/22 21:29:05
it seems a bit silly to add a null canvas. would i
hendrikw
2014/09/22 21:48:39
If we want status quo, I should probably allocate
|
+ skia::RefPtr<SkPicture> picture = skia::AdoptRef(recorder_.endRecording()); |
+ multi_picture_draw_->add(real_canvas.get(), picture.get()); |
} |
private: |
ResourceProvider* resource_provider_; |
const Resource* resource_; |
SkSurface* surface_; |
+ SkMultiPictureDraw* multi_picture_draw_; |
+ SkPictureRecorder recorder_; |
DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
}; |
@@ -188,7 +200,7 @@ scoped_ptr<RasterBuffer> GpuRasterWorkerPool::AcquireBufferForRaster( |
resource_provider_->AcquireSkSurface(resource->id()); |
return make_scoped_ptr<RasterBuffer>( |
- new RasterBufferImpl(resource_provider_, resource)); |
+ new RasterBufferImpl(resource_provider_, resource, &multi_picture_draw_)); |
} |
void GpuRasterWorkerPool::ReleaseBufferForRaster( |
@@ -224,6 +236,7 @@ void GpuRasterWorkerPool::RunTasksOnOriginThread() { |
ScopedGpuRaster gpu_raster(context_provider_); |
task_graph_runner_->RunUntilIdle(); |
+ multi_picture_draw_.draw(); |
reveman
2014/09/22 21:29:05
Does calling draw() also clear the SkMultiPictureD
hendrikw
2014/09/22 21:48:39
Yes, it clears. I'll add a comment.
|
} |
} // namespace cc |