Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
impeller::compiler Namespace Reference

Namespaces

namespace  testing
 

Classes

class  AutoLogger
 
class  Compiler
 
struct  CompilerBackend
 
class  CompilerSkSL
 
struct  IncludeDir
 
class  Includer
 
struct  IncluderData
 
struct  InputDescription
 
struct  KnownType
 
class  Reflector
 
class  RuntimeStageData
 
class  ShaderBundleData
 
struct  ShaderConfig
 A shader config parsed as part of a ShaderBundleConfig. More...
 
struct  SourceOptions
 
class  SPIRVCompiler
 
struct  SPIRVCompilerOptions
 
struct  SPIRVCompilerSourceProfile
 
struct  SPIRVCompilerTargetEnv
 
struct  StructField
 
struct  StructMember
 
class  Switches
 
struct  UniformDescription
 
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  VertexType
 

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)
 
bool Main (const fml::CommandLine &command_line)
 
static std::string ExecutionModelToStringName (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.
 
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.
 
static std::unique_ptr< fb::shaderbundle::BackendShaderT > GenerateShaderBackendFB (TargetPlatform target_platform, SourceOptions &options, const std::string &shader_name, const ShaderConfig &shader_config, std::set< std::string > *out_dependencies)
 
static std::unique_ptr< fb::shaderbundle::ShaderT > GenerateShaderFB (SourceOptions options, const std::string &shader_name, const ShaderConfig &shader_config, std::set< std::string > *out_dependencies)
 
std::optional< fb::shaderbundle::ShaderBundleT > GenerateShaderBundleFlatbuffer (const std::string &bundle_config_json, const SourceOptions &options, std::set< std::string > *out_dependencies=nullptr)
 Parses the JSON shader bundle configuration and invokes the compiler multiple times to produce a shader bundle flatbuffer.
 
static bool OutputBundleDepfile (const Switches &switches, const std::string &target, const std::set< std::string > &dependencies)
 
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.
 
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 std::filesystem::path GetOptionAsPath (const fml::CommandLine &command_line, const char *arg)
 
SourceType SourceTypeFromFileName (const std::filesystem::path &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::filesystem::path &file_name, SourceType type, SourceLanguage source_language, const std::string &entry_point_name)
 
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 SetPermissiveAccess (const std::filesystem::path &p)
 Sets the file access mode of the file at path 'p' to 0644.
 
std::string Utf8FromPath (const std::filesystem::path &path)
 Converts a native format path to a utf8 string.
 
std::string InferShaderNameFromPath (const std::filesystem::path &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.
 
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 * kFormatVersionKey = "format_version"
 
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 char * kUniformStructElementsKey = "struct_elements"
 
static const std::map< std::string, TargetPlatformkKnownPlatforms
 
static const std::vector< std::pair< std::string, TargetPlatform > > kKnownRuntimeStages
 
static const std::map< std::string, SourceTypekKnownSourceTypes
 

Typedef Documentation

◆ ShaderBundleConfig

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

Definition at line 97 of file types.h.

Enumeration Type Documentation

◆ SourceLanguage

Enumerator
kUnknown 
kGLSL 
kHLSL 

Definition at line 44 of file types.h.

◆ SourceType

enum class impeller::compiler::SourceType
strong
Enumerator
kUnknown 
kVertexShader 
kFragmentShader 
kComputeShader 

Definition at line 23 of file types.h.

◆ TargetPlatform

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

Definition at line 30 of file types.h.

Function Documentation

◆ 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 68 of file utilities.cc.

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

References i, and length.

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 234 of file compiler.cc.

235 {
236 CompilerBackend compiler;
237 switch (source_options.target_platform) {
238 case TargetPlatform::kMetalDesktop:
239 case TargetPlatform::kMetalIOS:
240 case TargetPlatform::kRuntimeStageMetal:
241 compiler = CreateMSLCompiler(ir, source_options);
242 break;
243 case TargetPlatform::kVulkan:
244 case TargetPlatform::kRuntimeStageVulkan:
245 compiler = CreateVulkanCompiler(ir, source_options);
246 break;
247 case TargetPlatform::kOpenGLES:
248 case TargetPlatform::kOpenGLDesktop:
249 case TargetPlatform::kRuntimeStageGLES:
250 case TargetPlatform::kRuntimeStageGLES3:
251 compiler = CreateGLSLCompiler(ir, source_options);
252 break;
253 case TargetPlatform::kSkSL:
254 compiler = CreateSkSLCompiler(ir, source_options);
255 break;
256 case TargetPlatform::kUnknown:
258 }
259 if (!compiler) {
260 return {};
261 }
262 auto* backend = compiler.GetCompiler();
263 if (!EntryPointMustBeNamedMain(source_options.target_platform) &&
264 source_options.source_language == SourceLanguage::kGLSL) {
265 backend->rename_entry_point("main", source_options.entry_point_name,
266 ToExecutionModel(source_options.type));
267 }
268 return compiler;
269}
#define FML_UNREACHABLE()
Definition logging.h:128
static CompilerBackend CreateSkSLCompiler(const spirv_cross::ParsedIR &ir, const SourceOptions &source_options)
Definition compiler.cc:208
static CompilerBackend CreateVulkanCompiler(const spirv_cross::ParsedIR &ir, const SourceOptions &source_options)
Definition compiler.cc:138
static bool EntryPointMustBeNamedMain(TargetPlatform platform)
Definition compiler.cc:214
static CompilerBackend CreateMSLCompiler(const spirv_cross::ParsedIR &ir, const SourceOptions &source_options, std::optional< uint32_t > msl_version_override={})
Definition compiler.cc:67
static CompilerBackend CreateGLSLCompiler(const spirv_cross::ParsedIR &ir, const SourceOptions &source_options)
Definition compiler.cc:150
spv::ExecutionModel ToExecutionModel(SourceType type)
Definition types.cc:169
spirv_cross::Compiler * GetCompiler()

References CreateGLSLCompiler(), CreateMSLCompiler(), CreateSkSLCompiler(), CreateVulkanCompiler(), impeller::compiler::SourceOptions::entry_point_name, EntryPointMustBeNamedMain(), FML_UNREACHABLE, 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(), and Main().

◆ CreateGLSLCompiler()

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

Definition at line 150 of file compiler.cc.

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

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 67 of file compiler.cc.

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

◆ CreateSkSLCompiler()

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

Definition at line 208 of file compiler.cc.

209 {
210 auto sksl_compiler = std::make_shared<CompilerSkSL>(ir);
211 return CompilerBackend(sksl_compiler);
212}

Referenced by CreateCompiler().

◆ CreateVulkanCompiler()

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

Definition at line 138 of file compiler.cc.

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

Referenced by CreateCompiler().

◆ EntryPointFunctionNameFromSourceName()

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

Definition at line 101 of file types.cc.

105 {
106 if (source_language == SourceLanguage::kHLSL) {
107 return entry_point_name;
108 }
109
110 std::stringstream stream;
111 stream << ConvertToEntrypointName(Utf8FromPath(file_name.stem())) << "_";
112 switch (type) {
113 case SourceType::kUnknown:
114 stream << "unknown";
115 break;
116 case SourceType::kVertexShader:
117 stream << "vertex";
118 break;
119 case SourceType::kFragmentShader:
120 stream << "fragment";
121 break;
122 case SourceType::kComputeShader:
123 stream << "compute";
124 break;
125 }
126 stream << "_main";
127 return stream.str();
128}

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

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

◆ EntryPointMustBeNamedMain()

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

Definition at line 214 of file compiler.cc.

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

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

Referenced by CreateCompiler().

◆ ExecutionModelToStringName()

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

Definition at line 35 of file reflector.cc.

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

◆ 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,
std::set< std::string > *  out_dependencies 
)
static

Override options.

Definition at line 91 of file shader_bundle.cc.

95 {
96 auto result = std::make_unique<fb::shaderbundle::BackendShaderT>();
97
98 std::shared_ptr<fml::FileMapping> source_file_mapping =
100 if (!source_file_mapping) {
101 std::cerr << "Could not open file for bundled shader \"" << shader_name
102 << "\"." << std::endl;
103 return nullptr;
104 }
105
106 /// Override options.
107 options.target_platform = target_platform;
108 options.file_name = shader_name; // This is just used for error messages.
109 options.type = shader_config.type;
110 options.source_language = shader_config.language;
111 options.entry_point_name = EntryPointFunctionNameFromSourceName(
112 shader_config.source_file_name, options.type, options.source_language,
113 shader_config.entry_point);
114
115 Reflector::Options reflector_options;
116 reflector_options.target_platform = options.target_platform;
117 reflector_options.entry_point_name = options.entry_point_name;
118 reflector_options.shader_name = shader_name;
119
120 Compiler compiler(source_file_mapping, options, reflector_options);
121 if (!compiler.IsValid()) {
122 std::cerr << "Compilation failed for bundled shader \"" << shader_name
123 << "\"." << std::endl;
124 std::cerr << compiler.GetErrorMessages() << std::endl;
125 return nullptr;
126 }
127
128 // Record dependencies so the caller can emit a depfile. The shader's
129 // source file plus every transitive `#include` that contributed to
130 // the compilation. The same source is compiled across multiple
131 // target platforms; the std::set dedupes naturally.
132 if (out_dependencies) {
133 out_dependencies->insert(shader_config.source_file_name);
134 for (const auto& included : compiler.GetIncludedFileNames()) {
135 out_dependencies->insert(included);
136 }
137 }
138
139 auto reflector = compiler.GetReflector();
140 if (reflector == nullptr) {
141 std::cerr << "Could not create reflector for bundled shader \""
142 << shader_name << "\"." << std::endl;
143 return nullptr;
144 }
145
146 auto bundle_data = reflector->GetShaderBundleData();
147 if (!bundle_data) {
148 std::cerr << "Bundled shader information was nil for \"" << shader_name
149 << "\"." << std::endl;
150 return nullptr;
151 }
152
153 result = bundle_data->CreateFlatbuffer();
154 if (!result) {
155 std::cerr << "Failed to create flatbuffer for bundled shader \""
156 << shader_name << "\"." << std::endl;
157 return nullptr;
158 }
159
160 return result;
161}
static std::unique_ptr< FileMapping > CreateReadOnly(const std::string &path)
Definition mapping.cc:20
std::filesystem::path file_name

References fml::FileMapping::CreateReadOnly(), 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::GetIncludedFileNames(), 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.

Collect dependencies along the way so a depfile can be emitted after the bundle is written. The same source file is compiled across multiple target platforms; the std::set dedupes naturally.

  1. Serialize the shader bundle and write to disk.
  1. Output a depfile if one was requested.

Lets build systems (notably Dart's hooks framework, which flutter_gpu_shaders' buildShaderBundleJson consumer goes through) rerun the bundle build when any contributing source file or #included header changes.

Definition at line 273 of file shader_bundle.cc.

273 {
274 // --------------------------------------------------------------------------
275 /// 1. Parse the shader bundle and generate the flatbuffer result.
276 ///
277 /// Collect dependencies along the way so a depfile can be emitted
278 /// after the bundle is written. The same source file is compiled
279 /// across multiple target platforms; the std::set dedupes naturally.
280 ///
281
282 std::set<std::string> dependencies;
283 const bool want_depfile = !switches.depfile_path.empty();
284 auto shader_bundle = GenerateShaderBundleFlatbuffer(
285 switches.shader_bundle, switches.CreateSourceOptions(),
286 want_depfile ? &dependencies : nullptr);
287 if (!shader_bundle.has_value()) {
288 // Specific error messages are already handled by
289 // GenerateShaderBundleFlatbuffer.
290 return false;
291 }
292
293 // --------------------------------------------------------------------------
294 /// 2. Serialize the shader bundle and write to disk.
295 ///
296
297 auto builder = std::make_shared<flatbuffers::FlatBufferBuilder>();
298 builder->Finish(fb::shaderbundle::ShaderBundle::Pack(*builder.get(),
299 &shader_bundle.value()),
300 fb::shaderbundle::ShaderBundleIdentifier());
301 auto mapping = std::make_shared<fml::NonOwnedMapping>(
302 builder->GetBufferPointer(), builder->GetSize(),
303 [builder](auto, auto) {});
304
305 auto sl_file_name = std::filesystem::absolute(
306 std::filesystem::current_path() / switches.sl_file_name);
307
308 if (!fml::WriteAtomically(*switches.working_directory, //
309 Utf8FromPath(sl_file_name).c_str(), //
310 *mapping //
311 )) {
312 std::cerr << "Could not write file to " << switches.sl_file_name
313 << std::endl;
314 return false;
315 }
316 // Tools that consume the runtime stage data expect the access mode to
317 // be 0644.
318 if (!SetPermissiveAccess(sl_file_name)) {
319 return false;
320 }
321
322 // --------------------------------------------------------------------------
323 /// 3. Output a depfile if one was requested.
324 ///
325 /// Lets build systems (notably Dart's `hooks` framework, which
326 /// `flutter_gpu_shaders`' `buildShaderBundleJson` consumer goes
327 /// through) rerun the bundle build when any contributing source file
328 /// or `#include`d header changes.
329
330 if (want_depfile) {
331 if (!OutputBundleDepfile(switches, Utf8FromPath(sl_file_name),
332 dependencies)) {
333 return false;
334 }
335 }
336
337 return true;
338}
std::filesystem::path sl_file_name
Definition switches.h:31
std::shared_ptr< fml::UniqueFD > working_directory
Definition switches.h:24
SourceOptions CreateSourceOptions() const
Definition switches.cc:319
std::filesystem::path depfile_path
Definition switches.h:38
bool WriteAtomically(const fml::UniqueFD &base_directory, const char *file_name, const Mapping &mapping)
std::optional< fb::shaderbundle::ShaderBundleT > GenerateShaderBundleFlatbuffer(const std::string &bundle_config_json, const SourceOptions &options, std::set< std::string > *out_dependencies)
Parses the JSON shader bundle configuration and invokes the compiler multiple times to produce a shad...
static bool OutputBundleDepfile(const Switches &switches, const std::string &target, const std::set< std::string > &dependencies)
std::string Utf8FromPath(const std::filesystem::path &path)
Converts a native format path to a utf8 string.
Definition utilities.cc:30

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

Referenced by Main().

◆ GenerateShaderBundleFlatbuffer()

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

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.
Parameters
out_dependenciesOptional. When non-null, populated with the set of source files (including transitive #includes) that contributed to the generated bundle. Used by GenerateShaderBundle to emit a depfile when --depfile is set.
  1. Parse the bundle configuration.
  1. Build the deserialized shader bundle.

Definition at line 203 of file shader_bundle.cc.

206 {
207 // --------------------------------------------------------------------------
208 /// 1. Parse the bundle configuration.
209 ///
210
211 std::optional<ShaderBundleConfig> bundle_config =
212 ParseShaderBundleConfig(bundle_config_json, std::cerr);
213 if (!bundle_config) {
214 return std::nullopt;
215 }
216
217 // --------------------------------------------------------------------------
218 /// 2. Build the deserialized shader bundle.
219 ///
220
221 fb::shaderbundle::ShaderBundleT shader_bundle;
222 shader_bundle.format_version = static_cast<uint32_t>(
223 fb::shaderbundle::ShaderBundleFormatVersion::kVersion);
224
225 for (const auto& [shader_name, shader_config] : bundle_config.value()) {
226 std::unique_ptr<fb::shaderbundle::ShaderT> shader =
227 GenerateShaderFB(options, shader_name, shader_config, out_dependencies);
228 if (!shader) {
229 return std::nullopt;
230 }
231 shader_bundle.shaders.push_back(std::move(shader));
232 }
233
234 return shader_bundle;
235}
int32_t value
std::optional< ShaderBundleConfig > ParseShaderBundleConfig(const std::string &bundle_config_json, std::ostream &error_stream)
Parse a shader bundle configuration from a given JSON string.

References GenerateShaderFB(), and ParseShaderBundleConfig().

Referenced by GenerateShaderBundle(), impeller::compiler::testing::TEST(), impeller::compiler::testing::TEST(), 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,
std::set< std::string > *  out_dependencies 
)
static

Definition at line 163 of file shader_bundle.cc.

167 {
168 auto result = std::make_unique<fb::shaderbundle::ShaderT>();
169 result->name = shader_name;
170 result->metal_ios =
171 GenerateShaderBackendFB(TargetPlatform::kMetalIOS, options, shader_name,
172 shader_config, out_dependencies);
173 if (!result->metal_ios) {
174 return nullptr;
175 }
176 result->metal_desktop =
177 GenerateShaderBackendFB(TargetPlatform::kMetalDesktop, options,
178 shader_name, shader_config, out_dependencies);
179 if (!result->metal_desktop) {
180 return nullptr;
181 }
182 result->opengl_es =
183 GenerateShaderBackendFB(TargetPlatform::kOpenGLES, options, shader_name,
184 shader_config, out_dependencies);
185 if (!result->opengl_es) {
186 return nullptr;
187 }
188 result->opengl_desktop =
189 GenerateShaderBackendFB(TargetPlatform::kOpenGLDesktop, options,
190 shader_name, shader_config, out_dependencies);
191 if (!result->opengl_desktop) {
192 return nullptr;
193 }
194 result->vulkan =
195 GenerateShaderBackendFB(TargetPlatform::kVulkan, options, shader_name,
196 shader_config, out_dependencies);
197 if (!result->vulkan) {
198 return nullptr;
199 }
200 return result;
201}
static std::unique_ptr< fb::shaderbundle::BackendShaderT > GenerateShaderBackendFB(TargetPlatform target_platform, SourceOptions &options, const std::string &shader_name, const ShaderConfig &shader_config, std::set< std::string > *out_dependencies)

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

Referenced by GenerateShaderBundleFlatbuffer().

◆ GetOptionAsPath()

static std::filesystem::path impeller::compiler::GetOptionAsPath ( const fml::CommandLine command_line,
const char *  arg 
)
static

Definition at line 171 of file switches.cc.

173 {
174 std::string value = command_line.GetOptionValueWithDefault(arg, "");
175 return std::filesystem::path(std::u8string(value.begin(), value.end()));
176}
std::string GetOptionValueWithDefault(std::string_view name, std::string_view default_value) const

References fml::CommandLine::GetOptionValueWithDefault(), and value.

◆ 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 853 of file reflector.cc.

853 {
854 auto struct_size = 0u;
855 for (const auto& member : members) {
856 struct_size += member.byte_length;
857 }
858 return struct_size;
859}

◆ GetRuntimeStageBackend()

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

Definition at line 317 of file reflector.cc.

318 {
319 switch (target_platform) {
320 case TargetPlatform::kUnknown:
321 case TargetPlatform::kMetalDesktop:
322 case TargetPlatform::kMetalIOS:
323 case TargetPlatform::kOpenGLES:
324 case TargetPlatform::kOpenGLDesktop:
325 case TargetPlatform::kVulkan:
326 return std::nullopt;
327 case TargetPlatform::kRuntimeStageMetal:
328 return RuntimeStageBackend::kMetal;
329 case TargetPlatform::kRuntimeStageGLES:
330 return RuntimeStageBackend::kOpenGLES;
331 case TargetPlatform::kRuntimeStageGLES3:
332 return RuntimeStageBackend::kOpenGLES3;
333 case TargetPlatform::kRuntimeStageVulkan:
334 return RuntimeStageBackend::kVulkan;
335 case TargetPlatform::kSkSL:
336 return RuntimeStageBackend::kSkSL;
337 }
339}

References FML_UNREACHABLE, 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 ( const std::filesystem::path &  path)

Definition at line 34 of file utilities.cc.

34 {
35 return Utf8FromPath(path.stem());
36}

References Utf8FromPath().

◆ JoinStrings()

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

Definition at line 628 of file compiler.cc.

629 {
630 std::stringstream stream;
631 for (size_t i = 0, count = items.size(); i < count; i++) {
632 const auto is_last = (i == count - 1);
633
634 stream << items[i];
635 if (!is_last) {
636 stream << separator;
637 }
638 }
639 return stream.str();
640}

References i.

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

◆ Main()

bool impeller::compiler::Main ( const fml::CommandLine command_line)
  1. Output the source file. When in IPLR/RuntimeStage mode, output the serialized IPLR flatbuffer. Otherwise output the shader source in the target shading language.
  1. Output SPIRV file.
  1. Output shader reflection data. May include a JSON file, a C++ header, and/or a C++ TU.
  1. Output a depfile.

Definition at line 197 of file impellerc_main.cc.

197 {
199 if (command_line.HasOption("help")) {
200 Switches::PrintHelp(std::cout);
201 return true;
202 }
203
204 Switches switches(command_line);
205 if (!switches.AreValid(std::cerr)) {
206 std::cerr << "Invalid flags specified." << std::endl;
207 Switches::PrintHelp(std::cerr);
208 return false;
209 }
210
211 if (!switches.shader_bundle.empty()) {
212 // Invoke the compiler multiple times to build a shader bundle with the
213 // given shader_bundle spec.
214 return GenerateShaderBundle(switches);
215 }
216
217 std::shared_ptr<fml::FileMapping> source_file_mapping =
218 fml::FileMapping::CreateReadOnly(Utf8FromPath(switches.source_file_name));
219 if (!source_file_mapping) {
220 std::cerr << "Could not open input file." << std::endl;
221 return false;
222 }
223
224 std::vector<std::shared_ptr<Compiler>> compilers;
225 compilers.reserve(switches.PlatformsToCompile().size());
226 for (const auto& platform : switches.PlatformsToCompile()) {
227 std::shared_ptr<Compiler> compiler =
228 CreateCompiler(platform, source_file_mapping, switches);
229 if (compiler->IsValid()) {
230 compilers.push_back(compiler);
231 } else {
232 std::cerr << "Compilation failed for target: "
233 << TargetPlatformToString(platform) << std::endl;
234
235 std::string verbose_error_messages = compiler->GetVerboseErrorMessages();
236 if (verbose_error_messages.empty()) {
237 // No verbose error messages. Output the regular error messages.
238 std::cerr << compiler->GetErrorMessages();
239 } else {
240 if (switches.verbose) {
241 // Verbose messages are available and the --verbose flag was set.
242 // Directly output the verbose error messages.
243 std::cerr << verbose_error_messages;
244 } else {
245 // Verbose messages are available and the --verbose flag was not set.
246 // Output the regular error messages and write the verbose error
247 // messages to a file.
248 std::cerr << compiler->GetErrorMessages();
249 OutputVerboseErrorFile(verbose_error_messages, switches);
250 }
251 }
252
253 return false;
254 }
255 }
256
257 // --------------------------------------------------------------------------
258 /// 1. Output the source file. When in IPLR/RuntimeStage mode, output the
259 /// serialized IPLR flatbuffer. Otherwise output the shader source in the
260 /// target shading language.
261 ///
262
263 if (switches.iplr) {
264 if (!OutputIPLR(compilers, switches)) {
265 return false;
266 }
267 } else {
268 // Non-IPLR mode is supported only for single platform targets. There is
269 // exactly 1 created compiler for this case.
270 FML_DCHECK(compilers.size() == 1);
271 if (!OutputSLFile(*compilers.front(), switches)) {
272 return false;
273 }
274 }
275
276 // Use the first compiler for outputting the SPIRV file, reflection data, and
277 // the depfile. The SPIRV and depfile outputs do not depend on the target
278 // platform, so any valid compiler can be used. Reflection data output is only
279 // supported for single platform targets, so it uses the first (only) valid
280 // compiler as well.
281 auto first_valid_compiler = compilers.front();
282
283 // --------------------------------------------------------------------------
284 /// 2. Output SPIRV file.
285 ///
286
287 if (!OutputSPIRV(*first_valid_compiler, switches)) {
288 return false;
289 }
290
291 // --------------------------------------------------------------------------
292 /// 3. Output shader reflection data.
293 /// May include a JSON file, a C++ header, and/or a C++ TU.
294 ///
295
296 if (ShouldOutputReflectionData(switches)) {
297 // Outputting reflection data is supported only for single platform targets.
298 FML_DCHECK(compilers.size() == 1);
299 if (!OutputReflectionData(*first_valid_compiler, switches)) {
300 return false;
301 }
302 }
303
304 // --------------------------------------------------------------------------
305 /// 4. Output a depfile.
306 ///
307
308 // Dep file output does not depend on the target platform. Any valid compiler
309 // can be used to output it. Arbitrarily pick the first valid compiler.
310 if (!OutputDepfile(*first_valid_compiler, switches)) {
311 return false;
312 }
313
314 return true;
315}
bool HasOption(std::string_view name, size_t *index=nullptr) const
#define FML_DCHECK(condition)
Definition logging.h:122
void InstallCrashHandler()
Definition backtrace.cc:126
std::string TargetPlatformToString(TargetPlatform platform)
Definition types.cc:62

References impeller::compiler::Switches::AreValid(), CreateCompiler(), fml::FileMapping::CreateReadOnly(), FML_DCHECK, GenerateShaderBundle(), fml::CommandLine::HasOption(), fml::InstallCrashHandler(), impeller::compiler::Switches::iplr, impeller::compiler::Switches::PlatformsToCompile(), impeller::compiler::Switches::PrintHelp(), impeller::compiler::Switches::shader_bundle, impeller::compiler::Switches::source_file_name, TargetPlatformToString(), Utf8FromPath(), and impeller::compiler::Switches::verbose.

Referenced by main().

◆ OutputBundleDepfile()

static bool impeller::compiler::OutputBundleDepfile ( const Switches switches,
const std::string &  target,
const std::set< std::string > &  dependencies 
)
static

Write a Ninja-style depfile listing every source file (including #included headers) that contributed to the shader bundle at target.

Format mirrors Compiler::CreateDepfileContents for single-shader compiles: <target>: <dep1> <dep2> ... <depN>\n. See https://github.com/ninja-build/ninja/blob/master/src/depfile_parser.cc#L28

Definition at line 245 of file shader_bundle.cc.

247 {
248 std::stringstream stream;
249 stream << target << ":";
250 for (const auto& dep : dependencies) {
251 stream << " " << dep;
252 }
253 stream << "\n";
254 const auto contents = std::make_shared<std::string>(stream.str());
255 const fml::NonOwnedMapping mapping(
256 reinterpret_cast<const uint8_t*>(contents->data()), contents->size(),
257 [contents](auto, auto) {});
258
259 // Pass the relative path straight through; fml::WriteAtomically
260 // resolves it against switches.working_directory (a directory fd
261 // representing the build system's intended working dir, which may
262 // differ from std::filesystem::current_path()).
264 Utf8FromPath(switches.depfile_path).c_str(),
265 mapping)) {
266 std::cerr << "Could not write depfile to " << switches.depfile_path
267 << std::endl;
268 return false;
269 }
270 return true;
271}
uint32_t * target

