Flutter Impeller
impeller::compiler Namespace Reference

Namespaces

 testing
 

Classes

class  Compiler
 
struct  CompilerBackend
 
struct  IncludeDir
 
struct  IncluderData
 
class  Includer
 
class  AutoLogger
 
struct  KnownType
 
struct  VertexType
 
struct  StructMember
 
class  Reflector
 
class  RuntimeStageData
 
class  ShaderBundleData
 
struct  SourceOptions
 
class  UniqueIncluder
 Wraps a shared includer so unique includers may be created to satisfy the shaderc API. This is a simple proxy object and does nothing. More...
 
struct  SPIRVCompilerSourceProfile
 
struct  SPIRVCompilerTargetEnv
 
struct  SPIRVCompilerOptions
 
class  SPIRVCompiler
 
class  CompilerSkSL
 
class  Switches
 
struct  UniformDescription
 
struct  InputDescription
 
struct  ShaderConfig
 A shader config parsed as part of a ShaderBundleConfig. More...
 

Typedefs

using ShaderBundleConfig = std::unordered_map< std::string, ShaderConfig >
 

Enumerations

enum class  SourceType {
  kUnknown ,
  kVertexShader ,
  kFragmentShader ,
  kComputeShader
}
 
enum class  TargetPlatform {
  kUnknown ,
  kMetalDesktop ,
  kMetalIOS ,
  kOpenGLES ,
  kOpenGLDesktop ,
  kVulkan ,
  kRuntimeStageMetal ,
  kRuntimeStageGLES ,
  kRuntimeStageGLES3 ,
  kRuntimeStageVulkan ,
  kSkSL
}
 
enum class  SourceLanguage {
  kUnknown ,
  kGLSL ,
  kHLSL
}
 

Functions

static uint32_t ParseMSLVersion (const std::string &msl_version)
 
static CompilerBackend CreateMSLCompiler (const spirv_cross::ParsedIR &ir, const SourceOptions &source_options, std::optional< uint32_t > msl_version_override={})
 
static CompilerBackend CreateVulkanCompiler (const spirv_cross::ParsedIR &ir, const SourceOptions &source_options)
 
static CompilerBackend CreateGLSLCompiler (const spirv_cross::ParsedIR &ir, const SourceOptions &source_options)
 
static CompilerBackend CreateSkSLCompiler (const spirv_cross::ParsedIR &ir, const SourceOptions &source_options)
 
static bool EntryPointMustBeNamedMain (TargetPlatform platform)
 
static CompilerBackend CreateCompiler (const spirv_cross::ParsedIR &ir, const SourceOptions &source_options)
 
static std::string JoinStrings (std::vector< std::string > items, const std::string &separator)
 
static Reflector::Options CreateReflectorOptions (const SourceOptions &options, const Switches &switches)
 
static std::shared_ptr< RuntimeStageData::ShaderCompileSkSL (std::shared_ptr< fml::Mapping > source_file_mapping, const Switches &switches)
 
static bool OutputIPLR (const Switches &switches, const std::shared_ptr< fml::Mapping > &source_file_mapping)
 
static bool OutputSLFile (const Compiler &compiler, const Switches &switches)
 
static bool OutputReflectionData (const Compiler &compiler, const Switches &switches, const SourceOptions &options)
 
static bool OutputDepfile (const Compiler &compiler, const Switches &switches)
 
bool Main (const fml::CommandLine &command_line)
 
static std::string ExecutionModelToString (spv::ExecutionModel model)
 
static std::string StringToShaderStage (const std::string &str)
 
static std::optional< RuntimeStageBackendGetRuntimeStageBackend (TargetPlatform target_platform)
 
static std::string ToString (CompilerBackend::Type type)
 
static std::string TypeNameWithPaddingOfSize (size_t size)
 
static std::optional< KnownTypeReadKnownScalarType (spirv_cross::SPIRType::BaseType type)
 
static size_t GetReflectedStructSize (const std::vector< StructMember > &members)
 Get the reflected struct size. In the vast majority of the cases, this is the same as the declared struct size as given by the compiler. But, additional padding may need to be introduced after the end of the struct to keep in line with the alignment requirement of the individual struct members. This method figures out the actual size of the reflected struct that can be referenced in native code. More...
 
static VertexType VertexTypeFromInputResource (const spirv_cross::Compiler &compiler, const spirv_cross::Resource *resource)
 
static std::optional< fb::Stage > ToStage (spv::ExecutionModel stage)
 
static std::optional< fb::Stage > ToJsonStage (spv::ExecutionModel stage)
 
static std::optional< fb::UniformDataType > ToUniformType (spirv_cross::SPIRType::BaseType type)
 
static std::optional< fb::InputDataType > ToInputType (spirv_cross::SPIRType::BaseType type)
 
static std::optional< uint32_t > ToJsonType (spirv_cross::SPIRType::BaseType type)
 
static std::string RuntimeStageBackendToString (RuntimeStageBackend backend)
 
std::optional< ShaderBundleConfigParseShaderBundleConfig (const std::string &bundle_config_json, std::ostream &error_stream)
 Parse a shader bundle configuration from a given JSON string. More...
 
static std::unique_ptr< fb::shaderbundle::BackendShaderT > GenerateShaderBackendFB (TargetPlatform target_platform, SourceOptions &options, const std::string &shader_name, const ShaderConfig &shader_config)
 
static std::unique_ptr< fb::shaderbundle::ShaderT > GenerateShaderFB (SourceOptions options, const std::string &shader_name, const ShaderConfig &shader_config)
 
std::optional< fb::shaderbundle::ShaderBundleT > GenerateShaderBundleFlatbuffer (const std::string &bundle_config_json, const SourceOptions &options)
 Parses the JSON shader bundle configuration and invokes the compiler multiple times to produce a shader bundle flatbuffer. More...
 
bool GenerateShaderBundle (Switches &switches)
 Parses the JSON shader bundle configuration and invokes the compiler multiple times to produce a shader bundle flatbuffer, which is then output to the sl file. More...
 
static std::optional< fb::shaderbundle::ShaderStage > ToStage (spv::ExecutionModel stage)
 
static std::optional< fb::shaderbundle::UniformDataType > ToUniformType (spirv_cross::SPIRType::BaseType type)
 
static std::optional< fb::shaderbundle::InputDataType > ToInputType (spirv_cross::SPIRType::BaseType type)
 
static void SetDefaultLimitations (shaderc::CompileOptions &compiler_opts)
 
static void SetBindingBaseOffset (shaderc::CompileOptions &options)
 
void report_and_exit (const std::string &msg)
 
static TargetPlatform TargetPlatformFromCommandLine (const fml::CommandLine &command_line)
 
static std::vector< TargetPlatformRuntimeStagesFromCommandLine (const fml::CommandLine &command_line)
 
static SourceType SourceTypeFromCommandLine (const fml::CommandLine &command_line)
 
static bool StringEndWith (const std::string &string, const std::string &suffix)
 
SourceType SourceTypeFromFileName (const std::string &file_name)
 
SourceType SourceTypeFromString (std::string name)
 
SourceLanguage ToSourceLanguage (const std::string &source_language)
 
std::string TargetPlatformToString (TargetPlatform platform)
 
std::string SourceLanguageToString (SourceLanguage source_language)
 
std::string EntryPointFunctionNameFromSourceName (const std::string &file_name, SourceType type, SourceLanguage source_language, const std::string &entry_point_name)
 
bool TargetPlatformNeedsReflection (TargetPlatform platform)
 
std::string ShaderCErrorToString (shaderc_compilation_status status)
 
shaderc_shader_kind ToShaderCShaderKind (SourceType type)
 
spv::ExecutionModel ToExecutionModel (SourceType type)
 
spirv_cross::CompilerMSL::Options::Platform TargetPlatformToMSLPlatform (TargetPlatform platform)
 
std::string SourceTypeToString (SourceType type)
 
std::string TargetPlatformSLExtension (TargetPlatform platform)
 
bool TargetPlatformIsOpenGL (TargetPlatform platform)
 
bool TargetPlatformIsMetal (TargetPlatform platform)
 
bool TargetPlatformIsVulkan (TargetPlatform platform)
 
bool TargetPlatformBundlesSkSL (TargetPlatform platform)
 
bool SetPermissiveAccess (const std::filesystem::path &p)
 Sets the file access mode of the file at path 'p' to 0644. More...
 
std::string Utf8FromPath (const std::filesystem::path &path)
 Converts a native format path to a utf8 string. More...
 
std::string InferShaderNameFromPath (std::string_view path)
 
std::string ToCamelCase (std::string_view string)
 
std::string ToLowerCase (std::string_view string)
 
std::string ConvertToEntrypointName (std::string_view string)
 Ensure that the entrypoint name is a valid identifier in the target language. More...
 
bool StringStartsWith (const std::string &target, const std::string &prefix)
 

Variables

constexpr std::string_view kReflectionHeaderTemplate
 
constexpr std::string_view kReflectionCCTemplate
 
static const uint32_t kMaxUniformBufferSize = 6208
 
constexpr char kExternalTexturePrefix [] = "SAMPLER_EXTERNAL_OES_"
 
static const char * kStageKey = "stage"
 
static const char * kTargetPlatformKey = "target_platform"
 
static const char * kEntrypointKey = "entrypoint"
 
static const char * kUniformsKey = "uniforms"
 
static const char * kShaderKey = "shader"
 
static const char * kUniformNameKey = "name"
 
static const char * kUniformLocationKey = "location"
 
static const char * kUniformTypeKey = "type"
 
static const char * kUniformRowsKey = "rows"
 
static const char * kUniformColumnsKey = "columns"
 
static const char * kUniformBitWidthKey = "bit_width"
 
static const char * kUniformArrayElementsKey = "array_elements"
 
static const std::map< std::string, TargetPlatformkKnownPlatforms
 
static const std::map< std::string, TargetPlatformkKnownRuntimeStages
 
static const std::map< std::string, SourceTypekKnownSourceTypes
 

Typedef Documentation

◆ ShaderBundleConfig

using impeller::compiler::ShaderBundleConfig = typedef std::unordered_map<std::string, ShaderConfig>

Definition at line 82 of file types.h.

Enumeration Type Documentation

◆ SourceLanguage

Enumerator
kUnknown 
kGLSL 
kHLSL 

Definition at line 42 of file types.h.

◆ SourceType

Enumerator
kUnknown 
kVertexShader 
kFragmentShader 
kComputeShader 

Definition at line 21 of file types.h.

◆ TargetPlatform

Enumerator
kUnknown 
kMetalDesktop 
kMetalIOS 
kOpenGLES 
kOpenGLDesktop 
kVulkan 
kRuntimeStageMetal 
kRuntimeStageGLES 
kRuntimeStageGLES3 
kRuntimeStageVulkan 
kSkSL 

Definition at line 28 of file types.h.

Function Documentation

◆ CompileSkSL()

static std::shared_ptr<RuntimeStageData::Shader> impeller::compiler::CompileSkSL ( std::shared_ptr< fml::Mapping >  source_file_mapping,
const Switches switches 
)
static

Run the shader compiler to geneate SkSL reflection data. If there is an error, prints error text and returns nullptr.

Definition at line 37 of file impellerc_main.cc.

39  {
40  auto options = switches.CreateSourceOptions(TargetPlatform::kSkSL);
41 
42  Reflector::Options sksl_reflector_options =
43  CreateReflectorOptions(options, switches);
44  sksl_reflector_options.target_platform = TargetPlatform::kSkSL;
45 
46  Compiler sksl_compiler =
47  Compiler(std::move(source_file_mapping), options, sksl_reflector_options);
48  if (!sksl_compiler.IsValid()) {
49  std::cerr << "Compilation to SkSL failed." << std::endl;
50  std::cerr << sksl_compiler.GetErrorMessages() << std::endl;
51  return nullptr;
52  }
53  return sksl_compiler.GetReflector()->GetRuntimeStageShaderData();
54 }
static Reflector::Options CreateReflectorOptions(const SourceOptions &options, const Switches &switches)

References CreateReflectorOptions(), impeller::compiler::Switches::CreateSourceOptions(), impeller::compiler::Compiler::GetErrorMessages(), impeller::compiler::Compiler::GetReflector(), impeller::compiler::Reflector::GetRuntimeStageShaderData(), impeller::compiler::Compiler::IsValid(), kSkSL, and impeller::compiler::Reflector::Options::target_platform.

Referenced by OutputIPLR().

◆ ConvertToEntrypointName()

std::string impeller::compiler::ConvertToEntrypointName ( std::string_view  string)

Ensure that the entrypoint name is a valid identifier in the target language.

Definition at line 69 of file utilities.cc.

69  {
70  if (string.empty()) {
71  return "";
72  }
73  std::stringstream stream;
74  // Append a prefix if the first character is not a letter.
75  if (!std::isalpha(string.data()[0])) {
76  stream << "i_";
77  }
78  for (size_t i = 0, count = string.length(); i < count; i++) {
79  auto ch = string.data()[i];
80  if (std::isalnum(ch) || ch == '_') {
81  stream << ch;
82  }
83  }
84  return stream.str();
85 }
std::shared_ptr< const fml::Mapping > data
Definition: texture_gles.cc:68

References data.

Referenced by EntryPointFunctionNameFromSourceName(), and impeller::compiler::testing::TEST().

◆ CreateCompiler()

static CompilerBackend impeller::compiler::CreateCompiler ( const spirv_cross::ParsedIR &  ir,
const SourceOptions source_options 
)
static

Definition at line 230 of file compiler.cc.

