diff options
author | piman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-08 16:02:38 +0000 |
---|---|---|
committer | piman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-08 16:02:38 +0000 |
commit | 2ae13edf5976610500da81d2b29ba5315dba5ff1 (patch) | |
tree | b38b82917a0f116cec9670709681f39bda40903f /cc/output | |
parent | 9dffa619d6e1dd3647e811eb984bb89ee2ef8754 (diff) | |
download | chromium_src-2ae13edf5976610500da81d2b29ba5315dba5ff1.zip chromium_src-2ae13edf5976610500da81d2b29ba5315dba5ff1.tar.gz chromium_src-2ae13edf5976610500da81d2b29ba5315dba5ff1.tar.bz2 |
DelegatingRenderer: send frame on SwapBuffers instead of DrawFrame
CompositeAndReadback, though not implemented, should stay consistent. If we send
the frame on DrawFrame, we will get an Ack from the browser, even though the
frame rate controller doesn't expect one in that case. If that happens,
num_frames_pending_ becomes negative and the frame rate throttling doesn't work
any more, causing bad frames.
Instead, be consistent with GLRenderer and send the frame on SwapBuffers.
BUG=123444
TEST=LayerTreeHostTestNumFramesPending
Review URL: https://chromiumcodereview.appspot.com/14941005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@198913 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/output')
-rw-r--r-- | cc/output/delegating_renderer.cc | 20 | ||||
-rw-r--r-- | cc/output/delegating_renderer.h | 1 | ||||
-rw-r--r-- | cc/output/delegating_renderer_unittest.cc | 12 |
3 files changed, 24 insertions, 9 deletions
diff --git a/cc/output/delegating_renderer.cc b/cc/output/delegating_renderer.cc index 98dc2a0..2ee755a 100644 --- a/cc/output/delegating_renderer.cc +++ b/cc/output/delegating_renderer.cc @@ -133,33 +133,35 @@ static ResourceProvider::ResourceId AppendToArray( void DelegatingRenderer::DrawFrame( RenderPassList* render_passes_in_draw_order) { TRACE_EVENT0("cc", "DelegatingRenderer::DrawFrame"); + render_passes_for_swap_buffers_.swap(*render_passes_in_draw_order); + render_passes_in_draw_order->clear(); +} + +void DelegatingRenderer::SwapBuffers(const LatencyInfo& latency_info) { + TRACE_EVENT0("cc", "DelegatingRenderer::SwapBuffers"); CompositorFrame out_frame; out_frame.metadata = client_->MakeCompositorFrameMetadata(); out_frame.delegated_frame_data = make_scoped_ptr(new DelegatedFrameData); + DelegatedFrameData& out_data = *out_frame.delegated_frame_data; + // Move the render passes and resources into the |out_frame|. + out_data.render_pass_list.swap(render_passes_for_swap_buffers_); // Collect all resource ids in the render passes into a ResourceIdArray. ResourceProvider::ResourceIdArray resources; DrawQuad::ResourceIteratorCallback append_to_array = base::Bind(&AppendToArray, &resources); - for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) { - RenderPass* render_pass = render_passes_in_draw_order->at(i); + for (size_t i = 0; i < out_data.render_pass_list.size(); ++i) { + RenderPass* render_pass = out_data.render_pass_list.at(i); for (size_t j = 0; j < render_pass->quad_list.size(); ++j) render_pass->quad_list[j]->IterateResources(append_to_array); } - - // Move the render passes and resources into the |out_frame|. - DelegatedFrameData& out_data = *out_frame.delegated_frame_data; - out_data.render_pass_list.swap(*render_passes_in_draw_order); resource_provider_->PrepareSendToParent(resources, &out_data.resource_list); output_surface_->SendFrameToParentCompositor(&out_frame); } -void DelegatingRenderer::SwapBuffers(const LatencyInfo& latency_info) { -} - void DelegatingRenderer::GetFramebufferPixels(void* pixels, gfx::Rect rect) { NOTIMPLEMENTED(); } diff --git a/cc/output/delegating_renderer.h b/cc/output/delegating_renderer.h index 7b7c5f3..813be91 100644 --- a/cc/output/delegating_renderer.h +++ b/cc/output/delegating_renderer.h @@ -53,6 +53,7 @@ class CC_EXPORT DelegatingRenderer : public Renderer { ResourceProvider* resource_provider_; RendererCapabilities capabilities_; bool visible_; + RenderPassList render_passes_for_swap_buffers_; DISALLOW_COPY_AND_ASSIGN(DelegatingRenderer); }; diff --git a/cc/output/delegating_renderer_unittest.cc b/cc/output/delegating_renderer_unittest.cc index cf85cb9..bad075c 100644 --- a/cc/output/delegating_renderer_unittest.cc +++ b/cc/output/delegating_renderer_unittest.cc @@ -58,6 +58,12 @@ class DelegatingRendererTestDraw : public DelegatingRendererTest { } virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { + EXPECT_EQ(0u, output_surface_->num_sent_frames()); + } + + virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, + bool result) OVERRIDE { + EXPECT_TRUE(result); EXPECT_EQ(1u, output_surface_->num_sent_frames()); const CompositorFrame& last_frame = output_surface_->last_sent_frame(); @@ -114,6 +120,12 @@ class DelegatingRendererTestResources : public DelegatingRendererTest { } virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { + EXPECT_EQ(0u, output_surface_->num_sent_frames()); + } + + virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, + bool result) OVERRIDE { + EXPECT_TRUE(result); EXPECT_EQ(1u, output_surface_->num_sent_frames()); const CompositorFrame& last_frame = output_surface_->last_sent_frame(); |