References impeller::compiler::Switches::depfile_path, target, Utf8FromPath(), impeller::compiler::Switches::working_directory, and fml::WriteAtomically().

Referenced by GenerateShaderBundle().

◆ ParseMSLVersion()

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

Definition at line 44 of file compiler.cc.

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

◆ 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 25 of file shader_bundle.cc.

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

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(), impeller::compiler::testing::TEST(), impeller::compiler::testing::TEST(), impeller::compiler::testing::TEST(), impeller::compiler::testing::TEST(), impeller::compiler::testing::TEST(), impeller::compiler::testing::TEST(), and impeller::compiler::testing::TEST().

◆ ReadKnownScalarType()

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

Definition at line 806 of file reflector.cc.

807 {
808 switch (type) {
809 case spirv_cross::SPIRType::BaseType::Boolean:
810 return KnownType{
811 .name = "bool",
812 .byte_size = sizeof(bool),
813 };
814 case spirv_cross::SPIRType::BaseType::Float:
815 return KnownType{
816 .name = "Scalar",
817 .byte_size = sizeof(Scalar),
818 };
819 case spirv_cross::SPIRType::BaseType::Half:
820 return KnownType{
821 .name = "Half",
822 .byte_size = sizeof(Half),
823 };
824 case spirv_cross::SPIRType::BaseType::UInt:
825 return KnownType{
826 .name = "uint32_t",
827 .byte_size = sizeof(uint32_t),
828 };
829 case spirv_cross::SPIRType::BaseType::Int:
830 return KnownType{
831 .name = "int32_t",
832 .byte_size = sizeof(int32_t),
833 };
834 default:
835 break;
836 }
837 return std::nullopt;
838}
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 199 of file runtime_stage_data.cc.

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

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 147 of file switches.cc.