231  {
232  CompilerBackend compiler;
233  switch (source_options.target_platform) {
234  case TargetPlatform::kMetalDesktop:
235  case TargetPlatform::kMetalIOS:
236  case TargetPlatform::kRuntimeStageMetal:
237  compiler = CreateMSLCompiler(ir, source_options);
238  break;
239  case TargetPlatform::kVulkan:
240  case TargetPlatform::kRuntimeStageVulkan:
241  compiler = CreateVulkanCompiler(ir, source_options);
242  break;
243  case TargetPlatform::kUnknown:
244  case TargetPlatform::kOpenGLES:
245  case TargetPlatform::kOpenGLDesktop:
246  case TargetPlatform::kRuntimeStageGLES:
247  case TargetPlatform::kRuntimeStageGLES3:
248  compiler = CreateGLSLCompiler(ir, source_options);
249  break;
250  case TargetPlatform::kSkSL:
251  compiler = CreateSkSLCompiler(ir, source_options);
252  }
253  if (!compiler) {
254  return {};
255  }
256  auto* backend = compiler.GetCompiler();
257  if (!EntryPointMustBeNamedMain(source_options.target_platform) &&
258  source_options.source_language == SourceLanguage::kGLSL) {
259  backend->rename_entry_point("main", source_options.entry_point_name,
260  ToExecutionModel(source_options.type));
261  }
262  return compiler;
263 }
static CompilerBackend CreateSkSLCompiler(const spirv_cross::ParsedIR &ir, const SourceOptions &source_options)
Definition: compiler.cc:204
static CompilerBackend CreateVulkanCompiler(const spirv_cross::ParsedIR &ir, const SourceOptions &source_options)
Definition: compiler.cc:134
static bool EntryPointMustBeNamedMain(TargetPlatform platform)
Definition: compiler.cc:210
static CompilerBackend CreateMSLCompiler(const spirv_cross::ParsedIR &ir, const SourceOptions &source_options, std::optional< uint32_t > msl_version_override={})
Definition: compiler.cc:63
static CompilerBackend CreateGLSLCompiler(const spirv_cross::ParsedIR &ir, const SourceOptions &source_options)
Definition: compiler.cc:146
spv::ExecutionModel ToExecutionModel(SourceType type)
Definition: types.cc:201

References CreateGLSLCompiler(), CreateMSLCompiler(), CreateSkSLCompiler(), CreateVulkanCompiler(), impeller::compiler::SourceOptions::entry_point_name, EntryPointMustBeNamedMain(), impeller::compiler::CompilerBackend::GetCompiler(), kGLSL, kMetalDesktop, kMetalIOS, kOpenGLDesktop, kOpenGLES, kRuntimeStageGLES, kRuntimeStageGLES3, kRuntimeStageMetal, kRuntimeStageVulkan, kSkSL, kUnknown, kVulkan, impeller::compiler::SourceOptions::source_language, impeller::compiler::SourceOptions::target_platform, ToExecutionModel(), and impeller::compiler::SourceOptions::type.

Referenced by impeller::compiler::Compiler::Compiler().

◆ CreateGLSLCompiler()

static CompilerBackend impeller::compiler::CreateGLSLCompiler ( const spirv_cross::ParsedIR &  ir,
const SourceOptions source_options 
)
static

Definition at line 146 of file compiler.cc.

147  {
148  auto gl_compiler = std::make_shared<spirv_cross::CompilerGLSL>(ir);
149 
150  // Walk the variables and insert the external image extension if any of them
151  // begins with the external texture prefix. Unfortunately, we can't walk
152  // `gl_compiler->get_shader_resources().separate_samplers` until the compiler
153  // is further along.
154  //
155  // Unfortunately, we can't just let the shader author add this extension and
156  // use `samplerExternalOES` directly because compiling to spirv requires the
157  // source language profile to be at least 310 ES, but this extension is
158  // incompatible with ES 310+.
159  for (auto& id : ir.ids_for_constant_or_variable) {
160  if (StringStartsWith(ir.get_name(id), kExternalTexturePrefix)) {
161  if (source_options.gles_language_version >= 300) {
162  gl_compiler->require_extension(kEGLImageExternalExtension300);
163  } else {
164  gl_compiler->require_extension(kEGLImageExternalExtension);
165  }
166  break;
167  }
168  }
169 
170  spirv_cross::CompilerGLSL::Options sl_options;
171  sl_options.force_zero_initialized_variables = true;
172  sl_options.vertex.fixup_clipspace = true;
173  if (source_options.target_platform == TargetPlatform::kOpenGLES ||
174  source_options.target_platform == TargetPlatform::kRuntimeStageGLES ||
175  source_options.target_platform == TargetPlatform::kRuntimeStageGLES3) {
176  sl_options.version = source_options.gles_language_version > 0
177  ? source_options.gles_language_version
178  : 100;
179  sl_options.es = true;
180  if (source_options.target_platform == TargetPlatform::kRuntimeStageGLES3) {
181  sl_options.version = 300;
182  }
183  if (source_options.require_framebuffer_fetch &&
184  source_options.type == SourceType::kFragmentShader) {
185  gl_compiler->remap_ext_framebuffer_fetch(0, 0, true);
186  }
187  gl_compiler->set_variable_type_remap_callback(
188  [&](const spirv_cross::SPIRType& type, const std::string& var_name,
189  std::string& name_of_type) {
190  if (StringStartsWith(var_name, kExternalTexturePrefix)) {
191  name_of_type = "samplerExternalOES";
192  }
193  });
194  } else {
195  sl_options.version = source_options.gles_language_version > 0
196  ? source_options.gles_language_version
197  : 120;
198  sl_options.es = false;
199  }
200  gl_compiler->set_common_options(sl_options);
201  return CompilerBackend(gl_compiler);
202 }
GLenum type
constexpr char kExternalTexturePrefix[]
Definition: constants.h:11
bool StringStartsWith(const std::string &target, const std::string &prefix)
Definition: utilities.cc:87

References impeller::compiler::SourceOptions::gles_language_version, kExternalTexturePrefix, kFragmentShader, kOpenGLES, kRuntimeStageGLES, kRuntimeStageGLES3, impeller::compiler::SourceOptions::require_framebuffer_fetch, StringStartsWith(), impeller::compiler::SourceOptions::target_platform, impeller::compiler::SourceOptions::type, and type.

Referenced by CreateCompiler().

◆ CreateMSLCompiler()

static CompilerBackend impeller::compiler::CreateMSLCompiler ( const spirv_cross::ParsedIR &  ir,
const SourceOptions source_options,
std::optional< uint32_t >  msl_version_override = {} 
)
static

Definition at line 63 of file compiler.cc.

66  {}) {
67  auto sl_compiler = std::make_shared<spirv_cross::CompilerMSL>(ir);
68  spirv_cross::CompilerMSL::Options sl_options;
69  sl_options.platform =
70  TargetPlatformToMSLPlatform(source_options.target_platform);
71  sl_options.msl_version = msl_version_override.value_or(
72  ParseMSLVersion(source_options.metal_version));
73  sl_options.ios_use_simdgroup_functions =
74  sl_options.is_ios() &&
75  sl_options.msl_version >=
76  spirv_cross::CompilerMSL::Options::make_msl_version(2, 4, 0);
77  sl_options.use_framebuffer_fetch_subpasses = true;
78  sl_compiler->set_msl_options(sl_options);
79 
80  // Sort the float and sampler uniforms according to their declared/decorated
81  // order. For user authored fragment shaders, the API for setting uniform
82  // values uses the index of the uniform in the declared order. By default, the
83  // metal backend of spirv-cross will order uniforms according to usage. To fix
84  // this, we use the sorted order and the add_msl_resource_binding API to force
85  // the ordering to match the declared order. Note that while this code runs
86  // for all compiled shaders, it will only affect vertex and fragment shaders
87  // due to the specified stage.
88  auto floats =
89  SortUniforms(&ir, sl_compiler.get(), spirv_cross::SPIRType::Float);
90  auto images =
91  SortUniforms(&ir, sl_compiler.get(), spirv_cross::SPIRType::SampledImage);
92 
93  spv::ExecutionModel execution_model =
94  spv::ExecutionModel::ExecutionModelFragment;
95  if (source_options.type == SourceType::kVertexShader) {
96  execution_model = spv::ExecutionModel::ExecutionModelVertex;
97  }
98 
99  uint32_t buffer_offset = 0;
100  uint32_t sampler_offset = 0;
101  for (auto& float_id : floats) {
102  sl_compiler->add_msl_resource_binding(
103  {.stage = execution_model,
104  .basetype = spirv_cross::SPIRType::BaseType::Float,
105  .desc_set = sl_compiler->get_decoration(float_id,
106  spv::DecorationDescriptorSet),
107  .binding =
108  sl_compiler->get_decoration(float_id, spv::DecorationBinding),
109  .count = 1u,
110  .msl_buffer = buffer_offset});
111  buffer_offset++;
112  }
113  for (auto& image_id : images) {
114  sl_compiler->add_msl_resource_binding({
115  .stage = execution_model,
116  .basetype = spirv_cross::SPIRType::BaseType::SampledImage,
117  .desc_set =
118  sl_compiler->get_decoration(image_id, spv::DecorationDescriptorSet),
119  .binding =
120  sl_compiler->get_decoration(image_id, spv::DecorationBinding),
121  .count = 1u,
122  // A sampled image is both an image and a sampler, so both
123  // offsets need to be set or depending on the partiular shader
124  // the bindings may be incorrect.
125  .msl_texture = sampler_offset,
126  .msl_sampler = sampler_offset,
127  });
128  sampler_offset++;
129  }
130 
131  return CompilerBackend(sl_compiler);
132 }
spirv_cross::CompilerMSL::Options::Platform TargetPlatformToMSLPlatform(TargetPlatform platform)
Definition: types.cc:215
static uint32_t ParseMSLVersion(const std::string &msl_version)
Definition: compiler.cc:40
std::vector< spirv_cross::ID > SortUniforms(const spirv_cross::ParsedIR *ir, const spirv_cross::Compiler *compiler, std::optional< spirv_cross::SPIRType::BaseType > type_filter, bool include)
Sorts uniform declarations in an IR according to decoration order.

Referenced by CreateCompiler().

◆ CreateReflectorOptions()

static Reflector::Options impeller::compiler::CreateReflectorOptions ( const SourceOptions options,
const Switches switches 
)
static

Definition at line 23 of file impellerc_main.cc.

24  {
25  Reflector::Options reflector_options;
26  reflector_options.target_platform = options.target_platform;
27  reflector_options.entry_point_name = options.entry_point_name;
28  reflector_options.shader_name =
29  InferShaderNameFromPath(switches.source_file_name);
30  reflector_options.header_file_name = Utf8FromPath(
31  std::filesystem::path{switches.reflection_header_name}.filename());
32  return reflector_options;
33 }
std::string Utf8FromPath(const std::filesystem::path &path)
Converts a native format path to a utf8 string.
Definition: utilities.cc:30
std::string InferShaderNameFromPath(std::string_view path)
Definition: utilities.cc:34

References impeller::compiler::Reflector::Options::entry_point_name, impeller::compiler::SourceOptions::entry_point_name, impeller::compiler::Reflector::Options::header_file_name, InferShaderNameFromPath(), impeller::compiler::Switches::reflection_header_name, impeller::compiler::Reflector::Options::shader_name, impeller::compiler::Switches::source_file_name, impeller::compiler::Reflector::Options::target_platform, impeller::compiler::SourceOptions::target_platform, and Utf8FromPath().

Referenced by CompileSkSL(), Main(), and OutputIPLR().

◆ CreateSkSLCompiler()

static CompilerBackend impeller::compiler::CreateSkSLCompiler ( const spirv_cross::ParsedIR &  ir,
const SourceOptions source_options 
)
static

Definition at line 204 of file compiler.cc.

205  {
206  auto sksl_compiler = std::make_shared<CompilerSkSL>(ir);
207  return CompilerBackend(sksl_compiler);
208 }

Referenced by CreateCompiler().

◆ CreateVulkanCompiler()

static CompilerBackend impeller::compiler::CreateVulkanCompiler ( const spirv_cross::ParsedIR &  ir,
const SourceOptions source_options 
)
static

Definition at line 134 of file compiler.cc.

136  {
137  auto gl_compiler = std::make_shared<spirv_cross::CompilerGLSL>(ir);
138  spirv_cross::CompilerGLSL::Options sl_options;
139  sl_options.force_zero_initialized_variables = true;
140  sl_options.vertex.fixup_clipspace = true;
141  sl_options.vulkan_semantics = true;
142  gl_compiler->set_common_options(sl_options);
143  return CompilerBackend(gl_compiler);
144 }

Referenced by CreateCompiler().

◆ EntryPointFunctionNameFromSourceName()

std::string impeller::compiler::EntryPointFunctionNameFromSourceName ( const std::string &  file_name,
SourceType  type,
SourceLanguage  source_language,
const std::string &  entry_point_name 
)

Definition at line 113 of file types.cc.

117  {
118  if (source_language == SourceLanguage::kHLSL) {
119  return entry_point_name;
120  }
121 
122  std::stringstream stream;
123  std::filesystem::path file_path(file_name);
124  stream << ConvertToEntrypointName(Utf8FromPath(file_path.stem())) << "_";
125  switch (type) {
126  case SourceType::kUnknown:
127  stream << "unknown";
128  break;
129  case SourceType::kVertexShader:
130  stream << "vertex";
131  break;
132  case SourceType::kFragmentShader:
133  stream << "fragment";
134  break;
135  case SourceType::kComputeShader:
136  stream << "compute";
137  break;
138  }
139  stream << "_main";
140  return stream.str();
141 }
std::string ConvertToEntrypointName(std::string_view string)
Ensure that the entrypoint name is a valid identifier in the target language.
Definition: utilities.cc:69

References ConvertToEntrypointName(), kComputeShader, kFragmentShader, kHLSL, kUnknown, kVertexShader, type, and Utf8FromPath().

Referenced by impeller::compiler::testing::CompilerTest::CanCompileAndReflect(), impeller::compiler::Switches::CreateSourceOptions(), and GenerateShaderBackendFB().

◆ EntryPointMustBeNamedMain()

static bool impeller::compiler::EntryPointMustBeNamedMain ( TargetPlatform  platform)
static

Definition at line 210 of file compiler.cc.

210  {
211  switch (platform) {
212  case TargetPlatform::kUnknown:
213  FML_UNREACHABLE();
214  case TargetPlatform::kMetalDesktop:
215  case TargetPlatform::kMetalIOS:
216  case TargetPlatform::kVulkan:
217  case TargetPlatform::kRuntimeStageMetal:
218  case TargetPlatform::kRuntimeStageVulkan:
219  return false;
220  case TargetPlatform::kSkSL:
221  case TargetPlatform::kOpenGLES:
222  case TargetPlatform::kOpenGLDesktop:
223  case TargetPlatform::kRuntimeStageGLES:
224  case TargetPlatform::kRuntimeStageGLES3:
225  return true;
226  }
227  FML_UNREACHABLE();
228 }

References kMetalDesktop, kMetalIOS, kOpenGLDesktop, kOpenGLES, kRuntimeStageGLES, kRuntimeStageGLES3, kRuntimeStageMetal, kRuntimeStageVulkan, kSkSL, kUnknown, and kVulkan.

Referenced by CreateCompiler().

◆ ExecutionModelToString()

