Index: cc/surfaces/surface_display_output_surface_unittest.cc |
diff --git a/cc/surfaces/surface_display_output_surface_unittest.cc b/cc/surfaces/surface_display_output_surface_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ed801e91474a1d03ff9f7962d233e170ed909530 |
--- /dev/null |
+++ b/cc/surfaces/surface_display_output_surface_unittest.cc |
@@ -0,0 +1,147 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "cc/surfaces/surface_display_output_surface.h" |
+ |
+#include "cc/surfaces/onscreen_display_client.h" |
+#include "cc/surfaces/surface_id_allocator.h" |
+#include "cc/surfaces/surface_manager.h" |
+#include "cc/test/fake_output_surface.h" |
+#include "cc/test/fake_output_surface_client.h" |
+#include "cc/test/ordered_simple_task_runner.h" |
+#include "cc/test/test_context_provider.h" |
+#include "cc/test/test_gpu_memory_buffer_manager.h" |
+#include "cc/test/test_shared_bitmap_manager.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace cc { |
+namespace { |
+ |
+class FakeOnscreenDisplayClient : public OnscreenDisplayClient { |
+ public: |
+ FakeOnscreenDisplayClient( |
+ SurfaceManager* manager, |
+ SharedBitmapManager* bitmap_manager, |
+ gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
+ const RendererSettings& settings, |
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
+ : OnscreenDisplayClient(FakeOutputSurface::Create3d(), |
+ manager, |
+ bitmap_manager, |
+ gpu_memory_buffer_manager, |
+ settings, |
+ task_runner) { |
+ // Ownership is passed to another object later, store a pointer |
+ // to it now for future reference. |
+ fake_output_surface_ = |
+ static_cast<FakeOutputSurface*>(output_surface_.get()); |
+ } |
+ |
+ FakeOutputSurface* output_surface() { return fake_output_surface_; } |
+ |
+ protected: |
+ FakeOutputSurface* fake_output_surface_; |
+}; |
+ |
+class SurfaceDisplayOutputSurfaceTest : public testing::Test { |
+ public: |
+ SurfaceDisplayOutputSurfaceTest() |
+ : task_runner_(new OrderedSimpleTaskRunner()), |
+ allocator_(0), |
+ display_size_(1920, 1080), |
+ display_rect_(display_size_), |
+ display_client_(&surface_manager_, |
+ &bitmap_manager_, |
+ &gpu_memory_buffer_manager_, |
+ renderer_settings_, |
+ task_runner_), |
+ context_provider_(TestContextProvider::Create()), |
+ surface_display_output_surface_(&surface_manager_, |
+ &allocator_, |
+ context_provider_) { |
+ output_surface_ = display_client_.output_surface(); |
+ display_client_.set_surface_output_surface( |
+ &surface_display_output_surface_); |
+ surface_display_output_surface_.set_display_client(&display_client_); |
+ surface_display_output_surface_.BindToClient( |
+ &surface_display_output_surface_client_); |
+ display_client_.display()->Resize(display_size_); |
+ |
+ EXPECT_FALSE(surface_display_output_surface_client_ |
+ .did_lose_output_surface_called()); |
+ } |
+ |
+ ~SurfaceDisplayOutputSurfaceTest() override {} |
+ |
+ void SwapBuffersWithDamage(const gfx::Rect& damage_rect_) { |
+ scoped_ptr<RenderPass> render_pass(RenderPass::Create()); |
+ render_pass->SetNew(RenderPassId(1, 1), display_rect_, damage_rect_, |
+ gfx::Transform()); |
+ |
+ scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); |
+ frame_data->render_pass_list.push_back(render_pass.Pass()); |
+ |
+ CompositorFrame frame; |
+ frame.delegated_frame_data = frame_data.Pass(); |
+ |
+ surface_display_output_surface_.SwapBuffers(&frame); |
+ } |
+ |
+ void SetUp() override { |
+ // Draw the first frame to start in an "unlocked" state. |
+ SwapBuffersWithDamage(display_rect_); |
+ |
+ EXPECT_EQ(0u, output_surface_->num_sent_frames()); |
+ task_runner_->RunUntilIdle(); |
+ EXPECT_EQ(1u, output_surface_->num_sent_frames()); |
+ } |
+ |
+ protected: |
+ scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
+ SurfaceIdAllocator allocator_; |
+ |
+ const gfx::Size display_size_; |
+ const gfx::Rect display_rect_; |
+ FakeOutputSurface* output_surface_; |
+ SurfaceManager surface_manager_; |
+ TestSharedBitmapManager bitmap_manager_; |
+ TestGpuMemoryBufferManager gpu_memory_buffer_manager_; |
+ RendererSettings renderer_settings_; |
+ FakeOnscreenDisplayClient display_client_; |
+ |
+ scoped_refptr<TestContextProvider> context_provider_; |
+ |
+ FakeOutputSurfaceClient surface_display_output_surface_client_; |
+ SurfaceDisplayOutputSurface surface_display_output_surface_; |
+}; |
+ |
+TEST_F(SurfaceDisplayOutputSurfaceTest, DamageTriggersSwapBuffers) { |
+ SwapBuffersWithDamage(display_rect_); |
+ EXPECT_EQ(1u, output_surface_->num_sent_frames()); |
+ task_runner_->RunUntilIdle(); |
+ EXPECT_EQ(2u, output_surface_->num_sent_frames()); |
+} |
+ |
+TEST_F(SurfaceDisplayOutputSurfaceTest, NoDamageDoesNotTriggerSwapBuffers) { |
+ SwapBuffersWithDamage(gfx::Rect()); |
+ EXPECT_EQ(1u, output_surface_->num_sent_frames()); |
+ task_runner_->RunUntilIdle(); |
+ EXPECT_EQ(1u, output_surface_->num_sent_frames()); |
+} |
+ |
+TEST_F(SurfaceDisplayOutputSurfaceTest, |
+ LockingResourcesDoesNotIndirectlyCauseDamage) { |
+ surface_display_output_surface_.ForceReclaimResources(); |
+ EXPECT_EQ(1u, output_surface_->num_sent_frames()); |
+ task_runner_->RunPendingTasks(); |
+ EXPECT_EQ(1u, output_surface_->num_sent_frames()); |
+ |
+ SwapBuffersWithDamage(gfx::Rect()); |
+ EXPECT_EQ(1u, output_surface_->num_sent_frames()); |
+ task_runner_->RunUntilIdle(); |
+ EXPECT_EQ(1u, output_surface_->num_sent_frames()); |
+} |
+ |
+} // namespace |
+} // namespace cc |