Chromium Code Reviews| Index: cc/output/gl_renderer.cc |
| diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
| index 7cf5a00face44d5bfa4fdf49f6e805ae4d5b209c..b7bd541305b2b875a4c61d035e8a4074497ee0a2 100644 |
| --- a/cc/output/gl_renderer.cc |
| +++ b/cc/output/gl_renderer.cc |
| @@ -2701,7 +2701,7 @@ void GLRenderer::SwapBuffers(const CompositorFrameMetadata& metadata) { |
| // We always hold onto resources until an extra frame has swapped, to make |
| // sure we don't update the buffer while it's being scanned out. |
| - if (!settings_->release_overlay_resources_on_swap_complete && |
| + if (!settings_->release_overlay_resources_after_gpu_query && |
| swapping_overlay_resources_.size() > 2) { |
| swapping_overlay_resources_.pop_front(); |
| } |
| @@ -2712,33 +2712,40 @@ void GLRenderer::SwapBuffers(const CompositorFrameMetadata& metadata) { |
| } |
| void GLRenderer::SwapBuffersComplete() { |
| - // On OS X, the logic in this block moves resources into |
| - // |swapped_and_acked_overlay_resources_|, and then erases resources from |
| - // |swapped_and_acked_overlay_resources_| that are no longer in use by the |
| - // Window Server. On other platforms, since resources are never in use by the |
| - // Window Server, this is equivalent to just erasing all resources from the |
| - // first element of |swapping_overlay_resources_|. |
| - if (settings_->release_overlay_resources_on_swap_complete) { |
| - // Move resources known to be acked into |
| - // |swapped_and_acked_overlay_resources_|. |
| + // Once a resouce has been swap-ACKed, send a query to the GPU process to ask |
| + // if the resource is no longer being consumed by the system compositor. The |
| + // response will come with the next swap-ACK. |
| + if (settings_->release_overlay_resources_after_gpu_query) { |
| if (!swapping_overlay_resources_.empty()) { |
| for (OverlayResourceLock& lock : swapping_overlay_resources_.front()) { |
| - swapped_and_acked_overlay_resources_[lock->GetResourceId()] = |
| - std::move(lock); |
| + unsigned texture = lock->GetTextureId(); |
| + if (swapped_and_acked_overlay_resources_.find(texture) == |
| + swapped_and_acked_overlay_resources_.end()) { |
| + swapped_and_acked_overlay_resources_[texture] = std::move(lock); |
| + } |
| } |
| swapping_overlay_resources_.pop_front(); |
| } |
| - // Release resources that are no longer in use by the Window Server. |
| - auto it = swapped_and_acked_overlay_resources_.begin(); |
| - while (it != swapped_and_acked_overlay_resources_.end()) { |
| - if (it->second->GetGpuMemoryBuffer() && |
| - it->second->GetGpuMemoryBuffer()->IsInUseByMacOSWindowServer()) { |
| - ++it; |
| - continue; |
| + if (!swapped_and_acked_overlay_resources_.empty()) { |
| + std::vector<unsigned> textures; |
| + textures.reserve(swapped_and_acked_overlay_resources_.size()); |
| + for (auto& pair : swapped_and_acked_overlay_resources_) { |
| + textures.push_back(pair.first); |
| } |
| + gl_->ScheduleCALayerInUseQueryCHROMIUM(textures.size(), textures.data()); |
| + } |
| + } |
| +} |
| - it = swapped_and_acked_overlay_resources_.erase(it); |
| +void GLRenderer::DidReceiveTextureInUseResponses( |
| + const gpu::TextureInUseResponses& responses) { |
| + DCHECK(settings_->release_overlay_resources_after_gpu_query); |
| + for (const gpu::TextureInUseResponse& response : responses) { |
| + if (!response.in_use) { |
| + auto it = swapped_and_acked_overlay_resources_.find(response.texture); |
|
dcheng
2016/06/15 08:47:21
Out of curiosity, why isn't this just a call to er
erikchen
2016/06/20 16:16:31
Mistake, fixed.
|
| + if (it != swapped_and_acked_overlay_resources_.end()) |
| + swapped_and_acked_overlay_resources_.erase(it); |
| } |
| } |
| } |