Index: cc/output/gl_renderer_unittest.cc |
diff --git a/cc/output/gl_renderer_unittest.cc b/cc/output/gl_renderer_unittest.cc |
index 18d77e4445b055cfc05c158724adaba93858bc13..836287f444842175d02b658232cadd7025bd1703 100644 |
--- a/cc/output/gl_renderer_unittest.cc |
+++ b/cc/output/gl_renderer_unittest.cc |
@@ -143,7 +143,8 @@ class FakeRendererClient : public RendererClient { |
: host_impl_(&proxy_), |
set_full_root_layer_damage_count_(0), |
root_layer_(LayerImpl::Create(host_impl_.active_tree(), 1)), |
- viewport_size_(gfx::Size(1, 1)) { |
+ viewport_(gfx::Rect(0, 0, 1, 1)), |
+ clip_(gfx::Rect(0, 0, 1, 1)) { |
root_layer_->CreateRenderSurface(); |
RenderPass::Id render_pass_id = |
root_layer_->render_surface()->RenderPassId(); |
@@ -154,11 +155,8 @@ class FakeRendererClient : public RendererClient { |
} |
// RendererClient methods. |
- virtual gfx::Rect DeviceViewport() const OVERRIDE { |
- static gfx::Size fake_size(1, 1); |
- return gfx::Rect(fake_size); |
- } |
- virtual gfx::Rect DeviceClip() const OVERRIDE { return DeviceViewport(); } |
+ virtual gfx::Rect DeviceViewport() const OVERRIDE { return viewport_; } |
+ virtual gfx::Rect DeviceClip() const OVERRIDE { return clip_; } |
virtual void SetFullRootLayerDamage() OVERRIDE { |
set_full_root_layer_damage_count_++; |
} |
@@ -170,7 +168,8 @@ class FakeRendererClient : public RendererClient { |
int set_full_root_layer_damage_count() const { |
return set_full_root_layer_damage_count_; |
} |
- void set_viewport(gfx::Size viewport_size) { viewport_size_ = viewport_size; } |
+ void set_viewport(gfx::Rect viewport) { viewport_ = viewport; } |
+ void set_clip(gfx::Rect clip) { clip_ = clip; } |
RenderPass* root_render_pass() { return render_passes_in_draw_order_.back(); } |
RenderPassList* render_passes_in_draw_order() { |
@@ -183,7 +182,8 @@ class FakeRendererClient : public RendererClient { |
int set_full_root_layer_damage_count_; |
scoped_ptr<LayerImpl> root_layer_; |
RenderPassList render_passes_in_draw_order_; |
- gfx::Size viewport_size_; |
+ gfx::Rect viewport_; |
+ gfx::Rect clip_; |
}; |
class FakeRendererGL : public GLRenderer { |
@@ -1137,22 +1137,184 @@ TEST(GLRendererTest2, ScissorTestWhenClearing) { |
renderer_client.render_passes_in_draw_order(), NULL, 1.f, true); |
} |
+class DiscardCheckingContext : public TestWebGraphicsContext3D { |
+ public: |
+ DiscardCheckingContext() : discarded_(0) { |
+ set_have_post_sub_buffer(true); |
+ set_have_discard_framebuffer(true); |
+ } |
+ |
+ virtual void discardFramebufferEXT(WGC3Denum target, |
+ WGC3Dsizei numAttachments, |
+ const WGC3Denum* attachments) { |
+ ++discarded_; |
+ } |
+ |
+ int discarded() const { return discarded_; } |
+ void reset() { discarded_ = 0; } |
+ |
+ private: |
+ int discarded_; |
+}; |
+ |
class NonReshapableOutputSurface : public FakeOutputSurface { |
public: |
explicit NonReshapableOutputSurface( |
scoped_ptr<TestWebGraphicsContext3D> context3d) |
- : FakeOutputSurface( |
- TestContextProvider::Create(context3d.Pass()), |
- false) {} |
- virtual gfx::Size SurfaceSize() const OVERRIDE { return gfx::Size(500, 500); } |
+ : FakeOutputSurface(TestContextProvider::Create(context3d.Pass()), |
+ false) { |
+ surface_size_ = gfx::Size(500, 500); |
+ } |
+ virtual void Reshape(gfx::Size size, float scale_factor) OVERRIDE {} |
+ void set_fixed_size(gfx::Size size) { surface_size_ = size; } |
}; |
-class OffsetViewportRendererClient : public FakeRendererClient { |
- public: |
- virtual gfx::Rect DeviceViewport() const OVERRIDE { |
- return gfx::Rect(10, 10, 100, 100); |
+TEST(GLRendererTest2, NoDiscardOnPartialUpdates) { |
+ scoped_ptr<DiscardCheckingContext> context_owned(new DiscardCheckingContext); |
+ DiscardCheckingContext* context = context_owned.get(); |
+ |
+ FakeOutputSurfaceClient output_surface_client; |
+ scoped_ptr<NonReshapableOutputSurface> output_surface( |
+ new NonReshapableOutputSurface( |
+ context_owned.PassAs<TestWebGraphicsContext3D>())); |
+ CHECK(output_surface->BindToClient(&output_surface_client)); |
+ output_surface->set_fixed_size(gfx::Size(100, 100)); |
+ |
+ scoped_ptr<ResourceProvider> resource_provider( |
+ ResourceProvider::Create(output_surface.get(), 0, false)); |
+ |
+ LayerTreeSettings settings; |
+ settings.partial_swap_enabled = true; |
+ FakeRendererClient renderer_client; |
+ renderer_client.set_viewport(gfx::Rect(0, 0, 100, 100)); |
+ renderer_client.set_clip(gfx::Rect(0, 0, 100, 100)); |
+ FakeRendererGL renderer(&renderer_client, |
+ &settings, |
+ output_surface.get(), |
+ resource_provider.get()); |
+ EXPECT_TRUE(renderer.Initialize()); |
+ EXPECT_TRUE(renderer.Capabilities().using_partial_swap); |
+ |
+ gfx::Rect viewport_rect(renderer_client.DeviceViewport()); |
+ ScopedPtrVector<RenderPass>& render_passes = |
+ *renderer_client.render_passes_in_draw_order(); |
+ render_passes.clear(); |
+ |
+ { |
+ // Partial frame, should not discard. |
+ RenderPass::Id root_pass_id(1, 0); |
+ TestRenderPass* root_pass = AddRenderPass( |
+ &render_passes, root_pass_id, viewport_rect, gfx::Transform()); |
+ AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
+ root_pass->damage_rect = gfx::RectF(2.f, 2.f, 3.f, 3.f); |
+ |
+ renderer.DecideRenderPassAllocationsForFrame( |
+ *renderer_client.render_passes_in_draw_order()); |
+ renderer.DrawFrame( |
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true); |
+ EXPECT_EQ(0, context->discarded()); |
+ context->reset(); |
} |
-}; |
+ { |
+ // Full frame, should discard. |
+ RenderPass::Id root_pass_id(1, 0); |
+ TestRenderPass* root_pass = AddRenderPass( |
+ &render_passes, root_pass_id, viewport_rect, gfx::Transform()); |
+ AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
+ root_pass->damage_rect = gfx::RectF(root_pass->output_rect); |
+ |
+ renderer.DecideRenderPassAllocationsForFrame( |
+ *renderer_client.render_passes_in_draw_order()); |
+ renderer.DrawFrame( |
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true); |
+ EXPECT_EQ(1, context->discarded()); |
+ context->reset(); |
+ } |
+ { |
+ // Partial frame, disallow partial swap, should discard. |
+ RenderPass::Id root_pass_id(1, 0); |
+ TestRenderPass* root_pass = AddRenderPass( |
+ &render_passes, root_pass_id, viewport_rect, gfx::Transform()); |
+ AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
+ root_pass->damage_rect = gfx::RectF(2.f, 2.f, 3.f, 3.f); |
+ |
+ renderer.DecideRenderPassAllocationsForFrame( |
+ *renderer_client.render_passes_in_draw_order()); |
+ renderer.DrawFrame( |
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, false); |
+ EXPECT_EQ(1, context->discarded()); |
+ context->reset(); |
+ } |
+ { |
+ // Full frame, external scissor is set, should not discard. |
+ output_surface->set_has_external_stencil_test(true); |
+ RenderPass::Id root_pass_id(1, 0); |
+ TestRenderPass* root_pass = AddRenderPass( |
+ &render_passes, root_pass_id, viewport_rect, gfx::Transform()); |
+ AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
+ root_pass->damage_rect = gfx::RectF(root_pass->output_rect); |
+ root_pass->has_transparent_background = false; |
+ |
+ renderer.DecideRenderPassAllocationsForFrame( |
+ *renderer_client.render_passes_in_draw_order()); |
+ renderer.DrawFrame( |
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true); |
+ EXPECT_EQ(0, context->discarded()); |
+ context->reset(); |
+ output_surface->set_has_external_stencil_test(false); |
+ } |
+ { |
+ // Full frame, clipped, should not discard. |
+ renderer_client.set_clip(gfx::Rect(10, 10, 10, 10)); |
+ RenderPass::Id root_pass_id(1, 0); |
+ TestRenderPass* root_pass = AddRenderPass( |
+ &render_passes, root_pass_id, viewport_rect, gfx::Transform()); |
+ AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
+ root_pass->damage_rect = gfx::RectF(root_pass->output_rect); |
+ |
+ renderer.DecideRenderPassAllocationsForFrame( |
+ *renderer_client.render_passes_in_draw_order()); |
+ renderer.DrawFrame( |
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true); |
+ EXPECT_EQ(0, context->discarded()); |
+ context->reset(); |
+ } |
+ { |
+ // Full frame, doesn't cover the surface, should not discard. |
+ renderer_client.set_viewport(gfx::Rect(10, 10, 10, 10)); |
+ viewport_rect = renderer_client.DeviceViewport(); |
+ RenderPass::Id root_pass_id(1, 0); |
+ TestRenderPass* root_pass = AddRenderPass( |
+ &render_passes, root_pass_id, viewport_rect, gfx::Transform()); |
+ AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
+ root_pass->damage_rect = gfx::RectF(root_pass->output_rect); |
+ |
+ renderer.DecideRenderPassAllocationsForFrame( |
+ *renderer_client.render_passes_in_draw_order()); |
+ renderer.DrawFrame( |
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true); |
+ EXPECT_EQ(0, context->discarded()); |
+ context->reset(); |
+ } |
+ { |
+ // Full frame, doesn't cover the surface (no offset), should not discard. |
+ renderer_client.set_viewport(gfx::Rect(0, 0, 50, 50)); |
+ renderer_client.set_clip(gfx::Rect(0, 0, 100, 100)); |
+ viewport_rect = renderer_client.DeviceViewport(); |
+ RenderPass::Id root_pass_id(1, 0); |
+ TestRenderPass* root_pass = AddRenderPass( |
+ &render_passes, root_pass_id, viewport_rect, gfx::Transform()); |
+ AddQuad(root_pass, viewport_rect, SK_ColorGREEN); |
+ root_pass->damage_rect = gfx::RectF(root_pass->output_rect); |
+ |
+ renderer.DecideRenderPassAllocationsForFrame( |
+ *renderer_client.render_passes_in_draw_order()); |
+ renderer.DrawFrame( |
+ renderer_client.render_passes_in_draw_order(), NULL, 1.f, true); |
+ EXPECT_EQ(0, context->discarded()); |
+ context->reset(); |
+ } |
+} |
class FlippedScissorAndViewportContext : public TestWebGraphicsContext3D { |
public: |
@@ -1201,7 +1363,9 @@ TEST(GLRendererTest2, ScissorAndViewportWithinNonreshapableSurface) { |
ResourceProvider::Create(output_surface.get(), 0, false)); |
LayerTreeSettings settings; |
- OffsetViewportRendererClient renderer_client; |
+ FakeRendererClient renderer_client; |
+ renderer_client.set_viewport(gfx::Rect(10, 10, 100, 100)); |
+ renderer_client.set_clip(gfx::Rect(10, 10, 100, 100)); |
FakeRendererGL renderer(&renderer_client, |
&settings, |
output_surface.get(), |
@@ -1606,7 +1770,7 @@ TEST_F(MockOutputSurfaceTest, DrawFrameAndResizeAndSwap) { |
EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1); |
renderer_->SwapBuffers(); |
- set_viewport(gfx::Size(2, 2)); |
+ set_viewport(gfx::Rect(0, 0, 2, 2)); |
renderer_->ViewportChanged(); |
DrawFrame(2.f); |
@@ -1617,7 +1781,7 @@ TEST_F(MockOutputSurfaceTest, DrawFrameAndResizeAndSwap) { |
EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1); |
renderer_->SwapBuffers(); |
- set_viewport(gfx::Size(1, 1)); |
+ set_viewport(gfx::Rect(0, 0, 1, 1)); |
renderer_->ViewportChanged(); |
DrawFrame(1.f); |