keep context handle and call engine->execute() on every call to render() (fixes lock bug on webgl)

This commit is contained in:
Nick Fisher
2024-06-15 13:53:15 +08:00
parent 6268ed7ad1
commit bea8dc64a0
2 changed files with 28 additions and 16 deletions

View File

@@ -163,7 +163,7 @@ namespace flutter_filament
private:
const ResourceLoaderWrapperImpl *const _resourceLoaderWrapper;
void* _context = nullptr;
Scene *_scene = nullptr;
View *_view = nullptr;
Engine *_engine = nullptr;

View File

@@ -27,6 +27,11 @@
#include <backend/platforms/OpenGLPlatform.h>
#ifdef __EMSCRIPTEN__
#include <backend/platforms/PlatformWebGL.h>
#include <emscripten/emscripten.h>
#include <emscripten/bind.h>
#include <emscripten/html5.h>
#include <emscripten/threading.h>
#include <emscripten/val.h>
#endif
#include <filament/ColorGrading.h>
#include <filament/Engine.h>
@@ -124,6 +129,7 @@ namespace flutter_filament
FilamentViewer::FilamentViewer(const void *sharedContext, const ResourceLoaderWrapperImpl *const ResourceLoaderWrapperImpl, void *const platform, const char *uberArchivePath)
: _resourceLoaderWrapper(ResourceLoaderWrapperImpl)
{
_context = (void*) sharedContext;
ASSERT_POSTCONDITION(_resourceLoaderWrapper != nullptr, "Resource loader must be non-null");
@@ -142,21 +148,28 @@ namespace flutter_filament
#else
_engine = Engine::create(Engine::Backend::OPENGL, (backend::Platform *)platform, (void *)sharedContext, nullptr);
#endif
Log("Created engine");
_engine->setAutomaticInstancingEnabled(true);
_renderer = _engine->createRenderer();
Log("Created renderer");
_frameInterval = 1000.0f / 60.0f;
setFrameInterval(_frameInterval);
_scene = _engine->createScene();
Log("Created scene");
utils::Entity camera = EntityManager::get().create();
_mainCamera = _engine->createCamera(camera);
Log("Created camera");
_view = _engine->createView();
setToneMapping(ToneMapping::ACES);
@@ -200,6 +213,8 @@ namespace flutter_filament
_scene,
uberArchivePath);
Log("Created scene maager");
_imageTexture = Texture::Builder()
.width(1)
.height(1)
@@ -318,6 +333,7 @@ namespace flutter_filament
_frameInterval = frameInterval;
Renderer::FrameRateOptions fro;
fro.interval = 1; // frameInterval;
fro.history = 5;
_renderer->setFrameRateOptions(fro);
Log("Set frame interval to %f", frameInterval);
}
@@ -526,7 +542,7 @@ namespace flutter_filament
void FilamentViewer::setBackgroundColor(const float r, const float g, const float b, const float a)
{
Log("Setting background color to rgba(%f,%f,%f,%f)", r, g, b, a);
// Log("Setting background color to rgba(%f,%f,%f,%f)", r, g, b, a);
_imageMaterial->setDefaultParameter("showImage", 0);
_imageMaterial->setDefaultParameter("backgroundColor", RgbaType::sRGB, float4(r, g, b, a));
_imageMaterial->setDefaultParameter("transform", _imageScale);
@@ -1051,13 +1067,6 @@ namespace flutter_filament
return;
}
// if (_frameCount == 60)
// {
// Log("Skipped frames : %d", _skippedFrames);
// _elapsed = 0;
// _frameCount = 0;
// _skippedFrames = 0;
// }
auto now = std::chrono::high_resolution_clock::now();
auto secsSinceLastFpsCheck = float(std::chrono::duration_cast<std::chrono::seconds>(now - _fpsCounterStartTime).count());
@@ -1088,9 +1097,16 @@ namespace flutter_filament
// Render the scene, unless the renderer wants to skip the frame.
bool beginFrame = _renderer->beginFrame(_swapChain, frameTimeInNanos);
if (!beginFrame)
{
_skippedFrames++;
}
// beginFrame = true;
if (beginFrame)
{
_renderer->render(_view);
_frameCount++;
@@ -1122,14 +1138,10 @@ namespace flutter_filament
_renderer->readPixels(_rt, 0, 0, vp.width, vp.height, std::move(pbd));
}
_renderer->endFrame();
#ifdef __EMSCRIPTEN__
}
#ifdef __EMSCRIPTEN__
_engine->execute();
#endif
}
else
{
_skippedFrames++;
}
#endif
}
void FilamentViewer::savePng(void *buf, size_t size, int frameNumber)