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

Unified Diff: cc/resources/resource_provider.cc

Issue 634083002: gpu: Compositor management of GpuMemoryBuffer instances. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@cc-pre-chromium-image-refactor
Patch Set: rebase Created 6 years, 2 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 f9c4b3e8d2d52740f905fed5393cfe5c18cf852f..ded347763485a32184d0aa950f329e685ce204c4 100644
--- a/cc/resources/resource_provider.cc
+++ b/cc/resources/resource_provider.cc
@@ -14,6 +14,7 @@
#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"
@@ -26,6 +27,7 @@
#include "third_party/skia/include/core/SkSurface.h"
#include "third_party/skia/include/gpu/GrContext.h"
#include "ui/gfx/frame_time.h"
+#include "ui/gfx/gpu_memory_buffer.h"
#include "ui/gfx/rect.h"
#include "ui/gfx/vector2d.h"
@@ -111,6 +113,23 @@ GrPixelConfig ToGrPixelConfig(ResourceFormat format) {
return kSkia8888_GrPixelConfig;
}
+gfx::GpuMemoryBuffer::Format ToGpuMemoryBufferFormat(ResourceFormat format) {
+ switch (format) {
+ case RGBA_8888:
+ return gfx::GpuMemoryBuffer::Format::RGBA_8888;
+ case BGRA_8888:
+ return gfx::GpuMemoryBuffer::Format::BGRA_8888;
+ case RGBA_4444:
+ case ALPHA_8:
+ case LUMINANCE_8:
+ case RGB_565:
+ case ETC1:
+ break;
+ }
+ NOTREACHED();
+ return gfx::GpuMemoryBuffer::Format::RGBA_8888;
+}
+
class ScopedSetActiveTexture {
public:
ScopedSetActiveTexture(GLES2Interface* gl, GLenum unit)
@@ -239,7 +258,8 @@ ResourceProvider::Resource::Resource()
hint(TextureHintImmutable),
type(InvalidType),
format(RGBA_8888),
- shared_bitmap(NULL) {
+ shared_bitmap(NULL),
+ gpu_memory_buffer(NULL) {
}
ResourceProvider::Resource::~Resource() {}
@@ -285,7 +305,8 @@ ResourceProvider::Resource::Resource(GLuint texture_id,
hint(hint),
type(GLTexture),
format(format),
- shared_bitmap(NULL) {
+ shared_bitmap(NULL),
+ gpu_memory_buffer(NULL) {
DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT);
DCHECK_EQ(origin == Internal, !!texture_pool);
}
@@ -328,7 +349,8 @@ ResourceProvider::Resource::Resource(uint8_t* pixels,
hint(TextureHintImmutable),
type(Bitmap),
format(RGBA_8888),
- shared_bitmap(bitmap) {
+ shared_bitmap(bitmap),
+ gpu_memory_buffer(NULL) {
DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT);
DCHECK(origin == Delegated || pixels);
if (bitmap)
@@ -373,7 +395,8 @@ ResourceProvider::Resource::Resource(const SharedBitmapId& bitmap_id,
type(Bitmap),
format(RGBA_8888),
shared_bitmap_id(bitmap_id),
- shared_bitmap(NULL) {
+ shared_bitmap(NULL),
+ gpu_memory_buffer(NULL) {
DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT);
}
@@ -384,6 +407,7 @@ ResourceProvider::Child::~Child() {}
scoped_ptr<ResourceProvider> ResourceProvider::Create(
OutputSurface* output_surface,
SharedBitmapManager* shared_bitmap_manager,
+ GpuMemoryBufferManager* gpu_memory_buffer_manager,
BlockingTaskRunner* blocking_main_thread_task_runner,
int highp_threshold_min,
bool use_rgba_4444_texture_format,
@@ -392,6 +416,7 @@ scoped_ptr<ResourceProvider> ResourceProvider::Create(
scoped_ptr<ResourceProvider> resource_provider(
new ResourceProvider(output_surface,
shared_bitmap_manager,
+ gpu_memory_buffer_manager,
blocking_main_thread_task_runner,
highp_threshold_min,
use_rgba_4444_texture_format,
@@ -698,6 +723,12 @@ void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it,
if (resource->pixels) {
DCHECK(resource->origin == Resource::Internal);
delete[] resource->pixels;
+ resource->pixels = NULL;
+ }
+ if (resource->gpu_memory_buffer) {
+ DCHECK(resource->origin != Resource::External);
+ delete resource->gpu_memory_buffer;
+ resource->gpu_memory_buffer = NULL;
}
resources_.erase(it);
}
@@ -924,16 +955,14 @@ ResourceProvider::LockForWriteToGpuMemoryBuffer(ResourceId id) {
DCHECK_EQ(GLTexture, resource->type);
DCHECK(CanLockForWrite(id));
- if (!resource->image_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;
- GLES2Interface* gl = ContextGL();
- DCHECK(gl);
- resource->image_id =
- gl->CreateImageCHROMIUM(resource->size.width(),
- resource->size.height(),
- TextureToStorageFormat(resource->format),
- GL_IMAGE_MAP_CHROMIUM);
- DCHECK(resource->image_id);
}
resource->locked_for_write = true;
@@ -947,6 +976,16 @@ void ResourceProvider::UnlockForWriteToGpuMemoryBuffer(ResourceId id) {
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;
@@ -1089,18 +1128,13 @@ ResourceProvider::ScopedWriteLockGpuMemoryBuffer::
ResourceProvider::ResourceId resource_id)
: resource_provider_(resource_provider),
resource_id_(resource_id),
- image_id_(resource_provider->LockForWriteToGpuMemoryBuffer(resource_id)
- ->image_id),
gpu_memory_buffer_(
- resource_provider->ContextGL()->MapImageCHROMIUM(image_id_)),
- stride_(-1) {
- resource_provider->ContextGL()->GetImageParameterivCHROMIUM(
- image_id_, GL_IMAGE_ROWBYTES_CHROMIUM, &stride_);
+ resource_provider->LockForWriteToGpuMemoryBuffer(resource_id)
+ ->gpu_memory_buffer) {
}
ResourceProvider::ScopedWriteLockGpuMemoryBuffer::
~ScopedWriteLockGpuMemoryBuffer() {
- resource_provider_->ContextGL()->UnmapImageCHROMIUM(image_id_);
resource_provider_->UnlockForWriteToGpuMemoryBuffer(resource_id_);
}
@@ -1120,6 +1154,7 @@ ResourceProvider::ScopedWriteLockGr::~ScopedWriteLockGr() {
ResourceProvider::ResourceProvider(
OutputSurface* output_surface,
SharedBitmapManager* shared_bitmap_manager,
+ GpuMemoryBufferManager* gpu_memory_buffer_manager,
BlockingTaskRunner* blocking_main_thread_task_runner,
int highp_threshold_min,
bool use_rgba_4444_texture_format,
@@ -1127,6 +1162,7 @@ ResourceProvider::ResourceProvider(
bool use_distance_field_text)
: output_surface_(output_surface),
shared_bitmap_manager_(shared_bitmap_manager),
+ gpu_memory_buffer_manager_(gpu_memory_buffer_manager),
blocking_main_thread_task_runner_(blocking_main_thread_task_runner),
lost_output_surface_(false),
highp_threshold_min_(highp_threshold_min),
« 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