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

SDL- get HDC device context for OpenGL/OpenCL shared context

我正在按照本指南进行 OpenGL/OpenCL 互操作: Intel CL/GL interop tutorial

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

谷歌搜索后,我发现线程提供了获取 SDL 的 HDC 的方法 window: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编译时,出现错误"unknown type name 'SDL_SysWMinfo'"。 SDL_SysWMinfo可以在官方文档中找到,我有最新的SDL版本,所以应该可以。我猜类型定义不在我的 SDL.h 头文件中——我需要另一个头文件吗?

最便携且与框架无关的方法是使用特定于平台的 WSI 函数来查询可绘制对象和 OpenGL 上下文。使用一些 typedef,您可以制作可移植的包装器,然后您可以使用它来查询上下文和可绘制对象。

#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 window 最新时使用它们,以便 OpenGL 上下文处于活动状态并使用这些包装器对其进行查询。您可能会注意到,在 GLX 版本中,getCurrentGLDrawable 和 getCurrentGLWindow return 是同一回事。也就是说,因为 X11 不区分 windows 和 drawables.