[ES] Fixed loading of OpenGL ES core API

eglGetProcAddress cannot be used to retrieve
entry points of core functions. Instead, we
use [DllImport] for core functions and function
pointers for extension functions.

Squashed commit of the following:

commit 0b84aa6ef78dfa3600b81fc412eb192f2a87e40c
Author: thefiddler <stapostol@gmail.com>
Date:   Sat Mar 15 02:24:58 2014 +0100

    [Examples] Rolled back changes to Example browser

commit 1acfbaac3d17184debdbbe872c58ac07d1b37c0a
Author: thefiddler <stapostol@gmail.com>
Date:   Sat Mar 15 02:20:57 2014 +0100

    [Examples] Rolled back WinForms example

commit 835d9d6035a890bd3426566929fbfd25c493eca0
Author: thefiddler <stapostol@gmail.com>
Date:   Sat Mar 15 01:15:01 2014 +0100

    [Examples] Rolled back erroneous GLControl mods

commit 056418014f0e835e83fb85b54b8749519a555364
Author: thefiddler <stapostol@gmail.com>
Date:   Fri Mar 14 23:11:11 2014 +0100

    [Rewrite] Remove calli prototypes

    When a function is called indirectly via a function pointer, its
    prototype is not required (the prototype is added as a callsite at the
    calli invocation.) Removing these prototypes reduces binary size by
    roughly 400KB.

commit 353a16ec2836c597150d2fab28581e7c264b2b39
Author: thefiddler <stapostol@gmail.com>
Date:   Fri Mar 14 22:31:25 2014 +0100

    [Rewrite] Call DllImports directly

    When a function does not have an allocated slot (i.e. slot = -1), then
    we will call its DllImport signature directly.

commit 9a5313e4b7afb10b698d255e4b5637887bf71cf3
Author: thefiddler <stapostol@gmail.com>
Date:   Fri Mar 14 22:30:04 2014 +0100

    [Bind] Do not allocate slots for DllImports

commit 6ac5342409363cac0e59f9dc669948b319bd20a9
Author: thefiddler <stapostol@gmail.com>
Date:   Fri Mar 14 22:29:07 2014 +0100

    [Bind] Added option to use DllImports

    This is necessary for the core functionality of OpenGL ES, where
    eglGetProcAddress returns null or garbage (the latter on Android.)
This commit is contained in:
thefiddler 2014-03-16 19:40:49 +01:00
parent 242b8bbe6c
commit 02bf55ad7e
10 changed files with 2764 additions and 3271 deletions

View file

@ -173,7 +173,12 @@ namespace Bind
sw.WriteLine("{");
sw.Indent();
foreach (var d in delegates.Values.Select(d => d.First()))
sw.WriteLine("\"{0}{1}\",", Settings.FunctionPrefix, d.Name);
{
if (!Settings.IsEnabled(Settings.Legacy.UseDllImports) || d.Extension != "Core")
{
sw.WriteLine("\"{0}{1}\",", Settings.FunctionPrefix, d.Name);
}
}
sw.Unindent();
sw.WriteLine("};");
sw.WriteLine("EntryPoints = new IntPtr[EntryPointNames.Length];");

View file

@ -33,6 +33,7 @@ namespace Bind.ES
// overloads using the "All" enum in addition to strongly-typed enums.
// This can be disabled by passing "-o:-keep_untyped_enums" as a cmdline parameter.
Settings.DefaultCompatibility |= Settings.Legacy.KeepUntypedEnums;
Settings.DefaultCompatibility |= Settings.Legacy.UseDllImports;
}
}
}

View file