static std::string impeller::compiler::ExecutionModelToString ( spv::ExecutionModel  model)
static

Definition at line 33 of file reflector.cc.

33  {
34  switch (model) {
35  case spv::ExecutionModel::ExecutionModelVertex:
36  return "vertex";
37  case spv::ExecutionModel::ExecutionModelFragment:
38  return "fragment";
39  case spv::ExecutionModel::ExecutionModelGLCompute:
40  return "compute";
41  default:
42  return "unsupported";
43  }
44 }

◆ GenerateShaderBackendFB()

static std::unique_ptr<fb::shaderbundle::BackendShaderT> impeller::compiler::GenerateShaderBackendFB ( TargetPlatform  target_platform,
SourceOptions options,
const std::string &  shader_name,
const ShaderConfig shader_config 
)
static

Override options.

Definition at line 85 of file shader_bundle.cc.

88  {
89  auto result = std::make_unique<fb::shaderbundle::BackendShaderT>();
90 
91  std::shared_ptr<fml::FileMapping> source_file_mapping =
92  fml::FileMapping::CreateReadOnly(shader_config.source_file_name);
93  if (!source_file_mapping) {
94  std::cerr << "Could not open file for bundled shader \"" << shader_name
95  << "\"." << std::endl;
96  return nullptr;
97  }
98 
99  /// Override options.
100  options.target_platform = target_platform;
101  options.file_name = shader_name; // This is just used for error messages.
102  options.type = shader_config.type;
103  options.source_language = shader_config.language;
104  options.entry_point_name = EntryPointFunctionNameFromSourceName(
105  shader_config.source_file_name, options.type, options.source_language,
106  shader_config.entry_point);
107 
108  Reflector::Options reflector_options;
109  reflector_options.target_platform = options.target_platform;
110  reflector_options.entry_point_name = options.entry_point_name;
111  reflector_options.shader_name = shader_name;
112 
113  Compiler compiler(source_file_mapping, options, reflector_options);
114  if (!compiler.IsValid()) {
115  std::cerr << "Compilation failed for bundled shader \"" << shader_name
116  << "\"." << std::endl;
117  std::cerr << compiler.GetErrorMessages() << std::endl;
118  return nullptr;
119  }
120 
121  auto reflector = compiler.GetReflector();
122  if (reflector == nullptr) {
123  std::cerr << "Could not create reflector for bundled shader \""
124  << shader_name << "\"." << std::endl;
125  return nullptr;
126  }
127 
128  auto bundle_data = reflector->GetShaderBundleData();
129  if (!bundle_data) {
130  std::cerr << "Bundled shader information was nil for \"" << shader_name
131  << "\"." << std::endl;
132  return nullptr;
133  }
134 
135  result = bundle_data->CreateFlatbuffer();
136  if (!result) {
137  std::cerr << "Failed to create flatbuffer for bundled shader \""
138  << shader_name << "\"." << std::endl;
139  return nullptr;
140  }
141 
142  return result;
143 }
std::string EntryPointFunctionNameFromSourceName(const std::string &file_name, SourceType type, SourceLanguage source_language, const std::string &entry_point_name)
Definition: types.cc:113

References impeller::compiler::ShaderConfig::entry_point, impeller::compiler::Reflector::Options::entry_point_name, impeller::compiler::SourceOptions::entry_point_name, EntryPointFunctionNameFromSourceName(), impeller::compiler::SourceOptions::file_name, impeller::compiler::Compiler::GetErrorMessages(), impeller::compiler::Compiler::GetReflector(), impeller::compiler::Reflector::GetShaderBundleData(), impeller::compiler::Compiler::IsValid(), impeller::compiler::ShaderConfig::language, impeller::compiler::Reflector::Options::shader_name, impeller::compiler::ShaderConfig::source_file_name, impeller::compiler::SourceOptions::source_language, impeller::compiler::Reflector::Options::target_platform, impeller::compiler::SourceOptions::target_platform, impeller::compiler::SourceOptions::type, and impeller::compiler::ShaderConfig::type.

Referenced by GenerateShaderFB().

◆ GenerateShaderBundle()

bool impeller::compiler::GenerateShaderBundle ( Switches switches)

Parses the JSON shader bundle configuration and invokes the compiler multiple times to produce a shader bundle flatbuffer, which is then output to the sl file.

  1. Parse the shader bundle and generate the flatbuffer result.
  2. Serialize the shader bundle and write to disk.

Definition at line 210 of file shader_bundle.cc.

210  {
211  // --------------------------------------------------------------------------
212  /// 1. Parse the shader bundle and generate the flatbuffer result.
213  ///
214 
215  auto shader_bundle = GenerateShaderBundleFlatbuffer(
216  switches.shader_bundle, switches.CreateSourceOptions());
217  if (!shader_bundle.has_value()) {
218  // Specific error messages are already handled by
219  // GenerateShaderBundleFlatbuffer.
220  return false;
221  }
222 
223  // --------------------------------------------------------------------------
224  /// 2. Serialize the shader bundle and write to disk.
225  ///
226 
227  auto builder = std::make_shared<flatbuffers::FlatBufferBuilder>();
228  builder->Finish(fb::shaderbundle::ShaderBundle::Pack(*builder.get(),
229  &shader_bundle.value()),
230  fb::shaderbundle::ShaderBundleIdentifier());
231  auto mapping = std::make_shared<fml::NonOwnedMapping>(
232  builder->GetBufferPointer(), builder->GetSize(),
233  [builder](auto, auto) {});
234 
235  auto sl_file_name = std::filesystem::absolute(
236  std::filesystem::current_path() / switches.sl_file_name);
237 
238  if (!fml::WriteAtomically(*switches.working_directory, //
239  Utf8FromPath(sl_file_name).c_str(), //
240  *mapping //
241  )) {
242  std::cerr << "Could not write file to " << switches.sl_file_name
243  << std::endl;
244  return false;
245  }
246  // Tools that consume the runtime stage data expect the access mode to
247  // be 0644.
248  if (!SetPermissiveAccess(sl_file_name)) {
249  return false;
250  }
251 
252  return true;
253 }
bool SetPermissiveAccess(const std::filesystem::path &p)
Sets the file access mode of the file at path 'p' to 0644.
Definition: utilities.cc:16
std::optional< fb::shaderbundle::ShaderBundleT > GenerateShaderBundleFlatbuffer(const std::string &bundle_config_json, const SourceOptions &options)
Parses the JSON shader bundle configuration and invokes the compiler multiple times to produce a shad...

References impeller::compiler::Switches::CreateSourceOptions(), GenerateShaderBundleFlatbuffer(), SetPermissiveAccess(), impeller::compiler::Switches::shader_bundle, impeller::compiler::Switches::sl_file_name, Utf8FromPath(), and impeller::compiler::Switches::working_directory.

Referenced by Main().

◆ GenerateShaderBundleFlatbuffer()

std::optional< fb::shaderbundle::ShaderBundleT > impeller::compiler::GenerateShaderBundleFlatbuffer ( const std::string &  bundle_config_json,
const SourceOptions options 
)

Parses the JSON shader bundle configuration and invokes the compiler multiple times to produce a shader bundle flatbuffer.

Note
Exposed only for testing purposes. Use GenerateShaderBundle directly.
  1. Parse the bundle configuration.
  2. Build the deserialized shader bundle.

Definition at line 179 of file shader_bundle.cc.

181  {
182  // --------------------------------------------------------------------------
183  /// 1. Parse the bundle configuration.
184  ///
185 
186  std::optional<ShaderBundleConfig> bundle_config =
187  ParseShaderBundleConfig(bundle_config_json, std::cerr);
188  if (!bundle_config) {
189  return std::nullopt;
190  }
191 
192  // --------------------------------------------------------------------------
193  /// 2. Build the deserialized shader bundle.
194  ///
195 
196  fb::shaderbundle::ShaderBundleT shader_bundle;
197 
198  for (const auto& [shader_name, shader_config] : bundle_config.value()) {
199  std::unique_ptr<fb::shaderbundle::ShaderT> shader =
200  GenerateShaderFB(options, shader_name, shader_config);
201  if (!shader) {
202  return std::nullopt;
203  }
204  shader_bundle.shaders.push_back(std::move(shader));
205  }
206 
207  return shader_bundle;
208 }
std::optional< ShaderBundleConfig > ParseShaderBundleConfig(const std::string &bundle_config_json, std::ostream &error_stream)
Parse a shader bundle configuration from a given JSON string.
static std::unique_ptr< fb::shaderbundle::ShaderT > GenerateShaderFB(SourceOptions options, const std::string &shader_name, const ShaderConfig &shader_config)

References GenerateShaderFB(), and ParseShaderBundleConfig().

Referenced by GenerateShaderBundle(), and impeller::compiler::testing::TEST().

◆ GenerateShaderFB()

static std::unique_ptr<fb::shaderbundle::ShaderT> impeller::compiler::GenerateShaderFB ( SourceOptions  options,
const std::string &  shader_name,
const ShaderConfig shader_config 
)
static

Definition at line 145 of file shader_bundle.cc.

148  {
149  auto result = std::make_unique<fb::shaderbundle::ShaderT>();
150  result->name = shader_name;
151  result->metal_ios = GenerateShaderBackendFB(
152  TargetPlatform::kMetalIOS, options, shader_name, shader_config);
153  if (!result->metal_ios) {
154  return nullptr;
155  }
156  result->metal_desktop = GenerateShaderBackendFB(
157  TargetPlatform::kMetalDesktop, options, shader_name, shader_config);
158  if (!result->metal_desktop) {
159  return nullptr;
160  }
161  result->opengl_es = GenerateShaderBackendFB(
162  TargetPlatform::kOpenGLES, options, shader_name, shader_config);
163  if (!result->opengl_es) {
164  return nullptr;
165  }
166  result->opengl_desktop = GenerateShaderBackendFB(
167  TargetPlatform::kOpenGLDesktop, options, shader_name, shader_config);
168  if (!result->opengl_desktop) {
169  return nullptr;
170  }
171  result->vulkan = GenerateShaderBackendFB(TargetPlatform::kVulkan, options,
172  shader_name, shader_config);
173  if (!result->vulkan) {
174  return nullptr;
175  }
176  return result;
177 }
static std::unique_ptr< fb::shaderbundle::BackendShaderT > GenerateShaderBackendFB(TargetPlatform target_platform, SourceOptions &options, const std::string &shader_name, const ShaderConfig &shader_config)

References GenerateShaderBackendFB(), kMetalDesktop, kMetalIOS, kOpenGLDesktop, kOpenGLES, and kVulkan.

Referenced by GenerateShaderBundleFlatbuffer().

◆ GetReflectedStructSize()

static size_t impeller::compiler::GetReflectedStructSize ( const std::vector< StructMember > &  members)
static

Get the reflected struct size. In the vast majority of the cases, this is the same as the declared struct size as given by the compiler. But, additional padding may need to be introduced after the end of the struct to keep in line with the alignment requirement of the individual struct members. This method figures out the actual size of the reflected struct that can be referenced in native code.

Parameters
[in]membersThe members
Returns
The reflected structure size.

Definition at line 801 of file reflector.cc.

801  {
802  auto struct_size = 0u;
803  for (const auto& member : members) {
804  struct_size += member.byte_length;
805  }
806  return struct_size;
807 }

◆ GetRuntimeStageBackend()

static std::optional<RuntimeStageBackend> impeller::compiler::GetRuntimeStageBackend ( TargetPlatform  target_platform)
static

Definition at line 301 of file reflector.cc.

302  {
303  switch (target_platform) {
304  case TargetPlatform::kUnknown:
305  case TargetPlatform::kMetalDesktop:
306  case TargetPlatform::kMetalIOS:
307  case TargetPlatform::kOpenGLES:
308  case TargetPlatform::kOpenGLDesktop:
309  case TargetPlatform::kVulkan:
310  return std::nullopt;
311  case TargetPlatform::kRuntimeStageMetal:
312  return RuntimeStageBackend::kMetal;
313  case TargetPlatform::kRuntimeStageGLES:
314  return RuntimeStageBackend::kOpenGLES;
315  case TargetPlatform::kRuntimeStageGLES3:
316  return RuntimeStageBackend::kOpenGLES3;
317  case TargetPlatform::kRuntimeStageVulkan:
318  return RuntimeStageBackend::kVulkan;
319  case TargetPlatform::kSkSL:
320  return RuntimeStageBackend::kSkSL;
321  }
322  FML_UNREACHABLE();
323 }

References impeller::kMetal, kMetalDesktop, kMetalIOS, kOpenGLDesktop, kOpenGLES, impeller::kOpenGLES, impeller::kOpenGLES3, kRuntimeStageGLES, kRuntimeStageGLES3, kRuntimeStageMetal, kRuntimeStageVulkan, kSkSL, impeller::kSkSL, kUnknown, kVulkan, and impeller::kVulkan.

◆ InferShaderNameFromPath()

std::string impeller::compiler::InferShaderNameFromPath ( std::string_view  path)

Definition at line 34 of file utilities.cc.

34  {
35  auto p = std::filesystem::path{path}.stem();
36  return Utf8FromPath(p);
37 }

References Utf8FromPath().

Referenced by CreateReflectorOptions().

◆ JoinStrings()

static std::string impeller::compiler::JoinStrings ( std::vector< std::string >  items,
const std::string &  separator 
)
static

Definition at line 512 of file compiler.cc.

513  {
514  std::stringstream stream;
515  for (size_t i = 0, count = items.size(); i < count; i++) {
516  const auto is_last = (i == count - 1);
517 
518  stream << items[i];
519  if (!is_last) {
520  stream << separator;
521  }
522  }
523  return stream.str();
524 }

Referenced by impeller::compiler::Compiler::CreateDepfileContents().

◆ Main()

bool impeller::compiler::Main ( const fml::CommandLine &  command_line)

Definition at line 234 of file impellerc_main.cc.

