如何使用C ++ / WinRT和ANGLE创建EGLSurface?

时间:2017-10-03 17:25:49

标签: c++ visual-c++ c++-winrt google-angle

我正在使用Microsoft branch of the ANGLE project访问通用Windows应用程序中的OpenGL。 我也使用C++/WinRT binding在标准C ++中编码尽可能多。

我从ANGLE项目中的一个示例开始,尝试将C ++ / CX代码转换为C ++ / WinRT代码,但是我找不到创建EGL Surface的部分的解决方案:

mEGLSurface = eglCreateWindowSurface(mEGLDisplay, config, /*WHERE IS MY HWND?*/, NULL);

在C ++ / CX中,他们使用以下代码,但我必须承认,我不知道他们如何从带有CoreWindow的PropertySet到EGLNativeWindowType(在本例中为HWND)以及如何将其转换为C ++ / WinRT代码:

PropertySet^ surfaceCreationProperties = ref new PropertySet();
surfaceCreationProperties->Insert(ref new String(EGLNativeWindowTypeProperty), window);

mEglSurface = eglCreateWindowSurface(mEglDisplay, config, reinterpret_cast<IInspectable*>(surfaceCreationProperties), surfaceAttributes);

编辑:当天真地将代码转换为C ++ / WinRT约定时,reinterpret_cast会给出“无效的强制转换”错误(从IInspectable到EGLNativeWindowType)。

编辑:为了完整起见,window参数是Windows :: UI :: Core :: CoreWindow。

编辑:实际上this对类似问题的回答提供了很多好消息,我会进一步调查。

编辑:在阅读了上一个编辑中链接的答案并查看ANGLE源代码中的正确位置后,我发现我的混淆是由ANGLE的Windows端特定的实现细节引起的。该功能并不期望传统意义上的HWND句柄,而更像是伪装成HWND的设置字典。 此外,reinterpret_cast错误是由于我试图将一个对象强制转换为一个指针,我很傻。

2 个答案:

答案 0 :(得分:2)

EGLNativeWindowType在ANGLE中定义如下:

#if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) /* Windows Desktop */
typedef HWND    EGLNativeWindowType;
#else /* Windows Store */
#include <inspectable.h>
typedef IInspectable* EGLNativeWindowType;
#endif

因此,当在通用Windows应用程序中使用C ++ / WinRT类型时,我必须小心不要将这些类型与其他代码使用的C ++ / CX类型混合。

我试图将使用UWP的函数的这个实现转换为一个winSet :: Windows :: Foundation :: IInspectable指针的PropertySet指针。这不是ANGLE实现所期望的C ++ / CX IInspectable类型。所以我不得不直接转向EGLNativeWindowType:

PropertySet surfaceProperties;
surfaceProperties.Insert(EGLNativeWindowTypeProperty, window);
EGLNativeWindowType win = reinterpret_cast<EGLNativeWindowType>(&surfaceProperties);

mEGLSurface = eglCreateWindowSurface(mEGLDisplay, config, win, surfaceAttributes);

这是尝试在UWP环境中使用标准C ++时的一个注意事项。有关使用C ++ / CX代码共享C ++ / WinRT的信息,请参阅以下答案:

https://stackoverflow.com/a/39775875/1891866

答案 1 :(得分:0)

winrt'PropertySet与cx'PropertySet不兼容也存在问题。

这对我有用:

PropertySet surfaceCreationProperties;
surfaceCreationProperties.Insert(EGLNativeWindowTypeProperty, panel);
EGLNativeWindowType win = static_cast<EGLNativeWindowType>(winrt::get_abi(surfaceCreationProperties));
surface = eglCreateWindowSurface(mEglDisplay, mEglConfig, win, surfaceAttributes);