blob: 4311781494aa6a1a5037991ffe0e5101339290e6 [file] [log] [blame]
// Copyright 2016 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/test/begin_frame_args_test.h"
#include "cc/test/layer_tree_test.h"
namespace cc {
class RemoteChannelTest : public LayerTreeTest {
protected:
RemoteChannelTest() : calls_received_(0) {}
~RemoteChannelTest() override {}
void BeginTest() override {
DCHECK(IsRemoteTest());
BeginChannelTest();
}
virtual void BeginChannelTest() {}
int calls_received_;
private:
DISALLOW_COPY_AND_ASSIGN(RemoteChannelTest);
};
class RemoteChannelTestInitializationAndShutdown : public RemoteChannelTest {
void SetVisibleOnImpl(bool visible) override { calls_received_++; }
void RequestNewOutputSurface() override {
LayerTreeTest::RequestNewOutputSurface();
calls_received_++;
}
void InitializeOutputSurfaceOnImpl(OutputSurface* output_surface) override {
calls_received_++;
}
void DidInitializeOutputSurface() override {
calls_received_++;
EndTest();
}
void FinishGLOnImpl() override { calls_received_++; }
// On initialization and shutdown, each of the above calls should happen only
// once.
void AfterTest() override { EXPECT_EQ(5, calls_received_); }
};
REMOTE_DIRECT_RENDERER_TEST_F(RemoteChannelTestInitializationAndShutdown);
class RemoteChannelTestMainThreadStoppedFlinging : public RemoteChannelTest {
void BeginChannelTest() override { proxy()->MainThreadHasStoppedFlinging(); }
void MainThreadHasStoppedFlingingOnImpl() override {
calls_received_++;
EndTest();
}
void AfterTest() override { EXPECT_EQ(1, calls_received_); }
};
REMOTE_DIRECT_RENDERER_TEST_F(RemoteChannelTestMainThreadStoppedFlinging);
class RemoteChannelTestDeferCommits : public RemoteChannelTest {
void BeginChannelTest() override { DispatchSetDeferCommits(true); }
void SetDeferCommitsOnImpl(bool defer_commits) override {
EXPECT_TRUE(defer_commits);
calls_received_++;
EndTest();
}
void AfterTest() override { EXPECT_EQ(1, calls_received_); }
};
REMOTE_DIRECT_RENDERER_TEST_F(RemoteChannelTestDeferCommits);
class RemoteChannelTestNeedsRedraw : public RemoteChannelTest {
void BeginChannelTest() override {
damaged_rect_.set_width(4);
damaged_rect_.set_height(5);
layer_tree_host()->SetNeedsRedrawRect(damaged_rect_);
}
void SetNeedsRedrawOnImpl(const gfx::Rect& damage_rect) override {
EXPECT_EQ(damage_rect, damaged_rect_);
calls_received_++;
EndTest();
}
void AfterTest() override { EXPECT_EQ(1, calls_received_); }
gfx::Rect damaged_rect_;
};
REMOTE_DIRECT_RENDERER_TEST_F(RemoteChannelTestNeedsRedraw);
class RemoteChannelTestReleaseOutputSurface : public RemoteChannelTest {
void DidInitializeOutputSurface() override {
SetVisibleOnLayerTreeHost(false);
ReleaseOutputSurfaceOnLayerTreeHost();
}
void ReleaseOutputSurfaceOnImpl() override {
calls_received_++;
EndTest();
}
void AfterTest() override { EXPECT_EQ(1, calls_received_); }
};
REMOTE_DIRECT_RENDERER_TEST_F(RemoteChannelTestReleaseOutputSurface);
class RemoteChannelTestCommit : public RemoteChannelTest {
void BeginChannelTest() override {
layer_tree_host()->SetViewportSize(viewport_size_);
PostSetNeedsCommitToMainThread();
}
void SetNeedsCommitOnImpl() override { EXPECT_EQ(0, calls_received_++); }
void ReceivedBeginMainFrame() override { EXPECT_EQ(1, calls_received_++); }
void StartCommitOnImpl() override { EXPECT_EQ(2, calls_received_++); }
void DidCommitAndDrawFrame() override { EXPECT_EQ(3, calls_received_++); }
void DidCompleteSwapBuffers() override {
EXPECT_EQ(4, calls_received_++);
EndTest();
}
void WillCommitCompleteOnThread(LayerTreeHostImpl* host_impl) override {
// Ensure that we serialized and deserialized the LayerTreeHost for the
// commit.
EXPECT_EQ(viewport_size_, host_impl->device_viewport_size());
}
void ScheduledActionSendBeginMainFrame() override {
last_args_sent_ = GetProxyImplForTest()->last_begin_frame_args();
}
void BeginMainFrame(const BeginFrameArgs& args) override {
last_args_received_ = args;
}
void AfterTest() override {
EXPECT_EQ(5, calls_received_);
// Ensure that we serialized and deserialized the
// BeginMainFrameAndCommitState. While the last_args_received_ will be set
// on the impl thread, it is safe to read it here since the impl thread has
// been destroyed now.
EXPECT_EQ(last_args_sent_, last_args_received_);
}
const gfx::Size viewport_size_ = gfx::Size(5, 3);
BeginFrameArgs last_args_sent_;
BeginFrameArgs last_args_received_;
};
REMOTE_DIRECT_RENDERER_TEST_F(RemoteChannelTestCommit);
class RemoteChannelTestBeginMainFrameAborted : public RemoteChannelTest {
void BeginChannelTest() override { PostSetNeedsCommitToMainThread(); }
void ScheduledActionWillSendBeginMainFrame() override {
PostSetDeferCommitsToMainThread(true);
}
void BeginMainFrameAbortedOnImpl(CommitEarlyOutReason reason) override {
EXPECT_EQ(reason, CommitEarlyOutReason::ABORTED_DEFERRED_COMMIT);
calls_received_++;
EndTest();
}
void AfterTest() override { EXPECT_EQ(1, calls_received_); }
};
REMOTE_DIRECT_RENDERER_TEST_F(RemoteChannelTestBeginMainFrameAborted);
} // namespace cc