Flutter Engine
 
Loading...
Searching...
No Matches
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::MappingCreateMapping () 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

References type.

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}
GLenum type
const char * name
Definition fuchsia.cc:49

References name, and 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}
static std::unique_ptr< FileMapping > CreateReadOnly(const std::string &path)
Definition mapping.cc:20
bool AddShader(ArchiveShaderType type, std::string name, std::shared_ptr< fml::Mapping > mapping)
#define FML_LOG(severity)
Definition logging.h:101
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
Definition switch_defs.h:52
std::optional< ArchiveShaderType > InferShaderTypefromFileExtension(const std::filesystem::path &path)

References AddShader(), fml::FileMapping::CreateReadOnly(), FML_LOG, 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}
constexpr fb::Stage ToStage(ArchiveShaderType type)

References impeller::ToStage().

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


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