SKImage ToImage(Texture2D texture) { // Taken form VL.Video.MediaFoundation const int GL_TEXTURE_BINDING_2D = 0x8069; var eglContext = renderContext.EglContext; var eglImage = eglContext.CreateImageFromD3D11Texture(texture.NativePointer); uint textureId = 0; NativeGles.glGenTextures(1, ref textureId); // We need to restore the currently bound texture (https://github.com/devvvvs/vvvv/issues/5925) NativeGles.glGetIntegerv(GL_TEXTURE_BINDING_2D, out var currentTextureId); NativeGles.glBindTexture(NativeGles.GL_TEXTURE_2D, textureId); NativeGles.glEGLImageTargetTexture2DOES(NativeGles.GL_TEXTURE_2D, eglImage); NativeGles.glBindTexture(NativeGles.GL_TEXTURE_2D, (uint)currentTextureId); var description = texture.Description; var colorType = GetColorType(description.Format); var glInfo = new GRGlTextureInfo( id: textureId, target: NativeGles.GL_TEXTURE_2D, format: colorType.ToGlSizedFormat()); var backendTexture = new GRBackendTexture( width: description.Width, height: description.Height, mipmapped: false, glInfo: glInfo); var image = SKImage.FromTexture( renderContext.SkiaContext, backendTexture, GRSurfaceOrigin.BottomLeft, colorType, SKAlphaType.Premul, colorspace: SKColorSpace.CreateSrgb(), releaseProc: _ => { renderContext.MakeCurrent(); backendTexture.Dispose(); NativeGles.glDeleteTextures(1, ref textureId); eglImage.Dispose(); texture.Dispose(); }); return(image); }