#region --- License --- /* Copyright (c) 2006, 2007 Stefanos Apostolopoulos * Contributions from Erik Ylvisaker * See license.txt for license info */ #endregion using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.Security; #pragma warning disable 1591 namespace OpenTK.Platform.X11 { #region Enums enum GLXAttribute : int { TRANSPARENT_BLUE_VALUE_EXT = 0x27, GRAY_SCALE = 0x8006, RGBA_TYPE = 0x8014, TRANSPARENT_RGB_EXT = 0x8008, ACCUM_BLUE_SIZE = 16, SHARE_CONTEXT_EXT = 0x800A, STEREO = 6, ALPHA_SIZE = 11, FLOAT_COMPONENTS_NV = 0x20B0, NONE = 0x8000, DEPTH_SIZE = 12, TRANSPARENT_INDEX_VALUE_EXT = 0x24, MAX_PBUFFER_WIDTH_SGIX = 0x8016, GREEN_SIZE = 9, X_RENDERABLE_SGIX = 0x8012, LARGEST_PBUFFER = 0x801C, DONT_CARE = unchecked((int)0xFFFFFFFF), TRANSPARENT_ALPHA_VALUE_EXT = 0x28, PSEUDO_COLOR_EXT = 0x8004, USE_GL = 1, SAMPLE_BUFFERS_SGIS = 100000, TRANSPARENT_GREEN_VALUE_EXT = 0x26, HYPERPIPE_ID_SGIX = 0x8030, COLOR_INDEX_TYPE_SGIX = 0x8015, SLOW_CONFIG = 0x8001, PRESERVED_CONTENTS = 0x801B, ACCUM_RED_SIZE = 14, EVENT_MASK = 0x801F, VISUAL_ID_EXT = 0x800B, EVENT_MASK_SGIX = 0x801F, SLOW_VISUAL_EXT = 0x8001, TRANSPARENT_GREEN_VALUE = 0x26, MAX_PBUFFER_WIDTH = 0x8016, DIRECT_COLOR_EXT = 0x8003, VISUAL_ID = 0x800B, ACCUM_GREEN_SIZE = 15, DRAWABLE_TYPE_SGIX = 0x8010, SCREEN_EXT = 0x800C, SAMPLES = 100001, HEIGHT = 0x801E, TRANSPARENT_INDEX_VALUE = 0x24, SAMPLE_BUFFERS_ARB = 100000, PBUFFER = 0x8023, RGBA_TYPE_SGIX = 0x8014, MAX_PBUFFER_HEIGHT = 0x8017, FBCONFIG_ID_SGIX = 0x8013, DRAWABLE_TYPE = 0x8010, SCREEN = 0x800C, RED_SIZE = 8, VISUAL_SELECT_GROUP_SGIX = 0x8028, VISUAL_CAVEAT_EXT = 0x20, PSEUDO_COLOR = 0x8004, PBUFFER_HEIGHT = 0x8040, STATIC_GRAY = 0x8007, PRESERVED_CONTENTS_SGIX = 0x801B, RGBA_FLOAT_TYPE_ARB = 0x20B9, TRANSPARENT_RED_VALUE = 0x25, TRANSPARENT_ALPHA_VALUE = 0x28, WINDOW = 0x8022, X_RENDERABLE = 0x8012, STENCIL_SIZE = 13, TRANSPARENT_RGB = 0x8008, LARGEST_PBUFFER_SGIX = 0x801C, STATIC_GRAY_EXT = 0x8007, TRANSPARENT_BLUE_VALUE = 0x27, DIGITAL_MEDIA_PBUFFER_SGIX = 0x8024, BLENDED_RGBA_SGIS = 0x8025, NON_CONFORMANT_VISUAL_EXT = 0x800D, COLOR_INDEX_TYPE = 0x8015, TRANSPARENT_RED_VALUE_EXT = 0x25, GRAY_SCALE_EXT = 0x8006, WINDOW_SGIX = 0x8022, X_VISUAL_TYPE = 0x22, MAX_PBUFFER_HEIGHT_SGIX = 0x8017, DOUBLEBUFFER = 5, OPTIMAL_PBUFFER_WIDTH_SGIX = 0x8019, X_VISUAL_TYPE_EXT = 0x22, WIDTH_SGIX = 0x801D, STATIC_COLOR_EXT = 0x8005, BUFFER_SIZE = 2, DIRECT_COLOR = 0x8003, MAX_PBUFFER_PIXELS = 0x8018, NONE_EXT = 0x8000, HEIGHT_SGIX = 0x801E, RENDER_TYPE = 0x8011, FBCONFIG_ID = 0x8013, TRANSPARENT_INDEX_EXT = 0x8009, TRANSPARENT_INDEX = 0x8009, TRANSPARENT_TYPE_EXT = 0x23, ACCUM_ALPHA_SIZE = 17, PBUFFER_SGIX = 0x8023, MAX_PBUFFER_PIXELS_SGIX = 0x8018, OPTIMAL_PBUFFER_HEIGHT_SGIX = 0x801A, DAMAGED = 0x8020, SAVED_SGIX = 0x8021, TRANSPARENT_TYPE = 0x23, MULTISAMPLE_SUB_RECT_WIDTH_SGIS = 0x8026, NON_CONFORMANT_CONFIG = 0x800D, BLUE_SIZE = 10, TRUE_COLOR_EXT = 0x8002, SAMPLES_SGIS = 100001, SAMPLES_ARB = 100001, TRUE_COLOR = 0x8002, RGBA = 4, AUX_BUFFERS = 7, SAMPLE_BUFFERS = 100000, SAVED = 0x8021, MULTISAMPLE_SUB_RECT_HEIGHT_SGIS = 0x8027, DAMAGED_SGIX = 0x8020, STATIC_COLOR = 0x8005, PBUFFER_WIDTH = 0x8041, WIDTH = 0x801D, LEVEL = 3, CONFIG_CAVEAT = 0x20, RENDER_TYPE_SGIX = 0x8011, } enum GLXHyperpipeAttrib : int { PIPE_RECT_LIMITS_SGIX = 0x00000002, PIPE_RECT_SGIX = 0x00000001, HYPERPIPE_STEREO_SGIX = 0x00000003, HYPERPIPE_PIXEL_AVERAGE_SGIX = 0x00000004, } enum GLXStringName : int { EXTENSIONS = 0x3, VERSION = 0x2, VENDOR = 0x1, } enum GLXEventMask : int { PBUFFER_CLOBBER_MASK = 0x08000000, BUFFER_CLOBBER_MASK_SGIX = 0x08000000, } enum GLXRenderTypeMask : int { COLOR_INDEX_BIT_SGIX = 0x00000002, RGBA_BIT = 0x00000001, RGBA_FLOAT_BIT_ARB = 0x00000004, RGBA_BIT_SGIX = 0x00000001, COLOR_INDEX_BIT = 0x00000002, } enum GLXHyperpipeTypeMask : int { HYPERPIPE_RENDER_PIPE_SGIX = 0x00000002, HYPERPIPE_DISPLAY_PIPE_SGIX = 0x00000001, } enum GLXPbufferClobberMask : int { ACCUM_BUFFER_BIT_SGIX = 0x00000080, FRONT_LEFT_BUFFER_BIT = 0x00000001, BACK_RIGHT_BUFFER_BIT = 0x00000008, FRONT_RIGHT_BUFFER_BIT_SGIX = 0x00000002, STENCIL_BUFFER_BIT_SGIX = 0x00000040, SAMPLE_BUFFERS_BIT_SGIX = 0x00000100, STENCIL_BUFFER_BIT = 0x00000040, BACK_RIGHT_BUFFER_BIT_SGIX = 0x00000008, BACK_LEFT_BUFFER_BIT_SGIX = 0x00000004, AUX_BUFFERS_BIT = 0x00000010, DEPTH_BUFFER_BIT_SGIX = 0x00000020, ACCUM_BUFFER_BIT = 0x00000080, AUX_BUFFERS_BIT_SGIX = 0x00000010, DEPTH_BUFFER_BIT = 0x00000020, FRONT_LEFT_BUFFER_BIT_SGIX = 0x00000001, BACK_LEFT_BUFFER_BIT = 0x00000004, FRONT_RIGHT_BUFFER_BIT = 0x00000002, } enum GLXHyperpipeMisc : int { HYPERPIPE_PIPE_NAME_LENGTH_SGIX = 80, } enum GLXErrorCode : int { BAD_CONTEXT = 5, NO_EXTENSION = 3, BAD_HYPERPIPE_SGIX = 92, BAD_ENUM = 7, BAD_SCREEN = 1, BAD_VALUE = 6, BAD_ATTRIBUTE = 2, BAD_VISUAL = 4, BAD_HYPERPIPE_CONFIG_SGIX = 91, } enum GLXSyncType : int { SYNC_SWAP_SGIX = 0x00000001, SYNC_FRAME_SGIX = 0x00000000, } enum GLXDrawableTypeMask : int { WINDOW_BIT = 0x00000001, PIXMAP_BIT = 0x00000002, PBUFFER_BIT_SGIX = 0x00000004, PBUFFER_BIT = 0x00000004, WINDOW_BIT_SGIX = 0x00000001, PIXMAP_BIT_SGIX = 0x00000002, } enum ArbCreateContext : int { DebugBit = 0x0001, ForwardCompatibleBit = 0x0002, MajorVersion = 0x2091, MinorVersion = 0x2092, LayerPlane = 0x2093, Flags = 0x2094, ErrorInvalidVersion = 0x2095, } enum ErrorCode : int { NO_ERROR = 0, BAD_SCREEN = 1, /* screen # is bad */ BAD_ATTRIBUTE = 2, /* attribute to get is bad */ NO_EXTENSION = 3, /* no glx extension on server */ BAD_VISUAL = 4, /* visual # not known by GLX */ BAD_CONTEXT = 5, /* returned only by import_context EXT? */ BAD_VALUE = 6, /* returned only by glXSwapIntervalSGI? */ BAD_ENUM = 7, /* unused? */ } #endregion /// \internal /// /// Provides access to GLX functions. /// partial class Glx { #region GLX functions [DllImport(Library, EntryPoint = "glXIsDirect")] public static extern bool IsDirect(IntPtr dpy, IntPtr context); [DllImport(Library, EntryPoint = "glXQueryExtension")] public static extern bool QueryExtension(IntPtr dpy, ref int errorBase, ref int eventBase); [DllImport(Library, EntryPoint = "glXQueryExtensionsString")] static extern IntPtr QueryExtensionsStringInternal(IntPtr dpy, int screen); public static string QueryExtensionsString(IntPtr dpy, int screen) { return Marshal.PtrToStringAnsi(QueryExtensionsStringInternal(dpy, screen)); } [DllImport(Library, EntryPoint = "glXCreateContext")] public static extern IntPtr CreateContext(IntPtr dpy, IntPtr vis, IntPtr shareList, bool direct); [DllImport(Library, EntryPoint = "glXCreateContext")] public static extern IntPtr CreateContext(IntPtr dpy, ref XVisualInfo vis, IntPtr shareList, bool direct); [DllImport(Library, EntryPoint = "glXDestroyContext")] public static extern void DestroyContext(IntPtr dpy, IntPtr context); public static void DestroyContext(IntPtr dpy, ContextHandle context) { DestroyContext(dpy, context.Handle); } [DllImport(Library, EntryPoint = "glXGetCurrentContext")] public static extern IntPtr GetCurrentContext(); [DllImport(Library, EntryPoint = "glXMakeCurrent")] public static extern bool MakeCurrent(IntPtr display, IntPtr drawable, IntPtr context); public static bool MakeCurrent(IntPtr display, IntPtr drawable, ContextHandle context) { return MakeCurrent(display, drawable, context.Handle); } [DllImport(Library, EntryPoint = "glXSwapBuffers")] public static extern void SwapBuffers(IntPtr display, IntPtr drawable); [DllImport(Library, EntryPoint = "glXGetProcAddress")] public static extern IntPtr GetProcAddress([MarshalAs(UnmanagedType.LPTStr)] string procName); [DllImport(Library, EntryPoint = "glXGetConfig")] public static extern int GetConfig(IntPtr dpy, ref XVisualInfo vis, GLXAttribute attrib, out int value); #region glXChooseVisual [DllImport(Library, EntryPoint = "glXChooseVisual")] public extern static IntPtr ChooseVisual(IntPtr dpy, int screen, IntPtr attriblist); [DllImport(Library, EntryPoint = "glXChooseVisual")] public extern static IntPtr ChooseVisual(IntPtr dpy, int screen, ref int attriblist); public static IntPtr ChooseVisual(IntPtr dpy, int screen, int[] attriblist) { unsafe { fixed (int* attriblist_ptr = attriblist) { return ChooseVisual(dpy, screen, (IntPtr)attriblist_ptr); } } } // Returns an array of GLXFBConfig structures. [DllImport(Library, EntryPoint = "glXChooseFBConfig")] unsafe public extern static IntPtr* ChooseFBConfig(IntPtr dpy, int screen, int[] attriblist, out int fbount); // Returns a pointer to an XVisualInfo structure. [DllImport(Library, EntryPoint = "glXGetVisualFromFBConfig")] public unsafe extern static IntPtr GetVisualFromFBConfig(IntPtr dpy, IntPtr fbconfig); #endregion #region Extensions public partial class Sgi { public static ErrorCode SwapInterval(int interval) { return (ErrorCode)Delegates.glXSwapIntervalSGI(interval); } } public partial class Arb { #region CreateContextAttribs unsafe public static IntPtr CreateContextAttribs(IntPtr display, IntPtr fbconfig, IntPtr share_context, bool direct, int* attribs) { return Delegates.glXCreateContextAttribsARB(display, fbconfig, share_context, direct, attribs); } public static IntPtr CreateContextAttribs(IntPtr display, IntPtr fbconfig, IntPtr share_context, bool direct, int[] attribs) { unsafe { fixed (int* attribs_ptr = attribs) { return Delegates.glXCreateContextAttribsARB(display, fbconfig, share_context, direct, attribs_ptr); } } } #endregion } internal static partial class Delegates { [SuppressUnmanagedCodeSecurity] public delegate int SwapIntervalSGI(int interval); public static SwapIntervalSGI glXSwapIntervalSGI = null; [SuppressUnmanagedCodeSecurity] unsafe public delegate IntPtr CreateContextAttribsARB(IntPtr display, IntPtr fbconfig, IntPtr share_context, bool direct, int* attribs); unsafe public static CreateContextAttribsARB glXCreateContextAttribsARB = null; } #endregion #endregion } } #pragma warning restore 1591