Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Unified Diff: cc/resources/resource_provider.cc

Issue 454843002: cc: Do bitmap conversion for RasterBuffer in the worker thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changed RasterBuffer interface. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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) {

Powered by Google App Engine
This is Rietveld 408576698