Ошибка glXChooseVisual при использовании Mono-C # в Linux - PullRequest
0 голосов
/ 05 января 2012

Когда я вызываю "glXChooseVisual" (он же GLX.ChooseVisual в C #), он возвращает нулевой IntPtr. Что меня смущает, так это когда я собираю NeHe lesson02, в основном используя тот же код, который работает (единственное отличие, которое пишется на C).

Также, когда я захожу в код из OpenTK и обнаруживаю, когда он вызывает «glXChooseVisual», он возвращает действительный визуальный ptr, и я пока не могу найти ничего, что мне не хватает.

Также, что меня беспокоит, так это то, что я работал в прошлом, как год назад. Причина, по которой я это делаю, заключается в кроссплатформенном API, который не ограничивается только OpenGL, поэтому любая помощь будет отличной.

Я пробовал все это на [Ubuntu 11.10 Nvidia 5700] и [Fedora 16 Nvidia 6100], и они оба провалились. Вы можете скопировать и вставить этот код в консольное приложение Mono-C #, чтобы проверить его.

using System;
using System.Runtime.InteropServices;

namespace TestGL
{
    static class GLX
    {
        [DllImport("libX11", EntryPoint = "XOpenDisplay", ExactSpelling = true)]
        public static extern IntPtr XOpenDisplay(IntPtr display_name);

        [DllImport("libX11", EntryPoint = "XDefaultScreen", ExactSpelling = true)]
        public static extern int XDefaultScreen(IntPtr dpy);

        [DllImport("libGL", EntryPoint = "glXChooseVisual", ExactSpelling = true)]
        public static extern IntPtr ChooseVisual(IntPtr dpy, int screen, int[] attribList);

        public const int RGBA   =   4;
        public const int DOUBLEBUFFER   =5;
        public const int RED_SIZE   =   8;
        public const int GREEN_SIZE =   9;
        public const int BLUE_SIZE  =   10;
        public const int ALPHA_SIZE =   11;
        public const int DEPTH_SIZE =   12;
        public const int None = 0x8000;
    }

    class MainClass
    {
        public static void Main (string[] args)
        {
            Console.WriteLine ("Hope this works!");

            //Get DC
            IntPtr dc = GLX.XOpenDisplay(new IntPtr(0));
            int screen = GLX.XDefaultScreen(dc);

            //Set BackBuffer format
            int[] attrListDbl =
            {
                GLX.RGBA,
                GLX.DOUBLEBUFFER,
                GLX.RED_SIZE, 8,
                GLX.GREEN_SIZE, 8,
                GLX.BLUE_SIZE, 8,
                GLX.DEPTH_SIZE, 16,
                0
            };

            IntPtr visual = GLX.ChooseVisual(dc, screen, attrListDbl);
            if (visual == IntPtr.Zero)
            {
                int[] attrListSgl =
                {
                    GLX.RGBA,
                    GLX.RED_SIZE, 8,
                    GLX.GREEN_SIZE, 8,
                    GLX.BLUE_SIZE, 8,
                    GLX.DEPTH_SIZE, 16,
                    0
                };

                visual = GLX.ChooseVisual(dc, screen, attrListSgl);
            }

            if (visual == IntPtr.Zero) 
            {
                Console.WriteLine("Failed to get visual."); 
            }
            else
            {
                Console.WriteLine("Yahoo.");    
            }

            //ctx = GLX.CreateContext(dc, visual, new IntPtr(0), true);
            //GLX.MakeCurrent(dc, handle, ctx);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 06 января 2012

Я нашел проблему. Не знаю, почему у меня не было этой проблемы год назад, но мне просто нужно было изменить "libGL" на "libgl.so.1", и это работает.

0 голосов
/ 05 января 2012

Вам не нужно указывать соглашения о вызовах? Как это:

[DllImport("libGL", ... , CallingConvention=CallingConvention.Cdecl)]

Также вы можете проверить, возвращают ли ваши первые два вызова значимые (ненулевые) значения.

...