148 {
149 std::vector<TargetPlatform> stages;
150 for (const auto& platform : kKnownRuntimeStages) {
151 if (command_line.HasOption(platform.first)) {
152 stages.push_back(platform.second);
153 }
154 }
155 return stages;
156}
static const std::vector< std::pair< std::string, TargetPlatform > > kKnownRuntimeStages
Definition switches.cc:29

References fml::CommandLine::HasOption(), and kKnownRuntimeStages.

◆ SetBindingBaseOffset()

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

Definition at line 211 of file spirv_compiler.cc.

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

References i.

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

◆ SetDefaultLimitations()

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

Definition at line 93 of file spirv_compiler.cc.

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

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}
const uint8_t uint32_t uint32_t GError ** error

References error.

Referenced by GenerateShaderBundle().

◆ ShaderCErrorToString()

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

Definition at line 130 of file types.cc.

130 {
131 using Status = shaderc_compilation_status;
132 switch (status) {
133 case Status::shaderc_compilation_status_success:
134 return "Success";
135 case Status::shaderc_compilation_status_invalid_stage:
136 return "Invalid shader stage specified";
137 case Status::shaderc_compilation_status_compilation_error:
138 return "Compilation error";
139 case Status::shaderc_compilation_status_internal_error:
140 return "Internal error";
141 case Status::shaderc_compilation_status_null_result_object:
142 return "Internal error. Null result object";
143 case Status::shaderc_compilation_status_invalid_assembly:
144 return "Invalid assembly";
145 case Status::shaderc_compilation_status_validation_error:
146 return "Validation error";
147 case Status::shaderc_compilation_status_transformation_error:
148 return "Transform error";
149 case Status::shaderc_compilation_status_configuration_error:
150 return "Configuration error";
151 }
152 return "Unknown internal error";
153}

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

