13 #include "impeller/shader_bundle/shader_bundle_flatbuffers.h"
14 #include "third_party/json/include/nlohmann/json.hpp"
20 const std::string& bundle_config_json,
21 std::ostream& error_stream) {
22 auto json = nlohmann::json::parse(bundle_config_json,
nullptr,
false);
23 if (json.is_discarded() || !json.is_object()) {
24 error_stream <<
"The shader bundle is not a valid JSON object."
30 for (
auto& [shader_name, shader_value] : json.items()) {
31 if (bundle.find(shader_name) != bundle.end()) {
32 error_stream <<
"Duplicate shader \"" << shader_name <<
"\"."
36 if (!shader_value.is_object()) {
37 error_stream <<
"Invalid shader entry \"" << shader_name
38 <<
"\": Entry is not a JSON object." << std::endl;
44 if (!shader_value.contains(
"file")) {
45 error_stream <<
"Invalid shader entry \"" << shader_name
46 <<
"\": Missing required \"file\" field." << std::endl;
51 if (!shader_value.contains(
"type")) {
52 error_stream <<
"Invalid shader entry \"" << shader_name
53 <<
"\": Missing required \"type\" field." << std::endl;
58 error_stream <<
"Invalid shader entry \"" << shader_name
59 <<
"\": Shader type " << shader_value[
"type"]
60 <<
" is unknown." << std::endl;
64 shader.
language = shader_value.contains(
"language")
68 error_stream <<
"Invalid shader entry \"" << shader_name
69 <<
"\": Unknown language type " << shader_value[
"language"]
74 shader.
entry_point = shader_value.contains(
"entry_point")
75 ? shader_value[
"entry_point"]
78 bundle[shader_name] = shader;
86 const std::string& shader_name,
88 auto result = std::make_unique<fb::ShaderT>();
89 result->name = shader_name;
91 std::shared_ptr<fml::FileMapping> source_file_mapping =
93 if (!source_file_mapping) {
94 std::cerr <<
"Could not open file for bundled shader \"" << shader_name
95 <<
"\"." << std::endl;
111 Compiler compiler(source_file_mapping, options, reflector_options);
113 std::cerr <<
"Compilation failed for bundled shader \"" << shader_name
114 <<
"\"." << std::endl;
120 if (reflector ==
nullptr) {
121 std::cerr <<
"Could not create reflector for bundled shader \""
122 << shader_name <<
"\"." << std::endl;
128 std::cerr <<
"Runtime stage information was nil for bundled shader \""
129 << shader_name <<
"\"." << std::endl;
135 if (!result->shader) {
136 std::cerr <<
"Failed to create flatbuffer for bundled shader \""
137 << shader_name <<
"\"." << std::endl;
145 const std::string& bundle_config_json,
151 std::optional<ShaderBundleConfig> bundle_config =
153 if (!bundle_config) {
161 fb::ShaderBundleT shader_bundle;
163 for (
const auto& [shader_name, shader_config] : bundle_config.value()) {
164 std::unique_ptr<fb::ShaderT> shader =
169 shader_bundle.shaders.push_back(std::move(shader));
172 return shader_bundle;
182 if (!shader_bundle.has_value()) {
192 auto builder = std::make_shared<flatbuffers::FlatBufferBuilder>();
194 fb::ShaderBundle::Pack(*builder.get(), &shader_bundle.value()),
195 fb::ShaderBundleIdentifier());
196 auto mapping = std::make_shared<fml::NonOwnedMapping>(
197 builder->GetBufferPointer(), builder->GetSize(),
198 [builder](
auto,
auto) {});
200 auto sl_file_name = std::filesystem::absolute(
201 std::filesystem::current_path() / switches.
sl_file_name);
207 std::cerr <<
"Could not write file to " << switches.
sl_file_name