234  {
235  fml::InstallCrashHandler();
236  if (command_line.HasOption("help")) {
237  Switches::PrintHelp(std::cout);
238  return true;
239  }
240 
241  Switches switches(command_line);
242  if (!switches.AreValid(std::cerr)) {
243  std::cerr << "Invalid flags specified." << std::endl;
244  Switches::PrintHelp(std::cerr);
245  return false;
246  }
247 
248  if (!switches.shader_bundle.empty()) {
249  // Invoke the compiler multiple times to build a shader bundle with the
250  // given shader_bundle spec.
251  return GenerateShaderBundle(switches);
252  }
253 
254  std::shared_ptr<fml::FileMapping> source_file_mapping =
255  fml::FileMapping::CreateReadOnly(switches.source_file_name);
256  if (!source_file_mapping) {
257  std::cerr << "Could not open input file." << std::endl;
258  return false;
259  }
260 
261  if (switches.iplr && !OutputIPLR(switches, source_file_mapping)) {
262  return false;
263  }
264 
265  // Create at least one compiler to output the SL file, reflection data, and a
266  // depfile.
267 
268  SourceOptions options = switches.CreateSourceOptions();
269 
270  // Invoke the compiler and generate reflection data for a single shader.
271 
272  Reflector::Options reflector_options =
273  CreateReflectorOptions(options, switches);
274 
275  Compiler compiler(source_file_mapping, options, reflector_options);
276  if (!compiler.IsValid()) {
277  std::cerr << "Compilation failed." << std::endl;
278  std::cerr << compiler.GetErrorMessages() << std::endl;
279  return false;
280  }
281 
282  auto spriv_file_name = std::filesystem::absolute(
283  std::filesystem::current_path() / switches.spirv_file_name);
284  if (!fml::WriteAtomically(*switches.working_directory,
285  Utf8FromPath(spriv_file_name).c_str(),
286  *compiler.GetSPIRVAssembly())) {
287  std::cerr << "Could not write file to " << switches.spirv_file_name
288  << std::endl;
289  return false;
290  }
291 
292  if (!switches.iplr && !OutputSLFile(compiler, switches)) {
293  return false;
294  }
295 
296  if (!OutputReflectionData(compiler, switches, options)) {
297  return false;
298  }
299 
300  if (!OutputDepfile(compiler, switches)) {
301  return false;
302  }
303 
304  return true;
305 }
static bool OutputDepfile(const Compiler &compiler, const Switches &switches)
bool GenerateShaderBundle(Switches &switches)
Parses the JSON shader bundle configuration and invokes the compiler multiple times to produce a shad...
static bool OutputReflectionData(const Compiler &compiler, const Switches &switches, const SourceOptions &options)
static bool OutputIPLR(const Switches &switches, const std::shared_ptr< fml::Mapping > &source_file_mapping)
static bool OutputSLFile(const Compiler &compiler, const Switches &switches)

References impeller::compiler::Switches::AreValid(), CreateReflectorOptions(), impeller::compiler::Switches::CreateSourceOptions(), GenerateShaderBundle(), impeller::compiler::Compiler::GetErrorMessages(), impeller::compiler::Compiler::GetSPIRVAssembly(), impeller::compiler::Switches::iplr, impeller::compiler::Compiler::IsValid(), OutputDepfile(), OutputIPLR(), OutputReflectionData(), OutputSLFile(), impeller::compiler::Switches::PrintHelp(), impeller::compiler::Switches::shader_bundle, impeller::compiler::Switches::source_file_name, impeller::compiler::Switches::spirv_file_name, Utf8FromPath(), and impeller::compiler::Switches::working_directory.

Referenced by main().

◆ OutputDepfile()

static bool impeller::compiler::OutputDepfile ( const Compiler compiler,
const Switches switches 
)
static
  1. Output a depfile.

Definition at line 196 of file impellerc_main.cc.

196  {
197  // --------------------------------------------------------------------------
198  /// 4. Output a depfile.
199  ///
200 
201  if (!switches.depfile_path.empty()) {
202  std::string result_file;
203  switch (switches.SelectDefaultTargetPlatform()) {
204  case TargetPlatform::kMetalDesktop:
205  case TargetPlatform::kMetalIOS:
206  case TargetPlatform::kOpenGLES:
207  case TargetPlatform::kOpenGLDesktop:
208  case TargetPlatform::kRuntimeStageMetal:
209  case TargetPlatform::kRuntimeStageGLES:
210  case TargetPlatform::kRuntimeStageGLES3:
211  case TargetPlatform::kRuntimeStageVulkan:
212  case TargetPlatform::kSkSL:
213  case TargetPlatform::kVulkan:
214  result_file = switches.sl_file_name;
215  break;
216  case TargetPlatform::kUnknown:
217  result_file = switches.spirv_file_name;
218  break;
219  }
220  auto depfile_path = std::filesystem::absolute(
221  std::filesystem::current_path() / switches.depfile_path.c_str());
222  if (!fml::WriteAtomically(*switches.working_directory,
223  Utf8FromPath(depfile_path).c_str(),
224  *compiler.CreateDepfileContents({result_file}))) {
225  std::cerr << "Could not write depfile to " << switches.depfile_path
226  << std::endl;
227  return false;
228  }
229  }
230 
231  return true;
232 }

References impeller::compiler::Compiler::CreateDepfileContents(), impeller::compiler::Switches::depfile_path, kMetalDesktop, kMetalIOS, kOpenGLDesktop, kOpenGLES, kRuntimeStageGLES, kRuntimeStageGLES3, kRuntimeStageMetal, kRuntimeStageVulkan, kSkSL, kUnknown, kVulkan, impeller::compiler::Switches::SelectDefaultTargetPlatform(), impeller::compiler::Switches::sl_file_name, impeller::compiler::Switches::spirv_file_name, Utf8FromPath(), and impeller::compiler::Switches::working_directory.

Referenced by Main().

◆ OutputIPLR()

static bool impeller::compiler::OutputIPLR ( const Switches switches,
const std::shared_ptr< fml::Mapping > &  source_file_mapping 
)
static

Definition at line 56 of file impellerc_main.cc.

58  {
59  FML_DCHECK(switches.iplr);
60 
61  RuntimeStageData stages;
62  std::shared_ptr<RuntimeStageData::Shader> sksl_shader;
63  if (TargetPlatformBundlesSkSL(switches.SelectDefaultTargetPlatform())) {
64  sksl_shader = CompileSkSL(source_file_mapping, switches);
65  if (!sksl_shader) {
66  return false;
67  }
68  stages.AddShader(sksl_shader);
69  }
70 
71  for (const auto& platform : switches.PlatformsToCompile()) {
72  if (platform == TargetPlatform::kSkSL) {
73  // Already handled above.
74  continue;
75  }
76  SourceOptions options = switches.CreateSourceOptions(platform);
77 
78  // Invoke the compiler and generate reflection data for a single shader.
79 
80  Reflector::Options reflector_options =
81  CreateReflectorOptions(options, switches);
82  Compiler compiler(source_file_mapping, options, reflector_options);
83  if (!compiler.IsValid()) {
84  std::cerr << "Compilation failed." << std::endl;
85  std::cerr << compiler.GetErrorMessages() << std::endl;
86  return false;
87  }
88 
89  auto reflector = compiler.GetReflector();
90  if (reflector == nullptr) {
91  std::cerr << "Could not create reflector." << std::endl;
92  return false;
93  }
94 
95  auto stage_data = reflector->GetRuntimeStageShaderData();
96  if (!stage_data) {
97  std::cerr << "Runtime stage information was nil." << std::endl;
98  return false;
99  }
100 
101  stages.AddShader(stage_data);
102  }
103 
104  auto stage_data_mapping = switches.json_format ? stages.CreateJsonMapping()
105  : stages.CreateMapping();
106  if (!stage_data_mapping) {
107  std::cerr << "Runtime stage data could not be created." << std::endl;
108  return false;
109  }
110  if (!fml::WriteAtomically(*switches.working_directory, //
111  Utf8FromPath(switches.sl_file_name).c_str(), //
112  *stage_data_mapping //
113  )) {
114  std::cerr << "Could not write file to " << switches.sl_file_name
115  << std::endl;
116  return false;
117  }
118  // Tools that consume the runtime stage data expect the access mode to
119  // be 0644.
120  if (!SetPermissiveAccess(switches.sl_file_name)) {
121  return false;
122  }
123  return true;
124 }
bool TargetPlatformBundlesSkSL(TargetPlatform platform)
Definition: types.cc:328
static std::shared_ptr< RuntimeStageData::Shader > CompileSkSL(std::shared_ptr< fml::Mapping > source_file_mapping, const Switches &switches)

References impeller::compiler::RuntimeStageData::AddShader(), CompileSkSL(), impeller::compiler::RuntimeStageData::CreateJsonMapping(), impeller::compiler::RuntimeStageData::CreateMapping(), CreateReflectorOptions(), impeller::compiler::Switches::CreateSourceOptions(), impeller::compiler::Compiler::GetErrorMessages(), impeller::compiler::Compiler::GetReflector(), impeller::compiler::Reflector::GetRuntimeStageShaderData(), impeller::compiler::Switches::iplr, impeller::compiler::Compiler::IsValid(), impeller::compiler::Switches::json_format, kSkSL, impeller::compiler::Switches::PlatformsToCompile(), impeller::compiler::Switches::SelectDefaultTargetPlatform(), SetPermissiveAccess(), impeller::compiler::Switches::sl_file_name, TargetPlatformBundlesSkSL(), Utf8FromPath(), and impeller::compiler::Switches::working_directory.

Referenced by Main().

◆ OutputReflectionData()

static bool impeller::compiler::OutputReflectionData ( const Compiler compiler,
const Switches switches,
const SourceOptions options 
)
static
  1. Output shader reflection data. May include a JSON file, a C++ header, and/or a C++ TU.

Definition at line 144 of file impellerc_main.cc.

146  {
147  // --------------------------------------------------------------------------
148  /// 3. Output shader reflection data.
149  /// May include a JSON file, a C++ header, and/or a C++ TU.
150  ///
151 
152  if (TargetPlatformNeedsReflection(options.target_platform)) {
153  if (!switches.reflection_json_name.empty()) {
154  auto reflection_json_name = std::filesystem::absolute(
155  std::filesystem::current_path() / switches.reflection_json_name);
156  if (!fml::WriteAtomically(
157  *switches.working_directory,
158  Utf8FromPath(reflection_json_name).c_str(),
159  *compiler.GetReflector()->GetReflectionJSON())) {
160  std::cerr << "Could not write reflection json to "
161  << switches.reflection_json_name << std::endl;
162  return false;
163  }
164  }
165 
166  if (!switches.reflection_header_name.empty()) {
167  auto reflection_header_name =
168  std::filesystem::absolute(std::filesystem::current_path() /
169  switches.reflection_header_name.c_str());
170  if (!fml::WriteAtomically(
171  *switches.working_directory,
172  Utf8FromPath(reflection_header_name).c_str(),
173  *compiler.GetReflector()->GetReflectionHeader())) {
174  std::cerr << "Could not write reflection header to "
175  << switches.reflection_header_name << std::endl;
176  return false;
177  }
178  }
179 
180  if (!switches.reflection_cc_name.empty()) {
181  auto reflection_cc_name =
182  std::filesystem::absolute(std::filesystem::current_path() /
183  switches.reflection_cc_name.c_str());
184  if (!fml::WriteAtomically(*switches.working_directory,
185  Utf8FromPath(reflection_cc_name).c_str(),
186  *compiler.GetReflector()->GetReflectionCC())) {
187  std::cerr << "Could not write reflection CC to "
188  << switches.reflection_cc_name << std::endl;
189  return false;
190  }
191  }
192  }
193  return true;
194 }
bool TargetPlatformNeedsReflection(TargetPlatform platform)
Definition: types.cc:143

References impeller::compiler::Reflector::GetReflectionCC(), impeller::compiler::Reflector::GetReflectionHeader(), impeller::compiler::Reflector::GetReflectionJSON(), impeller::compiler::Compiler::GetReflector(), impeller::compiler::Switches::reflection_cc_name, impeller::compiler::Switches::reflection_header_name, impeller::compiler::Switches::reflection_json_name, impeller::compiler::SourceOptions::target_platform, TargetPlatformNeedsReflection(), Utf8FromPath(), and impeller::compiler::Switches::working_directory.

Referenced by Main().

◆ OutputSLFile()

static bool impeller::compiler::OutputSLFile ( const Compiler compiler,
const Switches switches 
)
static
  1. Output the source file. When in IPLR/RuntimeStage mode, output the serialized IPLR flatbuffer.

Definition at line 126 of file impellerc_main.cc.

126  {
127  // --------------------------------------------------------------------------
128  /// 2. Output the source file. When in IPLR/RuntimeStage mode, output the
129  /// serialized IPLR flatbuffer.
130  ///
131 
132  auto sl_file_name = std::filesystem::absolute(
133  std::filesystem::current_path() / switches.sl_file_name);
134  if (!fml::WriteAtomically(*switches.working_directory,
135  Utf8FromPath(sl_file_name).c_str(),
136  *compiler.GetSLShaderSource())) {
137  std::cerr << "Could not write file to " << switches.sl_file_name
138  << std::endl;
139  return false;
140  }
141  return true;
142 }

References impeller::compiler::Compiler::GetSLShaderSource(), impeller::compiler::Switches::sl_file_name, Utf8FromPath(), and impeller::compiler::Switches::working_directory.

Referenced by Main().

◆ ParseMSLVersion()

static uint32_t impeller::compiler::ParseMSLVersion ( const std::string &  msl_version)
static

Definition at line 40 of file compiler.cc.

40  {
41  std::stringstream sstream(msl_version);
42  std::string version_part;
43  uint32_t major = 1;
44  uint32_t minor = 2;
45  uint32_t patch = 0;
46  if (std::getline(sstream, version_part, '.')) {
47  major = std::stoi(version_part);
48  if (std::getline(sstream, version_part, '.')) {
49  minor = std::stoi(version_part);
50  if (std::getline(sstream, version_part, '.')) {
51  patch = std::stoi(version_part);
52  }
53  }
54  }
55  if (major < 1 || (major == 1 && minor < 2)) {
56  std::cerr << "--metal-version version must be at least 1.2. Have "
57  << msl_version << std::endl;
58  }
59  return spirv_cross::CompilerMSL::Options::make_msl_version(major, minor,
60  patch);
61 }

◆ ParseShaderBundleConfig()

std::optional< ShaderBundleConfig > impeller::compiler::ParseShaderBundleConfig ( const std::string &  bundle_config_json,
std::ostream &  error_stream 
)

Parse a shader bundle configuration from a given JSON string.

Note
Exposed only for testing purposes. Use GenerateShaderBundle directly.

Definition at line 19 of file shader_bundle.cc.

