| 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) {
|
|
|