Index: content/browser/renderer_host/compositor_impl_android.cc |
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc |
index 96dcc517578cc152c9298e9a5e90f67da7d741c5..da2cc35e8b36755073c4f714c0a48dd853374bd6 100644 |
--- a/content/browser/renderer_host/compositor_impl_android.cc |
+++ b/content/browser/renderer_host/compositor_impl_android.cc |
@@ -186,9 +186,11 @@ gpu::gles2::ContextCreationAttribHelper GetCompositorContextAttributes( |
class AndroidOutputSurface : public cc::OutputSurface { |
public: |
- explicit AndroidOutputSurface( |
- scoped_refptr<ui::ContextProviderCommandBuffer> context_provider) |
+ AndroidOutputSurface( |
+ scoped_refptr<ui::ContextProviderCommandBuffer> context_provider, |
+ base::Closure swap_buffers_callback) |
: cc::OutputSurface(std::move(context_provider)), |
+ swap_buffers_callback_(std::move(swap_buffers_callback)), |
overlay_candidate_validator_( |
new display_compositor:: |
CompositorOverlayCandidateValidatorAndroid()), |
@@ -268,10 +270,12 @@ class AndroidOutputSurface : public cc::OutputSurface { |
const gpu::GpuProcessHostedCALayerTreeParamsMac* params_mac) { |
RenderWidgetHostImpl::CompositorFrameDrawn(latency_info); |
client_->DidReceiveSwapBuffersAck(); |
+ swap_buffers_callback_.Run(); |
} |
private: |
cc::OutputSurfaceClient* client_ = nullptr; |
+ base::Closure swap_buffers_callback_; |
std::unique_ptr<cc::OverlayCandidateValidator> overlay_candidate_validator_; |
base::WeakPtrFactory<AndroidOutputSurface> weak_ptr_factory_; |
}; |
@@ -682,10 +686,12 @@ void CompositorImpl::OnGpuChannelEstablished( |
HandlePendingCompositorFrameSinkRequest(); |
} |
- auto display_output_surface = |
- base::MakeUnique<AndroidOutputSurface>(context_provider); |
- InitializeDisplay(std::move(display_output_surface), nullptr, |
- std::move(context_provider)); |
+ // Unretained is safe this owns cc::Display which owns OutputSurface. |
+ InitializeDisplay( |
+ base::MakeUnique<AndroidOutputSurface>( |
+ context_provider, |
boliu
2017/03/09 20:24:09
ahh, for anyone wondering why this is x86 crash on
Peter Wen
2017/03/13 14:07:55
Thanks for getting to the root of this bug and the
|
+ base::Bind(&CompositorImpl::DidSwapBuffers, base::Unretained(this))), |
+ nullptr, std::move(context_provider)); |
} |
void CompositorImpl::InitializeDisplay( |
@@ -731,6 +737,10 @@ void CompositorImpl::InitializeDisplay( |
host_->SetCompositorFrameSink(std::move(compositor_frame_sink)); |
} |
+void CompositorImpl::DidSwapBuffers() { |
+ client_->DidSwapBuffers(); |
+} |
+ |
cc::UIResourceId CompositorImpl::CreateUIResource( |
cc::UIResourceClient* client) { |
TRACE_EVENT0("compositor", "CompositorImpl::CreateUIResource"); |