summaryrefslogtreecommitdiffstats
path: root/cc/output
diff options
context:
space:
mode:
authorpiman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-08 16:02:38 +0000
committerpiman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-08 16:02:38 +0000
commit2ae13edf5976610500da81d2b29ba5315dba5ff1 (patch)
treeb38b82917a0f116cec9670709681f39bda40903f /cc/output
parent9dffa619d6e1dd3647e811eb984bb89ee2ef8754 (diff)
downloadchromium_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.cc20
-rw-r--r--cc/output/delegating_renderer.h1
-rw-r--r--cc/output/delegating_renderer_unittest.cc12
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();