|  | // Copyright 2013 The Flutter Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #pragma once | 
|  |  | 
|  | #include <memory> | 
|  | #include <utility> | 
|  | #include <variant> | 
|  |  | 
|  | #include "flutter/fml/logging.h" | 
|  | #include "flutter/fml/macros.h" | 
|  | #include "spirv_glsl.hpp" | 
|  |  | 
|  | namespace impeller { | 
|  | namespace compiler { | 
|  |  | 
|  | class CompilerSkSL : public spirv_cross::CompilerGLSL { | 
|  | public: | 
|  | explicit CompilerSkSL(std::vector<uint32_t> spirv_) | 
|  | : CompilerGLSL(std::move(spirv_)) {} | 
|  |  | 
|  | CompilerSkSL(const uint32_t* ir_, size_t word_count) | 
|  | : CompilerGLSL(ir_, word_count) {} | 
|  |  | 
|  | explicit CompilerSkSL(const spirv_cross::ParsedIR& ir_) | 
|  | : spirv_cross::CompilerGLSL(ir_) {} | 
|  |  | 
|  | explicit CompilerSkSL(spirv_cross::ParsedIR&& ir_) | 
|  | : spirv_cross::CompilerGLSL(std::move(ir_)) {} | 
|  |  | 
|  | std::string compile() override; | 
|  |  | 
|  | private: | 
|  | std::string output_name_; | 
|  |  | 
|  | void emit_header() override; | 
|  |  | 
|  | void emit_uniform(const spirv_cross::SPIRVariable& var) override; | 
|  |  | 
|  | void fixup_user_functions(); | 
|  |  | 
|  | void detect_unsupported_resources(); | 
|  | bool emit_constant_resources(); | 
|  | bool emit_struct_resources(); | 
|  | bool emit_uniform_resources(); | 
|  | bool emit_output_resources(); | 
|  | bool emit_global_variable_resources(); | 
|  | bool emit_undefined_values(); | 
|  | void emit_resources(); | 
|  |  | 
|  | void emit_interface_block(const spirv_cross::SPIRVariable& var); | 
|  |  | 
|  | void emit_function_prototype( | 
|  | spirv_cross::SPIRFunction& func, | 
|  | const spirv_cross::Bitset& return_flags) override; | 
|  |  | 
|  | std::string image_type_glsl(const spirv_cross::SPIRType& type, | 
|  | uint32_t id = 0) override; | 
|  |  | 
|  | std::string builtin_to_glsl(spv::BuiltIn builtin, | 
|  | spv::StorageClass storage) override; | 
|  |  | 
|  | std::string to_texture_op( | 
|  | const spirv_cross::Instruction& i, | 
|  | bool sparse, | 
|  | bool* forward, | 
|  | spirv_cross::SmallVector<uint32_t>& inherited_expressions) override; | 
|  |  | 
|  | std::string to_function_name( | 
|  | const spirv_cross::CompilerGLSL::TextureFunctionNameArguments& args) | 
|  | override; | 
|  |  | 
|  | std::string to_function_args( | 
|  | const spirv_cross::CompilerGLSL::TextureFunctionArguments& args, | 
|  | bool* p_forward) override; | 
|  | }; | 
|  |  | 
|  | }  // namespace compiler | 
|  | }  // namespace impeller |