◆ SourceLanguageToString()

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

Definition at line 90 of file types.cc.

90 {
91 switch (source_language) {
92 case SourceLanguage::kUnknown:
93 return "Unknown";
94 case SourceLanguage::kGLSL:
95 return "GLSL";
96 case SourceLanguage::kHLSL:
97 return "HLSL";
98 }
99}

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 158 of file switches.cc.

159 {
160 auto source_type_option =
161 command_line.GetOptionValueWithDefault("input-type", "");
162 auto source_type_search = kKnownSourceTypes.find(source_type_option);
163 if (source_type_search == kKnownSourceTypes.end()) {
164 return SourceType::kUnknown;
165 }
166 return source_type_search->second;
167}
static const std::map< std::string, SourceType > kKnownSourceTypes
Definition switches.cc:37

References fml::CommandLine::GetOptionValueWithDefault(), kKnownSourceTypes, and kUnknown.

◆ SourceTypeFromFileName()

SourceType impeller::compiler::SourceTypeFromFileName ( const std::filesystem::path &  file_name)

Definition at line 17 of file types.cc.

17 {
18 std::string extension = file_name.extension().string();
19 if (extension == ".vert") {
20 return SourceType::kVertexShader;
21 }
22
23 if (extension == ".frag") {
24 return SourceType::kFragmentShader;
25 }
26
27 if (extension == ".comp") {
28 return SourceType::kComputeShader;
29 }
30
31 return SourceType::kUnknown;
32}

