createTexture method

Future<FlutterAngleTexture> createTexture(
  1. AngleOptions options
)

Implementation

Future<FlutterAngleTexture> createTexture(AngleOptions options) async {
  final height = (options.height * options.dpr).toInt();
  final width = (options.width * options.dpr).toInt();
  late final dynamic result;

  result = await _channel.invokeMethod(_useAngle?'createTextureAngle':'createTexture', {
    "width": width,
    "height": height,
    "useSurfaceProducer": options.useSurfaceProducer
  });

  if (Platform.isAndroid) {
    _useSurface = true;
    final newTexture = FlutterAngleTexture.fromSurface(
      this,
      result['textureId']! as int,
      Pointer.fromAddress(result['surface'] as int? ?? 0),
      options
    );
    _rawOpenGl.glViewport(0, 0, width, height);

    if (!options.customRenderer) {
      _worker = RenderWorker(newTexture);
    }

    return newTexture;
  }
  else if (_isApple) {
    _useSurface = true;
    // Create the EGL surface from IOSurface before creating the texture object
    Pointer<Void>? macIosSurface;
    if (result.containsKey('surfacePointer')) {
      final surfacePointer = result['surfacePointer'] as int;
      if (surfacePointer != 0) {
        final ioSurfacePtr = Pointer<Void>.fromAddress(surfacePointer);
        macIosSurface = _createEGLSurfaceFromIOSurface(ioSurfacePtr, width, height);
        if (macIosSurface == null) {
          angleConsole.error("Failed to create EGL surface from IOSurface");
        } else {
          angleConsole.info("Successfully created EGL surface from IOSurface");
        }
      }
    }

    final newTexture = FlutterAngleTexture.fromSurface(
      this,
      result['textureId']! as int,
      macIosSurface, // We'll use an IOSurface instead
      options
    );

    _rawOpenGl.glViewport(0, 0, width, height);

    if (!options.customRenderer) {
      _worker = RenderWorker(newTexture);
    }

    return newTexture;
  }
  else if (Platform.isWindows && options.useSurfaceProducer) {
    _useSurface = true;
    // Create the EGL surface from D3DSurface before creating the texture object
    Pointer<Void>? d3dSurface;
    if (result.containsKey('surfacePointer')) {
      final surfacePointer = result['surfacePointer'] as int;
      if (surfacePointer != 0) {
        final d3dSurfacePtr = Pointer<Void>.fromAddress(surfacePointer);
        d3dSurface = _createEGLSurfaceFromD3DSurface(d3dSurfacePtr, width, height);
        if (d3dSurface == null) {
          angleConsole.info("Failed to create EGL surface from D3DSurface");
        } else {
          angleConsole.info("Successfully created EGL surface from D3DSurface");
        }
      }
    }

    final newTexture = FlutterAngleTexture.fromSurface(
      this,
      result['textureId']! as int,
      d3dSurface, // We'll use an D3DSurface instead
      options
    );
    _rawOpenGl.glViewport(0, 0, width, height);

    if (!options.customRenderer) {
      _worker = RenderWorker(newTexture);
    }

    return newTexture;
  }
  else{
    Pointer<Uint32> fbo = calloc();
    _rawOpenGl.glGenFramebuffers(1, fbo);
    _rawOpenGl.glBindFramebuffer(GL_FRAMEBUFFER, fbo.value);

    final int rbo = (result['openglTexture'] as int?) ?? (result['rbo'] as int?) ?? 0;
    if(result['openglTexture'] != null){
      _isRBO = false;
    }

    final value = _createFBOTexture(rbo, width, height);

    final newTexture = FlutterAngleTexture(
      this,
      result['textureId']! as int,
      rbo,
      fbo.value,
      value,
      options
    );

    angleConsole.info(newTexture.toMap());
    _rawOpenGl.glViewport(0, 0, width, height);

    if (!options.customRenderer) {
      _worker = RenderWorker(newTexture);
    }

    _activeFramebuffer = fbo.value;
    calloc.free(fbo);

    _rawOpenGl.glBindFramebuffer(GL_FRAMEBUFFER, 0);

    return newTexture;
  }
}