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