| Flutter Impeller |

Classes | Public Member Functions | List of all members
impeller::ShaderArchiveWriter Class Reference

`#include <shader_archive_writer.h>`

## Public Member Functions
| ShaderArchiveWriter ()
| ~ShaderArchiveWriter ()
bool | AddShaderAtPath (const std::string &path)
bool | AddShader (ArchiveShaderType type, std::string name, std::shared_ptr< fml::Mapping > mapping)
std::shared_ptr< fml::Mapping > | CreateMapping () const

## Detailed Description

Definition at line 17 of file shader_archive_writer.h.

## Constructor & Destructor Documentation

## ◆ ShaderArchiveWriter()

impeller::ShaderArchiveWriter::ShaderArchiveWriter | ( |  | ) |
| default

## ◆ ~ShaderArchiveWriter()

impeller::ShaderArchiveWriter::~ShaderArchiveWriter | ( |  | ) |
| default

## Member Function Documentation

## ◆ AddShader()

bool impeller::ShaderArchiveWriter::AddShader | ( | ArchiveShaderType | type,
|  | std::string | name,
|  | std::shared_ptr< fml::Mapping > | mapping
| ) |  |

Definition at line 83 of file shader_archive_writer.cc.

85 {
86 if (name.empty() || !mapping || mapping->GetMapping() == nullptr) {
87 return false;
88 }
89
90 shader_descriptions_.emplace_back(
91 ShaderDescription{type, std::move(name), std::move(mapping)});
92 return true;
93 }
type
GLenum type
Definition: blit_command_gles.cc:151

References type.

Referenced by AddShaderAtPath(), and impeller::testing::TEST().

## ◆ AddShaderAtPath()

bool impeller::ShaderArchiveWriter::AddShaderAtPath | ( | const std::string & | path | ) |

Definition at line 36 of file shader_archive_writer.cc.

36 {
37 #if FML_OS_QNX
38 return false;
39 #else // FML_OS_QNX
40 std::filesystem::path path(std_path);
41
42 if (path.stem().empty()) {
43 FML_LOG(ERROR) << "File path stem was empty for " << path;
44 return false;
45 }
46
47 if (path.extension() != ".gles" && path.extension() != ".vkspv") {
48 FML_LOG(ERROR) << "File path doesn't have a known shader extension "
49 << path;
50 return false;
51 }
52
53 // Get rid of .gles
54 path = path.replace_extension();
55
56 auto shader_type = InferShaderTypefromFileExtension(path.extension());
57
58 if (!shader_type.has_value()) {
59 FML_LOG(ERROR) << "Could not infer shader type from file extension: "
60 << path.extension().string();
61 return false;
62 }
63
64 // Get rid of the shader type extension (.vert, .frag, etc..).
65 path = path.replace_extension();
66
67 const auto shader_name = path.stem().string();
68 if (shader_name.empty()) {
69 FML_LOG(ERROR) << "Shader name was empty.";
70 return false;
71 }
72
73 auto file_mapping = fml::FileMapping::CreateReadOnly(std_path);
74 if (!file_mapping) {
75 FML_LOG(ERROR) << "File doesn't exist at path: " << path;
76 return false;
77 }
78
79 return AddShader(shader_type.value(), shader_name, std::move(file_mapping));
80 #endif // FML_OS_QNX
81 }
impeller::ShaderArchiveWriter::AddShader
bool AddShader(ArchiveShaderType type, std::string name, std::shared_ptr< fml::Mapping > mapping)
Definition: shader_archive_writer.cc:83
impeller::InferShaderTypefromFileExtension
std::optional< ArchiveShaderType > InferShaderTypefromFileExtension(const std::filesystem::path &path)
Definition: shader_archive_writer.cc:20

References AddShader(), and impeller::InferShaderTypefromFileExtension().

Referenced by impeller::Main().

## ◆ CreateMapping()

std::shared_ptr< fml::Mapping > impeller::ShaderArchiveWriter::CreateMapping | ( |  | ) | const

Definition at line 107 of file shader_archive_writer.cc.

107 {
108 fb::ShaderArchiveT shader_archive;
109 for (const auto& shader_description : shader_descriptions_) {
110 auto mapping = shader_description.mapping;
111 if (!mapping) {
112 return nullptr;
113 }
114 auto desc = std::make_unique<fb::ShaderBlobT>();
115 desc->name = shader_description.name;
116 desc->stage = ToStage(shader_description.type);
117 desc->mapping = {mapping->GetMapping(),
118 mapping->GetMapping() + mapping->GetSize()};
119 shader_archive.items.emplace_back(std::move(desc));
120 }
121 auto builder = std::make_shared<flatbuffers::FlatBufferBuilder>();
122 builder->Finish(fb::ShaderArchive::Pack(*builder.get(), &shader_archive),
123 fb::ShaderArchiveIdentifier());
124 return std::make_shared<fml::NonOwnedMapping>(builder->GetBufferPointer(),
125 builder->GetSize(),
126 [builder](auto, auto) {});
127 }
impeller::ToStage
constexpr fb::Stage ToStage(ArchiveShaderType type)
Definition: shader_archive_writer.cc:95

References impeller::ToStage().

Referenced by impeller::Main(), and impeller::testing::TEST().

The documentation for this class was generated from the following files:

- impeller/shader_archive/shader_archive_writer.h
- impeller/shader_archive/shader_archive_writer.cc