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

Unified Diff: cc/resources/resource_provider.cc

Issue 1425533006: cc: Add flag to specify to ResourceProvider to always use GMBs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix cros build Created 5 years, 1 month 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 2f5b0a9d7917ea2fd00472cea2992a0c268b67a2..1a6839be343524318af0d4cbcaee15b63f3cb3de 100644
--- a/cc/resources/resource_provider.cc
+++ b/cc/resources/resource_provider.cc
@@ -324,11 +324,13 @@ scoped_ptr<ResourceProvider> ResourceProvider::Create(
BlockingTaskRunner* blocking_main_thread_task_runner,
int highp_threshold_min,
size_t id_allocation_chunk_size,
+ bool use_gpu_memory_buffers_by_default,
const std::vector<unsigned>& use_image_texture_targets) {
scoped_ptr<ResourceProvider> resource_provider(new ResourceProvider(
output_surface, shared_bitmap_manager, gpu_memory_buffer_manager,
blocking_main_thread_task_runner, highp_threshold_min,
- id_allocation_chunk_size, use_image_texture_targets));
+ id_allocation_chunk_size, use_gpu_memory_buffers_by_default,
+ use_image_texture_targets));
resource_provider->Initialize();
return resource_provider;
}
@@ -386,10 +388,10 @@ ResourceId ResourceProvider::CreateResource(const gfx::Size& size,
DCHECK(!size.IsEmpty());
switch (default_resource_type_) {
case RESOURCE_TYPE_GL_TEXTURE:
- return CreateGLTexture(size,
- GL_TEXTURE_2D,
- hint,
- format);
+ return CreateGLTexture(size, use_gpu_memory_buffers_by_default_
+ ? GetImageTextureTarget(format)
+ : GL_TEXTURE_2D,
+ hint, format);
case RESOURCE_TYPE_BITMAP:
DCHECK_EQ(RGBA_8888, format);
return CreateBitmap(size);
@@ -860,13 +862,10 @@ ResourceProvider::ScopedWriteLockGpuMemoryBuffer::
ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider,
ResourceId resource_id)
: resource_provider_(resource_provider),
- 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) {
+ resource_(resource_provider->LockForWrite(resource_id)) {
DCHECK_EQ(RESOURCE_TYPE_GL_TEXTURE, resource_->type);
- std::swap(gpu_memory_buffer_, resource_->gpu_memory_buffer);
+ gpu_memory_buffer_.reset(resource_->gpu_memory_buffer);
+ resource_->gpu_memory_buffer = nullptr;
}
ResourceProvider::ScopedWriteLockGpuMemoryBuffer::
@@ -876,27 +875,7 @@ ResourceProvider::ScopedWriteLockGpuMemoryBuffer::
if (!gpu_memory_buffer_)
return;
- resource_provider_->LazyCreate(resource_);
-
- if (!resource_->image_id) {
- GLES2Interface* gl = resource_provider_->ContextGL();
- DCHECK(gl);
-
-#if defined(OS_CHROMEOS)
- // TODO(reveman): GL_COMMANDS_ISSUED_CHROMIUM is used for synchronization
- // on ChromeOS to avoid some performance issues. This only works with
- // shared memory backed buffers. crbug.com/436314
- DCHECK_EQ(gpu_memory_buffer_->GetHandle().type, gfx::SHARED_MEMORY_BUFFER);
-#endif
-
- resource_->image_id = gl->CreateImageCHROMIUM(
- gpu_memory_buffer_->AsClientBuffer(), size_.width(), size_.height(),
- GLInternalFormat(resource_->format));
- }
-
- std::swap(resource_->gpu_memory_buffer, gpu_memory_buffer_);
- resource_->allocated = true;
- resource_->dirty_image = true;
+ resource_provider_->SetGpuMemoryBuffer(resource_, gpu_memory_buffer_.Pass());
// 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
@@ -906,14 +885,13 @@ ResourceProvider::ScopedWriteLockGpuMemoryBuffer::
gfx::GpuMemoryBuffer*
ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() {
- if (gpu_memory_buffer_)
- return gpu_memory_buffer_;
- scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer =
- gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer(
- size_, BufferFormat(format_),
- gfx::BufferUsage::GPU_READ_CPU_READ_WRITE);
- gpu_memory_buffer_ = gpu_memory_buffer.release();
- return gpu_memory_buffer_;
+ if (!gpu_memory_buffer_) {
+ gpu_memory_buffer_ =
+ resource_provider_->gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer(
+ resource_->size, BufferFormat(resource_->format),
+ gfx::BufferUsage::GPU_READ_CPU_READ_WRITE);
+ }
+ return gpu_memory_buffer_.get();
}
ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr(
@@ -1002,6 +980,7 @@ ResourceProvider::ResourceProvider(
BlockingTaskRunner* blocking_main_thread_task_runner,
int highp_threshold_min,
size_t id_allocation_chunk_size,
+ bool use_gpu_memory_buffers_by_default,
const std::vector<unsigned>& use_image_texture_targets)
: output_surface_(output_surface),
shared_bitmap_manager_(shared_bitmap_manager),
@@ -1012,6 +991,7 @@ ResourceProvider::ResourceProvider(
next_id_(1),
next_child_(1),
default_resource_type_(RESOURCE_TYPE_BITMAP),
+ use_gpu_memory_buffers_by_default_(use_gpu_memory_buffers_by_default),
use_texture_storage_ext_(false),
use_texture_format_bgra_(false),
use_texture_usage_hint_(false),
@@ -1309,8 +1289,7 @@ void ResourceProvider::TransferResource(GLES2Interface* gl,
LazyCreate(source);
DCHECK(source->gl_id);
DCHECK(source->origin == Resource::INTERNAL);
- if (source->image_id) {
- DCHECK(source->dirty_image);
+ if (source->image_id && source->dirty_image) {
gl->BindTexture(resource->mailbox_holder.texture_target, source->gl_id);
BindImageForSampling(source);
}
@@ -1515,9 +1494,14 @@ void ResourceProvider::LazyAllocate(Resource* resource) {
gfx::Size& size = resource->size;
ResourceFormat format = resource->format;
gl->BindTexture(resource->target, resource->gl_id);
- if (use_texture_storage_ext_ &&
- IsFormatSupportedForStorage(format, use_texture_format_bgra_) &&
- (resource->hint & TEXTURE_HINT_IMMUTABLE)) {
+ if (use_gpu_memory_buffers_by_default_) {
+ SetGpuMemoryBuffer(
+ resource, gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer(
+ size, BufferFormat(format), gfx::BufferUsage::SCANOUT));
+ BindImageForSampling(resource);
reveman 2015/11/02 17:28:53 Why is this BindImageForSampling call needed?
ccameron 2015/11/02 22:07:34 This can be moved to the ScopedWriteLockGL this to
+ } else if (use_texture_storage_ext_ &&
+ IsFormatSupportedForStorage(format, use_texture_format_bgra_) &&
+ (resource->hint & TEXTURE_HINT_IMMUTABLE)) {
GLenum storage_format = TextureToStorageFormat(format);
gl->TexStorage2DEXT(resource->target, 1, storage_format, size.width(),
size.height());
@@ -1531,6 +1515,36 @@ void ResourceProvider::LazyAllocate(Resource* resource) {
}
}
+void ResourceProvider::SetGpuMemoryBuffer(
reveman 2015/11/02 17:28:53 hm, this function is marking the image as dirty an
ccameron 2015/11/02 22:07:34 Sounds better --done.
+ Resource* resource,
+ scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer) {
+ DCHECK(!resource->gpu_memory_buffer);
reveman 2015/11/02 17:28:53 can these 3 lines just become DCHECK(resource->gpu
ccameron 2015/11/02 22:07:34 Yeah, this becomes much simpler this way.
+ if (!gpu_memory_buffer)
+ return;
+
+ LazyCreate(resource);
reveman 2015/11/02 17:28:53 I think this should be moved out of this function
ccameron 2015/11/02 22:07:34 Sg. Added a LazyCreate to the ~ScopedWriteLockGpuM
+
+ if (!resource->image_id) {
+ GLES2Interface* gl = ContextGL();
+ DCHECK(gl);
+
+#if defined(OS_CHROMEOS)
+ // TODO(reveman): GL_COMMANDS_ISSUED_CHROMIUM is used for synchronization
+ // on ChromeOS to avoid some performance issues. This only works with
+ // shared memory backed buffers. crbug.com/436314
+ DCHECK_EQ(gpu_memory_buffer->GetHandle().type, gfx::SHARED_MEMORY_BUFFER);
+#endif
+ resource->image_id = gl->CreateImageCHROMIUM(
+ gpu_memory_buffer->AsClientBuffer(), resource->size.width(),
+ resource->size.height(), GLInternalFormat(resource->format));
+ }
+
+ resource->gpu_memory_buffer = gpu_memory_buffer.release();
+ resource->allocated = true;
reveman 2015/11/02 17:28:53 hm, this should not be set here as that means sett
ccameron 2015/11/02 22:07:34 Moved up to the caller and added a DCHECK for it.
+ resource->dirty_image = true;
+ resource->is_overlay_candidate = true;
reveman 2015/11/02 17:28:53 might be better to set this by the code that alloc
ccameron 2015/11/02 22:07:34 Done.
+}
+
void ResourceProvider::BindImageForSampling(Resource* resource) {
GLES2Interface* gl = ContextGL();
DCHECK(resource->gl_id);

Powered by Google App Engine
This is Rietveld 408576698