21  {
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."
25  << std::endl;
26  return std::nullopt;
27  }
28 
29  ShaderBundleConfig bundle;
30  for (auto& [shader_name, shader_value] : json.items()) {
31  if (bundle.find(shader_name) != bundle.end()) {
32  error_stream << "Duplicate shader \"" << shader_name << "\"."
33  << std::endl;
34  return std::nullopt;
35  }
36  if (!shader_value.is_object()) {
37  error_stream << "Invalid shader entry \"" << shader_name
38  << "\": Entry is not a JSON object." << std::endl;
39  return std::nullopt;
40  }
41 
42  ShaderConfig shader;
43 
44  if (!shader_value.contains("file")) {
45  error_stream << "Invalid shader entry \"" << shader_name
46  << "\": Missing required \"file\" field." << std::endl;
47  return std::nullopt;
48  }
49  shader.source_file_name = shader_value["file"];
50 
51  if (!shader_value.contains("type")) {
52  error_stream << "Invalid shader entry \"" << shader_name
53  << "\": Missing required \"type\" field." << std::endl;
54  return std::nullopt;
55  }
56  shader.type = SourceTypeFromString(shader_value["type"]);
57  if (shader.type == SourceType::kUnknown) {
58  error_stream << "Invalid shader entry \"" << shader_name
59  << "\": Shader type " << shader_value["type"]
60  << " is unknown." << std::endl;
61  return std::nullopt;
62  }
63 
64  shader.language = shader_value.contains("language")
65  ? ToSourceLanguage(shader_value["language"])
67  if (shader.language == SourceLanguage::kUnknown) {
68  error_stream << "Invalid shader entry \"" << shader_name
69  << "\": Unknown language type " << shader_value["language"]
70  << "." << std::endl;
71  return std::nullopt;
72  }
73 
74  shader.entry_point = shader_value.contains("entry_point")
75  ? shader_value["entry_point"]
76  : "main";
77 
78  bundle[shader_name] = shader;
79  }
80 
81  return bundle;
82 }
std::unordered_map< std::string, ShaderConfig > ShaderBundleConfig
Definition: types.h:82
SourceType SourceTypeFromString(std::string name)
Definition: types.cc:46
SourceLanguage ToSourceLanguage(const std::string &source_language)
Definition: types.cc:64

References impeller::compiler::ShaderConfig::entry_point, kGLSL, kUnknown, impeller::compiler::ShaderConfig::language, impeller::compiler::ShaderConfig::source_file_name, SourceTypeFromString(), ToSourceLanguage(), and impeller::compiler::ShaderConfig::type.

Referenced by GenerateShaderBundleFlatbuffer(), and impeller::compiler::testing::TEST().

◆ ReadKnownScalarType()

static std::optional<KnownType> impeller::compiler::ReadKnownScalarType ( spirv_cross::SPIRType::BaseType  type)
static

Definition at line 754 of file reflector.cc.

755  {
756  switch (type) {
757  case spirv_cross::SPIRType::BaseType::Boolean:
758  return KnownType{
759  .name = "bool",
760  .byte_size = sizeof(bool),
761  };
762  case spirv_cross::SPIRType::BaseType::Float:
763  return KnownType{
764  .name = "Scalar",
765  .byte_size = sizeof(Scalar),
766  };
767  case spirv_cross::SPIRType::BaseType::Half:
768  return KnownType{
769  .name = "Half",
770  .byte_size = sizeof(Half),
771  };
772  case spirv_cross::SPIRType::BaseType::UInt:
773  return KnownType{
774  .name = "uint32_t",
775  .byte_size = sizeof(uint32_t),
776  };
777  case spirv_cross::SPIRType::BaseType::Int:
778  return KnownType{
779  .name = "int32_t",
780  .byte_size = sizeof(int32_t),
781  };
782  default:
783  break;
784  }
785  return std::nullopt;
786 }
float Scalar
Definition: scalar.h:19

References impeller::compiler::KnownType::name, and type.

◆ report_and_exit()

void impeller::compiler::report_and_exit ( const std::string &  msg)

Definition at line 16 of file spirv_sksl.cc.

16  {
17  fprintf(stderr, "There was a compiler error: %s\n", msg.c_str());
18  fflush(stderr);
19  exit(1);
20 }

◆ RuntimeStageBackendToString()

static std::string impeller::compiler::RuntimeStageBackendToString ( RuntimeStageBackend  backend)
static

Definition at line 197 of file runtime_stage_data.cc.

197  {
198  switch (backend) {
199  case RuntimeStageBackend::kSkSL:
200  return "sksl";
201  case RuntimeStageBackend::kMetal:
202  return "metal";
203  case RuntimeStageBackend::kOpenGLES:
204  return "opengles";
205  case RuntimeStageBackend::kVulkan:
206  return "vulkan";
207  case RuntimeStageBackend::kOpenGLES3:
208  return "opengles3";
209  }
210 }

References impeller::kMetal, impeller::kOpenGLES, impeller::kOpenGLES3, impeller::kSkSL, and impeller::kVulkan.

Referenced by impeller::compiler::RuntimeStageData::CreateJsonMapping().

◆ RuntimeStagesFromCommandLine()

static std::vector<TargetPlatform> impeller::compiler::RuntimeStagesFromCommandLine ( const fml::CommandLine &  command_line)
static

Definition at line 138 of file switches.cc.

139  {
140  std::vector<TargetPlatform> stages;
141  for (const auto& platform : kKnownRuntimeStages) {
142  if (command_line.HasOption(platform.first)) {
143  stages.push_back(platform.second);
144  }
145  }
146  return stages;
147 }
static const std::map< std::string, TargetPlatform > kKnownRuntimeStages
Definition: switches.cc:28

References kKnownRuntimeStages.

◆ SetBindingBaseOffset()

static void impeller::compiler::SetBindingBaseOffset ( shaderc::CompileOptions &  options)
static

Definition at line 210 of file spirv_compiler.cc.

210  {
211  constexpr uint32_t kBindingBaseOffset = 64;
212  static const shaderc_uniform_kind kUniformKinds[] = {
213  shaderc_uniform_kind::shaderc_uniform_kind_sampler,
214  shaderc_uniform_kind::shaderc_uniform_kind_texture,
215  shaderc_uniform_kind::shaderc_uniform_kind_image,
216  shaderc_uniform_kind::shaderc_uniform_kind_buffer, // UBOs
217  shaderc_uniform_kind::shaderc_uniform_kind_storage_buffer, // SSBOs
218  };
219 
220  for (size_t i = 0u; i < sizeof(kUniformKinds) / sizeof(shaderc_uniform_kind);
221  i++) {
222  options.SetBindingBaseForStage(
223  shaderc_shader_kind::shaderc_fragment_shader, //
224  kUniformKinds[i], //
225  kBindingBaseOffset //
226  );
227  }
228 }

Referenced by impeller::compiler::SPIRVCompilerOptions::BuildShadercOptions().

◆ SetDefaultLimitations()

static void impeller::compiler::SetDefaultLimitations ( shaderc::CompileOptions &  compiler_opts)
static

Definition at line 92 of file spirv_compiler.cc.

92  {
93  using Limit = std::pair<shaderc_limit, int>;
94  static constexpr std::array<Limit, 83> limits = {
95  Limit{shaderc_limit::shaderc_limit_max_lights, 8},
96  Limit{shaderc_limit::shaderc_limit_max_clip_planes, 6},
97  Limit{shaderc_limit::shaderc_limit_max_texture_units, 2},
98  Limit{shaderc_limit::shaderc_limit_max_texture_coords, 8},
99  Limit{shaderc_limit::shaderc_limit_max_vertex_attribs, 16},
100  Limit{shaderc_limit::shaderc_limit_max_vertex_uniform_components, 4096},
101  Limit{shaderc_limit::shaderc_limit_max_varying_floats, 60},
102  Limit{shaderc_limit::shaderc_limit_max_vertex_texture_image_units, 16},
103  Limit{shaderc_limit::shaderc_limit_max_combined_texture_image_units, 80},
104  Limit{shaderc_limit::shaderc_limit_max_texture_image_units, 16},
105  Limit{shaderc_limit::shaderc_limit_max_fragment_uniform_components, 1024},
106  Limit{shaderc_limit::shaderc_limit_max_draw_buffers, 8},
107  Limit{shaderc_limit::shaderc_limit_max_vertex_uniform_vectors, 256},
108  Limit{shaderc_limit::shaderc_limit_max_varying_vectors, 15},
109  Limit{shaderc_limit::shaderc_limit_max_fragment_uniform_vectors, 256},
110  Limit{shaderc_limit::shaderc_limit_max_vertex_output_vectors, 16},
111  Limit{shaderc_limit::shaderc_limit_max_fragment_input_vectors, 15},
112  Limit{shaderc_limit::shaderc_limit_min_program_texel_offset, -8},
113  Limit{shaderc_limit::shaderc_limit_max_program_texel_offset, 7},
114  Limit{shaderc_limit::shaderc_limit_max_clip_distances, 8},
115  Limit{shaderc_limit::shaderc_limit_max_compute_work_group_count_x, 65535},
116  Limit{shaderc_limit::shaderc_limit_max_compute_work_group_count_y, 65535},
117  Limit{shaderc_limit::shaderc_limit_max_compute_work_group_count_z, 65535},
118  Limit{shaderc_limit::shaderc_limit_max_compute_work_group_size_x, 1024},
119  Limit{shaderc_limit::shaderc_limit_max_compute_work_group_size_y, 1024},
120  Limit{shaderc_limit::shaderc_limit_max_compute_work_group_size_z, 64},
121  Limit{shaderc_limit::shaderc_limit_max_compute_uniform_components, 512},
122  Limit{shaderc_limit::shaderc_limit_max_compute_texture_image_units, 16},
123  Limit{shaderc_limit::shaderc_limit_max_compute_image_uniforms, 8},
124  Limit{shaderc_limit::shaderc_limit_max_compute_atomic_counters, 8},
125  Limit{shaderc_limit::shaderc_limit_max_compute_atomic_counter_buffers, 1},
126  Limit{shaderc_limit::shaderc_limit_max_varying_components, 60},
127  Limit{shaderc_limit::shaderc_limit_max_vertex_output_components, 64},
128  Limit{shaderc_limit::shaderc_limit_max_geometry_input_components, 64},
129  Limit{shaderc_limit::shaderc_limit_max_geometry_output_components, 128},
130  Limit{shaderc_limit::shaderc_limit_max_fragment_input_components, 128},
131  Limit{shaderc_limit::shaderc_limit_max_image_units, 8},
132  Limit{shaderc_limit::
133  shaderc_limit_max_combined_image_units_and_fragment_outputs,
134  8},
135  Limit{shaderc_limit::shaderc_limit_max_combined_shader_output_resources,
136  8},
137  Limit{shaderc_limit::shaderc_limit_max_image_samples, 0},
138  Limit{shaderc_limit::shaderc_limit_max_vertex_image_uniforms, 0},
139  Limit{shaderc_limit::shaderc_limit_max_tess_control_image_uniforms, 0},
140  Limit{shaderc_limit::shaderc_limit_max_tess_evaluation_image_uniforms, 0},
141  Limit{shaderc_limit::shaderc_limit_max_geometry_image_uniforms, 0},
142  Limit{shaderc_limit::shaderc_limit_max_fragment_image_uniforms, 8},
143  Limit{shaderc_limit::shaderc_limit_max_combined_image_uniforms, 8},
144  Limit{shaderc_limit::shaderc_limit_max_geometry_texture_image_units, 16},
145  Limit{shaderc_limit::shaderc_limit_max_geometry_output_vertices, 256},
146  Limit{shaderc_limit::shaderc_limit_max_geometry_total_output_components,
147  1024},
148  Limit{shaderc_limit::shaderc_limit_max_geometry_uniform_components, 512},
149  Limit{shaderc_limit::shaderc_limit_max_geometry_varying_components, 60},
150  Limit{shaderc_limit::shaderc_limit_max_tess_control_input_components,
151  128},
152  Limit{shaderc_limit::shaderc_limit_max_tess_control_output_components,
153  128},
154  Limit{shaderc_limit::shaderc_limit_max_tess_control_texture_image_units,
155  16},
156  Limit{shaderc_limit::shaderc_limit_max_tess_control_uniform_components,
157  1024},
158  Limit{
159  shaderc_limit::shaderc_limit_max_tess_control_total_output_components,
160  4096},
161  Limit{shaderc_limit::shaderc_limit_max_tess_evaluation_input_components,
162  128},
163  Limit{shaderc_limit::shaderc_limit_max_tess_evaluation_output_components,
164  128},
165  Limit{
166  shaderc_limit::shaderc_limit_max_tess_evaluation_texture_image_units,
167  16},
168  Limit{shaderc_limit::shaderc_limit_max_tess_evaluation_uniform_components,
169  1024},
170  Limit{shaderc_limit::shaderc_limit_max_tess_patch_components, 120},
171  Limit{shaderc_limit::shaderc_limit_max_patch_vertices, 32},
172  Limit{shaderc_limit::shaderc_limit_max_tess_gen_level, 64},
173  Limit{shaderc_limit::shaderc_limit_max_viewports, 16},
174  Limit{shaderc_limit::shaderc_limit_max_vertex_atomic_counters, 0},
175  Limit{shaderc_limit::shaderc_limit_max_tess_control_atomic_counters, 0},
176  Limit{shaderc_limit::shaderc_limit_max_tess_evaluation_atomic_counters,
177  0},
178  Limit{shaderc_limit::shaderc_limit_max_geometry_atomic_counters, 0},
179  Limit{shaderc_limit::shaderc_limit_max_fragment_atomic_counters, 8},
180  Limit{shaderc_limit::shaderc_limit_max_combined_atomic_counters, 8},
181  Limit{shaderc_limit::shaderc_limit_max_atomic_counter_bindings, 1},
182  Limit{shaderc_limit::shaderc_limit_max_vertex_atomic_counter_buffers, 0},
183  Limit{
184  shaderc_limit::shaderc_limit_max_tess_control_atomic_counter_buffers,
185  0},
186  Limit{shaderc_limit::
187  shaderc_limit_max_tess_evaluation_atomic_counter_buffers,
188  0},
189  Limit{shaderc_limit::shaderc_limit_max_geometry_atomic_counter_buffers,
190  0},
191  Limit{shaderc_limit::shaderc_limit_max_fragment_atomic_counter_buffers,
192  0},
193  Limit{shaderc_limit::shaderc_limit_max_combined_atomic_counter_buffers,
194  1},
195  Limit{shaderc_limit::shaderc_limit_max_atomic_counter_buffer_size, 32},
196  Limit{shaderc_limit::shaderc_limit_max_transform_feedback_buffers, 4},
197  Limit{shaderc_limit::
198  shaderc_limit_max_transform_feedback_interleaved_components,
199  64},
200  Limit{shaderc_limit::shaderc_limit_max_cull_distances, 8},
201  Limit{shaderc_limit::shaderc_limit_max_combined_clip_and_cull_distances,
202  8},
203  Limit{shaderc_limit::shaderc_limit_max_samples, 4},
204  };
205  for (auto& [limit, value] : limits) {
206  compiler_opts.SetLimit(limit, value);
207  }
208 }
int32_t value