References kComputeShader, kFragmentShader, kUnknown, and kVertexShader.

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

◆ SourceTypeFromString()

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

Definition at line 34 of file types.cc.

34 {
36
37 if (name == "vertex") {
38 return SourceType::kVertexShader;
39 }
40
41 if (name == "fragment") {
42 return SourceType::kFragmentShader;
43 }
44
45 if (name == "compute") {
46 return SourceType::kComputeShader;
47 }
48
49 return SourceType::kUnknown;
50}
const char * name
Definition fuchsia.cc:50
std::string ToLowerCase(std::string_view string)
Definition utilities.cc:61

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

Referenced by ParseShaderBundleConfig().

◆ SourceTypeToString()

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

Definition at line 204 of file types.cc.

204 {
205 switch (type) {
206 case SourceType::kUnknown:
207 return "unknown";
208 case SourceType::kVertexShader:
209 return "vert";
210 case SourceType::kFragmentShader:
211 return "frag";
212 case SourceType::kComputeShader:
213 return "comp";
214 }
216}

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

◆ StringStartsWith()

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

Definition at line 86 of file utilities.cc.

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

References i, and target.

Referenced by CreateGLSLCompiler().

◆ StringToShaderStage()

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

Definition at line 48 of file reflector.cc.

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

◆ TargetPlatformFromCommandLine()

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

