Generated opengl function binding added. All opengl core profile function is now available but not in C# flavour.

This commit is contained in:
Youmu Liu
2025-12-30 19:16:05 +08:00
parent b7c32bdf6d
commit 6484307b8a
40 changed files with 14965 additions and 3893 deletions
+70 -24
View File
@@ -36,63 +36,98 @@ namespace GenerateGL.CodeGen
GlParam param
)
{
// For delegate signatures, handles are kept as uint (not GlHandle) to match function pointer fields.
if (param.CType.Equals("GLchar", StringComparison.Ordinal) && param.IsPointer)
{
return "byte*";
int pointerLevel = param.PointerLevel;
if (param.CType.Equals("GLchar", StringComparison.Ordinal) && pointerLevel > 0) {
return $"byte{new string('*', pointerLevel)}";
}
string mapped = MapType(param.CType, allowVoid:false);
if (param.IsPointer)
if (pointerLevel > 0)
{
if (mapped == "void") {
return "void*";
return $"void{new string('*', pointerLevel)}";
}
return $"{mapped}*";
return $"{mapped}{new string('*', pointerLevel)}";
}
return mapped;
}
public static string MapDelegateReturn(
string cType
string cType,
int pointerLevel
)
{
return MapType(cType, allowVoid:true);
string mapped = MapType(cType, allowVoid:true);
if (pointerLevel > 0) {
return $"{mapped}{new string('*', pointerLevel)}";
}
return mapped;
}
public static string MapParameter(
GlParam param
)
{
// Handle GlHandle-like cases: if the C type is GLuint and name hints an object, map to GlHandle
if (param.CType.Equals("GLuint", StringComparison.Ordinal) &&
LooksLikeHandle(param.Name) &&
!param.IsPointer)
if (param.PointerLevel == 0)
{
return "GlHandle";
if (param.CType.Equals("GLenum", StringComparison.Ordinal) &&
LooksLikeShaderType(param.Name) &&
!param.IsPointer) {
return "ShaderType";
}
if (param.CType.Equals("GLuint", StringComparison.Ordinal) &&
LooksLikeHandle(param.Name) &&
!param.IsPointer) {
return "GlHandle";
}
}
int pointerLevel = param.PointerLevel;
if (param.CType.Equals("GLchar", StringComparison.Ordinal) && pointerLevel > 0) {
return $"byte{new string('*', pointerLevel)}";
}
string mapped = MapType(param.CType, allowVoid:false);
if (param.IsPointer)
if (pointerLevel > 0)
{
// const GLchar* -> byte*; other pointers -> void*/IntPtr depending on base
if (param.CType.Equals("GLchar", StringComparison.Ordinal))
{
return "byte*";
}
if (mapped == "void") {
return "void*";
return $"void{new string('*', pointerLevel)}";
}
return $"{mapped}*";
return $"{mapped}{new string('*', pointerLevel)}";
}
return mapped;
}
public static string MapReturn(
string cType
string cType,
int pointerLevel
)
{
return MapType(cType, allowVoid:true);
string mapped = MapType(cType, allowVoid:true);
if (pointerLevel > 0) {
return $"{mapped}{new string('*', pointerLevel)}";
}
return mapped;
}
public static bool TryMapConstPointerToSpan(
GlParam param,
out string spanElementType
)
{
spanElementType = string.Empty;
if (!param.IsConst || param.PointerLevel != 1) {
return false;
}
string mapped = MapType(param.CType, allowVoid:false);
if (mapped is "void") {
return false;
}
spanElementType = mapped;
return true;
}
private static bool LooksLikeHandle(
@@ -115,6 +150,17 @@ namespace GenerateGL.CodeGen
name.Contains("transformfeedback", StringComparison.OrdinalIgnoreCase);
}
private static bool LooksLikeShaderType(
string name
)
{
if (string.IsNullOrWhiteSpace(name)) {
return false;
}
return name.Contains("shadertype", StringComparison.OrdinalIgnoreCase) ||
name.Equals("type", StringComparison.OrdinalIgnoreCase);
}
private static string MapType(
string cType,
bool allowVoid