References value.

Referenced by impeller::compiler::SPIRVCompilerOptions::BuildShadercOptions().

◆ SetPermissiveAccess()

bool impeller::compiler::SetPermissiveAccess ( const std::filesystem::path &  p)

Sets the file access mode of the file at path 'p' to 0644.

Definition at line 16 of file utilities.cc.

16  {
17  auto permissions =
18  std::filesystem::perms::owner_read | std::filesystem::perms::owner_write |
19  std::filesystem::perms::group_read | std::filesystem::perms::others_read;
20  std::error_code error;
21  std::filesystem::permissions(p, permissions, error);
22  if (error) {
23  std::cerr << "Failed to set access on file '" << p
24  << "': " << error.message() << std::endl;
25  return false;
26  }
27  return true;
28 }

Referenced by GenerateShaderBundle(), and OutputIPLR().

◆ ShaderCErrorToString()

std::string impeller::compiler::ShaderCErrorToString ( shaderc_compilation_status  status)

Definition at line 162 of file types.cc.

162  {
163  using Status = shaderc_compilation_status;
164  switch (status) {
165  case Status::shaderc_compilation_status_success:
166  return "Success";
167  case Status::shaderc_compilation_status_invalid_stage:
168  return "Invalid shader stage specified";
169  case Status::shaderc_compilation_status_compilation_error:
170  return "Compilation error";
171  case Status::shaderc_compilation_status_internal_error:
172  return "Internal error";
173  case Status::shaderc_compilation_status_null_result_object:
174  return "Internal error. Null result object";
175  case Status::shaderc_compilation_status_invalid_assembly:
176  return "Invalid assembly";
177  case Status::shaderc_compilation_status_validation_error:
178  return "Validation error";
179  case Status::shaderc_compilation_status_transformation_error:
180  return "Transform error";
181  case Status::shaderc_compilation_status_configuration_error:
182  return "Configuration error";
183  }
184  return "Unknown internal error";
185 }

Referenced by impeller::compiler::SPIRVCompiler::CompileToSPV().

◆ SourceLanguageToString()

std::string impeller::compiler::SourceLanguageToString ( SourceLanguage  source_language)

Definition at line 102 of file types.cc.

102  {
103  switch (source_language) {
104  case SourceLanguage::kUnknown:
105  return "Unknown";
106  case SourceLanguage::kGLSL:
107  return "GLSL";
108  case SourceLanguage::kHLSL:
109  return "HLSL";
110  }
111 }

References kGLSL, kHLSL, and kUnknown.

Referenced by impeller::compiler::SPIRVCompiler::CompileToSPV().

◆ SourceTypeFromCommandLine()

static SourceType impeller::compiler::SourceTypeFromCommandLine ( const fml::CommandLine &  command_line)
static

Definition at line 149 of file switches.cc.

150  {
151  auto source_type_option =
152  command_line.GetOptionValueWithDefault("input-type", "");
153  auto source_type_search = kKnownSourceTypes.find(source_type_option);
154  if (source_type_search == kKnownSourceTypes.end()) {
155  return SourceType::kUnknown;
156  }
157  return source_type_search->second;
158 }
static const std::map< std::string, SourceType > kKnownSourceTypes
Definition: switches.cc:36

References kKnownSourceTypes, and kUnknown.

◆ SourceTypeFromFileName()

SourceType impeller::compiler::SourceTypeFromFileName ( const std::string &  file_name)

Definition at line 30 of file types.cc.

30  {
31  if (StringEndWith(file_name, ".vert")) {
32  return SourceType::kVertexShader;
33  }
34 
35  if (StringEndWith(file_name, ".frag")) {
36  return SourceType::kFragmentShader;
37  }
38 
39  if (StringEndWith(file_name, ".comp")) {
40  return SourceType::kComputeShader;
41  }
42 
43  return SourceType::kUnknown;
44 }
static bool StringEndWith(const std::string &string, const std::string &suffix)
Definition: types.cc:17

References kComputeShader, kFragmentShader, kUnknown, kVertexShader, and StringEndWith().

Referenced by impeller::compiler::testing::CompilerTest::CanCompileAndReflect(), impeller::compiler::Switches::CreateSourceOptions(), and impeller::compiler::testing::TEST().

◆ SourceTypeFromString()

SourceType impeller::compiler::SourceTypeFromString ( std::string  name)

Definition at line 46 of file types.cc.

46  {
47  name = ToLowerCase(name);
48 
49  if (name == "vertex") {
50  return SourceType::kVertexShader;
51  }
52 
53  if (name == "fragment") {
54  return SourceType::kFragmentShader;
55  }
56 
57  if (name == "compute") {
58  return SourceType::kComputeShader;
59  }
60 
61  return SourceType::kUnknown;
62 }
std::string ToLowerCase(std::string_view string)
Definition: utilities.cc:62

References kComputeShader, kFragmentShader, kUnknown, kVertexShader, and ToLowerCase().

Referenced by ParseShaderBundleConfig().

◆ SourceTypeToString()

std::string impeller::compiler::SourceTypeToString ( SourceType  type)

Definition at line 236 of file types.cc.

236  {
237  switch (type) {
238  case SourceType::kUnknown:
239  return "unknown";
240  case SourceType::kVertexShader:
241  return "vert";
242  case SourceType::kFragmentShader:
243  return "frag";
244  case SourceType::kComputeShader:
245  return "comp";
246  }
247  FML_UNREACHABLE();
248 }

References kComputeShader, kFragmentShader, kUnknown, kVertexShader, and type.

◆ StringEndWith()

static bool impeller::compiler::StringEndWith ( const std::string &  string,
const std::string &  suffix 
)
static

Definition at line 17 of file types.cc.

18  {
19  if (suffix.size() > string.size()) {
20  return false;
21  }
22 
23  if (suffix.empty() || suffix.empty()) {
24  return false;
25  }
26 
27  return string.rfind(suffix) == (string.size() - suffix.size());
28 }

Referenced by SourceTypeFromFileName().

◆ StringStartsWith()

bool impeller::compiler::StringStartsWith ( const std::string &  target,
const std::string &  prefix 
)

Definition at line 87 of file utilities.cc.

87  {
88  if (prefix.length() > target.length()) {
89  return false;
90  }
91  for (size_t i = 0; i < prefix.length(); i++) {
92  if (target[i] != prefix[i]) {
93  return false;
94  }
95  }
96  return true;
97 }

Referenced by CreateGLSLCompiler().

◆ StringToShaderStage()

static std::string impeller::compiler::StringToShaderStage ( const std::string &  str)
static

Definition at line 46 of file reflector.cc.

46  {
47  if (str == "vertex") {
48  return "ShaderStage::kVertex";
49  }
50 
51  if (str == "fragment") {
52  return "ShaderStage::kFragment";
53  }
54 
55  if (str == "compute") {
56  return "ShaderStage::kCompute";
57  }
58 
59  return "ShaderStage::kUnknown";
60 }

◆ TargetPlatformBundlesSkSL()

bool impeller::compiler::TargetPlatformBundlesSkSL ( TargetPlatform  platform)

Definition at line 328 of file types.cc.

328  {
329  switch (platform) {
330  case TargetPlatform::kSkSL:
331  case TargetPlatform::kRuntimeStageMetal:
332  case TargetPlatform::kRuntimeStageGLES:
333  case TargetPlatform::kRuntimeStageGLES3:
334  case TargetPlatform::kRuntimeStageVulkan:
335  return true;
336  case TargetPlatform::kMetalDesktop:
337  case TargetPlatform::kMetalIOS:
338  case TargetPlatform::kUnknown:
339  case TargetPlatform::kOpenGLES:
340  case TargetPlatform::kOpenGLDesktop:
341  case TargetPlatform::kVulkan:
342  return false;
343  }
344  FML_UNREACHABLE();
345 }

References kMetalDesktop, kMetalIOS, kOpenGLDesktop, kOpenGLES, kRuntimeStageGLES, kRuntimeStageGLES3, kRuntimeStageMetal, kRuntimeStageVulkan, kSkSL, kUnknown, and kVulkan.

Referenced by OutputIPLR().

◆ TargetPlatformFromCommandLine()

static TargetPlatform impeller::compiler::TargetPlatformFromCommandLine ( const fml::CommandLine &  command_line)
static

Definition at line 120 of file switches.cc.

121  {
122  auto target = TargetPlatform::kUnknown;
123  for (const auto& platform : kKnownPlatforms) {
124  if (command_line.HasOption(platform.first)) {
125  // If the platform has already been determined, the caller may have
126  // specified multiple platforms. This is an error and only one must be
127  // selected.
128  if (target != TargetPlatform::kUnknown) {
129  return TargetPlatform::kUnknown;
130  }
131  target = platform.second;
132  // Keep going to detect duplicates.
133  }
134  }
135  return target;
136 }
static const std::map< std::string, TargetPlatform > kKnownPlatforms
Definition: switches.cc:20

References kKnownPlatforms, and kUnknown.

◆ TargetPlatformIsMetal()

bool impeller::compiler::TargetPlatformIsMetal ( TargetPlatform  platform)

Definition at line 290 of file types.cc.

290  {
291  switch (platform) {
292  case TargetPlatform::kMetalDesktop:
293  case TargetPlatform::kMetalIOS:
294  case TargetPlatform::kRuntimeStageMetal:
295  return true;
296  case TargetPlatform::kUnknown:
297  case TargetPlatform::kSkSL:
298  case TargetPlatform::kOpenGLES:
299  case TargetPlatform::kOpenGLDesktop:
300  case TargetPlatform::kRuntimeStageGLES:
301  case TargetPlatform::kRuntimeStageGLES3:
302  case TargetPlatform::kRuntimeStageVulkan:
303  case TargetPlatform::kVulkan:
304  return false;
305  }
306  FML_UNREACHABLE();
307 }

References kMetalDesktop, kMetalIOS, kOpenGLDesktop, kOpenGLES, kRuntimeStageGLES, kRuntimeStageGLES3, kRuntimeStageMetal, kRuntimeStageVulkan, kSkSL, kUnknown, and kVulkan.

Referenced by impeller::compiler::testing::TEST_P().

◆ TargetPlatformIsOpenGL()

bool impeller::compiler::TargetPlatformIsOpenGL ( TargetPlatform  platform)

Definition at line 271 of file types.cc.

271  {
272  switch (platform) {
273  case TargetPlatform::kOpenGLES:
274  case TargetPlatform::kOpenGLDesktop:
275  case TargetPlatform::kRuntimeStageGLES:
276  case TargetPlatform::kRuntimeStageGLES3:
277  return true;
278  case TargetPlatform::kMetalDesktop:
279  case TargetPlatform::kRuntimeStageMetal:
280  case TargetPlatform::kRuntimeStageVulkan:
281  case TargetPlatform::kMetalIOS:
282  case TargetPlatform::kUnknown:
283  case TargetPlatform::kSkSL:
284  case TargetPlatform::kVulkan:
285  return false;
286  }
287  FML_UNREACHABLE();
288 }

References kMetalDesktop, kMetalIOS, kOpenGLDesktop, kOpenGLES, kRuntimeStageGLES, kRuntimeStageGLES3, kRuntimeStageMetal, kRuntimeStageVulkan, kSkSL, kUnknown, and kVulkan.

◆ TargetPlatformIsVulkan()

bool impeller::compiler::TargetPlatformIsVulkan ( TargetPlatform  platform)

Definition at line 309 of file types.cc.

309  {
310  switch (platform) {
311  case TargetPlatform::kRuntimeStageVulkan:
312  case TargetPlatform::kVulkan:
313  return true;
314  case TargetPlatform::kMetalDesktop:
315  case TargetPlatform::kMetalIOS:
316  case TargetPlatform::kRuntimeStageMetal:
317  case TargetPlatform::kUnknown:
318  case TargetPlatform::kSkSL:
319  case TargetPlatform::kOpenGLES:
320  case TargetPlatform::kOpenGLDesktop:
321  case TargetPlatform::kRuntimeStageGLES:
322  case TargetPlatform::kRuntimeStageGLES3:
323  return false;
324  }
325  FML_UNREACHABLE();
326 }

References kMetalDesktop, kMetalIOS, kOpenGLDesktop, kOpenGLES, kRuntimeStageGLES, kRuntimeStageGLES3, kRuntimeStageMetal, kRuntimeStageVulkan, kSkSL, kUnknown, and kVulkan.

Referenced by impeller::compiler::testing::TEST_P().

◆ TargetPlatformNeedsReflection()

bool impeller::compiler::TargetPlatformNeedsReflection ( TargetPlatform  platform)

Definition at line 143 of file types.cc.

143  {
144  switch (platform) {
145  case TargetPlatform::kMetalIOS:
146  case TargetPlatform::kMetalDesktop:
147  case TargetPlatform::kOpenGLES:
148  case TargetPlatform::kOpenGLDesktop:
149  case TargetPlatform::kRuntimeStageMetal:
150  case TargetPlatform::kRuntimeStageGLES:
151  case TargetPlatform::kRuntimeStageGLES3:
152  case TargetPlatform::kRuntimeStageVulkan:
153  case TargetPlatform::kVulkan:
154  return true;
155  case TargetPlatform::kUnknown:
156  case TargetPlatform::kSkSL:
157  return false;
158  }
159  FML_UNREACHABLE();
160 }

References kMetalDesktop, kMetalIOS, kOpenGLDesktop, kOpenGLES, kRuntimeStageGLES, kRuntimeStageGLES3, kRuntimeStageMetal, kRuntimeStageVulkan, kSkSL, kUnknown, and kVulkan.

Referenced by impeller::compiler::testing::CompilerTest::CanCompileAndReflect(), and OutputReflectionData().

◆ TargetPlatformSLExtension()

std::string impeller::compiler::TargetPlatformSLExtension ( TargetPlatform  platform)

Definition at line 250 of file types.cc.

