Index: cc/resources/resource_provider.cc |
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
index ff0652465d9047447fb376bd097988db9828acdb..944f8c583d710992f115a835acf7bc1acc78df50 100644 |
--- a/cc/resources/resource_provider.cc |
+++ b/cc/resources/resource_provider.cc |
@@ -396,65 +396,64 @@ ResourceProvider::Resource::Resource(const SharedBitmapId& bitmap_id, |
DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT); |
} |
-ResourceProvider::RasterBuffer::RasterBuffer( |
+ResourceProvider::GpuRasterBuffer::GpuRasterBuffer( |
const Resource* resource, |
- ResourceProvider* resource_provider) |
+ ResourceProvider* resource_provider, |
+ bool use_distance_field_text) |
: resource_(resource), |
resource_provider_(resource_provider), |
locked_canvas_(NULL), |
- canvas_save_count_(0) { |
- DCHECK(resource_); |
- DCHECK(resource_provider_); |
+ canvas_save_count_(0), |
+ surface_generation_id_(0u), |
+ use_distance_field_text_(use_distance_field_text) { |
} |
-ResourceProvider::RasterBuffer::~RasterBuffer() {} |
+ResourceProvider::GpuRasterBuffer::~GpuRasterBuffer() { |
+} |
-SkCanvas* ResourceProvider::RasterBuffer::LockForWrite() { |
+void ResourceProvider::GpuRasterBuffer::LockForWrite() { |
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
- "ResourceProvider::RasterBuffer::LockForWrite"); |
+ "ResourceProvider::GpuRasterBuffer::LockForWrite"); |
DCHECK(!locked_canvas_); |
- locked_canvas_ = DoLockForWrite(); |
- canvas_save_count_ = locked_canvas_ ? locked_canvas_->save() : 0; |
- return locked_canvas_; |
+ if (!surface_) |
+ surface_ = CreateSurface(); |
+ surface_generation_id_ = surface_ ? surface_->generationID() : 0u; |
} |
-bool ResourceProvider::RasterBuffer::UnlockForWrite() { |
+bool ResourceProvider::GpuRasterBuffer::UnlockForWrite() { |
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
- "ResourceProvider::RasterBuffer::UnlockForWrite"); |
+ "ResourceProvider::GpuRasterBuffer::UnlockForWrite"); |
- if (locked_canvas_) { |
- locked_canvas_->restoreToCount(canvas_save_count_); |
- locked_canvas_ = NULL; |
- } |
- return DoUnlockForWrite(); |
-} |
+ DCHECK(!locked_canvas_); |
-ResourceProvider::GpuRasterBuffer::GpuRasterBuffer( |
- const Resource* resource, |
- ResourceProvider* resource_provider, |
- bool use_distance_field_text) |
- : RasterBuffer(resource, resource_provider), |
- surface_generation_id_(0u), |
- use_distance_field_text_(use_distance_field_text) { |
+ // generationID returns a non-zero, unique value corresponding to the content |
+ // of surface. Hence, a change since LockForWrite was called means the surface |
+ // has changed. |
+ return surface_ ? surface_generation_id_ != surface_->generationID() : false; |
} |
-ResourceProvider::GpuRasterBuffer::~GpuRasterBuffer() { |
-} |
+SkCanvas* ResourceProvider::GpuRasterBuffer::AcquireSkCanvas() { |
+ // Note that this function is called from a worker thread. |
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
+ "ResourceProvider::GpuRasterBuffer::AcquireSkCanvas"); |
-SkCanvas* ResourceProvider::GpuRasterBuffer::DoLockForWrite() { |
- if (!surface_) |
- surface_ = CreateSurface(); |
- surface_generation_id_ = surface_ ? surface_->generationID() : 0u; |
- return surface_ ? surface_->getCanvas() : NULL; |
+ DCHECK(!locked_canvas_); |
+ locked_canvas_ = surface_ ? surface_->getCanvas() : NULL; |
+ canvas_save_count_ = locked_canvas_ ? locked_canvas_->save() : 0; |
+ return locked_canvas_; |
} |
-bool ResourceProvider::GpuRasterBuffer::DoUnlockForWrite() { |
- // generationID returns a non-zero, unique value corresponding to the content |
- // of surface. Hence, a change since DoLockForWrite was called means the |
- // surface has changed. |
- return surface_ ? surface_generation_id_ != surface_->generationID() : false; |
+void ResourceProvider::GpuRasterBuffer::ReleaseSkCanvas() { |
+ // Note that this function is called from a worker thread. |
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
+ "ResourceProvider::GpuRasterBuffer::ReleaseSkCanvas"); |
+ |
+ if (locked_canvas_) { |
+ locked_canvas_->restoreToCount(canvas_save_count_); |
+ locked_canvas_ = NULL; |
+ } |
} |
skia::RefPtr<SkSurface> ResourceProvider::GpuRasterBuffer::CreateSurface() { |
@@ -485,18 +484,45 @@ skia::RefPtr<SkSurface> ResourceProvider::GpuRasterBuffer::CreateSurface() { |
ResourceProvider::BitmapRasterBuffer::BitmapRasterBuffer( |
const Resource* resource, |
ResourceProvider* resource_provider) |
- : RasterBuffer(resource, resource_provider), |
+ : resource_(resource), |
+ resource_provider_(resource_provider), |
+ canvas_save_count_(0), |
mapped_buffer_(NULL), |
- raster_bitmap_generation_id_(0u) {} |
+ raster_bitmap_generation_id_(0u), |
+ raster_bitmap_changed_(false), |
+ stride_(0) { |
+} |
ResourceProvider::BitmapRasterBuffer::~BitmapRasterBuffer() {} |
-SkCanvas* ResourceProvider::BitmapRasterBuffer::DoLockForWrite() { |
+void ResourceProvider::BitmapRasterBuffer::LockForWrite() { |
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
+ "ResourceProvider::BitmapRasterBuffer::LockForWrite"); |
+ |
DCHECK(!mapped_buffer_); |
DCHECK(!raster_canvas_); |
- int stride = 0; |
- mapped_buffer_ = MapBuffer(&stride); |
+ stride_ = 0; |
+ mapped_buffer_ = MapBuffer(&stride_); |
+ raster_bitmap_changed_ = false; |
+} |
+ |
+bool ResourceProvider::BitmapRasterBuffer::UnlockForWrite() { |
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
+ "ResourceProvider::BitmapRasterBuffer::UnlockForWrite"); |
+ |
+ DCHECK(!raster_canvas_); |
+ |
+ UnmapBuffer(); |
+ mapped_buffer_ = NULL; |
+ return raster_bitmap_changed_; |
+} |
+ |
+SkCanvas* ResourceProvider::BitmapRasterBuffer::AcquireSkCanvas() { |
+ // Note that this function is called from a worker thread. |
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
+ "ResourceProvider::BitmapRasterBuffer::AcquireSkCanvas"); |
+ |
if (!mapped_buffer_) |
return NULL; |
@@ -511,9 +537,9 @@ SkCanvas* ResourceProvider::BitmapRasterBuffer::DoLockForWrite() { |
case BGRA_8888: { |
SkImageInfo info = SkImageInfo::MakeN32Premul(resource()->size.width(), |
resource()->size.height()); |
- if (0 == stride) |
- stride = info.minRowBytes(); |
- raster_bitmap_.installPixels(info, mapped_buffer_, stride); |
+ if (0 == stride_) |
+ stride_ = info.minRowBytes(); |
+ raster_bitmap_.installPixels(info, mapped_buffer_, stride_); |
break; |
} |
case LUMINANCE_8: |
@@ -522,31 +548,37 @@ SkCanvas* ResourceProvider::BitmapRasterBuffer::DoLockForWrite() { |
NOTREACHED(); |
break; |
} |
- raster_canvas_ = skia::AdoptRef(new SkCanvas(raster_bitmap_)); |
+ |
raster_bitmap_generation_id_ = raster_bitmap_.getGenerationID(); |
+ |
+ DCHECK(!raster_canvas_); |
+ raster_canvas_ = skia::AdoptRef(new SkCanvas(raster_bitmap_)); |
+ canvas_save_count_ = raster_canvas_->save(); |
return raster_canvas_.get(); |
} |
-bool ResourceProvider::BitmapRasterBuffer::DoUnlockForWrite() { |
- raster_canvas_.clear(); |
+void ResourceProvider::BitmapRasterBuffer::ReleaseSkCanvas() { |
+ // Note that this function is called from a worker thread. |
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
+ "ResourceProvider::BitmapRasterBuffer::ReleaseSkCanvas"); |
+ |
+ if (raster_canvas_) { |
+ raster_canvas_->restoreToCount(canvas_save_count_); |
+ raster_canvas_.clear(); |
+ } |
// getGenerationID returns a non-zero, unique value corresponding to the |
- // pixels in bitmap. Hence, a change since DoLockForWrite was called means the |
+ // pixels in bitmap. Hence, a change since LockForWrite was called means the |
// bitmap has changed. |
- bool raster_bitmap_changed = |
+ raster_bitmap_changed_ = |
raster_bitmap_generation_id_ != raster_bitmap_.getGenerationID(); |
- |
- if (raster_bitmap_changed) { |
+ if (raster_bitmap_changed_) { |
SkColorType buffer_colorType = |
ResourceFormatToSkColorType(resource()->format); |
if (mapped_buffer_ && (buffer_colorType != raster_bitmap_.colorType())) |
CopyBitmap(raster_bitmap_, mapped_buffer_, buffer_colorType); |
} |
raster_bitmap_.reset(); |
- |
- UnmapBuffer(); |
- mapped_buffer_ = NULL; |
- return raster_bitmap_changed; |
} |
ResourceProvider::ImageRasterBuffer::ImageRasterBuffer( |
@@ -1727,7 +1759,7 @@ void ResourceProvider::DeleteAndReturnUnusedResourcesToChild( |
} |
} |
-SkCanvas* ResourceProvider::MapGpuRasterBuffer(ResourceId id) { |
+RasterBuffer* ResourceProvider::AcquireGpuRasterBuffer(ResourceId id) { |
// Resource needs to be locked for write since GpuRasterBuffer writes |
// directly to it. |
LockForWrite(id); |
@@ -1736,25 +1768,27 @@ SkCanvas* ResourceProvider::MapGpuRasterBuffer(ResourceId id) { |
resource->gpu_raster_buffer.reset( |
new GpuRasterBuffer(resource, this, use_distance_field_text_)); |
} |
- return resource->gpu_raster_buffer->LockForWrite(); |
+ resource->gpu_raster_buffer->LockForWrite(); |
+ return resource->gpu_raster_buffer.get(); |
} |
-void ResourceProvider::UnmapGpuRasterBuffer(ResourceId id) { |
+void ResourceProvider::ReleaseGpuRasterBuffer(ResourceId id) { |
Resource* resource = GetResource(id); |
DCHECK(resource->gpu_raster_buffer.get()); |
resource->gpu_raster_buffer->UnlockForWrite(); |
UnlockForWrite(id); |
} |
-SkCanvas* ResourceProvider::MapImageRasterBuffer(ResourceId id) { |
+RasterBuffer* ResourceProvider::AcquireImageRasterBuffer(ResourceId id) { |
Resource* resource = GetResource(id); |
AcquireImage(resource); |
if (!resource->image_raster_buffer.get()) |
resource->image_raster_buffer.reset(new ImageRasterBuffer(resource, this)); |
- return resource->image_raster_buffer->LockForWrite(); |
+ resource->image_raster_buffer->LockForWrite(); |
+ return resource->image_raster_buffer.get(); |
} |
-bool ResourceProvider::UnmapImageRasterBuffer(ResourceId id) { |
+bool ResourceProvider::ReleaseImageRasterBuffer(ResourceId id) { |
Resource* resource = GetResource(id); |
resource->dirty_image = true; |
return resource->image_raster_buffer->UnlockForWrite(); |
@@ -1772,10 +1806,11 @@ void ResourceProvider::ReleasePixelRasterBuffer(ResourceId id) { |
ReleasePixelBuffer(resource); |
} |
-SkCanvas* ResourceProvider::MapPixelRasterBuffer(ResourceId id) { |
+RasterBuffer* ResourceProvider::MapPixelRasterBuffer(ResourceId id) { |
Resource* resource = GetResource(id); |
DCHECK(resource->pixel_raster_buffer.get()); |
- return resource->pixel_raster_buffer->LockForWrite(); |
+ resource->pixel_raster_buffer->LockForWrite(); |
+ return resource->pixel_raster_buffer.get(); |
} |
bool ResourceProvider::UnmapPixelRasterBuffer(ResourceId id) { |