Synced OpenTK.OpenGL.Bind and OpenTK.OpenGL.GL to latest Tao beta (2.1.3.6 and 2.1.0.7 respectively).

Added Enums.GLenum which contains all OpenGL enumerants. Functions with GLenum parameters now do not take ints but Enums.GLenum.

Added ref/out overloads.
This commit is contained in:
the_fiddler 2007-07-01 10:54:46 +00:00
parent 82e3e6aae1
commit a68b57f3d2
9 changed files with 28066 additions and 2667 deletions

Binary file not shown.

View file

@ -124,7 +124,7 @@ namespace OpenTK.Examples.OpenGL.GLSL
GL.Enable(Enums.EnableCap.DEPTH_TEST);
int vertex_shader_object, fragment_shader_object;
int[] status = new int[1];
int status;
int shader_program;
vertex_shader_object = GL.CreateShader(Enums.VERSION_2_0.VERTEX_SHADER);
@ -132,8 +132,8 @@ namespace OpenTK.Examples.OpenGL.GLSL
GL.ShaderSource(vertex_shader_object, vertex_shader_source.Length, vertex_shader_source, null);
GL.CompileShader(vertex_shader_object);
GL.GetShaderiv(vertex_shader_object, Enums.VERSION_2_0.COMPILE_STATUS, status);
if (status[0] != (int)Enums.Boolean.TRUE)
GL.GetShaderiv(vertex_shader_object, Enums.VERSION_2_0.COMPILE_STATUS, out status);
if (status != (int)Enums.Boolean.TRUE)
{
StringBuilder info = new StringBuilder(1024);
GL.GetShaderInfoLog(vertex_shader_object, info.MaxCapacity, null, info);
@ -143,8 +143,8 @@ namespace OpenTK.Examples.OpenGL.GLSL
GL.ShaderSource(fragment_shader_object, fragment_shader_source.Length, fragment_shader_source, null);
GL.CompileShader(fragment_shader_object);
GL.GetShaderiv(fragment_shader_object, Enums.VERSION_2_0.COMPILE_STATUS, status);
if (status[0] != (int)Enums.Boolean.TRUE)
GL.GetShaderiv(fragment_shader_object, Enums.VERSION_2_0.COMPILE_STATUS, out status);
if (status != (int)Enums.Boolean.TRUE)
{
StringBuilder info = new StringBuilder(1024);
GL.GetShaderInfoLog(fragment_shader_object, 1024, null, info);

View file

@ -106,7 +106,9 @@ namespace OpenTK.OpenGL.Bind
function_name.EndsWith("INTEL") ||
function_name.EndsWith("PGI") ||
function_name.EndsWith("INGR") ||
function_name.EndsWith("APPLE"));
function_name.EndsWith("APPLE") ||
function_name.EndsWith("OML") ||
function_name.EndsWith("I3D"));
}
#endregion
@ -249,6 +251,10 @@ namespace OpenTK.OpenGL.Bind
public static void ReadEnumSpecs(string file, out CodeTypeDeclarationCollection enums)
{
enums = new CodeTypeDeclarationCollection();
// comple_enum contains all opengl enumerants.
CodeTypeDeclaration complete_enum = new CodeTypeDeclaration();
complete_enum.IsEnum = true;
complete_enum.Name = "GLenum";
StreamReader sr = OpenSpecFile(file);
Console.WriteLine("Reading constant specs from file: {0}", file);
@ -327,6 +333,9 @@ namespace OpenTK.OpenGL.Bind
//if (!String.IsNullOrEmpty(c.Name) && !e.Members.Contains.Contains(c))
SpecTranslator.Merge(e.Members, c);
// Insert the current constant in the list of all constants.
SpecTranslator.Merge(complete_enum.Members, c);
}
while (!sr.EndOfStream);
@ -335,10 +344,11 @@ namespace OpenTK.OpenGL.Bind
e.StartDirectives.Add(new CodeRegionDirective(CodeRegionMode.Start, "public enum " + e.Name));
e.EndDirectives.Add(new CodeRegionDirective(CodeRegionMode.End, "public enum " + e.Name));
// Hack - discard Boolean enum, it fsucks up the fragile translation code ahead.
// (disabled) Hack - discard Boolean enum, it fsucks up the fragile translation code ahead.
//if (!e.Name.Contains("Bool"))
SpecTranslator.Merge(enums, e);
}
SpecTranslator.Merge(enums, complete_enum);
}
while (!sr.EndOfStream);
}

View file

