SDL-获取OpenGL / OpenCL共享上下文的HDC设备上下文

时间:2015-03-27 23:25:46

标签: opengl sdl opencl sdl-2 mingw-w64

我遵循本指南的OpenGL / OpenCL互操作: Intel CL/GL interop tutorial

它说我可以使用函数clGetGLContextInfoKHR来查找当前与我的OpenGL上下文关联的设备。该函数需要一个包含OpenCL平台,OpenGL上下文和用于创建OpenGL上下文的设备上下文(HDC)的参数列表。

在谷歌搜索之后,我找到了一个线程,它提供了一个获取SDL窗口的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编译它时,我收到错误&#34;未知类型名称&#39; SDL_SysWMinfo&#39;&#34;。 SDL_SysWMinfo可以在官方文档中找到,我有最新的SDL版本,所以它应该可以工作。我猜测我的SDL.h头文件中没有类型定义 - 是否还有我需要的头文件?

1 个答案:

答案 0 :(得分:2)

最便携和框架不可知的方法是使用特定于平台的WSI函数来查询drawable和OpenGL上下文。使用几个typedef可以创建可移植的包装器,然后可以使用它来查询上下文和drawable。

#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没有区分窗口和drawables。