// Copyright 2016 The Shaderc Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef LIBSHADERC_UTIL_INC_SPIRV_TOOLS_WRAPPER_H
#define LIBSHADERC_UTIL_INC_SPIRV_TOOLS_WRAPPER_H

#include <string>
#include <vector>

#include "spirv-tools/libspirv.hpp"

#include "libshaderc_util/compiler.h"
#include "libshaderc_util/string_piece.h"

namespace shaderc_util {
// Assembles the given assembly. On success, returns true, writes the assembled
// binary to *binary, and clears *errors. Otherwise, writes the error message
// into *errors.
bool SpirvToolsAssemble(Compiler::TargetEnv env, const string_piece assembly,
                        spv_binary* binary, std::string* errors);

// Disassembles the given binary. Returns true and writes the disassembled text
// to *text_or_error if successful. Otherwise, writes the error message to
// *text_or_error.
bool SpirvToolsDisassemble(Compiler::TargetEnv env,
                           const std::vector<uint32_t>& binary,
                           std::string* text_or_error);

// The ids of a list of supported optimization passes.
enum class PassId {
  // SPIRV-Tools standard recipes
  kLegalizationPasses,
  kPerformancePasses,
  kSizePasses,

  // SPIRV-Tools specific passes
  kNullPass,
  kStripDebugInfo,
  kCompactIds,
};

// Optimizes the given binary. Passes are registered in the exact order as shown
// in enabled_passes, without de-duplication. Returns true and writes the
// optimized binary back to *binary if successful. Otherwise, writes errors to
// *errors and the content of binary may be in an invalid state.
bool SpirvToolsOptimize(Compiler::TargetEnv env,
                        const std::vector<PassId>& enabled_passes,
                        std::vector<uint32_t>* binary, std::string* errors);

}  // namespace shaderc_util

#endif  // LIBSHADERC_UTIL_INC_SPIRV_TOOLS_WRAPPER_H