Definition at line 129 of file switches.cc.

130 {
131 auto target = TargetPlatform::kUnknown;
132 for (const auto& platform : kKnownPlatforms) {
133 if (command_line.HasOption(platform.first)) {
134 // If the platform has already been determined, the caller may have
135 // specified multiple platforms. This is an error and only one must be
136 // selected.
137 if (target != TargetPlatform::kUnknown) {
138 return TargetPlatform::kUnknown;
139 }
140 target = platform.second;
141 // Keep going to detect duplicates.
142 }
143 }
144 return target;
145}
static const std::map< std::string, TargetPlatform > kKnownPlatforms
Definition switches.cc:20

References fml::CommandLine::HasOption(), kKnownPlatforms, kUnknown, and target.

◆ TargetPlatformIsMetal()

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

Definition at line 258 of file types.cc.

258 {
259 switch (platform) {
260 case TargetPlatform::kMetalDesktop:
261 case TargetPlatform::kMetalIOS:
262 case TargetPlatform::kRuntimeStageMetal:
263 return true;
264 case TargetPlatform::kUnknown:
265 case TargetPlatform::kSkSL:
266 case TargetPlatform::kOpenGLES:
267 case TargetPlatform::kOpenGLDesktop:
268 case TargetPlatform::kRuntimeStageGLES:
269 case TargetPlatform::kRuntimeStageGLES3:
270 case TargetPlatform::kRuntimeStageVulkan:
271 case TargetPlatform::kVulkan:
272 return false;
273 }
275}

References FML_UNREACHABLE, 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 239 of file types.cc.

