7 #include "flutter/fml/make_copyable.h"
8 #include "flutter/impeller/fixtures/simple.vert.h"
9 #include "flutter/testing/testing.h"
28 if (!BackendSupportsFragmentProgram()) {
29 GTEST_SKIP_(
"This backend doesn't support runtime effects.");
32 const std::shared_ptr<fml::Mapping> fixture =
33 flutter::testing::OpenFixtureAsMapping(
"ink_sparkle.frag.iplr");
35 ASSERT_GT(fixture->GetSize(), 0u);
38 ASSERT_TRUE(stage->IsValid());
43 if (!BackendSupportsFragmentProgram()) {
44 GTEST_SKIP_(
"This backend doesn't support runtime effects.");
48 const std::shared_ptr<fml::Mapping> fixture =
49 flutter::testing::OpenFixtureAsMapping(
"ink_sparkle.frag.iplr");
51 auto junk_allocation = std::make_shared<Allocation>();
52 ASSERT_TRUE(junk_allocation->Truncate(fixture->GetSize(),
false));
55 ::memset(junk_allocation->GetBuffer(), 127, junk_allocation->GetLength());
62 if (!BackendSupportsFragmentProgram()) {
63 GTEST_SKIP_(
"This backend doesn't support runtime effects.");
66 const std::shared_ptr<fml::Mapping> fixture =
67 flutter::testing::OpenFixtureAsMapping(
"ink_sparkle.frag.iplr");
69 ASSERT_GT(fixture->GetSize(), 0u);
73 ASSERT_TRUE(stage->IsValid());
74 ASSERT_EQ(stage->GetUniforms().size(), 17u);
76 auto uni = stage->GetUniform(
"u_color");
77 ASSERT_NE(uni,
nullptr);
78 ASSERT_EQ(uni->dimensions.rows, 4u);
79 ASSERT_EQ(uni->dimensions.cols, 1u);
80 ASSERT_EQ(uni->location, 0u);
84 auto uni = stage->GetUniform(
"u_alpha");
85 ASSERT_NE(uni,
nullptr);
86 ASSERT_EQ(uni->dimensions.rows, 1u);
87 ASSERT_EQ(uni->dimensions.cols, 1u);
88 ASSERT_EQ(uni->location, 1u);
92 auto uni = stage->GetUniform(
"u_sparkle_color");
93 ASSERT_NE(uni,
nullptr);
94 ASSERT_EQ(uni->dimensions.rows, 4u);
95 ASSERT_EQ(uni->dimensions.cols, 1u);
96 ASSERT_EQ(uni->location, 2u);
100 auto uni = stage->GetUniform(
"u_sparkle_alpha");
101 ASSERT_NE(uni,
nullptr);
102 ASSERT_EQ(uni->dimensions.rows, 1u);
103 ASSERT_EQ(uni->dimensions.cols, 1u);
104 ASSERT_EQ(uni->location, 3u);
108 auto uni = stage->GetUniform(
"u_blur");
109 ASSERT_NE(uni,
nullptr);
110 ASSERT_EQ(uni->dimensions.rows, 1u);
111 ASSERT_EQ(uni->dimensions.cols, 1u);
112 ASSERT_EQ(uni->location, 4u);
116 auto uni = stage->GetUniform(
"u_radius_scale");
117 ASSERT_NE(uni,
nullptr);
118 ASSERT_EQ(uni->dimensions.rows, 1u);
119 ASSERT_EQ(uni->dimensions.cols, 1u);
120 ASSERT_EQ(uni->location, 6u);
124 auto uni = stage->GetUniform(
"u_max_radius");
125 ASSERT_NE(uni,
nullptr);
126 ASSERT_EQ(uni->dimensions.rows, 1u);
127 ASSERT_EQ(uni->dimensions.cols, 1u);
128 ASSERT_EQ(uni->location, 7u);
132 auto uni = stage->GetUniform(
"u_resolution_scale");
133 ASSERT_NE(uni,
nullptr);
134 ASSERT_EQ(uni->dimensions.rows, 2u);
135 ASSERT_EQ(uni->dimensions.cols, 1u);
136 ASSERT_EQ(uni->location, 8u);
140 auto uni = stage->GetUniform(
"u_noise_scale");
141 ASSERT_NE(uni,
nullptr);
142 ASSERT_EQ(uni->dimensions.rows, 2u);
143 ASSERT_EQ(uni->dimensions.cols, 1u);
144 ASSERT_EQ(uni->location, 9u);
148 auto uni = stage->GetUniform(
"u_noise_phase");
149 ASSERT_NE(uni,
nullptr);
150 ASSERT_EQ(uni->dimensions.rows, 1u);
151 ASSERT_EQ(uni->dimensions.cols, 1u);
152 ASSERT_EQ(uni->location, 10u);
157 auto uni = stage->GetUniform(
"u_circle1");
158 ASSERT_NE(uni,
nullptr);
159 ASSERT_EQ(uni->dimensions.rows, 2u);
160 ASSERT_EQ(uni->dimensions.cols, 1u);
161 ASSERT_EQ(uni->location, 11u);
165 auto uni = stage->GetUniform(
"u_circle2");
166 ASSERT_NE(uni,
nullptr);
167 ASSERT_EQ(uni->dimensions.rows, 2u);
168 ASSERT_EQ(uni->dimensions.cols, 1u);
169 ASSERT_EQ(uni->location, 12u);
173 auto uni = stage->GetUniform(
"u_circle3");
174 ASSERT_NE(uni,
nullptr);
175 ASSERT_EQ(uni->dimensions.rows, 2u);
176 ASSERT_EQ(uni->dimensions.cols, 1u);
177 ASSERT_EQ(uni->location, 13u);
181 auto uni = stage->GetUniform(
"u_rotation1");
182 ASSERT_NE(uni,
nullptr);
183 ASSERT_EQ(uni->dimensions.rows, 2u);
184 ASSERT_EQ(uni->dimensions.cols, 1u);
185 ASSERT_EQ(uni->location, 14u);
189 auto uni = stage->GetUniform(
"u_rotation2");
190 ASSERT_NE(uni,
nullptr);
191 ASSERT_EQ(uni->dimensions.rows, 2u);
192 ASSERT_EQ(uni->dimensions.cols, 1u);
193 ASSERT_EQ(uni->location, 15u);
197 auto uni = stage->GetUniform(
"u_rotation3");
198 ASSERT_NE(uni,
nullptr);
199 ASSERT_EQ(uni->dimensions.rows, 2u);
200 ASSERT_EQ(uni->dimensions.cols, 1u);
201 ASSERT_EQ(uni->location, 16u);
207 if (!BackendSupportsFragmentProgram()) {
208 GTEST_SKIP_(
"This backend doesn't support runtime effects.");
211 const std::shared_ptr<fml::Mapping> fixture =
212 flutter::testing::OpenFixtureAsMapping(
"ink_sparkle.frag.iplr");
213 ASSERT_TRUE(fixture);
214 ASSERT_GT(fixture->GetSize(), 0u);
217 ASSERT_TRUE(stage->IsValid());
218 std::promise<bool> registration;
219 auto future = registration.get_future();
220 auto library = GetContext()->GetShaderLibrary();
221 library->RegisterFunction(
222 stage->GetEntrypoint(),
224 stage->GetCodeMapping(),
225 fml::MakeCopyable([reg = std::move(registration)](
bool result)
mutable {
226 reg.set_value(result);
228 ASSERT_TRUE(future.get());
232 ASSERT_NE(
function,
nullptr);
241 ASSERT_EQ(
function,
nullptr);
246 if (!BackendSupportsFragmentProgram()) {
247 GTEST_SKIP_(
"This backend doesn't support runtime effects.");
249 auto stages = OpenAssetAsRuntimeStage(
"ink_sparkle.frag.iplr");
253 ASSERT_NE(stage,
nullptr);
254 ASSERT_TRUE(RegisterStage(*stage));
255 auto library = GetContext()->GetShaderLibrary();
256 using VS = SimpleVertexShader;
258 desc.
SetLabel(
"Runtime Stage InkSparkle");
263 auto vertex_descriptor = std::make_shared<VertexDescriptor>();
264 vertex_descriptor->SetStageInputs(VS::kAllShaderStageInputs,
265 VS::kInterleavedBufferLayout);
269 color0.
format = GetContext()->GetCapabilities()->GetDefaultColorFormat();
274 const auto stencil_fmt =
275 GetContext()->GetCapabilities()->GetDefaultStencilFormat();
277 auto pipeline = GetContext()->GetPipelineLibrary()->GetPipeline(desc).Get();
278 ASSERT_NE(pipeline,
nullptr);
282 auto stages = OpenAssetAsRuntimeStage(
"ink_sparkle.frag.iplr");