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

namespace impeller.fb;

enum Stage:byte {
  kVertex,
  kFragment,
  kCompute,
}

// The subset of impeller::ShaderType that may be used for uniform bindings.
// kStruct is only supported for Impeller Vulkan.
// kFloat encompases multiple float-based types e.g. vec2.
enum UniformDataType:uint32 {
  kFloat,
  kSampledImage,
  kStruct,
}

// A struct is made up solely of 4 byte floats and 4-byte paddings between
// them.
// This enum describes whether a particular byte is a float or padding.
enum StructByteType:uint8 {
  kPadding = 0,
  kFloat = 1,
}

table UniformDescription {
  name: string;
  location: uint64;
  type: UniformDataType;
  bit_width: uint64;
  rows: uint64;
  columns: uint64;
  array_elements: uint64;
  struct_layout: [StructByteType];
  struct_float_count: uint64;
}

// The subset of impeller::ShaderType that may be used for vertex attributes.
enum InputDataType:uint32 {
  kBoolean,
  kSignedByte,
  kUnsignedByte,
  kSignedShort,
  kUnsignedShort,
  kSignedInt,
  kUnsignedInt,
  kSignedInt64,
  kUnsignedInt64,
  kFloat,
  kDouble,
}

// This contains the same attribute reflection data as
// impeller::ShaderStageIOSlot.
table StageInput {
  name: string;
  location: uint64;
  set: uint64;
  binding: uint64;
  type: InputDataType;
  bit_width: uint64;
  vec_size: uint64;
  columns: uint64;
  offset: uint64;
}

table RuntimeStage {
  stage: Stage;
  entrypoint: string;
  inputs: [StageInput];
  uniforms: [UniformDescription];
  shader: [ubyte];
  struct_byte_length: uint64;
  float_count: uint64;
}

table RuntimeStages {
  sksl: RuntimeStage;
  metal: RuntimeStage;
  opengles: RuntimeStage;
  vulkan: RuntimeStage;
}
