Как создать EGLSurface, используя C ++ / WinRT и ANGLE?

Я использую Microsoft филиал проекта ANGLE иметь доступ к OpenGL в универсальном приложении Windows.
Также я использую C ++ / WinRT привязка кодировать как можно больше в стандартном C ++.

Я начал с одного из примеров в проекте ANGLE и попытался преобразовать код C ++ / CX в код C ++ / WinRT, но мне не удалось найти решение для части, где я создаю поверхность EGL:

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

В C ++ / CX они используют следующий код, но я должен признать, что я не понимаю, как они получают из PropertySet с CoreWindow в 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.

РЕДАКТИРОВАТЬ: На самом деле этот Ответ на аналогичный вопрос дает много полезной информации, я буду исследовать дальше.

РЕДАКТИРОВАТЬ: Прочитав ответ, связанный с предыдущим редактированием и просмотрев правильные места в исходном коде ANGLE, я обнаружил, что моя путаница вызвана деталями реализации, специфичными для стороны ANGLE для Windows. Функция не ожидает дескриптор HWND в традиционном смысле, а скорее словарь настроек, замаскированный под HWND.
Также ошибка reinterpret_cast связана с тем, что я пытался привести объект к указателю, глупо мне ..

1

Решение

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

Поэтому при использовании типов C ++ / WinRT в приложении Universal для Windows я должен быть осторожен, чтобы не смешивать эти типы с типами C ++ / CX, используемыми другим кодом.

Я пытался привести указатель PropertySet, который эта реализация функции ожидает при использовании UWP, к указателю winrt :: Windows :: Foundation :: IInspectable. Это не тот тип C ++ / CX IInspectable, которого ожидает реализация ANGLE. Поэтому мне пришлось напрямую привести к EGLNativeWindowType:

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

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

Это одно из предостережений при попытке использовать стандартный C ++ в среде UWP. Смотрите эти ответы о совместном использовании C ++ / WinRT с кодом C ++ / CX:

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

2

Другие решения

Других решений пока нет …