| Index: cc/output/gl_renderer.cc
|
| diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
|
| index 1c33fe663f15adfcab6193ea2b8b2809165fce21..6579f2c2424b26462f0fe18025e6bf73867fce52 100644
|
| --- a/cc/output/gl_renderer.cc
|
| +++ b/cc/output/gl_renderer.cc
|
| @@ -395,6 +395,8 @@ GLRenderer::~GLRenderer() {
|
| }
|
|
|
| swapped_overlay_resources_.clear();
|
| + ReleaseGpuMemoryBufferResources();
|
| +
|
| CleanupSharedObjects();
|
| }
|
|
|
| @@ -2727,6 +2729,16 @@ void GLRenderer::SwapBuffers(const CompositorFrameMetadata& metadata) {
|
| swapped_overlay_resources_.size() > 2) {
|
| swapped_overlay_resources_.pop_front();
|
| }
|
| +
|
| + // Make the assumption that by the time a second SwapBuffers has come in, the
|
| + // resources in |pending_gmb_resources_| have been received, processed, (and
|
| + // possibly displayed) by the Window Server.
|
| + if (!pending_gmb_resources_.empty()) {
|
| + in_use_gmb_resources_.push_back(std::move(pending_gmb_resources_));
|
| + pending_gmb_resources_.clear();
|
| + }
|
| + ReleaseGpuMemoryBufferResources();
|
| +
|
| swap_buffer_rect_ = gfx::Rect();
|
| }
|
|
|
| @@ -3603,10 +3615,10 @@ void GLRenderer::ScheduleCALayers(DrawingFrame* frame) {
|
| for (const CALayerOverlay& ca_layer_overlay : frame->ca_layer_overlay_list) {
|
| unsigned texture_id = 0;
|
| if (ca_layer_overlay.contents_resource_id) {
|
| - pending_overlay_resources_.push_back(
|
| - base::WrapUnique(new ResourceProvider::ScopedReadLockGL(
|
| + pending_gmb_resources_.push_back(
|
| + base::WrapUnique(new ResourceProvider::ScopedReadLockGpuMemoryBuffer(
|
| resource_provider_, ca_layer_overlay.contents_resource_id)));
|
| - texture_id = pending_overlay_resources_.back()->texture_id();
|
| + texture_id = pending_gmb_resources_.back()->texture_id();
|
| }
|
| GLfloat contents_rect[4] = {
|
| ca_layer_overlay.contents_rect.x(), ca_layer_overlay.contents_rect.y(),
|
| @@ -3658,4 +3670,22 @@ void GLRenderer::ScheduleOverlays(DrawingFrame* frame) {
|
| }
|
| }
|
|
|
| +void GLRenderer::ReleaseGpuMemoryBufferResources() {
|
| + // Remove resources that are no longer in use by the Window Server.
|
| + for (auto& resources_vector : in_use_gmb_resources_) {
|
| + resources_vector.erase(
|
| + std::remove_if(
|
| + resources_vector.begin(), resources_vector.end(),
|
| + [](std::unique_ptr<ResourceProvider::ScopedReadLockGpuMemoryBuffer>&
|
| + lock) { return !lock->IsInUseByMacOSWindowServer(); }),
|
| + resources_vector.end());
|
| + }
|
| +
|
| + // Remove vectors that are empty.
|
| + in_use_gmb_resources_.erase(
|
| + std::remove_if(in_use_gmb_resources_.begin(), in_use_gmb_resources_.end(),
|
| + [](GmbResourceLockList& list) { return list.empty(); }),
|
| + in_use_gmb_resources_.end());
|
| +}
|
| +
|
| } // namespace cc
|
|
|