blob: c688cd2b46a75011dc0832772e900d45144d4b91 [file] [log] [blame]
// 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 <cstdint>
#include <vector>
#include "flutter/fml/mapping.h"
#include "impeller/compiler/includer.h"
#include "impeller/compiler/source_options.h"
#include "shaderc/shaderc.hpp"
namespace impeller {
namespace compiler {
struct SPIRVCompilerSourceProfile {
shaderc_profile profile = shaderc_profile_core;
uint32_t version = 460;
};
struct SPIRVCompilerTargetEnv {
shaderc_target_env env = shaderc_target_env::shaderc_target_env_vulkan;
shaderc_env_version version =
shaderc_env_version::shaderc_env_version_vulkan_1_1;
shaderc_spirv_version spirv_version =
shaderc_spirv_version::shaderc_spirv_version_1_3;
};
struct SPIRVCompilerOptions {
bool generate_debug_info = true;
//----------------------------------------------------------------------------
// Source Options.
//----------------------------------------------------------------------------
std::optional<shaderc_source_language> source_langauge;
std::optional<SPIRVCompilerSourceProfile> source_profile;
shaderc_optimization_level optimization_level =
shaderc_optimization_level::shaderc_optimization_level_performance;
//----------------------------------------------------------------------------
// Target Options.
//----------------------------------------------------------------------------
std::optional<SPIRVCompilerTargetEnv> target;
std::vector<std::string> macro_definitions;
std::shared_ptr<Includer> includer;
shaderc::CompileOptions BuildShadercOptions() const;
};
class SPIRVCompiler {
public:
SPIRVCompiler(const SourceOptions& options,
std::shared_ptr<const fml::Mapping> sources);
~SPIRVCompiler();
std::shared_ptr<fml::Mapping> CompileToSPV(
std::stringstream& error_stream,
const shaderc::CompileOptions& spirv_options) const;
private:
SourceOptions options_;
const std::shared_ptr<const fml::Mapping> sources_;
std::string GetSourcePrefix() const;
SPIRVCompiler(const SPIRVCompiler&) = delete;
SPIRVCompiler& operator=(const SPIRVCompiler&) = delete;
};
} // namespace compiler
} // namespace impeller