Chromium Code Reviews| 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..200e95e2e72751ee9f5bece85d2a6ce3cbb7563f |
| --- /dev/null |
| +++ b/cc/surfaces/surface_display_output_surface_unittest.cc |
| @@ -0,0 +1,185 @@ |
| +// 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 FakeSurfaceManager : public SurfaceManager {}; |
| + |
| +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) { |
| + fake_output_surface_ = |
| + static_cast<FakeOutputSurface*>(output_surface_.get()); |
| + } |
| + |
| + FakeOutputSurface* output_surface() { return fake_output_surface_; } |
| + |
| + protected: |
| + FakeOutputSurface* fake_output_surface_; |
| +}; |
| + |
| +class TestSurfaceDisplayOutputSurface : public SurfaceDisplayOutputSurface { |
|
brianderson
2015/05/12 17:01:20
I guess this class is pretty useless for the exist
|
| + public: |
| + TestSurfaceDisplayOutputSurface( |
| + SurfaceManager* surface_manager, |
| + SurfaceIdAllocator* allocator, |
| + const scoped_refptr<ContextProvider>& context_provider) |
| + : SurfaceDisplayOutputSurface(surface_manager, |
| + allocator, |
| + context_provider) {} |
| +}; |
| + |
| +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_); |
| + } |
| + |
| + ~SurfaceDisplayOutputSurfaceTest() override {} |
| + |
| + void SetUp() override { |
| + // Draw the first frame to start in an "unlocked" state. |
| + scoped_ptr<RenderPass> render_pass = RenderPass::Create(); |
| + render_pass->output_rect = display_rect_; |
| + render_pass->damage_rect = display_rect_; |
| + |
| + CompositorFrame frame1; |
| + frame1.delegated_frame_data = make_scoped_ptr(new DelegatedFrameData); |
| + frame1.delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); |
| + surface_display_output_surface_.SwapBuffers(&frame1); |
| + |
| + EXPECT_EQ(output_surface_->num_sent_frames(), 0u); |
| + task_runner_->RunUntilIdle(); |
| + EXPECT_EQ(output_surface_->num_sent_frames(), 1u); |
| + } |
| + |
| + protected: |
| + scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
| + SurfaceIdAllocator allocator_; |
| + |
| + const gfx::Size display_size_; |
| + const gfx::Rect display_rect_; |
| + FakeOutputSurface* output_surface_; |
| + FakeSurfaceManager 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_; |
| + TestSurfaceDisplayOutputSurface surface_display_output_surface_; |
| +}; |
| + |
| +TEST_F(SurfaceDisplayOutputSurfaceTest, DamageTriggersSwapBuffers) { |
| + scoped_ptr<RenderPass> render_pass = RenderPass::Create(); |
| + render_pass->output_rect = display_rect_; |
| + render_pass->damage_rect = display_rect_; |
| + |
| + EXPECT_EQ(output_surface_->num_sent_frames(), 1u); |
| + task_runner_->RunUntilIdle(); |
| + EXPECT_EQ(output_surface_->num_sent_frames(), 1u); |
| + |
| + CompositorFrame frame1; |
| + frame1.delegated_frame_data = make_scoped_ptr(new DelegatedFrameData); |
| + frame1.delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); |
| + surface_display_output_surface_.SwapBuffers(&frame1); |
| + |
| + EXPECT_EQ(output_surface_->num_sent_frames(), 1u); |
| + task_runner_->RunUntilIdle(); |
| + EXPECT_EQ(output_surface_->num_sent_frames(), 2u); |
| +} |
| + |
| +TEST_F(SurfaceDisplayOutputSurfaceTest, NoDamageDoesNotTriggerSwapBuffers) { |
| + scoped_ptr<RenderPass> render_pass = RenderPass::Create(); |
| + render_pass->output_rect = display_rect_; |
| + render_pass->damage_rect = gfx::Rect(); |
| + |
| + EXPECT_EQ(output_surface_->num_sent_frames(), 1u); |
| + task_runner_->RunUntilIdle(); |
| + EXPECT_EQ(output_surface_->num_sent_frames(), 1u); |
| + |
| + CompositorFrame frame1; |
| + frame1.delegated_frame_data = make_scoped_ptr(new DelegatedFrameData); |
| + frame1.delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); |
| + surface_display_output_surface_.SwapBuffers(&frame1); |
| + |
| + EXPECT_EQ(output_surface_->num_sent_frames(), 1u); |
| + task_runner_->RunUntilIdle(); |
| + EXPECT_EQ(output_surface_->num_sent_frames(), 1u); |
| +} |
| + |
| +TEST_F(SurfaceDisplayOutputSurfaceTest, |
| + LockingResourcesDoesNotIndirectlyCauseDamage) { |
| + scoped_ptr<RenderPass> render_pass = RenderPass::Create(); |
| + render_pass->output_rect = display_rect_; |
| + render_pass->damage_rect = gfx::Rect(); |
| + |
| + EXPECT_EQ(output_surface_->num_sent_frames(), 1u); |
| + task_runner_->RunUntilIdle(); |
| + EXPECT_EQ(output_surface_->num_sent_frames(), 1u); |
| + |
| + surface_display_output_surface_.ForceReclaimResources(); |
| + EXPECT_EQ(output_surface_->num_sent_frames(), 1u); |
| + task_runner_->RunPendingTasks(); |
| + task_runner_->RunPendingTasks(); |
| + EXPECT_EQ(output_surface_->num_sent_frames(), 1u); |
| + |
| + CompositorFrame frame1; |
| + frame1.delegated_frame_data = make_scoped_ptr(new DelegatedFrameData); |
| + frame1.delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); |
| + surface_display_output_surface_.SwapBuffers(&frame1); |
| + |
| + EXPECT_EQ(output_surface_->num_sent_frames(), 1u); |
| + task_runner_->RunUntilIdle(); |
| + EXPECT_EQ(output_surface_->num_sent_frames(), 1u); |
| +} |
| + |
| +} // namespace |
| +} // namespace cc |