make new opengl source generator

This commit is contained in:
Youmu Liu
2026-08-26 18:12:08 +08:00
parent 65041ff8bc
commit 75bf7fc139
126 changed files with 8934 additions and 26139 deletions
@@ -1,192 +0,0 @@
//-----------------------------------------------------------------------
// -----------------------------------------------------------------------
// file="CsTypeMapper"
// Project: StgSharp
// AuthorGroup: Nitload
// Copyright (c) Nitload. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
using System;
namespace GenerateGL.CodeGen
{
internal static class CsTypeMapper
{
public static string MapDelegateParameter(
GlParam param
)
{
int pointerLevel = param.PointerLevel;
if (param.CType.Equals("GLchar", StringComparison.Ordinal) && pointerLevel > 0) {
return $"byte{new string('*', pointerLevel)}";
}
string mapped = MapType(param.CType);
if (pointerLevel > 0)
{
if (mapped == "void") {
return $"void{new string('*', pointerLevel)}";
}
return $"{mapped}{new string('*', pointerLevel)}";
}
return mapped;
}
public static string MapDelegateReturn(
string cType,
int pointerLevel
)
{
string mapped = MapType(cType);
if (pointerLevel > 0) {
return $"{mapped}{new string('*', pointerLevel)}";
}
return mapped;
}
public static string MapParameter(
GlParam param
)
{
if (param.PointerLevel == 0)
{
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);
if (pointerLevel > 0)
{
if (mapped == "void") {
return $"void{new string('*', pointerLevel)}";
}
return $"{mapped}{new string('*', pointerLevel)}";
}
return mapped;
}
public static string MapReturn(
string cType,
int pointerLevel
)
{
string mapped = MapType(cType);
if (pointerLevel > 0) {
return $"{mapped}{new string('*', pointerLevel)}";
}
return mapped;
}
public static bool IsHandleReturn(
GlCommand command
)
{
if (command.ReturnPointerLevel != 0 ||
!command.ReturnType.Equals("GLuint", StringComparison.Ordinal)) {
return false;
}
return command.Name is "glCreateProgram" or "glCreateShader" or
"glCreateShaderProgramv";
}
public static bool TryMapPointerElement(
GlParam param,
out string elementType
)
{
elementType = string.Empty;
if (param.PointerLevel != 1) {
return false;
}
string mapped = MapType(param.CType);
if (mapped is "void") {
return false;
}
elementType = mapped;
return true;
}
private static bool LooksLikeHandle(
string name
)
{
if (string.IsNullOrWhiteSpace(name)) {
return false;
}
return name.Contains("program", StringComparison.OrdinalIgnoreCase) ||
name.Contains("shader", StringComparison.OrdinalIgnoreCase) ||
name.Contains("buffer", StringComparison.OrdinalIgnoreCase) ||
name.Contains("texture", StringComparison.OrdinalIgnoreCase) ||
name.Contains("framebuffer", StringComparison.OrdinalIgnoreCase) ||
name.Contains("renderbuffer", StringComparison.OrdinalIgnoreCase) ||
name.Contains("vertexarray", StringComparison.OrdinalIgnoreCase) ||
name.Contains("query", StringComparison.OrdinalIgnoreCase) ||
name.Contains("sampler", StringComparison.OrdinalIgnoreCase) ||
name.Contains("transformfeedback", StringComparison.OrdinalIgnoreCase);
}
private static string MapType(
string cType
)
{
return cType switch
{
"GLenum" or "GLbitfield" => "uint",
"GLboolean" => "byte",
"GLuint" or "GLhandleARB" => "uint",
"GLint" or "GLsizei" or "GLfixed" => "int",
"GLint64" => "long",
"GLuint64" => "ulong",
"GLshort" => "short",
"GLbyte" => "sbyte",
"GLubyte" => "byte",
"GLushort" => "ushort",
"GLfloat" => "float",
"GLdouble" => "double",
"GLhalf" => "ushort",
"GLclampf" => "float",
"GLclampd" => "double",
"GLintptr" => "nint",
"GLsizeiptr" => "nint",
"GLchar" => "byte",
"GLsync" => "glSync",
"GLDEBUGPROC" => "IntPtr",
"void" => "void",
_ => throw new NotSupportedException($"Unsupported OpenGL C type: {cType}")
};
}
}
}
@@ -1,532 +0,0 @@
//-----------------------------------------------------------------------
// -----------------------------------------------------------------------
// file="Generator"
// Project: StgSharp
// AuthorGroup: Nitload
// Copyright (c) Nitload. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
using System;
using System.Collections.Frozen;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace GenerateGL.CodeGen
{
internal sealed class Generator
{
private static readonly string[] TargetVersions = {
"3.3", "4.0", "4.1", "4.2", "4.3", "4.4", "4.5", "4.6"
};
private static readonly FrozenDictionary<string, string> ReservedNames =
new Dictionary<string, string>(StringComparer.Ordinal) {
{ "string", "@string" }, { "class", "@class" }, { "namespace", "@namespace" }, { "checked", "@checked" }, { "unchecked", "@unchecked" }, { "ref", "@ref" }, { "out", "@out" }, { "in", "@in" }, { "object", "@object" }, { "event", "@event" }, { "params", "@params" }, { "base", "@base" }, { "this", "@this" }, { "void", "@void" }, { "int", "@int" }, { "uint", "@uint" }, { "long", "@long" }, { "ulong", "@ulong" }, { "short", "@short" }, { "ushort", "@ushort" }, { "float", "@float" }, { "double", "@double" }, { "decimal", "@decimal" }, { "bool", "@bool" }, { "byte", "@byte" }, { "sbyte", "@sbyte" }, { "char", "@char" }, { "struct", "@struct" }, { "public", "@public" }, { "private", "@private" }, { "protected", "@protected" }, { "internal", "@internal" }, { "fixed", "@fixed" }
}.ToFrozenDictionary(StringComparer.Ordinal);
private readonly IReadOnlyDictionary<string, GlCommand> _commands;
private readonly IReadOnlyList<GlFeature> _features;
private readonly string _outputRoot;
public Generator(
IReadOnlyDictionary<string, GlCommand> commands,
IReadOnlyList<GlFeature> features,
string outputRoot
)
{
_commands = commands;
_features = features;
_outputRoot = outputRoot;
}
public void Run()
{
if (Directory.Exists(_outputRoot)) {
Directory.Delete(_outputRoot, recursive:true);
}
Directory.CreateDirectory(_outputRoot);
List<GlCommand> all = new List<GlCommand>();
List<(string Version, List<GlCommand> Commands)> commandsByVersion = new();
HashSet<string> previous = new HashSet<string>(StringComparer.Ordinal);
foreach (string v in TargetVersions)
{
IReadOnlyList<GlCommand> cmdsUpTo = CollectCommandsUpToVersion(v);
List<GlCommand> versionCmds = cmdsUpTo.Where(c => !previous.Contains(c.Name))
.ToList();
foreach (GlCommand cmd in versionCmds) {
previous.Add(cmd.Name);
}
all.AddRange(versionCmds);
commandsByVersion.Add((v, versionCmds));
}
IReadOnlyDictionary<string, string> managedNames = ManagedNameResolver.Resolve(
all.Where(ShouldGenerateWrapper));
foreach ((string version, List<GlCommand> commands) in commandsByVersion)
{
WriteOpenGLFunctionFile(version, commands, managedNames);
UniformOverloadEmitter.Write(_outputRoot, version, commands);
}
WriteMergedGlContextFile(all);
WriteCommandHistoryFile(BuildCommandHistory());
}
private IReadOnlyDictionary<string, List<CommandHistoryEntry>> BuildCommandHistory()
{
Dictionary<string, List<CommandHistoryEntry>> history = new(StringComparer.Ordinal);
IEnumerable<GlFeature> ordered = _features.Where(f => Version.TryParse(f.Version, out _))
.OrderBy(f => Version.Parse(f.Version));
foreach (GlFeature feature in ordered)
{
string version = feature.Version;
foreach (string name in feature.RequiresCommands.Distinct(StringComparer.Ordinal))
{
if (!_commands.ContainsKey(name) || ShouldSkip(name))
{
continue;
}
if (!history.TryGetValue(name, out List<CommandHistoryEntry>? list))
{
list = new List<CommandHistoryEntry>();
history[name] = list;
}
if (list.Count == 0 ||
list[^1].Action != CommandHistoryAction.Added ||
list[^1].Version != version) {
list.Add(new CommandHistoryEntry(version, CommandHistoryAction.Added));
}
}
foreach (string name in feature.RemovedCommands.Distinct(StringComparer.Ordinal))
{
if (!_commands.ContainsKey(name) || ShouldSkip(name))
{
continue;
}
if (!history.TryGetValue(name, out List<CommandHistoryEntry>? list))
{
list = new List<CommandHistoryEntry>();
history[name] = list;
}
if (list.Count == 0 ||
list[^1].Action != CommandHistoryAction.Removed ||
list[^1].Version != version) {
list.Add(new CommandHistoryEntry(version, CommandHistoryAction.Removed));
}
}
}
return history;
}
private IReadOnlyList<GlCommand> CollectCommandsUpToVersion(
string version
)
{
Version target = Version.Parse(version);
IEnumerable<GlFeature> ordered = _features.Where(f => Version.TryParse(f.Version, out Version? fv) &&
fv <= target)
.OrderBy(f => Version.Parse(f.Version));
HashSet<string> active = new HashSet<string>(StringComparer.Ordinal);
foreach (GlFeature feature in ordered)
{
foreach (string name in feature.RequiresCommands.Distinct(StringComparer.Ordinal))
{
if (_commands.ContainsKey(name)) {
active.Add(name);
}
}
foreach (string name in feature.RemovedCommands.Distinct(StringComparer.Ordinal)) {
active.Remove(name);
}
}
return active.Select(name => _commands.TryGetValue(name, out GlCommand? c) ? c : null)
.Where(c => c != null)!
.Cast<GlCommand>()
.ToList();
}
private static string DelegateSignature(
string ret,
IReadOnlyList<string> paramTypes
)
{
if (paramTypes.Count == 0) {
return $"delegate*<{ret}>";
}
return $"delegate*<{string.Join(", ", paramTypes)}, {ret}>";
}
private static string SafeName(
string name
)
{
if (string.IsNullOrWhiteSpace(name)) {
return "arg";
}
if (ReservedNames.TryGetValue(name, out string? mapped)) {
return mapped;
}
return name;
}
private static bool ShouldSkip(
string name
)
{
// No skipping; include legacy/fixed-function APIs as well.
return false;
}
private static string TrimGlPrefix(
string name
)
{
if (name.StartsWith("gl", StringComparison.Ordinal) && name.Length > 2) {
return name.Substring(2);
}
return name;
}
private void WriteCommandHistoryFile(
IReadOnlyDictionary<string, List<CommandHistoryEntry>> history
)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("// <auto-generated>");
sb.AppendLine($"// Generated by StgSharp.GenerateGL on {DateTime.UtcNow.ToString("u", CultureInfo.InvariantCulture)}");
sb.AppendLine("// Command availability history");
sb.AppendLine("// </auto-generated>");
sb.AppendLine("using System;\nusing System.Collections.Frozen;\nusing System.Collections.Generic;\n");
sb.AppendLine("namespace StgSharp.Graphics.OpenGL");
sb.AppendLine("{");
sb.AppendLine(" internal enum CommandHistoryAction { Added, Removed }");
sb.AppendLine();
sb.AppendLine(" internal readonly record struct CommandHistoryEntry(string Version, CommandHistoryAction Action);");
sb.AppendLine();
sb.AppendLine(" internal static class GlCommandHistory");
sb.AppendLine(" {");
sb.AppendLine(" internal static readonly FrozenDictionary<string, CommandHistoryEntry[]> History = new Dictionary<string, CommandHistoryEntry[]>(StringComparer.Ordinal)");
sb.AppendLine(" {");
foreach (KeyValuePair<string, List<CommandHistoryEntry>> kvp in history.OrderBy(k => k.Key, StringComparer.Ordinal))
{
string events = string.Join(", ", kvp.Value
.OrderBy(v => Version.Parse(v.Version))
.Select(v => $"new CommandHistoryEntry(\"{v.Version}\", CommandHistoryAction.{v.Action})"));
sb.AppendLine($" {{ \"{kvp.Key}\", new CommandHistoryEntry[] {{ {events} }} }},");
}
sb.AppendLine(" }.ToFrozenDictionary(StringComparer.Ordinal);");
sb.AppendLine(" }");
sb.AppendLine("}");
string fileName = Path.Combine(_outputRoot, "GlCommandHistory.g.cs");
File.WriteAllText(fileName, sb.ToString(), Encoding.UTF8);
}
private void WriteMergedGlContextFile(
IReadOnlyList<GlCommand> commands
)
{
List<GlCommand> distinct = commands.Where(c => !ShouldSkip(c.Name))
.GroupBy(c => c.Name, StringComparer.Ordinal)
.Select(g => g.First())
.OrderBy(c => c.Name, StringComparer.Ordinal)
.ToList();
StringBuilder sb = new StringBuilder();
sb.AppendLine("// <auto-generated>");
sb.AppendLine($"// Generated by StgSharp.GenerateGL on {DateTime.UtcNow.ToString("u", CultureInfo.InvariantCulture)}");
sb.AppendLine("// Aggregated GL3+ commands");
sb.AppendLine("// </auto-generated>");
sb.AppendLine("using System;\nusing System.Runtime.CompilerServices;\n");
sb.AppendLine("namespace StgSharp.Graphics.OpenGL");
sb.AppendLine("{");
sb.AppendLine(" public unsafe partial struct OpenglContext");
sb.AppendLine(" {");
foreach (GlCommand cmd in distinct)
{
string ret = CsTypeMapper.MapDelegateReturn(cmd.ReturnType, cmd.ReturnPointerLevel);
List<string> paramTypes = new List<string>();
foreach (GlParam p in cmd.Parameters)
{
string mapped = CsTypeMapper.MapDelegateParameter(p);
paramTypes.Add(mapped);
}
string decl = DelegateSignature(ret, paramTypes);
sb.AppendLine($" internal unsafe {decl} {cmd.Name};");
}
sb.AppendLine(" }");
sb.AppendLine("}");
string fileName = Path.Combine(_outputRoot, "OpenglContext.g.cs");
File.WriteAllText(fileName, sb.ToString(), Encoding.UTF8);
}
private void WriteOpenGLFunctionFile(
string version,
IReadOnlyList<GlCommand> commands,
IReadOnlyDictionary<string, string> managedNames
)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("// <auto-generated>");
sb.AppendLine($"// Generated by StgSharp.GenerateGL on {DateTime.UtcNow.ToString("u", CultureInfo.InvariantCulture)}");
sb.AppendLine($"// Version: {version}");
sb.AppendLine("// </auto-generated>");
sb.AppendLine("using System;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing StgSharp.Graphics.OpenGL;\n");
sb.AppendLine("namespace StgSharp.Graphics.OpenGL");
sb.AppendLine("{");
sb.AppendLine(" public unsafe partial class OpenGLFunction");
sb.AppendLine(" {");
foreach (GlCommand cmd in commands.Where(ShouldGenerateWrapper)
.OrderBy(c => c!.Name, StringComparer.Ordinal))
{
bool returnsHandle = CsTypeMapper.IsHandleReturn(cmd);
string ret = returnsHandle
? "GlHandle"
: CsTypeMapper.MapReturn(cmd.ReturnType, cmd.ReturnPointerLevel);
string rawName = cmd.Name; // original glXxx
string methodName = managedNames[rawName];
ManagedCommandPlan commandPlan = ManagedCommandPlan.Create(cmd);
List<string> paramList = new List<string>();
List<string> callArgs = new List<string>();
List<(string Type,string Name,bool IsOut)> pinned = new();
foreach (ManagedParameterPlan parameterPlan in commandPlan.PublicParameters)
{
GlParam p = parameterPlan.Source;
string pname = SafeName(p.Name);
paramList.Add($"{parameterPlan.PublicType} {pname}");
if (parameterPlan.IsSpan)
{
pinned.Add((parameterPlan.ElementType!, pname, false));
} else if (parameterPlan.Kind == ManagedParameterKind.Out) {
pinned.Add((parameterPlan.ElementType!, pname, true));
}
}
foreach (GlParam p in cmd.Parameters)
{
string pname = SafeName(p.Name);
if (commandPlan.DerivedLengthSources.TryGetValue(
p.Name, out string? sourceSpanName))
{
string nativeType = CsTypeMapper.MapParameter(p);
callArgs.Add($"checked(({nativeType}){SafeName(sourceSpanName)}.Length)");
continue;
}
ManagedParameterPlan parameterPlan = commandPlan.GetParameter(p.Name);
if (parameterPlan.IsSpan || parameterPlan.Kind == ManagedParameterKind.Out)
{
callArgs.Add($"{pname}Ptr");
} else if (parameterPlan.PublicType == "GlHandle")
{
callArgs.Add($"{pname}.Value");
} else
{
callArgs.Add(pname);
}
}
string signature = string.Join(", ", paramList);
string call = string.Join(", ", callArgs);
sb.AppendLine($" [MethodImpl(MethodImplOptions.AggressiveInlining)]");
sb.AppendLine($" public {ret} {methodName}({signature})");
sb.AppendLine(" {");
foreach ((string _, string name, bool isOut) in pinned.Where(p => p.IsOut)) {
sb.AppendLine($" {name} = default;");
}
AppendSpanLengthGuards(sb, cmd, commandPlan);
string prefix = ret == "void" ? string.Empty : "return ";
string callExpression = $"Context.{rawName}({call})";
if (returnsHandle) {
callExpression = $"GlHandle.Create({callExpression})";
}
if (pinned.Count == 0)
{
sb.AppendLine($" {prefix}{callExpression};");
} else
{
string indent = " ";
foreach ((string Type, string Name, bool IsOut) pin in pinned)
{
string pinSource = pin.IsOut ? $"&{pin.Name}" : pin.Name;
sb.AppendLine($"{indent}fixed ({pin.Type}* {pin.Name}Ptr = {pinSource})");
sb.AppendLine($"{indent}{{");
indent += " ";
}
sb.AppendLine($"{indent}{prefix}{callExpression};");
for (int i = 0; i < pinned.Count; i++)
{
indent = indent.Substring(0, indent.Length - 4);
sb.AppendLine($"{indent}}}");
}
}
sb.AppendLine(" }");
sb.AppendLine();
}
sb.AppendLine(" }");
sb.AppendLine("}");
string fileName = Path.Combine(
_outputRoot,
$"OpenGLFunction.Raw.v{version.Replace('.', '_')}.g.cs");
File.WriteAllText(fileName, sb.ToString(), Encoding.UTF8);
}
private static void AppendSpanLengthGuards(
StringBuilder sb,
GlCommand command,
ManagedCommandPlan plan
)
{
foreach ((string lengthName, string sourceName) in plan.DerivedLengthSources)
{
foreach (ManagedParameterPlan related in command.Parameters
.Select(p => plan.GetParameter(p.Name))
.Where(p => p.IsSpan && p.Source.Length == lengthName &&
p.Source.Name != sourceName))
{
string relatedName = SafeName(related.Source.Name);
string safeSourceName = SafeName(sourceName);
sb.AppendLine($" if ({relatedName}.Length != {safeSourceName}.Length) {{");
sb.AppendLine($" throw new ArgumentException(\"Span lengths controlled by {lengthName} must match.\", nameof({relatedName}));");
sb.AppendLine(" }");
}
}
foreach (ManagedParameterPlan parameter in command.Parameters
.Select(p => plan.GetParameter(p.Name)).Where(p => p.IsSpan))
{
string? expectedLength = BuildExpectedLengthExpression(parameter.Source, plan);
if (expectedLength is null) {
continue;
}
string parameterName = SafeName(parameter.Source.Name);
sb.AppendLine($" if ({parameterName}.Length < {expectedLength}) {{");
sb.AppendLine($" throw new ArgumentException(\"Span is shorter than the OpenGL length expression '{parameter.Source.Length}'.\", nameof({parameterName}));");
sb.AppendLine(" }");
}
}
private static string? BuildExpectedLengthExpression(
GlParam parameter,
ManagedCommandPlan plan
)
{
string length = parameter.Length?.Replace(" ", string.Empty,
StringComparison.Ordinal) ?? string.Empty;
if (length.Length == 0 || length.StartsWith("COMPSIZE(", StringComparison.Ordinal) ||
plan.DerivedLengthSources.ContainsKey(length)) {
return null;
}
if (int.TryParse(length, NumberStyles.None, CultureInfo.InvariantCulture,
out int constantLength)) {
return constantLength.ToString(CultureInfo.InvariantCulture);
}
ManagedParameterPlan? scalar = plan.PublicParameters.FirstOrDefault(p =>
p.Source.PointerLevel == 0 && p.Source.Name == length);
if (scalar is not null) {
return $"checked((int){SafeName(length)})";
}
Match multiply = Regex.Match(
length, "^(?<name>[A-Za-z_][A-Za-z0-9_]*)\\*(?<factor>[0-9]+)$",
RegexOptions.CultureInvariant);
if (!multiply.Success) {
multiply = Regex.Match(
length, "^(?<factor>[0-9]+)\\*(?<name>[A-Za-z_][A-Za-z0-9_]*)$",
RegexOptions.CultureInvariant);
}
if (multiply.Success) {
return $"checked((int){SafeName(multiply.Groups["name"].Value)} * {multiply.Groups["factor"].Value})";
}
Match divide = Regex.Match(
length, "^(?<name>[A-Za-z_][A-Za-z0-9_]*)/(?<divisor>[0-9]+)$",
RegexOptions.CultureInvariant);
return divide.Success
? $"checked((int){SafeName(divide.Groups["name"].Value)} / {divide.Groups["divisor"].Value})"
: null;
}
private bool ShouldGenerateWrapper(
GlCommand command
)
{
if (UniformOverloadEmitter.IsSetterCommand(command)) {
return false;
}
return !IsRedundantVertexAttribVectorCommand(command);
}
private bool IsRedundantVertexAttribVectorCommand(
GlCommand command
)
{
string name = command.Name;
if (!name.StartsWith("glVertexAttrib", StringComparison.Ordinal) ||
!name.EndsWith('v')) {
return false;
}
string scalarCommandName = name.Substring(0, name.Length - 1);
return _commands.ContainsKey(scalarCommandName);
}
private enum CommandHistoryAction
{
Added,
Removed
}
private readonly record struct CommandHistoryEntry(
string Version,
CommandHistoryAction Action
);
}
}
@@ -1,185 +0,0 @@
//-----------------------------------------------------------------------
// -----------------------------------------------------------------------
// file="GlXmlParser"
// Project: StgSharp
// AuthorGroup: Nitload
// Copyright (c) Nitload. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
namespace GenerateGL.CodeGen
{
internal static class GlXmlParser
{
public static (IReadOnlyDictionary<string, GlCommand> Commands, IReadOnlyList<GlFeature> Features) Parse(
string xmlPath
)
{
XDocument doc = XDocument.Load(xmlPath, LoadOptions.PreserveWhitespace);
Dictionary<string, GlCommand> commands = ParseCommands(doc);
List<GlFeature> features = ParseFeatures(doc);
return (commands, features);
}
private static string BuildCType(
XElement element
)
{
return BuildCType(element, out _, out _, out _);
}
private static string BuildCType(
XElement element,
out int pointerLevel,
out bool isPointer,
out bool isConst
)
{
// CType is usually text parts + <ptype>
IEnumerable<string> parts = element.Nodes()
.Select(n => n switch
{
XText t => t.Value,
XElement el when el.Name == "ptype" => el.Value,
_ => string.Empty
});
string raw = string.Concat(parts).Trim();
pointerLevel = raw.Count(ch => ch == '*');
isPointer = pointerLevel > 0;
isConst = raw.Contains("const", StringComparison.OrdinalIgnoreCase);
string cleaned = raw.Replace("const", string.Empty, StringComparison.OrdinalIgnoreCase)
.Replace("*", string.Empty)
.Trim();
return cleaned;
}
private static Dictionary<string, GlCommand> ParseCommands(
XDocument doc
)
{
Dictionary<string, GlCommand> dict = new Dictionary<string, GlCommand>(StringComparer.Ordinal);
IEnumerable<XElement> commandElements = doc.Root?.Element("commands")?.Elements("command") ??
Enumerable.Empty<XElement>();
foreach (XElement cmd in commandElements)
{
XElement? proto = cmd.Element("proto");
if (proto is null)
{
continue;
}
string name = proto.Element("name")?.Value ?? string.Empty;
string returnType = BuildCType(proto, out int retPtrLevel, out _,
out bool retIsConst);
List<GlParam> parameters = new List<GlParam>();
foreach (XElement p in cmd.Elements("param"))
{
string pName = p.Element("name")?.Value ?? string.Empty;
string cType = BuildCType(p, out int pointerLevel, out _, out bool isConst);
string? length = p.Attribute("len")?.Value;
parameters.Add(new GlParam(pName, cType, pointerLevel, isConst, length));
}
if (!string.IsNullOrEmpty(name)) {
dict[name] = new GlCommand(name, returnType, retPtrLevel, retIsConst,
parameters);
}
}
return dict;
}
private static List<GlFeature> ParseFeatures(
XDocument doc
)
{
List<GlFeature> list = new List<GlFeature>();
IEnumerable<XElement> featureElements = doc.Root?.Elements("feature") ??
Enumerable.Empty<XElement>();
foreach (XElement feature in featureElements)
{
string? api = feature.Attribute("api")?.Value;
if (!string.Equals(api, "gl", StringComparison.Ordinal))
{
continue;
}
string? profile = feature.Attribute("profile")?.Value;
// Only core (or no profile for legacy) to stay aligned with core profile
if (!string.IsNullOrEmpty(profile) &&
!string.Equals(profile, "core", StringComparison.Ordinal))
{
continue;
}
string version = feature.Attribute("number")?.Value ?? string.Empty;
List<string> requires = new List<string>();
foreach (XElement req in feature.Elements("require"))
{
string? reqProfile = req.Attribute("profile")?.Value;
if (!string.IsNullOrEmpty(reqProfile) &&
!string.Equals(reqProfile, "core", StringComparison.Ordinal))
{
continue;
}
foreach (XElement cmd in req.Elements("command"))
{
string? name = cmd.Attribute("name")?.Value;
if (!string.IsNullOrEmpty(name)) {
requires.Add(name);
}
}
}
List<string> removes = new List<string>();
foreach (XElement rem in feature.Elements("remove"))
{
string? remProfile = rem.Attribute("profile")?.Value;
if (!string.IsNullOrEmpty(remProfile) &&
!string.Equals(remProfile, "core", StringComparison.Ordinal))
{
continue;
}
foreach (XElement cmd in rem.Elements("command"))
{
string? name = cmd.Attribute("name")?.Value;
if (!string.IsNullOrEmpty(name)) {
removes.Add(name);
}
}
}
list.Add(new GlFeature(version, requires, removes));
}
return list;
}
}
}
@@ -1,140 +0,0 @@
//-----------------------------------------------------------------------
// -----------------------------------------------------------------------
// file="ManagedNameResolver"
// Project: StgSharp
// Copyright (c) Nitload.
// SPDX-License-Identifier: MIT
// -----------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace GenerateGL.CodeGen
{
internal static partial class ManagedNameResolver
{
private static readonly HashSet<string> TypedSuffixFamilies = new(
StringComparer.Ordinal) {
"ClearBuffer", "ClearNamedFramebuffer", "GetBufferParameter",
"GetNamedBufferParameter", "GetQueryBufferObject", "GetQueryObject",
"GetSamplerParameter", "GetTexLevelParameter", "GetTexParameter",
"GetTextureLevelParameter", "GetTextureParameter", "GetUniform", "GetnUniform",
"GetVertexAttrib", "PatchParameter", "PixelStore", "PointParameter",
"SamplerParameter", "TexParameter", "TextureParameter"
};
private static readonly Dictionary<string, string[]> ExactCandidates =
new Dictionary<string, string[]>(StringComparer.Ordinal) {
{ "BlendEquationi", [ "BlendEquation" ] },
{ "BlendEquationSeparatei", [ "BlendEquationSeparate" ] },
{ "BlendFunci", [ "BlendFunc" ] },
{ "BlendFuncSeparatei", [ "BlendFuncSeparate" ] },
{ "ClearDepthf", [ "ClearDepth" ] },
{ "ColorMaski", [ "ColorMask" ] },
{ "DepthRangef", [ "DepthRange" ] },
{ "Disablei", [ "Disable" ] },
{ "Enablei", [ "Enable" ] },
{ "FramebufferParameteri", [ "FramebufferParameter" ] },
{ "GetStringi", [ "GetString" ] },
{ "IsEnabledi", [ "IsEnabled" ] },
{ "NamedFramebufferParameteri", [ "NamedFramebufferParameter" ] },
{ "ProgramParameteri", [ "ProgramParameter" ] },
{ "ScissorIndexedv", [ "ScissorIndexed" ] },
{ "ViewportIndexedf", [ "ViewportIndexed" ] },
{ "ViewportIndexedfv", [ "ViewportIndexed" ] }
};
public static IReadOnlyDictionary<string, string> Resolve(
IEnumerable<GlCommand> commands
)
{
Dictionary<string, string> result = new(StringComparer.Ordinal);
HashSet<string> usedSignatures = new(StringComparer.Ordinal);
foreach (GlCommand command in commands.OrderBy(c => c.Name, StringComparer.Ordinal))
{
string signature = BuildParameterSignature(command);
foreach (string candidate in GetCandidates(command.Name))
{
if (usedSignatures.Add($"{candidate}({signature})"))
{
result.Add(command.Name, candidate);
break;
}
}
}
return result;
}
private static string BuildParameterSignature(
GlCommand command
)
{
ManagedCommandPlan plan = ManagedCommandPlan.Create(command);
return string.Join(",", plan.PublicParameters.Select(p => p.PublicType));
}
private static IEnumerable<string> GetCandidates(
string glName
)
{
string name = TrimGlPrefix(glName);
Match vertexAttrib = VertexAttribRegex().Match(name);
if (vertexAttrib.Success)
{
string stem = vertexAttrib.Groups[1].Value;
string dimension = vertexAttrib.Groups[2].Value;
bool normalized = vertexAttrib.Groups[3].Success;
yield return normalized ? $"{stem}Normalized" : stem;
yield return normalized ? $"{stem}{dimension}Normalized" : $"{stem}{dimension}";
yield return name;
yield break;
}
Match typed = TypedSuffixRegex().Match(name);
if (typed.Success && TypedSuffixFamilies.Contains(typed.Groups[1].Value))
{
string stem = typed.Groups[1].Value;
string suffix = typed.Groups[2].Value;
if (suffix.StartsWith('I')) {
yield return $"{stem}I";
}
yield return stem;
yield return name;
yield break;
}
if (ExactCandidates.TryGetValue(name, out string[]? candidates))
{
foreach (string candidate in candidates) {
yield return candidate;
}
}
yield return name;
}
private static string TrimGlPrefix(
string name
)
{
return name.StartsWith("gl", StringComparison.Ordinal) && name.Length > 2
? name.Substring(2)
: name;
}
[GeneratedRegex("^(VertexAttrib(?:I|L|P)?)([1-4])(N)?(?:ui|ub|us|i|b|s|f|d)(v)?$",
RegexOptions.CultureInvariant)]
private static partial Regex VertexAttribRegex();
[GeneratedRegex("^(.+?)(Iuiv|Iiv|ui64v|i64v|uiv|ui|iv|fi|i|fv|f|dv|d)$",
RegexOptions.CultureInvariant)]
private static partial Regex TypedSuffixRegex();
}
}
@@ -1,138 +0,0 @@
//-----------------------------------------------------------------------
// -----------------------------------------------------------------------
// file="ManagedParameterPlanner"
// Project: StgSharp
// Copyright (c) Nitload.
// SPDX-License-Identifier: MIT
// -----------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
namespace GenerateGL.CodeGen
{
internal enum ManagedParameterKind
{
Value,
RawPointer,
ReadOnlySpan,
Span,
Out
}
internal sealed record ManagedParameterPlan(
GlParam Source,
string PublicType,
ManagedParameterKind Kind,
string? ElementType
)
{
public bool IsSpan => Kind is ManagedParameterKind.ReadOnlySpan or
ManagedParameterKind.Span;
}
internal sealed class ManagedCommandPlan
{
private readonly Dictionary<string, ManagedParameterPlan> _allParameters;
private readonly Dictionary<string, string> _derivedLengthSources;
private ManagedCommandPlan(
IReadOnlyList<ManagedParameterPlan> publicParameters,
Dictionary<string, ManagedParameterPlan> allParameters,
Dictionary<string, string> derivedLengthSources
)
{
PublicParameters = publicParameters;
_allParameters = allParameters;
_derivedLengthSources = derivedLengthSources;
}
public IReadOnlyList<ManagedParameterPlan> PublicParameters { get; }
public IReadOnlyDictionary<string, string> DerivedLengthSources =>
_derivedLengthSources;
public static ManagedCommandPlan Create(
GlCommand command
)
{
Dictionary<string, ManagedParameterPlan> all = new(StringComparer.Ordinal);
foreach (GlParam parameter in command.Parameters)
{
ManagedParameterPlan plan;
if (CsTypeMapper.TryMapPointerElement(parameter, out string elementType) &&
(parameter.IsConst || !string.IsNullOrWhiteSpace(parameter.Length) ||
command.Name.StartsWith("glGet", StringComparison.Ordinal)))
{
if (!parameter.IsConst && parameter.Length == "1")
{
plan = new ManagedParameterPlan(
parameter, $"out {elementType}", ManagedParameterKind.Out,
elementType);
} else
{
ManagedParameterKind kind = parameter.IsConst
? ManagedParameterKind.ReadOnlySpan
: ManagedParameterKind.Span;
string container = parameter.IsConst ? "ReadOnlySpan" : "Span";
plan = new ManagedParameterPlan(
parameter, $"{container}<{elementType}>", kind, elementType);
}
} else
{
string mapped = CsTypeMapper.MapParameter(parameter);
ManagedParameterKind kind = parameter.PointerLevel == 0
? ManagedParameterKind.Value
: ManagedParameterKind.RawPointer;
plan = new ManagedParameterPlan(parameter, mapped, kind, null);
}
all.Add(parameter.Name, plan);
}
Dictionary<string, string> derivedLengths = new(StringComparer.Ordinal);
foreach (GlParam scalar in command.Parameters.Where(p => p.PointerLevel == 0))
{
List<ManagedParameterPlan> spans = command.Parameters
.Select(p => all[p.Name])
.Where(p => p.IsSpan &&
string.Equals(p.Source.Length, scalar.Name,
StringComparison.Ordinal))
.ToList();
if (spans.Count == 0) {
continue;
}
bool lengthAlsoControlsRawPointer = command.Parameters
.Select(p => all[p.Name]).Any(p =>
p.Kind == ManagedParameterKind.RawPointer &&
string.Equals(p.Source.Length, scalar.Name, StringComparison.Ordinal));
if (lengthAlsoControlsRawPointer) {
continue;
}
string scalarType = all[scalar.Name].PublicType;
if (scalarType is not ("int" or "uint" or "nint" or "nuint")) {
continue;
}
derivedLengths.Add(scalar.Name, spans[0].Source.Name);
}
IReadOnlyList<ManagedParameterPlan> publicParameters = command.Parameters
.Where(p => !derivedLengths.ContainsKey(p.Name))
.Select(p => all[p.Name])
.ToArray();
return new ManagedCommandPlan(publicParameters, all, derivedLengths);
}
public ManagedParameterPlan GetParameter(
string name
) => _allParameters[name];
}
}
@@ -1,58 +0,0 @@
//-----------------------------------------------------------------------
// -----------------------------------------------------------------------
// file="Models"
// Project: StgSharp
// AuthorGroup: Nitload
// Copyright (c) Nitload. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
using System.Collections.Generic;
namespace GenerateGL.CodeGen
{
internal sealed record GlCommand(
string Name,
string ReturnType,
int ReturnPointerLevel,
bool ReturnIsConst,
IReadOnlyList<GlParam> Parameters
);
internal sealed record GlParam(
string Name,
string CType,
int PointerLevel,
bool IsConst,
string? Length
)
{
public bool IsPointer => PointerLevel > 0;
}
internal sealed record GlFeature(
string Version,
IReadOnlyList<string> RequiresCommands,
IReadOnlyList<string> RemovedCommands
);
}
@@ -1,219 +0,0 @@
//-----------------------------------------------------------------------
// -----------------------------------------------------------------------
// file="UniformOverloadEmitter"
// Project: StgSharp
// Copyright (c) Nitload.
// SPDX-License-Identifier: MIT
// -----------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
#pragma warning disable CA1305
namespace GenerateGL.CodeGen
{
internal static partial class UniformOverloadEmitter
{
public static bool IsValueCommand(
GlCommand command
)
{
return ValueCommandRegex().IsMatch(command.Name);
}
public static bool IsSetterCommand(
GlCommand command
)
{
return IsValueCommand(command) || MatrixCommandRegex().IsMatch(command.Name);
}
public static void Write(
string outputRoot,
string version,
IReadOnlyList<GlCommand> commands
)
{
List<GlCommand> valueCommands = commands.Where(IsValueCommand)
.OrderBy(c => c.Name, StringComparer.Ordinal)
.ToList();
List<GlCommand> matrixConvenienceCommands = commands
.Where(c => Matrix4FloatCommandRegex().IsMatch(c.Name))
.OrderBy(c => c.Name, StringComparer.Ordinal)
.ToList();
if (valueCommands.Count == 0 && matrixConvenienceCommands.Count == 0) {
return;
}
StringBuilder sb = new();
sb.AppendLine("// <auto-generated>");
sb.AppendLine($"// Generated by StgSharp.GenerateGL on {DateTime.UtcNow.ToString("u", CultureInfo.InvariantCulture)}");
sb.AppendLine($"// Uniform overloads introduced in OpenGL {version}");
sb.AppendLine("// </auto-generated>");
sb.AppendLine("using System;");
sb.AppendLine("using System.Runtime.CompilerServices;");
sb.AppendLine("using StgSharp.Mathematics.Graphics;");
sb.AppendLine();
sb.AppendLine("namespace StgSharp.Graphics.OpenGL");
sb.AppendLine("{");
sb.AppendLine(" public unsafe partial class OpenGLFunction");
sb.AppendLine(" {");
foreach (GlCommand command in valueCommands) {
EmitValueOverload(sb, command);
}
foreach (GlCommand command in valueCommands.Where(IsFloatVectorCommand)) {
EmitVectorConvenienceOverload(sb, command);
}
foreach (GlCommand command in matrixConvenienceCommands) {
EmitMatrixConvenienceOverload(sb, command);
}
sb.AppendLine(" }");
sb.AppendLine("}");
string fileName = Path.Combine(
outputRoot,
$"OpenGLFunction.Uniform.v{version.Replace('.', '_')}.g.cs");
File.WriteAllText(fileName, sb.ToString(), Encoding.UTF8);
}
private static void EmitValueOverload(
StringBuilder sb,
GlCommand command
)
{
Match match = ValueCommandRegex().Match(command.Name);
bool hasProgram = match.Groups[1].Success;
int dimension = int.Parse(match.Groups[2].Value, CultureInfo.InvariantCulture);
string scalarType = MapScalarType(match.Groups[3].Value);
bool isVector = match.Groups[4].Success;
string uniformType = $"Uniform<{string.Join(", ", Enumerable.Repeat(scalarType, dimension))}>";
sb.AppendLine(" [MethodImpl(MethodImplOptions.AggressiveInlining)]");
if (isVector)
{
string programParameter = hasProgram ? "GlHandle program, " : string.Empty;
sb.AppendLine($" public void SetUniformValue({programParameter}{uniformType} uniform, ReadOnlySpan<{scalarType}> values)");
sb.AppendLine(" {");
sb.AppendLine(" ArgumentNullException.ThrowIfNull(uniform);");
if (dimension > 1)
{
sb.AppendLine($" if ((values.Length % {dimension}) != 0) {{");
sb.AppendLine($" throw new ArgumentException(\"Uniform data length must be divisible by {dimension}.\", nameof(values));");
sb.AppendLine(" }");
}
sb.AppendLine($" fixed ({scalarType}* valuesPtr = values) {{");
string count = dimension == 1 ? "values.Length" : $"values.Length / {dimension}";
sb.AppendLine($" Context.{command.Name}({BuildPrefixArguments(hasProgram)}{count}, valuesPtr);");
sb.AppendLine(" }");
sb.AppendLine(" }");
} else
{
string programParameter = hasProgram ? "GlHandle program, " : string.Empty;
string values = string.Join(", ", Enumerable.Range(0, dimension)
.Select(i => $"{scalarType} v{i}"));
string valueArguments = string.Join(", ", Enumerable.Range(0, dimension)
.Select(i => $"v{i}"));
sb.AppendLine($" public void SetUniformValue({programParameter}{uniformType} uniform, {values})");
sb.AppendLine(" {");
sb.AppendLine(" ArgumentNullException.ThrowIfNull(uniform);");
sb.AppendLine($" Context.{command.Name}({BuildPrefixArguments(hasProgram)}{valueArguments});");
sb.AppendLine(" }");
}
sb.AppendLine();
}
private static void EmitVectorConvenienceOverload(
StringBuilder sb,
GlCommand command
)
{
Match match = ValueCommandRegex().Match(command.Name);
bool hasProgram = match.Groups[1].Success;
int dimension = int.Parse(match.Groups[2].Value, CultureInfo.InvariantCulture);
if (dimension < 2) {
return;
}
string vectorType = $"Vec{dimension}";
string programParameter = hasProgram ? "GlHandle program, " : string.Empty;
sb.AppendLine(" [MethodImpl(MethodImplOptions.AggressiveInlining)]");
sb.AppendLine($" public void SetUniformValue({programParameter}Uniform<{vectorType}> uniform, {vectorType} value)");
sb.AppendLine(" {");
sb.AppendLine(" ArgumentNullException.ThrowIfNull(uniform);");
sb.AppendLine($" Context.{command.Name}({BuildPrefixArguments(hasProgram)}1, (float*)&value);");
sb.AppendLine(" }");
sb.AppendLine();
}
private static void EmitMatrixConvenienceOverload(
StringBuilder sb,
GlCommand command
)
{
bool hasProgram = command.Name.StartsWith("glProgram", StringComparison.Ordinal);
string programParameter = hasProgram ? "GlHandle program, " : string.Empty;
sb.AppendLine(" [MethodImpl(MethodImplOptions.AggressiveInlining)]");
sb.AppendLine($" public void SetUniformValue({programParameter}Uniform<GraphicsMatrix> uniform, GraphicsMatrix value, bool transpose = false)");
sb.AppendLine(" {");
sb.AppendLine(" ArgumentNullException.ThrowIfNull(uniform);");
sb.AppendLine($" Context.{command.Name}({BuildPrefixArguments(hasProgram)}1, transpose ? (byte)1 : (byte)0, (float*)&value);");
sb.AppendLine(" }");
sb.AppendLine();
}
private static string BuildPrefixArguments(
bool hasProgram
)
{
return hasProgram
? "program.Value, uniform.id.SignedValue, "
: "uniform.id.SignedValue, ";
}
private static bool IsFloatVectorCommand(
GlCommand command
)
{
Match match = ValueCommandRegex().Match(command.Name);
return match.Success && match.Groups[3].Value == "f" && match.Groups[4].Success;
}
private static string MapScalarType(
string suffix
)
{
return suffix switch
{
"f" => "float",
"d" => "double",
"i" => "int",
"ui" => "uint",
_ => throw new InvalidOperationException($"Unsupported uniform suffix: {suffix}")
};
}
[GeneratedRegex("^gl(Program)?Uniform([1-4])(ui|[fdi])(v)?$",
RegexOptions.CultureInvariant)]
private static partial Regex ValueCommandRegex();
[GeneratedRegex("^gl(?:Program)?UniformMatrix4fv$", RegexOptions.CultureInvariant)]
private static partial Regex Matrix4FloatCommandRegex();
[GeneratedRegex("^gl(?:Program)?UniformMatrix[234](?:x[234])?[fd]v$",
RegexOptions.CultureInvariant)]
private static partial Regex MatrixCommandRegex();
}
}
#pragma warning restore CA1305
@@ -1,691 +0,0 @@
# GenerateGL 与 StgSharp.Graphics OpenGL 绑定架构评估
评估日期:2026-08-24
## 实施状态(2026-08-25)
已完成第一轮无公开 API 破坏的文件整理:
- 手写 `OpenGLFunction` 已拆分到 `src/StgSharp.Graphics/OpenGL/Api`;
- 版本 Raw wrapper 已移动到 `src/StgSharp.Graphics/OpenGL/Generated` 并使用 `.g.cs` 后缀;
- `OpenglContext` 已移动为 `Generated/OpenglContext.g.cs`;
- `SetUniformValue` 已从 Uniform 模型文件移动到 `Api/OpenGLFunction.Uniform.cs`;
- Texture Unit 状态已移动到 `Api/OpenGLFunction.TextureUnits.cs`;
- 已修复两个 `Vec4` overload 对 `glUniform1fv` 的错误调用,现调用 `glUniform4fv(location, 1, ...)`;
- GenerateGL 已改为只生成一个合并 Context,Raw wrapper 继续按版本输出;
- GenerateGL 输出文件名已与新的 `Generated` 目录约定对齐。
第二轮生成器实验已经完成并输出到 `test/StgSharp.GenerateGL/Generated`:
- `glUniform1/2/3/4[f|i|ui|d][v]` 与 `glProgramUniform*` 已生成为 `SetUniformValue(...)` 重载;
- 已生成 scalar、`ReadOnlySpan<T>`、`Vec2/3/4` 和 `GraphicsMatrix` 入口;
- 所有 uniform setter 已从 Raw wrapper 排除;没有对应托管矩阵类型的形状暂时只存在于 `OpenglContext`;
- TexParameter、SamplerParameter、VertexAttrib、ClearBuffer 及 indexed API 等可由 C# 参数签名区分的函数已归并重载;
- 归并发生签名冲突时,生成器会保留必要的维度或语义尾缀;
- `OpenglContext` 仍保持纯 ABI 函数指针表,`GlHandle` 暂不拆分;
- 已移除“参数名为 type 就映射为 ShaderType”的不安全启发式规则。
Loader/ContextShadow 合并、BufferObject 专项生成和生成快照测试尚未实施。
## 1. 评估目的
本文评估 `StgSharp.GenerateGL` 与 `src/StgSharp.Graphics` 当前 OpenGL 绑定代码之间的关系,重点回答以下问题:
- GenerateGL 为什么会生成大量保留 C 命名风格的方法;
- Uniform 系列应如何生成符合 C# 使用习惯的方法重载;
- 现有手写封装散落在哪些文件中;
- 修改生成器时还需要同步调整哪些类型、加载器和调用方;
- 如何在保留现有功能的前提下逐步完成迁移。
本次评估基于静态代码检查,不包含代码重构或 API 变更。
## 2. 总体结论
当前 GenerateGL 完成的是“将 Khronos OpenGL C API 转换为可调用的 C# 代码”,尚未建立从 C API 函数族到惯用 C# API 的语义映射。
`glUniform1f`、`glUniform2f`、`glUniform4fv` 等名称中的数字和后缀分别编码了分量数、元素类型和指针形式。当前生成器只删除 `gl` 前缀,因此得到的仍然是 C 风格方法,而不是 C# 重载。
解决该问题不能只修改方法命名。当前 OpenGL 代码同时存在以下结构性问题:
1. 原始函数指针、自动生成的薄封装和手写高级封装没有清晰分层;
2. `Uniform.cs` 同时定义 Uniform 类型和 `partial OpenGLFunction` 方法;
3. `ShaderStruct.cs` 绕过 `OpenGLFunction`,直接调用原始函数指针;
4. uniform location 被建模为通用 `GlHandle`,语义不正确;
5. Context、ContextShadow、Loader 和 Wrapper 分别维护,已经出现函数清单漂移;
6. OpenGL 版本能力判断存在错误,可能加载当前上下文不支持的函数;
7. GenerateGL 文档描述的是增量源生成器,但当前实现是独立控制台代码生成程序。
建议将架构拆分为四个明确层次:
1. Registry 模型层:解析 `gl.xml` 并建立函数、版本和类型模型;
2. ABI 层:生成原始函数指针和加载代码;
3. Raw API 层:提供与 OpenGL 一一对应的薄封装;
4. Idiomatic API 层:按函数族生成 C# 重载,并使用 StgSharp 的向量、矩阵和资源类型。
## 3. 当前 GenerateGL 行为
### 3.1 输入
GenerateGL 从 `xml/gl.xml` 读取 Khronos OpenGL Registry。
当前解析内容包括:
- `<commands>` 中的函数名、返回值和参数;
- `<feature>` 中各 OpenGL 版本新增的命令;
- Core Profile 中删除的命令。
当前未完整实现:
- 枚举和常量生成;
- 扩展 API 生成;
- Roslyn Incremental Generator;
- 自动写入或接入 `StgSharp.Graphics` 项目。
### 3.2 输出
当前生成器针对 OpenGL 3.3 至 4.6 生成:
- 分版本 `OpenglContext` 函数指针字段;
- 分版本 `OpenGLFunction` 薄封装方法;
- 合并后的 `glContext.cs`;
- OpenGL 命令新增和删除历史。
输出目录为 GenerateGL 可执行文件所在目录下的 `Generated`,而不是 `src/StgSharp.Graphics`。
### 3.3 当前生成策略的限制
生成器对公开方法的处理主要包括:
- 删除 `gl` 前缀;
- 将部分 `GLuint` 参数启发式转换为 `GlHandle`;
- 将部分 `const T*` 转换为 `ReadOnlySpan<T>`;
- 对 C# 保留字进行转义。
它没有分析 OpenGL 函数族,因此下列函数会被当作互不相关的方法:
```text
glUniform1f
glUniform2f
glUniform3f
glUniform4f
glUniform1fv
glUniform2fv
glUniform3fv
glUniform4fv
```
## 4. StgSharp.Graphics 当前代码分布
### 4.1 原始函数指针
`src/StgSharp.Graphics/OpenGL/glContext.cs` 定义 `OpenglContext`,当前包含 657 个函数指针字段。
这些字段是 OpenGL ABI 的核心,应完全由生成器维护,不应与手写高级 API 混合。
### 4.2 ContextShadow
`src/StgSharp.Graphics/OpenGL/glContextShadow.cs` 使用 657 个 `IntPtr` 字段镜像 `OpenglContext`。
加载器将 `OpenglContext*` 强制转换为 `glContextShadow*` 后写入函数地址。因此两个结构体必须始终满足:
- 字段数量一致;
- 字段顺序一致;
- 每个字段占用相同大小。
当前两者字段数量和顺序一致,但这种设计非常脆弱。生成器目前不生成 ContextShadow,任何一侧发生变化都可能破坏内存布局。
### 4.3 函数加载器
`src/StgSharp.Graphics/OpenGL/glApiManager.Load.cs` 按 OpenGL 版本加载函数。
静态检查结果:
- `OpenglContext` 字段数:657;
- `glContextShadow` 字段数:657;
- 实际 Loader 赋值数:655。
当前未被实际加载的字段:
- `glGetPointerv`;
- `glVertexAttribLFormat`。
这说明 Context、Shadow 和 Loader 已经发生漂移。
### 4.4 自动生成的公开薄封装
以下文件定义 `partial OpenGLFunction`:
- `glFunction.v3_3.cs`;
- `glFunction.v4_0.cs`;
- `glFunction.v4_1.cs`;
- `glFunction.v4_2.cs`;
- `glFunction.v4_3.cs`;
- `glFunction.v4_4.cs`;
- `glFunction.v4_5.cs`;
- `glFunction.v4_6.cs`。
这些文件合计约 656 个公开方法。它们已经进行了一部分 C# 类型转换,但函数名和参数模型仍基本对应 C API。
这使它们处于不稳定的中间层:
- 不再是完全精确的 Raw ABI;
- 又没有形成惯用的 C# API;
- `count` 与 `ReadOnlySpan<T>` 长度可能不一致;
- `byte`、裸 `uint` 和裸指针仍大量暴露;
- 资源句柄识别依赖参数名启发式规则。
### 4.5 手写 OpenGLFunction 方法
`src/StgSharp.Graphics/OpenGL/glFunction.cs` 约 795 行,包含约 55 个手写公开方法,职责包括:
- Context 与 `OpenGLFunction` 实例管理;
- Buffer 创建、删除和数据上传;
- Texture 创建和上传;
- Framebuffer 和 Renderbuffer 操作;
- Shader 创建、源码上传和状态检查;
- Draw 调用;
- 错误检查;
- Vertex Attribute 配置。
这些方法与版本文件中的公开方法并存。例如同时存在:
- `ActiveTextureUnit` 与 `ActiveTexture`;
- `BindFrameBuffer` 与 `BindFramebuffer`;
- `FrameBufferTexture2d` 与 `FramebufferTexture2D`;
- `TextureImage2d` 与 `TexImage2D`;
- `SetBufferData` 与 `BufferData`。
这种重复不是编译错误,但会让调用者无法判断哪一层是推荐 API,也会妨碍生成器安全地产生新重载。
### 4.6 Uniform 类型与方法
`src/StgSharp.Graphics/OpenGL/ShaderEdit/Uniform.cs` 同时包含:
- `Uniform` 基类;
- `Uniform<T>`;
- `Uniform<T, U>`;
- `Uniform<T, U, V>`;
- `Uniform<T, U, V, W>`;
- `partial OpenGLFunction` 的 `SetUniformValue` 重载。
代码位置本身不影响编译,但该文件跨越了两个职责边界:
- Uniform 数据模型;
- OpenGL 命令封装。
这会导致生成器无法拥有 Uniform 方法的明确输出区域。
### 4.7 Shader 相关代码
`src/StgSharp.Graphics/OpenGL/ShaderEdit/Shader.cs` 同时定义:
- `partial glRender` 的 Shader 工厂方法;
- `Shader`;
- `ShaderStatus`;
- `ShaderProgram`;
- `ShaderProgram.GetUniform<T...>`。
此外还存在 `src/StgSharp.Graphics/ShaderEdit`,其中包含另一套 Shader 抽象。`OpenGL/ShaderEdit/IglConvertable.cs` 的文件路径位于 OpenGL 子目录,但命名空间是 `StgSharp.Graphics.ShaderEdit`。
当前文件位置和命名空间没有形成一致边界。
### 4.8 绕过公开封装的调用
除 Loader 和绑定实现外,发现 `src/StgSharp.Graphics/ShaderEdit/ShaderStruct.cs` 直接获取:
```csharp
OpenglContext* gl =
(OpenglContext*)OpenGLFunction.CurrentGL.ContextHandle;
```
随后直接调用 `glUniform*`。
这是高级代码对 ABI 层的越层依赖。新的 Uniform API 建立后,这里应只调用 `OpenGLFunction.SetUniformValue` 或对应的 Uniform 对象方法。
## 5. 已确认的正确性问题
### 5.1 Vec4 使用了错误的 OpenGL 函数
当前 `Uniform.cs` 中,`Vec4` 被传给:
```csharp
glUniform1fv(location, 4, pointer);
```
该调用表示上传 4 个标量 uniform,而不是上传 1 个四分量向量。
正确调用应为:
```csharp
glUniform4fv(location, 1, pointer);
```
### 5.2 整数 Uniform 调用了浮点函数
`ShaderStruct.SetAllUniforms` 的整数分支调用 `glUniform1f`,应调用 `glUniform1i`。
### 5.3 Uniform location 被错误建模为 GlHandle
OpenGL uniform location 的原始类型是有符号 `GLint`,并允许 `-1` 表示未找到。
当前实现使用 `GlHandle` 保存 uniform location。`GlHandle` 同时被用于 Buffer、Texture、Program 和 Shader 等 `GLuint` 对象名称,因此无法表达 uniform location 的不同语义和有效性规则。
建议引入:
```csharp
public readonly record struct UniformLocation(int Value)
{
public bool IsValid => Value >= 0;
}
```
### 5.4 版本判断错误
`glManager.CheckCoreVersion` 当前使用类似以下判断:
```csharp
majorVersion >= 4 ||
(majorVersion == 4 && minorVersion == requiredMinor)
```
当上下文版本为 OpenGL 4.0 时,`majorVersion >= 4` 对 4.1 至 4.6 的检查也全部为真。
正确判断应为:
```csharp
majorVersion > requiredMajor ||
(majorVersion == requiredMajor && minorVersion >= requiredMinor)
```
版本和扩展能力还应保存在每个 OpenGL context 中,而不是静态全局字段中。
### 5.5 上下文内存没有完整清零
`glRender.InitializeContext` 通过 `Marshal.AllocHGlobal` 分配 `OpenglContext`,但只将 `glGetString` 设置为零。
如果当前版本不加载某些较新函数,其字段可能保留未初始化值。公开版本方法仍然存在,错误调用时可能跳转到无效地址。
上下文分配后应完整清零,并通过 capability 检查限制不受支持的方法调用。
### 5.6 函数指针调用约定需要统一审计
GLFW 返回的是非托管函数地址。当前 `OpenglContext` 多数使用 `delegate*<...>`,没有显式标记 `unmanaged` 调用约定。
生成器应根据目标平台统一生成并验证函数指针调用约定,例如:
```csharp
delegate* unmanaged<...>
```
或在确有需要时生成平台对应的显式调用约定。
## 6. Uniform 函数族的推荐建模
### 6.1 函数名解析
生成器应将以下函数族解析为结构化模型:
```text
glUniform{1|2|3|4}{f|d|i|ui}{v?}
glProgramUniform{1|2|3|4}{f|d|i|ui}{v?}
glUniformMatrix{2|3|4|2x3|2x4|3x2|3x4|4x2|4x3}{f|d}v
glProgramUniformMatrix{...}{f|d}v
```
建议模型至少包含:
```text
Operation = Uniform | ProgramUniform
Shape = Scalar | Vector | Matrix
Columns = 1..4
Rows = 1..4
ElementType = Float | Double | Int | UInt
InputForm = Components | Array
NativeCommand = glUniform4fv 等原始名称
IntroducedIn = OpenGL 版本
```
不要直接在字符串 emitter 中通过多组 `StartsWith` 和 `EndsWith` 拼接逻辑。应先完成函数族识别,再根据统一模型生成代码。
### 6.2 推荐的 Uniform 类型
建议保留单泛型参数:
```csharp
public readonly struct Uniform<T> where T : unmanaged
{
public UniformLocation Location { get; }
}
```
向量和矩阵形状由 `T` 表达:
```text
Uniform<float>
Uniform<Vec2>
Uniform<Vec3>
Uniform<Vec4>
Uniform<GraphicsMatrix>
```
不建议继续使用 `Uniform<T, U, V, W>` 表达四分量值。
要完整支持 `double`、`int` 和 `uint` 向量,数学库还需要提供对应的向量类型,或者 OpenGL 层需要定义布局稳定的专用值类型,例如:
```text
DVec2 / DVec3 / DVec4
IVec2 / IVec3 / IVec4
UVec2 / UVec3 / UVec4
```
### 6.3 推荐重载
标量与向量:
```csharp
void SetUniformValue(Uniform<float> uniform, float value);
void SetUniformValue(Uniform<Vec2> uniform, Vec2 value);
void SetUniformValue(Uniform<Vec3> uniform, Vec3 value);
void SetUniformValue(Uniform<Vec4> uniform, Vec4 value);
```
数组:
```csharp
void SetUniformValue(
Uniform<float> uniform,
ReadOnlySpan<float> values);
void SetUniformValue(
Uniform<Vec4> uniform,
ReadOnlySpan<Vec4> values);
```
矩阵:
```csharp
void SetUniformValue(
Uniform<GraphicsMatrix> uniform,
in GraphicsMatrix value,
bool transpose = false);
```
调用者不应手工传入 `count`。生成方法应根据 Span 长度和元素形状计算 OpenGL 的 `count` 参数。
### 6.4 Raw API 的处理
建议保留与 OpenGL 一一对应的 Raw 方法,至少在迁移期内不要立即删除。
可选策略:
1. 将 Raw 方法改为 `internal`;
2. 放入单独的 `OpenGLRaw` 类型;
3. 暂时保持 `public`,但使用 `EditorBrowsable(Never)` 降低 IntelliSense 噪音;
4. 为旧 API 提供一个兼容周期,再逐步弃用。
Idiomatic API 不应与 Raw API 写入同一生成文件。
## 7. 推荐目录结构
```text
src/StgSharp.Graphics/OpenGL/
Generated/
OpenglContext.g.cs
OpenglLoader.v33.g.cs
OpenGLFunction.Raw.v33.g.cs
OpenGLFunction.Raw.v40.g.cs
OpenGLFunction.Uniform.g.cs
OpenGLFunction.ProgramUniform.g.cs
Api/
OpenGLFunction.Context.cs
OpenGLFunction.Diagnostics.cs
OpenGLFunction.Buffer.cs
OpenGLFunction.Texture.cs
OpenGLFunction.Drawing.cs
OpenGLFunction.Shader.cs
Objects/
Uniform.cs
UniformLocation.cs
Shader.cs
ShaderProgram.cs
ShaderStatus.cs
Buffer/
Texture/
Rendering/
GlRender.cs
GlRender.Resources.cs
GlRender.Threading.cs
```
具体目录名称可以调整,但必须保持以下边界:
- `Generated` 中的文件可以被完整覆盖;
- 手写文件永远不写入 `Generated`;
- Uniform 类型定义和 Uniform 调用方法分离;
- Shader 资源对象不直接访问 `OpenglContext*`;
- Loader 与 Context 来自同一个生成模型。
## 8. 建议的文件迁移
### 8.1 `Uniform.cs`
保留:
- `Uniform<T>`;
- uniform location;
- 与 uniform 数据模型直接相关的成员。
移出:
- 所有 `partial OpenGLFunction` 方法。
### 8.2 `Shader.cs`
拆分为:
- `Shader.cs`;
- `ShaderProgram.cs`;
- `ShaderStatus.cs`;
- `ShaderProgram.Uniform.cs`;
- `GlRender.ShaderFactory.cs`。
### 8.3 `ShaderStruct.cs`
移除:
- `ContextHandle` 访问;
- `OpenglContext*` 转换;
- 直接 `glUniform*` 调用。
改为通过类型安全的 Uniform API 分发。
### 8.4 `glFunction.cs`
保留 Context 生命周期和实例管理,然后按功能拆分手写便利方法:
```text
OpenGLFunction.Context.cs
OpenGLFunction.Diagnostics.cs
OpenGLFunction.Buffer.cs
OpenGLFunction.Texture.cs
OpenGLFunction.Framebuffer.cs
OpenGLFunction.Drawing.cs
OpenGLFunction.Shader.cs
```
### 8.5 `glFunction.SourceManager.cs`
该文件实际管理 Texture Unit,而不是 Source。建议重命名为:
```text
OpenGLFunction.TextureUnits.cs
```
进一步可以将 Texture Unit 分配状态移出函数绑定类,放入每个 Render Context 的资源管理对象。
### 8.6 `IglConvertable.cs`
该文件位于 `OpenGL/ShaderEdit`,命名空间却是 `StgSharp.Graphics.ShaderEdit`。应移动到与命名空间一致的 `ShaderEdit` 目录。
## 9. GenerateGL 推荐内部结构
建议将当前单一 `Generator` 拆分为以下阶段。
### 9.1 Registry 解析
```text
GlXmlParser
-> RegistryModel
```
负责准确保留:
- C 类型;
- 指针层级;
- const;
- 参数组信息;
- feature/profile/version;
- alias;
- enum group。
### 9.2 ABI 类型映射
```text
RegistryModel
-> AbiCommandModel
```
这里只做精确映射,不做 `GlHandle`、Span 或 ShaderType 等高级推断。
### 9.3 函数族分析
```text
AbiCommandModel
-> CommandFamilyModel
```
由专门规则识别:
- Uniform;
- ProgramUniform;
- UniformMatrix;
- VertexAttrib;
- TexParameter;
- Get 系列;
- Gen/Delete/Create 系列。
无法识别的命令仍可生成 Raw API,但不得用不确定的启发式规则擅自改变资源类型。
### 9.4 Emitters
建议拆分:
```text
ContextEmitter
LoaderEmitter
RawFunctionEmitter
UniformEmitter
ProgramUniformEmitter
ConstantEmitter
HistoryEmitter
```
每个 emitter 只负责一种输出,便于单独进行 golden-file 测试。
## 10. 迁移计划
### 阶段一:建立安全的生成边界
1. 新增 `OpenGL/Generated`;
2. 所有生成文件使用 `.g.cs` 后缀;
3. 生成器直接生成 `OpenglContext` 和 Loader;
4. 移除或自动生成 `glContextShadow`;
5. 增加函数数量、名称和版本一致性测试。
此阶段不改变现有公开 API。
### 阶段二:修复 Uniform 模型
1. 新增 `UniformLocation`;
2. 将 `GetUniformLocation` 返回类型改为 `UniformLocation`;
3. 将 Uniform 简化为 `Uniform<T>`;
4. 修复 Vec4 和整数 uniform 的错误调用;
5. 迁移 Camera、ShaderProgram 和 ShaderStruct。
### 阶段三:生成 Uniform 重载
1. 实现 Uniform 函数族解析;
2. 生成 scalar/vector/matrix overload;
3. 自动计算 Span 对应的 count;
4. 生成 ProgramUniform 对应重载;
5. 使用 golden-file 测试验证每个原始命令映射到正确 overload。
### 阶段四:整理其他手写便利 API
1. 拆分 `glFunction.cs`;
2. 统一 Buffer、Texture、Framebuffer 方法命名;
3. 明确 Raw API 的可见性和兼容策略;
4. 逐步为 VertexAttrib、TexParameter 等函数族生成重载。
### 阶段五:清理旧 API
1. 标记旧 C 风格 public wrapper 为 obsolete 或隐藏;
2. 提供迁移说明;
3. 在约定的兼容版本后删除旧入口。
## 11. 测试与验收标准
### 11.1 Registry 一致性
- 每个 Context 字段必须有对应 Loader 赋值;
- 每个 Raw wrapper 必须对应一个 Context 字段;
- 不允许 Loader 引用不存在的字段;
- Context、Loader 和 Wrapper 的版本归属必须一致。
### 11.2 Uniform golden tests
至少验证:
```text
float -> glUniform1f
Vec2 -> glUniform2fv(count = 1)
Vec3 -> glUniform3fv(count = 1)
Vec4 -> glUniform4fv(count = 1)
ReadOnlySpan<Vec4> -> glUniform4fv(count = span.Length)
GraphicsMatrix -> glUniformMatrix4fv(count = 1)
```
同时覆盖 `double`、`int`、`uint`、非方阵矩阵和 ProgramUniform。
### 11.3 API 约束
- 高级代码不得访问 `OpenglContext*`;
- 高级代码不得手工传入可由 Span 推导的 count;
- uniform location 不得使用 `GlHandle`;
- 生成文件不得包含手写区域;
- 手写文件不得依赖生成字段的布局顺序;
- 不支持的 OpenGL 版本方法不得调用未初始化函数指针。
### 11.4 构建验证
GenerateGL 当前可以成功构建,但存在代码分析警告。
本次检查中,单独构建 `StgSharp.Graphics` 时,MSBuild 在项目引用 `StgSharp.Mathematics` 的 `GetTargetFrameworks` 阶段失败,最终显示 0 个 C# 错误和 0 个警告。该失败发生在 C# 编译前,因此本次评估不将其视为 Graphics 源码编译结果。
## 12. 推荐的第一批实际改动
为了控制改动规模,第一批建议只完成以下内容:
1. 新增 `UniformLocation`;
2. 将 `Uniform<T, ...>` 收敛到 `Uniform<T>`;
3. 把 `SetUniformValue` 从 `Uniform.cs` 移到独立 partial 文件;
4. 修复 `Vec4` 与整数 uniform 调用;
5. 让 `ShaderStruct` 不再访问 `OpenglContext*`;
6. 给 GenerateGL 增加 `UniformFamilyModel` 和 `UniformEmitter`;
7. 同时生成 Context 与 Loader,并消除 ContextShadow 的手工同步;
8. 增加 Context/Loader/Wrapper 集合一致性测试。
完成这一批后,再决定是否立即重构全部 `glFunction.cs`。这样可以先解决 Uniform API 和生成同步问题,同时避免一次性扩大到整个 Graphics 框架。
@@ -1,93 +0,0 @@
# StgSharp.GenerateGL 源生成器技术文档
## 目标与范围
- **输入**:Khronos OpenGL Registry `gl.xml`(Core Profile 为主,版本 3.3→4.6,可选扩展)。
- **输出**:合并的 partial `OpenglContext`(`delegate*` 字段)、分版本 `OpenGLFunction` 薄包装方法,以及按版本生成的 Uniform 语义重载。生成结果最终对应 `src\StgSharp.Graphics\OpenGL\Generated\`,评审时可以通过命令行参数输出到独立目录。
- **风格**:保持现有函数指针字段 + 薄封装方法模式;兼容现有命名和类型定义(如 `GlHandle`)。
---
## 阶段 1:输入解析(XML 读取与过滤)
- 将 `gl.xml` 作为 AdditionalFile 或 EmbeddedResource,使用 `XmlReader` 流式解析。
- 解析节点:
- `<commands><command>`:函数名、返回类型、参数。
- `<enums>`:常量。
- `<feature profile="core">`:按 `version` 收录命令/常量。
- `<extensions>`:可选扩展(ARB/KHR/EXT/NV)。
- 过滤策略:仅 Core Profile 且版本 ≥ 3.3(3.3→4.6 递进);扩展按启用列表追加。
---
## 阶段 2:类型映射与句柄规则
- 整数:`GLenum`/`GLbitfield`→`uint`;`GLint`/`GLsizei`/`GLfixed`→`int`;`GLuint`→`uint`;`GLboolean`→`byte`(包装层可 bool→byte)。
- 浮点:`GLfloat`→`float`;`GLdouble`→`double`。
- 指针与尺寸:`void*`/`const void*`→`void*`;`GLintptr`、`GLsizeiptr`→`nint`;`GLsync`→现有 `glSync` 包装。`GLint64`/`GLuint64` 分别映射为 `long`/`ulong`。回调类型 `GLDEBUGPROC` 暂以指针大小的 `IntPtr` 表示。
- 未知 C 类型直接终止生成,不再静默回退为 `IntPtr`。这可以防止 typedef 漏映射后生成 ABI 不兼容的函数指针。
- 字符串:函数表中的 `GLchar*` 保持 `byte*` ABI;包装层的 const 单指针使用 UTF-8 `ReadOnlySpan<byte>`,后续可另行提供 `string` 重载。
- 参数长度:解析并保留 registry `<param len="...">`。包装层以该表达式判断数组方向、固定长度和关联的 `count`/`bufSize` 参数;底层函数表不使用这些托管规则。
- 调用约定:OpenGL APIENTRY 通常 stdcall(Windows);保持与现有 `glContext` 字段一致(`delegate* unmanaged[Stdcall]` 或 `unmanaged[Cdecl]`,需与 loader 对齐)。
- 句柄识别:包含 program/shader/buffer/texture/framebuffer/renderbuffer/vertexarray/query/sampler/transformfeedback 等对象名的 `GLuint` 参数 → 包装层使用 `GlHandle`,内部传 `handle.Value`。`glCreateProgram`、`glCreateShader` 等明确返回 object name 的命令返回 `GlHandle`。
- `GLenum` 不再仅凭参数名 `type` 推断为 `ShaderType`;低层包装保持 `uint`,避免把像素类型、索引类型等无关参数错误分类。
- glGet* 输出:保留指针签名,或另行生成 unsafe Span/stackalloc 适配器;核心先生成指针版。
---
## 阶段 3:版本分组与文件组织
- 目标目录:`src\StgSharp.Graphics\OpenGL\Generated\`
- Context 生成一个合并文件:
- `OpenglContext.g.cs`:所有目标 Core 版本需要的 `delegate*` 字段。
- Raw 包装按版本生成独立 partial:
- `OpenGLFunction.Raw.v3_3.g.cs`, …:包装方法 `public void Foo(...) => Context.glFoo(...);`
- Uniform 重载按首次引入版本生成:
- `OpenGLFunction.Uniform.v3_3.g.cs`、`v4_0`、`v4_1`。
- 不再同时生成分版本 Context 与合并 Context,避免同一字段被 partial struct 重复定义。
- 常量/枚举:`glConst.generated.cs`(或分版本补丁),避免与现有重复,先查已有定义再生成。
- 命名空间:`StgSharp.Graphics.OpenGL`;类声明:`partial struct/partial class glContext`(按现有定义),`partial class OpenGLFunction`。
---
## 阶段 4:生成规则(函数表与包装)
- `OpenglContext` 字段:`internal unsafe delegate*<converted_sig> glFoo;`
- `OpenGLFunction` 包装:薄封装直接转发;句柄参数用 `GlHandle`,内部传 `handle.Value`;`bool` 参数按底层 `GLboolean` 需要转换为 `byte/uint`。
- 指针包装:带长度的 `const T*` 生成 `ReadOnlySpan<T>`,输出 `T*` 生成 `Span<T>`,`len="1"` 的输出生成 `out T`。可由单个 Span 唯一决定的 `count`/`n`/`bufSize` 从 `Span.Length` 推导;共享同一长度的输入 Span 会检查长度一致。简单常量、乘法和除法长度表达式会生成下限检查。
- registry 中省略 `len` 的零结尾 const 字符指针仍生成 `ReadOnlySpan<byte>`;省略 `len` 的 `glGet*` 数值单指针按未知长度输出生成 `Span<T>`。`void*`、二级指针、驱动拥有的返回指针以及表示 Buffer 偏移的指针继续保留原始形式。
- 可重载的 C 类型尾缀会折叠为同一 C# 方法名,例如 `TexParameterf/i/fv/iv` → `TexParameter(...)`,`BlendEquation/BlendEquationi` → `BlendEquation(...)`。生成器以最终 C# 参数签名检测冲突;无法区分时保留最少的维度或语义尾缀。
- `glUniform1/2/3/4[f|i|ui|d][v]` 和 `glProgramUniform*` 不再作为一组公开的 C 风格方法生成,而是生成 `SetUniformValue(...)` 重载。location 从 `Uniform<T...>.id.SignedValue` 取得;数组版本接受 `ReadOnlySpan<T>` 并自动计算 count。
- float vector 额外生成 `Vec2`、`Vec3`、`Vec4` 重载,4×4 float matrix 生成 `GraphicsMatrix` 重载。所有 uniform setter(包括 matrix)都不进入 Raw wrapper;项目暂时没有对应托管类型的其他矩阵形状只保留底层 `OpenglContext` 函数指针,待类型齐备后再生成公开重载。
- `glVertexAttribN*v` 若存在对应的标量命令 `glVertexAttribN*`,不再生成重复的 Span wrapper;公开 API 使用 `VertexAttrib(index, x, y, z, w)` 形式的固定分量重载。只有不存在标量等价命令的特殊整数/归一化形式才暂时保留独立入口。
- `FramebufferTexture1D/2D/3D` 表示不同 OpenGL API,不参与维度重载归并。
- 去重:若同名字段/方法已存在,跳过或比对签名避免重复生成。
---
## 阶段 5:增量源生成器结构
- 步骤:
1. 收集 AdditionalFiles(`gl.xml`)。
2. 解析→建模(CommandModel, EnumModel, FeatureModel)。
3. 按版本/profile 过滤。
4. Emit:分文件输出(`SourceProductionContext.AddSource`)。
- 配置建议:`LangVersion=preview`(支持 `delegate* unmanaged[Stdcall]`);仅引用必要的 XML 解析库。
---
## 阶段 6:兼容性与发布注意
- 不改动现有手写文件,仅追加 partial。
- 常量值需与现有 `glConst` 保持一致,生成前检查重复。
- 大 `gl.xml` 使用流式解析避免内存压力。
- Loader(`wglGetProcAddress/glXGetProcAddress/eglGetProcAddress`)不在本轮生成,字段调用约定需与 loader 对齐。
---
## 下一步实施建议
1. 将 `gl.xml` 添加为 AdditionalFile。
2. 搭建增量生成器骨架:Parse → Filter → Emit。
3. 先生成 3.3 子集验证编译,再扩展到 4.6。
4. 按需追加扩展(ARB/KHR),保持可配置启用列表。
## 本地评审输出
可把首个命令行参数作为输出目录:
```powershell
dotnet run --project test\StgSharp.GenerateGL\GenerateGL.csproj -- test\StgSharp.GenerateGL\Generated
```
@@ -1,15 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<ImplicitUsings>enable</ImplicitUsings>
<Platforms>AnyCPU;x64</Platforms>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Generated\**\*.cs" />
<None Include="Generated\**\*.cs" />
<None Update="xml\**" CopyToOutputDirectory="Always" />
</ItemGroup>
</Project>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,238 +0,0 @@
// <auto-generated>
// Generated by StgSharp.GenerateGL on 2026-08-25 09:22:55Z
// Version: 4.0
// </auto-generated>
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using StgSharp.Graphics.OpenGL;
namespace StgSharp.Graphics.OpenGL
{
public unsafe partial class OpenGLFunction
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BeginQueryIndexed(uint target, uint index, uint id)
{
Context.glBeginQueryIndexed(target, index, id);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BindTransformFeedback(uint target, uint id)
{
Context.glBindTransformFeedback(target, id);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BlendEquationSeparate(uint buf, uint modeRGB, uint modeAlpha)
{
Context.glBlendEquationSeparatei(buf, modeRGB, modeAlpha);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BlendEquation(uint buf, uint mode)
{
Context.glBlendEquationi(buf, mode);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BlendFuncSeparate(uint buf, uint srcRGB, uint dstRGB, uint srcAlpha, uint dstAlpha)
{
Context.glBlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BlendFunc(uint buf, uint src, uint dst)
{
Context.glBlendFunci(buf, src, dst);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DeleteTransformFeedbacks(ReadOnlySpan<uint> ids)
{
fixed (uint* idsPtr = ids)
{
Context.glDeleteTransformFeedbacks(checked((int)ids.Length), idsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DrawArraysIndirect(uint mode, void* indirect)
{
Context.glDrawArraysIndirect(mode, indirect);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DrawElementsIndirect(uint mode, uint type, void* indirect)
{
Context.glDrawElementsIndirect(mode, type, indirect);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DrawTransformFeedback(uint mode, uint id)
{
Context.glDrawTransformFeedback(mode, id);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DrawTransformFeedbackStream(uint mode, uint id, uint stream)
{
Context.glDrawTransformFeedbackStream(mode, id, stream);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void EndQueryIndexed(uint target, uint index)
{
Context.glEndQueryIndexed(target, index);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GenTransformFeedbacks(Span<uint> ids)
{
fixed (uint* idsPtr = ids)
{
Context.glGenTransformFeedbacks(checked((int)ids.Length), idsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetActiveSubroutineName(GlHandle program, uint shadertype, uint index, out int length, Span<byte> name)
{
length = default;
fixed (int* lengthPtr = &length)
{
fixed (byte* namePtr = name)
{
Context.glGetActiveSubroutineName(program.Value, shadertype, index, checked((int)name.Length), lengthPtr, namePtr);
}
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetActiveSubroutineUniformName(GlHandle program, uint shadertype, uint index, out int length, Span<byte> name)
{
length = default;
fixed (int* lengthPtr = &length)
{
fixed (byte* namePtr = name)
{
Context.glGetActiveSubroutineUniformName(program.Value, shadertype, index, checked((int)name.Length), lengthPtr, namePtr);
}
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetActiveSubroutineUniformiv(GlHandle program, uint shadertype, uint index, uint pname, Span<int> values)
{
fixed (int* valuesPtr = values)
{
Context.glGetActiveSubroutineUniformiv(program.Value, shadertype, index, pname, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetProgramStageiv(GlHandle program, uint shadertype, uint pname, out int values)
{
values = default;
fixed (int* valuesPtr = &values)
{
Context.glGetProgramStageiv(program.Value, shadertype, pname, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetQueryIndexediv(uint target, uint index, uint pname, Span<int> @params)
{
fixed (int* @paramsPtr = @params)
{
Context.glGetQueryIndexediv(target, index, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public uint GetSubroutineIndex(GlHandle program, uint shadertype, ReadOnlySpan<byte> name)
{
fixed (byte* namePtr = name)
{
return Context.glGetSubroutineIndex(program.Value, shadertype, namePtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int GetSubroutineUniformLocation(GlHandle program, uint shadertype, ReadOnlySpan<byte> name)
{
fixed (byte* namePtr = name)
{
return Context.glGetSubroutineUniformLocation(program.Value, shadertype, namePtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetUniformSubroutineuiv(uint shadertype, int location, out uint @params)
{
@params = default;
fixed (uint* @paramsPtr = &@params)
{
Context.glGetUniformSubroutineuiv(shadertype, location, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetUniform(GlHandle program, int location, Span<double> @params)
{
fixed (double* @paramsPtr = @params)
{
Context.glGetUniformdv(program.Value, location, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public byte IsTransformFeedback(uint id)
{
return Context.glIsTransformFeedback(id);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void MinSampleShading(float value)
{
Context.glMinSampleShading(value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PatchParameter(uint pname, ReadOnlySpan<float> values)
{
fixed (float* valuesPtr = values)
{
Context.glPatchParameterfv(pname, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PatchParameter(uint pname, int value)
{
Context.glPatchParameteri(pname, value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PauseTransformFeedback()
{
Context.glPauseTransformFeedback();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ResumeTransformFeedback()
{
Context.glResumeTransformFeedback();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void UniformSubroutinesuiv(uint shadertype, ReadOnlySpan<uint> indices)
{
fixed (uint* indicesPtr = indices)
{
Context.glUniformSubroutinesuiv(shadertype, checked((int)indices.Length), indicesPtr);
}
}
}
}
@@ -1,286 +0,0 @@
// <auto-generated>
// Generated by StgSharp.GenerateGL on 2026-08-25 09:22:55Z
// Version: 4.1
// </auto-generated>
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using StgSharp.Graphics.OpenGL;
namespace StgSharp.Graphics.OpenGL
{
public unsafe partial class OpenGLFunction
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ActiveShaderProgram(uint pipeline, GlHandle program)
{
Context.glActiveShaderProgram(pipeline, program.Value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BindProgramPipeline(uint pipeline)
{
Context.glBindProgramPipeline(pipeline);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ClearDepth(float d)
{
Context.glClearDepthf(d);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public GlHandle CreateShaderProgramv(uint type, int count, byte** strings)
{
return GlHandle.Create(Context.glCreateShaderProgramv(type, count, strings));
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DeleteProgramPipelines(ReadOnlySpan<uint> pipelines)
{
fixed (uint* pipelinesPtr = pipelines)
{
Context.glDeleteProgramPipelines(checked((int)pipelines.Length), pipelinesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DepthRangeArrayv(uint first, int count, ReadOnlySpan<double> v)
{
fixed (double* vPtr = v)
{
Context.glDepthRangeArrayv(first, count, vPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DepthRangeIndexed(uint index, double n, double f)
{
Context.glDepthRangeIndexed(index, n, f);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DepthRange(float n, float f)
{
Context.glDepthRangef(n, f);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GenProgramPipelines(Span<uint> pipelines)
{
fixed (uint* pipelinesPtr = pipelines)
{
Context.glGenProgramPipelines(checked((int)pipelines.Length), pipelinesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetDoublei_v(uint target, uint index, Span<double> data)
{
fixed (double* dataPtr = data)
{
Context.glGetDoublei_v(target, index, dataPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetFloati_v(uint target, uint index, Span<float> data)
{
fixed (float* dataPtr = data)
{
Context.glGetFloati_v(target, index, dataPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetProgramBinary(GlHandle program, int bufSize, out int length, out uint binaryFormat, void* binary)
{
length = default;
binaryFormat = default;
fixed (int* lengthPtr = &length)
{
fixed (uint* binaryFormatPtr = &binaryFormat)
{
Context.glGetProgramBinary(program.Value, bufSize, lengthPtr, binaryFormatPtr, binary);
}
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetProgramPipelineInfoLog(uint pipeline, out int length, Span<byte> infoLog)
{
length = default;
fixed (int* lengthPtr = &length)
{
fixed (byte* infoLogPtr = infoLog)
{
Context.glGetProgramPipelineInfoLog(pipeline, checked((int)infoLog.Length), lengthPtr, infoLogPtr);
}
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetProgramPipelineiv(uint pipeline, uint pname, Span<int> @params)
{
fixed (int* @paramsPtr = @params)
{
Context.glGetProgramPipelineiv(pipeline, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetShaderPrecisionFormat(uint shadertype, uint precisiontype, Span<int> range, out int precision)
{
precision = default;
if (range.Length < 2) {
throw new ArgumentException("Span is shorter than the OpenGL length expression '2'.", nameof(range));
}
fixed (int* rangePtr = range)
{
fixed (int* precisionPtr = &precision)
{
Context.glGetShaderPrecisionFormat(shadertype, precisiontype, rangePtr, precisionPtr);
}
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetVertexAttribLdv(uint index, uint pname, Span<double> @params)
{
fixed (double* @paramsPtr = @params)
{
Context.glGetVertexAttribLdv(index, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public byte IsProgramPipeline(uint pipeline)
{
return Context.glIsProgramPipeline(pipeline);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ProgramBinary(GlHandle program, uint binaryFormat, void* binary, int length)
{
Context.glProgramBinary(program.Value, binaryFormat, binary, length);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ProgramParameter(GlHandle program, uint pname, int value)
{
Context.glProgramParameteri(program.Value, pname, value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ReleaseShaderCompiler()
{
Context.glReleaseShaderCompiler();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ScissorArrayv(uint first, int count, ReadOnlySpan<int> v)
{
fixed (int* vPtr = v)
{
Context.glScissorArrayv(first, count, vPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ScissorIndexed(uint index, int left, int bottom, int width, int height)
{
Context.glScissorIndexed(index, left, bottom, width, height);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ScissorIndexed(uint index, ReadOnlySpan<int> v)
{
if (v.Length < 4) {
throw new ArgumentException("Span is shorter than the OpenGL length expression '4'.", nameof(v));
}
fixed (int* vPtr = v)
{
Context.glScissorIndexedv(index, vPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ShaderBinary(ReadOnlySpan<uint> shaders, uint binaryFormat, void* binary, int length)
{
fixed (uint* shadersPtr = shaders)
{
Context.glShaderBinary(checked((int)shaders.Length), shadersPtr, binaryFormat, binary, length);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void UseProgramStages(uint pipeline, uint stages, GlHandle program)
{
Context.glUseProgramStages(pipeline, stages, program.Value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ValidateProgramPipeline(uint pipeline)
{
Context.glValidateProgramPipeline(pipeline);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexAttribL(uint index, double x)
{
Context.glVertexAttribL1d(index, x);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexAttribL(uint index, double x, double y)
{
Context.glVertexAttribL2d(index, x, y);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexAttribL(uint index, double x, double y, double z)
{
Context.glVertexAttribL3d(index, x, y, z);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexAttribL(uint index, double x, double y, double z, double w)
{
Context.glVertexAttribL4d(index, x, y, z, w);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexAttribLPointer(uint index, int size, uint type, int stride, void* pointer)
{
Context.glVertexAttribLPointer(index, size, type, stride, pointer);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ViewportArrayv(uint first, int count, ReadOnlySpan<float> v)
{
fixed (float* vPtr = v)
{
Context.glViewportArrayv(first, count, vPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ViewportIndexed(uint index, float x, float y, float w, float h)
{
Context.glViewportIndexedf(index, x, y, w, h);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ViewportIndexed(uint index, ReadOnlySpan<float> v)
{
if (v.Length < 4) {
throw new ArgumentException("Span is shorter than the OpenGL length expression '4'.", nameof(v));
}
fixed (float* vPtr = v)
{
Context.glViewportIndexedfv(index, vPtr);
}
}
}
}
@@ -1,93 +0,0 @@
// <auto-generated>
// Generated by StgSharp.GenerateGL on 2026-08-25 09:22:55Z
// Version: 4.2
// </auto-generated>
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using StgSharp.Graphics.OpenGL;
namespace StgSharp.Graphics.OpenGL
{
public unsafe partial class OpenGLFunction
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BindImageTexture(uint unit, GlHandle texture, int level, byte layered, int layer, uint access, uint format)
{
Context.glBindImageTexture(unit, texture.Value, level, layered, layer, access, format);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DrawArraysInstancedBaseInstance(uint mode, int first, int count, int instancecount, uint baseinstance)
{
Context.glDrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DrawElementsInstancedBaseInstance(uint mode, int count, uint type, void* indices, int instancecount, uint baseinstance)
{
Context.glDrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DrawElementsInstancedBaseVertexBaseInstance(uint mode, int count, uint type, void* indices, int instancecount, int basevertex, uint baseinstance)
{
Context.glDrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DrawTransformFeedbackInstanced(uint mode, uint id, int instancecount)
{
Context.glDrawTransformFeedbackInstanced(mode, id, instancecount);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DrawTransformFeedbackStreamInstanced(uint mode, uint id, uint stream, int instancecount)
{
Context.glDrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetActiveAtomicCounterBufferiv(GlHandle program, GlHandle bufferIndex, uint pname, Span<int> @params)
{
fixed (int* @paramsPtr = @params)
{
Context.glGetActiveAtomicCounterBufferiv(program.Value, bufferIndex.Value, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetInternalformativ(uint target, uint internalformat, uint pname, Span<int> @params)
{
fixed (int* @paramsPtr = @params)
{
Context.glGetInternalformativ(target, internalformat, pname, checked((int)@params.Length), @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void MemoryBarrier(uint barriers)
{
Context.glMemoryBarrier(barriers);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TexStorage1D(uint target, int levels, uint internalformat, int width)
{
Context.glTexStorage1D(target, levels, internalformat, width);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TexStorage2D(uint target, int levels, uint internalformat, int width, int height)
{
Context.glTexStorage2D(target, levels, internalformat, width, height);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TexStorage3D(uint target, int levels, uint internalformat, int width, int height, int depth)
{
Context.glTexStorage3D(target, levels, internalformat, width, height, depth);
}
}
}
@@ -1,379 +0,0 @@
// <auto-generated>
// Generated by StgSharp.GenerateGL on 2026-08-25 09:22:55Z
// Version: 4.3
// </auto-generated>
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using StgSharp.Graphics.OpenGL;
namespace StgSharp.Graphics.OpenGL
{
public unsafe partial class OpenGLFunction
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BindVertexBuffer(uint bindingindex, GlHandle buffer, nint offset, int stride)
{
Context.glBindVertexBuffer(bindingindex, buffer.Value, offset, stride);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ClearBufferData(uint target, uint internalformat, uint format, uint type, void* data)
{
Context.glClearBufferData(target, internalformat, format, type, data);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ClearBufferSubData(uint target, uint internalformat, nint offset, nint size, uint format, uint type, void* data)
{
Context.glClearBufferSubData(target, internalformat, offset, size, format, type, data);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CopyImageSubData(uint srcName, uint srcTarget, int srcLevel, int srcX, int srcY, int srcZ, uint dstName, uint dstTarget, int dstLevel, int dstX, int dstY, int dstZ, int srcWidth, int srcHeight, int srcDepth)
{
Context.glCopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DebugMessageCallback(IntPtr callback, void* userParam)
{
Context.glDebugMessageCallback(callback, userParam);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DebugMessageControl(uint source, uint type, uint severity, ReadOnlySpan<uint> ids, byte enabled)
{
fixed (uint* idsPtr = ids)
{
Context.glDebugMessageControl(source, type, severity, checked((int)ids.Length), idsPtr, enabled);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DebugMessageInsert(uint source, uint type, uint id, uint severity, int length, ReadOnlySpan<byte> buf)
{
fixed (byte* bufPtr = buf)
{
Context.glDebugMessageInsert(source, type, id, severity, length, bufPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DispatchCompute(uint num_groups_x, uint num_groups_y, uint num_groups_z)
{
Context.glDispatchCompute(num_groups_x, num_groups_y, num_groups_z);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DispatchComputeIndirect(nint indirect)
{
Context.glDispatchComputeIndirect(indirect);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void FramebufferParameter(uint target, uint pname, int param)
{
Context.glFramebufferParameteri(target, pname, param);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public uint GetDebugMessageLog(Span<uint> sources, Span<uint> types, Span<uint> ids, Span<uint> severities, Span<int> lengths, Span<byte> messageLog)
{
if (types.Length != sources.Length) {
throw new ArgumentException("Span lengths controlled by count must match.", nameof(types));
}
if (ids.Length != sources.Length) {
throw new ArgumentException("Span lengths controlled by count must match.", nameof(ids));
}
if (severities.Length != sources.Length) {
throw new ArgumentException("Span lengths controlled by count must match.", nameof(severities));
}
if (lengths.Length != sources.Length) {
throw new ArgumentException("Span lengths controlled by count must match.", nameof(lengths));
}
fixed (uint* sourcesPtr = sources)
{
fixed (uint* typesPtr = types)
{
fixed (uint* idsPtr = ids)
{
fixed (uint* severitiesPtr = severities)
{
fixed (int* lengthsPtr = lengths)
{
fixed (byte* messageLogPtr = messageLog)
{
return Context.glGetDebugMessageLog(checked((uint)sources.Length), checked((int)messageLog.Length), sourcesPtr, typesPtr, idsPtr, severitiesPtr, lengthsPtr, messageLogPtr);
}
}
}
}
}
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetFramebufferParameteriv(uint target, uint pname, Span<int> @params)
{
fixed (int* @paramsPtr = @params)
{
Context.glGetFramebufferParameteriv(target, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetInternalformati64v(uint target, uint internalformat, uint pname, Span<long> @params)
{
fixed (long* @paramsPtr = @params)
{
Context.glGetInternalformati64v(target, internalformat, pname, checked((int)@params.Length), @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetObjectLabel(uint identifier, uint name, out int length, Span<byte> label)
{
length = default;
fixed (int* lengthPtr = &length)
{
fixed (byte* labelPtr = label)
{
Context.glGetObjectLabel(identifier, name, checked((int)label.Length), lengthPtr, labelPtr);
}
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetObjectPtrLabel(void* ptr, out int length, Span<byte> label)
{
length = default;
fixed (int* lengthPtr = &length)
{
fixed (byte* labelPtr = label)
{
Context.glGetObjectPtrLabel(ptr, checked((int)label.Length), lengthPtr, labelPtr);
}
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetPointerv(uint pname, void** @params)
{
Context.glGetPointerv(pname, @params);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetProgramInterfaceiv(GlHandle program, uint programInterface, uint pname, Span<int> @params)
{
fixed (int* @paramsPtr = @params)
{
Context.glGetProgramInterfaceiv(program.Value, programInterface, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public uint GetProgramResourceIndex(GlHandle program, uint programInterface, ReadOnlySpan<byte> name)
{
fixed (byte* namePtr = name)
{
return Context.glGetProgramResourceIndex(program.Value, programInterface, namePtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int GetProgramResourceLocation(GlHandle program, uint programInterface, ReadOnlySpan<byte> name)
{
fixed (byte* namePtr = name)
{
return Context.glGetProgramResourceLocation(program.Value, programInterface, namePtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int GetProgramResourceLocationIndex(GlHandle program, uint programInterface, ReadOnlySpan<byte> name)
{
fixed (byte* namePtr = name)
{
return Context.glGetProgramResourceLocationIndex(program.Value, programInterface, namePtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetProgramResourceName(GlHandle program, uint programInterface, uint index, out int length, Span<byte> name)
{
length = default;
fixed (int* lengthPtr = &length)
{
fixed (byte* namePtr = name)
{
Context.glGetProgramResourceName(program.Value, programInterface, index, checked((int)name.Length), lengthPtr, namePtr);
}
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetProgramResourceiv(GlHandle program, uint programInterface, uint index, ReadOnlySpan<uint> props, out int length, Span<int> @params)
{
length = default;
fixed (uint* propsPtr = props)
{
fixed (int* lengthPtr = &length)
{
fixed (int* @paramsPtr = @params)
{
Context.glGetProgramResourceiv(program.Value, programInterface, index, checked((int)props.Length), propsPtr, checked((int)@params.Length), lengthPtr, @paramsPtr);
}
}
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void InvalidateBufferData(GlHandle buffer)
{
Context.glInvalidateBufferData(buffer.Value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void InvalidateBufferSubData(GlHandle buffer, nint offset, nint length)
{
Context.glInvalidateBufferSubData(buffer.Value, offset, length);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void InvalidateFramebuffer(uint target, ReadOnlySpan<uint> attachments)
{
fixed (uint* attachmentsPtr = attachments)
{
Context.glInvalidateFramebuffer(target, checked((int)attachments.Length), attachmentsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void InvalidateSubFramebuffer(uint target, ReadOnlySpan<uint> attachments, int x, int y, int width, int height)
{
fixed (uint* attachmentsPtr = attachments)
{
Context.glInvalidateSubFramebuffer(target, checked((int)attachments.Length), attachmentsPtr, x, y, width, height);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void InvalidateTexImage(GlHandle texture, int level)
{
Context.glInvalidateTexImage(texture.Value, level);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void InvalidateTexSubImage(GlHandle texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth)
{
Context.glInvalidateTexSubImage(texture.Value, level, xoffset, yoffset, zoffset, width, height, depth);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void MultiDrawArraysIndirect(uint mode, void* indirect, int drawcount, int stride)
{
Context.glMultiDrawArraysIndirect(mode, indirect, drawcount, stride);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void MultiDrawElementsIndirect(uint mode, uint type, void* indirect, int drawcount, int stride)
{
Context.glMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ObjectLabel(uint identifier, uint name, int length, ReadOnlySpan<byte> label)
{
fixed (byte* labelPtr = label)
{
Context.glObjectLabel(identifier, name, length, labelPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ObjectPtrLabel(void* ptr, int length, ReadOnlySpan<byte> label)
{
fixed (byte* labelPtr = label)
{
Context.glObjectPtrLabel(ptr, length, labelPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PopDebugGroup()
{
Context.glPopDebugGroup();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PushDebugGroup(uint source, uint id, int length, ReadOnlySpan<byte> message)
{
fixed (byte* messagePtr = message)
{
Context.glPushDebugGroup(source, id, length, messagePtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ShaderStorageBlockBinding(GlHandle program, uint storageBlockIndex, uint storageBlockBinding)
{
Context.glShaderStorageBlockBinding(program.Value, storageBlockIndex, storageBlockBinding);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TexBufferRange(uint target, uint internalformat, GlHandle buffer, nint offset, nint size)
{
Context.glTexBufferRange(target, internalformat, buffer.Value, offset, size);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TexStorage2DMultisample(uint target, int samples, uint internalformat, int width, int height, byte fixedsamplelocations)
{
Context.glTexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TexStorage3DMultisample(uint target, int samples, uint internalformat, int width, int height, int depth, byte fixedsamplelocations)
{
Context.glTexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureView(GlHandle texture, uint target, GlHandle origtexture, uint internalformat, uint minlevel, uint numlevels, uint minlayer, uint numlayers)
{
Context.glTextureView(texture.Value, target, origtexture.Value, internalformat, minlevel, numlevels, minlayer, numlayers);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexAttribBinding(uint attribindex, uint bindingindex)
{
Context.glVertexAttribBinding(attribindex, bindingindex);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexAttribFormat(uint attribindex, int size, uint type, byte normalized, uint relativeoffset)
{
Context.glVertexAttribFormat(attribindex, size, type, normalized, relativeoffset);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexAttribIFormat(uint attribindex, int size, uint type, uint relativeoffset)
{
Context.glVertexAttribIFormat(attribindex, size, type, relativeoffset);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexAttribLFormat(uint attribindex, int size, uint type, uint relativeoffset)
{
Context.glVertexAttribLFormat(attribindex, size, type, relativeoffset);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexBindingDivisor(uint bindingindex, uint divisor)
{
Context.glVertexBindingDivisor(bindingindex, divisor);
}
}
}
@@ -1,111 +0,0 @@
// <auto-generated>
// Generated by StgSharp.GenerateGL on 2026-08-25 09:22:55Z
// Version: 4.4
// </auto-generated>
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using StgSharp.Graphics.OpenGL;
namespace StgSharp.Graphics.OpenGL
{
public unsafe partial class OpenGLFunction
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BindBuffersBase(uint target, uint first, ReadOnlySpan<uint> buffers)
{
fixed (uint* buffersPtr = buffers)
{
Context.glBindBuffersBase(target, first, checked((int)buffers.Length), buffersPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BindBuffersRange(uint target, uint first, ReadOnlySpan<uint> buffers, ReadOnlySpan<nint> offsets, ReadOnlySpan<nint> sizes)
{
if (offsets.Length != buffers.Length) {
throw new ArgumentException("Span lengths controlled by count must match.", nameof(offsets));
}
if (sizes.Length != buffers.Length) {
throw new ArgumentException("Span lengths controlled by count must match.", nameof(sizes));
}
fixed (uint* buffersPtr = buffers)
{
fixed (nint* offsetsPtr = offsets)
{
fixed (nint* sizesPtr = sizes)
{
Context.glBindBuffersRange(target, first, checked((int)buffers.Length), buffersPtr, offsetsPtr, sizesPtr);
}
}
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BindImageTextures(uint first, ReadOnlySpan<uint> textures)
{
fixed (uint* texturesPtr = textures)
{
Context.glBindImageTextures(first, checked((int)textures.Length), texturesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BindSamplers(uint first, ReadOnlySpan<uint> samplers)
{
fixed (uint* samplersPtr = samplers)
{
Context.glBindSamplers(first, checked((int)samplers.Length), samplersPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BindTextures(uint first, ReadOnlySpan<uint> textures)
{
fixed (uint* texturesPtr = textures)
{
Context.glBindTextures(first, checked((int)textures.Length), texturesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BindVertexBuffers(uint first, ReadOnlySpan<uint> buffers, ReadOnlySpan<nint> offsets, ReadOnlySpan<int> strides)
{
if (offsets.Length != buffers.Length) {
throw new ArgumentException("Span lengths controlled by count must match.", nameof(offsets));
}
if (strides.Length != buffers.Length) {
throw new ArgumentException("Span lengths controlled by count must match.", nameof(strides));
}
fixed (uint* buffersPtr = buffers)
{
fixed (nint* offsetsPtr = offsets)
{
fixed (int* stridesPtr = strides)
{
Context.glBindVertexBuffers(first, checked((int)buffers.Length), buffersPtr, offsetsPtr, stridesPtr);
}
}
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BufferStorage(uint target, nint size, void* data, uint flags)
{
Context.glBufferStorage(target, size, data, flags);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ClearTexImage(GlHandle texture, int level, uint format, uint type, void* data)
{
Context.glClearTexImage(texture.Value, level, format, type, data);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ClearTexSubImage(GlHandle texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, uint format, uint type, void* data)
{
Context.glClearTexSubImage(texture.Value, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);
}
}
}
@@ -1,822 +0,0 @@
// <auto-generated>
// Generated by StgSharp.GenerateGL on 2026-08-25 09:22:55Z
// Version: 4.5
// </auto-generated>
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using StgSharp.Graphics.OpenGL;
namespace StgSharp.Graphics.OpenGL
{
public unsafe partial class OpenGLFunction
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BindTextureUnit(uint unit, GlHandle texture)
{
Context.glBindTextureUnit(unit, texture.Value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void BlitNamedFramebuffer(GlHandle readFramebuffer, GlHandle drawFramebuffer, int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, uint mask, uint filter)
{
Context.glBlitNamedFramebuffer(readFramebuffer.Value, drawFramebuffer.Value, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public uint CheckNamedFramebufferStatus(GlHandle framebuffer, uint target)
{
return Context.glCheckNamedFramebufferStatus(framebuffer.Value, target);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ClearNamedBufferData(GlHandle buffer, uint internalformat, uint format, uint type, void* data)
{
Context.glClearNamedBufferData(buffer.Value, internalformat, format, type, data);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ClearNamedBufferSubData(GlHandle buffer, uint internalformat, nint offset, nint size, uint format, uint type, void* data)
{
Context.glClearNamedBufferSubData(buffer.Value, internalformat, offset, size, format, type, data);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ClearNamedFramebuffer(GlHandle framebuffer, uint buffer, int drawbuffer, float depth, int stencil)
{
Context.glClearNamedFramebufferfi(framebuffer.Value, buffer, drawbuffer, depth, stencil);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ClearNamedFramebuffer(GlHandle framebuffer, uint buffer, int drawbuffer, ReadOnlySpan<float> value)
{
fixed (float* valuePtr = value)
{
Context.glClearNamedFramebufferfv(framebuffer.Value, buffer, drawbuffer, valuePtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ClearNamedFramebuffer(GlHandle framebuffer, uint buffer, int drawbuffer, ReadOnlySpan<int> value)
{
fixed (int* valuePtr = value)
{
Context.glClearNamedFramebufferiv(framebuffer.Value, buffer, drawbuffer, valuePtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ClearNamedFramebuffer(GlHandle framebuffer, uint buffer, int drawbuffer, ReadOnlySpan<uint> value)
{
fixed (uint* valuePtr = value)
{
Context.glClearNamedFramebufferuiv(framebuffer.Value, buffer, drawbuffer, valuePtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ClipControl(uint origin, uint depth)
{
Context.glClipControl(origin, depth);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CompressedTextureSubImage1D(GlHandle texture, int level, int xoffset, int width, uint format, int imageSize, void* data)
{
Context.glCompressedTextureSubImage1D(texture.Value, level, xoffset, width, format, imageSize, data);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CompressedTextureSubImage2D(GlHandle texture, int level, int xoffset, int yoffset, int width, int height, uint format, int imageSize, void* data)
{
Context.glCompressedTextureSubImage2D(texture.Value, level, xoffset, yoffset, width, height, format, imageSize, data);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CompressedTextureSubImage3D(GlHandle texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, uint format, int imageSize, void* data)
{
Context.glCompressedTextureSubImage3D(texture.Value, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CopyNamedBufferSubData(GlHandle readBuffer, GlHandle writeBuffer, nint readOffset, nint writeOffset, nint size)
{
Context.glCopyNamedBufferSubData(readBuffer.Value, writeBuffer.Value, readOffset, writeOffset, size);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CopyTextureSubImage1D(GlHandle texture, int level, int xoffset, int x, int y, int width)
{
Context.glCopyTextureSubImage1D(texture.Value, level, xoffset, x, y, width);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CopyTextureSubImage2D(GlHandle texture, int level, int xoffset, int yoffset, int x, int y, int width, int height)
{
Context.glCopyTextureSubImage2D(texture.Value, level, xoffset, yoffset, x, y, width, height);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CopyTextureSubImage3D(GlHandle texture, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height)
{
Context.glCopyTextureSubImage3D(texture.Value, level, xoffset, yoffset, zoffset, x, y, width, height);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CreateBuffers(Span<uint> buffers)
{
fixed (uint* buffersPtr = buffers)
{
Context.glCreateBuffers(checked((int)buffers.Length), buffersPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CreateFramebuffers(Span<uint> framebuffers)
{
fixed (uint* framebuffersPtr = framebuffers)
{
Context.glCreateFramebuffers(checked((int)framebuffers.Length), framebuffersPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CreateProgramPipelines(Span<uint> pipelines)
{
fixed (uint* pipelinesPtr = pipelines)
{
Context.glCreateProgramPipelines(checked((int)pipelines.Length), pipelinesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CreateQueries(uint target, Span<uint> ids)
{
fixed (uint* idsPtr = ids)
{
Context.glCreateQueries(target, checked((int)ids.Length), idsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CreateRenderbuffers(Span<uint> renderbuffers)
{
fixed (uint* renderbuffersPtr = renderbuffers)
{
Context.glCreateRenderbuffers(checked((int)renderbuffers.Length), renderbuffersPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CreateSamplers(Span<uint> samplers)
{
fixed (uint* samplersPtr = samplers)
{
Context.glCreateSamplers(checked((int)samplers.Length), samplersPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CreateTextures(uint target, Span<uint> textures)
{
fixed (uint* texturesPtr = textures)
{
Context.glCreateTextures(target, checked((int)textures.Length), texturesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CreateTransformFeedbacks(Span<uint> ids)
{
fixed (uint* idsPtr = ids)
{
Context.glCreateTransformFeedbacks(checked((int)ids.Length), idsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void CreateVertexArrays(Span<uint> arrays)
{
fixed (uint* arraysPtr = arrays)
{
Context.glCreateVertexArrays(checked((int)arrays.Length), arraysPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void DisableVertexArrayAttrib(uint vaobj, uint index)
{
Context.glDisableVertexArrayAttrib(vaobj, index);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void EnableVertexArrayAttrib(uint vaobj, uint index)
{
Context.glEnableVertexArrayAttrib(vaobj, index);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void FlushMappedNamedBufferRange(GlHandle buffer, nint offset, nint length)
{
Context.glFlushMappedNamedBufferRange(buffer.Value, offset, length);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GenerateTextureMipmap(GlHandle texture)
{
Context.glGenerateTextureMipmap(texture.Value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetCompressedTextureImage(GlHandle texture, int level, int bufSize, void* pixels)
{
Context.glGetCompressedTextureImage(texture.Value, level, bufSize, pixels);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetCompressedTextureSubImage(GlHandle texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int bufSize, void* pixels)
{
Context.glGetCompressedTextureSubImage(texture.Value, level, xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public uint GetGraphicsResetStatus()
{
return Context.glGetGraphicsResetStatus();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetNamedBufferParameter(GlHandle buffer, uint pname, Span<long> @params)
{
fixed (long* @paramsPtr = @params)
{
Context.glGetNamedBufferParameteri64v(buffer.Value, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetNamedBufferParameter(GlHandle buffer, uint pname, Span<int> @params)
{
fixed (int* @paramsPtr = @params)
{
Context.glGetNamedBufferParameteriv(buffer.Value, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetNamedBufferPointerv(GlHandle buffer, uint pname, void** @params)
{
Context.glGetNamedBufferPointerv(buffer.Value, pname, @params);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetNamedBufferSubData(GlHandle buffer, nint offset, nint size, void* data)
{
Context.glGetNamedBufferSubData(buffer.Value, offset, size, data);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetNamedFramebufferAttachmentParameteriv(GlHandle framebuffer, uint attachment, uint pname, Span<int> @params)
{
fixed (int* @paramsPtr = @params)
{
Context.glGetNamedFramebufferAttachmentParameteriv(framebuffer.Value, attachment, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetNamedFramebufferParameteriv(GlHandle framebuffer, uint pname, Span<int> param)
{
fixed (int* paramPtr = param)
{
Context.glGetNamedFramebufferParameteriv(framebuffer.Value, pname, paramPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetNamedRenderbufferParameteriv(GlHandle renderbuffer, uint pname, Span<int> @params)
{
fixed (int* @paramsPtr = @params)
{
Context.glGetNamedRenderbufferParameteriv(renderbuffer.Value, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetQueryBufferObject(uint id, GlHandle buffer, uint pname, nint offset)
{
Context.glGetQueryBufferObjecti64v(id, buffer.Value, pname, offset);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetQueryBufferObjectiv(uint id, GlHandle buffer, uint pname, nint offset)
{
Context.glGetQueryBufferObjectiv(id, buffer.Value, pname, offset);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetQueryBufferObjectui64v(uint id, GlHandle buffer, uint pname, nint offset)
{
Context.glGetQueryBufferObjectui64v(id, buffer.Value, pname, offset);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetQueryBufferObjectuiv(uint id, GlHandle buffer, uint pname, nint offset)
{
Context.glGetQueryBufferObjectuiv(id, buffer.Value, pname, offset);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetTextureImage(GlHandle texture, int level, uint format, uint type, int bufSize, void* pixels)
{
Context.glGetTextureImage(texture.Value, level, format, type, bufSize, pixels);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetTextureLevelParameter(GlHandle texture, int level, uint pname, Span<float> @params)
{
fixed (float* @paramsPtr = @params)
{
Context.glGetTextureLevelParameterfv(texture.Value, level, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetTextureLevelParameter(GlHandle texture, int level, uint pname, Span<int> @params)
{
fixed (int* @paramsPtr = @params)
{
Context.glGetTextureLevelParameteriv(texture.Value, level, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetTextureParameterI(GlHandle texture, uint pname, Span<int> @params)
{
fixed (int* @paramsPtr = @params)
{
Context.glGetTextureParameterIiv(texture.Value, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetTextureParameterI(GlHandle texture, uint pname, Span<uint> @params)
{
fixed (uint* @paramsPtr = @params)
{
Context.glGetTextureParameterIuiv(texture.Value, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetTextureParameter(GlHandle texture, uint pname, Span<float> @params)
{
fixed (float* @paramsPtr = @params)
{
Context.glGetTextureParameterfv(texture.Value, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetTextureParameter(GlHandle texture, uint pname, Span<int> @params)
{
fixed (int* @paramsPtr = @params)
{
Context.glGetTextureParameteriv(texture.Value, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetTextureSubImage(GlHandle texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, uint format, uint type, int bufSize, void* pixels)
{
Context.glGetTextureSubImage(texture.Value, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetTransformFeedbacki64_v(uint xfb, uint pname, uint index, Span<long> param)
{
fixed (long* paramPtr = param)
{
Context.glGetTransformFeedbacki64_v(xfb, pname, index, paramPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetTransformFeedbacki_v(uint xfb, uint pname, uint index, Span<int> param)
{
fixed (int* paramPtr = param)
{
Context.glGetTransformFeedbacki_v(xfb, pname, index, paramPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetTransformFeedbackiv(uint xfb, uint pname, Span<int> param)
{
fixed (int* paramPtr = param)
{
Context.glGetTransformFeedbackiv(xfb, pname, paramPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetVertexArrayIndexed64iv(uint vaobj, uint index, uint pname, Span<long> param)
{
fixed (long* paramPtr = param)
{
Context.glGetVertexArrayIndexed64iv(vaobj, index, pname, paramPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetVertexArrayIndexediv(uint vaobj, uint index, uint pname, Span<int> param)
{
fixed (int* paramPtr = param)
{
Context.glGetVertexArrayIndexediv(vaobj, index, pname, paramPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetVertexArrayiv(uint vaobj, uint pname, Span<int> param)
{
fixed (int* paramPtr = param)
{
Context.glGetVertexArrayiv(vaobj, pname, paramPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetnCompressedTexImage(uint target, int lod, int bufSize, void* pixels)
{
Context.glGetnCompressedTexImage(target, lod, bufSize, pixels);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetnTexImage(uint target, int level, uint format, uint type, int bufSize, void* pixels)
{
Context.glGetnTexImage(target, level, format, type, bufSize, pixels);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetnUniform(GlHandle program, int location, int bufSize, Span<double> @params)
{
if (@params.Length < checked((int)bufSize / 8)) {
throw new ArgumentException("Span is shorter than the OpenGL length expression 'bufSize / 8'.", nameof(@params));
}
fixed (double* @paramsPtr = @params)
{
Context.glGetnUniformdv(program.Value, location, bufSize, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetnUniform(GlHandle program, int location, int bufSize, Span<float> @params)
{
if (@params.Length < checked((int)bufSize / 4)) {
throw new ArgumentException("Span is shorter than the OpenGL length expression 'bufSize / 4'.", nameof(@params));
}
fixed (float* @paramsPtr = @params)
{
Context.glGetnUniformfv(program.Value, location, bufSize, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetnUniform(GlHandle program, int location, int bufSize, Span<int> @params)
{
if (@params.Length < checked((int)bufSize / 4)) {
throw new ArgumentException("Span is shorter than the OpenGL length expression 'bufSize / 4'.", nameof(@params));
}
fixed (int* @paramsPtr = @params)
{
Context.glGetnUniformiv(program.Value, location, bufSize, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void GetnUniform(GlHandle program, int location, int bufSize, Span<uint> @params)
{
if (@params.Length < checked((int)bufSize / 4)) {
throw new ArgumentException("Span is shorter than the OpenGL length expression 'bufSize / 4'.", nameof(@params));
}
fixed (uint* @paramsPtr = @params)
{
Context.glGetnUniformuiv(program.Value, location, bufSize, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void InvalidateNamedFramebufferData(GlHandle framebuffer, ReadOnlySpan<uint> attachments)
{
fixed (uint* attachmentsPtr = attachments)
{
Context.glInvalidateNamedFramebufferData(framebuffer.Value, checked((int)attachments.Length), attachmentsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void InvalidateNamedFramebufferSubData(GlHandle framebuffer, ReadOnlySpan<uint> attachments, int x, int y, int width, int height)
{
fixed (uint* attachmentsPtr = attachments)
{
Context.glInvalidateNamedFramebufferSubData(framebuffer.Value, checked((int)attachments.Length), attachmentsPtr, x, y, width, height);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void* MapNamedBuffer(GlHandle buffer, uint access)
{
return Context.glMapNamedBuffer(buffer.Value, access);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void* MapNamedBufferRange(GlHandle buffer, nint offset, nint length, uint access)
{
return Context.glMapNamedBufferRange(buffer.Value, offset, length, access);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void MemoryBarrierByRegion(uint barriers)
{
Context.glMemoryBarrierByRegion(barriers);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void NamedBufferData(GlHandle buffer, nint size, void* data, uint usage)
{
Context.glNamedBufferData(buffer.Value, size, data, usage);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void NamedBufferStorage(GlHandle buffer, nint size, void* data, uint flags)
{
Context.glNamedBufferStorage(buffer.Value, size, data, flags);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void NamedBufferSubData(GlHandle buffer, nint offset, nint size, void* data)
{
Context.glNamedBufferSubData(buffer.Value, offset, size, data);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void NamedFramebufferDrawBuffer(GlHandle framebuffer, uint buf)
{
Context.glNamedFramebufferDrawBuffer(framebuffer.Value, buf);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void NamedFramebufferDrawBuffers(GlHandle framebuffer, ReadOnlySpan<uint> bufs)
{
fixed (uint* bufsPtr = bufs)
{
Context.glNamedFramebufferDrawBuffers(framebuffer.Value, checked((int)bufs.Length), bufsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void NamedFramebufferParameter(GlHandle framebuffer, uint pname, int param)
{
Context.glNamedFramebufferParameteri(framebuffer.Value, pname, param);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void NamedFramebufferReadBuffer(GlHandle framebuffer, uint src)
{
Context.glNamedFramebufferReadBuffer(framebuffer.Value, src);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void NamedFramebufferRenderbuffer(GlHandle framebuffer, uint attachment, uint renderbuffertarget, GlHandle renderbuffer)
{
Context.glNamedFramebufferRenderbuffer(framebuffer.Value, attachment, renderbuffertarget, renderbuffer.Value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void NamedFramebufferTexture(GlHandle framebuffer, uint attachment, GlHandle texture, int level)
{
Context.glNamedFramebufferTexture(framebuffer.Value, attachment, texture.Value, level);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void NamedFramebufferTextureLayer(GlHandle framebuffer, uint attachment, GlHandle texture, int level, int layer)
{
Context.glNamedFramebufferTextureLayer(framebuffer.Value, attachment, texture.Value, level, layer);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void NamedRenderbufferStorage(GlHandle renderbuffer, uint internalformat, int width, int height)
{
Context.glNamedRenderbufferStorage(renderbuffer.Value, internalformat, width, height);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void NamedRenderbufferStorageMultisample(GlHandle renderbuffer, int samples, uint internalformat, int width, int height)
{
Context.glNamedRenderbufferStorageMultisample(renderbuffer.Value, samples, internalformat, width, height);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ReadnPixels(int x, int y, int width, int height, uint format, uint type, int bufSize, void* data)
{
Context.glReadnPixels(x, y, width, height, format, type, bufSize, data);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureBarrier()
{
Context.glTextureBarrier();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureBuffer(GlHandle texture, uint internalformat, GlHandle buffer)
{
Context.glTextureBuffer(texture.Value, internalformat, buffer.Value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureBufferRange(GlHandle texture, uint internalformat, GlHandle buffer, nint offset, nint size)
{
Context.glTextureBufferRange(texture.Value, internalformat, buffer.Value, offset, size);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureParameterI(GlHandle texture, uint pname, ReadOnlySpan<int> @params)
{
fixed (int* @paramsPtr = @params)
{
Context.glTextureParameterIiv(texture.Value, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureParameterI(GlHandle texture, uint pname, ReadOnlySpan<uint> @params)
{
fixed (uint* @paramsPtr = @params)
{
Context.glTextureParameterIuiv(texture.Value, pname, @paramsPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureParameter(GlHandle texture, uint pname, float param)
{
Context.glTextureParameterf(texture.Value, pname, param);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureParameter(GlHandle texture, uint pname, ReadOnlySpan<float> param)
{
fixed (float* paramPtr = param)
{
Context.glTextureParameterfv(texture.Value, pname, paramPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureParameter(GlHandle texture, uint pname, int param)
{
Context.glTextureParameteri(texture.Value, pname, param);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureParameter(GlHandle texture, uint pname, ReadOnlySpan<int> param)
{
fixed (int* paramPtr = param)
{
Context.glTextureParameteriv(texture.Value, pname, paramPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureStorage1D(GlHandle texture, int levels, uint internalformat, int width)
{
Context.glTextureStorage1D(texture.Value, levels, internalformat, width);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureStorage2D(GlHandle texture, int levels, uint internalformat, int width, int height)
{
Context.glTextureStorage2D(texture.Value, levels, internalformat, width, height);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureStorage2DMultisample(GlHandle texture, int samples, uint internalformat, int width, int height, byte fixedsamplelocations)
{
Context.glTextureStorage2DMultisample(texture.Value, samples, internalformat, width, height, fixedsamplelocations);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureStorage3D(GlHandle texture, int levels, uint internalformat, int width, int height, int depth)
{
Context.glTextureStorage3D(texture.Value, levels, internalformat, width, height, depth);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureStorage3DMultisample(GlHandle texture, int samples, uint internalformat, int width, int height, int depth, byte fixedsamplelocations)
{
Context.glTextureStorage3DMultisample(texture.Value, samples, internalformat, width, height, depth, fixedsamplelocations);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureSubImage1D(GlHandle texture, int level, int xoffset, int width, uint format, uint type, void* pixels)
{
Context.glTextureSubImage1D(texture.Value, level, xoffset, width, format, type, pixels);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureSubImage2D(GlHandle texture, int level, int xoffset, int yoffset, int width, int height, uint format, uint type, void* pixels)
{
Context.glTextureSubImage2D(texture.Value, level, xoffset, yoffset, width, height, format, type, pixels);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TextureSubImage3D(GlHandle texture, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, uint format, uint type, void* pixels)
{
Context.glTextureSubImage3D(texture.Value, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TransformFeedbackBufferBase(uint xfb, uint index, GlHandle buffer)
{
Context.glTransformFeedbackBufferBase(xfb, index, buffer.Value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void TransformFeedbackBufferRange(uint xfb, uint index, GlHandle buffer, nint offset, nint size)
{
Context.glTransformFeedbackBufferRange(xfb, index, buffer.Value, offset, size);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public byte UnmapNamedBuffer(GlHandle buffer)
{
return Context.glUnmapNamedBuffer(buffer.Value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexArrayAttribBinding(uint vaobj, uint attribindex, uint bindingindex)
{
Context.glVertexArrayAttribBinding(vaobj, attribindex, bindingindex);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexArrayAttribFormat(uint vaobj, uint attribindex, int size, uint type, byte normalized, uint relativeoffset)
{
Context.glVertexArrayAttribFormat(vaobj, attribindex, size, type, normalized, relativeoffset);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexArrayAttribIFormat(uint vaobj, uint attribindex, int size, uint type, uint relativeoffset)
{
Context.glVertexArrayAttribIFormat(vaobj, attribindex, size, type, relativeoffset);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexArrayAttribLFormat(uint vaobj, uint attribindex, int size, uint type, uint relativeoffset)
{
Context.glVertexArrayAttribLFormat(vaobj, attribindex, size, type, relativeoffset);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexArrayBindingDivisor(uint vaobj, uint bindingindex, uint divisor)
{
Context.glVertexArrayBindingDivisor(vaobj, bindingindex, divisor);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexArrayElementBuffer(uint vaobj, GlHandle buffer)
{
Context.glVertexArrayElementBuffer(vaobj, buffer.Value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexArrayVertexBuffer(uint vaobj, uint bindingindex, GlHandle buffer, nint offset, int stride)
{
Context.glVertexArrayVertexBuffer(vaobj, bindingindex, buffer.Value, offset, stride);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void VertexArrayVertexBuffers(uint vaobj, uint first, ReadOnlySpan<uint> buffers, ReadOnlySpan<nint> offsets, ReadOnlySpan<int> strides)
{
if (offsets.Length != buffers.Length) {
throw new ArgumentException("Span lengths controlled by count must match.", nameof(offsets));
}
if (strides.Length != buffers.Length) {
throw new ArgumentException("Span lengths controlled by count must match.", nameof(strides));
}
fixed (uint* buffersPtr = buffers)
{
fixed (nint* offsetsPtr = offsets)
{
fixed (int* stridesPtr = strides)
{
Context.glVertexArrayVertexBuffers(vaobj, first, checked((int)buffers.Length), buffersPtr, offsetsPtr, stridesPtr);
}
}
}
}
}
}
@@ -1,51 +0,0 @@
// <auto-generated>
// Generated by StgSharp.GenerateGL on 2026-08-25 09:22:55Z
// Version: 4.6
// </auto-generated>
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using StgSharp.Graphics.OpenGL;
namespace StgSharp.Graphics.OpenGL
{
public unsafe partial class OpenGLFunction
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void MultiDrawArraysIndirectCount(uint mode, void* indirect, nint drawcount, int maxdrawcount, int stride)
{
Context.glMultiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount, stride);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void MultiDrawElementsIndirectCount(uint mode, uint type, void* indirect, nint drawcount, int maxdrawcount, int stride)
{
Context.glMultiDrawElementsIndirectCount(mode, type, indirect, drawcount, maxdrawcount, stride);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PolygonOffsetClamp(float factor, float units, float clamp)
{
Context.glPolygonOffsetClamp(factor, units, clamp);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SpecializeShader(GlHandle shader, ReadOnlySpan<byte> pEntryPoint, ReadOnlySpan<uint> pConstantIndex, ReadOnlySpan<uint> pConstantValue)
{
if (pConstantValue.Length != pConstantIndex.Length) {
throw new ArgumentException("Span lengths controlled by numSpecializationConstants must match.", nameof(pConstantValue));
}
fixed (byte* pEntryPointPtr = pEntryPoint)
{
fixed (uint* pConstantIndexPtr = pConstantIndex)
{
fixed (uint* pConstantValuePtr = pConstantValue)
{
Context.glSpecializeShader(shader.Value, pEntryPointPtr, checked((uint)pConstantIndex.Length), pConstantIndexPtr, pConstantValuePtr);
}
}
}
}
}
}
@@ -1,261 +0,0 @@
// <auto-generated>
// Generated by StgSharp.GenerateGL on 2026-08-25 09:22:55Z
// Uniform overloads introduced in OpenGL 3.3
// </auto-generated>
using System;
using System.Runtime.CompilerServices;
using StgSharp.Mathematics.Graphics;
namespace StgSharp.Graphics.OpenGL
{
public unsafe partial class OpenGLFunction
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<float> uniform, float v0)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform1f(uniform.id.SignedValue, v0);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<float> uniform, ReadOnlySpan<float> values)
{
ArgumentNullException.ThrowIfNull(uniform);
fixed (float* valuesPtr = values) {
Context.glUniform1fv(uniform.id.SignedValue, values.Length, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<int> uniform, int v0)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform1i(uniform.id.SignedValue, v0);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<int> uniform, ReadOnlySpan<int> values)
{
ArgumentNullException.ThrowIfNull(uniform);
fixed (int* valuesPtr = values) {
Context.glUniform1iv(uniform.id.SignedValue, values.Length, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<uint> uniform, uint v0)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform1ui(uniform.id.SignedValue, v0);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<uint> uniform, ReadOnlySpan<uint> values)
{
ArgumentNullException.ThrowIfNull(uniform);
fixed (uint* valuesPtr = values) {
Context.glUniform1uiv(uniform.id.SignedValue, values.Length, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<float, float> uniform, float v0, float v1)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform2f(uniform.id.SignedValue, v0, v1);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<float, float> uniform, ReadOnlySpan<float> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 2) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 2.", nameof(values));
}
fixed (float* valuesPtr = values) {
Context.glUniform2fv(uniform.id.SignedValue, values.Length / 2, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<int, int> uniform, int v0, int v1)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform2i(uniform.id.SignedValue, v0, v1);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<int, int> uniform, ReadOnlySpan<int> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 2) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 2.", nameof(values));
}
fixed (int* valuesPtr = values) {
Context.glUniform2iv(uniform.id.SignedValue, values.Length / 2, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<uint, uint> uniform, uint v0, uint v1)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform2ui(uniform.id.SignedValue, v0, v1);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<uint, uint> uniform, ReadOnlySpan<uint> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 2) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 2.", nameof(values));
}
fixed (uint* valuesPtr = values) {
Context.glUniform2uiv(uniform.id.SignedValue, values.Length / 2, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<float, float, float> uniform, float v0, float v1, float v2)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform3f(uniform.id.SignedValue, v0, v1, v2);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<float, float, float> uniform, ReadOnlySpan<float> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 3) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 3.", nameof(values));
}
fixed (float* valuesPtr = values) {
Context.glUniform3fv(uniform.id.SignedValue, values.Length / 3, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<int, int, int> uniform, int v0, int v1, int v2)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform3i(uniform.id.SignedValue, v0, v1, v2);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<int, int, int> uniform, ReadOnlySpan<int> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 3) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 3.", nameof(values));
}
fixed (int* valuesPtr = values) {
Context.glUniform3iv(uniform.id.SignedValue, values.Length / 3, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<uint, uint, uint> uniform, uint v0, uint v1, uint v2)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform3ui(uniform.id.SignedValue, v0, v1, v2);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<uint, uint, uint> uniform, ReadOnlySpan<uint> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 3) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 3.", nameof(values));
}
fixed (uint* valuesPtr = values) {
Context.glUniform3uiv(uniform.id.SignedValue, values.Length / 3, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<float, float, float, float> uniform, float v0, float v1, float v2, float v3)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform4f(uniform.id.SignedValue, v0, v1, v2, v3);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<float, float, float, float> uniform, ReadOnlySpan<float> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 4) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 4.", nameof(values));
}
fixed (float* valuesPtr = values) {
Context.glUniform4fv(uniform.id.SignedValue, values.Length / 4, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<int, int, int, int> uniform, int v0, int v1, int v2, int v3)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform4i(uniform.id.SignedValue, v0, v1, v2, v3);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<int, int, int, int> uniform, ReadOnlySpan<int> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 4) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 4.", nameof(values));
}
fixed (int* valuesPtr = values) {
Context.glUniform4iv(uniform.id.SignedValue, values.Length / 4, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<uint, uint, uint, uint> uniform, uint v0, uint v1, uint v2, uint v3)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform4ui(uniform.id.SignedValue, v0, v1, v2, v3);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<uint, uint, uint, uint> uniform, ReadOnlySpan<uint> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 4) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 4.", nameof(values));
}
fixed (uint* valuesPtr = values) {
Context.glUniform4uiv(uniform.id.SignedValue, values.Length / 4, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<Vec2> uniform, Vec2 value)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform2fv(uniform.id.SignedValue, 1, (float*)&value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<Vec3> uniform, Vec3 value)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform3fv(uniform.id.SignedValue, 1, (float*)&value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<Vec4> uniform, Vec4 value)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform4fv(uniform.id.SignedValue, 1, (float*)&value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<GraphicsMatrix> uniform, GraphicsMatrix value, bool transpose = false)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniformMatrix4fv(uniform.id.SignedValue, 1, transpose ? (byte)1 : (byte)0, (float*)&value);
}
}
}
@@ -1,87 +0,0 @@
// <auto-generated>
// Generated by StgSharp.GenerateGL on 2026-08-25 09:22:55Z
// Uniform overloads introduced in OpenGL 4.0
// </auto-generated>
using System;
using System.Runtime.CompilerServices;
using StgSharp.Mathematics.Graphics;
namespace StgSharp.Graphics.OpenGL
{
public unsafe partial class OpenGLFunction
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<double> uniform, double v0)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform1d(uniform.id.SignedValue, v0);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<double> uniform, ReadOnlySpan<double> values)
{
ArgumentNullException.ThrowIfNull(uniform);
fixed (double* valuesPtr = values) {
Context.glUniform1dv(uniform.id.SignedValue, values.Length, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<double, double> uniform, double v0, double v1)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform2d(uniform.id.SignedValue, v0, v1);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<double, double> uniform, ReadOnlySpan<double> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 2) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 2.", nameof(values));
}
fixed (double* valuesPtr = values) {
Context.glUniform2dv(uniform.id.SignedValue, values.Length / 2, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<double, double, double> uniform, double v0, double v1, double v2)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform3d(uniform.id.SignedValue, v0, v1, v2);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<double, double, double> uniform, ReadOnlySpan<double> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 3) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 3.", nameof(values));
}
fixed (double* valuesPtr = values) {
Context.glUniform3dv(uniform.id.SignedValue, values.Length / 3, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<double, double, double, double> uniform, double v0, double v1, double v2, double v3)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glUniform4d(uniform.id.SignedValue, v0, v1, v2, v3);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(Uniform<double, double, double, double> uniform, ReadOnlySpan<double> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 4) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 4.", nameof(values));
}
fixed (double* valuesPtr = values) {
Context.glUniform4dv(uniform.id.SignedValue, values.Length / 4, valuesPtr);
}
}
}
}
@@ -1,334 +0,0 @@
// <auto-generated>
// Generated by StgSharp.GenerateGL on 2026-08-25 09:22:55Z
// Uniform overloads introduced in OpenGL 4.1
// </auto-generated>
using System;
using System.Runtime.CompilerServices;
using StgSharp.Mathematics.Graphics;
namespace StgSharp.Graphics.OpenGL
{
public unsafe partial class OpenGLFunction
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<double> uniform, double v0)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform1d(program.Value, uniform.id.SignedValue, v0);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<double> uniform, ReadOnlySpan<double> values)
{
ArgumentNullException.ThrowIfNull(uniform);
fixed (double* valuesPtr = values) {
Context.glProgramUniform1dv(program.Value, uniform.id.SignedValue, values.Length, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<float> uniform, float v0)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform1f(program.Value, uniform.id.SignedValue, v0);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<float> uniform, ReadOnlySpan<float> values)
{
ArgumentNullException.ThrowIfNull(uniform);
fixed (float* valuesPtr = values) {
Context.glProgramUniform1fv(program.Value, uniform.id.SignedValue, values.Length, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<int> uniform, int v0)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform1i(program.Value, uniform.id.SignedValue, v0);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<int> uniform, ReadOnlySpan<int> values)
{
ArgumentNullException.ThrowIfNull(uniform);
fixed (int* valuesPtr = values) {
Context.glProgramUniform1iv(program.Value, uniform.id.SignedValue, values.Length, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<uint> uniform, uint v0)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform1ui(program.Value, uniform.id.SignedValue, v0);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<uint> uniform, ReadOnlySpan<uint> values)
{
ArgumentNullException.ThrowIfNull(uniform);
fixed (uint* valuesPtr = values) {
Context.glProgramUniform1uiv(program.Value, uniform.id.SignedValue, values.Length, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<double, double> uniform, double v0, double v1)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform2d(program.Value, uniform.id.SignedValue, v0, v1);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<double, double> uniform, ReadOnlySpan<double> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 2) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 2.", nameof(values));
}
fixed (double* valuesPtr = values) {
Context.glProgramUniform2dv(program.Value, uniform.id.SignedValue, values.Length / 2, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<float, float> uniform, float v0, float v1)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform2f(program.Value, uniform.id.SignedValue, v0, v1);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<float, float> uniform, ReadOnlySpan<float> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 2) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 2.", nameof(values));
}
fixed (float* valuesPtr = values) {
Context.glProgramUniform2fv(program.Value, uniform.id.SignedValue, values.Length / 2, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<int, int> uniform, int v0, int v1)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform2i(program.Value, uniform.id.SignedValue, v0, v1);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<int, int> uniform, ReadOnlySpan<int> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 2) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 2.", nameof(values));
}
fixed (int* valuesPtr = values) {
Context.glProgramUniform2iv(program.Value, uniform.id.SignedValue, values.Length / 2, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<uint, uint> uniform, uint v0, uint v1)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform2ui(program.Value, uniform.id.SignedValue, v0, v1);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<uint, uint> uniform, ReadOnlySpan<uint> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 2) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 2.", nameof(values));
}
fixed (uint* valuesPtr = values) {
Context.glProgramUniform2uiv(program.Value, uniform.id.SignedValue, values.Length / 2, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<double, double, double> uniform, double v0, double v1, double v2)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform3d(program.Value, uniform.id.SignedValue, v0, v1, v2);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<double, double, double> uniform, ReadOnlySpan<double> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 3) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 3.", nameof(values));
}
fixed (double* valuesPtr = values) {
Context.glProgramUniform3dv(program.Value, uniform.id.SignedValue, values.Length / 3, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<float, float, float> uniform, float v0, float v1, float v2)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform3f(program.Value, uniform.id.SignedValue, v0, v1, v2);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<float, float, float> uniform, ReadOnlySpan<float> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 3) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 3.", nameof(values));
}
fixed (float* valuesPtr = values) {
Context.glProgramUniform3fv(program.Value, uniform.id.SignedValue, values.Length / 3, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<int, int, int> uniform, int v0, int v1, int v2)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform3i(program.Value, uniform.id.SignedValue, v0, v1, v2);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<int, int, int> uniform, ReadOnlySpan<int> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 3) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 3.", nameof(values));
}
fixed (int* valuesPtr = values) {
Context.glProgramUniform3iv(program.Value, uniform.id.SignedValue, values.Length / 3, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<uint, uint, uint> uniform, uint v0, uint v1, uint v2)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform3ui(program.Value, uniform.id.SignedValue, v0, v1, v2);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<uint, uint, uint> uniform, ReadOnlySpan<uint> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 3) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 3.", nameof(values));
}
fixed (uint* valuesPtr = values) {
Context.glProgramUniform3uiv(program.Value, uniform.id.SignedValue, values.Length / 3, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<double, double, double, double> uniform, double v0, double v1, double v2, double v3)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform4d(program.Value, uniform.id.SignedValue, v0, v1, v2, v3);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<double, double, double, double> uniform, ReadOnlySpan<double> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 4) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 4.", nameof(values));
}
fixed (double* valuesPtr = values) {
Context.glProgramUniform4dv(program.Value, uniform.id.SignedValue, values.Length / 4, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<float, float, float, float> uniform, float v0, float v1, float v2, float v3)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform4f(program.Value, uniform.id.SignedValue, v0, v1, v2, v3);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<float, float, float, float> uniform, ReadOnlySpan<float> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 4) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 4.", nameof(values));
}
fixed (float* valuesPtr = values) {
Context.glProgramUniform4fv(program.Value, uniform.id.SignedValue, values.Length / 4, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<int, int, int, int> uniform, int v0, int v1, int v2, int v3)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform4i(program.Value, uniform.id.SignedValue, v0, v1, v2, v3);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<int, int, int, int> uniform, ReadOnlySpan<int> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 4) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 4.", nameof(values));
}
fixed (int* valuesPtr = values) {
Context.glProgramUniform4iv(program.Value, uniform.id.SignedValue, values.Length / 4, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<uint, uint, uint, uint> uniform, uint v0, uint v1, uint v2, uint v3)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform4ui(program.Value, uniform.id.SignedValue, v0, v1, v2, v3);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<uint, uint, uint, uint> uniform, ReadOnlySpan<uint> values)
{
ArgumentNullException.ThrowIfNull(uniform);
if ((values.Length % 4) != 0) {
throw new ArgumentException("Uniform data length must be divisible by 4.", nameof(values));
}
fixed (uint* valuesPtr = values) {
Context.glProgramUniform4uiv(program.Value, uniform.id.SignedValue, values.Length / 4, valuesPtr);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<Vec2> uniform, Vec2 value)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform2fv(program.Value, uniform.id.SignedValue, 1, (float*)&value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<Vec3> uniform, Vec3 value)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform3fv(program.Value, uniform.id.SignedValue, 1, (float*)&value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<Vec4> uniform, Vec4 value)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniform4fv(program.Value, uniform.id.SignedValue, 1, (float*)&value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetUniformValue(GlHandle program, Uniform<GraphicsMatrix> uniform, GraphicsMatrix value, bool transpose = false)
{
ArgumentNullException.ThrowIfNull(uniform);
Context.glProgramUniformMatrix4fv(program.Value, uniform.id.SignedValue, 1, transpose ? (byte)1 : (byte)0, (float*)&value);
}
}
}
@@ -1,670 +0,0 @@
// <auto-generated>
// Generated by StgSharp.GenerateGL on 2026-08-25 09:22:55Z
// Aggregated GL3+ commands
// </auto-generated>
using System;
using System.Runtime.CompilerServices;
namespace StgSharp.Graphics.OpenGL
{
public unsafe partial struct OpenglContext
{
internal unsafe delegate*<uint, uint, void> glActiveShaderProgram;
internal unsafe delegate*<uint, void> glActiveTexture;
internal unsafe delegate*<uint, uint, void> glAttachShader;
internal unsafe delegate*<uint, uint, void> glBeginConditionalRender;
internal unsafe delegate*<uint, uint, void> glBeginQuery;
internal unsafe delegate*<uint, uint, uint, void> glBeginQueryIndexed;
internal unsafe delegate*<uint, void> glBeginTransformFeedback;
internal unsafe delegate*<uint, uint, byte*, void> glBindAttribLocation;
internal unsafe delegate*<uint, uint, void> glBindBuffer;
internal unsafe delegate*<uint, uint, uint, void> glBindBufferBase;
internal unsafe delegate*<uint, uint, uint, nint, nint, void> glBindBufferRange;
internal unsafe delegate*<uint, uint, int, uint*, void> glBindBuffersBase;
internal unsafe delegate*<uint, uint, int, uint*, nint*, nint*, void> glBindBuffersRange;
internal unsafe delegate*<uint, uint, byte*, void> glBindFragDataLocation;
internal unsafe delegate*<uint, uint, uint, byte*, void> glBindFragDataLocationIndexed;
internal unsafe delegate*<uint, uint, void> glBindFramebuffer;
internal unsafe delegate*<uint, uint, int, byte, int, uint, uint, void> glBindImageTexture;
internal unsafe delegate*<uint, int, uint*, void> glBindImageTextures;
internal unsafe delegate*<uint, void> glBindProgramPipeline;
internal unsafe delegate*<uint, uint, void> glBindRenderbuffer;
internal unsafe delegate*<uint, uint, void> glBindSampler;
internal unsafe delegate*<uint, int, uint*, void> glBindSamplers;
internal unsafe delegate*<uint, uint, void> glBindTexture;
internal unsafe delegate*<uint, uint, void> glBindTextureUnit;
internal unsafe delegate*<uint, int, uint*, void> glBindTextures;
internal unsafe delegate*<uint, uint, void> glBindTransformFeedback;
internal unsafe delegate*<uint, void> glBindVertexArray;
internal unsafe delegate*<uint, uint, nint, int, void> glBindVertexBuffer;
internal unsafe delegate*<uint, int, uint*, nint*, int*, void> glBindVertexBuffers;
internal unsafe delegate*<float, float, float, float, void> glBlendColor;
internal unsafe delegate*<uint, void> glBlendEquation;
internal unsafe delegate*<uint, uint, void> glBlendEquationSeparate;
internal unsafe delegate*<uint, uint, uint, void> glBlendEquationSeparatei;
internal unsafe delegate*<uint, uint, void> glBlendEquationi;
internal unsafe delegate*<uint, uint, void> glBlendFunc;
internal unsafe delegate*<uint, uint, uint, uint, void> glBlendFuncSeparate;
internal unsafe delegate*<uint, uint, uint, uint, uint, void> glBlendFuncSeparatei;
internal unsafe delegate*<uint, uint, uint, void> glBlendFunci;
internal unsafe delegate*<int, int, int, int, int, int, int, int, uint, uint, void> glBlitFramebuffer;
internal unsafe delegate*<uint, uint, int, int, int, int, int, int, int, int, uint, uint, void> glBlitNamedFramebuffer;
internal unsafe delegate*<uint, nint, void*, uint, void> glBufferData;
internal unsafe delegate*<uint, nint, void*, uint, void> glBufferStorage;
internal unsafe delegate*<uint, nint, nint, void*, void> glBufferSubData;
internal unsafe delegate*<uint, uint> glCheckFramebufferStatus;
internal unsafe delegate*<uint, uint, uint> glCheckNamedFramebufferStatus;
internal unsafe delegate*<uint, uint, void> glClampColor;
internal unsafe delegate*<uint, void> glClear;
internal unsafe delegate*<uint, uint, uint, uint, void*, void> glClearBufferData;
internal unsafe delegate*<uint, uint, nint, nint, uint, uint, void*, void> glClearBufferSubData;
internal unsafe delegate*<uint, int, float, int, void> glClearBufferfi;
internal unsafe delegate*<uint, int, float*, void> glClearBufferfv;
internal unsafe delegate*<uint, int, int*, void> glClearBufferiv;
internal unsafe delegate*<uint, int, uint*, void> glClearBufferuiv;
internal unsafe delegate*<float, float, float, float, void> glClearColor;
internal unsafe delegate*<double, void> glClearDepth;
internal unsafe delegate*<float, void> glClearDepthf;
internal unsafe delegate*<uint, uint, uint, uint, void*, void> glClearNamedBufferData;
internal unsafe delegate*<uint, uint, nint, nint, uint, uint, void*, void> glClearNamedBufferSubData;
internal unsafe delegate*<uint, uint, int, float, int, void> glClearNamedFramebufferfi;
internal unsafe delegate*<uint, uint, int, float*, void> glClearNamedFramebufferfv;
internal unsafe delegate*<uint, uint, int, int*, void> glClearNamedFramebufferiv;
internal unsafe delegate*<uint, uint, int, uint*, void> glClearNamedFramebufferuiv;
internal unsafe delegate*<int, void> glClearStencil;
internal unsafe delegate*<uint, int, uint, uint, void*, void> glClearTexImage;
internal unsafe delegate*<uint, int, int, int, int, int, int, int, uint, uint, void*, void> glClearTexSubImage;
internal unsafe delegate*<glSync, uint, ulong, uint> glClientWaitSync;
internal unsafe delegate*<uint, uint, void> glClipControl;
internal unsafe delegate*<byte, byte, byte, byte, void> glColorMask;
internal unsafe delegate*<uint, byte, byte, byte, byte, void> glColorMaski;
internal unsafe delegate*<uint, void> glCompileShader;
internal unsafe delegate*<uint, int, uint, int, int, int, void*, void> glCompressedTexImage1D;
internal unsafe delegate*<uint, int, uint, int, int, int, int, void*, void> glCompressedTexImage2D;
internal unsafe delegate*<uint, int, uint, int, int, int, int, int, void*, void> glCompressedTexImage3D;
internal unsafe delegate*<uint, int, int, int, uint, int, void*, void> glCompressedTexSubImage1D;
internal unsafe delegate*<uint, int, int, int, int, int, uint, int, void*, void> glCompressedTexSubImage2D;
internal unsafe delegate*<uint, int, int, int, int, int, int, int, uint, int, void*, void> glCompressedTexSubImage3D;
internal unsafe delegate*<uint, int, int, int, uint, int, void*, void> glCompressedTextureSubImage1D;
internal unsafe delegate*<uint, int, int, int, int, int, uint, int, void*, void> glCompressedTextureSubImage2D;
internal unsafe delegate*<uint, int, int, int, int, int, int, int, uint, int, void*, void> glCompressedTextureSubImage3D;
internal unsafe delegate*<uint, uint, nint, nint, nint, void> glCopyBufferSubData;
internal unsafe delegate*<uint, uint, int, int, int, int, uint, uint, int, int, int, int, int, int, int, void> glCopyImageSubData;
internal unsafe delegate*<uint, uint, nint, nint, nint, void> glCopyNamedBufferSubData;
internal unsafe delegate*<uint, int, uint, int, int, int, int, void> glCopyTexImage1D;
internal unsafe delegate*<uint, int, uint, int, int, int, int, int, void> glCopyTexImage2D;
internal unsafe delegate*<uint, int, int, int, int, int, void> glCopyTexSubImage1D;
internal unsafe delegate*<uint, int, int, int, int, int, int, int, void> glCopyTexSubImage2D;
internal unsafe delegate*<uint, int, int, int, int, int, int, int, int, void> glCopyTexSubImage3D;
internal unsafe delegate*<uint, int, int, int, int, int, void> glCopyTextureSubImage1D;
internal unsafe delegate*<uint, int, int, int, int, int, int, int, void> glCopyTextureSubImage2D;
internal unsafe delegate*<uint, int, int, int, int, int, int, int, int, void> glCopyTextureSubImage3D;
internal unsafe delegate*<int, uint*, void> glCreateBuffers;
internal unsafe delegate*<int, uint*, void> glCreateFramebuffers;
internal unsafe delegate*<uint> glCreateProgram;
internal unsafe delegate*<int, uint*, void> glCreateProgramPipelines;
internal unsafe delegate*<uint, int, uint*, void> glCreateQueries;
internal unsafe delegate*<int, uint*, void> glCreateRenderbuffers;
internal unsafe delegate*<int, uint*, void> glCreateSamplers;
internal unsafe delegate*<uint, uint> glCreateShader;
internal unsafe delegate*<uint, int, byte**, uint> glCreateShaderProgramv;
internal unsafe delegate*<uint, int, uint*, void> glCreateTextures;
internal unsafe delegate*<int, uint*, void> glCreateTransformFeedbacks;
internal unsafe delegate*<int, uint*, void> glCreateVertexArrays;
internal unsafe delegate*<uint, void> glCullFace;
internal unsafe delegate*<IntPtr, void*, void> glDebugMessageCallback;
internal unsafe delegate*<uint, uint, uint, int, uint*, byte, void> glDebugMessageControl;
internal unsafe delegate*<uint, uint, uint, uint, int, byte*, void> glDebugMessageInsert;
internal unsafe delegate*<int, uint*, void> glDeleteBuffers;
internal unsafe delegate*<int, uint*, void> glDeleteFramebuffers;
internal unsafe delegate*<uint, void> glDeleteProgram;
internal unsafe delegate*<int, uint*, void> glDeleteProgramPipelines;
internal unsafe delegate*<int, uint*, void> glDeleteQueries;
internal unsafe delegate*<int, uint*, void> glDeleteRenderbuffers;
internal unsafe delegate*<int, uint*, void> glDeleteSamplers;
internal unsafe delegate*<uint, void> glDeleteShader;
internal unsafe delegate*<glSync, void> glDeleteSync;
internal unsafe delegate*<int, uint*, void> glDeleteTextures;
internal unsafe delegate*<int, uint*, void> glDeleteTransformFeedbacks;
internal unsafe delegate*<int, uint*, void> glDeleteVertexArrays;
internal unsafe delegate*<uint, void> glDepthFunc;
internal unsafe delegate*<byte, void> glDepthMask;
internal unsafe delegate*<double, double, void> glDepthRange;
internal unsafe delegate*<uint, int, double*, void> glDepthRangeArrayv;
internal unsafe delegate*<uint, double, double, void> glDepthRangeIndexed;
internal unsafe delegate*<float, float, void> glDepthRangef;
internal unsafe delegate*<uint, uint, void> glDetachShader;
internal unsafe delegate*<uint, void> glDisable;
internal unsafe delegate*<uint, uint, void> glDisableVertexArrayAttrib;
internal unsafe delegate*<uint, void> glDisableVertexAttribArray;
internal unsafe delegate*<uint, uint, void> glDisablei;
internal unsafe delegate*<uint, uint, uint, void> glDispatchCompute;
internal unsafe delegate*<nint, void> glDispatchComputeIndirect;
internal unsafe delegate*<uint, int, int, void> glDrawArrays;
internal unsafe delegate*<uint, void*, void> glDrawArraysIndirect;
internal unsafe delegate*<uint, int, int, int, void> glDrawArraysInstanced;
internal unsafe delegate*<uint, int, int, int, uint, void> glDrawArraysInstancedBaseInstance;
internal unsafe delegate*<uint, void> glDrawBuffer;
internal unsafe delegate*<int, uint*, void> glDrawBuffers;
internal unsafe delegate*<uint, int, uint, void*, void> glDrawElements;
internal unsafe delegate*<uint, int, uint, void*, int, void> glDrawElementsBaseVertex;
internal unsafe delegate*<uint, uint, void*, void> glDrawElementsIndirect;
internal unsafe delegate*<uint, int, uint, void*, int, void> glDrawElementsInstanced;
internal unsafe delegate*<uint, int, uint, void*, int, uint, void> glDrawElementsInstancedBaseInstance;
internal unsafe delegate*<uint, int, uint, void*, int, int, void> glDrawElementsInstancedBaseVertex;
internal unsafe delegate*<uint, int, uint, void*, int, int, uint, void> glDrawElementsInstancedBaseVertexBaseInstance;
internal unsafe delegate*<uint, uint, uint, int, uint, void*, void> glDrawRangeElements;
internal unsafe delegate*<uint, uint, uint, int, uint, void*, int, void> glDrawRangeElementsBaseVertex;
internal unsafe delegate*<uint, uint, void> glDrawTransformFeedback;
internal unsafe delegate*<uint, uint, int, void> glDrawTransformFeedbackInstanced;
internal unsafe delegate*<uint, uint, uint, void> glDrawTransformFeedbackStream;
internal unsafe delegate*<uint, uint, uint, int, void> glDrawTransformFeedbackStreamInstanced;
internal unsafe delegate*<uint, void> glEnable;
internal unsafe delegate*<uint, uint, void> glEnableVertexArrayAttrib;
internal unsafe delegate*<uint, void> glEnableVertexAttribArray;
internal unsafe delegate*<uint, uint, void> glEnablei;
internal unsafe delegate*<void> glEndConditionalRender;
internal unsafe delegate*<uint, void> glEndQuery;
internal unsafe delegate*<uint, uint, void> glEndQueryIndexed;
internal unsafe delegate*<void> glEndTransformFeedback;
internal unsafe delegate*<uint, uint, glSync> glFenceSync;
internal unsafe delegate*<void> glFinish;
internal unsafe delegate*<void> glFlush;
internal unsafe delegate*<uint, nint, nint, void> glFlushMappedBufferRange;
internal unsafe delegate*<uint, nint, nint, void> glFlushMappedNamedBufferRange;
internal unsafe delegate*<uint, uint, int, void> glFramebufferParameteri;
internal unsafe delegate*<uint, uint, uint, uint, void> glFramebufferRenderbuffer;
internal unsafe delegate*<uint, uint, uint, int, void> glFramebufferTexture;
internal unsafe delegate*<uint, uint, uint, uint, int, void> glFramebufferTexture1D;
internal unsafe delegate*<uint, uint, uint, uint, int, void> glFramebufferTexture2D;
internal unsafe delegate*<uint, uint, uint, uint, int, int, void> glFramebufferTexture3D;
internal unsafe delegate*<uint, uint, uint, int, int, void> glFramebufferTextureLayer;
internal unsafe delegate*<uint, void> glFrontFace;
internal unsafe delegate*<int, uint*, void> glGenBuffers;
internal unsafe delegate*<int, uint*, void> glGenFramebuffers;
internal unsafe delegate*<int, uint*, void> glGenProgramPipelines;
internal unsafe delegate*<int, uint*, void> glGenQueries;
internal unsafe delegate*<int, uint*, void> glGenRenderbuffers;
internal unsafe delegate*<int, uint*, void> glGenSamplers;
internal unsafe delegate*<int, uint*, void> glGenTextures;
internal unsafe delegate*<int, uint*, void> glGenTransformFeedbacks;
internal unsafe delegate*<int, uint*, void> glGenVertexArrays;
internal unsafe delegate*<uint, void> glGenerateMipmap;
internal unsafe delegate*<uint, void> glGenerateTextureMipmap;
internal unsafe delegate*<uint, uint, uint, int*, void> glGetActiveAtomicCounterBufferiv;
internal unsafe delegate*<uint, uint, int, int*, int*, uint*, byte*, void> glGetActiveAttrib;
internal unsafe delegate*<uint, uint, uint, int, int*, byte*, void> glGetActiveSubroutineName;
internal unsafe delegate*<uint, uint, uint, int, int*, byte*, void> glGetActiveSubroutineUniformName;
internal unsafe delegate*<uint, uint, uint, uint, int*, void> glGetActiveSubroutineUniformiv;
internal unsafe delegate*<uint, uint, int, int*, int*, uint*, byte*, void> glGetActiveUniform;
internal unsafe delegate*<uint, uint, int, int*, byte*, void> glGetActiveUniformBlockName;
internal unsafe delegate*<uint, uint, uint, int*, void> glGetActiveUniformBlockiv;
internal unsafe delegate*<uint, uint, int, int*, byte*, void> glGetActiveUniformName;
internal unsafe delegate*<uint, int, uint*, uint, int*, void> glGetActiveUniformsiv;
internal unsafe delegate*<uint, int, int*, uint*, void> glGetAttachedShaders;
internal unsafe delegate*<uint, byte*, int> glGetAttribLocation;
internal unsafe delegate*<uint, uint, byte*, void> glGetBooleani_v;
internal unsafe delegate*<uint, byte*, void> glGetBooleanv;
internal unsafe delegate*<uint, uint, long*, void> glGetBufferParameteri64v;
internal unsafe delegate*<uint, uint, int*, void> glGetBufferParameteriv;
internal unsafe delegate*<uint, uint, void**, void> glGetBufferPointerv;
internal unsafe delegate*<uint, nint, nint, void*, void> glGetBufferSubData;
internal unsafe delegate*<uint, int, void*, void> glGetCompressedTexImage;
internal unsafe delegate*<uint, int, int, void*, void> glGetCompressedTextureImage;
internal unsafe delegate*<uint, int, int, int, int, int, int, int, int, void*, void> glGetCompressedTextureSubImage;
internal unsafe delegate*<uint, int, uint*, uint*, uint*, uint*, int*, byte*, uint> glGetDebugMessageLog;
internal unsafe delegate*<uint, uint, double*, void> glGetDoublei_v;
internal unsafe delegate*<uint, double*, void> glGetDoublev;
internal unsafe delegate*<uint> glGetError;
internal unsafe delegate*<uint, uint, float*, void> glGetFloati_v;
internal unsafe delegate*<uint, float*, void> glGetFloatv;
internal unsafe delegate*<uint, byte*, int> glGetFragDataIndex;
internal unsafe delegate*<uint, byte*, int> glGetFragDataLocation;
internal unsafe delegate*<uint, uint, uint, int*, void> glGetFramebufferAttachmentParameteriv;
internal unsafe delegate*<uint, uint, int*, void> glGetFramebufferParameteriv;
internal unsafe delegate*<uint> glGetGraphicsResetStatus;
internal unsafe delegate*<uint, uint, long*, void> glGetInteger64i_v;
internal unsafe delegate*<uint, long*, void> glGetInteger64v;
internal unsafe delegate*<uint, uint, int*, void> glGetIntegeri_v;
internal unsafe delegate*<uint, int*, void> glGetIntegerv;
internal unsafe delegate*<uint, uint, uint, int, long*, void> glGetInternalformati64v;
internal unsafe delegate*<uint, uint, uint, int, int*, void> glGetInternalformativ;
internal unsafe delegate*<uint, uint, float*, void> glGetMultisamplefv;
internal unsafe delegate*<uint, uint, long*, void> glGetNamedBufferParameteri64v;
internal unsafe delegate*<uint, uint, int*, void> glGetNamedBufferParameteriv;
internal unsafe delegate*<uint, uint, void**, void> glGetNamedBufferPointerv;
internal unsafe delegate*<uint, nint, nint, void*, void> glGetNamedBufferSubData;
internal unsafe delegate*<uint, uint, uint, int*, void> glGetNamedFramebufferAttachmentParameteriv;
internal unsafe delegate*<uint, uint, int*, void> glGetNamedFramebufferParameteriv;
internal unsafe delegate*<uint, uint, int*, void> glGetNamedRenderbufferParameteriv;
internal unsafe delegate*<uint, uint, int, int*, byte*, void> glGetObjectLabel;
internal unsafe delegate*<void*, int, int*, byte*, void> glGetObjectPtrLabel;
internal unsafe delegate*<uint, void**, void> glGetPointerv;
internal unsafe delegate*<uint, int, int*, uint*, void*, void> glGetProgramBinary;
internal unsafe delegate*<uint, int, int*, byte*, void> glGetProgramInfoLog;
internal unsafe delegate*<uint, uint, uint, int*, void> glGetProgramInterfaceiv;
internal unsafe delegate*<uint, int, int*, byte*, void> glGetProgramPipelineInfoLog;
internal unsafe delegate*<uint, uint, int*, void> glGetProgramPipelineiv;
internal unsafe delegate*<uint, uint, byte*, uint> glGetProgramResourceIndex;
internal unsafe delegate*<uint, uint, byte*, int> glGetProgramResourceLocation;
internal unsafe delegate*<uint, uint, byte*, int> glGetProgramResourceLocationIndex;
internal unsafe delegate*<uint, uint, uint, int, int*, byte*, void> glGetProgramResourceName;
internal unsafe delegate*<uint, uint, uint, int, uint*, int, int*, int*, void> glGetProgramResourceiv;
internal unsafe delegate*<uint, uint, uint, int*, void> glGetProgramStageiv;
internal unsafe delegate*<uint, uint, int*, void> glGetProgramiv;
internal unsafe delegate*<uint, uint, uint, nint, void> glGetQueryBufferObjecti64v;
internal unsafe delegate*<uint, uint, uint, nint, void> glGetQueryBufferObjectiv;
internal unsafe delegate*<uint, uint, uint, nint, void> glGetQueryBufferObjectui64v;
internal unsafe delegate*<uint, uint, uint, nint, void> glGetQueryBufferObjectuiv;
internal unsafe delegate*<uint, uint, uint, int*, void> glGetQueryIndexediv;
internal unsafe delegate*<uint, uint, long*, void> glGetQueryObjecti64v;
internal unsafe delegate*<uint, uint, int*, void> glGetQueryObjectiv;
internal unsafe delegate*<uint, uint, ulong*, void> glGetQueryObjectui64v;
internal unsafe delegate*<uint, uint, uint*, void> glGetQueryObjectuiv;
internal unsafe delegate*<uint, uint, int*, void> glGetQueryiv;
internal unsafe delegate*<uint, uint, int*, void> glGetRenderbufferParameteriv;
internal unsafe delegate*<uint, uint, int*, void> glGetSamplerParameterIiv;
internal unsafe delegate*<uint, uint, uint*, void> glGetSamplerParameterIuiv;
internal unsafe delegate*<uint, uint, float*, void> glGetSamplerParameterfv;
internal unsafe delegate*<uint, uint, int*, void> glGetSamplerParameteriv;
internal unsafe delegate*<uint, int, int*, byte*, void> glGetShaderInfoLog;
internal unsafe delegate*<uint, uint, int*, int*, void> glGetShaderPrecisionFormat;
internal unsafe delegate*<uint, int, int*, byte*, void> glGetShaderSource;
internal unsafe delegate*<uint, uint, int*, void> glGetShaderiv;
internal unsafe delegate*<uint, byte*> glGetString;
internal unsafe delegate*<uint, uint, byte*> glGetStringi;
internal unsafe delegate*<uint, uint, byte*, uint> glGetSubroutineIndex;
internal unsafe delegate*<uint, uint, byte*, int> glGetSubroutineUniformLocation;
internal unsafe delegate*<glSync, uint, int, int*, int*, void> glGetSynciv;
internal unsafe delegate*<uint, int, uint, uint, void*, void> glGetTexImage;
internal unsafe delegate*<uint, int, uint, float*, void> glGetTexLevelParameterfv;
internal unsafe delegate*<uint, int, uint, int*, void> glGetTexLevelParameteriv;
internal unsafe delegate*<uint, uint, int*, void> glGetTexParameterIiv;
internal unsafe delegate*<uint, uint, uint*, void> glGetTexParameterIuiv;
internal unsafe delegate*<uint, uint, float*, void> glGetTexParameterfv;
internal unsafe delegate*<uint, uint, int*, void> glGetTexParameteriv;
internal unsafe delegate*<uint, int, uint, uint, int, void*, void> glGetTextureImage;
internal unsafe delegate*<uint, int, uint, float*, void> glGetTextureLevelParameterfv;
internal unsafe delegate*<uint, int, uint, int*, void> glGetTextureLevelParameteriv;
internal unsafe delegate*<uint, uint, int*, void> glGetTextureParameterIiv;
internal unsafe delegate*<uint, uint, uint*, void> glGetTextureParameterIuiv;
internal unsafe delegate*<uint, uint, float*, void> glGetTextureParameterfv;
internal unsafe delegate*<uint, uint, int*, void> glGetTextureParameteriv;
internal unsafe delegate*<uint, int, int, int, int, int, int, int, uint, uint, int, void*, void> glGetTextureSubImage;
internal unsafe delegate*<uint, uint, int, int*, int*, uint*, byte*, void> glGetTransformFeedbackVarying;
internal unsafe delegate*<uint, uint, uint, long*, void> glGetTransformFeedbacki64_v;
internal unsafe delegate*<uint, uint, uint, int*, void> glGetTransformFeedbacki_v;
internal unsafe delegate*<uint, uint, int*, void> glGetTransformFeedbackiv;
internal unsafe delegate*<uint, byte*, uint> glGetUniformBlockIndex;
internal unsafe delegate*<uint, int, byte**, uint*, void> glGetUniformIndices;
internal unsafe delegate*<uint, byte*, int> glGetUniformLocation;
internal unsafe delegate*<uint, int, uint*, void> glGetUniformSubroutineuiv;
internal unsafe delegate*<uint, int, double*, void> glGetUniformdv;
internal unsafe delegate*<uint, int, float*, void> glGetUniformfv;
internal unsafe delegate*<uint, int, int*, void> glGetUniformiv;
internal unsafe delegate*<uint, int, uint*, void> glGetUniformuiv;
internal unsafe delegate*<uint, uint, uint, long*, void> glGetVertexArrayIndexed64iv;
internal unsafe delegate*<uint, uint, uint, int*, void> glGetVertexArrayIndexediv;
internal unsafe delegate*<uint, uint, int*, void> glGetVertexArrayiv;
internal unsafe delegate*<uint, uint, int*, void> glGetVertexAttribIiv;
internal unsafe delegate*<uint, uint, uint*, void> glGetVertexAttribIuiv;
internal unsafe delegate*<uint, uint, double*, void> glGetVertexAttribLdv;
internal unsafe delegate*<uint, uint, void**, void> glGetVertexAttribPointerv;
internal unsafe delegate*<uint, uint, double*, void> glGetVertexAttribdv;
internal unsafe delegate*<uint, uint, float*, void> glGetVertexAttribfv;
internal unsafe delegate*<uint, uint, int*, void> glGetVertexAttribiv;
internal unsafe delegate*<uint, int, int, void*, void> glGetnCompressedTexImage;
internal unsafe delegate*<uint, int, uint, uint, int, void*, void> glGetnTexImage;
internal unsafe delegate*<uint, int, int, double*, void> glGetnUniformdv;
internal unsafe delegate*<uint, int, int, float*, void> glGetnUniformfv;
internal unsafe delegate*<uint, int, int, int*, void> glGetnUniformiv;
internal unsafe delegate*<uint, int, int, uint*, void> glGetnUniformuiv;
internal unsafe delegate*<uint, uint, void> glHint;
internal unsafe delegate*<uint, void> glInvalidateBufferData;
internal unsafe delegate*<uint, nint, nint, void> glInvalidateBufferSubData;
internal unsafe delegate*<uint, int, uint*, void> glInvalidateFramebuffer;
internal unsafe delegate*<uint, int, uint*, void> glInvalidateNamedFramebufferData;
internal unsafe delegate*<uint, int, uint*, int, int, int, int, void> glInvalidateNamedFramebufferSubData;
internal unsafe delegate*<uint, int, uint*, int, int, int, int, void> glInvalidateSubFramebuffer;
internal unsafe delegate*<uint, int, void> glInvalidateTexImage;
internal unsafe delegate*<uint, int, int, int, int, int, int, int, void> glInvalidateTexSubImage;
internal unsafe delegate*<uint, byte> glIsBuffer;
internal unsafe delegate*<uint, byte> glIsEnabled;
internal unsafe delegate*<uint, uint, byte> glIsEnabledi;
internal unsafe delegate*<uint, byte> glIsFramebuffer;
internal unsafe delegate*<uint, byte> glIsProgram;
internal unsafe delegate*<uint, byte> glIsProgramPipeline;
internal unsafe delegate*<uint, byte> glIsQuery;
internal unsafe delegate*<uint, byte> glIsRenderbuffer;
internal unsafe delegate*<uint, byte> glIsSampler;
internal unsafe delegate*<uint, byte> glIsShader;
internal unsafe delegate*<glSync, byte> glIsSync;
internal unsafe delegate*<uint, byte> glIsTexture;
internal unsafe delegate*<uint, byte> glIsTransformFeedback;
internal unsafe delegate*<uint, byte> glIsVertexArray;
internal unsafe delegate*<float, void> glLineWidth;
internal unsafe delegate*<uint, void> glLinkProgram;
internal unsafe delegate*<uint, void> glLogicOp;
internal unsafe delegate*<uint, uint, void*> glMapBuffer;
internal unsafe delegate*<uint, nint, nint, uint, void*> glMapBufferRange;
internal unsafe delegate*<uint, uint, void*> glMapNamedBuffer;
internal unsafe delegate*<uint, nint, nint, uint, void*> glMapNamedBufferRange;
internal unsafe delegate*<uint, void> glMemoryBarrier;
internal unsafe delegate*<uint, void> glMemoryBarrierByRegion;
internal unsafe delegate*<float, void> glMinSampleShading;
internal unsafe delegate*<uint, int*, int*, int, void> glMultiDrawArrays;
internal unsafe delegate*<uint, void*, int, int, void> glMultiDrawArraysIndirect;
internal unsafe delegate*<uint, void*, nint, int, int, void> glMultiDrawArraysIndirectCount;
internal unsafe delegate*<uint, int*, uint, void**, int, void> glMultiDrawElements;
internal unsafe delegate*<uint, int*, uint, void**, int, int*, void> glMultiDrawElementsBaseVertex;
internal unsafe delegate*<uint, uint, void*, int, int, void> glMultiDrawElementsIndirect;
internal unsafe delegate*<uint, uint, void*, nint, int, int, void> glMultiDrawElementsIndirectCount;
internal unsafe delegate*<uint, nint, void*, uint, void> glNamedBufferData;
internal unsafe delegate*<uint, nint, void*, uint, void> glNamedBufferStorage;
internal unsafe delegate*<uint, nint, nint, void*, void> glNamedBufferSubData;
internal unsafe delegate*<uint, uint, void> glNamedFramebufferDrawBuffer;
internal unsafe delegate*<uint, int, uint*, void> glNamedFramebufferDrawBuffers;
internal unsafe delegate*<uint, uint, int, void> glNamedFramebufferParameteri;
internal unsafe delegate*<uint, uint, void> glNamedFramebufferReadBuffer;
internal unsafe delegate*<uint, uint, uint, uint, void> glNamedFramebufferRenderbuffer;
internal unsafe delegate*<uint, uint, uint, int, void> glNamedFramebufferTexture;
internal unsafe delegate*<uint, uint, uint, int, int, void> glNamedFramebufferTextureLayer;
internal unsafe delegate*<uint, uint, int, int, void> glNamedRenderbufferStorage;
internal unsafe delegate*<uint, int, uint, int, int, void> glNamedRenderbufferStorageMultisample;
internal unsafe delegate*<uint, uint, int, byte*, void> glObjectLabel;
internal unsafe delegate*<void*, int, byte*, void> glObjectPtrLabel;
internal unsafe delegate*<uint, float*, void> glPatchParameterfv;
internal unsafe delegate*<uint, int, void> glPatchParameteri;
internal unsafe delegate*<void> glPauseTransformFeedback;
internal unsafe delegate*<uint, float, void> glPixelStoref;
internal unsafe delegate*<uint, int, void> glPixelStorei;
internal unsafe delegate*<uint, float, void> glPointParameterf;
internal unsafe delegate*<uint, float*, void> glPointParameterfv;
internal unsafe delegate*<uint, int, void> glPointParameteri;
internal unsafe delegate*<uint, int*, void> glPointParameteriv;
internal unsafe delegate*<float, void> glPointSize;
internal unsafe delegate*<uint, uint, void> glPolygonMode;
internal unsafe delegate*<float, float, void> glPolygonOffset;
internal unsafe delegate*<float, float, float, void> glPolygonOffsetClamp;
internal unsafe delegate*<void> glPopDebugGroup;
internal unsafe delegate*<uint, void> glPrimitiveRestartIndex;
internal unsafe delegate*<uint, uint, void*, int, void> glProgramBinary;
internal unsafe delegate*<uint, uint, int, void> glProgramParameteri;
internal unsafe delegate*<uint, int, double, void> glProgramUniform1d;
internal unsafe delegate*<uint, int, int, double*, void> glProgramUniform1dv;
internal unsafe delegate*<uint, int, float, void> glProgramUniform1f;
internal unsafe delegate*<uint, int, int, float*, void> glProgramUniform1fv;
internal unsafe delegate*<uint, int, int, void> glProgramUniform1i;
internal unsafe delegate*<uint, int, int, int*, void> glProgramUniform1iv;
internal unsafe delegate*<uint, int, uint, void> glProgramUniform1ui;
internal unsafe delegate*<uint, int, int, uint*, void> glProgramUniform1uiv;
internal unsafe delegate*<uint, int, double, double, void> glProgramUniform2d;
internal unsafe delegate*<uint, int, int, double*, void> glProgramUniform2dv;
internal unsafe delegate*<uint, int, float, float, void> glProgramUniform2f;
internal unsafe delegate*<uint, int, int, float*, void> glProgramUniform2fv;
internal unsafe delegate*<uint, int, int, int, void> glProgramUniform2i;
internal unsafe delegate*<uint, int, int, int*, void> glProgramUniform2iv;
internal unsafe delegate*<uint, int, uint, uint, void> glProgramUniform2ui;
internal unsafe delegate*<uint, int, int, uint*, void> glProgramUniform2uiv;
internal unsafe delegate*<uint, int, double, double, double, void> glProgramUniform3d;
internal unsafe delegate*<uint, int, int, double*, void> glProgramUniform3dv;
internal unsafe delegate*<uint, int, float, float, float, void> glProgramUniform3f;
internal unsafe delegate*<uint, int, int, float*, void> glProgramUniform3fv;
internal unsafe delegate*<uint, int, int, int, int, void> glProgramUniform3i;
internal unsafe delegate*<uint, int, int, int*, void> glProgramUniform3iv;
internal unsafe delegate*<uint, int, uint, uint, uint, void> glProgramUniform3ui;
internal unsafe delegate*<uint, int, int, uint*, void> glProgramUniform3uiv;
internal unsafe delegate*<uint, int, double, double, double, double, void> glProgramUniform4d;
internal unsafe delegate*<uint, int, int, double*, void> glProgramUniform4dv;
internal unsafe delegate*<uint, int, float, float, float, float, void> glProgramUniform4f;
internal unsafe delegate*<uint, int, int, float*, void> glProgramUniform4fv;
internal unsafe delegate*<uint, int, int, int, int, int, void> glProgramUniform4i;
internal unsafe delegate*<uint, int, int, int*, void> glProgramUniform4iv;
internal unsafe delegate*<uint, int, uint, uint, uint, uint, void> glProgramUniform4ui;
internal unsafe delegate*<uint, int, int, uint*, void> glProgramUniform4uiv;
internal unsafe delegate*<uint, int, int, byte, double*, void> glProgramUniformMatrix2dv;
internal unsafe delegate*<uint, int, int, byte, float*, void> glProgramUniformMatrix2fv;
internal unsafe delegate*<uint, int, int, byte, double*, void> glProgramUniformMatrix2x3dv;
internal unsafe delegate*<uint, int, int, byte, float*, void> glProgramUniformMatrix2x3fv;
internal unsafe delegate*<uint, int, int, byte, double*, void> glProgramUniformMatrix2x4dv;
internal unsafe delegate*<uint, int, int, byte, float*, void> glProgramUniformMatrix2x4fv;
internal unsafe delegate*<uint, int, int, byte, double*, void> glProgramUniformMatrix3dv;
internal unsafe delegate*<uint, int, int, byte, float*, void> glProgramUniformMatrix3fv;
internal unsafe delegate*<uint, int, int, byte, double*, void> glProgramUniformMatrix3x2dv;
internal unsafe delegate*<uint, int, int, byte, float*, void> glProgramUniformMatrix3x2fv;
internal unsafe delegate*<uint, int, int, byte, double*, void> glProgramUniformMatrix3x4dv;
internal unsafe delegate*<uint, int, int, byte, float*, void> glProgramUniformMatrix3x4fv;
internal unsafe delegate*<uint, int, int, byte, double*, void> glProgramUniformMatrix4dv;
internal unsafe delegate*<uint, int, int, byte, float*, void> glProgramUniformMatrix4fv;
internal unsafe delegate*<uint, int, int, byte, double*, void> glProgramUniformMatrix4x2dv;
internal unsafe delegate*<uint, int, int, byte, float*, void> glProgramUniformMatrix4x2fv;
internal unsafe delegate*<uint, int, int, byte, double*, void> glProgramUniformMatrix4x3dv;
internal unsafe delegate*<uint, int, int, byte, float*, void> glProgramUniformMatrix4x3fv;
internal unsafe delegate*<uint, void> glProvokingVertex;
internal unsafe delegate*<uint, uint, int, byte*, void> glPushDebugGroup;
internal unsafe delegate*<uint, uint, void> glQueryCounter;
internal unsafe delegate*<uint, void> glReadBuffer;
internal unsafe delegate*<int, int, int, int, uint, uint, void*, void> glReadPixels;
internal unsafe delegate*<int, int, int, int, uint, uint, int, void*, void> glReadnPixels;
internal unsafe delegate*<void> glReleaseShaderCompiler;
internal unsafe delegate*<uint, uint, int, int, void> glRenderbufferStorage;
internal unsafe delegate*<uint, int, uint, int, int, void> glRenderbufferStorageMultisample;
internal unsafe delegate*<void> glResumeTransformFeedback;
internal unsafe delegate*<float, byte, void> glSampleCoverage;
internal unsafe delegate*<uint, uint, void> glSampleMaski;
internal unsafe delegate*<uint, uint, int*, void> glSamplerParameterIiv;
internal unsafe delegate*<uint, uint, uint*, void> glSamplerParameterIuiv;
internal unsafe delegate*<uint, uint, float, void> glSamplerParameterf;
internal unsafe delegate*<uint, uint, float*, void> glSamplerParameterfv;
internal unsafe delegate*<uint, uint, int, void> glSamplerParameteri;
internal unsafe delegate*<uint, uint, int*, void> glSamplerParameteriv;
internal unsafe delegate*<int, int, int, int, void> glScissor;
internal unsafe delegate*<uint, int, int*, void> glScissorArrayv;
internal unsafe delegate*<uint, int, int, int, int, void> glScissorIndexed;
internal unsafe delegate*<uint, int*, void> glScissorIndexedv;
internal unsafe delegate*<int, uint*, uint, void*, int, void> glShaderBinary;
internal unsafe delegate*<uint, int, byte**, int*, void> glShaderSource;
internal unsafe delegate*<uint, uint, uint, void> glShaderStorageBlockBinding;
internal unsafe delegate*<uint, byte*, uint, uint*, uint*, void> glSpecializeShader;
internal unsafe delegate*<uint, int, uint, void> glStencilFunc;
internal unsafe delegate*<uint, uint, int, uint, void> glStencilFuncSeparate;
internal unsafe delegate*<uint, void> glStencilMask;
internal unsafe delegate*<uint, uint, void> glStencilMaskSeparate;
internal unsafe delegate*<uint, uint, uint, void> glStencilOp;
internal unsafe delegate*<uint, uint, uint, uint, void> glStencilOpSeparate;
internal unsafe delegate*<uint, uint, uint, void> glTexBuffer;
internal unsafe delegate*<uint, uint, uint, nint, nint, void> glTexBufferRange;
internal unsafe delegate*<uint, int, int, int, int, uint, uint, void*, void> glTexImage1D;
internal unsafe delegate*<uint, int, int, int, int, int, uint, uint, void*, void> glTexImage2D;
internal unsafe delegate*<uint, int, uint, int, int, byte, void> glTexImage2DMultisample;
internal unsafe delegate*<uint, int, int, int, int, int, int, uint, uint, void*, void> glTexImage3D;
internal unsafe delegate*<uint, int, uint, int, int, int, byte, void> glTexImage3DMultisample;
internal unsafe delegate*<uint, uint, int*, void> glTexParameterIiv;
internal unsafe delegate*<uint, uint, uint*, void> glTexParameterIuiv;
internal unsafe delegate*<uint, uint, float, void> glTexParameterf;
internal unsafe delegate*<uint, uint, float*, void> glTexParameterfv;
internal unsafe delegate*<uint, uint, int, void> glTexParameteri;
internal unsafe delegate*<uint, uint, int*, void> glTexParameteriv;
internal unsafe delegate*<uint, int, uint, int, void> glTexStorage1D;
internal unsafe delegate*<uint, int, uint, int, int, void> glTexStorage2D;
internal unsafe delegate*<uint, int, uint, int, int, byte, void> glTexStorage2DMultisample;
internal unsafe delegate*<uint, int, uint, int, int, int, void> glTexStorage3D;
internal unsafe delegate*<uint, int, uint, int, int, int, byte, void> glTexStorage3DMultisample;
internal unsafe delegate*<uint, int, int, int, uint, uint, void*, void> glTexSubImage1D;
internal unsafe delegate*<uint, int, int, int, int, int, uint, uint, void*, void> glTexSubImage2D;
internal unsafe delegate*<uint, int, int, int, int, int, int, int, uint, uint, void*, void> glTexSubImage3D;
internal unsafe delegate*<void> glTextureBarrier;
internal unsafe delegate*<uint, uint, uint, void> glTextureBuffer;
internal unsafe delegate*<uint, uint, uint, nint, nint, void> glTextureBufferRange;
internal unsafe delegate*<uint, uint, int*, void> glTextureParameterIiv;
internal unsafe delegate*<uint, uint, uint*, void> glTextureParameterIuiv;
internal unsafe delegate*<uint, uint, float, void> glTextureParameterf;
internal unsafe delegate*<uint, uint, float*, void> glTextureParameterfv;
internal unsafe delegate*<uint, uint, int, void> glTextureParameteri;
internal unsafe delegate*<uint, uint, int*, void> glTextureParameteriv;
internal unsafe delegate*<uint, int, uint, int, void> glTextureStorage1D;
internal unsafe delegate*<uint, int, uint, int, int, void> glTextureStorage2D;
internal unsafe delegate*<uint, int, uint, int, int, byte, void> glTextureStorage2DMultisample;
internal unsafe delegate*<uint, int, uint, int, int, int, void> glTextureStorage3D;
internal unsafe delegate*<uint, int, uint, int, int, int, byte, void> glTextureStorage3DMultisample;
internal unsafe delegate*<uint, int, int, int, uint, uint, void*, void> glTextureSubImage1D;
internal unsafe delegate*<uint, int, int, int, int, int, uint, uint, void*, void> glTextureSubImage2D;
internal unsafe delegate*<uint, int, int, int, int, int, int, int, uint, uint, void*, void> glTextureSubImage3D;
internal unsafe delegate*<uint, uint, uint, uint, uint, uint, uint, uint, void> glTextureView;
internal unsafe delegate*<uint, uint, uint, void> glTransformFeedbackBufferBase;
internal unsafe delegate*<uint, uint, uint, nint, nint, void> glTransformFeedbackBufferRange;
internal unsafe delegate*<uint, int, byte**, uint, void> glTransformFeedbackVaryings;
internal unsafe delegate*<int, double, void> glUniform1d;
internal unsafe delegate*<int, int, double*, void> glUniform1dv;
internal unsafe delegate*<int, float, void> glUniform1f;
internal unsafe delegate*<int, int, float*, void> glUniform1fv;
internal unsafe delegate*<int, int, void> glUniform1i;
internal unsafe delegate*<int, int, int*, void> glUniform1iv;
internal unsafe delegate*<int, uint, void> glUniform1ui;
internal unsafe delegate*<int, int, uint*, void> glUniform1uiv;
internal unsafe delegate*<int, double, double, void> glUniform2d;
internal unsafe delegate*<int, int, double*, void> glUniform2dv;
internal unsafe delegate*<int, float, float, void> glUniform2f;
internal unsafe delegate*<int, int, float*, void> glUniform2fv;
internal unsafe delegate*<int, int, int, void> glUniform2i;
internal unsafe delegate*<int, int, int*, void> glUniform2iv;
internal unsafe delegate*<int, uint, uint, void> glUniform2ui;
internal unsafe delegate*<int, int, uint*, void> glUniform2uiv;
internal unsafe delegate*<int, double, double, double, void> glUniform3d;
internal unsafe delegate*<int, int, double*, void> glUniform3dv;
internal unsafe delegate*<int, float, float, float, void> glUniform3f;
internal unsafe delegate*<int, int, float*, void> glUniform3fv;
internal unsafe delegate*<int, int, int, int, void> glUniform3i;
internal unsafe delegate*<int, int, int*, void> glUniform3iv;
internal unsafe delegate*<int, uint, uint, uint, void> glUniform3ui;
internal unsafe delegate*<int, int, uint*, void> glUniform3uiv;
internal unsafe delegate*<int, double, double, double, double, void> glUniform4d;
internal unsafe delegate*<int, int, double*, void> glUniform4dv;
internal unsafe delegate*<int, float, float, float, float, void> glUniform4f;
internal unsafe delegate*<int, int, float*, void> glUniform4fv;
internal unsafe delegate*<int, int, int, int, int, void> glUniform4i;
internal unsafe delegate*<int, int, int*, void> glUniform4iv;
internal unsafe delegate*<int, uint, uint, uint, uint, void> glUniform4ui;
internal unsafe delegate*<int, int, uint*, void> glUniform4uiv;
internal unsafe delegate*<uint, uint, uint, void> glUniformBlockBinding;
internal unsafe delegate*<int, int, byte, double*, void> glUniformMatrix2dv;
internal unsafe delegate*<int, int, byte, float*, void> glUniformMatrix2fv;
internal unsafe delegate*<int, int, byte, double*, void> glUniformMatrix2x3dv;
internal unsafe delegate*<int, int, byte, float*, void> glUniformMatrix2x3fv;
internal unsafe delegate*<int, int, byte, double*, void> glUniformMatrix2x4dv;
internal unsafe delegate*<int, int, byte, float*, void> glUniformMatrix2x4fv;
internal unsafe delegate*<int, int, byte, double*, void> glUniformMatrix3dv;
internal unsafe delegate*<int, int, byte, float*, void> glUniformMatrix3fv;
internal unsafe delegate*<int, int, byte, double*, void> glUniformMatrix3x2dv;
internal unsafe delegate*<int, int, byte, float*, void> glUniformMatrix3x2fv;
internal unsafe delegate*<int, int, byte, double*, void> glUniformMatrix3x4dv;
internal unsafe delegate*<int, int, byte, float*, void> glUniformMatrix3x4fv;
internal unsafe delegate*<int, int, byte, double*, void> glUniformMatrix4dv;
internal unsafe delegate*<int, int, byte, float*, void> glUniformMatrix4fv;
internal unsafe delegate*<int, int, byte, double*, void> glUniformMatrix4x2dv;
internal unsafe delegate*<int, int, byte, float*, void> glUniformMatrix4x2fv;
internal unsafe delegate*<int, int, byte, double*, void> glUniformMatrix4x3dv;
internal unsafe delegate*<int, int, byte, float*, void> glUniformMatrix4x3fv;
internal unsafe delegate*<uint, int, uint*, void> glUniformSubroutinesuiv;
internal unsafe delegate*<uint, byte> glUnmapBuffer;
internal unsafe delegate*<uint, byte> glUnmapNamedBuffer;
internal unsafe delegate*<uint, void> glUseProgram;
internal unsafe delegate*<uint, uint, uint, void> glUseProgramStages;
internal unsafe delegate*<uint, void> glValidateProgram;
internal unsafe delegate*<uint, void> glValidateProgramPipeline;
internal unsafe delegate*<uint, uint, uint, void> glVertexArrayAttribBinding;
internal unsafe delegate*<uint, uint, int, uint, byte, uint, void> glVertexArrayAttribFormat;
internal unsafe delegate*<uint, uint, int, uint, uint, void> glVertexArrayAttribIFormat;
internal unsafe delegate*<uint, uint, int, uint, uint, void> glVertexArrayAttribLFormat;
internal unsafe delegate*<uint, uint, uint, void> glVertexArrayBindingDivisor;
internal unsafe delegate*<uint, uint, void> glVertexArrayElementBuffer;
internal unsafe delegate*<uint, uint, uint, nint, int, void> glVertexArrayVertexBuffer;
internal unsafe delegate*<uint, uint, int, uint*, nint*, int*, void> glVertexArrayVertexBuffers;
internal unsafe delegate*<uint, double, void> glVertexAttrib1d;
internal unsafe delegate*<uint, double*, void> glVertexAttrib1dv;
internal unsafe delegate*<uint, float, void> glVertexAttrib1f;
internal unsafe delegate*<uint, float*, void> glVertexAttrib1fv;
internal unsafe delegate*<uint, short, void> glVertexAttrib1s;
internal unsafe delegate*<uint, short*, void> glVertexAttrib1sv;
internal unsafe delegate*<uint, double, double, void> glVertexAttrib2d;
internal unsafe delegate*<uint, double*, void> glVertexAttrib2dv;
internal unsafe delegate*<uint, float, float, void> glVertexAttrib2f;
internal unsafe delegate*<uint, float*, void> glVertexAttrib2fv;
internal unsafe delegate*<uint, short, short, void> glVertexAttrib2s;
internal unsafe delegate*<uint, short*, void> glVertexAttrib2sv;
internal unsafe delegate*<uint, double, double, double, void> glVertexAttrib3d;
internal unsafe delegate*<uint, double*, void> glVertexAttrib3dv;
internal unsafe delegate*<uint, float, float, float, void> glVertexAttrib3f;
internal unsafe delegate*<uint, float*, void> glVertexAttrib3fv;
internal unsafe delegate*<uint, short, short, short, void> glVertexAttrib3s;
internal unsafe delegate*<uint, short*, void> glVertexAttrib3sv;
internal unsafe delegate*<uint, sbyte*, void> glVertexAttrib4Nbv;
internal unsafe delegate*<uint, int*, void> glVertexAttrib4Niv;
internal unsafe delegate*<uint, short*, void> glVertexAttrib4Nsv;
internal unsafe delegate*<uint, byte, byte, byte, byte, void> glVertexAttrib4Nub;
internal unsafe delegate*<uint, byte*, void> glVertexAttrib4Nubv;
internal unsafe delegate*<uint, uint*, void> glVertexAttrib4Nuiv;
internal unsafe delegate*<uint, ushort*, void> glVertexAttrib4Nusv;
internal unsafe delegate*<uint, sbyte*, void> glVertexAttrib4bv;
internal unsafe delegate*<uint, double, double, double, double, void> glVertexAttrib4d;
internal unsafe delegate*<uint, double*, void> glVertexAttrib4dv;
internal unsafe delegate*<uint, float, float, float, float, void> glVertexAttrib4f;
internal unsafe delegate*<uint, float*, void> glVertexAttrib4fv;
internal unsafe delegate*<uint, int*, void> glVertexAttrib4iv;
internal unsafe delegate*<uint, short, short, short, short, void> glVertexAttrib4s;
internal unsafe delegate*<uint, short*, void> glVertexAttrib4sv;
internal unsafe delegate*<uint, byte*, void> glVertexAttrib4ubv;
internal unsafe delegate*<uint, uint*, void> glVertexAttrib4uiv;
internal unsafe delegate*<uint, ushort*, void> glVertexAttrib4usv;
internal unsafe delegate*<uint, uint, void> glVertexAttribBinding;
internal unsafe delegate*<uint, uint, void> glVertexAttribDivisor;
internal unsafe delegate*<uint, int, uint, byte, uint, void> glVertexAttribFormat;
internal unsafe delegate*<uint, int, void> glVertexAttribI1i;
internal unsafe delegate*<uint, int*, void> glVertexAttribI1iv;
internal unsafe delegate*<uint, uint, void> glVertexAttribI1ui;
internal unsafe delegate*<uint, uint*, void> glVertexAttribI1uiv;
internal unsafe delegate*<uint, int, int, void> glVertexAttribI2i;
internal unsafe delegate*<uint, int*, void> glVertexAttribI2iv;
internal unsafe delegate*<uint, uint, uint, void> glVertexAttribI2ui;
internal unsafe delegate*<uint, uint*, void> glVertexAttribI2uiv;
internal unsafe delegate*<uint, int, int, int, void> glVertexAttribI3i;
internal unsafe delegate*<uint, int*, void> glVertexAttribI3iv;
internal unsafe delegate*<uint, uint, uint, uint, void> glVertexAttribI3ui;
internal unsafe delegate*<uint, uint*, void> glVertexAttribI3uiv;
internal unsafe delegate*<uint, sbyte*, void> glVertexAttribI4bv;
internal unsafe delegate*<uint, int, int, int, int, void> glVertexAttribI4i;
internal unsafe delegate*<uint, int*, void> glVertexAttribI4iv;
internal unsafe delegate*<uint, short*, void> glVertexAttribI4sv;
internal unsafe delegate*<uint, byte*, void> glVertexAttribI4ubv;
internal unsafe delegate*<uint, uint, uint, uint, uint, void> glVertexAttribI4ui;
internal unsafe delegate*<uint, uint*, void> glVertexAttribI4uiv;
internal unsafe delegate*<uint, ushort*, void> glVertexAttribI4usv;
internal unsafe delegate*<uint, int, uint, uint, void> glVertexAttribIFormat;
internal unsafe delegate*<uint, int, uint, int, void*, void> glVertexAttribIPointer;
internal unsafe delegate*<uint, double, void> glVertexAttribL1d;
internal unsafe delegate*<uint, double*, void> glVertexAttribL1dv;
internal unsafe delegate*<uint, double, double, void> glVertexAttribL2d;
internal unsafe delegate*<uint, double*, void> glVertexAttribL2dv;
internal unsafe delegate*<uint, double, double, double, void> glVertexAttribL3d;
internal unsafe delegate*<uint, double*, void> glVertexAttribL3dv;
internal unsafe delegate*<uint, double, double, double, double, void> glVertexAttribL4d;
internal unsafe delegate*<uint, double*, void> glVertexAttribL4dv;
internal unsafe delegate*<uint, int, uint, uint, void> glVertexAttribLFormat;
internal unsafe delegate*<uint, int, uint, int, void*, void> glVertexAttribLPointer;
internal unsafe delegate*<uint, uint, byte, uint, void> glVertexAttribP1ui;
internal unsafe delegate*<uint, uint, byte, uint*, void> glVertexAttribP1uiv;
internal unsafe delegate*<uint, uint, byte, uint, void> glVertexAttribP2ui;
internal unsafe delegate*<uint, uint, byte, uint*, void> glVertexAttribP2uiv;
internal unsafe delegate*<uint, uint, byte, uint, void> glVertexAttribP3ui;
internal unsafe delegate*<uint, uint, byte, uint*, void> glVertexAttribP3uiv;
internal unsafe delegate*<uint, uint, byte, uint, void> glVertexAttribP4ui;
internal unsafe delegate*<uint, uint, byte, uint*, void> glVertexAttribP4uiv;
internal unsafe delegate*<uint, int, uint, byte, int, void*, void> glVertexAttribPointer;
internal unsafe delegate*<uint, uint, void> glVertexBindingDivisor;
internal unsafe delegate*<int, int, int, int, void> glViewport;
internal unsafe delegate*<uint, int, float*, void> glViewportArrayv;
internal unsafe delegate*<uint, float, float, float, float, void> glViewportIndexedf;
internal unsafe delegate*<uint, float*, void> glViewportIndexedfv;
internal unsafe delegate*<glSync, uint, ulong, void> glWaitSync;
}
}
-58
View File
@@ -1,58 +0,0 @@
//-----------------------------------------------------------------------
// -----------------------------------------------------------------------
// file="Program"
// Project: StgSharp
// AuthorGroup: Nitload
// Copyright (c) Nitload. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
using GenerateGL.CodeGen;
using System;
using System.IO;
namespace GenerateGL
{
internal class Program
{
private static void Main(
string[] args
)
{
string baseDir = AppContext.BaseDirectory;
string xmlPath = Path.GetFullPath(Path.Combine(baseDir, "xml", "gl.xml"));
string outputRoot = args.Length > 0
? Path.GetFullPath(args[0])
: Path.GetFullPath(Path.Combine(baseDir, "Generated"));
Console.WriteLine($"[GenerateGL] Loading registry: {xmlPath}");
var (commands, features) = GlXmlParser.Parse(xmlPath);
Console.WriteLine($"[GenerateGL] Commands: {commands.Count}, Features: {features.Count}");
Generator generator = new Generator(commands, features, outputRoot);
generator.Run();
Console.WriteLine($"[GenerateGL] Generated files under: {outputRoot}");
}
}
}
File diff suppressed because it is too large Load Diff
-4
View File
@@ -1,4 +0,0 @@
#!/bin/sh
for header in glcorearb.h glext.h gl.h ; do
./genglvnd.py -registry drafts/GL/gl.xml drafts/GL/$header
done
-25
View File
@@ -1,25 +0,0 @@
// Copyright 2017-2021 The Khronos Group Inc.
// SPDX-License-Identifier: CC-BY-4.0
# OpenGL XML API Registry
This directory contains the OpenGL, GLX, and WGL XML API registries, in
gl.xml, glx.xml, and wgl.xml respectively. They are used to reserve
enumerant ranges for vendors working on new extensions, to register
extension interfaces when an extension is published, and to generate the
Khronos-supplied header files in ../api .
The canonical versions are always found in the master branch of the github
repository at https://github.com/KhronosGroup/OpenGL-Registry
The 'validate' Makefile target uses the 'jing' tool to confirm that each XML
file is structurally valid and conforms to the registry schema in
registry.rnc. The schema is described in detail in readme.pdf.
The 'default' Makefile target generates updated headers in ../api/ from the
XML files.
Note that while there are targets for ../api/{gl.h,glx.h,wgl.h} in
genglvnd.py and genheaders.py, these targets are not generated by default
and are experimental. At present, you should use the versions of these
headers shipped with your OS or IHV SDK.
-628
View File
@@ -1,628 +0,0 @@
#!/usr/bin/env python
#
# Copyright 2013-2025 The Khronos Group Inc.
# SPDX-License-Identifier: Apache-2.0
import sys, time, pdb, string, cProfile
from reg import *
# debug - start header generation in debugger
# dump - dump registry after loading
# profile - enable Python profiling
# protect - whether to use #ifndef protections
# registry <filename> - use specified XML registry instead of gl.xml
# target - string name of target header, or all targets if None
# timeit - time length of registry loading & header generation
# validate - validate return & parameter group tags against <group>
debug = False
dump = False
profile = False
protect = True
target = None
timeit = False
validate= False
# Default input / log files
errFilename = None
diagFilename = 'diag.txt'
regFilename = 'gl.xml'
if __name__ == '__main__':
i = 1
while (i < len(sys.argv)):
arg = sys.argv[i]
i = i + 1
if (arg == '-debug'):
write('Enabling debug (-debug)', file=sys.stderr)
debug = True
elif (arg == '-dump'):
write('Enabling dump (-dump)', file=sys.stderr)
dump = True
elif (arg == '-noprotect'):
write('Disabling inclusion protection in output headers', file=sys.stderr)
protect = False
elif (arg == '-profile'):
write('Enabling profiling (-profile)', file=sys.stderr)
profile = True
elif (arg == '-registry'):
regFilename = sys.argv[i]
i = i+1
write('Using registry ', regFilename, file=sys.stderr)
elif (arg == '-time'):
write('Enabling timing (-time)', file=sys.stderr)
timeit = True
elif (arg == '-validate'):
write('Enabling group validation (-validate)', file=sys.stderr)
validate = True
elif (arg[0:1] == '-'):
write('Unrecognized argument:', arg, file=sys.stderr)
exit(1)
else:
target = arg
write('Using target', target, file=sys.stderr)
# Simple timer functions
startTime = None
def startTimer():
global startTime
startTime = time.process_time()
def endTimer(msg):
global startTime
endTime = time.process_time()
if (timeit):
write(msg, endTime - startTime)
startTime = None
# Load & parse registry
reg = Registry()
startTimer()
tree = etree.parse(regFilename)
endTimer('Time to make ElementTree =')
startTimer()
reg.loadElementTree(tree)
endTimer('Time to parse ElementTree =')
if (validate):
reg.validateGroups()
if (dump):
write('***************************************')
write('Performing Registry dump to regdump.txt')
write('***************************************')
reg.dumpReg(filehandle = open('regdump.txt','w'))
# Turn a list of strings into a regexp string matching exactly those strings
def makeREstring(list):
return '^(' + '|'.join(list) + ')$'
# These are "mandatory" OpenGL ES 1 extensions, to
# be included in the core GLES/gl.h header.
es1CoreList = [
'GL_OES_read_format',
'GL_OES_compressed_paletted_texture',
'GL_OES_point_size_array',
'GL_OES_point_sprite'
]
# These are extensions to be included in the libglvnd GL/gl.h header.
glVndList = [
'GL_ARB_imaging',
'GL_ARB_multitexture'
]
# Descriptive names for various regexp patterns used to select
# versions and extensions
allVersions = allExtensions = '.*'
noVersions = noExtensions = None
gl13Pat = r'1\.[0-3]'
gl12andLaterPat = r'1\.[2-9]|[234]\.[0-9]'
gles2onlyPat = r'2\.[0-9]'
gles2through30Pat = r'2\.[0-9]|3\.0'
gles2through31Pat = r'2\.[0-9]|3\.[01]'
gles2through32Pat = r'2\.[0-9]|3\.[012]'
es1CorePat = makeREstring(es1CoreList)
glVndPat = makeREstring(glVndList)
# Extensions in old glcorearb.h but not yet tagged accordingly in gl.xml
glCoreARBPat = None
glx13andLaterPat = r'1\.[3-9]'
# Copyright text prefixing all headers (list of strings).
prefixStrings = [
'/*',
'** Copyright 2013-2025 The Khronos Group Inc.',
'** SPDX-' + 'License-Identifier: MIT',
'**',
'** This header is generated from the Khronos OpenGL / OpenGL ES XML',
'** API Registry. The current version of the Registry, generator scripts',
'** used to make the header, and the header can be found at',
'** https://github.com/KhronosGroup/OpenGL-Registry',
'*/',
''
]
# glext.h / glcorearb.h define calling conventions inline (no GL *platform.h)
glExtPlatformStrings = [
'#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)',
'#ifndef WIN32_LEAN_AND_MEAN',
'#define WIN32_LEAN_AND_MEAN 1',
'#endif',
'#include <windows.h>',
'#endif',
'',
'#ifndef APIENTRY',
'#define APIENTRY',
'#endif',
'#ifndef APIENTRYP',
'#define APIENTRYP APIENTRY *',
'#endif',
'#ifndef GLAPI',
'#define GLAPI extern',
'#endif',
''
]
glCorearbPlatformStrings = glExtPlatformStrings + [
'/* glcorearb.h is for use with OpenGL core profile implementations.',
'** It should should be placed in the same directory as gl.h and',
'** included as <GL/glcorearb.h>.',
'**',
'** glcorearb.h includes only APIs in the latest OpenGL core profile',
'** implementation together with APIs in newer ARB extensions which ',
'** can be supported by the core profile. It does not, and never will',
'** include functionality removed from the core profile, such as',
'** fixed-function vertex and fragment processing.',
'**',
'** Do not #include both <GL/glcorearb.h> and either of <GL/gl.h> or',
'** <GL/glext.h> in the same source file.',
'*/',
''
]
# wglext.h needs Windows include
wglPlatformStrings = [
'#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)',
'#define WIN32_LEAN_AND_MEAN 1',
'#include <windows.h>',
'#endif',
'',
]
# Different APIs use different *platform.h files to define calling
# conventions
glPlatformStrings = [ '#include <GL/glplatform.h>', '' ]
gles1PlatformStrings = [ '#include <GLES/glplatform.h>', '' ]
gles2PlatformStrings = [ '#include <GLES2/gl2platform.h>', '' ]
gles3PlatformStrings = [ '#include <GLES3/gl3platform.h>', '' ]
glsc2PlatformStrings = [ '#include <GLSC2/gl2platform.h>', '' ]
eglPlatformStrings = [ '#include <EGL/eglplatform.h>', '' ]
# GLES headers have a small addition to calling convention headers for function pointer typedefs
apiEntryPrefixStrings = [
'#ifndef GL_APIENTRYP',
'#define GL_APIENTRYP GL_APIENTRY*',
'#endif',
''
]
# Insert generation date in a comment for headers not having *GLEXT_VERSION macros
genDateCommentString = [
format("/* Generated on date %s */" % time.strftime("%Y%m%d")),
''
]
# GL_GLEXT_VERSION is defined only in glext.h and gl2ext.h
glextVersionStrings = [
format("#define GL_GLEXT_VERSION %s" % time.strftime("%Y%m%d")),
''
]
# WGL_WGLEXT_VERSION is defined only in wglext.h
wglextVersionStrings = [
format("#define WGL_WGLEXT_VERSION %s" % time.strftime("%Y%m%d")),
''
]
# GLX_GLXEXT_VERSION is defined only in glxext.h
glxextVersionStrings = [
format("#define GLX_GLXEXT_VERSION %s" % time.strftime("%Y%m%d")),
''
]
# EGL_EGLEXT_VERSION is defined only in eglext.h
eglextVersionStrings = [
format("#define EGL_EGLEXT_VERSION %s" % time.strftime("%Y%m%d")),
''
]
# Defaults for generating re-inclusion protection wrappers (or not)
protectFile = protect
protectFeature = protect
protectProto = protect
buildList = [
# GL API 1.2+ + extensions - GL/glext.h
CGeneratorOptions(
filename = 'drafts/GL/glext.h',
apiname = 'gl',
profile = 'compatibility',
versions = allVersions,
emitversions = gl12andLaterPat,
defaultExtensions = 'gl', # Default extensions for GL
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + glExtPlatformStrings + glextVersionStrings,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto,
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GLAPI ',
apientry = 'APIENTRY ',
apientryp = 'APIENTRYP '),
# GL compatibility profile through GL 1.3 (for libglvnd) - GL/gl.h
CGeneratorOptions(
filename = 'drafts/GL/gl.h',
apiname = 'gl',
profile = 'compatibility',
versions = allVersions,
emitversions = gl13Pat,
defaultExtensions = None, # No extensions for gl.h
addExtensions = glVndPat,
removeExtensions = None,
prefixText = prefixStrings + glPlatformStrings,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = False, # gl.h always includes prototypes
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GLAPI ',
apientry = 'APIENTRY ',
apientryp = 'APIENTRYP '),
# GL core profile + extensions - GL/glcorearb.h
CGeneratorOptions(
filename = 'drafts/GL/glcorearb.h',
apiname = 'gl',
profile = 'core',
versions = allVersions,
emitversions = allVersions,
defaultExtensions = 'glcore', # Default extensions for GL core profile (only)
addExtensions = glCoreARBPat,
removeExtensions = None,
prefixText = prefixStrings + glCorearbPlatformStrings,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto,
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GLAPI ',
apientry = 'APIENTRY ',
apientryp = 'APIENTRYP '),
# GLES 1.x API + mandatory extensions - GLES/gl.h (no function pointers)
CGeneratorOptions(
filename = 'GLES/gl.h',
apiname = 'gles1',
profile = 'common',
versions = allVersions,
emitversions = allVersions,
defaultExtensions = None, # No default extensions
addExtensions = es1CorePat, # Add mandatory ES1 extensions in GLES1/gl.h
removeExtensions = None,
prefixText = prefixStrings + gles1PlatformStrings + genDateCommentString,
genFuncPointers = False,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = False, # Core ES API functions are in the static link libraries
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GL_API ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# GLES 1.x extensions - GLES/glext.h
CGeneratorOptions(
filename = 'GLES/glext.h',
apiname = 'gles1',
profile = 'common',
versions = allVersions,
emitversions = noVersions,
defaultExtensions = 'gles1', # Default extensions for GLES 1
addExtensions = None,
removeExtensions = es1CorePat, # Remove mandatory ES1 extensions in GLES1/glext.h
prefixText = prefixStrings + apiEntryPrefixStrings + genDateCommentString,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto,
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GL_API ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# GLES 2.0 API - GLES2/gl2.h (now with function pointers)
CGeneratorOptions(
filename = 'GLES2/gl2.h',
apiname = 'gles2',
profile = 'common',
versions = gles2onlyPat,
emitversions = allVersions,
defaultExtensions = None, # No default extensions
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + gles2PlatformStrings + apiEntryPrefixStrings + genDateCommentString,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto, # Core ES API functions are in the static link libraries
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GL_APICALL ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# GLES 3.1 / 3.0 / 2.0 extensions - GLES2/gl2ext.h
CGeneratorOptions(
filename = 'GLES2/gl2ext.h',
apiname = 'gles2',
profile = 'common',
versions = gles2onlyPat,
emitversions = None,
defaultExtensions = 'gles2', # Default extensions for GLES 2
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + apiEntryPrefixStrings + glextVersionStrings,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto,
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GL_APICALL ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# GLES 3.2 API - GLES3/gl32.h (now with function pointers)
CGeneratorOptions(
filename = 'GLES3/gl32.h',
apiname = 'gles2',
profile = 'common',
versions = gles2through32Pat,
emitversions = allVersions,
defaultExtensions = None, # No default extensions
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + gles3PlatformStrings + apiEntryPrefixStrings + genDateCommentString,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto, # Core ES API functions are in the static link libraries
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GL_APICALL ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# GLES 3.1 API - GLES3/gl31.h (now with function pointers)
CGeneratorOptions(
filename = 'GLES3/gl31.h',
apiname = 'gles2',
profile = 'common',
versions = gles2through31Pat,
emitversions = allVersions,
defaultExtensions = None, # No default extensions
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + gles3PlatformStrings + apiEntryPrefixStrings + genDateCommentString,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto, # Core ES API functions are in the static link libraries
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GL_APICALL ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# GLES 3.0 API - GLES3/gl3.h (now with function pointers)
CGeneratorOptions(
filename = 'GLES3/gl3.h',
apiname = 'gles2',
profile = 'common',
versions = gles2through30Pat,
emitversions = allVersions,
defaultExtensions = None, # No default extensions
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + gles3PlatformStrings + apiEntryPrefixStrings + genDateCommentString,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto, # Core ES API functions are in the static link libraries
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GL_APICALL ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# GLSC 2.0 API - GLSC2/glsc2.h
CGeneratorOptions(
filename = 'GLSC2/glsc2.h',
apiname = 'glsc2',
profile = 'common',
versions = gles2onlyPat,
emitversions = allVersions,
defaultExtensions = None, # No default extensions
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + glsc2PlatformStrings + apiEntryPrefixStrings + genDateCommentString,
genFuncPointers = False,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = False,
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GL_APICALL ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# GLSC 2.0 extensions - GLSC2/gl2ext.h
CGeneratorOptions(
filename = 'GLSC2/glsc2ext.h',
apiname = 'glsc2',
profile = 'common',
versions = gles2onlyPat,
emitversions = None,
defaultExtensions = 'glsc2', # Default extensions for GLSC 2
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + apiEntryPrefixStrings + genDateCommentString,
genFuncPointers = False,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = False,
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GL_APICALL ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# EGL API - EGL/egl.h (no function pointers, yet @@@)
CGeneratorOptions(
filename = 'EGL/egl.h',
apiname = 'egl',
profile = None,
versions = allVersions,
emitversions = allVersions,
defaultExtensions = None, # No default extensions
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + eglPlatformStrings + genDateCommentString,
genFuncPointers = False,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = False,
protectProtoStr = 'EGL_EGLEXT_PROTOTYPES',
apicall = 'EGLAPI ',
apientry = 'EGLAPIENTRY ',
apientryp = 'EGLAPIENTRYP '),
# EGL extensions - EGL/eglext.h (no function pointers, yet @@@)
CGeneratorOptions(
filename = 'EGL/eglext.h',
apiname = 'egl',
profile = None,
versions = allVersions,
emitversions = None,
defaultExtensions = 'egl', # Default extensions for EGL
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + eglPlatformStrings + eglextVersionStrings,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto,
protectProtoStr = 'EGL_EGLEXT_PROTOTYPES',
apicall = 'EGLAPI ',
apientry = 'EGLAPIENTRY ',
apientryp = 'EGLAPIENTRYP '),
# GLX 1.* API - GL/glx.h
CGeneratorOptions(
filename = 'GL/glx.h',
apiname = 'glx',
profile = None,
versions = allVersions,
emitversions = allVersions,
defaultExtensions = None, # No default extensions
addExtensions = None,
removeExtensions = None,
# add glXPlatformStrings?
prefixText = prefixStrings + genDateCommentString,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto,
protectProtoStr = 'GLX_GLXEXT_PROTOTYPES',
apicall = '',
apientry = '',
apientryp = ' *'),
# GLX 1.3+ API + extensions - GL/glxext.h (no function pointers, yet @@@)
CGeneratorOptions(
filename = 'GL/glxext.h',
apiname = 'glx',
profile = None,
versions = allVersions,
emitversions = glx13andLaterPat,
defaultExtensions = 'glx', # Default extensions for GLX
addExtensions = None,
removeExtensions = None,
# add glXPlatformStrings?
prefixText = prefixStrings + glxextVersionStrings,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto,
protectProtoStr = 'GLX_GLXEXT_PROTOTYPES',
apicall = '',
apientry = '',
apientryp = ' *'),
# WGL API + extensions - GL/wgl.h (no function pointers, yet @@@)
CGeneratorOptions(
filename = 'GL/wgl.h',
apiname = 'wgl',
profile = None,
versions = allVersions,
emitversions = allVersions,
defaultExtensions = 'wgl', # Default extensions for WGL
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + wglPlatformStrings + genDateCommentString,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto,
protectProtoStr = 'WGL_WGLEXT_PROTOTYPES',
apicall = '',
apientry = 'WINAPI ',
apientryp = 'WINAPI * '),
# WGL extensions - GL/wglext.h (no function pointers, yet @@@)
CGeneratorOptions(
filename = 'GL/wglext.h',
apiname = 'wgl',
profile = None,
versions = allVersions,
emitversions = None,
defaultExtensions = 'wgl', # Default extensions for WGL
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + wglPlatformStrings + wglextVersionStrings,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto,
protectProtoStr = 'WGL_WGLEXT_PROTOTYPES',
apicall = '',
apientry = 'WINAPI ',
apientryp = 'WINAPI * '),
# End of list
None
]
# create error/warning & diagnostic files
if (errFilename):
errWarn = open(errFilename,'w')
else:
errWarn = sys.stderr
diag = open(diagFilename, 'w')
def genHeaders():
# Loop over targets, building each
generated = 0
for genOpts in buildList:
if (genOpts == None):
break
if (target and target != genOpts.filename):
# write('*** Skipping', genOpts.filename)
continue
write('*** Building', genOpts.filename)
generated = generated + 1
startTimer()
gen = COutputGenerator(errFile=errWarn,
warnFile=errWarn,
diagFile=diag)
reg.setGenerator(gen)
reg.apiGen(genOpts)
write('** Generated', genOpts.filename)
endTimer('Time to generate ' + genOpts.filename + ' =')
if (target and generated == 0):
write('Failed to generate target:', target)
if (debug):
pdb.run('genHeaders()')
elif (profile):
import cProfile, pstats
cProfile.run('genHeaders()', 'profile.txt')
p = pstats.Stats('profile.txt')
p.strip_dirs().sort_stats('time').print_stats(50)
else:
genHeaders()
-577
View File
@@ -1,577 +0,0 @@
#!/usr/bin/env python3
#
# Copyright 2013-2025 The Khronos Group Inc.
# SPDX-License-Identifier: Apache-2.0
import sys, time, pdb, string, cProfile
from reg import *
# debug - start header generation in debugger
# dump - dump registry after loading
# profile - enable Python profiling
# protect - whether to use #ifndef protections
# registry <filename> - use specified XML registry instead of gl.xml
# target - string name of target header, or all targets if None
# timeit - time length of registry loading & header generation
# validate - validate return & parameter group tags against <group>
debug = False
dump = False
profile = False
protect = True
target = None
timeit = False
validate= False
# Default input / log files
errFilename = None
diagFilename = 'diag.txt'
regFilename = 'gl.xml'
# Simple timer functions
startTime = None
def startTimer():
global startTime
startTime = time.process_time()
def endTimer(msg):
global startTime
endTime = time.process_time()
if (timeit):
write(msg, endTime - startTime)
startTime = None
# Turn a list of strings into a regexp string matching exactly those strings
def makeREstring(list):
return '^(' + '|'.join(list) + ')$'
# These are "mandatory" OpenGL ES 1 extensions, to
# be included in the core GLES/gl.h header.
es1CoreList = [
'GL_OES_read_format',
'GL_OES_compressed_paletted_texture',
'GL_OES_point_size_array',
'GL_OES_point_sprite'
]
# Descriptive names for various regexp patterns used to select
# versions and extensions
allVersions = allExtensions = '.*'
noVersions = noExtensions = None
gl12andLaterPat = r'1\.[2-9]|[234]\.[0-9]'
gles2onlyPat = r'2\.[0-9]'
gles2through30Pat = r'2\.[0-9]|3\.0'
gles2through31Pat = r'2\.[0-9]|3\.[01]'
gles2through32Pat = r'2\.[0-9]|3\.[012]'
es1CorePat = makeREstring(es1CoreList)
# Extensions in old glcorearb.h but not yet tagged accordingly in gl.xml
glCoreARBPat = None
glx13andLaterPat = r'1\.[3-9]'
# Copyright text prefixing all headers (list of strings).
prefixStrings = [
'/*',
'** Copyright 2013-2025 The Khronos Group Inc.',
'** SPDX-' + 'License-Identifier: MIT',
'**',
'** This header is generated from the Khronos OpenGL / OpenGL ES XML',
'** API Registry. The current version of the Registry, generator scripts',
'** used to make the header, and the header can be found at',
'** https://github.com/KhronosGroup/OpenGL-Registry',
'*/',
''
]
# glext.h / glcorearb.h define calling conventions inline (no GL *platform.h)
glExtPlatformStrings = [
'#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)',
'#ifndef WIN32_LEAN_AND_MEAN',
'#define WIN32_LEAN_AND_MEAN 1',
'#endif',
'#include <windows.h>',
'#endif',
'',
'#ifndef APIENTRY',
'#define APIENTRY',
'#endif',
'#ifndef APIENTRYP',
'#define APIENTRYP APIENTRY *',
'#endif',
'#ifndef GLAPI',
'#define GLAPI extern',
'#endif',
''
]
glCorearbPlatformStrings = glExtPlatformStrings + [
'/* glcorearb.h is for use with OpenGL core profile implementations.',
'** It should should be placed in the same directory as gl.h and',
'** included as <GL/glcorearb.h>.',
'**',
'** glcorearb.h includes only APIs in the latest OpenGL core profile',
'** implementation together with APIs in newer ARB extensions which ',
'** can be supported by the core profile. It does not, and never will',
'** include functionality removed from the core profile, such as',
'** fixed-function vertex and fragment processing.',
'**',
'** Do not #include both <GL/glcorearb.h> and either of <GL/gl.h> or',
'** <GL/glext.h> in the same source file.',
'*/',
''
]
# wglext.h needs Windows include
wglPlatformStrings = [
'#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)',
'#define WIN32_LEAN_AND_MEAN 1',
'#include <windows.h>',
'#endif',
'',
]
# Different APIs use different *platform.h files to define calling
# conventions
gles1PlatformStrings = [ '#include <GLES/glplatform.h>', '' ]
gles2PlatformStrings = [ '#include <GLES2/gl2platform.h>', '' ]
gles3PlatformStrings = [ '#include <GLES3/gl3platform.h>', '' ]
glsc2PlatformStrings = [ '#include <GLSC2/gl2platform.h>', '' ]
eglPlatformStrings = [ '#include <EGL/eglplatform.h>', '' ]
# GLES headers have a small addition to calling convention headers for function pointer typedefs
apiEntryPrefixStrings = [
'#ifndef GL_APIENTRYP',
'#define GL_APIENTRYP GL_APIENTRY*',
'#endif',
''
]
# GLES 2/3 core API headers use a different protection mechanism for
# prototypes, per bug 14206.
glesProtoPrefixStrings = [
'#ifndef GL_GLES_PROTOTYPES',
'#define GL_GLES_PROTOTYPES 1',
'#endif',
''
]
# Insert generation date in a comment for headers not having *GLEXT_VERSION macros
genDateCommentString = [
format('/* Generated on date %s */' % time.strftime('%Y%m%d')),
''
]
# GL_GLEXT_VERSION is defined only in glext.h and gl2ext.h
glextVersionStrings = [
format('#define GL_GLEXT_VERSION %s' % time.strftime('%Y%m%d')),
''
]
# WGL_WGLEXT_VERSION is defined only in wglext.h
wglextVersionStrings = [
format('#define WGL_WGLEXT_VERSION %s' % time.strftime('%Y%m%d')),
''
]
# GLX_GLXEXT_VERSION is defined only in glxext.h
glxextVersionStrings = [
format('#define GLX_GLXEXT_VERSION %s' % time.strftime('%Y%m%d')),
''
]
# This is a bad but functional workaround for a structural problem in the scripts
# identified in https://github.com/KhronosGroup/OpenGL-Registry/pull/186#issuecomment-416196246
glextKHRplatformStrings = [
'#include <KHR/khrplatform.h>',
''
]
# EGL_EGLEXT_VERSION is defined only in eglext.h
eglextVersionStrings = [
format('#define EGL_EGLEXT_VERSION %s' % time.strftime('%Y%m%d')),
''
]
# Defaults for generating re-inclusion protection wrappers (or not)
protectFile = protect
protectFeature = protect
protectProto = protect
buildList = [
# GL API 1.2+ + extensions - GL/glext.h
CGeneratorOptions(
filename = '../api/GL/glext.h',
apiname = 'gl',
profile = 'compatibility',
versions = allVersions,
emitversions = gl12andLaterPat,
defaultExtensions = 'gl', # Default extensions for GL
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + glExtPlatformStrings + glextVersionStrings + glextKHRplatformStrings,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto,
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GLAPI ',
apientry = 'APIENTRY ',
apientryp = 'APIENTRYP '),
# GL core profile + extensions - GL/glcorearb.h
CGeneratorOptions(
filename = '../api/GL/glcorearb.h',
apiname = 'gl',
profile = 'core',
versions = allVersions,
emitversions = allVersions,
defaultExtensions = 'glcore', # Default extensions for GL core profile (only)
addExtensions = glCoreARBPat,
removeExtensions = None,
prefixText = prefixStrings + glCorearbPlatformStrings,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto,
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GLAPI ',
apientry = 'APIENTRY ',
apientryp = 'APIENTRYP '),
# GLES 1.x API + mandatory extensions - GLES/gl.h (no function pointers)
CGeneratorOptions(
filename = '../api/GLES/gl.h',
apiname = 'gles1',
profile = 'common',
versions = allVersions,
emitversions = allVersions,
defaultExtensions = None, # No default extensions
addExtensions = es1CorePat, # Add mandatory ES1 extensions in GLES1/gl.h
removeExtensions = None,
prefixText = prefixStrings + gles1PlatformStrings + genDateCommentString,
genFuncPointers = False,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = False, # Core ES API functions are in the static link libraries
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GL_API ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# GLES 1.x extensions - GLES/glext.h
CGeneratorOptions(
filename = '../api/GLES/glext.h',
apiname = 'gles1',
profile = 'common',
versions = allVersions,
emitversions = noVersions,
defaultExtensions = 'gles1', # Default extensions for GLES 1
addExtensions = None,
removeExtensions = es1CorePat, # Remove mandatory ES1 extensions in GLES1/glext.h
prefixText = prefixStrings + apiEntryPrefixStrings + genDateCommentString,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto,
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GL_API ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# GLES 2.0 API - GLES2/gl2.h (now with function pointers)
CGeneratorOptions(
filename = '../api/GLES2/gl2.h',
apiname = 'gles2',
profile = 'common',
versions = gles2onlyPat,
emitversions = allVersions,
defaultExtensions = None, # No default extensions
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + gles2PlatformStrings + apiEntryPrefixStrings + glesProtoPrefixStrings + genDateCommentString,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = 'nonzero', # Core ES API functions are in the static link libraries
protectProtoStr = 'GL_GLES_PROTOTYPES',
apicall = 'GL_APICALL ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# GLES 3.1 / 3.0 / 2.0 extensions - GLES2/gl2ext.h
CGeneratorOptions(
filename = '../api/GLES2/gl2ext.h',
apiname = 'gles2',
profile = 'common',
versions = gles2onlyPat,
emitversions = None,
defaultExtensions = 'gles2', # Default extensions for GLES 2
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + apiEntryPrefixStrings + glextVersionStrings,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto,
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GL_APICALL ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# GLES 3.2 API - GLES3/gl32.h (now with function pointers)
CGeneratorOptions(
filename = '../api/GLES3/gl32.h',
apiname = 'gles2',
profile = 'common',
versions = gles2through32Pat,
emitversions = allVersions,
defaultExtensions = None, # No default extensions
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + gles3PlatformStrings + apiEntryPrefixStrings + glesProtoPrefixStrings + genDateCommentString,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = 'nonzero', # Core ES API functions are in the static link libraries
protectProtoStr = 'GL_GLES_PROTOTYPES',
apicall = 'GL_APICALL ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# GLES 3.1 API - GLES3/gl31.h (now with function pointers)
CGeneratorOptions(
filename = '../api/GLES3/gl31.h',
apiname = 'gles2',
profile = 'common',
versions = gles2through31Pat,
emitversions = allVersions,
defaultExtensions = None, # No default extensions
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + gles3PlatformStrings + apiEntryPrefixStrings + glesProtoPrefixStrings + genDateCommentString,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = 'nonzero', # Core ES API functions are in the static link libraries
protectProtoStr = 'GL_GLES_PROTOTYPES',
apicall = 'GL_APICALL ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# GLES 3.0 API - GLES3/gl3.h (now with function pointers)
CGeneratorOptions(
filename = '../api/GLES3/gl3.h',
apiname = 'gles2',
profile = 'common',
versions = gles2through30Pat,
emitversions = allVersions,
defaultExtensions = None, # No default extensions
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + gles3PlatformStrings + apiEntryPrefixStrings + glesProtoPrefixStrings + genDateCommentString,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = 'nonzero', # Core ES API functions are in the static link libraries
protectProtoStr = 'GL_GLES_PROTOTYPES',
apicall = 'GL_APICALL ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# GLSC 2.0 API - GLSC2/glsc2.h
CGeneratorOptions(
filename = '../api/GLSC2/glsc2.h',
apiname = 'glsc2',
profile = 'common',
versions = gles2onlyPat,
emitversions = allVersions,
defaultExtensions = None, # No default extensions
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + glsc2PlatformStrings + apiEntryPrefixStrings + genDateCommentString,
genFuncPointers = False,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = False,
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GL_APICALL ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# GLSC 2.0 extensions - GLSC2/gl2ext.h
CGeneratorOptions(
filename = '../api/GLSC2/glsc2ext.h',
apiname = 'glsc2',
profile = 'common',
versions = gles2onlyPat,
emitversions = None,
defaultExtensions = 'glsc2', # Default extensions for GLSC 2
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + apiEntryPrefixStrings + genDateCommentString,
genFuncPointers = False,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = False,
protectProtoStr = 'GL_GLEXT_PROTOTYPES',
apicall = 'GL_APICALL ',
apientry = 'GL_APIENTRY ',
apientryp = 'GL_APIENTRYP '),
# GLX 1.* API - GL/glx.h (experimental)
CGeneratorOptions(
filename = '../api/GL/glx.h',
apiname = 'glx',
profile = None,
versions = allVersions,
emitversions = allVersions,
defaultExtensions = None, # No default extensions
addExtensions = None,
removeExtensions = None,
# add glXPlatformStrings?
prefixText = prefixStrings + genDateCommentString,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto,
protectProtoStr = 'GLX_GLXEXT_PROTOTYPES',
apicall = '',
apientry = '',
apientryp = ' *'),
# GLX 1.3+ API + extensions - GL/glxext.h (no function pointers, yet @@@)
CGeneratorOptions(
filename = '../api/GL/glxext.h',
apiname = 'glx',
profile = None,
versions = allVersions,
emitversions = glx13andLaterPat,
defaultExtensions = 'glx', # Default extensions for GLX
addExtensions = None,
removeExtensions = None,
# add glXPlatformStrings?
prefixText = prefixStrings + glxextVersionStrings,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto,
protectProtoStr = 'GLX_GLXEXT_PROTOTYPES',
apicall = '',
apientry = '',
apientryp = ' *'),
# WGL API + extensions - GL/wgl.h (experimenta; no function pointers, yet @@@)
CGeneratorOptions(
filename = '../api/GL/wgl.h',
apiname = 'wgl',
profile = None,
versions = allVersions,
emitversions = allVersions,
defaultExtensions = 'wgl', # Default extensions for WGL
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + wglPlatformStrings + genDateCommentString,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto,
protectProtoStr = 'WGL_WGLEXT_PROTOTYPES',
apicall = '',
apientry = 'WINAPI ',
apientryp = 'WINAPI * '),
# WGL extensions - GL/wglext.h (no function pointers, yet @@@)
CGeneratorOptions(
filename = '../api/GL/wglext.h',
apiname = 'wgl',
profile = None,
versions = allVersions,
emitversions = None,
defaultExtensions = 'wgl', # Default extensions for WGL
addExtensions = None,
removeExtensions = None,
prefixText = prefixStrings + wglPlatformStrings + wglextVersionStrings,
genFuncPointers = True,
protectFile = protectFile,
protectFeature = protectFeature,
protectProto = protectProto,
protectProtoStr = 'WGL_WGLEXT_PROTOTYPES',
apicall = '',
apientry = 'WINAPI ',
apientryp = 'WINAPI * '),
# End of list
None
]
def genHeaders():
# Loop over targets, building each
generated = 0
for genOpts in buildList:
if (genOpts == None):
break
if (target and target != genOpts.filename):
# write('*** Skipping', genOpts.filename)
continue
write('*** Building', genOpts.filename)
generated = generated + 1
startTimer()
gen = COutputGenerator(errFile=errWarn,
warnFile=errWarn,
diagFile=diag)
reg.setGenerator(gen)
reg.apiGen(genOpts)
write('** Generated', genOpts.filename)
endTimer('Time to generate ' + genOpts.filename + ' =')
if (target and generated == 0):
write('Failed to generate target:', target)
if __name__ == '__main__':
i = 1
while (i < len(sys.argv)):
arg = sys.argv[i]
i = i + 1
if (arg == '-debug'):
write('Enabling debug (-debug)', file=sys.stderr)
debug = True
elif (arg == '-dump'):
write('Enabling dump (-dump)', file=sys.stderr)
dump = True
elif (arg == '-noprotect'):
write('Disabling inclusion protection in output headers', file=sys.stderr)
protect = False
elif (arg == '-profile'):
write('Enabling profiling (-profile)', file=sys.stderr)
profile = True
elif (arg == '-registry'):
regFilename = sys.argv[i]
i = i+1
write('Using registry ', regFilename, file=sys.stderr)
elif (arg == '-time'):
write('Enabling timing (-time)', file=sys.stderr)
timeit = True
elif (arg == '-validate'):
write('Enabling group validation (-validate)', file=sys.stderr)
validate = True
elif (arg[0:1] == '-'):
write('Unrecognized argument:', arg, file=sys.stderr)
exit(1)
else:
target = arg
write('Using target', target, file=sys.stderr)
# Load & parse registry
reg = Registry()
startTimer()
tree = etree.parse(regFilename)
endTimer('Time to make ElementTree =')
startTimer()
reg.loadElementTree(tree)
endTimer('Time to parse ElementTree =')
if (validate):
reg.validateGroups()
if (dump):
write('***************************************')
write('Performing Registry dump to regdump.txt')
write('***************************************')
reg.dumpReg(filehandle = open('regdump.txt','w'))
# create error/warning & diagnostic files
if (errFilename):
errWarn = open(errFilename,'w')
else:
errWarn = sys.stderr
diag = open(diagFilename, 'w')
if (debug):
pdb.run('genHeaders()')
elif (profile):
import cProfile, pstats
cProfile.run('genHeaders()', 'profile.txt')
p = pstats.Stats('profile.txt')
p.strip_dirs().sort_stats('time').print_stats(50)
else:
genHeaders()
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,729 +0,0 @@
This is the registry of GLX opcodes, error codes, and event codes. It is
very rarely modified since there is almost no interest in supporting GLX
with modern OpenGL features, and the work of extending the XML schema to
express it is not worthwhile.
When new GLX protocol is needed for extension specifications, allocate it
here and reflect it in the extension specification document as well as, if
appropriate, glx.xml.
Reserved opcode ranges assigned to vendors, and in some cases, opcodes
actually assigned within that range are tracked here. Not all opcodes used
by vendors are known.
GLX Opcodes (8 bits)
====================
1-15 GLX 1.0
16 Vendor Private
17 Vendor Private with Reply
18-20 GLX 1.1
21-32 GLX 1.3
33 glXSetClientInfoARB (GLX_ARB_create_context)
34 glXCreateContextAttribsARB (GLX_ARB_create_context)
35 glXSetClientInfo2ARB (GLX_ARB_create_context)
GLX Vendor Private / Vendor Private with Reply opcodes (32-bits)
(first 4 bytes past standard X header)
================================================================
0 255 EXT (various - contact SGI)
256 271 HP (originally Compaq)
(272-511 unused)
512 575 E&S
(576-1023 unused)
1024 1269 EXT (various - contact SGI)
1024 GLX_EXT_import_context
1270 1275 NV_register_combiners
1276 1280 NV_fence
1281 1292 NVIDIA (use TBD; was intended for NV_vertex_program)
1293 1308 NV_vertex_program / ARB_vertex_program / ARB_fragment_program
1309 NVIDIA (use TBD)
1310 1311 NV_fragment_program
1312 NV_fence
1313 1318 GLX_NV_video_output
1319 1320 NV_vertex_program
1321 1326 NVIDIA (use TBD)
1327 NV_register_combiners2
1328 1329 EXT_timer_query
1330 1331 GLX_EXT_texture_from_pixmap
1332 1339 NV_present_video
1340 NVIDIA (use TBD)
1341 GLX_NV_delay_before_swap
1342 1359 NVIDIA (use TBD)
1360 GLX_NV_copy_image
1361 1364 NVIDIA (use TBD)
1365 1368 NV_gpu_program4
1369 1386 NVIDIA (use TBD)
1387 1388 GLX_NV_copy_buffer
1389 1399 NVIDIA (use TBD)
1400 1415 NV_video_capture
1416 GLX_EXT_swap_control
1417 1420 NVIDIA (use TBD)
1421 OES_single_precision (Khronos OpenGL ES 1.0)
1422 1428 EXT_framebuffer_object
(1429-2047 unused)
2048 2064 SUN
3000 3999 IBM
4096 5151 SGI (4106-5151 unused)
4096 SGIS_detail_texture
4097 SGIS_sharpen_texture
4098 4100 SGI_color_table
4101 SGIS_texture_filter4
4102 4104 SGIX_instruments
4105 SGIX_flush_raster
5152 5184 Mesa (unknown use)
8192 8207 HP
16384 16399 ADD
65536 66575 SGI (various GLX extensions)
65536 GLX_SGI_swap_control
65537 GLX_SGI_make_current_read
65538 65539 GLX_SGIX_video_source
65540 65542 GLX_SGIX_fbconfig
65543 65546 GLX_SGIX_pbuffer
65547 GLX_SGIX_swap_group
65548 65549 GLX_SGIX_swap_barrier
65550 65553 GLX_SGIX_hyperpipe_group
65554 GLX_SGIX_query_board_num (internal, for shm)
OpenGL Single Opcodes (8 Bits)
===============================
167-up Reserved
0 146 OpenGL 1.0/1.1 core
147 159 OpenGL 1.2 core
160 160 ARB_texture_compression
161 166 ARB_occlusion_query
167 178 ARB_shader_objects
179 181 ARB_vertex_shader
182 183 EXT_gpu_shader4
184 185 NV_vertex_program4
186 194 ARB_vertex_buffer_object
195 202 OpenGL 2.0 core
203 204 EXT_texture_integer
205 205 ARB_map_buffer_range
206 209 ARB_vertex_array_object
210 212 EXT_draw_buffers2
213 214 OpenGL 3.0 core
215 220 ARB_uniform_buffer_object
221 ARB_copy_buffer
OpenGL Rendering Opcodes (16 Bits)
==================================
0-1007 Reserved to ARB (231-1007 unused)
0 191 OpenGL 1.0 core (140 deprecated?)
192 194 OpenGL 1.1 core
195 196 OpenGL 1.2 core
197 213 ARB_multitexture
214 219 ARB_texture_compression
220 228 ARB_vertex_blend
229 ARB_multisample
230 ARB_window_pos
231 232 ARB_occlusion_query
233 ARB_draw_buffers
234 ARB_color_buffer_float
235 237 ARB_framebuffer_object
238 264 ARB_shader_object
265 ARB_vertex_shader
266 268 ARB_geometry_shader4
269 277 EXT_gpu_shader4
278 289 NV_vertex_program4
290 301 ARB_vertex_buffer_object
302 304 ARB_stencil_two_side
305 310 OpenGL 2.1 core
311 345 ARB_pixel_buffer_object
346 347 EXT_texture_integer
348 349 NV_conditional_render
350 351 ARB_vertex_array_object
352 354 EXT_draw_buffers2
355 363 OpenGL 3.0 core
364 365 NV_primitive_restart
366 ARB_uniform_buffer_object
367 ARB_texture_buffer_object
1008-1023 Reserved to IBM (unknown usage)
1024-1039 Reserved to HP (originally Compaq) (unknown usage)
1040-2047 Unused
2048-3071 Reserved to SGI (2083-3071 unused)
2048 2049 SGIS_multisample
2050 SGIX_tag_sample_buffer
2051 SGIS_detail_texture
2052 SGIS_sharpen_texture
2053 2056 SGI_color_table
2057 2058 SGIS_texture4D
2059 SGIX_pixel_texture
2060 2063 SGIX_sprite
2064 SGIS_texture_filter4
2065 2066 EXT_point_parameters/SGIS_point_parameters
2067 SGIS_fog_function
2068 unused?
2069 2070 SGIX_instruments
2071 SGIX_reference_plane
2072 SGIX_framezoom
2073 2076 unused?
2077 SGIX_instruments
2078 2081 SGIX_list_priority
2082 SGIS_texture_color_mask
3072-4095 Reserved to ARB (unused)
4096-5151 Reserved to EXT (4460-5151 unused)
4096 EXT_blend_color/1.2
4097 EXT_blend_minmax/1.2
4098 EXT_polygon_offset
4099 4100 EXT_subtexture
4101 4109 EXT_convolution/1.2
4110 4113 EXT_histogram/1.2
4114 EXT_texture3D/1.2
4115 EXT_subtexture/1.2
4116 EXT_vertex_array
4117 4118 EXT_texture_object/1.1
4119 4123 EXT_copy_texture/1.1
4124 4125 EXT_fog_coord
4126 4133 EXT_secondary_color
4134 EXT_blend_func_separate
4135 EXT_vertex_weighting
4136 4142 NV_register_combiners
4143 4144 NV_fence (4144 retired, used to be for FinishFence)
4145 4179 NVIDIA (use TBD; was intended for NV_vertex_program)
4180 4214 NV_vertex_program
4215 4217 ARB_vertex_program
4218 4219 NV_fragment_program
4220 EXT_stencil_two_side
4221 4222 NV_point_sprite
4223 EXT_stencil_clear_tag
4225 EXT_polygon_offset_clamp
4228 EXT_blend_equation_separate
4229 EXT_depth_bounds_test
4230 4239 ARB_vertex_program
4240 4264 NV_half_float
4265 4280 NVIDIA (use TBD)
4281 4282 EXT_gpu_program_parameters
4283 4285 NV_depth_buffer_float
4286 4290 NVIDIA (use TBD)
4291 NV_copy_image
4292 4293 EXT_texture_integer
4294 4307 NVIDIA (use TBD)
4308 4312 OES_single_precision (Khronos OpenGL ES 1.0)
4313 4315 SUN (use TBD)
4316 4325 EXT_framebuffer_object
4326 4329 ARB_matrix_palette
4330 EXT_framebuffer_blit
4331 EXT_framebuffer_multisample
4332 4347 NVIDIA (use TBD, bug 6720)
4348 NV_texture_barrier
4349 4459 NVIDIA (use TBD, bug 6720)
8192-8207 Reserved to HP (unknown usage)
16384-16415 Reserved to SUN (unknown usage)
24576-24607 Reserved to ADD (unknown usage)
GLX Enumerateds (32 Bits)
=========================
0x0-0xFF Reserved to EXT (visual attribute names)
0x1 0x11 GLX 1.0 (attribute names)
0x12 0x1F unused?
0x20 GLX_EXT_visual_rating (attribute names)
0x21 unused?
0x22 0x28 GLX_EXT_visual_info (attribute names)
0x1F00-0x1F02 Reserved to ARB (shared with WGL)
0x1F00 0x1F02 GLX_AMD_gpu_association
0x2070-0x209F Reserved to ARB (shared with WGL)
0x2090 0x2094 GLX_ARB_create_context
0x2095 GL_ARB_vertex_buffer_object
0x2097 0x2098 GLX_ARB_context_flush_control
0x20A0-0x219F Reserved to NVIDIA (shared with WGL)
0x20B0 GLX_NV_float_buffer
0x20B1 GLX_EXT_fbconfig_packed_float
0x20B2 GLX_ARB_framebuffer_sRGB (nee EXT)
0x20B3 GLX_NV_multisample_coverage
0x20B9 GLX_ARB_fbconfig_float
0x20C3 0x20CC GLX_NV_video_out
0x20CD 0x20CF GLX_NV_video_capture
0x20D0 0x20EB GLX_EXT_texture_from_pixmap
0x20F0 GLX_NV_present_video
0x20F1 0x20F2 GLX_EXT_swap_control
0x20F3 GLX_EXT_swap_control_tear
0x20F4 GLX_EXT_buffer_age
0x20F5 GLX_EXT_stereo_tree
0x20F6 GLX_EXT_libglvnd
0x20F7 GLX_NV_robustness_video_memory_purge
0x21A0-0x21AF Reserved to AMD (shared with WGL)
0x21A2 0x21A8 GLX_AMD_gpu_association
0x31B3 Reserved to ARB (shared with WGL)
0x31B3 GLX_ARB_create_context_no_error
0x8000-0x800F Reserved to EXT (0x800E-0x800F unused)
0x8000 0x8009 GLX_EXT_visual_info
0x800A 0x800C GLX_EXT_import_context
0x800D GLX_EXT_visual_rating
0x8010-0x803F Reserved to SGI (0x8029-0x803F unused)
0x8010 0x8015 GLX_SGIX_fbconfig
0x8016 0x8023 GLX_SGIX_pbuffer
0x8024 GLX_SGIX_dm_buffer
0x8025 GLX_SGIS_blended_overlay
0x8026 0x8027 GLX_SGIS_shared_multisample
0x8028 GLX_SGIX_visual_select_group
0x8030 GLX_SGIX_hyperpipe
0x8040-0x804F Reserved to OpenGL ARB
0x8040 0x8041 GLX 1.3
0x8050-0x805F Reserved to 3Dfx
0x8050 0x8051 GLX_3DFX_multisample
0x8060-0x806F Reserved to OpenML SIG
0x8060 0x8063 GLX_OML_swap_method
0x8070-0x816F Reserved to NVIDIA
0x8170-0x817F Reserved to SUN
0x8180-0x818F Reserved to Intel (0x818F unused)
0x8180 0x8182 GLX_INTEL_swap_event
0x8183 0x818E GLX_MESA_query_renderer
0x8250-0x826F Reserved to ARB (Shared with GL and WGL)
0x8252 GLX_ARB_create_context_robustness
0x8256 GLX_ARB_create_context_robustness
0x8261 GLX_ARB_create_context_robustness
0x9126 GLX_ARB_create_context_profile (shared with WGL)
100000-100011 Reserved to SGI (100002-100011 unused)
100000 100001 GLX_SGIS_multisample/GLX_ARB_multisample
GLX Error Codes
===============
(Extension reservations for vendor extensions should start sufficiently
high so they don't interfere with GLX core and GLX ARB extensions.)
0 GLXBadContext OpenGL ARB (GLX core)
1 GLXBadContextState OpenGL ARB (GLX core)
2 GLXBadDrawable OpenGL ARB (GLX core)
3 GLXBadPixmap OpenGL ARB (GLX core)
4 GLXBadContextTag OpenGL ARB (GLX core)
5 GLXBadCurrentWindow OpenGL ARB (GLX core)
6 GLXBadRenderRequest OpenGL ARB (GLX core)
7 GLXBadLargeRequest OpenGL ARB (GLX core)
8 GLXUnsupportedPrivateRequest OpenGL ARB (GLX core)
9 GLXBadFBConfig OpenGL ARB (GLX core)
10 GLXBadPbuffer OpenGL ARB (GLX core)
11 GLXBadCurrentDrawable OpenGL ARB (GLX core)
12 GLXBadWindow OpenGL ARB (GLX core)
13 GLXBadProfileARB OpenGL ARB (GLX_ARB_create_context)
GLX Event Masks
===============
0x08000000 GLX 1.3 / SGIX_pbuffer
0x04000000 Intel (INTEL_swap_event)
GLX Event Codes
===============
(The X.org/Mesa GLX implementation derived from the SGI Sample
Implementation has __GLX_NUMBER_EVENTS == 17, suggesting that vendor
events should be allocated downwards from the first free value <= 16
(14), and core GLX events allocated upwards).
0 OpenGL ARB (GLX_PbufferClobber in GLX 1.3)
15 Intel (GLX_BufferSwapINTEL)
16 SGI (GLX_PbufferClobberSGIX)
64 SGI
GLX protocol encoding for GL >= 2.0
===================================
(This section - this whole file really - should eventually be incorporated
in a proper update of the GLX protocol specification.)
OpenGL 2.0
----------
DeleteShader
1 CARD8 opcode (X assigned)
1 195 GLX opcode
2 3 request length
4 GLX_CONTEXT_TAG context tag
4 CARD32 shader
IsShader
1 CARD8 opcode (X assigned)
1 196 GLX opcode
2 3 request length
4 GLX_CONTEXT_TAG context tag
4 CARD32 shader
=>
1 1 reply
1 unused
2 CARD16 sequence number
4 0 reply length
4 BOOL32 return value
20 unused
IsProgram
1 CARD8 opcode (X assigned)
1 197 GLX opcode
2 3 request length
4 GLX_CONTEXT_TAG context tag
4 CARD32 program
=>
1 1 reply
1 unused
2 CARD16 sequence number
4 0 reply length
4 BOOL32 return value
20 unused
GetShaderiv
1 CARD8 opcode (X assigned)
1 198 GLX opcode
2 4 request length
4 GLX_CONTEXT_TAG context tag
4 CARD32 program
4 CARD32 pname
=>
1 1 reply
1 unused
2 CARD16 sequence number
4 m reply length, m = (n == 1 ? 0 : n)
4 unused
4 CARD32 n
if (n == 1) this follows:
4 CARD32 params
12 unused
otherwise this follows:
16 unused
n*4 LISTOFCARD32 params
Note that n may be 0, indicating that a GL error occurred.
GetProgramiv
1 CARD8 opcode (X assigned)
1 199 GLX opcode
2 4 request length
4 GLX_CONTEXT_TAG context tag
4 CARD32 program
4 CARD32 pname
=>
1 1 reply
1 unused
2 CARD16 sequence number
4 m reply length, m = (n == 1 ? 0 : n)
4 unused
4 CARD32 n
if (n == 1) this follows:
4 CARD32 params
12 unused
otherwise this follows:
16 unused
n*4 LISTofCARD32 params
Note that n may be 0, indicating that a GL error occurred.
GetShaderInfoLog
1 CARD8 opcode (X assigned)
1 200 GLX opcode
2 4 request length
4 GLX_CONTEXT_TAG context tag
4 CARD32 shader
4 CARD32 bufSize
=>
1 1 reply
1 unused
2 CARD16 sequence number
4 m reply length, m = (n + p) / 4
4 unused
4 CARD32 n, n = length + 1
16 unused
n LISTofBYTE infoLog
p unused, p=pad(n)
Note that n may be 0, indicating that a GL error occurred.
GetProgramInfoLog
1 CARD8 opcode (X assigned)
1 201 GLX opcode
2 4 request length
4 GLX_CONTEXT_TAG context tag
4 CARD32 program
4 CARD32 bufSize
=>
1 1 reply
1 unused
2 CARD16 sequence number
4 m reply length, m = (n + p) / 4
4 unused
4 CARD32 n, n = length + 1
16 unused
n LISTofBYTE infoLog
p unused, p=pad(n)
Note that n may be 0, indicating that a GL error occurred.
DeleteProgram
1 CARD8 opcode (X assigned)
1 202 GLX opcode
2 3 request length
4 GLX_CONTEXT_TAG context tag
4 CARD32 program
OpenGL 2.1
----------
UniformMatrix2x3fv
2 16+4*count*2*3 rendering command length
2 305 rendering command opcode
4 CARD32 location
4 CARD32 count
1 BOOL transpose
3 unused
4*count*2*3 LISTofFLOAT32 value
If the command is encoded in a glXRenderLarge request, the
command opcode and command length fields above are expanded to
4 bytes each:
4 20+4*count*2*2 rendering command length
4 305 rendering command opcode
UniformMatrix3x2fv
2 16+4*count*3*2 rendering command length
2 306 rendering command opcode
4 CARD32 location
4 CARD32 count
1 BOOL transpose
3 unused
4*count*3*2 LISTofFLOAT32 value
If the command is encoded in a glXRenderLarge request, the
command opcode and command length fields above are expanded to
4 bytes each:
4 20+4*count*3*2 rendering command length
4 306 rendering command opcode
UniformMatrix2x4fv
2 16+4*count*2*4 rendering command length
2 307 rendering command opcode
4 CARD32 location
4 CARD32 count
1 BOOL transpose
3 unused
4*count*2*4 LISTofFLOAT32 value
If the command is encoded in a glXRenderLarge request, the
command opcode and command length fields above are expanded to
4 bytes each:
4 20+4*count*2*4 rendering command length
4 307 rendering command opcode
UniformMatrix4x2fv
2 16+4*count*4*2 rendering command length
2 308 rendering command opcode
4 CARD32 location
4 CARD32 count
1 BOOL transpose
3 unused
4*count*4*2 LISTofFLOAT32 value
If the command is encoded in a glXRenderLarge request, the
command opcode and command length fields above are expanded to
4 bytes each:
4 20+4*count*4*2 rendering command length
4 308 rendering command opcode
UniformMatrix3x4fv
2 16+4*count*3*4 rendering command length
2 309 rendering command opcode
4 CARD32 location
4 CARD32 count
1 BOOL transpose
3 unused
4*count*3*4 LISTofFLOAT32 value
If the command is encoded in a glXRenderLarge request, the
command opcode and command length fields above are expanded to
4 bytes each:
4 20+4*count*3*4 rendering command length
4 309 rendering command opcode
UniformMatrix4x3fv
2 16+4*count*4*3 rendering command length
2 310 rendering command opcode
4 CARD32 location
4 CARD32 count
1 BOOL transpose
3 unused
4*count*4*3 LISTofFLOAT32 value
If the command is encoded in a glXRenderLarge request, the
command opcode and command length fields above are expanded to
4 bytes each:
4 20+4*count*4*3 rendering command length
4 310 rendering command opcode
OpenGL 3.0
----------
The following rendering commands are sent to the sever as part of a
glXRender request:
BindBufferRange
2 32 rendering command length
2 355 rendering command opcode
8 INT64 offset
8 INT64 size
4 ENUM target
4 CARD32 index
4 CARD32 buffer
BindBufferBase
2 16 rendering command length
2 356 rendering command opcode
4 ENUM target
4 CARD32 index
4 CARD32 buffer
BeginTransformFeedback
2 8 rendering command length
2 357 rendering command opcode
4 ENUM primitiveMode
EndTransformFeedback
2 4 rendering command length
2 358 rendering command opcode
ClearBufferfi
2 20 rendering command length
2 360 rendering command opcode
4 ENUM buffer
4 CARD32 drawbuffer
4 FLOAT32 depth
4 CARD32 stencil
ClearBufferfv
2 12+(4*n) rendering command length
2 361 rendering command opcode
4 ENUM buffer
0x1800 n=4 GL_COLOR
0x1801 n=1 GL_STENCIL
0x1802 n=1 GL_DEPTH
else n=0
4 CARD32 drawbuffer
4*n LISTofFLOAT32 value
ClearBufferiv
2 12+(4*n) rendering command length
2 362 rendering command opcode
4 ENUM buffer
0x1800 n=4 GL_COLOR
0x1801 n=1 GL_STENCIL
0x1802 n=1 GL_DEPTH
else n=0
4 CARD32 drawbuffer
4*n LISTofINT32 value
ClearBufferuiv
2 12+(4*n) rendering command length
2 363 rendering command opcode
4 ENUM buffer
0x1800 n=4 GL_COLOR
0x1801 n=1 GL_STENCIL
0x1802 n=1 GL_DEPTH
else n=0
4 CARD32 drawbuffer
4*n LISTofCARD32 value
The following rendering commands can be sent in a glXRender
or glXRenderLarge request.
TransformFeedbackVaryings
2 16+(n*4)+s+p rendering command length
2 359 rendering command opcode
4 CARD32 program
4 INT32 count
4 ENUM buffermode
n*4 LISTofINT32 lengths[n], n = count
s LISTofCHAR varyings, s = sum of all entries in the lengths
array
p unused, p = pad(s)
If the command is encoded in a glXRenderLarge request, the command
opcode and command length fields are expanded to 4 bytes each.
4 20+(n*4)+s+p rendering command length
4 359 rendering command opcode
lengths[i] is calculated as strlen(varyings[i]) + 1. The NUL terminator
is included when sending the varyings.
The following single commands are sent to the server as part of a
glXSingle request:
GetTransformFeedbackVarying
1 CARD8 opcode(X assigned)
1 213 GLX opcode
2 5 request length
4 GLX_CONTEXT_TAG context tag
4 CARD32 program
4 CARD32 index
4 CARD32 bufsize
=>
1 1 reply
1 unused
2 CARD16 sequence number
4 m reply length, m = (n == 0 ? 0 : (n + p) / 4)
4 unused
4 n-1 length
4 INT32 size
4 INT32 type
8 unused
n LISTofCHAR name, n = strlen(name)+1
p unused, p = pad(m)
GetStringi
1 CARD8 opcode (X assigned)
1 214 GLX opcode
2 4 request length
4 GLX_CONTEXT_TAG context tag
4 ENUM name
4 CARD32 index
=>
1 1 reply
1 1 unused
2 CARD16 sequence number
4 m reply length, m = (n + p) / 4
4 unused
4 CARD32 n
16 unused
n STRING8 string
p unused, p=pad(n)
Binary file not shown.
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-289
View File
@@ -1,289 +0,0 @@
# Copyright 2013-2020 The Khronos Group Inc.
# SPDX-License-Identifier: Apache-2.0
# Relax NG schema for Khronos Registry XML
# See https://github.com/KhronosGroup/OpenGL-Registry
#
# Last modified 2013/06/14
# This definition is subject to change (mostly in the form of additions)
namespace xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
# Toplevel is a <registry> tag.
# May be led by an optional <comment> tag containing e.g. copyrights.
start = element registry {
(
element comment { text } ? |
Types * |
Kinds * |
Groups * |
Enums * |
Commands * |
Feature * |
Extensions *
) *
}
# <types> defines a group of types
Types = element types {
Type *
}
# <type> defines a single type. It is usually a C typedef but
# may contain arbitrary C code.
# name - name of this type, if not present in the <name> tag
# api - matches a <feature> api attribute, if present
# requires - name of another type definition required by this one
# type - "group", if present, indicating a group of values in the
# corresponding <enums> definition.
# comment - unused
# <apientry /> - substitutes for an APIENTRY-style macro on output
# <name> - contains typename
Type = element type {
attribute api { text } ? ,
attribute requires { text } ? ,
attribute name { TypeName } ? ,
attribute type { text } ? ,
Comment ? ,
text ,
element apientry { text } ? ,
text ,
element name { TypeName } ? ,
text
}
# <kinds> defines descriptions for kinds.
Kinds = element kinds {
Kind *
}
# <kind> defines a description for a single kind.
Kind = element kind {
Name ,
attribute desc { text }
}
# <groups> defines a group of enum groups
Groups = element groups {
Group *
}
# <group> defines a single enum group. Enums may
# be in multiple groups.
# name - group name
# comment - unused
# <enum name=""> - members of the group
Group = element group {
Name ,
Comment ? ,
element enum { Name } *
}
# <enums> defines a group of enumerants
# namespace - identifies a numeric namespace
# group - identifies a functional subset of the namespace - same as group=""
# start, end - beginning and end of a numeric range in the namespace
# vendor - owner of the numeric range
# type - "bitmask", if present
# comment - unused
Enums = element enums {
attribute namespace { text } ? ,
attribute group { text } ? ,
attribute type { text } ? ,
attribute start { Integer } ? ,
attribute end { Integer } ? ,
Vendor ? ,
Comment ? ,
(Enum | Unused) *
}
# <enum> defines a single enumerant
# value - integer (including hex) value of the enumerant
# api - matches a <feature> api attribute, if present
# type - "u" (unsigned), "ull" (uint64), or integer if not present
# name - enumerant name
# group - identifies a functional subset of the namespace
# alias - another enumerant this is semantically identical to
# comment - unused
Enum = element enum {
(
attribute value { Integer } &
attribute api { text } ? &
attribute type { TypeSuffix } ? &
attribute name { text } &
attribute group { text } ? &
attribute alias { text } ? &
Comment ?
)
}
# <unused> defines a range of enumerants not currently being used
# start, end - beginning and end of an unused numeric range
# vendor - unused
# comment - unused
Unused = element unused {
attribute start { Integer } ,
attribute end { Integer } ? ,
Vendor ? ,
Comment ?
}
# <commands> defines a group of commands
# namespace - identifies a function namespace
Commands = element commands {
attribute namespace { text } ? ,
Command *
}
# <command> defines a single command
# <proto> is the C function prototype, including the return type
# <param> are function parameters, in order
# class - type of object name (object handle). Handles with different types are not compatible. So handle created as [class=buffer] can not be passed to [class=shader]
# <ptype> is a <type> name, if present
# <name> is the function / parameter name
# The textual contents of <proto> and <param> should be legal C
# for those parts of a function declaration.
# <alias> - denotes function aliasing
# name - name of aliased function
# <vecequiv> - denotes scalar / vector function equivalence
# name - name of corresponding vector form, e.g. (glColor3f -> glColor3fv)
# <glx> - information about GLX protocol
# type - "render", "single", or "vendor" for GLXRender, GLXSingle, GLXVendorPrivate{WithReply}
# opcode - numeric opcode of specified type for this function
# name - if present, protocol name (defaults to command name)
# comment - unused
Command = element command {
Comment ? ,
element proto {
attribute group { text } ? ,
attribute kind { text } ? ,
attribute class { text } ? ,
text ,
element ptype { TypeName } ? ,
text ,
element name { text } ,
text
} ,
element param {
attribute group { text } ? ,
attribute kind { text } ? ,
attribute class { text } ? ,
attribute len { text } ? ,
text ,
element ptype { TypeName } ? ,
text ,
element name { text } ,
text
} * ,
(
element alias {
Name
} ? &
element vecequiv {
Name
} ? &
element glx {
attribute type { text } ,
attribute opcode { xsd:integer } ,
Name ? ,
Comment ?
} *
)
}
# Each <feature> defines the interface of an API version (e.g. OpenGL 1.2)
# api - API tag (e.g. 'gl', 'gles2', etc. - used internally, not
# neccessarily an actual API name
# name - version name (C preprocessor name, e.g. GL_VERSION_4_2)
# number - version number, e.g. 4.2
# protect - additional #ifdef symbol to place around the feature
# <require> / <remove> contains features to require or remove in
# this version
# profile - only require/remove when generated profile matches
# comment - unused
Feature = element feature {
attribute api { text } ,
Name ,
attribute number { xsd:float } ,
attribute protect { text } ?,
Comment ? ,
(
element require {
ProfileName ? ,
Comment ? ,
InterfaceElement *
} |
element remove {
ProfileName ? ,
Comment ? ,
InterfaceElement *
}
) *
}
Extensions = element extensions {
Extension *
}
# Defines the interface of an API <extension>. Like a <feature>
# tag, but with a slightly different api attribute.
# api - regexp pattern matching one or more API tags, indicating
# which APIs the extension is known to work with. The only
# syntax supported is <name>{|<name>}* and each name must
# exactly match an API being generated (implicit ^$ surrounding).
# In addition, <require> / <remove> tags also support an
# api attribute:
# api - only require/remove these features for the matching API.
# Not a regular expression.
Extension = element extension {
Name ,
attribute protect { text } ?,
attribute supported { StringGroup } ? ,
Comment ? ,
(
element require {
attribute api { text } ? ,
ProfileName ? ,
Comment ? ,
InterfaceElement *
} |
element remove {
attribute api { text } ? ,
ProfileName ? ,
Comment ? ,
InterfaceElement *
}
) *
}
# Contents of a <require> / <remove> tag, defining a group
# of features to require or remove.
# <type> / <enum> / <command> all have attributes
# name - feature name which must match
InterfaceElement =
element type {
Name ,
Comment ?
} |
element enum {
Name ,
Comment ?
} |
element command {
Name ,
Comment ?
}
# Integers are allowed to be either decimal or C-hex (0x[0-9A-F]+), but
# XML Schema types don't seem to support hex notation, so we use this
# as a placeholder.
Integer = text
# TypeName is an argument/return value C type name
TypeName = text
# TypeSuffix is a C numeric type suffix, e.g. 'u' or 'ull'
TypeSuffix = text
# StringGroup is a regular expression with an implicit
# '^(' and ')$' bracketing it.
StringGroup = text
# Repeatedly used attributes
ProfileName = attribute profile { text }
Vendor = attribute vendor { text }
Comment = attribute comment { text }
Name = attribute name { text }
-14
View File
@@ -1,14 +0,0 @@
/*% cc -I. -I../api -I../../../../../registry/trunk/egl/api/ -c % ; rm testesext.o
*
* Test to make sure gl3.h builds properly.
* Will also use SVN internal versions of gl3platform.h
* and khrplatform.h (if needed) (via GLES and KHR symlinks into
* appropriate parts of the tree).
*/
#define GL_GLEXT_PROTOTYPES
#include "GLES3/gl31.h"
#include "GLES2/gl2ext.h"
#if GL_NV_non_square_matrices != 1
#error "No extension GL_NV_non_square_matrices!"
#endif
-27
View File
@@ -1,27 +0,0 @@
/*% /lib/cpp -I../api testglext.c > testglext.i ; cc -c % ; rm testglext.[oi]
*/
#define GL_GLEXT_LEGACY
#include <GL/gl.h>
#define GL_GLEXT_PROTOTYPES
#include "GL/glext.h"
#define GLX_GLXEXT_LEGACY
#include <GL/glx.h>
/* Necessary to avoid token redefinition warnings */
#undef GLX_SAMPLE_BUFFERS
#undef GLX_SAMPLES
#undef GLX_FRONT_EXT
#undef GLX_BACK_EXT
#define GLX_GLXEXT_PROTOTYPES
#include "GL/glxext.h"
int VERSION_4_3 = GL_VERSION_4_3;
/* These should be the same */
int mcsor = GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES;
int mciufo = GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS;
/* See if latest extension is included */
int latest_ext = GL_NV_blend_equation_advanced;
GLenum latest_enum = GL_CONJOINT_NV;
-58
View File
@@ -1,58 +0,0 @@
Miscellaneous data about extensions:
- GLU enumerant reserved values
- Information about extension vendors (probably out of date and incomplete)
GLU Enumerants
==============
Value Range Definition Contact
Control (if different)
100208 SGI
Definition Contact Email
Control
========== ======= =====
OpenGL ARB Jon Leech jon 'at' alumni.caltech.edu
Khronos Jon Leech jon 'at' alumni.caltech.edu (OpenML, OpenGL ES)
Apple Bob Beretta beretta 'at' apple.com
ARM Tom Olson tom.olson 'at' arm.com
AMD and ATI Graham Sellers graham.sellers 'at' amd.com
ATI/NVIDIA Graham Sellers graham.sellers 'at' amd.com
Broadcom Gary Sweet gsweet 'at' broadcom.com
HP Andrew Wiltzius andrew.wiltzius 'at' hp.com
Imagination Graham Connor gconnor 'at' videologic.com
Intel Ian Romanick ian.d.romanick 'at' intel.com
Mesa Brian Paul brianp 'at' mesa3d.org
Microsoft Dave Aronson daronson 'at' microsoft.com
NEC Seiji Uchida uchida 'at' hpc.bs1.fc.nec.co.jp
NVIDIA James Jones jajones 'at' nvidia.com
S3 Yanjun Zhang YanjunZhang 'at' s3graphics.com
Vivante Frido Garritsen TBD
Samsung Jeff Vigil j.vigil 'at' samsung.com
Qualcomm Ashish Mathur asmathur@qti.qualcomm.com
Out of business / acquired / unknown:
3Dfx - Acquired by NVIDIA
3Dlabs - Acquired by Creative, refocused on mobile, renamed ZiiLabs
ADD - Out of business
ATI - Acquired by AMD
Compaq - Acquired by HP
DEC - Acquired by Compaq, then HP
E&S - No longer in the graphics business (sells planetarium displays)
HP - No longer in the graphics business (other than as a system integrator)
IBM - No longer in the graphics business (other than as a system integrator)
Intense3D - Acquired by 3Dlabs
Intergraph - Acquired by 3Dlabs. Spinoff of Intense3D.
Micron - No longer in the graphics business
KPC (Kubota) - Out of business
PGI (Pacific Graphics Inc.) - Acquired by Template Graphics Systems
Pixelfusion - No longer in the graphics business
Rendition - Acquired by Micron
SGI (Silicon Graphics Inc.) - Acquired by Silicon Graphics International, then HP
SUN - Acquired by Oracle. No longer in the graphics business.
XGI - Acquired by Silicon Integrated Systems. No longer in the graphics business.
ZiiLabs - Still has a website but appears to be inactive as of 2017-01-12.
File diff suppressed because it is too large Load Diff
-106
View File
@@ -1,106 +0,0 @@
<type>struct <name>_POINTFLOAT</name> {
FLOAT x;
FLOAT y;
};</type>
<type>typedef struct _POINTFLOAT <name>POINTFLOAT</name>;</type>
<type>typedef struct _POINTFLOAT *<name>PPOINTFLOAT</name>;</type>
<type requires="POINTFLOAT">struct <name>_GLYPHMETRICSFLOAT</name> {
FLOAT gmfBlackBoxX;
FLOAT gmfBlackBoxY;
POINTFLOAT gmfptGlyphOrigin;
FLOAT gmfCellIncX;
FLOAT gmfCellIncY;
};</type>
<type requires="_GLYPHMETRICSFLOAT">typedef struct _GLYPHMETRICSFLOAT <name>GLYPHMETRICSFLOAT</name>;</type>
<type requires="_GLYPHMETRICSFLOAT">typedef struct _GLYPHMETRICSFLOAT *<name>PGLYPHMETRICSFLOAT</name>;</type>
typedef struct tagPIXELFORMATDESCRIPTOR {
WORD nSize;
WORD nVersion;
DWORD dwFlags;
BYTE iPixelType;
BYTE cColorBits;
BYTE cRedBits;
BYTE cRedShift;
BYTE cGreenBits;
BYTE cGreenShift;
BYTE cBlueBits;
BYTE cBlueShift;
BYTE cAlphaBits;
BYTE cAlphaShift;
BYTE cAccumBits;
BYTE cAccumRedBits;
BYTE cAccumGreenBits;
BYTE cAccumBlueBits;
BYTE cAccumAlphaBits;
BYTE cDepthBits;
BYTE cStencilBits;
BYTE cAuxBuffers;
BYTE iLayerType;
BYTE bReserved;
DWORD dwLayerMask;
DWORD dwVisibleMask;
DWORD dwDamageMask;
} PIXELFORMATDESCRIPTOR, *PPIXELFORMATDESCRIPTOR;
PFD_DRAW_TO_WINDOW The buffer can draw to a window or device surface.
PFD_DRAW_TO_BITMAP The buffer can draw to a memory bitmap.
PFD_SUPPORT_GDI The buffer supports GDI drawing. This flag and PFD_DOUBLEBUFFER are mutually exclusive in the current generic implementation.
PFD_SUPPORT_OPENGL The buffer supports OpenGL drawing.
PFD_GENERIC_ACCELERATED The pixel format is supported by a device driver that accelerates the generic implementation. If this flag is clear and the PFD_GENERIC_FORMAT flag is set, the pixel format is supported by the generic implementation only.
PFD_GENERIC_FORMAT The pixel format is supported by the GDI software implementation, which is also known as the generic implementation. If this bit is clear, the pixel format is supported by a device driver or hardware.
PFD_NEED_PALETTE The buffer uses RGBA pixels on a palette-managed device. A logical palette is required to achieve the best results for this pixel type. Colors in the palette should be specified according to the values of the cRedBits, cRedShift, cGreenBits, cGreenShift, cBluebits, and cBlueShift members. The palette should be created and realized in the device context before calling wglMakeCurrent.
PFD_NEED_SYSTEM_PALETTE Defined in the pixel format descriptors of hardware that supports one hardware palette in 256-color mode only. For such systems to use hardware acceleration, the hardware palette must be in a fixed order (for example, 3-3-2) when in RGBA mode or must match the logical palette when in color-index mode.
PFD_DOUBLEBUFFER The buffer is double-buffered. This flag and PFD_SUPPORT_GDI are mutually exclusive in the current generic implementation.
PFD_STEREO The buffer is stereoscopic. This flag is not supported in the current generic implementation.
PFD_SWAP_LAYER_BUFFERS Indicates whether a device can swap individual layer planes with pixel formats that include double-buffered overlay or underlay planes. Otherwise all layer planes are swapped together as a group. When this flag is set, wglSwapLayerBuffers is supported.
PFD_DEPTH_DONTCARE The requested pixel format can either have or not have a depth buffer. To select a pixel format without a depth buffer, you must specify this flag. The requested pixel format can be with or without a depth buffer. Otherwise, only pixel formats with a depth buffer are considered.
PFD_DOUBLEBUFFER_DONTCARE The requested pixel format can be either single- or double-buffered.
PFD_STEREO_DONTCARE The requested pixel format can be either monoscopic or stereoscopic.
PFD_SWAP_COPY Specifies the content of the back buffer in the double-buffered main color plane following a buffer swap. Swapping the color buffers causes the content of the back buffer to be copied to the front buffer. The content of the back buffer is not affected by the swap. PFD_SWAP_COPY is a hint only and might not be provided by a driver.
PFD_SWAP_EXCHANGE Specifies the content of the back buffer in the double-buffered main color plane following a buffer swap. Swapping the color buffers causes the exchange of the back buffer's content with the front buffer's content. Following the swap, the back buffer's content contains the front buffer's content before the swap. PFD_SWAP_EXCHANGE is a hint only and might not be provided by a driver.
PFD_TYPE_RGBA RGBA pixels. Each pixel has four components in this order: red, green, blue, and alpha.
PFD_TYPE_COLORINDEX Color-index pixels. Each pixel uses a color-index value.
typedef struct tag_LAYERPLANEDESCRIPTOR {
WORD nSize;
WORD nVersion;
DWORD dwFlags;
BYTE iPixelType;
BYTE cColorBits;
BYTE cRedBits;
BYTE cRedShift;
BYTE cGreenBits;
BYTE cGreenShift;
BYTE cBlueBits;
BYTE cBlueShift;
BYTE cAlphaBits;
BYTE cAlphaShift;
BYTE cAccumBits;
BYTE cAccumRedBits;
BYTE cAccumGreenBits;
BYTE cAccumBlueBits;
BYTE cAccumAlphaBits;
BYTE cDepthBits;
BYTE cStencilBits;
BYTE cAuxBuffers;
BYTE iLayerType;
BYTE bReserved;
COLORREF crTransparent;
} LAYERPLANEDESCRIPTOR, *PLAYERPLANEDESCRIPTOR;
LPD_SUPPORT_OPENGL The layer plane supports OpenGL drawing.
LPD_SUPPORT_GDI The layer plane supports GDI drawing. The current implementation of OpenGL doesn't support this flag.
LPD_DOUBLEBUFFER The layer plane is double-buffered. A layer plane can be double-buffered even when the main plane is single-buffered and vice versa.
LPD_STEREO The layer plane is stereoscopic. A layer plane can be stereoscopic even when the main plane is monoscopic and vice versa.
LPD_SWAP_EXCHANGE In a double-buffered layer plane, swapping the color buffer exchanges the front buffer and back buffer contents. The back buffer then contains the contents of the front buffer before the swap. This flag is a hint only and might not be provided by a driver.
LPD_SWAP_COPY In a double-buffered layer plane, swapping the color buffer copies the back buffer contents to the front buffer. The swap does not affect the back buffer contents. This flag is a hint only and might not be provided by a driver.
LPD_TRANSPARENT The crTransparent member of this structure contains a transparent color or index value that enables underlying layers to show through this layer. All layer planes, except the lowest-numbered underlay layer, have a transparent color or index.
LPD_SHARE_DEPTH The layer plane shares the depth buffer with the main plane.
LPD_SHARE_STENCIL The layer plane shares the stencil buffer with the main plane.
LPD_SHARE_ACCUM The layer plane shares the accumulation buffer with the main plane.
iPixelType
Specifies the type of pixel data. The following types are defined.
Value Meaning
LPD_TYPE_RGBA RGBA pixels. Each pixel has four components: red, green, blue, and alpha.
LPD_TYPE_COLORINDEX Color-index pixels. Each pixel uses a color-index value.
+232 -98
View File
@@ -14,6 +14,7 @@ using StgSharp.Timing;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -23,12 +24,10 @@ namespace StgSharp
public class ParticleRenderStream : glRender
{
private AutoTextureGL autoT;
private ElementBuffer ebo;
private ElementBuffer f_ebo;
private FrameBuffer fbo;
private Image i;
private Image<Rgba8> i;
private int temp = 0;
private PlainInstancingBuffer<ParticleOnPlain> buffer;
@@ -37,6 +36,7 @@ namespace StgSharp
private ShaderProgram s;
private TextureGL f_t;
private TextureGL t;
private Uniform<GraphicsMatrix> cameraUniform;
private Uniform<int> texUniform;
private Uniform<float> time;
private VertexArray f_vao;
@@ -64,16 +64,21 @@ namespace StgSharp
GL.ClearColor(0.4f, TimePassed % 1.0f, 0f, 1.0f); /*GL.Assert(true);/**/
GL.Clear(MaskBufferBit.COLOR /**/ | MaskBufferBit.DEPTH/**/); /*GL.Assert(true);/**/
f_vao.Bind(0); //GL.Assert(true);
GL.BindVertexArray(f_vao[0]); //GL.Assert(true);
foreach (PlainGeometryMesh mesh in items)
{
// autoT.SelectTextureAndBind(mesh.TextureImage);
f_t.LoadTexture(0, mesh.TextureImage);
GL.ActiveTextureUnit((uint)TextureUnit.Unit1);
GL.BindTexture(glConst.TEXTURE_2D, f_t[0]);
GL.TextureImage2d(Texture2DTarget.Texture2D, 0, glConst.RGBA8,
mesh.TextureImage.Width, mesh.TextureImage.Height,
FrameBufferChannel.RGBA, PixelChannelLayout.UByte,
mesh.TextureImage.ReadOnlyPixels);
GL.GenerateMipmap(glConst.TEXTURE_2D);
// GL.Assert(true);
frameMainShader.Use(); //GL.Assert(true);
GL.UseProgram(frameMainShader.Handle); //GL.Assert(true);
GL.DrawElements(GeometryType.TRIANGLES, 6, TypeCode.UInt32, IntPtr.Zero);
}
@@ -94,17 +99,17 @@ namespace StgSharp
// Console.WriteLine(GL.CheckFrameBufferStatus(FrameBufferTarget.All));
fbo.Bind(0); //GL.Assert(true);
vao.Bind(0); //GL.Assert(true);
t.Bind2D(0); //GL.Assert(false);
GL.BindFrameBuffer(FrameBufferTarget.All, fbo[0]); //GL.Assert(true);
GL.BindVertexArray(vao[0]); //GL.Assert(true);
GL.ActiveTextureUnit((uint)TextureUnit.Unit0);
GL.BindTexture(glConst.TEXTURE_2D, t[0]); //GL.Assert(false);
GL.Viewport(0, 0, Width, Height);
/**/
GL.TextureImage2d<byte>(Texture2DTarget.Texture2D, 0, ImageChannel.WithAlphaChannel,
Width, Height, ImageChannel.WithAlphaChannel,
PixelChannelLayout.Byte, null);
GL.TextureImage2d(Texture2DTarget.Texture2D, 0, glConst.RGBA8, Width, Height,
FrameBufferChannel.RGBA, PixelChannelLayout.UByte);
/**/
// GL.Assert(false);
@@ -120,12 +125,13 @@ namespace StgSharp
// GL.Assert(false);
vbo.Bind(1);
vbo.WriteVectorData<Vec4>(1, buffer.CoordAndRotationSpan, BufferUsage.StreamDraw);
GL.BindBuffer(BufferType.ArrayBuffer, vbo[1]);
GL.SetBufferData<Vec4>(BufferType.ArrayBuffer, buffer.CoordAndRotationSpan,
BufferUsage.StreamDraw);
s.Use();
NativeCamera.SetAllUniforms();
GL.UseProgram(s.Handle);
GL.SetUniformValue(cameraUniform, NativeCamera.CameraMatrix());
GL.SetUniformValue(time, TimePassed);
GL.DrawElementsInstanced(GeometryType.TRIANGLES, 6, TypeCode.UInt32, IntPtr.Zero, 100);
@@ -139,22 +145,26 @@ namespace StgSharp
// GL.Assert(true);
ImageHelper.Resize(i, Width, Height, ImageMovement.Discard);
if (i.Size != (Width, Height))
{
i = new Image<Rgba8>(Width, Height);
ButtonTextureProvider.Image = i;
}
// GL.ClearError();
// Console.Write($"Size set to {Height},{Width}");
// Console.WriteLine($"Image resized to {i.Height} {i.Width}");
GL.GetTextureImage(Texture2DTarget.Texture2D, 0, ImageChannel.WithAlphaChannel,
PixelChannelLayout.Byte, i.PixelBuffer);
GL.GetTextureImage(Texture2DTarget.Texture2D, 0, FrameBufferChannel.RGBA,
PixelChannelLayout.UByte, i.Bytes);
/*
for (int num = 0; num < i.PixelBuffer.Length; num+=10000)
for (int num = 0; num < i.Bytes.Length; num+=10000)
{
Console.Write($"{i.PixelBuffer[num]}\t");
Console.Write($"{i.Bytes[num]}\t");
}
/**/
// GL.Assert(true);
// Array.Fill<byte>(i.PixelBuffer, 24);
// i.Bytes.Fill(24);
GL.BindFrameBuffer(FrameBufferTarget.All, GlHandle.Zero);
@@ -192,7 +202,114 @@ namespace StgSharp
0)) * rotation;
}
protected override void CustomizeDeinit() { }
private Shader CreateShaderSet(
ShaderType type,
int count
)
{
GlHandle[] handles = new GlHandle[count];
for (int index = 0; index < handles.Length; index++) {
handles[index] = GL.CreateShader((uint)type);
}
return new Shader(handles, type);
}
private void CompileShaderFromFile(
GlHandle shader,
string path
)
{
byte[] source = File.ReadAllBytes(path);
if (source.Length == 0) {
throw new InvalidOperationException($"Shader source is empty: {path}");
}
GL.ShaderSource(shader, source);
GL.CompileShader(shader);
Span<int> status = stackalloc int[1];
GL.GetShaderiv(shader, glConst.COMPILE_STATUS, status);
if (status[0] != 0) {
return;
}
throw new InvalidOperationException(
$"Failed to compile shader '{path}'.{Environment.NewLine}{GetShaderInfoLog(shader)}");
}
private void LinkShaderProgram(
GlHandle program
)
{
GL.LinkProgram(program);
Span<int> status = stackalloc int[1];
GL.GetProgramiv(program, glConst.LINK_STATUS, status);
if (status[0] != 0) {
return;
}
throw new InvalidOperationException(
$"Failed to link shader program.{Environment.NewLine}{GetProgramInfoLog(program)}");
}
private string GetShaderInfoLog(
GlHandle shader
)
{
Span<int> requiredLength = stackalloc int[1];
GL.GetShaderiv(shader, glConst.INFO_LOG_LENGTH, requiredLength);
if (requiredLength[0] <= 1) {
return "OpenGL did not provide a shader info log.";
}
byte[] bytes = new byte[requiredLength[0]];
GL.GetShaderInfoLog(shader, out int written, bytes);
return Encoding.UTF8.GetString(bytes, 0, Math.Clamp(written, 0, bytes.Length))
.TrimEnd('\0');
}
private string GetProgramInfoLog(
GlHandle program
)
{
Span<int> requiredLength = stackalloc int[1];
GL.GetProgramiv(program, glConst.INFO_LOG_LENGTH, requiredLength);
if (requiredLength[0] <= 1) {
return "OpenGL did not provide a program info log.";
}
byte[] bytes = new byte[requiredLength[0]];
GL.GetProgramInfoLog(program, out int written, bytes);
return Encoding.UTF8.GetString(bytes, 0, Math.Clamp(written, 0, bytes.Length))
.TrimEnd('\0');
}
private void DeleteShaderSet(
Shader shaderSet
)
{
for (int index = 0; index < shaderSet.Count; index++) {
GL.DeleteShader(shaderSet[index]);
}
}
protected override void CustomizeDeinit()
{
GL.DeleteProgram(s.Handle);
GL.DeleteProgram(frameMainShader.Handle);
GL.DeleteBuffers(vbo.Handles);
GL.DeleteBuffers(ebo.Handles);
GL.DeleteBuffers(f_vbo.Handles);
GL.DeleteBuffers(f_ebo.Handles);
GL.DeleteVertexArrays(vao.Handles);
GL.DeleteVertexArrays(f_vao.Handles);
GL.DeleteFramebuffers(fbo.Handles);
GL.DeleteRenderbuffers(rbo.Handles);
GL.DeleteTextures(t.Handles);
GL.DeleteTextures(f_t.Handles);
}
protected override void CustomizeInit()
{
@@ -221,59 +338,69 @@ namespace StgSharp
// SetSizeLimit(800, 800, 800, 800);
s = CreateShaderProgram();
frameMainShader = CreateShaderProgram();
Shader pvs = CreateShaderSegment(ShaderType.Vertex, 2);
Shader pfs = CreateShaderSegment(ShaderType.Fragment, 2);
s = new ShaderProgram(GL.CreateProgram());
frameMainShader = new ShaderProgram(GL.CreateProgram());
Shader pvs = CreateShaderSet(ShaderType.Vertex, 2);
Shader pfs = CreateShaderSet(ShaderType.Fragment, 2);
// GL.Assert(true);
pvs.Compile(0, Shader.FromCodeFile("Shader\\particle.vert"));
CompileShaderFromFile(pvs[0], Path.Combine("Shader", "particle.vert"));
// GL.Assert(true);
pvs.AttachTo(0, s);
GL.AttachShader(s.Handle, pvs[0]);
// GL.Assert(true);
pfs.Compile(0, Shader.FromCodeFile("Shader\\particle.frag"));
pfs.AttachTo(0, s);
s.Link();
CompileShaderFromFile(pfs[0], Path.Combine("Shader", "particle.frag"));
GL.AttachShader(s.Handle, pfs[0]);
LinkShaderProgram(s.Handle);
// GL.Assert(true);
pvs.Compile(1, Shader.FromCodeFile("Shader\\fbo.vert"));
pvs.AttachTo(1, frameMainShader);
pfs.Compile(1, Shader.FromCodeFile("Shader\\fbo.frag"));
pfs.AttachTo(1, frameMainShader);
frameMainShader.Link();
CompileShaderFromFile(pvs[1], Path.Combine("Shader", "fbo.vert"));
GL.AttachShader(frameMainShader.Handle, pvs[1]);
CompileShaderFromFile(pfs[1], Path.Combine("Shader", "fbo.frag"));
GL.AttachShader(frameMainShader.Handle, pfs[1]);
LinkShaderProgram(frameMainShader.Handle);
DeleteShaderSet(pvs);
DeleteShaderSet(pfs);
// GL.Assert(true);
vbo = CreateVertexBuffer(3);
vao = CreateVertexArray(1);
ebo = CreateElementBuffer(1);
vbo.Bind(0);
vbo = new VertexBuffer(GL.GenBuffers(3));
vao = new VertexArray(GL.GenVertexArrays(1));
ebo = new ElementBuffer(GL.GenBuffers(1));
GL.BindBuffer(BufferType.ArrayBuffer, vbo[0]);
Rectangle rec = new Rectangle(0.05f, 0.05f, 0.05f, -0.05f, -0.05f, -0.05f, -0.05f,
0.05f);
// GL.Assert(true);
vao.Bind(0);
vbo.WriteVectorData(0, rec.VertexStream, BufferUsage.StaticDraw);
ebo.SetValue(0, rec.VertexIndices, BufferUsage.StaticDraw);
vao.SetVertexAttribute(0, 3, TypeCode.Single, false, 4 * sizeof(float), 0);
GL.BindVertexArray(vao[0]);
GL.BindBuffer(BufferType.ArrayBuffer, vbo[0]);
GL.SetBufferData(BufferType.ArrayBuffer, rec.VertexStream, BufferUsage.StaticDraw);
GL.BindBuffer(BufferType.ElementArrayBuffer, ebo[0]);
GL.SetBufferData(BufferType.ElementArrayBuffer, rec.VertexIndices,
BufferUsage.StaticDraw);
GL.SetVertexAttribute(0, 3, TypeCode.Single, false, 4 * sizeof(float), 0);
vbo.WriteVectorData<Vec4>(1, buffer.CoordAndRotationSpan, BufferUsage.StreamDraw);
vao.SetVertexAttribute(1, 3, TypeCode.Single, false, 4 * sizeof(float), 0);
vao.SetVertexAttribute(2, 1, TypeCode.Single, false, 4 * sizeof(float),
3 * sizeof(float));
GL.BindBuffer(BufferType.ArrayBuffer, vbo[1]);
GL.SetBufferData<Vec4>(BufferType.ArrayBuffer, buffer.CoordAndRotationSpan,
BufferUsage.StreamDraw);
GL.SetVertexAttribute(1, 3, TypeCode.Single, false, 4 * sizeof(float), 0);
GL.SetVertexAttribute(2, 1, TypeCode.Single, false, 4 * sizeof(float),
3 * sizeof(float));
GL.VertexAttributeDivisor(1, 1);
GL.VertexAttributeDivisor(2, 1);
vbo.WriteScalerData<float>(2, buffer.ScalingSpan, BufferUsage.StaticDraw);
vao.SetVertexAttribute(3, 1, TypeCode.Single, false, sizeof(float), 0);
GL.BindBuffer(BufferType.ArrayBuffer, vbo[2]);
GL.SetBufferData<float>(BufferType.ArrayBuffer, buffer.ScalingSpan,
BufferUsage.StaticDraw);
GL.SetVertexAttribute(3, 1, TypeCode.Single, false, sizeof(float), 0);
GL.VertexAttributeDivisor(3, 1);
vbo.Unbind();
GL.BindBuffer(BufferType.ArrayBuffer, GlHandle.Zero);
GL.BindVertexArray(GlHandle.Zero);
NativeCameraViewTarget([
@@ -290,23 +417,31 @@ namespace StgSharp
0f
]);
NativeCameraViewRange(new Degree(1.5f), Vec2.Zero, (50, 50));
NativeCameraUniform(s, "Camera");
cameraUniform = GL.GetUniform<GraphicsMatrix>(s.Handle, "Camera");
s.Use();
GL.UseProgram(s.Handle);
fbo = CreateFrameBuffer(1);
rbo = CreateRenderBuffer(1);
fbo.Bind(0);
rbo.Bind(0);
GlHandle[] frameBufferHandles = new GlHandle[1];
GL.GenFrameBuffers(frameBufferHandles);
fbo = new FrameBuffer(frameBufferHandles);
rbo = new RenderBuffer(GL.GenRenderBuffer(1));
GL.BindFrameBuffer(FrameBufferTarget.All, fbo[0]);
GL.BindRenderBuffer(rbo[0]);
// GL.Assert(true);
t = CreateTexture(1);
t.Bind2D(0);
GL.TextureImage2d<byte>(Texture2DTarget.Texture2D, 0, ImageChannel.WithAlphaChannel,
Width, Height, ImageChannel.WithAlphaChannel,
PixelChannelLayout.Byte, null!);
t.Set2dWrapProperty(0, TextureWrap.Repeat, TextureWrap.Repeat);
t.Set2dFilterProperty(0, TextureFilter.Linear, TextureFilter.Linear);
t = new TextureGL(GL.GenTextures(1));
GL.ActiveTextureUnit((uint)TextureUnit.Unit0);
GL.BindTexture(glConst.TEXTURE_2D, t[0]);
GL.TextureImage2d(Texture2DTarget.Texture2D, 0, glConst.RGBA8, Width, Height,
FrameBufferChannel.RGBA, PixelChannelLayout.UByte);
GL.TextureParameter(glConst.TEXTURE_2D, glConst.TEXTURE_WRAP_S,
(int)TextureWrap.Repeat);
GL.TextureParameter(glConst.TEXTURE_2D, glConst.TEXTURE_WRAP_T,
(int)TextureWrap.Repeat);
GL.TextureParameter(glConst.TEXTURE_2D, glConst.TEXTURE_MIN_FILTER,
(int)TextureFilter.Linear);
GL.TextureParameter(glConst.TEXTURE_2D, glConst.TEXTURE_MAG_FILTER,
(int)TextureFilter.Linear);
// GL.Assert(true);
GL.FrameBufferTexture2d(FrameBufferTarget.All, glAttachment.Color(0),
@@ -317,15 +452,13 @@ namespace StgSharp
Console.WriteLine(GL.CheckFrameBufferStatus(FrameBufferTarget.All));
FrameBuffer.BindNull();
GL.BindFrameBuffer(FrameBufferTarget.All, GlHandle.Zero);
// GL.Assert(true);
int streamLength = this.Width * this.Height * 4;
byte[] imageStream = new byte[streamLength];
i = Image.FromMemory(this.Size, ImageChannel.WithAlphaChannel, imageStream);
i = new Image<Rgba8>(this.Size);
time = s.GetUniform<float>("time");
time = GL.GetUniform<float>(s.Handle, "time");
Vec2[] buttonTextureCoordArray = {
(0f, 1f),
@@ -338,45 +471,46 @@ namespace StgSharp
// GL.Assert(true);
ButtonTextureProvider = new TextureProvider(i, buttonTextureCoordArray);
f_vao = CreateVertexArray(1);
f_vbo = CreateVertexBuffer(2);
f_ebo = CreateElementBuffer(1);
f_vao = new VertexArray(GL.GenVertexArrays(1));
f_vbo = new VertexBuffer(GL.GenBuffers(2));
f_ebo = new ElementBuffer(GL.GenBuffers(1));
// GL.Assert(true);
f_vao.Bind(0);
GL.BindVertexArray(f_vao[0]);
f_ebo.Bind(0);
f_ebo.SetValue(0, ButtonBounding.VertexIndices, BufferUsage.StaticDraw);
GL.BindBuffer(BufferType.ElementArrayBuffer, f_ebo[0]);
GL.SetBufferData(BufferType.ElementArrayBuffer, ButtonBounding.VertexIndices,
BufferUsage.StaticDraw);
// GL.Assert(true);
f_vbo.Bind(0);
f_vbo.WriteVectorData(0, ButtonBounding.VertexStream, BufferUsage.StaticDraw);
f_vao.SetVertexAttribute(0, 3, TypeCode.Single, false, 4 * sizeof(float), 0);
GL.BindBuffer(BufferType.ArrayBuffer, f_vbo[0]);
GL.SetBufferData(BufferType.ArrayBuffer, ButtonBounding.VertexStream,
BufferUsage.StaticDraw);
GL.SetVertexAttribute(0, 3, TypeCode.Single, false, 4 * sizeof(float), 0);
// GL.Assert(true);
f_vbo.Bind(1);
f_vbo.WriteVectorData(1, buttonTextureCoordArray, BufferUsage.StaticDraw);
f_vao.SetVertexAttribute(1, 3, TypeCode.Single, false, 4 * sizeof(float), 0);
GL.BindBuffer(BufferType.ArrayBuffer, f_vbo[1]);
GL.SetBufferData(BufferType.ArrayBuffer, buttonTextureCoordArray,
BufferUsage.StaticDraw);
GL.SetVertexAttribute(1, 3, TypeCode.Single, false, 4 * sizeof(float), 0);
// GL.Assert(true);
autoT = CreateAutoTexture(4);
autoT.DefaultTextureProperty = new TextureProperty(TextureFilter.Nearest,
TextureFilter.Nearest,
TextureWrap.Repeat,
TextureWrap.Repeat);
f_t = CreateTexture(1);
f_t.Bind2D(0);
f_t.Set2dWrapProperty(0, TextureWrap.Repeat, TextureWrap.Repeat);
f_t.Set2dFilterProperty(0, TextureFilter.Nearest, TextureFilter.Nearest);
f_t = new TextureGL(GL.GenTextures(1));
GL.ActiveTextureUnit((uint)TextureUnit.Unit1);
GL.BindTexture(glConst.TEXTURE_2D, f_t[0]);
GL.TextureParameter(glConst.TEXTURE_2D, glConst.TEXTURE_WRAP_S,
(int)TextureWrap.Repeat);
GL.TextureParameter(glConst.TEXTURE_2D, glConst.TEXTURE_WRAP_T,
(int)TextureWrap.Repeat);
GL.TextureParameter(glConst.TEXTURE_2D, glConst.TEXTURE_MIN_FILTER,
(int)TextureFilter.Nearest);
GL.TextureParameter(glConst.TEXTURE_2D, glConst.TEXTURE_MAG_FILTER,
(int)TextureFilter.Nearest);
// GL.Assert(true);
f_t.ActivateAs(TextureUnit.Unit1);
// GL.Assert(true);
frameMainShader.Use();
texUniform = frameMainShader.GetUniform<int>("tex");
GL.UseProgram(frameMainShader.Handle);
texUniform = GL.GetUniform<int>(frameMainShader.Handle, "tex");
// GL.Assert(true);
GL.SetUniformValue(texUniform, 1);
-1
View File
@@ -20,7 +20,6 @@ namespace StgSharp
public static void TestRender()
{
// World.InitGL(4, 6);
World.GlobalSetting.VSyncActivated = false;
ViewPort vp = new ViewPort(800, 600, "Hello StgSharp!", IntPtr.Zero);