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

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: Fix. 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 c9340ca6eda28074a7843679b4ef629e9c6d2056..c936154d95c073d3e652a58f2cfdd46db945222f 100644
--- a/cc/resources/resource_provider.cc
+++ b/cc/resources/resource_provider.cc
@@ -111,6 +111,35 @@ GrPixelConfig ToGrPixelConfig(ResourceFormat format) {
return kSkia8888_GrPixelConfig;
}
+void MakeBitmap(SkBitmap* bitmap,
+ uint8_t* buffer,
+ ResourceFormat format,
+ const gfx::Size& size,
+ int stride) {
+ switch (format) {
+ case RGBA_4444:
+ // Use the default stride if we will eventually convert this
+ // bitmap to 4444.
+ bitmap->allocN32Pixels(size.width(), size.height());
+ break;
+ case RGBA_8888:
+ case BGRA_8888: {
+ SkImageInfo info =
+ SkImageInfo::MakeN32Premul(size.width(), size.height());
+ if (0 == stride)
+ stride = info.minRowBytes();
+ bitmap->installPixels(info, buffer, stride);
+ break;
+ }
+ case ALPHA_8:
+ case LUMINANCE_8:
+ case RGB_565:
+ case ETC1:
+ NOTREACHED();
+ break;
+ }
+}
+
void CopyBitmap(const SkBitmap& src, uint8_t* dst, SkColorType dst_color_type) {
SkImageInfo dst_info = src.info();
dst_info.fColorType = dst_color_type;
@@ -389,188 +418,179 @@ 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)
- : resource_(resource),
- resource_provider_(resource_provider),
- locked_canvas_(NULL),
- canvas_save_count_(0) {
- DCHECK(resource_);
- DCHECK(resource_provider_);
+ ResourceProvider* resource_provider,
+ bool use_distance_field_text)
+ : resource_(resource), resource_provider_(resource_provider) {
+ DCHECK_EQ(GLTexture, resource_->type);
+ DCHECK(resource_->gl_id);
+
+ class GrContext* gr_context = resource_provider_->GrContext();
+ // TODO(alokp): Implement TestContextProvider::GrContext().
+ if (gr_context) {
+ GrBackendTextureDesc desc;
+ desc.fFlags = kRenderTarget_GrBackendTextureFlag;
+ desc.fWidth = resource_->size.width();
+ desc.fHeight = resource_->size.height();
+ desc.fConfig = ToGrPixelConfig(resource_->format);
+ desc.fOrigin = kTopLeft_GrSurfaceOrigin;
+ desc.fTextureHandle = resource_->gl_id;
+ skia::RefPtr<GrTexture> gr_texture =
+ skia::AdoptRef(gr_context->wrapBackendTexture(desc));
+ SkSurface::TextRenderMode text_render_mode =
+ use_distance_field_text ? SkSurface::kDistanceField_TextRenderMode
+ : SkSurface::kStandard_TextRenderMode;
+ surface_ = skia::AdoptRef(SkSurface::NewRenderTargetDirect(
+ gr_texture->asRenderTarget(), text_render_mode));
+ }
}
-ResourceProvider::RasterBuffer::~RasterBuffer() {}
+ResourceProvider::GpuRasterBuffer::~GpuRasterBuffer() {
+}
-SkCanvas* ResourceProvider::RasterBuffer::LockForWrite() {
+skia::RefPtr<SkCanvas> ResourceProvider::GpuRasterBuffer::AcquireSkCanvas() {
+ // Note that this function is called from a worker thread.
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
- "ResourceProvider::RasterBuffer::LockForWrite");
-
- DCHECK(!locked_canvas_);
+ "ResourceProvider::GpuRasterBuffer::AcquireSkCanvas");
- locked_canvas_ = DoLockForWrite();
- canvas_save_count_ = locked_canvas_ ? locked_canvas_->save() : 0;
- return locked_canvas_;
+ return surface_ ? skia::SharePtr(surface_->getCanvas())
+ : skia::RefPtr<SkCanvas>();
}
-bool ResourceProvider::RasterBuffer::UnlockForWrite() {
+void ResourceProvider::GpuRasterBuffer::ReleaseSkCanvas(
+ const skia::RefPtr<SkCanvas>& canvas) {
+ // Note that this function is called from a worker thread.
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
- "ResourceProvider::RasterBuffer::UnlockForWrite");
-
- if (locked_canvas_) {
- locked_canvas_->restoreToCount(canvas_save_count_);
- locked_canvas_ = NULL;
- }
- return DoUnlockForWrite();
+ "ResourceProvider::GpuRasterBuffer::ReleaseSkCanvas");
}
-ResourceProvider::GpuRasterBuffer::GpuRasterBuffer(
+ResourceProvider::ImageRasterBuffer::ImageRasterBuffer(
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) {
+ ResourceProvider* resource_provider)
+ : resource_(resource),
+ resource_provider_(resource_provider),
+ mapped_buffer_(NULL),
+ raster_bitmap_changed_(false),
+ stride_(0) {
}
-ResourceProvider::GpuRasterBuffer::~GpuRasterBuffer() {
+ResourceProvider::ImageRasterBuffer::~ImageRasterBuffer() {
}
-SkCanvas* ResourceProvider::GpuRasterBuffer::DoLockForWrite() {
- if (!surface_)
- surface_ = CreateSurface();
- surface_generation_id_ = surface_ ? surface_->generationID() : 0u;
- return surface_ ? surface_->getCanvas() : NULL;
-}
+void ResourceProvider::ImageRasterBuffer::MapBuffer() {
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
+ "ResourceProvider::ImageRasterBuffer::MapBuffer");
-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;
-}
+ DCHECK(!mapped_buffer_);
-skia::RefPtr<SkSurface> ResourceProvider::GpuRasterBuffer::CreateSurface() {
- DCHECK_EQ(GLTexture, resource()->type);
- DCHECK(resource()->gl_id);
+ stride_ = 0;
+ mapped_buffer_ = resource_provider_->MapImage(resource_, &stride_);
+ raster_bitmap_changed_ = false;
+}
- class GrContext* gr_context = resource_provider()->GrContext();
- // TODO(alokp): Implement TestContextProvider::GrContext().
- if (!gr_context)
- return skia::RefPtr<SkSurface>();
-
- GrBackendTextureDesc desc;
- desc.fFlags = kRenderTarget_GrBackendTextureFlag;
- desc.fWidth = resource()->size.width();
- desc.fHeight = resource()->size.height();
- desc.fConfig = ToGrPixelConfig(resource()->format);
- desc.fOrigin = kTopLeft_GrSurfaceOrigin;
- desc.fTextureHandle = resource()->gl_id;
- skia::RefPtr<GrTexture> gr_texture =
- skia::AdoptRef(gr_context->wrapBackendTexture(desc));
- SkSurface::TextRenderMode text_render_mode =
- use_distance_field_text_ ? SkSurface::kDistanceField_TextRenderMode
- : SkSurface::kStandard_TextRenderMode;
- return skia::AdoptRef(SkSurface::NewRenderTargetDirect(
- gr_texture->asRenderTarget(), text_render_mode));
-}
-
-ResourceProvider::BitmapRasterBuffer::BitmapRasterBuffer(
- const Resource* resource,
- ResourceProvider* resource_provider)
- : RasterBuffer(resource, resource_provider),
- mapped_buffer_(NULL),
- raster_bitmap_generation_id_(0u) {}
+bool ResourceProvider::ImageRasterBuffer::UnmapBuffer() {
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
+ "ResourceProvider::ImageRasterBuffer::UnmapBuffer");
-ResourceProvider::BitmapRasterBuffer::~BitmapRasterBuffer() {}
+ if (mapped_buffer_) {
+ resource_provider_->UnmapImage(resource_);
+ mapped_buffer_ = NULL;
+ }
+ return raster_bitmap_changed_;
+}
-SkCanvas* ResourceProvider::BitmapRasterBuffer::DoLockForWrite() {
- DCHECK(!mapped_buffer_);
- DCHECK(!raster_canvas_);
+skia::RefPtr<SkCanvas> ResourceProvider::ImageRasterBuffer::AcquireSkCanvas() {
+ // Note that this function is called from a worker thread.
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
+ "ResourceProvider::ImageRasterBuffer::AcquireSkCanvas");
- int stride = 0;
- mapped_buffer_ = MapBuffer(&stride);
if (!mapped_buffer_)
- return NULL;
+ return skia::RefPtr<SkCanvas>();
- switch (resource()->format) {
- case RGBA_4444:
- // Use the default stride if we will eventually convert this
- // bitmap to 4444.
- raster_bitmap_.allocN32Pixels(resource()->size.width(),
- resource()->size.height());
- break;
- case RGBA_8888:
- 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);
- break;
- }
- case ALPHA_8:
- case LUMINANCE_8:
- case RGB_565:
- case ETC1:
- NOTREACHED();
- break;
- }
- raster_canvas_ = skia::AdoptRef(new SkCanvas(raster_bitmap_));
- raster_bitmap_generation_id_ = raster_bitmap_.getGenerationID();
- return raster_canvas_.get();
+ MakeBitmap(&raster_bitmap_,
+ mapped_buffer_,
+ resource_->format,
+ resource_->size,
+ stride_);
+ raster_bitmap_changed_ = true;
+ return skia::AdoptRef(new SkCanvas(raster_bitmap_));
}
-bool ResourceProvider::BitmapRasterBuffer::DoUnlockForWrite() {
- 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
- // bitmap has changed.
- bool raster_bitmap_changed =
- raster_bitmap_generation_id_ != raster_bitmap_.getGenerationID();
+void ResourceProvider::ImageRasterBuffer::ReleaseSkCanvas(
+ const skia::RefPtr<SkCanvas>& canvas) {
+ // Note that this function is called from a worker thread.
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
+ "ResourceProvider::ImageRasterBuffer::ReleaseSkCanvas");
- 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);
- }
+ 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(
+ResourceProvider::PixelRasterBuffer::PixelRasterBuffer(
const Resource* resource,
ResourceProvider* resource_provider)
- : BitmapRasterBuffer(resource, resource_provider) {}
+ : resource_(resource),
+ resource_provider_(resource_provider),
+ mapped_buffer_(NULL),
+ raster_bitmap_changed_(false),
+ stride_(0) {
+}
+
+ResourceProvider::PixelRasterBuffer::~PixelRasterBuffer() {
+}
+
+void ResourceProvider::PixelRasterBuffer::MapBuffer() {
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
+ "ResourceProvider::PixelRasterBuffer::MapBuffer");
-ResourceProvider::ImageRasterBuffer::~ImageRasterBuffer() {}
+ DCHECK(!mapped_buffer_);
-uint8_t* ResourceProvider::ImageRasterBuffer::MapBuffer(int* stride) {
- return resource_provider()->MapImage(resource(), stride);
+ stride_ = 0;
+ mapped_buffer_ = resource_provider_->MapPixelBuffer(resource_, &stride_);
+ raster_bitmap_changed_ = false;
}
-void ResourceProvider::ImageRasterBuffer::UnmapBuffer() {
- resource_provider()->UnmapImage(resource());
+bool ResourceProvider::PixelRasterBuffer::UnmapBuffer() {
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
+ "ResourceProvider::PixelRasterBuffer::UnmapBuffer");
+
+ if (mapped_buffer_) {
+ resource_provider_->UnmapPixelBuffer(resource_);
+ mapped_buffer_ = NULL;
+ }
+ return raster_bitmap_changed_;
}
-ResourceProvider::PixelRasterBuffer::PixelRasterBuffer(
- const Resource* resource,
- ResourceProvider* resource_provider)
- : BitmapRasterBuffer(resource, resource_provider) {}
+skia::RefPtr<SkCanvas> ResourceProvider::PixelRasterBuffer::AcquireSkCanvas() {
+ // Note that this function is called from a worker thread.
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
+ "ResourceProvider::PixelRasterBuffer::AcquireSkCanvas");
-ResourceProvider::PixelRasterBuffer::~PixelRasterBuffer() {}
+ if (!mapped_buffer_)
+ return skia::RefPtr<SkCanvas>();
-uint8_t* ResourceProvider::PixelRasterBuffer::MapBuffer(int* stride) {
- return resource_provider()->MapPixelBuffer(resource(), stride);
+ MakeBitmap(&raster_bitmap_,
+ mapped_buffer_,
+ resource_->format,
+ resource_->size,
+ stride_);
+ raster_bitmap_changed_ = true;
+ return skia::AdoptRef(new SkCanvas(raster_bitmap_));
}
-void ResourceProvider::PixelRasterBuffer::UnmapBuffer() {
- resource_provider()->UnmapPixelBuffer(resource());
+void ResourceProvider::PixelRasterBuffer::ReleaseSkCanvas(
+ const skia::RefPtr<SkCanvas>& canvas) {
+ // Note that this function is called from a worker thread.
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
+ "ResourceProvider::PixelRasterBuffer::ReleaseSkCanvas");
+
+ SkColorType buffer_colorType = ResourceFormatToSkColorType(resource_->format);
+ if (mapped_buffer_ && (buffer_colorType != raster_bitmap_.colorType()))
+ CopyBitmap(raster_bitmap_, mapped_buffer_, buffer_colorType);
+ raster_bitmap_.reset();
}
ResourceProvider::Child::Child() : marked_for_deletion(false) {}
@@ -1722,7 +1742,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);
@@ -1731,52 +1751,45 @@ SkCanvas* ResourceProvider::MapGpuRasterBuffer(ResourceId id) {
resource->gpu_raster_buffer.reset(
new GpuRasterBuffer(resource, this, use_distance_field_text_));
}
- return 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->MapBuffer();
+ 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();
+ return resource->image_raster_buffer->UnmapBuffer();
}
-void ResourceProvider::AcquirePixelRasterBuffer(ResourceId id) {
+RasterBuffer* ResourceProvider::AcquirePixelRasterBuffer(ResourceId id) {
Resource* resource = GetResource(id);
AcquirePixelBuffer(resource);
resource->pixel_raster_buffer.reset(new PixelRasterBuffer(resource, this));
+ resource->pixel_raster_buffer->MapBuffer();
+ return resource->pixel_raster_buffer.get();
}
-void ResourceProvider::ReleasePixelRasterBuffer(ResourceId id) {
+bool ResourceProvider::ReleasePixelRasterBuffer(ResourceId id) {
Resource* resource = GetResource(id);
+ DCHECK(resource->pixel_raster_buffer.get());
+ bool raster_bitmap_changed = resource->pixel_raster_buffer->UnmapBuffer();
resource->pixel_raster_buffer.reset();
ReleasePixelBuffer(resource);
-}
-
-SkCanvas* ResourceProvider::MapPixelRasterBuffer(ResourceId id) {
- Resource* resource = GetResource(id);
- DCHECK(resource->pixel_raster_buffer.get());
- return resource->pixel_raster_buffer->LockForWrite();
-}
-
-bool ResourceProvider::UnmapPixelRasterBuffer(ResourceId id) {
- Resource* resource = GetResource(id);
- DCHECK(resource->pixel_raster_buffer.get());
- return resource->pixel_raster_buffer->UnlockForWrite();
+ return raster_bitmap_changed;
}
void ResourceProvider::AcquirePixelBuffer(Resource* resource) {
@@ -1912,6 +1925,11 @@ void ResourceProvider::BeginSetPixels(ResourceId id) {
Resource* resource = GetResource(id);
DCHECK(!resource->pending_set_pixels);
+ DCHECK(resource->pixel_raster_buffer.get());
+ bool raster_bitmap_changed = resource->pixel_raster_buffer->UnmapBuffer();
+ if (!raster_bitmap_changed)
+ return;
+
LazyCreate(resource);
DCHECK(resource->origin == Resource::Internal);
DCHECK(resource->gl_id || resource->allocated);
@@ -1968,8 +1986,11 @@ void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) {
"ResourceProvider::ForceSetPixelsToComplete");
Resource* resource = GetResource(id);
+
+ if (!resource->pending_set_pixels)
+ return;
+
DCHECK(resource->locked_for_write);
- DCHECK(resource->pending_set_pixels);
DCHECK(!resource->set_pixels_completion_forced);
if (resource->gl_id) {
@@ -1987,8 +2008,13 @@ bool ResourceProvider::DidSetPixelsComplete(ResourceId id) {
"ResourceProvider::DidSetPixelsComplete");
Resource* resource = GetResource(id);
+
+ // Upload can be avoided as a result of raster bitmap not being modified.
+ // Assume the upload was completed in that case.
+ if (!resource->pending_set_pixels)
+ return true;
+
DCHECK(resource->locked_for_write);
- DCHECK(resource->pending_set_pixels);
if (resource->gl_id) {
GLES2Interface* gl = ContextGL();

Powered by Google App Engine
This is Rietveld 408576698