55 const std::shared_ptr<fml::Mapping> fixture =
58 ASSERT_GT(fixture->GetSize(), 0u);
62 ASSERT_TRUE(stage->IsValid());
63 switch (GetBackend()) {
67 ASSERT_EQ(stage->GetUniforms().size(), 17u);
69 auto uni = stage->GetUniform(
"u_color");
70 ASSERT_NE(uni,
nullptr);
71 EXPECT_EQ(uni->dimensions.rows, 4u);
72 EXPECT_EQ(uni->dimensions.cols, 1u);
73 EXPECT_EQ(uni->location, 0u);
77 auto uni = stage->GetUniform(
"u_alpha");
78 ASSERT_NE(uni,
nullptr);
79 EXPECT_EQ(uni->dimensions.rows, 1u);
80 EXPECT_EQ(uni->dimensions.cols, 1u);
81 EXPECT_EQ(uni->location, 1u);
85 auto uni = stage->GetUniform(
"u_sparkle_color");
86 ASSERT_NE(uni,
nullptr);
87 EXPECT_EQ(uni->dimensions.rows, 4u);
88 EXPECT_EQ(uni->dimensions.cols, 1u);
89 EXPECT_EQ(uni->location, 2u);
93 auto uni = stage->GetUniform(
"u_sparkle_alpha");
94 ASSERT_NE(uni,
nullptr);
95 EXPECT_EQ(uni->dimensions.rows, 1u);
96 EXPECT_EQ(uni->dimensions.cols, 1u);
97 EXPECT_EQ(uni->location, 3u);
101 auto uni = stage->GetUniform(
"u_blur");
102 ASSERT_NE(uni,
nullptr);
103 EXPECT_EQ(uni->dimensions.rows, 1u);
104 EXPECT_EQ(uni->dimensions.cols, 1u);
105 EXPECT_EQ(uni->location, 4u);
109 auto uni = stage->GetUniform(
"u_radius_scale");
110 ASSERT_NE(uni,
nullptr);
111 EXPECT_EQ(uni->dimensions.rows, 1u);
112 EXPECT_EQ(uni->dimensions.cols, 1u);
113 EXPECT_EQ(uni->location, 6u);
117 auto uni = stage->GetUniform(
"u_max_radius");
118 ASSERT_NE(uni,
nullptr);
119 EXPECT_EQ(uni->dimensions.rows, 1u);
120 EXPECT_EQ(uni->dimensions.cols, 1u);
121 EXPECT_EQ(uni->location, 7u);
125 auto uni = stage->GetUniform(
"u_resolution_scale");
126 ASSERT_NE(uni,
nullptr);
127 EXPECT_EQ(uni->dimensions.rows, 2u);
128 EXPECT_EQ(uni->dimensions.cols, 1u);
129 EXPECT_EQ(uni->location, 8u);
133 auto uni = stage->GetUniform(
"u_noise_scale");
134 ASSERT_NE(uni,
nullptr);
135 EXPECT_EQ(uni->dimensions.rows, 2u);
136 EXPECT_EQ(uni->dimensions.cols, 1u);
137 EXPECT_EQ(uni->location, 9u);
141 auto uni = stage->GetUniform(
"u_noise_phase");
142 ASSERT_NE(uni,
nullptr);
143 EXPECT_EQ(uni->dimensions.rows, 1u);
144 EXPECT_EQ(uni->dimensions.cols, 1u);
145 EXPECT_EQ(uni->location, 10u);
150 auto uni = stage->GetUniform(
"u_circle1");
151 ASSERT_NE(uni,
nullptr);
152 EXPECT_EQ(uni->dimensions.rows, 2u);
153 EXPECT_EQ(uni->dimensions.cols, 1u);
154 EXPECT_EQ(uni->location, 11u);
158 auto uni = stage->GetUniform(
"u_circle2");
159 ASSERT_NE(uni,
nullptr);
160 EXPECT_EQ(uni->dimensions.rows, 2u);
161 EXPECT_EQ(uni->dimensions.cols, 1u);
162 EXPECT_EQ(uni->location, 12u);
166 auto uni = stage->GetUniform(
"u_circle3");
167 ASSERT_NE(uni,
nullptr);
168 EXPECT_EQ(uni->dimensions.rows, 2u);
169 EXPECT_EQ(uni->dimensions.cols, 1u);
170 EXPECT_EQ(uni->location, 13u);
174 auto uni = stage->GetUniform(
"u_rotation1");
175 ASSERT_NE(uni,
nullptr);
176 EXPECT_EQ(uni->dimensions.rows, 2u);
177 EXPECT_EQ(uni->dimensions.cols, 1u);
178 EXPECT_EQ(uni->location, 14u);
182 auto uni = stage->GetUniform(
"u_rotation2");
183 ASSERT_NE(uni,
nullptr);
184 EXPECT_EQ(uni->dimensions.rows, 2u);
185 EXPECT_EQ(uni->dimensions.cols, 1u);
186 EXPECT_EQ(uni->location, 15u);
190 auto uni = stage->GetUniform(
"u_rotation3");
191 ASSERT_NE(uni,
nullptr);
192 EXPECT_EQ(uni->dimensions.rows, 2u);
193 EXPECT_EQ(uni->dimensions.cols, 1u);
194 EXPECT_EQ(uni->location, 16u);
200 EXPECT_EQ(stage->GetUniforms().size(), 1u);
204 EXPECT_EQ(uni->struct_float_count, 32u);
215 EXPECT_EQ(uni->GetSize(), 144u);
216 std::vector<uint8_t> layout(uni->GetSize() /
sizeof(
float), 1);
222 EXPECT_THAT(uni->struct_layout, ::testing::ElementsAreArray(layout));
229 const std::shared_ptr<fml::Mapping> fixture =
231 ASSERT_TRUE(fixture);
232 ASSERT_GT(fixture->GetSize(), 0u);
235 ASSERT_TRUE(stage->IsValid());
236 std::promise<bool> registration;
237 auto future = registration.get_future();
238 auto library = GetContext()->GetShaderLibrary();
239 library->RegisterFunction(
240 stage->GetEntrypoint(),
242 stage->GetCodeMapping(),
244 reg.set_value(result);
246 ASSERT_TRUE(future.get());
264 auto stages = OpenAssetAsRuntimeStage(
"ink_sparkle.frag.iplr");
268 ASSERT_NE(stage,
nullptr);
269 ASSERT_TRUE(RegisterStage(*stage));
270 auto library = GetContext()->GetShaderLibrary();
271 using VS = RuntimeEffectVertexShader;
273 desc.SetLabel(
"Runtime Stage InkSparkle");
274 desc.AddStageEntrypoint(
276 desc.AddStageEntrypoint(
278 auto vertex_descriptor = std::make_shared<VertexDescriptor>();
279 vertex_descriptor->SetStageInputs(VS::kAllShaderStageInputs,
280 VS::kInterleavedBufferLayout);
282 std::array<DescriptorSetLayout, 2> descriptor_set_layouts = {
283 VS::kDescriptorSetLayouts[0],
290 vertex_descriptor->RegisterDescriptorSetLayouts(descriptor_set_layouts);
292 desc.SetVertexDescriptor(std::move(vertex_descriptor));
294 color0.
format = GetContext()->GetCapabilities()->GetDefaultColorFormat();
297 desc.SetColorAttachmentDescriptor(0u, color0);
298 desc.SetStencilAttachmentDescriptors(stencil0);
299 const auto stencil_fmt =
300 GetContext()->GetCapabilities()->GetDefaultStencilFormat();
301 desc.SetStencilPixelFormat(stencil_fmt);
302 auto pipeline = GetContext()->GetPipelineLibrary()->GetPipeline(desc).Get();
303 ASSERT_NE(pipeline,
nullptr);