5 #include "flutter/testing/testing.h"
6 #include "gtest/gtest.h"
9 #include "impeller/renderer/backend/vulkan/test/mock_vulkan.h"
10 #include "vulkan/vulkan_enums.hpp"
15 TEST(RenderPassBuilder, CreatesRenderPassWithNoDepthStencil) {
17 auto const context = MockVulkanContextBuilder().Build();
24 auto render_pass = builder.
Build(context->GetDevice());
26 EXPECT_TRUE(!!render_pass);
30 TEST(RenderPassBuilder, RenderPassWithLoadOpUsesCurrentLayout) {
32 auto const context = MockVulkanContextBuilder().Build();
37 vk::ImageLayout::eColorAttachmentOptimal);
39 auto render_pass = builder.
Build(context->GetDevice());
41 EXPECT_TRUE(!!render_pass);
43 std::optional<vk::AttachmentDescription> maybe_color = builder.
GetColor0();
44 ASSERT_TRUE(maybe_color.has_value());
45 if (!maybe_color.has_value()) {
48 vk::AttachmentDescription color = maybe_color.value();
50 EXPECT_EQ(color.initialLayout, vk::ImageLayout::eColorAttachmentOptimal);
51 EXPECT_EQ(color.finalLayout, vk::ImageLayout::eShaderReadOnlyOptimal);
52 EXPECT_EQ(color.loadOp, vk::AttachmentLoadOp::eLoad);
53 EXPECT_EQ(color.storeOp, vk::AttachmentStoreOp::eStore);
56 TEST(RenderPassBuilder, CreatesRenderPassWithCombinedDepthStencil) {
58 auto const context = MockVulkanContextBuilder().Build();
68 auto render_pass = builder.
Build(context->GetDevice());
70 EXPECT_TRUE(!!render_pass);
72 std::optional<vk::AttachmentDescription> maybe_color = builder.
GetColor0();
73 ASSERT_TRUE(maybe_color.has_value());
74 if (!maybe_color.has_value()) {
77 vk::AttachmentDescription color = maybe_color.value();
79 EXPECT_EQ(color.initialLayout, vk::ImageLayout::eUndefined);
80 EXPECT_EQ(color.finalLayout, vk::ImageLayout::eShaderReadOnlyOptimal);
81 EXPECT_EQ(color.loadOp, vk::AttachmentLoadOp::eClear);
82 EXPECT_EQ(color.storeOp, vk::AttachmentStoreOp::eStore);
84 std::optional<vk::AttachmentDescription> maybe_depth_stencil =
86 ASSERT_TRUE(maybe_depth_stencil.has_value());
87 if (!maybe_depth_stencil.has_value()) {
90 vk::AttachmentDescription depth_stencil = maybe_depth_stencil.value();
92 EXPECT_EQ(depth_stencil.initialLayout, vk::ImageLayout::eUndefined);
93 EXPECT_EQ(depth_stencil.finalLayout,
94 vk::ImageLayout::eDepthStencilAttachmentOptimal);
95 EXPECT_EQ(depth_stencil.loadOp, vk::AttachmentLoadOp::eDontCare);
96 EXPECT_EQ(depth_stencil.storeOp, vk::AttachmentStoreOp::eDontCare);
97 EXPECT_EQ(depth_stencil.stencilLoadOp, vk::AttachmentLoadOp::eDontCare);
98 EXPECT_EQ(depth_stencil.stencilStoreOp, vk::AttachmentStoreOp::eDontCare);
101 TEST(RenderPassBuilder, CreatesRenderPassWithOnlyStencil) {
103 auto const context = MockVulkanContextBuilder().Build();
112 auto render_pass = builder.
Build(context->GetDevice());
114 EXPECT_TRUE(!!render_pass);
116 std::optional<vk::AttachmentDescription> maybe_depth_stencil =
118 ASSERT_TRUE(maybe_depth_stencil.has_value());
119 if (!maybe_depth_stencil.has_value()) {
122 vk::AttachmentDescription depth_stencil = maybe_depth_stencil.value();
124 EXPECT_EQ(depth_stencil.initialLayout, vk::ImageLayout::eUndefined);
125 EXPECT_EQ(depth_stencil.finalLayout,
126 vk::ImageLayout::eDepthStencilAttachmentOptimal);
127 EXPECT_EQ(depth_stencil.loadOp, vk::AttachmentLoadOp::eDontCare);
128 EXPECT_EQ(depth_stencil.storeOp, vk::AttachmentStoreOp::eDontCare);
129 EXPECT_EQ(depth_stencil.stencilLoadOp, vk::AttachmentLoadOp::eDontCare);
130 EXPECT_EQ(depth_stencil.stencilStoreOp, vk::AttachmentStoreOp::eDontCare);
133 TEST(RenderPassBuilder, CreatesMSAAResolveWithCorrectStore) {
135 auto const context = MockVulkanContextBuilder().Build();
142 auto render_pass = builder.
Build(context->GetDevice());
144 EXPECT_TRUE(!!render_pass);
147 ASSERT_TRUE(maybe_color.has_value());
148 if (!maybe_color.has_value()) {
151 vk::AttachmentDescription color = maybe_color.value();
154 EXPECT_EQ(color.initialLayout, vk::ImageLayout::eUndefined);
155 EXPECT_EQ(color.finalLayout, vk::ImageLayout::eGeneral);
156 EXPECT_EQ(color.loadOp, vk::AttachmentLoadOp::eClear);
157 EXPECT_EQ(color.storeOp, vk::AttachmentStoreOp::eDontCare);
160 ASSERT_TRUE(maybe_resolve.has_value());
161 if (!maybe_resolve.has_value()) {
164 vk::AttachmentDescription resolve = maybe_resolve.value();
167 EXPECT_EQ(resolve.initialLayout, vk::ImageLayout::eUndefined);
168 EXPECT_EQ(resolve.finalLayout, vk::ImageLayout::eShaderReadOnlyOptimal);
169 EXPECT_EQ(resolve.loadOp, vk::AttachmentLoadOp::eClear);
170 EXPECT_EQ(resolve.storeOp, vk::AttachmentStoreOp::eStore);
std::optional< vk::AttachmentDescription > GetColor0() const
RenderPassBuilderVK & SetDepthStencilAttachment(PixelFormat format, SampleCount sample_count, LoadAction load_action, StoreAction store_action)
RenderPassBuilderVK & SetStencilAttachment(PixelFormat format, SampleCount sample_count, LoadAction load_action, StoreAction store_action)
const std::optional< vk::AttachmentDescription > & GetDepthStencil() const
RenderPassBuilderVK & SetColorAttachment(size_t index, PixelFormat format, SampleCount sample_count, LoadAction load_action, StoreAction store_action, vk::ImageLayout current_layout=vk::ImageLayout::eUndefined, bool is_swapchain=false)
vk::UniqueRenderPass Build(const vk::Device &device) const
std::optional< vk::AttachmentDescription > GetColor0Resolve() const
TEST(AllocationSizeTest, CanCreateTypedAllocations)