[X11] Correct Glx.*.SwapInterval definitions

Improved error checking means we are no longer crashing when
SwapInterval is not available.
This commit is contained in:
thefiddler 2014-05-12 14:50:03 +02:00
parent 88905cb6aa
commit 4e8786f123
2 changed files with 41 additions and 34 deletions

View file

@ -134,6 +134,8 @@ namespace OpenTK.Platform.X11
LEVEL = 3,
CONFIG_CAVEAT = 0x20,
RENDER_TYPE_SGIX = 0x8011,
SWAP_INTERVAL_EXT = 0x20F1,
MAX_SWAP_INTERVAL_EXT = 0x20F2,
}
enum GLXHyperpipeAttrib : int
@ -270,19 +272,15 @@ namespace OpenTK.Platform.X11
0x67, 0x6c, 0x58, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x73, 0x41, 0x52, 0x42, 0,
// glXSwapIntervalEXT
0x67, 0x6c, 0x58, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x45, 0x58, 0x54, 0,
// glXGetSwapIntervalEXT
0x67, 0x6c, 0x58, 0x47, 0x65, 0x74, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x45, 0x58, 0x54, 0,
// glXSwapIntervalMESA
0x67, 0x6c, 0x58, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x4d, 0x45, 0x53, 0x41, 0,
// glXGetSwapIntervalMESA
0x67, 0x6c, 0x58, 0x47, 0x65, 0x74, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x4d, 0x45, 0x53, 0x41, 0,
// glXSwapIntervalSGI
0x67, 0x6c, 0x58, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x47, 0x49, 0,
// glXGetSwapIntervalSGI
0x67, 0x6c, 0x58, 0x47, 0x65, 0x74, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x47, 0x49, 0,
};
static readonly int[] EntryPointOffsets = new int[7];
static IntPtr[] EntryPoints = new IntPtr[7];
static readonly int[] EntryPointOffsets = new int[5];
static IntPtr[] EntryPoints = new IntPtr[5];
internal Glx()
{
@ -322,8 +320,6 @@ namespace OpenTK.Platform.X11
{
for (int i = 0; i < _EntryPointsInstance.Length; i++)
{
System.Diagnostics.Debug.WriteLine(Marshal.PtrToStringAnsi(
new IntPtr(name + _EntryPointNameOffsetsInstance[i])));
_EntryPointsInstance[i] = Arb.GetProcAddress(
new IntPtr(name + _EntryPointNameOffsetsInstance[i]));
}
@ -345,6 +341,9 @@ namespace OpenTK.Platform.X11
[DllImport(Library, EntryPoint = "glXIsDirect")]
public static extern bool IsDirect(IntPtr dpy, IntPtr context);
[DllImport(Library, EntryPoint = "glXQueryDrawable")]
public static extern ErrorCode QueryDrawable(IntPtr dpy, IntPtr drawable, GLXAttribute attribute, out int value);
[DllImport(Library, EntryPoint = "glXQueryExtension")]
public static extern bool QueryExtension(IntPtr dpy, ref int errorBase, ref int eventBase);
@ -461,13 +460,7 @@ namespace OpenTK.Platform.X11
public partial class Ext
{
[AutoGenerated(EntryPoint = "glXSwapIntervalEXT")]
public static ErrorCode SwapInterval(int interval)
{
throw new NotImplementedException();
}
[AutoGenerated(EntryPoint = "glXGetSwapIntervalEXT")]
public static int GetSwapInterval()
public static ErrorCode SwapInterval(IntPtr display, IntPtr drawable, int interval)
{
throw new NotImplementedException();
}
@ -495,12 +488,6 @@ namespace OpenTK.Platform.X11
{
throw new NotImplementedException();
}
[AutoGenerated(EntryPoint = "glXGetSwapIntervalSGI")]
public static int GetSwapInterval()
{
throw new NotImplementedException();
}
}
[Slot(0)]
@ -508,22 +495,16 @@ namespace OpenTK.Platform.X11
internal unsafe static extern IntPtr glXCreateContextAttribsARB(IntPtr display, IntPtr fbconfig, IntPtr share_context, bool direct, int* attribs);
[Slot(1)]
[DllImport(Library, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
internal static extern ErrorCode glXSwapIntervalEXT(int interval);
internal static extern ErrorCode glXSwapIntervalEXT(IntPtr display, IntPtr drawable, int interval);
[Slot(2)]
[DllImport(Library, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
internal static extern int glXGetSwapIntervalEXT();
internal static extern ErrorCode glXSwapIntervalMESA(int interval);
[Slot(3)]
[DllImport(Library, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
internal static extern ErrorCode glXSwapIntervalMESA(int interval);
internal static extern int glXGetSwapIntervalMESA();
[Slot(4)]
[DllImport(Library, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
internal static extern int glXGetSwapIntervalMESA();
[Slot(5)]
[DllImport(Library, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
internal static extern ErrorCode glXSwapIntervalSGI(int interval);
[Slot(6)]
[DllImport(Library, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
internal static extern int glXGetSwapIntervalSGI();
#endregion
}

View file

@ -363,20 +363,40 @@ namespace OpenTK.Platform.X11
{
get
{
if (currentWindow == null)
{
Debug.Print("Context must be current");
throw new InvalidOperationException();
}
using (new XLock(display))
{
if (vsync_ext_supported)
return Glx.Ext.GetSwapInterval();
{
int value;
Glx.QueryDrawable(Display, currentWindow.Handle, GLXAttribute.SWAP_INTERVAL_EXT, out value);
return value;
}
else if (vsync_mesa_supported)
{
return Glx.Mesa.GetSwapInterval();
}
else if (vsync_sgi_supported)
{
return sgi_swap_interval;
else
return 0;
}
return 0;
}
}
set
{
if (currentWindow == null)
{
Debug.Print("Context must be current");
throw new InvalidOperationException();
}
if (value < 0 && !vsync_tear_supported)
{
value = 1;
@ -386,11 +406,17 @@ namespace OpenTK.Platform.X11
using (new XLock(Display))
{
if (vsync_ext_supported)
error_code = Glx.Ext.SwapInterval(value);
{
Glx.Ext.SwapInterval(Display, currentWindow.Handle, value);
}
else if (vsync_mesa_supported)
{
error_code = Glx.Mesa.SwapInterval(value);
}
else if (vsync_sgi_supported)
{
error_code = Glx.Sgi.SwapInterval(value);
}
}
if (error_code == X11.ErrorCode.NO_ERROR)