// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)

////////////////////////////////
//~ rjf: Tables

@table(name, display_string, bytes_per_pixel)
R_Tex2DFormatTable:
{
  {R8       "R8"       1}
  {RG8      "RG8"      2}
  {RGBA8    "RGBA8"    4}
  {BGRA8    "BGRA8"    4}
  {R16      "R16"      2}
  {RGBA16   "RGBA16"   8}
  {R32      "R32"      4}
  {RG32     "RG32"     8}
  {RGBA32   "RGBA32"  16}
}

@table(name, display_string)
R_ResourceKindTable:
{
  // static resource is immutable
  // initial data must be provided at creation time
  // GPU can read the resource
  // CPU is not allowed to read or write
  {Static   "Static" }

  // dynamic resource allows resource to be modified
  // GPU can read & write to it
  // CPU can write to it using UpdateSubresource
  {Dynamic  "Dynamic"}

  // stream resource will be often updated fully overwriting previous data
  // GPU can only read it
  // CPU can update via Map (with WRITE_DISCARD flag) + Unmap
  {Stream   "Stream "} 
}

@table(name, display_string)
R_Tex2DSampleKindTable:
{
  {Nearest   "Nearest" }
  {Linear    "Linear"  }
}

@table(name, display_string)
R_GeoTopologyKindTable:
{
  {Lines          "Lines"          }
  {LineStrip      "Line Strip"     }
  {Triangles      "Triangles"      }
  {TriangleStrip  "Triangle Strip" }
}

@table(name, batch, display_string)
R_PassKindTable:
{
  {UI          1      "UI"    }
  {Blur        0      "Blur"  }
  {Geo3D       1      "Geo3D" }
}

////////////////////////////////
//~ rjf: Generators

@enum R_Tex2DFormat:
{
  @expand(R_Tex2DFormatTable a) `$(a.name)`,
  COUNT,
}

@enum R_ResourceKind:
{
  @expand(R_ResourceKindTable a) `$(a.name)`,
  COUNT,
}

@enum R_Tex2DSampleKind:
{
  @expand(R_Tex2DSampleKindTable a) `$(a.name)`,
  COUNT,
}

@enum R_GeoTopologyKind:
{
  @expand(R_GeoTopologyKindTable a) `$(a.name)`,
  COUNT,
}

@enum R_PassKind:
{
  @expand(R_PassKindTable a) `$(a.name)`,
  COUNT,
}

@data(String8) r_tex2d_format_display_string_table:
{
  @expand(R_Tex2DFormatTable a) `str8_lit_comp("$(a.display_string)")`;
}

@data(U8) r_tex2d_format_bytes_per_pixel_table:
{
  @expand(R_Tex2DFormatTable a) `$(a.bytes_per_pixel)`;
}

@data(String8) r_tex2d_kind_display_string_table:
{
  @expand(R_Tex2DKindTable a) `str8_lit_comp("$(a.display_string)")`;
}

@data(String8) r_tex2d_sample_kind_display_string_table:
{
  @expand(R_Tex2DSampleKindTable a) `str8_lit_comp("$(a.display_string)")`;
}

@data(String8) r_pass_kind_display_string_table:
{
  @expand(R_PassKindTable a) `str8_lit_comp("$(a.display_string)")`;
}

@data(U8) r_pass_kind_batch_table:
{
  @expand(R_PassKindTable a) `$(a.batch)`;
}

@data(U64) @c_file r_pass_kind_params_size_table:
{
  @expand(R_PassKindTable a) `sizeof(R_PassParams_$(a.name))`;
}
