blob: f1f9f4c5c8ef01ed18143597f73289c9f624f89e [file] [log] [blame]
// Copyright 2019 The Fuchsia 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 <gtest/gtest.h>
#include "src/ui/examples/escher/waterfall/waterfall_demo.h"
#include "src/ui/lib/escher/renderer/frame.h"
#include "src/ui/lib/escher/test/common/gtest_escher.h"
#include "src/ui/lib/escher/test/common/test_with_vk_validation_layer.h"
#include "src/ui/lib/escher/util/image_utils.h"
namespace {
static constexpr uint32_t kFramebufferWidth = 1024;
static constexpr uint32_t kFramebufferHeight = 1024;
// Use the same format as Scenic screen shots.
static constexpr vk::Format kScenicScreenshotFormat = vk::Format::eB8G8R8A8Unorm;
using WaterfallDemoTest = escher::test::TestWithVkValidationLayer;
} // namespace
VK_TEST_F(WaterfallDemoTest, SmokeTest) {
WaterfallDemo demo(escher::test::GetEscher()->GetWeakPtr(), kScenicScreenshotFormat, 0, nullptr);
auto escher = demo.escher();
auto output_image = escher::image_utils::NewColorAttachmentImage(
escher->image_cache(), kFramebufferWidth, kFramebufferHeight,
vk::ImageUsageFlagBits::eTransferDst);
output_image->set_swapchain_layout(vk::ImageLayout::eColorAttachmentOptimal);
auto frame = escher->NewFrame("Waterfall SmokeTest", 0, 0);
frame->cmds()->ImageBarrier(
output_image, vk::ImageLayout::eUndefined, vk::ImageLayout::eColorAttachmentOptimal,
vk::PipelineStageFlagBits::eAllCommands, vk::AccessFlagBits::eColorAttachmentWrite,
vk::PipelineStageFlagBits::eColorAttachmentOutput, vk::AccessFlagBits::eColorAttachmentWrite);
demo.DrawFrame(frame, output_image, escher::SemaphorePtr());
bool frame_done = false;
frame->EndFrame(escher::SemaphorePtr(), [&]() { frame_done = true; });
escher->vk_device().waitIdle();
escher->Cleanup();
EXPECT_TRUE(frame_done);
}
VK_TEST_F(WaterfallDemoTest, OffscreenBenchmark) {
WaterfallDemo demo(escher::test::GetEscher()->GetWeakPtr(), kScenicScreenshotFormat, 0, nullptr);
constexpr size_t kNumFrames = 20;
Demo::RunOffscreenBenchmark(&demo, kFramebufferWidth, kFramebufferHeight, kScenicScreenshotFormat,
kNumFrames);
}
VK_TEST_F(WaterfallDemoTest, KeyPresses) {
WaterfallDemo demo(escher::test::GetEscher()->GetWeakPtr(), kScenicScreenshotFormat, 0, nullptr);
escher::PaperRenderer* renderer = demo.renderer();
// "D" means toggle debug visualization.
{
const bool debugging = renderer->config().debug;
demo.HandleKeyPress("D");
EXPECT_NE(debugging, renderer->config().debug);
demo.HandleKeyPress("D");
EXPECT_EQ(debugging, renderer->config().debug);
}
// "M" means cycle through multisample sample count.
{
const std::set<uint8_t> expected_sample_counts(demo.allowed_sample_counts().begin(),
demo.allowed_sample_counts().end());
EXPECT_EQ(expected_sample_counts.size(), demo.allowed_sample_counts().size());
EXPECT_FALSE(expected_sample_counts.empty());
std::set<uint8_t> observed_sample_counts;
for (size_t i = 0; i < expected_sample_counts.size(); ++i) {
demo.HandleKeyPress("M");
observed_sample_counts.insert(renderer->config().msaa_sample_count);
}
EXPECT_EQ(expected_sample_counts, observed_sample_counts);
}
}