From 57d1b1ecc40e3b53ce6d595502ca71605db2fcc2 Mon Sep 17 00:00:00 2001 From: 21pages Date: Wed, 24 Jul 2024 12:06:16 +0800 Subject: [PATCH] fix nextRgba not called when switching to texture render (#8792) Because rgba buffer render doesn't support multi display, when switch to multi display, it is possible that rgba.valid has been set to valid but nextRgab is not called, when switching back to single display, rgba.valid is still true. Fix by rgba buffer, rgba texture and gpu texture using different messages. Signed-off-by: 21pages --- flutter/lib/models/model.dart | 38 +++++++++++++++++------------------ src/flutter.rs | 4 ++-- src/flutter_ffi.rs | 2 +- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index a9962a58a..51578055d 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -2547,32 +2547,30 @@ class FFI { } } else if (message is EventToUI_Rgba) { final display = message.field0; - if (imageModel.useTextureRender || ffiModel.pi.forceTextureRender) { - //debugPrint("EventToUI_Rgba display:$display"); - textureModel.setTextureType(display: display, gpuTexture: false); + // Fetch the image buffer from rust codes. + final sz = platformFFI.getRgbaSize(sessionId, display); + if (sz == 0) { + platformFFI.nextRgba(sessionId, display); + return; + } + final rgba = platformFFI.getRgba(sessionId, display, sz); + if (rgba != null) { onEvent2UIRgba(); + imageModel.onRgba(display, rgba); } else { - // Fetch the image buffer from rust codes. - final sz = platformFFI.getRgbaSize(sessionId, display); - if (sz == 0) { - platformFFI.nextRgba(sessionId, display); - return; - } - final rgba = platformFFI.getRgba(sessionId, display, sz); - if (rgba != null) { - onEvent2UIRgba(); - imageModel.onRgba(display, rgba); - } else { - platformFFI.nextRgba(sessionId, display); - } + platformFFI.nextRgba(sessionId, display); } } else if (message is EventToUI_Texture) { final display = message.field0; - debugPrint("EventToUI_Texture display:$display"); - if (hasGpuTextureRender) { - textureModel.setTextureType(display: display, gpuTexture: true); - onEvent2UIRgba(); + final gpuTexture = message.field1; + debugPrint( + "EventToUI_Texture display:$display, gpuTexture:$gpuTexture"); + if (gpuTexture && !hasGpuTextureRender) { + debugPrint('the gpuTexture is not supported.'); + return; } + textureModel.setTextureType(display: display, gpuTexture: gpuTexture); + onEvent2UIRgba(); } }(); }); diff --git a/src/flutter.rs b/src/flutter.rs index d1e44008b..3da754506 100644 --- a/src/flutter.rs +++ b/src/flutter.rs @@ -794,7 +794,7 @@ impl InvokeUiSession for FlutterHandler { for (_, session) in self.session_handlers.read().unwrap().iter() { if session.renderer.on_texture(display, texture) { if let Some(stream) = &session.event_stream { - stream.add(EventToUI::Texture(display)); + stream.add(EventToUI::Texture(display, true)); } } } @@ -1087,7 +1087,7 @@ impl FlutterHandler { if use_texture_render || session.displays.len() > 1 { if session.renderer.on_rgba(display, rgba) { if let Some(stream) = &session.event_stream { - stream.add(EventToUI::Rgba(display)); + stream.add(EventToUI::Texture(display, false)); } } } diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index 700c08704..870a65912 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -89,7 +89,7 @@ pub fn stop_global_event_stream(app_type: String) { pub enum EventToUI { Event(String), Rgba(usize), - Texture(usize), + Texture(usize, bool), // (display, gpu_texture) } pub fn host_stop_system_key_propagate(_stopped: bool) {