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

Unified Diff: cc/resources/resource_provider.cc

Issue 562833004: cc: Move RasterBuffer implementations from ResourceProvider to RasterWorkerPool implementations. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase and fix gpu raster issue Created 6 years, 3 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
« no previous file with comments | « cc/resources/resource_provider.h ('k') | cc/resources/resource_provider_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/resources/resource_provider.cc
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
index 63414bb7fb27884b6a0cc720213afd9a3fadc419..f76c92248dfdaa15128cfc1fc57f4318a885ea76 100644
--- a/cc/resources/resource_provider.cc
+++ b/cc/resources/resource_provider.cc
@@ -25,7 +25,6 @@
#include "third_party/khronos/GLES2/gl2ext.h"
#include "third_party/skia/include/core/SkSurface.h"
#include "third_party/skia/include/gpu/GrContext.h"
-#include "third_party/skia/include/utils/SkNullCanvas.h"
#include "ui/gfx/frame_time.h"
#include "ui/gfx/rect.h"
#include "ui/gfx/vector2d.h"
@@ -112,47 +111,6 @@ 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;
- // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the
- // bitmap data. There will be no need to call SkAlign4 once crbug.com/293728
- // is fixed.
- const size_t dst_row_bytes = SkAlign4(dst_info.minRowBytes());
- CHECK_EQ(0u, dst_row_bytes % 4);
- bool success = src.readPixels(dst_info, dst, dst_row_bytes, 0, 0);
- CHECK_EQ(true, success);
-}
-
class ScopedSetActiveTexture {
public:
ScopedSetActiveTexture(GLES2Interface* gl, GLenum unit)
@@ -419,186 +377,6 @@ ResourceProvider::Resource::Resource(const SharedBitmapId& bitmap_id,
DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT);
}
-ResourceProvider::GpuRasterBuffer::GpuRasterBuffer(
- const Resource* resource,
- 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::GpuRasterBuffer::~GpuRasterBuffer() {
-}
-
-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::GpuRasterBuffer::AcquireSkCanvas");
-
- skia::RefPtr<SkCanvas> canvas = surface_
- ? skia::SharePtr(surface_->getCanvas())
- : skia::AdoptRef(SkCreateNullCanvas());
- canvas->save();
- return canvas;
-}
-
-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::GpuRasterBuffer::ReleaseSkCanvas");
-
- canvas->restore();
-}
-
-ResourceProvider::ImageRasterBuffer::ImageRasterBuffer(
- const Resource* resource,
- ResourceProvider* resource_provider)
- : resource_(resource),
- resource_provider_(resource_provider),
- mapped_buffer_(NULL),
- raster_bitmap_changed_(false),
- stride_(0) {
-}
-
-ResourceProvider::ImageRasterBuffer::~ImageRasterBuffer() {
-}
-
-void ResourceProvider::ImageRasterBuffer::MapBuffer() {
- TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
- "ResourceProvider::ImageRasterBuffer::MapBuffer");
-
- DCHECK(!mapped_buffer_);
-
- stride_ = 0;
- mapped_buffer_ = resource_provider_->MapImage(resource_, &stride_);
- raster_bitmap_changed_ = false;
-}
-
-bool ResourceProvider::ImageRasterBuffer::UnmapBuffer() {
- TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
- "ResourceProvider::ImageRasterBuffer::UnmapBuffer");
-
- if (mapped_buffer_) {
- resource_provider_->UnmapImage(resource_);
- mapped_buffer_ = NULL;
- }
- return raster_bitmap_changed_;
-}
-
-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");
-
- if (!mapped_buffer_)
- return skia::AdoptRef(SkCreateNullCanvas());
-
- MakeBitmap(&raster_bitmap_,
- mapped_buffer_,
- resource_->format,
- resource_->size,
- stride_);
- raster_bitmap_changed_ = true;
- return skia::AdoptRef(new SkCanvas(raster_bitmap_));
-}
-
-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");
-
- 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::PixelRasterBuffer::PixelRasterBuffer(
- const Resource* resource,
- ResourceProvider* 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");
-
- DCHECK(!mapped_buffer_);
-
- stride_ = 0;
- mapped_buffer_ = resource_provider_->MapPixelBuffer(resource_, &stride_);
- raster_bitmap_changed_ = false;
-}
-
-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_;
-}
-
-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");
-
- if (!mapped_buffer_)
- return skia::AdoptRef(SkCreateNullCanvas());
-
- MakeBitmap(&raster_bitmap_,
- mapped_buffer_,
- resource_->format,
- resource_->size,
- stride_);
- raster_bitmap_changed_ = true;
- return skia::AdoptRef(new SkCanvas(raster_bitmap_));
-}
-
-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) {}
ResourceProvider::Child::~Child() {}
@@ -854,10 +632,6 @@ void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it,
if (style == ForShutdown && resource->exported_count > 0)
lost_resource = true;
- resource->gpu_raster_buffer.reset();
- resource->image_raster_buffer.reset();
- resource->pixel_raster_buffer.reset();
-
if (resource->image_id) {
DCHECK(resource->origin == Resource::Internal);
GLES2Interface* gl = ContextGL();
@@ -1758,60 +1532,11 @@ void ResourceProvider::DeleteAndReturnUnusedResourcesToChild(
}
}
-RasterBuffer* ResourceProvider::AcquireGpuRasterBuffer(ResourceId id) {
- // Resource needs to be locked for write since GpuRasterBuffer writes
- // directly to it.
- LockForWrite(id);
- Resource* resource = GetResource(id);
- if (!resource->gpu_raster_buffer.get()) {
- resource->gpu_raster_buffer.reset(
- new GpuRasterBuffer(resource, this, use_distance_field_text_));
- }
- return resource->gpu_raster_buffer.get();
-}
-
-void ResourceProvider::ReleaseGpuRasterBuffer(ResourceId id) {
- Resource* resource = GetResource(id);
- DCHECK(resource->gpu_raster_buffer.get());
- UnlockForWrite(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));
- resource->image_raster_buffer->MapBuffer();
- return resource->image_raster_buffer.get();
-}
-
-bool ResourceProvider::ReleaseImageRasterBuffer(ResourceId id) {
- Resource* resource = GetResource(id);
- resource->dirty_image = true;
- return resource->image_raster_buffer->UnmapBuffer();
-}
-
-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();
-}
-
-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);
- return raster_bitmap_changed;
-}
-
-void ResourceProvider::AcquirePixelBuffer(Resource* resource) {
+void ResourceProvider::AcquirePixelBuffer(ResourceId id) {
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
"ResourceProvider::AcquirePixelBuffer");
+ Resource* resource = GetResource(id);
DCHECK(resource->origin == Resource::Internal);
DCHECK_EQ(resource->exported_count, 0);
DCHECK(!resource->image_id);
@@ -1833,10 +1558,11 @@ void ResourceProvider::AcquirePixelBuffer(Resource* resource) {
gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
}
-void ResourceProvider::ReleasePixelBuffer(Resource* resource) {
+void ResourceProvider::ReleasePixelBuffer(ResourceId id) {
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
"ResourceProvider::ReleasePixelBuffer");
+ Resource* resource = GetResource(id);
DCHECK(resource->origin == Resource::Internal);
DCHECK_EQ(resource->exported_count, 0);
DCHECK(!resource->image_id);
@@ -1865,11 +1591,11 @@ void ResourceProvider::ReleasePixelBuffer(Resource* resource) {
gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
}
-uint8_t* ResourceProvider::MapPixelBuffer(const Resource* resource,
- int* stride) {
+uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id, int* stride) {
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
"ResourceProvider::MapPixelBuffer");
+ Resource* resource = GetResource(id);
DCHECK(resource->origin == Resource::Internal);
DCHECK_EQ(resource->exported_count, 0);
DCHECK(!resource->image_id);
@@ -1889,10 +1615,11 @@ uint8_t* ResourceProvider::MapPixelBuffer(const Resource* resource,
return image;
}
-void ResourceProvider::UnmapPixelBuffer(const Resource* resource) {
+void ResourceProvider::UnmapPixelBuffer(ResourceId id) {
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
"ResourceProvider::UnmapPixelBuffer");
+ Resource* resource = GetResource(id);
DCHECK(resource->origin == Resource::Internal);
DCHECK_EQ(resource->exported_count, 0);
DCHECK(!resource->image_id);
@@ -1907,10 +1634,9 @@ void ResourceProvider::UnmapPixelBuffer(const Resource* resource) {
gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
}
-GLenum ResourceProvider::BindForSampling(
- ResourceProvider::ResourceId resource_id,
- GLenum unit,
- GLenum filter) {
+GLenum ResourceProvider::BindForSampling(ResourceId resource_id,
+ GLenum unit,
+ GLenum filter) {
DCHECK(thread_checker_.CalledOnValidThread());
GLES2Interface* gl = ContextGL();
ResourceMap::iterator it = resources_.find(resource_id);
@@ -1941,11 +1667,6 @@ 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);
@@ -2003,10 +1724,8 @@ void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) {
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) {
@@ -2025,12 +1744,8 @@ bool ResourceProvider::DidSetPixelsComplete(ResourceId id) {
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();
@@ -2104,10 +1819,10 @@ void ResourceProvider::AllocateForTesting(ResourceId id) {
void ResourceProvider::LazyAllocate(Resource* resource) {
DCHECK(resource);
+ if (resource->allocated)
+ return;
LazyCreate(resource);
-
- DCHECK(resource->gl_id || resource->allocated);
- if (resource->allocated || !resource->gl_id)
+ if (!resource->gl_id)
return;
resource->allocated = true;
GLES2Interface* gl = ContextGL();
@@ -2152,12 +1867,13 @@ void ResourceProvider::BindImageForSampling(Resource* resource) {
resource->dirty_image = false;
}
-void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id) {
+void ResourceProvider::EnableReadLockFences(ResourceId id) {
Resource* resource = GetResource(id);
resource->read_lock_fences_enabled = true;
}
-void ResourceProvider::AcquireImage(Resource* resource) {
+void ResourceProvider::AcquireImage(ResourceId id) {
+ Resource* resource = GetResource(id);
DCHECK(resource->origin == Resource::Internal);
DCHECK_EQ(resource->exported_count, 0);
@@ -2178,7 +1894,8 @@ void ResourceProvider::AcquireImage(Resource* resource) {
DCHECK(resource->image_id);
}
-void ResourceProvider::ReleaseImage(Resource* resource) {
+void ResourceProvider::ReleaseImage(ResourceId id) {
+ Resource* resource = GetResource(id);
DCHECK(resource->origin == Resource::Internal);
DCHECK_EQ(resource->exported_count, 0);
@@ -2194,10 +1911,12 @@ void ResourceProvider::ReleaseImage(Resource* resource) {
resource->allocated = false;
}
-uint8_t* ResourceProvider::MapImage(const Resource* resource, int* stride) {
+uint8_t* ResourceProvider::MapImage(ResourceId id, int* stride) {
+ Resource* resource = GetResource(id);
DCHECK(ReadLockFenceHasPassed(resource));
DCHECK(resource->origin == Resource::Internal);
DCHECK_EQ(resource->exported_count, 0);
+ LockForWrite(id);
if (resource->type == GLTexture) {
DCHECK(resource->image_id);
@@ -2215,15 +1934,75 @@ uint8_t* ResourceProvider::MapImage(const Resource* resource, int* stride) {
return resource->pixels;
}
-void ResourceProvider::UnmapImage(const Resource* resource) {
+void ResourceProvider::UnmapImage(ResourceId id) {
+ Resource* resource = GetResource(id);
DCHECK(resource->origin == Resource::Internal);
DCHECK_EQ(resource->exported_count, 0);
+ DCHECK(resource->locked_for_write);
if (resource->image_id) {
GLES2Interface* gl = ContextGL();
DCHECK(gl);
gl->UnmapImageCHROMIUM(resource->image_id);
+ resource->dirty_image = true;
}
+
+ UnlockForWrite(id);
+}
+
+void ResourceProvider::AcquireSkSurface(ResourceId id) {
+ Resource* resource = GetResource(id);
+ DCHECK(resource->origin == Resource::Internal);
+ DCHECK_EQ(resource->exported_count, 0);
+
+ if (resource->type != GLTexture)
+ return;
+
+ if (resource->sk_surface)
+ return;
+
+ class GrContext* gr_context = GrContext();
+ // TODO(alokp): Implement TestContextProvider::GrContext().
+ if (!gr_context)
+ return;
+
+ LazyAllocate(resource);
+
+ 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;
+ resource->sk_surface = skia::AdoptRef(SkSurface::NewRenderTargetDirect(
+ gr_texture->asRenderTarget(), text_render_mode));
+}
+
+void ResourceProvider::ReleaseSkSurface(ResourceId id) {
+ Resource* resource = GetResource(id);
+ DCHECK(resource->origin == Resource::Internal);
+ DCHECK_EQ(resource->exported_count, 0);
+
+ resource->sk_surface.clear();
+}
+
+SkSurface* ResourceProvider::LockForWriteToSkSurface(ResourceId id) {
+ Resource* resource = GetResource(id);
+ DCHECK(resource->origin == Resource::Internal);
+ DCHECK_EQ(resource->exported_count, 0);
+
+ LockForWrite(id);
+ return resource->sk_surface.get();
+}
+
+void ResourceProvider::UnlockForWriteToSkSurface(ResourceId id) {
+ UnlockForWrite(id);
}
void ResourceProvider::CopyResource(ResourceId source_id, ResourceId dest_id) {
« no previous file with comments | « cc/resources/resource_provider.h ('k') | cc/resources/resource_provider_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698