createEGLSurfaceFromIOSurface method
For iOS only: Creates an EGL surface from an IOSurface pointer
Implementation
Pointer<Void>? createEGLSurfaceFromIOSurface(Pointer<Void> ioSurfacePtr, int width, int height) {
if (!_isApple) return null;
final textureTarget = getTextureTarget(_display, _EGLconfig);
final surfaceAttribs = calloc<Int32>(20);
int i = 0;
surfaceAttribs[i++] = EGL_WIDTH;
surfaceAttribs[i++] = width;
surfaceAttribs[i++] = EGL_HEIGHT;
surfaceAttribs[i++] = height;
surfaceAttribs[i++] = EGL_IOSURFACE_PLANE_ANGLE;
surfaceAttribs[i++] = 0;
surfaceAttribs[i++] = EGL_TEXTURE_TARGET;
surfaceAttribs[i++] = textureTarget;
surfaceAttribs[i++] = EGL_TEXTURE_INTERNAL_FORMAT_ANGLE;
surfaceAttribs[i++] = GL_BGRA_EXT;
surfaceAttribs[i++] = EGL_TEXTURE_FORMAT;
surfaceAttribs[i++] = EGL_TEXTURE_RGBA;
surfaceAttribs[i++] = EGL_TEXTURE_TYPE_ANGLE;
surfaceAttribs[i++] = GL_UNSIGNED_BYTE;
surfaceAttribs[i++] = EGL_NONE;
Pointer<Void>? macIosSurface;
try {
macIosSurface = eglCreatePbufferFromClientBuffer(
_display,
EGL_IOSURFACE_ANGLE, // 0x3454
ioSurfacePtr,
_EGLconfig,
surfaceAttribs
);
if (macIosSurface != nullptr) {
// Immediately make the surface current to initialize it properly
try {
eglMakeCurrent(_display, macIosSurface, macIosSurface, _baseAppContext);
angleConsole.info("Successfully made EGL surface current from IOSurface");
} catch (e) {
angleConsole.error("Failed to make EGL surface current: $e");
return null;
}
}
angleConsole.info("Successfully created EGL surface from IOSurface");
} catch (e) {
angleConsole.error("Failed to create EGL surface from IOSurface: $e");
macIosSurface = nullptr;
} finally {
calloc.free(surfaceAttribs);
}
return macIosSurface;
}