239 {
240 switch (platform) {
241 case TargetPlatform::kOpenGLES:
242 case TargetPlatform::kOpenGLDesktop:
243 case TargetPlatform::kRuntimeStageGLES:
244 case TargetPlatform::kRuntimeStageGLES3:
245 return true;
246 case TargetPlatform::kMetalDesktop:
247 case TargetPlatform::kRuntimeStageMetal:
248 case TargetPlatform::kRuntimeStageVulkan:
249 case TargetPlatform::kMetalIOS:
250 case TargetPlatform::kUnknown:
251 case TargetPlatform::kSkSL:
252 case TargetPlatform::kVulkan:
253 return false;
254 }
256}

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

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

◆ TargetPlatformIsVulkan()

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

Definition at line 277 of file types.cc.

277 {
278 switch (platform) {
279 case TargetPlatform::kRuntimeStageVulkan:
280 case TargetPlatform::kVulkan:
281 return true;
282 case TargetPlatform::kMetalDesktop:
283 case TargetPlatform::kMetalIOS:
284 case TargetPlatform::kRuntimeStageMetal:
285 case TargetPlatform::kUnknown:
286 case TargetPlatform::kSkSL:
287 case TargetPlatform::kOpenGLES:
288 case TargetPlatform::kOpenGLDesktop:
289 case TargetPlatform::kRuntimeStageGLES:
290 case TargetPlatform::kRuntimeStageGLES3:
291 return false;
292 }
294}

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

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

◆ TargetPlatformSLExtension()

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

Definition at line 218 of file types.cc.

218 {
219 switch (platform) {
220 case TargetPlatform::kUnknown:
221 return "unknown";
222 case TargetPlatform::kMetalDesktop:
223 case TargetPlatform::kMetalIOS:
224 case TargetPlatform::kRuntimeStageMetal:
225 return "metal";
226 case TargetPlatform::kSkSL:
227 case TargetPlatform::kOpenGLES:
228 case TargetPlatform::kOpenGLDesktop:
229 case TargetPlatform::kRuntimeStageGLES:
230 case TargetPlatform::kRuntimeStageGLES3:
231 return "glsl";
232 case TargetPlatform::kVulkan:
233 case TargetPlatform::kRuntimeStageVulkan:
234 return "vk.spirv";
235 }
237}

References FML_UNREACHABLE, 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 183 of file types.cc.

184 {
185 switch (platform) {
186 case TargetPlatform::kMetalIOS:
187 case TargetPlatform::kRuntimeStageMetal:
188 return spirv_cross::CompilerMSL::Options::Platform::iOS;
189 case TargetPlatform::kMetalDesktop:
190 return spirv_cross::CompilerMSL::Options::Platform::macOS;
191 case TargetPlatform::kSkSL:
192 case TargetPlatform::kOpenGLES:
193 case TargetPlatform::kOpenGLDesktop:
194 case TargetPlatform::kRuntimeStageGLES:
195 case TargetPlatform::kRuntimeStageGLES3:
196 case TargetPlatform::kRuntimeStageVulkan:
197 case TargetPlatform::kVulkan:
198 case TargetPlatform::kUnknown:
199 return spirv_cross::CompilerMSL::Options::Platform::macOS;
200 }
202}

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

◆ TargetPlatformToString()

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

Definition at line 62 of file types.cc.

62 {
63 switch (platform) {
64 case TargetPlatform::kUnknown:
65 return "Unknown";
66 case TargetPlatform::kMetalDesktop:
67 return "MetalDesktop";
68 case TargetPlatform::kMetalIOS:
69 return "MetaliOS";
70 case TargetPlatform::kOpenGLES:
71 return "OpenGLES";
72 case TargetPlatform::kOpenGLDesktop:
73 return "OpenGLDesktop";
74 case TargetPlatform::kVulkan:
75 return "Vulkan";
76 case TargetPlatform::kRuntimeStageMetal:
77 return "RuntimeStageMetal";
78 case TargetPlatform::kRuntimeStageGLES:
79 return "RuntimeStageGLES";
80 case TargetPlatform::kRuntimeStageGLES3:
81 return "RuntimeStageGLES3";
82 case TargetPlatform::kRuntimeStageVulkan:
83 return "RuntimeStageVulkan";
84 case TargetPlatform::kSkSL:
85 return "SkSL";
86 }
88}

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

Referenced by impeller::compiler::testing::INSTANTIATE_TEST_SUITE_P(), impeller::compiler::testing::INSTANTIATE_TEST_SUITE_P(), impeller::compiler::testing::INSTANTIATE_TEST_SUITE_P(), impeller::compiler::testing::INSTANTIATE_TEST_SUITE_P(), and Main().

◆ ToCamelCase()

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

Definition at line 38 of file utilities.cc.

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

References i, and length.

◆ ToExecutionModel()

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

Definition at line 169 of file types.cc.

169 {
170 switch (type) {
171 case SourceType::kVertexShader:
172 return spv::ExecutionModel::ExecutionModelVertex;
173 case SourceType::kFragmentShader:
174 return spv::ExecutionModel::ExecutionModelFragment;
175 case SourceType::kComputeShader:
176 return spv::ExecutionModel::ExecutionModelGLCompute;
177 case SourceType::kUnknown:
178 break;
179 }
180 return spv::ExecutionModel::ExecutionModelMax;
181}

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:
117 return fb::InputDataType::kFloat;
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 }
136}

References FML_UNREACHABLE, 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:
122 return fb::shaderbundle::InputDataType::kFloat;
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 }
141}

References FML_UNREACHABLE, 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 }
59}

References FML_UNREACHABLE.

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 }
182}

References FML_UNREACHABLE, and type.

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

◆ ToLowerCase()

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

Definition at line 61 of file utilities.cc.

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

References x.

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

◆ ToShaderCShaderKind()

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

Definition at line 155 of file types.cc.

