| Flutter Impeller |

Public Member Functions | List of all members
impeller::compiler::testing::CompilerTestBase Class Reference

`#include <compiler_test.h>`

Inheritance diagram for impeller::compiler::testing::CompilerTestBase:

## Public Member Functions
| CompilerTestBase ()
| ~CompilerTestBase ()
std::unique_ptr< fml::FileMapping > | GetReflectionJson (const char *fixture_name) const
std::unique_ptr< fml::FileMapping > | GetShaderFile (const char *fixture_name, TargetPlatform platform) const
bool | CanCompileAndReflect (const char *fixture_name, SourceType source_type=SourceType::kUnknown, SourceLanguage source_language=SourceLanguage::kGLSL, const char *entry_point_name="main") const

## Detailed Description

Definition at line 18 of file compiler_test.h.

## Constructor & Destructor Documentation

## ◆ CompilerTestBase()

impeller::compiler::testing::CompilerTestBase::CompilerTestBase | ( |  | ) |

Definition at line 26 of file compiler_test.cc.

27 : intermediates_path_(GetIntermediatesPath()) {
28 intermediates_directory_ =
29 fml::OpenDirectory(intermediates_path_.c_str(),
30 true, // create if necessary
31 fml::FilePermission::kReadWrite);
32 FML_CHECK(intermediates_directory_.is_valid());
33 }
impeller::compiler::testing::GetIntermediatesPath
static std::string GetIntermediatesPath()
Definition: compiler_test.cc:16

## ◆ ~CompilerTestBase()

impeller::compiler::testing::CompilerTestBase::~CompilerTestBase | ( |  | ) |

Definition at line 35 of file compiler_test.cc.

35 {
36 intermediates_directory_.reset();
37
38 std::filesystem::remove_all(std::filesystem::path(intermediates_path_));
39 }

## Member Function Documentation

## ◆ CanCompileAndReflect()

bool impeller::compiler::testing::CompilerTestBase::CanCompileAndReflect | ( | const char * | fixture_name,
|  | SourceType | source_type = `SourceType::kUnknown`,
|  | SourceLanguage | source_language = `SourceLanguage::kGLSL`,
|  | const char * | entry_point_name = `"main"`
| ) |  | const

Definition at line 87 of file compiler_test.cc.

91 {
92 std::shared_ptr<fml::Mapping> fixture =
93 flutter::testing::OpenFixtureAsMapping(fixture_name);
94 if (!fixture || !fixture->GetMapping()) {
95 VALIDATION_LOG << "Could not find shader in fixtures: " << fixture_name;
96 return false;
97 }
98
99 SourceOptions source_options(fixture_name, source_type);
100 source_options.target_platform = GetParam();
101 source_options.source_language = source_language;
102 source_options.working_directory = std::make_shared<fml::UniqueFD>(
103 flutter::testing::OpenFixturesDirectory());
104 source_options.entry_point_name = EntryPointFunctionNameFromSourceName(
105 fixture_name, SourceTypeFromFileName(fixture_name), source_language,
106 entry_point_name);
107
108 Reflector::Options reflector_options;
109 reflector_options.header_file_name = ReflectionHeaderName(fixture_name);
110 reflector_options.shader_name = "shader_name";
111
112 Compiler compiler(fixture, source_options, reflector_options);
113 if (!compiler.IsValid()) {
114 VALIDATION_LOG << "Compilation failed: " << compiler.GetErrorMessages();
115 return false;
116 }
117
118 auto spirv_assembly = compiler.GetSPIRVAssembly();
119 if (!spirv_assembly) {
120 VALIDATION_LOG << "No spirv was generated.";
121 return false;
122 }
123
124 if (!fml::WriteAtomically(intermediates_directory_,
125 SPIRVFileName(fixture_name).c_str(),
126 *spirv_assembly)) {
127 VALIDATION_LOG << "Could not write SPIRV intermediates.";
128 return false;
129 }
130
131 auto sl_source = compiler.GetSLShaderSource();
132 if (!sl_source) {
133 VALIDATION_LOG << "No SL source was generated.";
134 return false;
135 }
136
137 if (!fml::WriteAtomically(intermediates_directory_,
138 SLFileName(fixture_name, GetParam()).c_str(),
139 *sl_source)) {
140 VALIDATION_LOG << "Could not write SL intermediates.";
141 return false;
142 }
143
144 if (TargetPlatformNeedsReflection(GetParam())) {
145 auto reflector = compiler.GetReflector();
146 if (!reflector) {
147 VALIDATION_LOG
148 << "No reflector was found for target platform SL compiler.";
149 return false;
150 }
151
152 auto reflection_json = reflector->GetReflectionJSON();
153 auto reflection_header = reflector->GetReflectionHeader();
154 auto reflection_source = reflector->GetReflectionCC();
155
156 if (!reflection_json) {
157 VALIDATION_LOG << "Reflection JSON was not found.";
158 return false;
159 }
160
161 if (!reflection_header) {
162 VALIDATION_LOG << "Reflection header was not found.";
163 return false;
164 }
165
166 if (!reflection_source) {
167 VALIDATION_LOG << "Reflection source was not found.";
168 return false;
169 }
170
171 if (!fml::WriteAtomically(intermediates_directory_,
172 ReflectionHeaderName(fixture_name).c_str(),
173 *reflection_header)) {
174 VALIDATION_LOG << "Could not write reflection header intermediates.";
175 return false;
176 }
177
178 if (!fml::WriteAtomically(intermediates_directory_,
179 ReflectionCCName(fixture_name).c_str(),
180 *reflection_source)) {
181 VALIDATION_LOG << "Could not write reflection CC intermediates.";
182 return false;
183 }
184
185 if (!fml::WriteAtomically(intermediates_directory_,
186 ReflectionJSONName(fixture_name).c_str(),
187 *reflection_json)) {
188 VALIDATION_LOG << "Could not write reflection json intermediates.";
189 return false;
190 }
191 }
192 return true;
193 }
impeller::compiler::testing::ReflectionCCName
static std::string ReflectionCCName(const char *fixture_name)
Definition: compiler_test.cc:47
impeller::compiler::testing::ReflectionJSONName
static std::string ReflectionJSONName(const char *fixture_name)
Definition: compiler_test.cc:53
impeller::compiler::testing::ReflectionHeaderName
static std::string ReflectionHeaderName(const char *fixture_name)
Definition: compiler_test.cc:41
impeller::compiler::testing::SLFileName
static std::string SLFileName(const char *fixture_name, TargetPlatform platform)
Definition: compiler_test.cc:65
impeller::compiler::testing::SPIRVFileName
static std::string SPIRVFileName(const char *fixture_name)
Definition: compiler_test.cc:59
impeller::compiler::SourceTypeFromFileName
SourceType SourceTypeFromFileName(const std::filesystem::path &file_name)
Definition: types.cc:17
impeller::compiler::EntryPointFunctionNameFromSourceName
std::string EntryPointFunctionNameFromSourceName(const std::filesystem::path &file_name, SourceType type, SourceLanguage source_language, const std::string &entry_point_name)
Definition: types.cc:101
impeller::compiler::TargetPlatformNeedsReflection
bool TargetPlatformNeedsReflection(TargetPlatform platform)
Definition: types.cc:130
VALIDATION_LOG
#define VALIDATION_LOG
Definition: validation.h:91

