Chromium Code Reviews| Index: cc/output/gl_renderer.cc |
| diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
| index 9456c005c2e19dd4f111a81a4984a05e9d31dc65..ef273737c32a0cd09ff04033b77247ce6313dd2e 100644 |
| --- a/cc/output/gl_renderer.cc |
| +++ b/cc/output/gl_renderer.cc |
| @@ -41,6 +41,7 @@ |
| #include "cc/quads/stream_video_draw_quad.h" |
| #include "cc/quads/texture_draw_quad.h" |
| #include "cc/raster/scoped_gpu_raster.h" |
| +#include "cc/resources/resource_pool.h" |
| #include "cc/resources/scoped_resource.h" |
| #include "gpu/GLES2/gl2extchromium.h" |
| #include "gpu/command_buffer/client/context_support.h" |
| @@ -371,6 +372,11 @@ GLRenderer::GLRenderer(RendererClient* client, |
| context_caps.blend_equation_advanced_coherent; |
| InitializeSharedObjects(); |
| + |
| + // TODO(erikchen): Fix this to allow the creation of IOSurfaces. |
| + // https://crbug.com/581526. |
| + overlay_resource_pool_ = ResourcePool::CreateForGpuMemoryBufferResources( |
| + resource_provider_, nullptr); |
| } |
| GLRenderer::~GLRenderer() { |
| @@ -2796,7 +2802,7 @@ void GLRenderer::DidReceiveTextureInUseResponses( |
| DCHECK(settings_->release_overlay_resources_after_gpu_query); |
| for (const gpu::TextureInUseResponse& response : responses) { |
| if (!response.in_use) { |
| - swapped_and_acked_overlay_resources_.erase(response.texture); |
| + OverlayResourceNoLongerInUse(response.texture); |
| } |
| } |
| } |
| @@ -3631,12 +3637,23 @@ bool GLRenderer::IsContextLost() { |
| } |
| void GLRenderer::ScheduleCALayers(DrawingFrame* frame) { |
| + size_t copied_render_pass_count = 0; |
| for (const CALayerOverlay& ca_layer_overlay : frame->ca_layer_overlay_list) { |
|
ccameron
2016/07/21 05:31:16
Resource* overlay_resource = nullptr;
|
| + ResourceId contents_resource_id = ca_layer_overlay.contents_resource_id; |
| + // Some CALayers require a final round of processing. |
| + if (ca_layer_overlay.render_pass_id.IsValid()) { |
| + ResourceId resource_id; |
| + CopyRenderPassToOverlayResource(ca_layer_overlay.render_pass_id, |
| + &resource_id); |
|
ccameron
2016/07/21 05:31:16
CopyRenderPassToOverlayResource now takes a Resour
|
| + contents_resource_id = resource_id; |
| + ++copied_render_pass_count; |
| + } |
| + |
| unsigned texture_id = 0; |
| - if (ca_layer_overlay.contents_resource_id) { |
| + if (contents_resource_id) { |
| pending_overlay_resources_.push_back( |
| base::WrapUnique(new ResourceProvider::ScopedReadLockGL( |
| - resource_provider_, ca_layer_overlay.contents_resource_id))); |
| + resource_provider_, contents_resource_id))); |
| texture_id = pending_overlay_resources_.back()->texture_id(); |
| } |
|
ccameron
2016/07/21 05:31:16
At this point it's safe to
if (overlay_resource)
|
| GLfloat contents_rect[4] = { |
| @@ -3665,6 +3682,11 @@ void GLRenderer::ScheduleCALayers(DrawingFrame* frame) { |
| bounds_rect, is_clipped, clip_rect, sorting_context_id, transform, |
| filter); |
| } |
| + |
| + // Take the number of copied render passes in this frame, and use 3 times that |
| + // amount as the cache limit. |
| + overlay_resource_pool_->SetResourceUsageLimits( |
| + std::numeric_limits<std::size_t>::max(), copied_render_pass_count * 3); |
| } |
| void GLRenderer::ScheduleOverlays(DrawingFrame* frame) { |
| @@ -3690,4 +3712,41 @@ void GLRenderer::ScheduleOverlays(DrawingFrame* frame) { |
| } |
| } |
| +void GLRenderer::OverlayResourceNoLongerInUse(GLuint texture) { |
| + auto it = swapped_and_acked_overlay_resources_.find(texture); |
| + if (it != swapped_and_acked_overlay_resources_.end()) { |
| + overlay_resource_pool_->ReleaseResourceIfFound(it->second->resource_id()); |
| + swapped_and_acked_overlay_resources_.erase(it); |
|
ccameron
2016/07/20 22:13:53
(from gl_renderer.h) ...
We can just check for r
erikchen
2016/07/20 23:40:39
I don't think that's a great idea. We'd be maintai
ccameron
2016/07/21 05:31:16
This would now no longer need to do the release.
|
| + } |
| +} |
| + |
| +void GLRenderer::CopyRenderPassToOverlayResource( |
| + const RenderPassId& render_pass_id, |
| + ResourceId* resource_id) { |
| + ScopedResource* contents_texture = |
| + render_pass_textures_[render_pass_id].get(); |
| + DCHECK(contents_texture); |
| + DCHECK(contents_texture->id()); |
| + Resource* resource = overlay_resource_pool_->AcquireResource( |
| + contents_texture->size(), ResourceFormat::RGBA_8888); |
| + *resource_id = resource->id(); |
| + ResourceProvider::ScopedWriteLockGL destination(resource_provider_, |
| + *resource_id, false); |
| + |
| + GLuint source_texture = 0; |
| + std::unique_ptr<ResourceProvider::ScopedReadLockGL> source; |
| + if (current_framebuffer_lock_ && |
| + current_framebuffer_lock_->texture_id() == contents_texture->id()) { |
| + source_texture = current_framebuffer_lock_->texture_id(); |
| + } else { |
| + source.reset(new ResourceProvider::ScopedReadLockGL( |
| + resource_provider_, contents_texture->id())); |
| + source_texture = source->texture_id(); |
| + } |
| + gl_->CopySubTextureCHROMIUM(source_texture, destination.texture_id(), 0, 0, 0, |
| + 0, contents_texture->size().width(), |
| + contents_texture->size().height(), GL_TRUE, |
| + GL_FALSE, GL_FALSE); |
| +} |
| + |
| } // namespace cc |