| Index: cc/resources/resource_provider.cc
|
| diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
|
| index a37789a94d3ba60da59223c1420b928f56208adc..14f4880810cdc8e79893f4be89b07443283fce96 100644
|
| --- a/cc/resources/resource_provider.cc
|
| +++ b/cc/resources/resource_provider.cc
|
| @@ -14,7 +14,6 @@
|
| #include "base/strings/string_util.h"
|
| #include "cc/base/util.h"
|
| #include "cc/output/gl_renderer.h" // For the GLC() macro.
|
| -#include "cc/resources/gpu_memory_buffer_manager.h"
|
| #include "cc/resources/platform_color.h"
|
| #include "cc/resources/returned_resource.h"
|
| #include "cc/resources/shared_bitmap_manager.h"
|
| @@ -22,6 +21,7 @@
|
| #include "cc/resources/transferable_resource.h"
|
| #include "gpu/GLES2/gl2extchromium.h"
|
| #include "gpu/command_buffer/client/gles2_interface.h"
|
| +#include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
|
| #include "third_party/khronos/GLES2/gl2.h"
|
| #include "third_party/khronos/GLES2/gl2ext.h"
|
| #include "third_party/skia/include/core/SkSurface.h"
|
| @@ -407,7 +407,7 @@ ResourceProvider::Child::~Child() {}
|
| scoped_ptr<ResourceProvider> ResourceProvider::Create(
|
| OutputSurface* output_surface,
|
| SharedBitmapManager* shared_bitmap_manager,
|
| - GpuMemoryBufferManager* gpu_memory_buffer_manager,
|
| + gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
|
| BlockingTaskRunner* blocking_main_thread_task_runner,
|
| int highp_threshold_min,
|
| bool use_rgba_4444_texture_format,
|
| @@ -922,11 +922,9 @@ void ResourceProvider::UnlockForRead(ResourceId id) {
|
| }
|
| }
|
|
|
| -const ResourceProvider::Resource* ResourceProvider::LockForWrite(
|
| - ResourceId id) {
|
| +ResourceProvider::Resource* ResourceProvider::LockForWrite(ResourceId id) {
|
| Resource* resource = GetResource(id);
|
| DCHECK(CanLockForWrite(id));
|
| - LazyAllocate(resource);
|
|
|
| resource->locked_for_write = true;
|
| return resource;
|
| @@ -939,77 +937,13 @@ bool ResourceProvider::CanLockForWrite(ResourceId id) {
|
| !resource->lost && ReadLockFenceHasPassed(resource);
|
| }
|
|
|
| -void ResourceProvider::UnlockForWrite(ResourceId id) {
|
| - Resource* resource = GetResource(id);
|
| +void ResourceProvider::UnlockForWrite(ResourceProvider::Resource* resource) {
|
| DCHECK(resource->locked_for_write);
|
| DCHECK_EQ(resource->exported_count, 0);
|
| DCHECK(resource->origin == Resource::Internal);
|
| resource->locked_for_write = false;
|
| }
|
|
|
| -const ResourceProvider::Resource*
|
| -ResourceProvider::LockForWriteToGpuMemoryBuffer(ResourceId id) {
|
| - Resource* resource = GetResource(id);
|
| - DCHECK_EQ(GLTexture, resource->type);
|
| - DCHECK(CanLockForWrite(id));
|
| -
|
| - if (!resource->gpu_memory_buffer) {
|
| - scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer =
|
| - gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer(
|
| - resource->size,
|
| - ToGpuMemoryBufferFormat(resource->format),
|
| - gfx::GpuMemoryBuffer::MAP);
|
| - resource->gpu_memory_buffer = gpu_memory_buffer.release();
|
| - resource->allocated = true;
|
| - }
|
| -
|
| - resource->locked_for_write = true;
|
| - return resource;
|
| -}
|
| -
|
| -void ResourceProvider::UnlockForWriteToGpuMemoryBuffer(ResourceId id) {
|
| - Resource* resource = GetResource(id);
|
| - DCHECK(resource->locked_for_write);
|
| - DCHECK_EQ(resource->exported_count, 0);
|
| - DCHECK(resource->origin == Resource::Internal);
|
| - DCHECK_EQ(GLTexture, resource->type);
|
| -
|
| - if (!resource->image_id) {
|
| - GLES2Interface* gl = ContextGL();
|
| - DCHECK(gl);
|
| - resource->image_id =
|
| - gl->CreateImageCHROMIUM(resource->gpu_memory_buffer->AsClientBuffer(),
|
| - resource->size.width(),
|
| - resource->size.height(),
|
| - GL_RGBA);
|
| - }
|
| -
|
| - resource->locked_for_write = false;
|
| - resource->dirty_image = true;
|
| -
|
| - // GpuMemoryBuffer provides direct access to the memory used by the GPU.
|
| - // Read lock fences are required to ensure that we're not trying to map a
|
| - // buffer that is currently in-use by the GPU.
|
| - resource->read_lock_fences_enabled = true;
|
| -}
|
| -
|
| -void ResourceProvider::LockForWriteToSkSurface(ResourceId id) {
|
| - Resource* resource = GetResource(id);
|
| - DCHECK_EQ(GLTexture, resource->type);
|
| - DCHECK(CanLockForWrite(id));
|
| -
|
| - resource->locked_for_write = true;
|
| -}
|
| -
|
| -void ResourceProvider::UnlockForWriteToSkSurface(ResourceId id) {
|
| - Resource* resource = GetResource(id);
|
| - DCHECK(resource->locked_for_write);
|
| - DCHECK_EQ(resource->exported_count, 0);
|
| - DCHECK(resource->origin == Resource::Internal);
|
| - DCHECK_EQ(GLTexture, resource->type);
|
| - resource->locked_for_write = false;
|
| -}
|
| -
|
| ResourceProvider::ScopedReadLockGL::ScopedReadLockGL(
|
| ResourceProvider* resource_provider,
|
| ResourceProvider::ResourceId resource_id)
|
| @@ -1049,13 +983,14 @@ ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL(
|
| ResourceProvider* resource_provider,
|
| ResourceProvider::ResourceId resource_id)
|
| : resource_provider_(resource_provider),
|
| - resource_id_(resource_id),
|
| - texture_id_(resource_provider->LockForWrite(resource_id)->gl_id) {
|
| + resource_(resource_provider->LockForWrite(resource_id)) {
|
| + resource_provider_->LazyAllocate(resource_);
|
| + texture_id_ = resource_->gl_id;
|
| DCHECK(texture_id_);
|
| }
|
|
|
| ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() {
|
| - resource_provider_->UnlockForWrite(resource_id_);
|
| + resource_provider_->UnlockForWrite(resource_);
|
| }
|
|
|
| void ResourceProvider::PopulateSkBitmapWithResource(
|
| @@ -1084,82 +1019,117 @@ ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware(
|
| ResourceProvider* resource_provider,
|
| ResourceProvider::ResourceId resource_id)
|
| : resource_provider_(resource_provider),
|
| - resource_id_(resource_id) {
|
| - ResourceProvider::PopulateSkBitmapWithResource(
|
| - &sk_bitmap_, resource_provider->LockForWrite(resource_id));
|
| + resource_(resource_provider->LockForWrite(resource_id)) {
|
| + ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource_);
|
| DCHECK(valid());
|
| sk_canvas_.reset(new SkCanvas(sk_bitmap_));
|
| }
|
|
|
| ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() {
|
| - resource_provider_->UnlockForWrite(resource_id_);
|
| + resource_provider_->UnlockForWrite(resource_);
|
| }
|
|
|
| ResourceProvider::ScopedWriteLockGpuMemoryBuffer::
|
| ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider,
|
| ResourceProvider::ResourceId resource_id)
|
| : resource_provider_(resource_provider),
|
| - resource_id_(resource_id),
|
| - gpu_memory_buffer_(
|
| - resource_provider->LockForWriteToGpuMemoryBuffer(resource_id)
|
| - ->gpu_memory_buffer) {
|
| + resource_(resource_provider->LockForWrite(resource_id)),
|
| + gpu_memory_buffer_manager_(resource_provider->gpu_memory_buffer_manager_),
|
| + gpu_memory_buffer_(nullptr),
|
| + size_(resource_->size),
|
| + format_(resource_->format) {
|
| + DCHECK_EQ(GLTexture, resource_->type);
|
| + std::swap(gpu_memory_buffer_, resource_->gpu_memory_buffer);
|
| }
|
|
|
| ResourceProvider::ScopedWriteLockGpuMemoryBuffer::
|
| ~ScopedWriteLockGpuMemoryBuffer() {
|
| - resource_provider_->UnlockForWriteToGpuMemoryBuffer(resource_id_);
|
| + resource_provider_->UnlockForWrite(resource_);
|
| + if (!gpu_memory_buffer_)
|
| + return;
|
| +
|
| + if (!resource_->image_id) {
|
| + GLES2Interface* gl = resource_provider_->ContextGL();
|
| + DCHECK(gl);
|
| +
|
| + resource_->image_id =
|
| + gl->CreateImageCHROMIUM(gpu_memory_buffer_->AsClientBuffer(),
|
| + size_.width(),
|
| + size_.height(),
|
| + GL_RGBA);
|
| + }
|
| +
|
| + std::swap(resource_->gpu_memory_buffer, gpu_memory_buffer_);
|
| + resource_->allocated = true;
|
| + resource_->dirty_image = true;
|
| +
|
| + // GpuMemoryBuffer provides direct access to the memory used by the GPU.
|
| + // Read lock fences are required to ensure that we're not trying to map a
|
| + // buffer that is currently in-use by the GPU.
|
| + resource_->read_lock_fences_enabled = true;
|
| +}
|
| +
|
| +gfx::GpuMemoryBuffer*
|
| +ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() {
|
| + if (!gpu_memory_buffer_) {
|
| + scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer =
|
| + gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer(
|
| + size_, ToGpuMemoryBufferFormat(format_), gfx::GpuMemoryBuffer::MAP);
|
| + gpu_memory_buffer_ = gpu_memory_buffer.release();
|
| + }
|
| +
|
| + return gpu_memory_buffer_;
|
| }
|
|
|
| ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr(
|
| ResourceProvider* resource_provider,
|
| ResourceProvider::ResourceId resource_id)
|
| - : resource_provider_(resource_provider), resource_id_(resource_id) {
|
| - resource_provider->LockForWriteToSkSurface(resource_id);
|
| + : resource_provider_(resource_provider),
|
| + resource_(resource_provider->LockForWrite(resource_id)) {
|
| }
|
|
|
| ResourceProvider::ScopedWriteLockGr::~ScopedWriteLockGr() {
|
| - resource_provider_->UnlockForWriteToSkSurface(resource_id_);
|
| + resource_provider_->UnlockForWrite(resource_);
|
| }
|
|
|
| SkSurface* ResourceProvider::ScopedWriteLockGr::GetSkSurface(
|
| bool use_distance_field_text) {
|
| - Resource* resource = resource_provider_->GetResource(resource_id_);
|
| - DCHECK(resource->locked_for_write);
|
| + DCHECK(resource_->locked_for_write);
|
|
|
| // If the surface doesn't exist, or doesn't have the correct dff setting,
|
| // recreate the surface within the resource.
|
| - if (!resource->sk_surface ||
|
| + if (!resource_->sk_surface ||
|
| use_distance_field_text !=
|
| - resource->sk_surface->props().isUseDistanceFieldFonts()) {
|
| + resource_->sk_surface->props().isUseDistanceFieldFonts()) {
|
| class GrContext* gr_context = resource_provider_->GrContext();
|
| // TODO(alokp): Implement TestContextProvider::GrContext().
|
| if (!gr_context)
|
| return nullptr;
|
|
|
| - resource_provider_->LazyAllocate(resource);
|
| + resource_provider_->LazyAllocate(resource_);
|
|
|
| GrBackendTextureDesc desc;
|
| desc.fFlags = kRenderTarget_GrBackendTextureFlag;
|
| - desc.fWidth = resource->size.width();
|
| - desc.fHeight = resource->size.height();
|
| - desc.fConfig = ToGrPixelConfig(resource->format);
|
| + desc.fWidth = resource_->size.width();
|
| + desc.fHeight = resource_->size.height();
|
| + desc.fConfig = ToGrPixelConfig(resource_->format);
|
| desc.fOrigin = kTopLeft_GrSurfaceOrigin;
|
| - desc.fTextureHandle = resource->gl_id;
|
| + 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(
|
| + resource_->sk_surface = skia::AdoptRef(SkSurface::NewRenderTargetDirect(
|
| gr_texture->asRenderTarget(), text_render_mode));
|
| }
|
| - return resource->sk_surface.get();
|
| + return resource_->sk_surface.get();
|
| }
|
|
|
| ResourceProvider::ResourceProvider(
|
| OutputSurface* output_surface,
|
| SharedBitmapManager* shared_bitmap_manager,
|
| - GpuMemoryBufferManager* gpu_memory_buffer_manager,
|
| + gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
|
| BlockingTaskRunner* blocking_main_thread_task_runner,
|
| int highp_threshold_min,
|
| bool use_rgba_4444_texture_format,
|
| @@ -1907,7 +1877,7 @@ bool ResourceProvider::DidSetPixelsComplete(ResourceId id) {
|
| }
|
|
|
| resource->pending_set_pixels = false;
|
| - UnlockForWrite(id);
|
| + UnlockForWrite(resource);
|
|
|
| // Async set pixels commands are not necessarily processed in-sequence with
|
| // drawing commands. Read lock fences are required to ensure that async
|
|
|