blob: ceddb0097608bb9a0a5729dbb74408e166f91a4b [file] [log] [blame]
// Copyright 2020 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 "src/ui/lib/escher/test/common/paper_renderer_test.h"
#include "src/ui/lib/escher/debug/debug_rects.h"
#include "src/ui/lib/escher/defaults/default_shader_program_factory.h"
#include "src/ui/lib/escher/escher.h"
#include "src/ui/lib/escher/geometry/bounding_box.h"
#include "src/ui/lib/escher/paper/paper_renderer_static_config.h"
#include "src/ui/lib/escher/paper/paper_scene.h"
#include "src/ui/lib/escher/renderer/batch_gpu_uploader.h"
#include "src/ui/lib/escher/scene/viewing_volume.h"
#include "src/ui/lib/escher/types/color.h"
#include "src/ui/lib/escher/types/color_histogram.h"
#include "src/ui/lib/escher/util/image_utils.h"
#include <vulkan/vulkan.hpp>
namespace escher {
namespace test {
void PaperRendererTest::SetUp() {
ReadbackTest::SetUp();
escher()->shader_program_factory()->filesystem()->InitializeWithRealFiles(
kPaperRendererShaderPaths);
PaperRendererConfig config;
auto depth_stencil_format = escher()->device()->caps().GetMatchingDepthStencilFormat();
if (depth_stencil_format.result == vk::Result::eSuccess) {
config.depth_stencil_format = depth_stencil_format.value;
FX_LOGS(INFO) << "Depth stencil format set to " << vk::to_string(config.depth_stencil_format);
} else {
GTEST_SKIP() << "Cannot find a valid depth stencil format, test skipped";
}
renderer_ = PaperRenderer::New(escher(), config);
}
void PaperRendererTest::TearDown() {
renderer_.reset();
ReadbackTest::TearDown();
}
void PaperRendererTest::SetupFrame() {
frame_data_ = NewFrame(vk::ImageLayout::eColorAttachmentOptimal);
gpu_uploader_ = std::make_shared<BatchGpuUploader>(escher(), frame_data_.frame->frame_number());
scene_ = fxl::MakeRefCounted<PaperScene>();
scene_->point_lights.resize(0);
scene_->ambient_light.color = vec3(1, 1, 1);
scene_->bounding_box =
BoundingBox(vec3(0, 0, -200), vec3(kFramebufferWidth, kFramebufferHeight, 1));
const escher::ViewingVolume& volume = ViewingVolume(scene_->bounding_box);
escher::Camera cam = escher::Camera::NewOrtho(volume);
cameras_ = {cam};
};
void PaperRendererTest::TeardownFrame() {
frame_data_.frame->EndFrame(SemaphorePtr(), []() {});
}
void PaperRendererTest::BeginRenderingFrame() {
renderer_->BeginFrame(frame_data_.frame, gpu_uploader_, scene_, cameras_,
frame_data_.color_attachment);
}
void PaperRendererTest::EndRenderingFrame() {
renderer_->FinalizeFrame();
auto upload_semaphore = escher::Semaphore::New(escher()->vk_device());
gpu_uploader_->AddSignalSemaphore(upload_semaphore);
gpu_uploader_->Submit();
renderer_->EndFrame(upload_semaphore);
}
std::vector<uint8_t> PaperRendererTest::GetPixelData() {
return ReadbackFromColorAttachment(frame_data_.frame, vk::ImageLayout::eColorAttachmentOptimal,
vk::ImageLayout::eColorAttachmentOptimal);
};
} // namespace test
} // namespace escher