Flutter Impeller
impeller::compiler::testing::CompilerTestBase Class Reference

#include <compiler_test.h>

Inheritance diagram for impeller::compiler::testing::CompilerTestBase:
impeller::compiler::testing::CompilerTest impeller::compiler::testing::CompilerTestRuntime impeller::compiler::testing::CompilerTestSkSL

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 }
static std::string GetIntermediatesPath()

◆ ~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) {
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 }
static std::string ReflectionCCName(const char *fixture_name)
static std::string ReflectionJSONName(const char *fixture_name)
static std::string ReflectionHeaderName(const char *fixture_name)
static std::string SLFileName(const char *fixture_name, TargetPlatform platform)
static std::string SPIRVFileName(const char *fixture_name)
SourceType SourceTypeFromFileName(const std::filesystem::path &file_name)
Definition: types.cc:17
std::string EntryPointFunctionNameFromSourceName(const std::filesystem::path &file_name, SourceType type, SourceLanguage source_language, const std::string &entry_point_name)
Definition: types.cc:101
bool TargetPlatformNeedsReflection(TargetPlatform platform)
Definition: types.cc:130
#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: