未验证 提交 37a4af0c 编写于 作者: C Chris Bracken 提交者: GitHub

Reuse texture cache in ios_external_texture_gl (#11524)

In current implementation, external texture data flow is a
producer-consumer model. When painting external texture, it always asks
registered external texture object to produce new CVPixelBuffer, then
transforms it to texture. `MarkNewFrameAvailable` function is ignored.
This commit changes the dataflow. Now ios_external_texture_gl caches
previous opengl texture, if no new frame are available, it do not
`copyPixelBuffer` method, just uses cached opengl texture to draw.

This is a re-land of flutter/engine#9806, which was previously reverted
in flutter/engine#11522.
上级 3ab68dd8
......@@ -30,7 +30,9 @@ class IOSExternalTextureGL : public flutter::Texture {
void CreateTextureFromPixelBuffer();
void EnsureTextureCacheExists();
bool NeedUpdateTexture(bool freeze);
bool new_frame_ready_ = false;
NSObject<FlutterTexture>* external_texture_;
fml::CFRef<CVOpenGLESTextureCacheRef> cache_ref_;
fml::CFRef<CVOpenGLESTextureRef> texture_ref_;
......
......@@ -53,17 +53,24 @@ void IOSExternalTextureGL::CreateTextureFromPixelBuffer() {
}
}
bool IOSExternalTextureGL::NeedUpdateTexture(bool freeze) {
// Update texture if `texture_ref_` is reset to `nullptr` when GrContext
// is destroied or new frame is ready.
return (!freeze && new_frame_ready_) || !texture_ref_;
}
void IOSExternalTextureGL::Paint(SkCanvas& canvas,
const SkRect& bounds,
bool freeze,
GrContext* context) {
EnsureTextureCacheExists();
if (!freeze) {
if (NeedUpdateTexture(freeze)) {
auto pixelBuffer = [external_texture_ copyPixelBuffer];
if (pixelBuffer) {
buffer_ref_.Reset(pixelBuffer);
}
CreateTextureFromPixelBuffer();
new_frame_ready_ = false;
}
if (!texture_ref_) {
return;
......@@ -93,6 +100,8 @@ void IOSExternalTextureGL::OnGrContextDestroyed() {
cache_ref_.Reset(nullptr);
}
void IOSExternalTextureGL::MarkNewFrameAvailable() {}
void IOSExternalTextureGL::MarkNewFrameAvailable() {
new_frame_ready_ = true;
}
} // namespace flutter
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册