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

/// This library defines a transpiler for converting SPIR-V into SkSL or GLSL.
library spirv;

import 'dart:convert';
import 'dart:math';
import 'dart:typed_data';

// These parts only contain private members, all public
// members are in this file (spirv.dart)
part 'src/constants.dart';
part 'src/transpiler.dart';
part 'src/types.dart';

/// The language to transpile to.
enum TargetLanguage {
  /// SkSL, for Skia.
  sksl,

  /// GLSL ES 1.00, for WebGL 1.
  glslES,

  /// GLSL ES 3.00, for WebGL 2.
  glslES300,
}

/// The result of a transpilation.
class TranspileResult {
  /// Source code string in [language].
  final String src;

  /// The shader language in [src].
  final TargetLanguage language;

  /// The number of float uniforms used in this shader.
  final int uniformFloatCount;

  TranspileResult._(this.src, this.uniformFloatCount, this.language);
}

/// Thrown during transpilation due to malformed or unsupported SPIR-V.
class TranspileException implements Exception {
  /// The SPIR-V operator last read, or zero if there was none.
  final int op;

  /// Human readable message explaining the exception.
  final String message;

  @override
  String toString() => '$op: $message';

  TranspileException._(this.op, this.message);
}

/// Transpile the provided SPIR-V buffer into a string of the [target] lang.
/// Throws an instance of [TranspileException] for malformed or unsupported
/// SPIR-V.
TranspileResult transpile(ByteBuffer spirv, TargetLanguage target) {
  final _Transpiler t = _Transpiler(spirv.asUint32List(), target);
  t.transpile();
  return TranspileResult._(
    t.src.toString(),
    t.uniformFloatCount,
    target,
  );
}
