mirror of
https://github.com/Ryujinx/Opentk.git
synced 2024-12-23 23:05:37 +00:00
Improved GL loading speed.
Added background worker thread to W03_Extensions. Added debug output to failed WinGLContext.MakeCurrent() calls. Removed object field from Windows.MSG struct.
This commit is contained in:
parent
fe0b2c66db
commit
5e28f31660
|
@ -29,6 +29,7 @@
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
this.listBox1 = new System.Windows.Forms.ListBox();
|
this.listBox1 = new System.Windows.Forms.ListBox();
|
||||||
|
this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// listBox1
|
// listBox1
|
||||||
|
@ -40,6 +41,13 @@
|
||||||
this.listBox1.Size = new System.Drawing.Size(284, 264);
|
this.listBox1.Size = new System.Drawing.Size(284, 264);
|
||||||
this.listBox1.TabIndex = 0;
|
this.listBox1.TabIndex = 0;
|
||||||
//
|
//
|
||||||
|
// backgroundWorker1
|
||||||
|
//
|
||||||
|
this.backgroundWorker1.WorkerReportsProgress = true;
|
||||||
|
this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
|
||||||
|
this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);
|
||||||
|
this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged);
|
||||||
|
//
|
||||||
// W03_Extensions
|
// W03_Extensions
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
@ -55,5 +63,6 @@
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private System.Windows.Forms.ListBox listBox1;
|
private System.Windows.Forms.ListBox listBox1;
|
||||||
|
private System.ComponentModel.BackgroundWorker backgroundWorker1;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -26,6 +26,8 @@ namespace Examples.WinForms
|
||||||
Type glClass;
|
Type glClass;
|
||||||
Type delegatesClass;
|
Type delegatesClass;
|
||||||
Type importsClass;
|
Type importsClass;
|
||||||
|
int supported, all; // Number of supported extensions.
|
||||||
|
string driver;
|
||||||
|
|
||||||
public W03_Extensions()
|
public W03_Extensions()
|
||||||
{
|
{
|
||||||
|
@ -43,48 +45,58 @@ namespace Examples.WinForms
|
||||||
|
|
||||||
glControl.CreateContext();
|
glControl.CreateContext();
|
||||||
|
|
||||||
//listBox1.BeginInvoke(new LoadExtensionsDelegate(LoadExtensions));
|
driver =
|
||||||
ThreadPool.QueueUserWorkItem(new WaitCallback(LoadExtensions));
|
GL.GetString(GL.Enums.StringName.VENDOR) + " " +
|
||||||
|
GL.GetString(GL.Enums.StringName.RENDERER) + " " +
|
||||||
|
GL.GetString(GL.Enums.StringName.VERSION);
|
||||||
|
|
||||||
|
all = delegatesClass.GetFields(BindingFlags.Static | BindingFlags.NonPublic).Length;
|
||||||
|
this.Text = String.Format("Loading {0} functions...", all);
|
||||||
|
|
||||||
|
this.backgroundWorker1.RunWorkerAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
delegate void LoadExtensionsDelegate(object data);
|
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
|
||||||
|
|
||||||
void LoadExtensions(object data)
|
|
||||||
{
|
{
|
||||||
glControl.MakeCurrent();
|
|
||||||
|
|
||||||
FieldInfo[] v = delegatesClass.GetFields(BindingFlags.Static | BindingFlags.NonPublic);
|
FieldInfo[] v = delegatesClass.GetFields(BindingFlags.Static | BindingFlags.NonPublic);
|
||||||
|
int i = 0;
|
||||||
int i = 0, supported = 0;
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
foreach (FieldInfo f in v)
|
foreach (FieldInfo f in v)
|
||||||
{
|
{
|
||||||
Delegate d = GL.GetDelegate(f.Name, f.FieldType);
|
object d = f.GetValue(delegatesClass);
|
||||||
|
|
||||||
f.SetValue(null, d);
|
|
||||||
listBox1.Items.Add(String.Format("{0}/{1} {2}: {3}",
|
|
||||||
(++i).ToString(), v.Length, d != null ? "ok" : "failed", f.Name));
|
|
||||||
|
|
||||||
listBox1.Update();
|
|
||||||
|
|
||||||
//Thread.Sleep(1);
|
|
||||||
|
|
||||||
if (d != null)
|
if (d != null)
|
||||||
{
|
{
|
||||||
++supported;
|
++supported;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
//this.Text = String.Format("Supported extensions: {0}", supported);
|
backgroundWorker1.ReportProgress((int)(((float)i / all) * 100.0f),
|
||||||
|
String.Format("{0}/{1} {2}: {3}", (++i).ToString(), all, d != null ? "ok" : "failed", f.Name));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception expt)
|
catch (Exception expt)
|
||||||
{
|
{
|
||||||
MessageBox.Show("An error occured while loading extensions", "Extension loading failed", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
MessageBox.Show(expt.ToString(), "An error occured while loading extensions", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
|
||||||
|
{
|
||||||
|
listBox1.Items.Add(e.UserState as string);
|
||||||
|
/*
|
||||||
|
if ((e.UserState as string).Contains("failed"))
|
||||||
|
{
|
||||||
|
Graphics c = listBox1.CreateGraphics();
|
||||||
|
c.
|
||||||
|
c.DrawRectangle(new Pen(Color.Gray), listBox1.GetItemRectangle(listBox1.Items.Count - 1));
|
||||||
|
c.Dispose();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
#region IExample Members
|
#region IExample Members
|
||||||
|
|
||||||
|
@ -94,5 +106,11 @@ namespace Examples.WinForms
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
|
||||||
|
{
|
||||||
|
this.Text = String.Format("{0}: {1}/{2} OpenGL functions supported.",
|
||||||
|
driver, supported, all);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -100,6 +100,7 @@ namespace OpenTK
|
||||||
}
|
}
|
||||||
|
|
||||||
this.Visible = true;
|
this.Visible = true;
|
||||||
|
this.CreateControl();
|
||||||
|
|
||||||
GL.LoadAll();
|
GL.LoadAll();
|
||||||
Glu.LoadAll();
|
Glu.LoadAll();
|
||||||
|
|
|
@ -202,10 +202,12 @@ namespace OpenTK.OpenGL
|
||||||
/// </returns>
|
/// </returns>
|
||||||
public static Delegate GetDelegate(string name, Type signature)
|
public static Delegate GetDelegate(string name, Type signature)
|
||||||
{
|
{
|
||||||
MethodInfo m = importsClass.GetMethod(name.Substring(2), BindingFlags.Static | BindingFlags.NonPublic);
|
//MethodInfo m = importsClass.GetMethod(name.Substring(2), BindingFlags.Static | BindingFlags.NonPublic);
|
||||||
|
MethodInfo m;
|
||||||
return
|
return
|
||||||
Utilities.GetExtensionDelegate(name, signature) ??
|
Utilities.GetExtensionDelegate(name, signature) ??
|
||||||
(m != null ? Delegate.CreateDelegate(signature, m) : null);
|
((m = importsClass.GetMethod(name.Substring(2), BindingFlags.Static | BindingFlags.NonPublic)) != null ?
|
||||||
|
Delegate.CreateDelegate(signature, m) : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -245,6 +247,10 @@ namespace OpenTK.OpenGL
|
||||||
}
|
}
|
||||||
|
|
||||||
f.SetValue(null, d);
|
f.SetValue(null, d);
|
||||||
|
|
||||||
|
//Type type = f.ReflectedType;
|
||||||
|
//TypedReference t = __makeref(type);
|
||||||
|
//f.SetValueDirect(t, d);
|
||||||
}
|
}
|
||||||
|
|
||||||
time.Stop();
|
time.Stop();
|
||||||
|
|
|
@ -2977,7 +2977,7 @@ namespace OpenTK.Platform.Windows
|
||||||
public IntPtr LParam;
|
public IntPtr LParam;
|
||||||
public uint Time;
|
public uint Time;
|
||||||
public POINT Point;
|
public POINT Point;
|
||||||
public object RefObject;
|
//public object RefObject;
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
|
|
|
@ -194,7 +194,10 @@ namespace OpenTK.Platform.Windows
|
||||||
|
|
||||||
public void MakeCurrent()
|
public void MakeCurrent()
|
||||||
{
|
{
|
||||||
Wgl.Imports.MakeCurrent(deviceContext, renderContext);
|
if (!Wgl.Imports.MakeCurrent(deviceContext, renderContext))
|
||||||
|
{
|
||||||
|
Debug.Print("WinGLContext.MakeCurrent() call failed. Error: {0}", Marshal.GetLastWin32Error());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
Loading…
Reference in a new issue