@ -67,6 +67,10 @@ namespace OpenTK.OpenGL.Bind
/// </summary>
UncheckedParameter,
/// <summary>
/// Function that takes (in/ref/out) a naked pointer as a parameter - we pass an IntPtr.
/// </summary>
PointerParameter,
/// <summary>
/// Function returns string - needs manual marshalling through IntPtr to prevent the managed GC
/// from freeing memory allocated on the unmanaged side (e.g. glGetString).
/// </summary>
@ -183,6 +187,11 @@ namespace OpenTK.OpenGL.Bind
d.ReturnType.ArrayRank = 0;
}
if (d.ReturnType.BaseType == "GLenum")
{
d.ReturnType.BaseType = "Enums.GLenum";
}
if (d.ReturnType.UserData.Contains("Wrapper"))
{
d.UserData.Add("Wrapper", null);
@ -195,25 +204,25 @@ namespace OpenTK.OpenGL.Bind
{
CodeTypeReference s;
if (d.Name == "BufferDataARB")
if (d.Name == "CreateShader")
{
}
// Translate each parameter of the function while checking for needed wrappers:
foreach (CodeParameterDeclarationExpression p in d.Parameters)
{
// Translate parameter type
if (Search(enums, p.Type.BaseType))
if (Search(enums, p.Type.BaseType) && p.Type.BaseType != "GLenum")
{
// If there is a specific enumerant entry for this parameter, then take this.
p.Type.BaseType = "Enums." + p.Type.BaseType;
}
else if (GLTypes.TryGetValue(p.Type.BaseType, out s))
{
if (s.BaseType == "GLenum" && d.UserData.Contains("Category"))
{
bool found = false;
// There is no enumerant with the needed name. Try to see if any of the generic enumerants
// If there isn't, try to see if any of the generic enumerants
// (category: VERSION_1_1 etc) match the needed name.
bool found = false;
foreach (CodeTypeDeclaration enumerant in enums)
{
if (enumerant.Name == (string)d.UserData["Category"])
@ -224,9 +233,10 @@ namespace OpenTK.OpenGL.Bind
}
}
if (!found || p.Type.BaseType.ToLower().Contains("bool"))
// If none match, then fall back to the global enum list.
if (!found)
{
p.Type.BaseType = s.BaseType;
p.Type.BaseType = "Enums.GLenum";
}
}
else
@ -261,6 +271,10 @@ namespace OpenTK.OpenGL.Bind
{
p.UserData.Add("Wrapper", WrapperTypes.GenericParameter);
}
else if (p.Type.BaseType.Contains("IntPtr"))
{
//p.UserData.Add("Wrapper", WrapperTypes.PointerParameter);
}
else
{
p.UserData.Add("Wrapper", WrapperTypes.ArrayParameter);
@ -271,6 +285,7 @@ namespace OpenTK.OpenGL.Bind
p.Type = new CodeTypeReference();
p.Type.BaseType = "System.IntPtr";
p.Type.ArrayRank = 0;
p.UserData.Add("Flow", p.Direction);
// The same wrapper works for either in or out parameters.
//p.CustomAttributes.Add(new CodeAttributeDeclaration("In, Out"));
}
@ -299,7 +314,7 @@ namespace OpenTK.OpenGL.Bind
d.UserData.Add("Wrapper", null);
}
p.Direction = FieldDirection.In;
//p.Direction = FieldDirection.In;
}
}
#endregion
@ -458,12 +473,12 @@ namespace OpenTK.OpenGL.Bind
WrapPointersMonsterFunctionMK2(w, wrappers);
--count;
/*w = IntPtrToReference(f, count);
w = IntPtrToReference(f, count);
wrappers.Add(w);
++count;
WrapPointersMonsterFunctionMK2(w, wrappers);
--count;*/
--count;
}
else if ((WrapperTypes)f.Parameters[count].UserData["Wrapper"] == WrapperTypes.GenericParameter)
{
@ -549,8 +564,7 @@ namespace OpenTK.OpenGL.Bind
#region private static CodeMemberMethod IntPtrToReference(CodeMemberMethod f, int index)
/// <summary>
/// This function is not working yet! How can we obtain a pinned IntPtr from a ref
/// without resorting to unsafe code?
/// Obtain an IntPtr to the reference passed by the user.
/// </summary>
/// <param name="f"></param>
/// <param name="index"></param>
@ -563,7 +577,11 @@ namespace OpenTK.OpenGL.Bind
CodeParameterDeclarationExpression newp = new CodeParameterDeclarationExpression();
newp.Name = f.Parameters[index].Name;
newp.Type.BaseType = (string)f.Parameters[index].UserData["OriginalType"];
newp.Direction = FieldDirection.Ref;
if (f.Parameters[index].UserData.Contains("Flow") &&
(FieldDirection)f.Parameters[index].UserData["Flow"] == FieldDirection.Out)
newp.Direction = FieldDirection.Out;
else
newp.Direction = FieldDirection.Ref;
w.Parameters[index] = newp;
// In the function body we should pin all objects in memory before calling the
@ -651,9 +669,21 @@ namespace OpenTK.OpenGL.Bind
foreach (CodeParameterDeclarationExpression p in f.Parameters)
{
// Do manual marshalling for objects and arrays, but not strings.
if (p.Type.BaseType.ToLower().Contains("object") && !p.Type.BaseType.ToLower().Contains("enums.") ||
(p.Type.ArrayRank > 0 && !p.Type.BaseType.ToLower().Contains("string")))
if (p.Type.BaseType == "object" || p.Type.BaseType == "System.Object" ||
(p.Type.ArrayRank > 0 && !p.Type.BaseType.ToLower().Contains("string")) ||
((p.Direction == FieldDirection.Ref || p.Direction == FieldDirection.Out) &&
!p.Type.BaseType.ToLower().Contains("string")))
{
if (p.Direction == FieldDirection.Out)
{
statements.Add(
new CodeAssignStatement(
new CodeVariableReferenceExpression(p.Name),
new CodeSnippetExpression("default(" + p.Type.BaseType + ")")
)
);
}
// Pin the object and store the resulting GCHandle to h0, h1, ...
CodeVariableDeclarationStatement s = new CodeVariableDeclarationStatement();
s.Type = new CodeTypeReference("GCHandle");
@ -679,6 +709,18 @@ namespace OpenTK.OpenGL.Bind
// Add the h(n) variable to the list of parameters
parameters[i] = new CodeVariableReferenceExpression("h" + h + ".AddrOfPinnedObject()");
// Add an assignment statement: "variable_name = (variable_type)h(n).Target" for out parameters.
if (p.Direction == FieldDirection.Out)
{
m.TryStatements.Add(
new CodeAssignStatement(
new CodeVariableReferenceExpression(p.Name),
new CodeSnippetExpression("(" + p.Type.BaseType + ")h" + h + ".Target")
)
);
}
h++;
}
else
@ -689,10 +731,10 @@ namespace OpenTK.OpenGL.Bind
i++;
}
if (!f.ReturnType.BaseType.Contains("Void"))
if (f.ReturnType.BaseType.Contains("Void"))
{
m.TryStatements.Add(
new CodeMethodReturnStatement(
m.TryStatements.Insert(0,
new CodeExpressionStatement(
new CodeMethodInvokeExpression(
new CodeTypeReferenceExpression("Delegates"),
"gl" + f.Name,
@ -703,15 +745,22 @@ namespace OpenTK.OpenGL.Bind
}
else
{
m.TryStatements.Add(
new CodeMethodInvokeExpression(
new CodeTypeReferenceExpression("Delegates"),
"gl" + f.Name,
parameters
m.TryStatements.Insert(0, new CodeVariableDeclarationStatement(f.ReturnType, "retval"));
m.TryStatements.Insert(1,
new CodeAssignStatement(
new CodeVariableReferenceExpression("retval"),
new CodeMethodInvokeExpression(
new CodeTypeReferenceExpression("Delegates"),
"gl" + f.Name,
parameters
)
)
);
}
m.TryStatements.Add(
new CodeMethodReturnStatement(new CodeVariableReferenceExpression("retval"))
);
}
statements.Add(m);

View file

@ -191,6 +191,12 @@ namespace OpenTK.OpenGL.Bind
foreach (CodeTypeDelegate d in delegates)
{
// Hack - turn FieldDirection.Out parameters to FieldDirection.In. The parameter flow
// is handle by the [In, Out()] parameter attribute.
foreach (CodeParameterDeclarationExpression p in d.Parameters)
{
p.Direction = FieldDirection.In;
}
delegate_class.Members.Add(d);
CodeMemberField m = new CodeMemberField();

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -91,11 +91,11 @@ namespace OpenTK.OpenGL
#region internal static IntPtr aglGetProcAddress(string s)
// osx gets complicated
[DllImport(GL_NATIVE_LIBRARY, EntryPoint = "NSIsSymbolNameDefined")]
[DllImport("libdl.dylib", EntryPoint = "NSIsSymbolNameDefined")]
internal static extern bool NSIsSymbolNameDefined(string s);
[DllImport(GL_NATIVE_LIBRARY, EntryPoint = "NSLookupAndBindSymbol")]
[DllImport("libdl.dylib", EntryPoint = "NSLookupAndBindSymbol")]
internal static extern IntPtr NSLookupAndBindSymbol(string s);
[DllImport(GL_NATIVE_LIBRARY, EntryPoint = "NSAddressOfSymbol")]
[DllImport("libdl.dylib", EntryPoint = "NSAddressOfSymbol")]
internal static extern IntPtr NSAddressOfSymbol(IntPtr symbol);
internal static IntPtr aglGetProcAddress(string s)
@ -181,7 +181,10 @@ namespace OpenTK.OpenGL
{ }
// Ack!
throw new NotSupportedException("Unknown platform - cannot get function pointer.");
throw new NotSupportedException(
@"Could not find out how to retrive function pointers for this platform.
Did you remember to copy OpenTK.OpenGL.dll.config to your binary's folder?
");
case Platform.Windows:
return Wgl.GetProcAddress(name);
@ -214,7 +217,9 @@ namespace OpenTK.OpenGL
{
IntPtr address = GetFunctionPointerForExtensionMethod(name);
if (address == IntPtr.Zero)
if (address == IntPtr.Zero ||
address == new IntPtr(1) || // Workaround for buggy nvidia drivers which return
address == new IntPtr(2)) // 1 or 2 instead of IntPtr.Zero for some extensions.
{
return null;
}

View file

@ -2,7 +2,7 @@
GLsizei, Int32
GLsizeiptr, IntPtr
GLintptr, IntPtr
GLenum, Int32
# GLenum, Int32
GLboolean, Boolean #Int32 #Boolean
GLbitfield, Int32 #UInt32
# GLvoid*, IntPtr