createEGLSurfaceFromIOSurface method

Pointer<Void>? createEGLSurfaceFromIOSurface(
  1. Pointer<Void> ioSurfacePtr,
  2. int width,
  3. int height
)

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;
}