155 {
156 switch (type) {
157 case SourceType::kVertexShader:
158 return shaderc_shader_kind::shaderc_vertex_shader;
159 case SourceType::kFragmentShader:
160 return shaderc_shader_kind::shaderc_fragment_shader;
161 case SourceType::kComputeShader:
162 return shaderc_shader_kind::shaderc_compute_shader;
163 case SourceType::kUnknown:
164 break;
165 }
166 return shaderc_shader_kind::shaderc_glsl_infer_from_source;
167}

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 52 of file types.cc.

52 {
53 if (source_language == "glsl") {
54 return SourceLanguage::kGLSL;
55 }
56 if (source_language == "hlsl") {
57 return SourceLanguage::kHLSL;
58 }
59 return SourceLanguage::kUnknown;
60}

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 }
45}

References FML_UNREACHABLE.

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 }
54}

References FML_UNREACHABLE.

◆ ToString()

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

Definition at line 622 of file reflector.cc.

622 {
623 switch (type) {
624 case CompilerBackend::Type::kMSL:
625 return "Metal Shading Language";
626 case CompilerBackend::Type::kGLSL:
627 return "OpenGL Shading Language";
628 case CompilerBackend::Type::kGLSLVulkan:
629 return "OpenGL Shading Language (Relaxed Vulkan Semantics)";
630 case CompilerBackend::Type::kSkSL:
631 return "SkSL Shading Language";
632 }
634}

References FML_UNREACHABLE, 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:
65 return fb::UniformDataType::kFloat;
66 case spirv_cross::SPIRType::SampledImage:
67 return fb::UniformDataType::kSampledImage;
68 case spirv_cross::SPIRType::Struct:
69 return fb::UniformDataType::kStruct;
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 }
94}

References FML_UNREACHABLE, 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:
80 return fb::shaderbundle::UniformDataType::kFloat;
81 case spirv_cross::SPIRType::Double:
82 return fb::shaderbundle::UniformDataType::kDouble;
83 case spirv_cross::SPIRType::SampledImage:
84 return fb::shaderbundle::UniformDataType::kSampledImage;
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 }
99}

References FML_UNREACHABLE, and type.

◆ TypeNameWithPaddingOfSize()

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

Definition at line 795 of file reflector.cc.

795 {
796 std::stringstream stream;
797 stream << "Padding<" << size << ">";
798 return stream.str();
799}

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(), impeller::compiler::SPIRVCompiler::CompileToSPV(), EntryPointFunctionNameFromSourceName(), GenerateShaderBundle(), InferShaderNameFromPath(), Main(), OutputBundleDepfile(), 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 1347 of file reflector.cc.

1349 {
1350 VertexType result;
1351 result.variable_name = resource->name;
1352 const auto& type = compiler.get_type(resource->type_id);
1353 result.base_type = type.basetype;
1354 const auto total_size = type.columns * type.vecsize * type.width / 8u;
1355 result.byte_length = total_size;
1356
1357 if (type.basetype == spirv_cross::SPIRType::BaseType::Float &&
1358 type.columns == 1u && type.vecsize == 2u &&
1359 type.width == sizeof(float) * 8u) {
1360 result.type_name = "Point";
1361 } else if (type.basetype == spirv_cross::SPIRType::BaseType::Float &&
1362 type.columns == 1u && type.vecsize == 4u &&
1363 type.width == sizeof(float) * 8u) {
1364 result.type_name = "Vector4";
1365 } else if (type.basetype == spirv_cross::SPIRType::BaseType::Float &&
1366 type.columns == 1u && type.vecsize == 3u &&
1367 type.width == sizeof(float) * 8u) {
1368 result.type_name = "Vector3";
1369 } else if (type.basetype == spirv_cross::SPIRType::BaseType::Float &&
1370 type.columns == 1u && type.vecsize == 1u &&
1371 type.width == sizeof(float) * 8u) {
1372 result.type_name = "Scalar";
1373 } else if (type.basetype == spirv_cross::SPIRType::BaseType::Int &&
1374 type.columns == 1u && type.vecsize == 1u &&
1375 type.width == sizeof(int32_t) * 8u) {
1376 result.type_name = "int32_t";
1377 } else {
1378 // Catch all unknown padding.
1379 result.type_name = TypeNameWithPaddingOfSize(total_size);
1380 }
1381
1382 return result;
1383}
static std::string TypeNameWithPaddingOfSize(size_t size)
Definition reflector.cc:795
spirv_cross::SPIRType::BaseType base_type

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().

◆ kFormatVersionKey

const char* impeller::compiler::kFormatVersionKey = "format_version"
static

◆ 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.

20 {
21 {"metal-desktop", TargetPlatform::kMetalDesktop},
22 {"metal-ios", TargetPlatform::kMetalIOS},
23 {"vulkan", TargetPlatform::kVulkan},
24 {"opengl-es", TargetPlatform::kOpenGLES},
25 {"opengl-desktop", TargetPlatform::kOpenGLDesktop},
26};

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

◆ kKnownRuntimeStages

const std::vector<std::pair<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 29 of file switches.cc.

29 {
30 {"sksl", TargetPlatform::kSkSL},
31 {"runtime-stage-metal", TargetPlatform::kRuntimeStageMetal},
32 {"runtime-stage-gles", TargetPlatform::kRuntimeStageGLES},
33 {"runtime-stage-gles3", TargetPlatform::kRuntimeStageGLES3},
34 {"runtime-stage-vulkan", TargetPlatform::kRuntimeStageVulkan},
35};

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 37 of file switches.cc.

37 {
38 {"vert", SourceType::kVertexShader},
39 {"frag", SourceType::kFragmentShader},
40 {"comp", SourceType::kComputeShader},
41};

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

◆ kMaxUniformBufferSize

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

Definition at line 42 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 186 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

◆ kUniformStructElementsKey

const char* impeller::compiler::kUniformStructElementsKey = "struct_elements"
static

Definition at line 197 of file runtime_stage_data.cc.

◆ kUniformTypeKey

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