250  {
251  switch (platform) {
252  case TargetPlatform::kUnknown:
253  return "unknown";
254  case TargetPlatform::kMetalDesktop:
255  case TargetPlatform::kMetalIOS:
256  case TargetPlatform::kRuntimeStageMetal:
257  return "metal";
258  case TargetPlatform::kSkSL:
259  case TargetPlatform::kOpenGLES:
260  case TargetPlatform::kOpenGLDesktop:
261  case TargetPlatform::kRuntimeStageGLES:
262  case TargetPlatform::kRuntimeStageGLES3:
263  return "glsl";
264  case TargetPlatform::kVulkan:
265  case TargetPlatform::kRuntimeStageVulkan:
266  return "vk.spirv";
267  }
268  FML_UNREACHABLE();
269 }

References kMetalDesktop, kMetalIOS, kOpenGLDesktop, kOpenGLES, kRuntimeStageGLES, kRuntimeStageGLES3, kRuntimeStageMetal, kRuntimeStageVulkan, kSkSL, kUnknown, and kVulkan.

Referenced by impeller::compiler::testing::SLFileName().

◆ TargetPlatformToMSLPlatform()

spirv_cross::CompilerMSL::Options::Platform impeller::compiler::TargetPlatformToMSLPlatform ( TargetPlatform  platform)

Definition at line 215 of file types.cc.

216  {
217  switch (platform) {
218  case TargetPlatform::kMetalIOS:
219  case TargetPlatform::kRuntimeStageMetal:
220  return spirv_cross::CompilerMSL::Options::Platform::iOS;
221  case TargetPlatform::kMetalDesktop:
222  return spirv_cross::CompilerMSL::Options::Platform::macOS;
223  case TargetPlatform::kSkSL:
224  case TargetPlatform::kOpenGLES:
225  case TargetPlatform::kOpenGLDesktop:
226  case TargetPlatform::kRuntimeStageGLES:
227  case TargetPlatform::kRuntimeStageGLES3:
228  case TargetPlatform::kRuntimeStageVulkan:
229  case TargetPlatform::kVulkan:
230  case TargetPlatform::kUnknown:
231  return spirv_cross::CompilerMSL::Options::Platform::macOS;
232  }
233  FML_UNREACHABLE();
234 }

References kMetalDesktop, kMetalIOS, kOpenGLDesktop, kOpenGLES, kRuntimeStageGLES, kRuntimeStageGLES3, kRuntimeStageMetal, kRuntimeStageVulkan, kSkSL, kUnknown, and kVulkan.

◆ TargetPlatformToString()

std::string impeller::compiler::TargetPlatformToString ( TargetPlatform  platform)

Definition at line 74 of file types.cc.

74  {
75  switch (platform) {
76  case TargetPlatform::kUnknown:
77  return "Unknown";
78  case TargetPlatform::kMetalDesktop:
79  return "MetalDesktop";
80  case TargetPlatform::kMetalIOS:
81  return "MetaliOS";
82  case TargetPlatform::kOpenGLES:
83  return "OpenGLES";
84  case TargetPlatform::kOpenGLDesktop:
85  return "OpenGLDesktop";
86  case TargetPlatform::kVulkan:
87  return "Vulkan";
88  case TargetPlatform::kRuntimeStageMetal:
89  return "RuntimeStageMetal";
90  case TargetPlatform::kRuntimeStageGLES:
91  return "RuntimeStageGLES";
92  case TargetPlatform::kRuntimeStageGLES3:
93  return "RuntimeStageGLES3";
94  case TargetPlatform::kRuntimeStageVulkan:
95  return "RuntimeStageVulkan";
96  case TargetPlatform::kSkSL:
97  return "SkSL";
98  }
99  FML_UNREACHABLE();
100 }

References kMetalDesktop, kMetalIOS, kOpenGLDesktop, kOpenGLES, kRuntimeStageGLES, kRuntimeStageGLES3, kRuntimeStageMetal, kRuntimeStageVulkan, kSkSL, kUnknown, and kVulkan.

◆ ToCamelCase()

std::string impeller::compiler::ToCamelCase ( std::string_view  string)

Definition at line 39 of file utilities.cc.

39  {
40  if (string.empty()) {
41  return "";
42  }
43 
44  std::stringstream stream;
45  bool next_upper = true;
46  for (size_t i = 0, count = string.length(); i < count; i++) {
47  auto ch = string.data()[i];
48  if (next_upper) {
49  next_upper = false;
50  stream << static_cast<char>(std::toupper(ch));
51  continue;
52  }
53  if (ch == '_') {
54  next_upper = true;
55  continue;
56  }
57  stream << ch;
58  }
59  return stream.str();
60 }

◆ ToExecutionModel()

spv::ExecutionModel impeller::compiler::ToExecutionModel ( SourceType  type)

Definition at line 201 of file types.cc.

201  {
202  switch (type) {
203  case SourceType::kVertexShader:
204  return spv::ExecutionModel::ExecutionModelVertex;
205  case SourceType::kFragmentShader:
206  return spv::ExecutionModel::ExecutionModelFragment;
207  case SourceType::kComputeShader:
208  return spv::ExecutionModel::ExecutionModelGLCompute;
209  case SourceType::kUnknown:
210  break;
211  }
212  return spv::ExecutionModel::ExecutionModelMax;
213 }

References kComputeShader, kFragmentShader, kUnknown, kVertexShader, and type.

Referenced by CreateCompiler().

◆ ToInputType() [1/2]

static std::optional<fb::InputDataType> impeller::compiler::ToInputType ( spirv_cross::SPIRType::BaseType  type)
static

Definition at line 95 of file runtime_stage_data.cc.

96  {
97  switch (type) {
98  case spirv_cross::SPIRType::Boolean:
99  return fb::InputDataType::kBoolean;
100  case spirv_cross::SPIRType::SByte:
101  return fb::InputDataType::kSignedByte;
102  case spirv_cross::SPIRType::UByte:
103  return fb::InputDataType::kUnsignedByte;
104  case spirv_cross::SPIRType::Short:
105  return fb::InputDataType::kSignedShort;
106  case spirv_cross::SPIRType::UShort:
107  return fb::InputDataType::kUnsignedShort;
108  case spirv_cross::SPIRType::Int:
109  return fb::InputDataType::kSignedInt;
110  case spirv_cross::SPIRType::UInt:
111  return fb::InputDataType::kUnsignedInt;
112  case spirv_cross::SPIRType::Int64:
113  return fb::InputDataType::kSignedInt64;
114  case spirv_cross::SPIRType::UInt64:
115  return fb::InputDataType::kUnsignedInt64;
116  case spirv_cross::SPIRType::Float:
118  case spirv_cross::SPIRType::Double:
119  return fb::InputDataType::kDouble;
120  case spirv_cross::SPIRType::Unknown:
121  case spirv_cross::SPIRType::Void:
122  case spirv_cross::SPIRType::Half:
123  case spirv_cross::SPIRType::AtomicCounter:
124  case spirv_cross::SPIRType::Struct:
125  case spirv_cross::SPIRType::Image:
126  case spirv_cross::SPIRType::SampledImage:
127  case spirv_cross::SPIRType::Sampler:
128  case spirv_cross::SPIRType::AccelerationStructure:
129  case spirv_cross::SPIRType::RayQuery:
130  case spirv_cross::SPIRType::ControlPointArray:
131  case spirv_cross::SPIRType::Interpolant:
132  case spirv_cross::SPIRType::Char:
133  return std::nullopt;
134  }
135  FML_UNREACHABLE();
136 }

References impeller::kFloat, and type.

Referenced by impeller::compiler::ShaderBundleData::CreateFlatbuffer(), and impeller::compiler::RuntimeStageData::CreateStageFlatbuffer().

◆ ToInputType() [2/2]

static std::optional<fb::shaderbundle::InputDataType> impeller::compiler::ToInputType ( spirv_cross::SPIRType::BaseType  type)
static

Definition at line 100 of file shader_bundle_data.cc.

101  {
102  switch (type) {
103  case spirv_cross::SPIRType::Boolean:
104  return fb::shaderbundle::InputDataType::kBoolean;
105  case spirv_cross::SPIRType::SByte:
106  return fb::shaderbundle::InputDataType::kSignedByte;
107  case spirv_cross::SPIRType::UByte:
108  return fb::shaderbundle::InputDataType::kUnsignedByte;
109  case spirv_cross::SPIRType::Short:
110  return fb::shaderbundle::InputDataType::kSignedShort;
111  case spirv_cross::SPIRType::UShort:
112  return fb::shaderbundle::InputDataType::kUnsignedShort;
113  case spirv_cross::SPIRType::Int:
114  return fb::shaderbundle::InputDataType::kSignedInt;
115  case spirv_cross::SPIRType::UInt:
116  return fb::shaderbundle::InputDataType::kUnsignedInt;
117  case spirv_cross::SPIRType::Int64:
118  return fb::shaderbundle::InputDataType::kSignedInt64;
119  case spirv_cross::SPIRType::UInt64:
120  return fb::shaderbundle::InputDataType::kUnsignedInt64;
121  case spirv_cross::SPIRType::Float:
123  case spirv_cross::SPIRType::Double:
124  return fb::shaderbundle::InputDataType::kDouble;
125  case spirv_cross::SPIRType::Unknown:
126  case spirv_cross::SPIRType::Void:
127  case spirv_cross::SPIRType::Half:
128  case spirv_cross::SPIRType::AtomicCounter:
129  case spirv_cross::SPIRType::Struct:
130  case spirv_cross::SPIRType::Image:
131  case spirv_cross::SPIRType::SampledImage:
132  case spirv_cross::SPIRType::Sampler:
133  case spirv_cross::SPIRType::AccelerationStructure:
134  case spirv_cross::SPIRType::RayQuery:
135  case spirv_cross::SPIRType::ControlPointArray:
136  case spirv_cross::SPIRType::Interpolant:
137  case spirv_cross::SPIRType::Char:
138  return std::nullopt;
139  }
140  FML_UNREACHABLE();
141 }

References impeller::kFloat, and type.

◆ ToJsonStage()

static std::optional<fb::Stage> impeller::compiler::ToJsonStage ( spv::ExecutionModel  stage)
static

Definition at line 47 of file runtime_stage_data.cc.

47  {
48  switch (stage) {
49  case spv::ExecutionModel::ExecutionModelVertex:
50  return fb::Stage::kVertex;
51  case spv::ExecutionModel::ExecutionModelFragment:
52  return fb::Stage::kFragment;
53  case spv::ExecutionModel::ExecutionModelGLCompute:
54  return fb::Stage::kCompute;
55  default:
56  return std::nullopt;
57  }
58  FML_UNREACHABLE();
59 }

Referenced by impeller::compiler::RuntimeStageData::CreateJsonMapping().

◆ ToJsonType()

static std::optional<uint32_t> impeller::compiler::ToJsonType ( spirv_cross::SPIRType::BaseType  type)
static

Definition at line 138 of file runtime_stage_data.cc.

139  {
140  switch (type) {
141  case spirv_cross::SPIRType::Boolean:
142  return 0; // fb::UniformDataType::kBoolean;
143  case spirv_cross::SPIRType::SByte:
144  return 1; // fb::UniformDataType::kSignedByte;
145  case spirv_cross::SPIRType::UByte:
146  return 2; // fb::UniformDataType::kUnsignedByte;
147  case spirv_cross::SPIRType::Short:
148  return 3; // fb::UniformDataType::kSignedShort;
149  case spirv_cross::SPIRType::UShort:
150  return 4; // fb::UniformDataType::kUnsignedShort;
151  case spirv_cross::SPIRType::Int:
152  return 5; // fb::UniformDataType::kSignedInt;
153  case spirv_cross::SPIRType::UInt:
154  return 6; // fb::UniformDataType::kUnsignedInt;
155  case spirv_cross::SPIRType::Int64:
156  return 7; // fb::UniformDataType::kSignedInt64;
157  case spirv_cross::SPIRType::UInt64:
158  return 8; // fb::UniformDataType::kUnsignedInt64;
159  case spirv_cross::SPIRType::Half:
160  return 9; // b::UniformDataType::kHalfFloat;
161  case spirv_cross::SPIRType::Float:
162  return 10; // fb::UniformDataType::kFloat;
163  case spirv_cross::SPIRType::Double:
164  return 11; // fb::UniformDataType::kDouble;
165  case spirv_cross::SPIRType::SampledImage:
166  return 12; // fb::UniformDataType::kSampledImage;
167  case spirv_cross::SPIRType::Struct:
168  return 13;
169  case spirv_cross::SPIRType::AccelerationStructure:
170  case spirv_cross::SPIRType::AtomicCounter:
171  case spirv_cross::SPIRType::Char:
172  case spirv_cross::SPIRType::ControlPointArray:
173  case spirv_cross::SPIRType::Image:
174  case spirv_cross::SPIRType::Interpolant:
175  case spirv_cross::SPIRType::RayQuery:
176  case spirv_cross::SPIRType::Sampler:
177  case spirv_cross::SPIRType::Unknown:
178  case spirv_cross::SPIRType::Void:
179  return std::nullopt;
180  }
181  FML_UNREACHABLE();
182 }

References type.

Referenced by impeller::compiler::RuntimeStageData::CreateJsonMapping().

◆ ToLowerCase()

std::string impeller::compiler::ToLowerCase ( std::string_view  string)

Definition at line 62 of file utilities.cc.

62  {
63  std::string result = std::string(string);
64  std::transform(result.begin(), result.end(), result.begin(),
65  [](char x) { return std::tolower(x); });
66  return result;
67 }
int32_t x

References transform, and x.

Referenced by SourceTypeFromString(), and impeller::compiler::Switches::Switches().

◆ ToShaderCShaderKind()

shaderc_shader_kind impeller::compiler::ToShaderCShaderKind ( SourceType  type)

Definition at line 187 of file types.cc.

187  {
188  switch (type) {
189  case SourceType::kVertexShader:
190  return shaderc_shader_kind::shaderc_vertex_shader;
191  case SourceType::kFragmentShader:
192  return shaderc_shader_kind::shaderc_fragment_shader;
193  case SourceType::kComputeShader:
194  return shaderc_shader_kind::shaderc_compute_shader;
195  case SourceType::kUnknown:
196  break;
197  }
198  return shaderc_shader_kind::shaderc_glsl_infer_from_source;
199 }

References kComputeShader, kFragmentShader, kUnknown, kVertexShader, and type.

Referenced by impeller::compiler::SPIRVCompiler::CompileToSPV().

◆ ToSourceLanguage()

SourceLanguage impeller::compiler::ToSourceLanguage ( const std::string &  source_language)

