Index: cc/resources/pixel_buffer_raster_worker_pool.cc |
diff --git a/cc/resources/pixel_buffer_raster_worker_pool.cc b/cc/resources/pixel_buffer_raster_worker_pool.cc |
index 759ac00a2355a0f294ca6750020a810fda40dd81..28408b812001adf36e1cf76e8c39bb054fd530ae 100644 |
--- a/cc/resources/pixel_buffer_raster_worker_pool.cc |
+++ b/cc/resources/pixel_buffer_raster_worker_pool.cc |
@@ -10,12 +10,57 @@ |
#include "base/debug/trace_event.h" |
#include "base/debug/trace_event_argument.h" |
#include "cc/debug/traced_value.h" |
+#include "cc/resources/raster_buffer.h" |
#include "cc/resources/resource.h" |
#include "gpu/command_buffer/client/gles2_interface.h" |
+#include "third_party/skia/include/utils/SkNullCanvas.h" |
namespace cc { |
namespace { |
+class RasterBufferImpl : public RasterBuffer { |
+ public: |
+ RasterBufferImpl(ResourceProvider* resource_provider, |
+ const Resource* resource) |
+ : resource_provider_(resource_provider), |
+ resource_(resource), |
+ buffer_(NULL), |
+ stride_(0) { |
+ resource_provider_->AcquirePixelBuffer(resource_->id()); |
+ buffer_ = resource_provider_->MapPixelBuffer(resource_->id(), &stride_); |
+ } |
+ |
+ virtual ~RasterBufferImpl() { |
+ resource_provider_->ReleasePixelBuffer(resource_->id()); |
+ } |
+ |
+ // Overridden from RasterBuffer: |
+ virtual skia::RefPtr<SkCanvas> AcquireSkCanvas() OVERRIDE { |
+ if (!buffer_) |
+ return skia::AdoptRef(SkCreateNullCanvas()); |
+ |
+ RasterWorkerPool::AcquireBitmapForBuffer( |
+ &bitmap_, buffer_, resource_->format(), resource_->size(), stride_); |
+ return skia::AdoptRef(new SkCanvas(bitmap_)); |
+ } |
+ virtual void ReleaseSkCanvas(const skia::RefPtr<SkCanvas>& canvas) OVERRIDE { |
+ if (!buffer_) |
+ return; |
+ |
+ RasterWorkerPool::ReleaseBitmapForBuffer( |
+ &bitmap_, buffer_, resource_->format()); |
+ } |
+ |
+ private: |
+ ResourceProvider* resource_provider_; |
+ const Resource* resource_; |
+ uint8_t* buffer_; |
+ int stride_; |
+ SkBitmap bitmap_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
+}; |
+ |
const int kCheckForCompletedRasterTasksDelayMs = 6; |
const size_t kMaxScheduledRasterTasks = 48; |
@@ -255,21 +300,15 @@ void PixelBufferRasterWorkerPool::CheckForCompletedTasks() { |
completed_raster_tasks_.clear(); |
} |
-RasterBuffer* PixelBufferRasterWorkerPool::AcquireBufferForRaster( |
- RasterTask* task) { |
- DCHECK(std::find_if(raster_task_states_.begin(), |
- raster_task_states_.end(), |
- RasterTaskState::TaskComparator(task)) != |
- raster_task_states_.end()); |
- return resource_provider_->AcquirePixelRasterBuffer(task->resource()->id()); |
+scoped_ptr<RasterBuffer> PixelBufferRasterWorkerPool::AcquireBufferForRaster( |
+ const Resource* resource) { |
+ return make_scoped_ptr<RasterBuffer>( |
+ new RasterBufferImpl(resource_provider_, resource)); |
} |
-void PixelBufferRasterWorkerPool::ReleaseBufferForRaster(RasterTask* task) { |
- DCHECK(std::find_if(raster_task_states_.begin(), |
- raster_task_states_.end(), |
- RasterTaskState::TaskComparator(task)) != |
- raster_task_states_.end()); |
- resource_provider_->ReleasePixelRasterBuffer(task->resource()->id()); |
+void PixelBufferRasterWorkerPool::ReleaseBufferForRaster( |
+ scoped_ptr<RasterBuffer> buffer) { |
+ // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
} |
void PixelBufferRasterWorkerPool::OnRasterFinished() { |
@@ -679,6 +718,8 @@ void PixelBufferRasterWorkerPool::CheckForCompletedRasterizerTasks() { |
RasterTaskState& state = *state_it; |
DCHECK_EQ(RasterTaskState::SCHEDULED, state.type); |
+ resource_provider_->UnmapPixelBuffer(raster_task->resource()->id()); |
vmpstr
2014/09/16 22:15:55
Can you explain why this is now needed?
reveman
2014/09/17 14:40:56
It was done automatically by ResourceProvider::Beg
|
+ |
if (!raster_task->HasFinishedRunning()) { |
// When priorites change, a raster task can be canceled as a result of |
// no longer being of high enough priority to fit in our throttled |