2015-03-27 2 views
0

Я следующий этого руководством для OpenGL/OpenCL Interop: Intel CL/GL interop tutorialSDL- получить контекст устройства HDC для OpenGL/OpenCL общего контекста

Он говорит, что я могу использовать функцию clGetGLContextInfoKHR, чтобы найти устройство в данный момент связан с моим Контекст OpenGL. Для функции требуется список параметров, содержащих платформу OpenCL, контекст OpenGL и контекст устройства (HDC), используемый для создания контекста OpenGL.

После прибегая к помощи, я нашел нить, что дает метод, чтобы получить HDC для СВД окна: thread Они предлагают использовать этот код:

#ifdef _WIN32 
    SDL_SysWMinfo info; 
    SDL_VERSION(&info.version); 
    if (SDL_GetWMInfo(&info) < 0) 
     fail(); 

    hwnd = info.window; 
#endif 

Во-первых, это выглядит, как он работает только для Win32 , Будет ли он работать для 64-битной Windows? И есть ли способ сделать то же самое в Linux/OSX?

Во-вторых, когда я скомпилирую его с помощью MinGW-w64, я получаю сообщение об ошибке «неизвестное имя типа« SDL_SysWMinfo ». SDL_SysWMinfo можно найти в официальных документах, и у меня есть последняя версия SDL, поэтому она должна работать. Я предполагаю, что определение типа не в моем файле заголовка SDL.h - есть ли другой файл заголовка, в котором я нуждаюсь?

+0

SDL [1.2] (https://hg.libsdl.org/SDL/file/d7de8d4232c4/include/SDL_syswm.h#l217) или [2.0] (https://hg.libsdl.org/SDL/file /default/include/SDL_syswm.h#l284)? – genpfault

+0

Я использую SDL 2.0 – Norg74

ответ

2

Самый переносимый и комплексный агностический метод - использовать специфические для платформы функции WSI для запроса контекста с возможностью рисования и OpenGL. Используя несколько typedefs, вы можете создавать переносные оболочки, которые затем можно использовать для запроса контекста и вывода.

#if defined(_WIN32) 
typedef HGLRC GLContext; 
typedef HDC GLDrawable; 
typedef HWND GLWindow; 

GLContext getCurrentGLContext(void) { return wglGetCurrentContext(); } 
GLDrawable getCurrentGLDrawable(void) { return wglGetCurrentDC(); } 
GLWindow getCurrentGLWindow(void) { return WindowFromDC(wglGetCurrentDC()); } 
#elif defined(__unix__) 
/* FIXME: consider Wayland or a EGL environment */ 
typedef GLXContext GLContext; 
typedef GLXDrawable GLDrawable; 
typedef Window GLWindow; 

GLContext getCurrentGLContext(void) { return glXGetCurrentContext(); } 
GLDrawable getCurrentGLDrawable(void) { return glXGetCurrentDrawable(); } 
GLWindow getCurrentGLWindow(void) { return glXGetCurrentDrawable(); } 
#elif __APPLE__ 
/* FIXME: Implement this for MacOS X 
#endif 

Используйте их в то время как SDL окно является текущим, так что контекст OpenGL активен и запросить его с помощью этих оберток. Вы можете заметить, что в версии GLX getCurrentGLDrawable и getCurrentGLWindow возвращают то же самое. То есть, поскольку X11 не делает различий между окнами и чертежами.

Смежные вопросы