89TEST(ShaderBundleTest, ParseShaderBundleConfigReturnsExpectedConfig) {
92 std::stringstream
error;
94 ASSERT_TRUE(result.has_value());
95 ASSERT_STREQ(
error.str().c_str(),
"");
98 auto maybe_vertex = result->find(
"UnlitVertex");
99 auto maybe_fragment = result->find(
"UnlitFragment");
100 ASSERT_TRUE(maybe_vertex != result->end());
101 ASSERT_TRUE(maybe_fragment != result->end());
102 auto vertex = maybe_vertex->second;
103 auto fragment = maybe_fragment->second;
108 EXPECT_STREQ(vertex.entry_point.c_str(),
"main");
109 EXPECT_STREQ(vertex.source_file_name.c_str(),
110 "shaders/flutter_gpu_unlit.vert");
114 EXPECT_STREQ(fragment.entry_point.c_str(),
"main");
115 EXPECT_STREQ(fragment.source_file_name.c_str(),
116 "shaders/flutter_gpu_unlit.frag");
131TEST(ShaderBundleTest, GenerateShaderBundleFlatbufferProducesCorrectResult) {
134 "{\"UnlitFragment\": {\"type\": \"fragment\", \"file\": \"" +
136 "/flutter_gpu_unlit.frag\"}, \"UnlitVertex\": {\"type\": "
137 "\"vertex\", \"file\": \"" +
138 fixtures_path +
"/flutter_gpu_unlit.vert\"}}";
144 std::optional<fb::shaderbundle::ShaderBundleT> bundle =
146 ASSERT_TRUE(bundle.has_value());
149 const auto& shaders = bundle->shaders;
151 const auto* vertex =
FindByName(shaders,
"UnlitVertex");
152 const auto* fragment =
FindByName(shaders,
"UnlitFragment");
153 ASSERT_NE(vertex,
nullptr);
154 ASSERT_NE(fragment,
nullptr);
160 EXPECT_STREQ(vertex->metal_desktop->entrypoint.c_str(),
161 "flutter_gpu_unlit_vertex_main");
162 EXPECT_EQ(vertex->metal_desktop->stage,
163 fb::shaderbundle::ShaderStage::kVertex);
166 ASSERT_EQ(vertex->metal_desktop->inputs.size(), 1u);
167 const auto& v_in_position = vertex->metal_desktop->inputs[0];
168 EXPECT_STREQ(v_in_position->name.c_str(),
"position");
169 EXPECT_EQ(v_in_position->location, 0u);
170 EXPECT_EQ(v_in_position->set, 0u);
171 EXPECT_EQ(v_in_position->binding, 0u);
172 EXPECT_EQ(v_in_position->type, fb::shaderbundle::InputDataType::kFloat);
173 EXPECT_EQ(v_in_position->bit_width, 32u);
174 EXPECT_EQ(v_in_position->vec_size, 2u);
175 EXPECT_EQ(v_in_position->columns, 1u);
176 EXPECT_EQ(v_in_position->offset, 0u);
179 ASSERT_EQ(vertex->metal_desktop->uniform_structs.size(), 1u);
180 const auto* vert_info =
181 FindByName(vertex->metal_desktop->uniform_structs,
"VertInfo");
182 ASSERT_NE(vert_info,
nullptr);
183 EXPECT_EQ(vert_info->ext_res_0, 0u);
184 EXPECT_EQ(vert_info->set, 0u);
185 EXPECT_EQ(vert_info->binding, 0u);
186 ASSERT_EQ(vert_info->fields.size(), 2u);
187 const auto& mvp = vert_info->fields[0];
188 EXPECT_STREQ(mvp->name.c_str(),
"mvp");
189 EXPECT_EQ(mvp->type, fb::shaderbundle::UniformDataType::kFloat);
190 EXPECT_EQ(mvp->offset_in_bytes, 0u);
191 EXPECT_EQ(mvp->element_size_in_bytes, 64u);
192 EXPECT_EQ(mvp->total_size_in_bytes, 64u);
193 EXPECT_EQ(mvp->array_elements, 0u);
194 EXPECT_EQ(mvp->vec_size, 4u);
195 EXPECT_EQ(mvp->columns, 4u);
196 const auto& color = vert_info->fields[1];
197 EXPECT_STREQ(color->name.c_str(),
"color");
198 EXPECT_EQ(color->type, fb::shaderbundle::UniformDataType::kFloat);
199 EXPECT_EQ(color->offset_in_bytes, 64u);
200 EXPECT_EQ(color->element_size_in_bytes, 16u);
201 EXPECT_EQ(color->total_size_in_bytes, 16u);
202 EXPECT_EQ(color->array_elements, 0u);
203 EXPECT_EQ(color->vec_size, 4u);
204 EXPECT_EQ(color->columns, 1u);
210 EXPECT_STREQ(fragment->metal_desktop->entrypoint.c_str(),
211 "flutter_gpu_unlit_fragment_main");
212 EXPECT_EQ(fragment->metal_desktop->stage,
213 fb::shaderbundle::ShaderStage::kFragment);
216 ASSERT_EQ(fragment->metal_desktop->inputs.size(), 0u);
219 ASSERT_EQ(fragment->metal_desktop->inputs.size(), 0u);
223 GenerateShaderBundleFlatbufferReportsSourceFilesAsDependencies) {
225 const std::string fragment_path = fixtures_path +
"/flutter_gpu_unlit.frag";
226 const std::string vertex_path = fixtures_path +
"/flutter_gpu_unlit.vert";
228 "{\"UnlitFragment\": {\"type\": \"fragment\", \"file\":\"" +
230 "\"}, \"UnlitVertex\": {\"type\": \"vertex\", \"file\": \"" +
231 vertex_path +
"\"}}";
237 std::set<std::string> dependencies;
238 std::optional<fb::shaderbundle::ShaderBundleT> bundle =
240 ASSERT_TRUE(bundle.has_value());
247 EXPECT_NE(dependencies.find(fragment_path), dependencies.end());
248 EXPECT_NE(dependencies.find(vertex_path), dependencies.end());
const uint8_t uint32_t uint32_t GError ** error