| // 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. |
| |
| #include "impeller/compiler/compiler_backend.h" |
| |
| #include "impeller/base/comparable.h" |
| |
| namespace impeller { |
| namespace compiler { |
| |
| CompilerBackend::CompilerBackend(MSLCompiler compiler) |
| : CompilerBackend(Type::kMSL, compiler) {} |
| |
| CompilerBackend::CompilerBackend(GLSLCompiler compiler) |
| : CompilerBackend(Type::kGLSL, compiler) {} |
| |
| CompilerBackend::CompilerBackend(SkSLCompiler compiler) |
| : CompilerBackend(Type::kSkSL, compiler) {} |
| |
| CompilerBackend::CompilerBackend() = default; |
| |
| CompilerBackend::CompilerBackend(Type type, Compiler compiler) |
| : type_(type), compiler_(std::move(compiler)){}; |
| |
| CompilerBackend::~CompilerBackend() = default; |
| |
| const spirv_cross::Compiler* CompilerBackend::operator->() const { |
| return GetCompiler(); |
| } |
| |
| uint32_t CompilerBackend::GetExtendedMSLResourceBinding( |
| ExtendedResourceIndex index, |
| spirv_cross::ID id) const { |
| if (auto compiler = GetMSLCompiler()) { |
| switch (index) { |
| case ExtendedResourceIndex::kPrimary: |
| return compiler->get_automatic_msl_resource_binding(id); |
| case ExtendedResourceIndex::kSecondary: |
| return compiler->get_automatic_msl_resource_binding_secondary(id); |
| break; |
| } |
| } |
| if (auto compiler = GetGLSLCompiler()) { |
| return compiler->get_decoration(id, spv::Decoration::DecorationBinding); |
| } |
| const auto kOOBIndex = static_cast<uint32_t>(-1); |
| return kOOBIndex; |
| } |
| |
| const spirv_cross::Compiler* CompilerBackend::GetCompiler() const { |
| if (auto compiler = GetGLSLCompiler()) { |
| return compiler; |
| } |
| |
| if (auto compiler = GetMSLCompiler()) { |
| return compiler; |
| } |
| |
| if (auto compiler = GetSkSLCompiler()) { |
| return compiler; |
| } |
| |
| return nullptr; |
| } |
| |
| spirv_cross::Compiler* CompilerBackend::GetCompiler() { |
| if (auto* msl = std::get_if<MSLCompiler>(&compiler_)) { |
| return msl->get(); |
| } |
| if (auto* glsl = std::get_if<GLSLCompiler>(&compiler_)) { |
| return glsl->get(); |
| } |
| if (auto* sksl = std::get_if<SkSLCompiler>(&compiler_)) { |
| return sksl->get(); |
| } |
| return nullptr; |
| } |
| |
| const spirv_cross::CompilerMSL* CompilerBackend::GetMSLCompiler() const { |
| if (auto* msl = std::get_if<MSLCompiler>(&compiler_)) { |
| return msl->get(); |
| } |
| return nullptr; |
| } |
| |
| const spirv_cross::CompilerGLSL* CompilerBackend::GetGLSLCompiler() const { |
| if (auto* glsl = std::get_if<GLSLCompiler>(&compiler_)) { |
| return glsl->get(); |
| } |
| return nullptr; |
| } |
| |
| const CompilerSkSL* CompilerBackend::GetSkSLCompiler() const { |
| if (auto* sksl = std::get_if<SkSLCompiler>(&compiler_)) { |
| return sksl->get(); |
| } |
| return nullptr; |
| } |
| |
| CompilerBackend::operator bool() const { |
| return !!GetCompiler(); |
| } |
| |
| CompilerBackend::Type CompilerBackend::GetType() const { |
| return type_; |
| } |
| |
| } // namespace compiler |
| } // namespace impeller |