Chromium Code Reviews| Index: cc/resources/resource_provider.cc |
| diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
| index 7c55a3c52f3fcdca765f14714facf03ea878b535..4588339e677d842398e38d3792b1767465566a9f 100644 |
| --- a/cc/resources/resource_provider.cc |
| +++ b/cc/resources/resource_provider.cc |
| @@ -21,6 +21,7 @@ |
| #include "third_party/khronos/GLES2/gl2ext.h" |
| #include "ui/gfx/rect.h" |
| #include "ui/gfx/vector2d.h" |
| +#include "webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h" |
| using WebKit::WebGraphicsContext3D; |
| @@ -80,12 +81,14 @@ ResourceProvider::Resource::Resource() |
| size(), |
| format(0), |
| filter(0), |
| - type(static_cast<ResourceType>(0)) {} |
| + type(static_cast<ResourceType>(0)), |
| + use_gpu_memory_buffer(false) {} |
| ResourceProvider::Resource::~Resource() {} |
| ResourceProvider::Resource::Resource( |
| - unsigned texture_id, gfx::Size size, GLenum format, GLenum filter) |
| + unsigned texture_id, gfx::Size size, |
| + GLenum format, GLenum filter, bool gpu_memory_buffer) |
| : gl_id(texture_id), |
| gl_pixel_buffer_id(0), |
| gl_upload_query_id(0), |
| @@ -104,7 +107,8 @@ ResourceProvider::Resource::Resource( |
| size(size), |
| format(format), |
| filter(filter), |
| - type(GLTexture) {} |
| + type(GLTexture), |
| + use_gpu_memory_buffer(gpu_memory_buffer) {} |
| ResourceProvider::Resource::Resource( |
| uint8_t* pixels, gfx::Size size, GLenum format, GLenum filter) |
| @@ -126,7 +130,8 @@ ResourceProvider::Resource::Resource( |
| size(size), |
| format(format), |
| filter(filter), |
| - type(Bitmap) {} |
| + type(Bitmap), |
| + use_gpu_memory_buffer(false) {} |
| ResourceProvider::Child::Child() {} |
| @@ -217,7 +222,8 @@ ResourceProvider::ResourceId ResourceProvider::CreateGLTexture( |
| } |
| ResourceId id = next_id_++; |
| - Resource resource(texture_id, size, format, GL_LINEAR); |
| + Resource resource(texture_id, size, format, GL_LINEAR, |
| + use_gpu_memory_buffers_); |
| resource.allocated = false; |
| resources_[id] = resource; |
| return id; |
| @@ -254,7 +260,7 @@ ResourceProvider::CreateResourceFromExternalTexture( |
| texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); |
| ResourceId id = next_id_++; |
| - Resource resource(texture_id, gfx::Size(), 0, GL_LINEAR); |
| + Resource resource(texture_id, gfx::Size(), 0, GL_LINEAR, false); |
| resource.external = true; |
| resource.allocated = true; |
| resources_[id] = resource; |
| @@ -267,7 +273,7 @@ ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox( |
| // Just store the information. Mailbox will be consumed in LockForRead(). |
| ResourceId id = next_id_++; |
| unsigned texture_id = 0; |
| - Resource resource(texture_id, gfx::Size(), 0, GL_LINEAR); |
| + Resource resource(texture_id, gfx::Size(), 0, GL_LINEAR, false); |
| resource.external = true; |
| resource.allocated = true; |
| resource.mailbox = mailbox; |
| @@ -361,6 +367,7 @@ void ResourceProvider::SetPixels(ResourceId id, |
| DCHECK(!resource->lock_for_read_count); |
| DCHECK(!resource->external); |
| DCHECK(!resource->exported); |
| + DCHECK(!resource->use_gpu_memory_buffer); |
| DCHECK(ReadLockFenceHasPassed(resource)); |
| LazyAllocate(resource); |
| @@ -614,7 +621,8 @@ ResourceProvider::ResourceProvider(OutputSurface* output_surface) |
| use_texture_usage_hint_(false), |
| use_shallow_flush_(false), |
| max_texture_size_(0), |
| - best_texture_format_(0) {} |
| + best_texture_format_(0), |
| + use_gpu_memory_buffers_(false) {} |
| bool ResourceProvider::Initialize(int highp_threshold_min) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| @@ -786,7 +794,7 @@ void ResourceProvider::ReceiveFromChild( |
| GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, |
| it->mailbox.name)); |
| ResourceId id = next_id_++; |
| - Resource resource(texture_id, it->size, it->format, it->filter); |
| + Resource resource(texture_id, it->size, it->format, it->filter, false); |
| resource.mailbox.SetName(it->mailbox); |
| // Don't allocate a texture for a child. |
| resource.allocated = true; |
| @@ -880,15 +888,25 @@ void ResourceProvider::AcquirePixelBuffer(ResourceId id) { |
| DCHECK(context3d); |
| if (!resource->gl_pixel_buffer_id) |
| resource->gl_pixel_buffer_id = context3d->createBuffer(); |
| - context3d->bindBuffer( |
| - GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| - resource->gl_pixel_buffer_id); |
| - context3d->bufferData( |
| - GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| - resource->size.width() * resource->size.height() * 4, |
| - NULL, |
| - GL_DYNAMIC_DRAW); |
| - context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| + WGC3Denum target = GetTargetGivenResource(resource); |
| + context3d->bindBuffer(target, resource->gl_pixel_buffer_id); |
| + if (resource->use_gpu_memory_buffer) { |
| + typedef webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl |
| + Context3DImpl; |
| + Context3DImpl* in_process_context = |
| + static_cast<Context3DImpl*>(context3d); |
|
jamesr
2013/04/25 22:28:56
you shouldn't be downcasting like this. it means t
kaanb1
2013/04/25 22:43:29
This feature is currently only used for Android We
no sievers
2013/04/25 23:28:14
Keep in mind that ChromeOS might implement 0-copy
kaanb1
2013/04/25 23:55:05
Done.
|
| + in_process_context->imageBufferDataCHROMIUM( |
| + target, |
| + resource->size.width(), |
| + resource->size.height()); |
| + } else { |
| + context3d->bufferData( |
| + target, |
| + resource->size.width() * resource->size.height() * 4, |
| + NULL, |
| + GL_DYNAMIC_DRAW); |
| + } |
| + context3d->bindBuffer(target, 0); |
| } |
| if (resource->pixels) { |
| @@ -911,16 +929,19 @@ void ResourceProvider::ReleasePixelBuffer(ResourceId id) { |
| if (resource->gl_id) { |
| DCHECK(resource->gl_pixel_buffer_id); |
| WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| + WGC3Denum target = GetTargetGivenResource(resource); |
| DCHECK(context3d); |
| - context3d->bindBuffer( |
| - GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| - resource->gl_pixel_buffer_id); |
| - context3d->bufferData( |
| - GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| - 0, |
| - NULL, |
| - GL_DYNAMIC_DRAW); |
| - context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| + context3d->bindBuffer(target, resource->gl_pixel_buffer_id); |
| + if (resource->use_gpu_memory_buffer) { |
| + typedef webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl |
| + Context3DImpl; |
| + Context3DImpl* in_process_context = |
| + static_cast<Context3DImpl*>(context3d); |
| + in_process_context->imageBufferDataCHROMIUM(target, 0, 0); |
| + } else { |
| + context3d->bufferData(target, 0, NULL, GL_DYNAMIC_DRAW); |
| + } |
| + context3d->bindBuffer(target, 0); |
| } |
| if (resource->pixels) { |
| @@ -943,13 +964,11 @@ uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id) { |
| WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| DCHECK(context3d); |
| DCHECK(resource->gl_pixel_buffer_id); |
| - context3d->bindBuffer( |
| - GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| - resource->gl_pixel_buffer_id); |
| + WGC3Denum target = GetTargetGivenResource(resource); |
| + context3d->bindBuffer(target, resource->gl_pixel_buffer_id); |
| uint8_t* image = static_cast<uint8_t*>( |
| - context3d->mapBufferCHROMIUM( |
| - GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY)); |
| - context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| + context3d->mapBufferCHROMIUM(target, GL_WRITE_ONLY)); |
| + context3d->bindBuffer(target, 0); |
| DCHECK(image); |
| return image; |
| } |
| @@ -972,12 +991,10 @@ void ResourceProvider::UnmapPixelBuffer(ResourceId id) { |
| WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| DCHECK(context3d); |
| DCHECK(resource->gl_pixel_buffer_id); |
| - context3d->bindBuffer( |
| - GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| - resource->gl_pixel_buffer_id); |
| - context3d->unmapBufferCHROMIUM( |
| - GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM); |
| - context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| + WGC3Denum target = GetTargetGivenResource(resource); |
| + context3d->bindBuffer(target, resource->gl_pixel_buffer_id); |
| + context3d->unmapBufferCHROMIUM(target); |
| + context3d->bindBuffer(target, 0); |
| } |
| } |
| @@ -991,6 +1008,7 @@ void ResourceProvider::SetPixelsFromBuffer(ResourceId id) { |
| DCHECK(!resource->external); |
| DCHECK(!resource->exported); |
| DCHECK(ReadLockFenceHasPassed(resource)); |
| + DCHECK(!resource->use_gpu_memory_buffer); |
| LazyAllocate(resource); |
| if (resource->gl_id) { |
| @@ -1068,37 +1086,42 @@ void ResourceProvider::BeginSetPixels(ResourceId id) { |
| DCHECK(context3d); |
| DCHECK(resource->gl_pixel_buffer_id); |
| context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id); |
| - context3d->bindBuffer( |
| - GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| - resource->gl_pixel_buffer_id); |
| - if (!resource->gl_upload_query_id) |
| - resource->gl_upload_query_id = context3d->createQueryEXT(); |
| - context3d->beginQueryEXT( |
| - GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM, |
| - resource->gl_upload_query_id); |
| - if (allocate) { |
| - context3d->asyncTexImage2DCHROMIUM(GL_TEXTURE_2D, |
| - 0, /* level */ |
| - resource->format, |
| - resource->size.width(), |
| - resource->size.height(), |
| - 0, /* border */ |
| - resource->format, |
| - GL_UNSIGNED_BYTE, |
| - NULL); |
| + if (resource->use_gpu_memory_buffer) { |
| + context3d->bindTexImage2DCHROMIUM( |
| + GL_TEXTURE_2D, resource->gl_pixel_buffer_id); |
| } else { |
| - context3d->asyncTexSubImage2DCHROMIUM(GL_TEXTURE_2D, |
| - 0, /* level */ |
| - 0, /* x */ |
| - 0, /* y */ |
| - resource->size.width(), |
| - resource->size.height(), |
| - resource->format, |
| - GL_UNSIGNED_BYTE, |
| - NULL); |
| + context3d->bindBuffer( |
| + GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| + resource->gl_pixel_buffer_id); |
| + if (!resource->gl_upload_query_id) |
| + resource->gl_upload_query_id = context3d->createQueryEXT(); |
| + context3d->beginQueryEXT( |
| + GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM, |
| + resource->gl_upload_query_id); |
| + if (allocate) { |
| + context3d->asyncTexImage2DCHROMIUM(GL_TEXTURE_2D, |
| + 0, /* level */ |
| + resource->format, |
| + resource->size.width(), |
| + resource->size.height(), |
| + 0, /* border */ |
| + resource->format, |
| + GL_UNSIGNED_BYTE, |
| + NULL); |
| + } else { |
| + context3d->asyncTexSubImage2DCHROMIUM(GL_TEXTURE_2D, |
| + 0, /* level */ |
| + 0, /* x */ |
| + 0, /* y */ |
| + resource->size.width(), |
| + resource->size.height(), |
| + resource->format, |
| + GL_UNSIGNED_BYTE, |
| + NULL); |
| + } |
| + context3d->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM); |
| + context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| } |
| - context3d->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM); |
| - context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| } |
| if (resource->pixels) |
| @@ -1116,6 +1139,7 @@ void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) { |
| DCHECK(resource->locked_for_write); |
| DCHECK(resource->pending_set_pixels); |
| DCHECK(!resource->set_pixels_completion_forced); |
| + DCHECK(!resource->use_gpu_memory_buffer); |
| if (resource->gl_id) { |
| WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| @@ -1134,6 +1158,7 @@ bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { |
| Resource* resource = &it->second; |
| DCHECK(resource->locked_for_write); |
| DCHECK(resource->pending_set_pixels); |
| + DCHECK(!resource->use_gpu_memory_buffer); |
| if (resource->gl_id) { |
| WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| @@ -1161,6 +1186,7 @@ void ResourceProvider::AbortSetPixels(ResourceId id) { |
| Resource* resource = &it->second; |
| DCHECK(resource->locked_for_write); |
| DCHECK(resource->pending_set_pixels); |
| + DCHECK(!resource->use_gpu_memory_buffer); |
| if (resource->gl_id) { |
| WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| @@ -1227,4 +1253,14 @@ void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id, |
| resource->enable_read_lock_fences = enable; |
| } |
| +void ResourceProvider::SetUseGpuMemoryBuffers(bool use_gpu_memory_buffers) { |
| + use_gpu_memory_buffers_ = use_gpu_memory_buffers; |
| +} |
| + |
| +GLenum ResourceProvider::GetTargetGivenResource(Resource* resource) { |
| + return resource->use_gpu_memory_buffer |
| + ? GL_IMAGE_BUFFER_CHROMIUM |
| + : GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM; |
| +} |
| + |
| } // namespace cc |