Definition at line 64 of file types.cc.

64  {
65  if (source_language == "glsl") {
66  return SourceLanguage::kGLSL;
67  }
68  if (source_language == "hlsl") {
69  return SourceLanguage::kHLSL;
70  }
71  return SourceLanguage::kUnknown;
72 }

References kGLSL, kHLSL, and kUnknown.

Referenced by ParseShaderBundleConfig(), and impeller::compiler::Switches::Switches().

◆ ToStage() [1/2]

static std::optional<fb::Stage> impeller::compiler::ToStage ( spv::ExecutionModel  stage)
static

Definition at line 33 of file runtime_stage_data.cc.

33  {
34  switch (stage) {
35  case spv::ExecutionModel::ExecutionModelVertex:
36  return fb::Stage::kVertex;
37  case spv::ExecutionModel::ExecutionModelFragment:
38  return fb::Stage::kFragment;
39  case spv::ExecutionModel::ExecutionModelGLCompute:
40  return fb::Stage::kCompute;
41  default:
42  return std::nullopt;
43  }
44  FML_UNREACHABLE();
45 }

Referenced by impeller::compiler::ShaderBundleData::CreateFlatbuffer(), and impeller::compiler::RuntimeStageData::CreateStageFlatbuffer().

◆ ToStage() [2/2]

static std::optional<fb::shaderbundle::ShaderStage> impeller::compiler::ToStage ( spv::ExecutionModel  stage)
static

Definition at line 41 of file shader_bundle_data.cc.

42  {
43  switch (stage) {
44  case spv::ExecutionModel::ExecutionModelVertex:
45  return fb::shaderbundle::ShaderStage::kVertex;
46  case spv::ExecutionModel::ExecutionModelFragment:
47  return fb::shaderbundle::ShaderStage::kFragment;
48  case spv::ExecutionModel::ExecutionModelGLCompute:
49  return fb::shaderbundle::ShaderStage::kCompute;
50  default:
51  return std::nullopt;
52  }
53  FML_UNREACHABLE();
54 }

◆ ToString()

static std::string impeller::compiler::ToString ( CompilerBackend::Type  type)
static

Definition at line 575 of file reflector.cc.

575  {
576  switch (type) {
577  case CompilerBackend::Type::kMSL:
578  return "Metal Shading Language";
579  case CompilerBackend::Type::kGLSL:
580  return "OpenGL Shading Language";
581  case CompilerBackend::Type::kGLSLVulkan:
582  return "OpenGL Shading Language (Relaxed Vulkan Semantics)";
583  case CompilerBackend::Type::kSkSL:
584  return "SkSL Shading Language";
585  }
586  FML_UNREACHABLE();
587 }

References impeller::compiler::CompilerBackend::kGLSL, impeller::compiler::CompilerBackend::kGLSLVulkan, impeller::compiler::CompilerBackend::kMSL, impeller::compiler::CompilerBackend::kSkSL, and type.

◆ ToUniformType() [1/2]

static std::optional<fb::UniformDataType> impeller::compiler::ToUniformType ( spirv_cross::SPIRType::BaseType  type)
static

Definition at line 61 of file runtime_stage_data.cc.

62  {
63  switch (type) {
64  case spirv_cross::SPIRType::Float:
66  case spirv_cross::SPIRType::SampledImage:
68  case spirv_cross::SPIRType::Struct:
70  case spirv_cross::SPIRType::Boolean:
71  case spirv_cross::SPIRType::SByte:
72  case spirv_cross::SPIRType::UByte:
73  case spirv_cross::SPIRType::Short:
74  case spirv_cross::SPIRType::UShort:
75  case spirv_cross::SPIRType::Int:
76  case spirv_cross::SPIRType::UInt:
77  case spirv_cross::SPIRType::Int64:
78  case spirv_cross::SPIRType::UInt64:
79  case spirv_cross::SPIRType::Half:
80  case spirv_cross::SPIRType::Double:
81  case spirv_cross::SPIRType::AccelerationStructure:
82  case spirv_cross::SPIRType::AtomicCounter:
83  case spirv_cross::SPIRType::Char:
84  case spirv_cross::SPIRType::ControlPointArray:
85  case spirv_cross::SPIRType::Image:
86  case spirv_cross::SPIRType::Interpolant:
87  case spirv_cross::SPIRType::RayQuery:
88  case spirv_cross::SPIRType::Sampler:
89  case spirv_cross::SPIRType::Unknown:
90  case spirv_cross::SPIRType::Void:
91  return std::nullopt;
92  }
93  FML_UNREACHABLE();
94 }

References impeller::kFloat, impeller::kSampledImage, impeller::kStruct, and type.

Referenced by impeller::compiler::ShaderBundleData::CreateFlatbuffer(), and impeller::compiler::RuntimeStageData::CreateStageFlatbuffer().

◆ ToUniformType() [2/2]

static std::optional<fb::shaderbundle::UniformDataType> impeller::compiler::ToUniformType ( spirv_cross::SPIRType::BaseType  type)
static

Definition at line 56 of file shader_bundle_data.cc.

57  {
58  switch (type) {
59  case spirv_cross::SPIRType::Boolean:
60  return fb::shaderbundle::UniformDataType::kBoolean;
61  case spirv_cross::SPIRType::SByte:
62  return fb::shaderbundle::UniformDataType::kSignedByte;
63  case spirv_cross::SPIRType::UByte:
64  return fb::shaderbundle::UniformDataType::kUnsignedByte;
65  case spirv_cross::SPIRType::Short:
66  return fb::shaderbundle::UniformDataType::kSignedShort;
67  case spirv_cross::SPIRType::UShort:
68  return fb::shaderbundle::UniformDataType::kUnsignedShort;
69  case spirv_cross::SPIRType::Int:
70  return fb::shaderbundle::UniformDataType::kSignedInt;
71  case spirv_cross::SPIRType::UInt:
72  return fb::shaderbundle::UniformDataType::kUnsignedInt;
73  case spirv_cross::SPIRType::Int64:
74  return fb::shaderbundle::UniformDataType::kSignedInt64;
75  case spirv_cross::SPIRType::UInt64:
76  return fb::shaderbundle::UniformDataType::kUnsignedInt64;
77  case spirv_cross::SPIRType::Half:
78  return fb::shaderbundle::UniformDataType::kHalfFloat;
79  case spirv_cross::SPIRType::Float:
81  case spirv_cross::SPIRType::Double:
82  return fb::shaderbundle::UniformDataType::kDouble;
83  case spirv_cross::SPIRType::SampledImage:
85  case spirv_cross::SPIRType::AccelerationStructure:
86  case spirv_cross::SPIRType::AtomicCounter:
87  case spirv_cross::SPIRType::Char:
88  case spirv_cross::SPIRType::ControlPointArray:
89  case spirv_cross::SPIRType::Image:
90  case spirv_cross::SPIRType::Interpolant:
91  case spirv_cross::SPIRType::RayQuery:
92  case spirv_cross::SPIRType::Sampler:
93  case spirv_cross::SPIRType::Struct:
94  case spirv_cross::SPIRType::Unknown:
95  case spirv_cross::SPIRType::Void:
96  return std::nullopt;
97  }
98  FML_UNREACHABLE();
99 }

References impeller::kFloat, impeller::kSampledImage, and type.

◆ TypeNameWithPaddingOfSize()

static std::string impeller::compiler::TypeNameWithPaddingOfSize ( size_t  size)
static

Definition at line 743 of file reflector.cc.

743  {
744  std::stringstream stream;
745  stream << "Padding<" << size << ">";
746  return stream.str();
747 }

Referenced by VertexTypeFromInputResource().

◆ Utf8FromPath()

std::string impeller::compiler::Utf8FromPath ( const std::filesystem::path &  path)

Converts a native format path to a utf8 string.

    This utility uses `path::u8string()` to convert native paths to
    utf8. If the given path doesn't match the underlying native path
    format, and the native path format isn't utf8 (i.e. Windows, which
    has utf16 paths), the path will get mangled. 

Definition at line 30 of file utilities.cc.

30  {
31  return reinterpret_cast<const char*>(path.u8string().c_str());
32 }

Referenced by impeller::compiler::Switches::AreValid(), CreateReflectorOptions(), EntryPointFunctionNameFromSourceName(), GenerateShaderBundle(), InferShaderNameFromPath(), Main(), OutputDepfile(), OutputIPLR(), OutputReflectionData(), OutputSLFile(), and impeller::compiler::Switches::Switches().

◆ VertexTypeFromInputResource()

static VertexType impeller::compiler::VertexTypeFromInputResource ( const spirv_cross::Compiler &  compiler,
const spirv_cross::Resource *  resource 
)
static

Definition at line 1202 of file reflector.cc.

1204  {
1205  VertexType result;
1206  result.variable_name = resource->name;
1207  const auto& type = compiler.get_type(resource->type_id);
1208  result.base_type = type.basetype;
1209  const auto total_size = type.columns * type.vecsize * type.width / 8u;
1210  result.byte_length = total_size;
1211 
1212  if (type.basetype == spirv_cross::SPIRType::BaseType::Float &&
1213  type.columns == 1u && type.vecsize == 2u &&
1214  type.width == sizeof(float) * 8u) {
1215  result.type_name = "Point";
1216  } else if (type.basetype == spirv_cross::SPIRType::BaseType::Float &&
1217  type.columns == 1u && type.vecsize == 4u &&
1218  type.width == sizeof(float) * 8u) {
1219  result.type_name = "Vector4";
1220  } else if (type.basetype == spirv_cross::SPIRType::BaseType::Float &&
1221  type.columns == 1u && type.vecsize == 3u &&
1222  type.width == sizeof(float) * 8u) {
1223  result.type_name = "Vector3";
1224  } else if (type.basetype == spirv_cross::SPIRType::BaseType::Float &&
1225  type.columns == 1u && type.vecsize == 1u &&
1226  type.width == sizeof(float) * 8u) {
1227  result.type_name = "Scalar";
1228  } else if (type.basetype == spirv_cross::SPIRType::BaseType::Int &&
1229  type.columns == 1u && type.vecsize == 1u &&
1230  type.width == sizeof(int32_t) * 8u) {
1231  result.type_name = "int32_t";
1232  } else {
1233  // Catch all unknown padding.
1234  result.type_name = TypeNameWithPaddingOfSize(total_size);
1235  }
1236 
1237  return result;
1238 }
static std::string TypeNameWithPaddingOfSize(size_t size)
Definition: reflector.cc:743

References impeller::compiler::VertexType::base_type, impeller::compiler::VertexType::byte_length, type, impeller::compiler::VertexType::type_name, TypeNameWithPaddingOfSize(), and impeller::compiler::VertexType::variable_name.

Variable Documentation

◆ kEntrypointKey

const char* impeller::compiler::kEntrypointKey = "entrypoint"
static

◆ kExternalTexturePrefix

constexpr char impeller::compiler::kExternalTexturePrefix[] = "SAMPLER_EXTERNAL_OES_"
constexpr

Definition at line 11 of file constants.h.

Referenced by CreateGLSLCompiler().

◆ kKnownPlatforms

const std::map<std::string, TargetPlatform> impeller::compiler::kKnownPlatforms
static
Initial value:
= {
{"metal-desktop", TargetPlatform::kMetalDesktop},
{"metal-ios", TargetPlatform::kMetalIOS},
{"vulkan", TargetPlatform::kVulkan},
{"opengl-es", TargetPlatform::kOpenGLES},
{"opengl-desktop", TargetPlatform::kOpenGLDesktop},
}

Definition at line 20 of file switches.cc.

Referenced by impeller::compiler::Switches::PrintHelp(), and TargetPlatformFromCommandLine().

◆ kKnownRuntimeStages

const std::map<std::string, TargetPlatform> impeller::compiler::kKnownRuntimeStages
static
Initial value:
= {
{"sksl", TargetPlatform::kSkSL},
{"runtime-stage-metal", TargetPlatform::kRuntimeStageMetal},
{"runtime-stage-gles", TargetPlatform::kRuntimeStageGLES},
{"runtime-stage-gles3", TargetPlatform::kRuntimeStageGLES3},
{"runtime-stage-vulkan", TargetPlatform::kRuntimeStageVulkan},
}

Definition at line 28 of file switches.cc.

Referenced by impeller::compiler::Switches::PrintHelp(), and RuntimeStagesFromCommandLine().

◆ kKnownSourceTypes

const std::map<std::string, SourceType> impeller::compiler::kKnownSourceTypes
static
Initial value:
= {
{"vert", SourceType::kVertexShader},
{"frag", SourceType::kFragmentShader},
{"comp", SourceType::kComputeShader},
}

Definition at line 36 of file switches.cc.

Referenced by impeller::compiler::Switches::PrintHelp(), and SourceTypeFromCommandLine().

◆ kMaxUniformBufferSize

const uint32_t impeller::compiler::kMaxUniformBufferSize = 6208
static

Definition at line 38 of file compiler.cc.

Referenced by impeller::compiler::Compiler::Compiler().

◆ kReflectionCCTemplate

constexpr std::string_view impeller::compiler::kReflectionCCTemplate
constexpr

Definition at line 202 of file code_gen_template.h.

◆ kReflectionHeaderTemplate

constexpr std::string_view impeller::compiler::kReflectionHeaderTemplate
constexpr

Definition at line 10 of file code_gen_template.h.

◆ kShaderKey

const char* impeller::compiler::kShaderKey = "shader"
static

◆ kStageKey

const char* impeller::compiler::kStageKey = "stage"
static

◆ kTargetPlatformKey

const char* impeller::compiler::kTargetPlatformKey = "target_platform"
static

Definition at line 185 of file runtime_stage_data.cc.

◆ kUniformArrayElementsKey

const char* impeller::compiler::kUniformArrayElementsKey = "array_elements"
static

◆ kUniformBitWidthKey

const char* impeller::compiler::kUniformBitWidthKey = "bit_width"
static

◆ kUniformColumnsKey

const char* impeller::compiler::kUniformColumnsKey = "columns"
static

◆ kUniformLocationKey

const char* impeller::compiler::kUniformLocationKey = "location"
static

◆ kUniformNameKey

const char* impeller::compiler::kUniformNameKey = "name"
static

◆ kUniformRowsKey

const char* impeller::compiler::kUniformRowsKey = "rows"
static

◆ kUniformsKey

const char* impeller::compiler::kUniformsKey = "uniforms"
static

◆ kUniformTypeKey

const char* impeller::compiler::kUniformTypeKey = "type"
static