add bindings
This commit is contained in:
@@ -0,0 +1,4 @@
|
|||||||
|
recovery
|
||||||
|
build
|
||||||
|
BeefSpace_User.toml
|
||||||
|
BeefSpace_Lock.toml
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "SPIRV-Cross"]
|
||||||
|
path = SPIRV-Cross
|
||||||
|
url = https://github.com/KhronosGroup/SPIRV-Cross.git
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
FileVersion = 1
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
Name = "SpirVCross"
|
||||||
|
TargetType = "BeefLib"
|
||||||
|
StartupObject = "SpirVCross.Program"
|
||||||
|
|
||||||
|
[Dependencies]
|
||||||
|
corlib = "*"
|
||||||
|
"CxxBuildTool.git" = {Git = "https://git.unicon-gmbh.de/Rune/CxxBuildTool.git"}
|
||||||
|
|
||||||
|
[Configs.Debug.Win32]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.lib"]
|
||||||
|
|
||||||
|
[Configs.Debug.Win64]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.lib"]
|
||||||
|
|
||||||
|
[Configs.Debug.Linux32]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.a"]
|
||||||
|
|
||||||
|
[Configs.Debug.Linux64]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.a"]
|
||||||
|
|
||||||
|
[Configs.Debug.macOS]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.a"]
|
||||||
|
|
||||||
|
[Configs.Release.Win32]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.lib"]
|
||||||
|
|
||||||
|
[Configs.Release.Win64]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.lib"]
|
||||||
|
|
||||||
|
[Configs.Release.Linux32]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.a"]
|
||||||
|
|
||||||
|
[Configs.Release.Linux64]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.a"]
|
||||||
|
|
||||||
|
[Configs.Release.macOS]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.a"]
|
||||||
|
|
||||||
|
[Configs.Paranoid.Win32]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.lib"]
|
||||||
|
|
||||||
|
[Configs.Paranoid.Win64]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.lib"]
|
||||||
|
|
||||||
|
[Configs.Paranoid.Linux32]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.a"]
|
||||||
|
|
||||||
|
[Configs.Paranoid.Linux64]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.a"]
|
||||||
|
|
||||||
|
[Configs.Paranoid.macOS]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.a"]
|
||||||
|
|
||||||
|
[Configs.Test.Win32]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.lib"]
|
||||||
|
|
||||||
|
[Configs.Test.Win64]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.lib"]
|
||||||
|
|
||||||
|
[Configs.Test.Linux32]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.a"]
|
||||||
|
|
||||||
|
[Configs.Test.Linux64]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.a"]
|
||||||
|
|
||||||
|
[Configs.Test.macOS]
|
||||||
|
LibPaths = ["$(BuildDir)/spirv_cross.a"]
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
FileVersion = 1
|
||||||
|
|
||||||
|
[Workspace]
|
||||||
|
StartupProject = "SpirVCross"
|
||||||
|
|
||||||
|
[Projects]
|
||||||
|
SpirVCross = {Path = "."}
|
||||||
|
"CxxBuildTool.git" = {Git = "https://git.unicon-gmbh.de/Rune/CxxBuildTool.git"}
|
||||||
Submodule
+1
Submodule SPIRV-Cross added at 6c09849fe8
@@ -0,0 +1,9 @@
|
|||||||
|
FileVersion = 1
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
Name = "SpirVCross.Setup"
|
||||||
|
StartupObject = "SpirVCross.Setup.Program"
|
||||||
|
|
||||||
|
[Dependencies]
|
||||||
|
corlib = "*"
|
||||||
|
"Cpp2Beef.git" = {Git = "https://git.unicon-gmbh.de/Rune/Cpp2Beef.git"}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
FileVersion = 1
|
||||||
|
ExtraPlatforms = ["Linux32", "Linux64", "macOS"]
|
||||||
|
|
||||||
|
[Workspace]
|
||||||
|
StartupProject = "SpirVCross.Setup"
|
||||||
|
|
||||||
|
[Projects]
|
||||||
|
"SpirVCross.Setup" = {Path = "."}
|
||||||
|
"Cpp2Beef.git" = {Git = "https://git.unicon-gmbh.de/Rune/Cpp2Beef.git"}
|
||||||
@@ -0,0 +1,218 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
|
using Cpp2Beef;
|
||||||
|
using LibClang;
|
||||||
|
|
||||||
|
namespace SpirVCross.Setup;
|
||||||
|
|
||||||
|
class SpriVCrossGenerator : Cpp2BeefGenerator, this(Span<char8*> args)
|
||||||
|
{
|
||||||
|
protected override Span<char8*> Args => args;
|
||||||
|
protected override Flags Flags => .None;
|
||||||
|
|
||||||
|
StreamWriter spvWriter = new .()..Create("../src/SpirV.bf")..Write("""
|
||||||
|
// This file was generated by Cpp2Beef
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Interop;
|
||||||
|
|
||||||
|
namespace SpirVCross;
|
||||||
|
|
||||||
|
|
||||||
|
""") ~ delete _;
|
||||||
|
StreamWriter spvcWriter = new .()..Create("../src/SpirVCross.bf")..Write("""
|
||||||
|
// This file was generated by Cpp2Beef
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Interop;
|
||||||
|
|
||||||
|
namespace SpirVCross;
|
||||||
|
|
||||||
|
|
||||||
|
""") ~ delete _;
|
||||||
|
|
||||||
|
protected override StreamWriter GetWriterForHeader(StringView header)
|
||||||
|
{
|
||||||
|
// Here you define the target file to which a cursor should be written
|
||||||
|
// Returning null skips the cursor
|
||||||
|
if (header.EndsWith("spirv_cross_c.h"))
|
||||||
|
return spvcWriter;
|
||||||
|
if (header.EndsWith("spirv.h"))
|
||||||
|
return spvWriter;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool IsOutParam(CXCursor arg, CXCursor method)
|
||||||
|
{
|
||||||
|
let type = Clang.GetCursorType(arg);
|
||||||
|
if (type.kind != .Pointer) return false;
|
||||||
|
let spelling = GetTypeSpelling!(Clang.GetPointeeType(type));
|
||||||
|
return handles.ContainsAlt(spelling);
|
||||||
|
}
|
||||||
|
|
||||||
|
HashSet<String> handles = new .(16) ~ DeleteContainerAndItems!(_);
|
||||||
|
|
||||||
|
protected override void HandleCursor(CXCursor cursor)
|
||||||
|
{
|
||||||
|
switch (cursor.kind)
|
||||||
|
{
|
||||||
|
case .TypedefDecl:
|
||||||
|
let spelling = GetCursorSpelling!(cursor);
|
||||||
|
if (spelling == "spvc_bool")
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (spelling.EndsWith("_flags"))
|
||||||
|
{
|
||||||
|
BeginCursor(cursor);
|
||||||
|
AccessSpecifier(cursor);
|
||||||
|
str.Append("typealias ");
|
||||||
|
GetNameInBindings(cursor, str);
|
||||||
|
str.Append(" = ");
|
||||||
|
GetNameInBindings(cursor, str);
|
||||||
|
str.Length--;
|
||||||
|
str.Append("Bits;");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let type = Clang.GetTypedefDeclUnderlyingType(cursor);
|
||||||
|
let typeSpelling = GetTypeSpelling!(type);
|
||||||
|
if (!(typeSpelling.StartsWith("struct spvc_") || typeSpelling.StartsWith("const struct spvc_")) || !typeSpelling.EndsWith("_s *"))
|
||||||
|
break;
|
||||||
|
BeginCursor(cursor);
|
||||||
|
AccessSpecifier(cursor);
|
||||||
|
str.Append("struct ");
|
||||||
|
GetNameInBindings(cursor, str);
|
||||||
|
str.Append(" : int {}");
|
||||||
|
handles.Add(new .(spelling));
|
||||||
|
return;
|
||||||
|
case .StructDecl:
|
||||||
|
let spelling = GetCursorSpelling!(cursor);
|
||||||
|
if (spelling.EndsWith("_s"))
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
base.HandleCursor(cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void GetNameInBindings(CXCursor cursor, String outString)
|
||||||
|
{
|
||||||
|
switch (cursor.kind)
|
||||||
|
{
|
||||||
|
case .EnumDecl:
|
||||||
|
let spelling = GetCursorSpelling!(cursor);
|
||||||
|
if (spelling.StartsWith("Spv") && spelling.EndsWith('_'))
|
||||||
|
{
|
||||||
|
outString.Append(spelling[..<^1]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fallthrough;
|
||||||
|
case .StructDecl, .UnionDecl, .TypedefDecl:
|
||||||
|
let spelling = GetCursorSpelling!(cursor);
|
||||||
|
if (!spelling.StartsWith("spvc_"))
|
||||||
|
break;
|
||||||
|
UpperSnakeCase2PascalCase(spelling, outString);
|
||||||
|
return;
|
||||||
|
case .EnumConstantDecl:
|
||||||
|
var parentSpelling = GetCursorSpelling!(Clang.GetCursorSemanticParent(cursor));
|
||||||
|
var spelling = GetCursorSpelling!(cursor);
|
||||||
|
if (parentSpelling.StartsWith("spvc_"))
|
||||||
|
{
|
||||||
|
bool bit = false;
|
||||||
|
if (parentSpelling.EndsWith("_flag_bits"))
|
||||||
|
{
|
||||||
|
parentSpelling.RemoveFromEnd("_flag_bits".Length);
|
||||||
|
bit = true;
|
||||||
|
}
|
||||||
|
if (spelling.EndsWith("_INT_MAX") || spelling.EndsWith("_MAX_INT"))
|
||||||
|
outString.Append("//");
|
||||||
|
if (spelling.StartsWith(parentSpelling, .OrdinalIgnoreCase))
|
||||||
|
spelling.RemoveFromStart(parentSpelling.Length);
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
if (bit && spelling.EndsWith("_BIT"))
|
||||||
|
spelling.RemoveFromEnd(4);
|
||||||
|
if (spelling[0] == '_' && spelling[1].IsDigit)
|
||||||
|
outString.Append('_');
|
||||||
|
UpperSnakeCase2PascalCase(spelling, outString);
|
||||||
|
}
|
||||||
|
else if (parentSpelling.StartsWith("Spv"))
|
||||||
|
{
|
||||||
|
if (parentSpelling == "SpvOp_")
|
||||||
|
parentSpelling = "Spv";
|
||||||
|
if (parentSpelling.EndsWith('_'))
|
||||||
|
parentSpelling.RemoveFromEnd(1);
|
||||||
|
StringView suffix = null;
|
||||||
|
if (parentSpelling.EndsWith("Shift"))
|
||||||
|
suffix = "Shift";
|
||||||
|
else if (parentSpelling.EndsWith("Mask"))
|
||||||
|
suffix = "Mask";
|
||||||
|
parentSpelling.RemoveFromEnd(suffix.Length);
|
||||||
|
|
||||||
|
if (spelling.StartsWith(parentSpelling))
|
||||||
|
spelling.RemoveFromStart(parentSpelling.Length);
|
||||||
|
if (spelling.EndsWith(suffix))
|
||||||
|
spelling.RemoveFromEnd(suffix.Length);
|
||||||
|
else if (spelling.StartsWith(suffix))
|
||||||
|
spelling.RemoveFromStart(suffix.Length);
|
||||||
|
|
||||||
|
if (spelling == "Max")
|
||||||
|
outString.Append("//");
|
||||||
|
if (spelling[0].IsDigit)
|
||||||
|
outString.Append('_');
|
||||||
|
outString.Append(spelling);
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
return;
|
||||||
|
case .FunctionDecl:
|
||||||
|
if (!IsInstanceMethod(cursor)) break;
|
||||||
|
let arg = Clang.Cursor_GetArgument(cursor, 0);
|
||||||
|
let handle = GetTypeSpelling!(Clang.GetCursorType(arg));
|
||||||
|
var spelling = GetCursorSpelling!(cursor);
|
||||||
|
Runtime.Assert(spelling.StartsWith(handle));
|
||||||
|
spelling.RemoveFromStart(handle.Length + 1);
|
||||||
|
UpperSnakeCase2PascalCase(spelling, outString);
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
base.GetNameInBindings(cursor, outString);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void WriteToken(CXToken token)
|
||||||
|
{
|
||||||
|
let spelling = GetTokenSpelling!(token);
|
||||||
|
if (Clang.GetTokenKind(token) == .Identifier && spelling == "spvc_bool")
|
||||||
|
str.Append("SpvcBool");
|
||||||
|
else if (Clang.GetTokenKind(token) == .Literal && spelling.Length == 9 && spelling.StartsWith("0x"))
|
||||||
|
str.Append("0x0", spelling[2...]);
|
||||||
|
else
|
||||||
|
base.WriteToken(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsInstanceMethod(CXCursor cursor)
|
||||||
|
{
|
||||||
|
if (Clang.Cursor_GetNumArguments(cursor) < 1)
|
||||||
|
return false;
|
||||||
|
let arg = Clang.Cursor_GetArgument(cursor, 0);
|
||||||
|
let type = GetTypeSpelling!(Clang.GetCursorType(arg));
|
||||||
|
return handles.ContainsAlt(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Method_Parameters(CXCursor cursor)
|
||||||
|
{
|
||||||
|
if (IsInstanceMethod(cursor))
|
||||||
|
str.Append("this ");
|
||||||
|
base.Method_Parameters(cursor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
public static int Main(String[] args)
|
||||||
|
{
|
||||||
|
scope SpriVCrossGenerator(char8*[?]("--language=c")).Generate("../SPIRV-Cross/spirv_cross_c.h");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
using System;
|
||||||
|
using System.Interop;
|
||||||
|
|
||||||
|
using CxxBuildTool;
|
||||||
|
|
||||||
|
namespace SpirVCross;
|
||||||
|
|
||||||
|
struct SpvcBool : c_uchar
|
||||||
|
{
|
||||||
|
[Inline] public static operator bool(Self s) => s != SPVC_FALSE;
|
||||||
|
[Inline] public static operator Self(bool s) => s ? SPVC_TRUE : SPVC_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
extension SpvcResult
|
||||||
|
{
|
||||||
|
[NoShow(false), SkipCall, Warn("SpvcResult discarded")]
|
||||||
|
public void ReturnValueDiscarded();
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
{
|
||||||
|
[OnCompile(.TypeDone)]
|
||||||
|
private static void Build()
|
||||||
|
{
|
||||||
|
if (!Compiler.IsBuilding) return;
|
||||||
|
CxxBuildTool.Ninja(Compiler.ProjectDir + "/SPIRV-Cross", Compiler.BuildDir + "/" + Compiler.ProjectName, "spirv_cross", "",
|
||||||
|
"spirv_cfg.cpp", "spirv_cross_c.cpp", "spirv_glsl.cpp", "spirv_parser.cpp",
|
||||||
|
"spirv_cpp.cpp", "spirv_cross_parsed_ir.cpp", "spirv_hlsl.cpp", "spirv_reflect.cpp",
|
||||||
|
"spirv_cross.cpp", "spirv_cross_util.cpp", "spirv_msl.cpp");
|
||||||
|
}
|
||||||
|
}
|
||||||
+5616
File diff suppressed because it is too large
Load Diff
+1101
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user