@ -136,15 +136,26 @@ namespace Bind
#region Private Members
static void GenerateAddressTable(DelegateCollection delegates)
void GenerateAddressTable(DelegateCollection delegates)
{
int slot = -1;
foreach (var list in delegates.Values)
{
slot++;
foreach (var d in list)
if (!Settings.IsEnabled(Settings.Legacy.UseDllImports) || list.First().Extension != "Core")
{
d.Slot = slot;
slot++;
foreach (var d in list)
{
d.Slot = slot;
}
}
else
{
// Core function routed through DllImport - no slot generated
foreach (var d in list)
{
d.Slot = -1;
}
}
}
}

View file

@ -154,6 +154,8 @@ namespace Bind
KeepUntypedEnums = 0x1000,
/// <summary>Marks deprecated functions as [Obsolete]</summary>
AddDeprecationWarnings = 0x2000,
/// <summary>Use DllImport declaration for core functions (do not generate entry point slots)</summary>
UseDllImports = 0x4000,
Tao = ConstIntEnums |
NoAdvancedEnumProcessing |
NoPublicUnsafeFunctions |
@ -164,9 +166,9 @@ namespace Bind
NestedEnums |
NoBoolParameters |
NoDropMultipleTokens |
NoDocumentation |
NoDebugHelpers
/*GenerateAllPermutations,*/
NoDocumentation |
NoDebugHelpers,
/*GenerateAllPermutations,*/
}
// Returns true if flag is enabled.

View file

@ -7,6 +7,7 @@ using System.Text;
using System.Windows.Forms;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
namespace Examples.WinForms

View file

@ -37,9 +37,10 @@
// redButton
//
this.redButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.redButton.Location = new System.Drawing.Point(639, 13);
this.redButton.Location = new System.Drawing.Point(1278, 25);
this.redButton.Margin = new System.Windows.Forms.Padding(6);
this.redButton.Name = "redButton";
this.redButton.Size = new System.Drawing.Size(133, 23);
this.redButton.Size = new System.Drawing.Size(266, 44);
this.redButton.TabIndex = 1;
this.redButton.Text = "Red";
this.redButton.UseVisualStyleBackColor = true;
@ -48,9 +49,10 @@
// greenButton
//
this.greenButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.greenButton.Location = new System.Drawing.Point(639, 43);
this.greenButton.Location = new System.Drawing.Point(1278, 83);
this.greenButton.Margin = new System.Windows.Forms.Padding(6);
this.greenButton.Name = "greenButton";
this.greenButton.Size = new System.Drawing.Size(133, 23);
this.greenButton.Size = new System.Drawing.Size(266, 44);
this.greenButton.TabIndex = 2;
this.greenButton.Text = "Green";
this.greenButton.UseVisualStyleBackColor = true;
@ -59,9 +61,10 @@
// blueButton
//
this.blueButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.blueButton.Location = new System.Drawing.Point(639, 73);
this.blueButton.Location = new System.Drawing.Point(1278, 140);
this.blueButton.Margin = new System.Windows.Forms.Padding(6);
this.blueButton.Name = "blueButton";
this.blueButton.Size = new System.Drawing.Size(133, 23);
this.blueButton.Size = new System.Drawing.Size(266, 44);
this.blueButton.TabIndex = 3;
this.blueButton.Text = "Blue";
this.blueButton.UseVisualStyleBackColor = true;
@ -69,27 +72,29 @@
//
// glControl1
//
this.glControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.glControl1.BackColor = System.Drawing.SystemColors.ControlDarkDark;
this.glControl1.BackColor = System.Drawing.SystemColors.ControlDark;
this.glControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.glControl1.Location = new System.Drawing.Point(0, 0);
this.glControl1.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.glControl1.Name = "glControl1";
this.glControl1.Size = new System.Drawing.Size(629, 565);
this.glControl1.TabIndex = 0;
this.glControl1.Size = new System.Drawing.Size(1562, 1085);
this.glControl1.TabIndex = 4;
this.glControl1.VSync = false;
this.glControl1.Resize += new System.EventHandler(this.glControl1_Resize);
this.glControl1.Paint += new System.Windows.Forms.PaintEventHandler(this.glControl1_Paint);
this.glControl1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.glControl1_KeyDown);
this.glControl1.Resize += new System.EventHandler(this.glControl1_Resize);
//
// W01_First_Window
// SimpleForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 25F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(781, 564);
this.ClientSize = new System.Drawing.Size(1562, 1085);
this.Controls.Add(this.blueButton);
this.Controls.Add(this.greenButton);
this.Controls.Add(this.redButton);
this.Controls.Add(this.glControl1);
this.Name = "W01_First_Window";
this.Margin = new System.Windows.Forms.Padding(6);
this.Name = "SimpleForm";
this.Text = "OpenTK Windows Forms Tutorial 01 - Your first window";
this.ResumeLayout(false);
@ -97,9 +102,9 @@
#endregion
private OpenTK.GLControl glControl1;
private System.Windows.Forms.Button redButton;
private System.Windows.Forms.Button greenButton;
private System.Windows.Forms.Button blueButton;
private OpenTK.GLControl glControl1;
}
}