References impeller::compiler::SourceOptions::entry_point_name, impeller::compiler::EntryPointFunctionNameFromSourceName(), impeller::compiler::Compiler::GetErrorMessages(), impeller::compiler::Compiler::GetReflector(), impeller::compiler::Compiler::GetSLShaderSource(), impeller::compiler::Compiler::GetSPIRVAssembly(), impeller::compiler::Reflector::Options::header_file_name, impeller::compiler::Compiler::IsValid(), impeller::compiler::testing::ReflectionCCName(), impeller::compiler::testing::ReflectionHeaderName(), impeller::compiler::testing::ReflectionJSONName(), impeller::compiler::Reflector::Options::shader_name, impeller::compiler::testing::SLFileName(), impeller::compiler::SourceOptions::source_language, impeller::compiler::SourceTypeFromFileName(), impeller::compiler::testing::SPIRVFileName(), impeller::compiler::SourceOptions::target_platform, impeller::compiler::TargetPlatformNeedsReflection(), VALIDATION_LOG, and impeller::compiler::SourceOptions::working_directory.

## ◆ GetReflectionJson()

std::unique_ptr< fml::FileMapping > impeller::compiler::testing::CompilerTestBase::GetReflectionJson | ( | const char * | fixture_name | ) | const

Definition at line 72 of file compiler_test.cc.

73 {
74 auto filename = ReflectionJSONName(fixture_name);
75 auto fd = fml::OpenFileReadOnly(intermediates_directory_, filename.c_str());
76 return fml::FileMapping::CreateReadOnly(fd);
77 }

References impeller::compiler::testing::ReflectionJSONName().

## ◆ GetShaderFile()

std::unique_ptr< fml::FileMapping > impeller::compiler::testing::CompilerTestBase::GetShaderFile | ( | const char * | fixture_name,
|  | TargetPlatform | platform
| ) |  | const

Definition at line 79 of file compiler_test.cc.

81 {
82 auto filename = SLFileName(fixture_name, platform);
83 auto fd = fml::OpenFileReadOnly(intermediates_directory_, filename.c_str());
84 return fml::FileMapping::CreateReadOnly(fd);
85 }

References impeller::compiler::testing::SLFileName().

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

- impeller/compiler/compiler_test.h
- impeller/compiler/compiler_test.cc