View file

@ -164,6 +164,18 @@ namespace OpenTK.Rewrite
}
}
int GetSlot(MethodDefinition signature)
{
var slot_attribute = signature.CustomAttributes
.FirstOrDefault(a => a.AttributeType.Name == "SlotAttribute");
int slot =
slot_attribute != null ?
(int)slot_attribute.ConstructorArguments[0].Value :
-1;
return slot;
}
void Rewrite(TypeDefinition type, FieldDefinition entry_points,
List<MethodDefinition> entry_signatures, IEnumerable<string> options)
{
@ -180,10 +192,8 @@ namespace OpenTK.Rewrite
{
var signature_name = (string)autogenerated.First()
.Fields.First(f => f.Name == "EntryPoint").Argument.Value;
var signature = entry_signatures.First(s => s.Name == signature_name);
var slot = (int)signature.CustomAttributes
.First(a => a.AttributeType.Name == "SlotAttribute")
.ConstructorArguments[0].Value;
var signature = entry_signatures.FirstOrDefault(s => s.Name == signature_name);
int slot = GetSlot(signature);
ProcessMethod(wrapper, signature, slot, entry_points, options);
}
@ -202,10 +212,12 @@ namespace OpenTK.Rewrite
void RemoveNativeSignatures(TypeDefinition type, List<MethodDefinition> methods)
{
while (methods.Count > 0)
// Remove all DllImports for functions called through calli, since
// their signatures are embedded directly into the calli callsite.
// This reduces dll size by ~400KB.
foreach (var m in methods.Where(s => GetSlot(s) != -1))
{
type.Methods.Remove(methods.Last());
methods.RemoveAt(methods.Count - 1);
type.Methods.Remove(m);
}
}
@ -254,11 +266,19 @@ namespace OpenTK.Rewrite
EmitConvenienceWrapper(wrapper, native, difference, body, il);
}
// push the entry point address on the stack
EmitEntryPoint(entry_points, il, slot);
if (slot != -1)
{
// push the entry point address on the stack
EmitEntryPoint(entry_points, il, slot);
// issue calli
EmitCall(il, native);
// issue calli
EmitCalli(il, native);
}
else
{
// issue DllImport call
EmitCall(il, native);
}
if (wrapper.ReturnType.Name != "Void")
{
@ -777,7 +797,7 @@ namespace OpenTK.Rewrite
il.Emit(OpCodes.Ldelem_I);
}
static void EmitCall(ILProcessor il, MethodReference reference)
static void EmitCalli(ILProcessor il, MethodReference reference)
{
var signature = new CallSite(reference.ReturnType)
{
@ -793,5 +813,10 @@ namespace OpenTK.Rewrite
// we do not need any special preparation before emiting calli.
il.Emit(OpCodes.Calli, signature);
}
static void EmitCall(ILProcessor il, MethodReference reference)
{
il.Emit(OpCodes.Call, reference);
}
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff