From 9274f433cbb6547805d1d3aee14051f6fda574d9 Mon Sep 17 00:00:00 2001 From: falkTX Date: Fri, 15 Jul 2022 10:27:32 +0100 Subject: [PATCH] Do not crash if nanovg context creation fails --- dpf | 2 +- src/override/Window.cpp | 30 ++++++++++++++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/dpf b/dpf index 3a69951..98ecaa0 160000 --- a/dpf +++ b/dpf @@ -1 +1 @@ -Subproject commit 3a6995163a6807d127be76a953b2726726f833ca +Subproject commit 98ecaa0255b1ec55b1d4161470d4969ed2c79d0c diff --git a/src/override/Window.cpp b/src/override/Window.cpp index 867e571..7c9d481 100644 --- a/src/override/Window.cpp +++ b/src/override/Window.cpp @@ -240,6 +240,22 @@ Window::Window() { void WindowSetPluginUI(Window* const window, DISTRHO_NAMESPACE::UI* const ui) { + // if nanovg context failed, init only bare minimum + if (window->vg == nullptr) + { + if (ui != nullptr) + { + window->internal->ui = ui; + window->internal->size = rack::math::Vec(ui->getWidth(), ui->getHeight()); + } + else + { + window->internal->ui = nullptr; + window->internal->callback = nullptr; + } + return; + } + if (ui != nullptr) { const GLubyte* vendor = glGetString(GL_VENDOR); @@ -343,13 +359,16 @@ Window::~Window() { internal->fontCache.clear(); internal->imageCache.clear(); + if (vg != nullptr) + { #if defined NANOVG_GLES2 - nvgDeleteGLES2(internal->o_fbVg != nullptr ? internal->o_fbVg : fbVg); - nvgDeleteGLES2(internal->o_vg != nullptr ? internal->o_vg : vg); + nvgDeleteGLES2(internal->o_fbVg != nullptr ? internal->o_fbVg : fbVg); + nvgDeleteGLES2(internal->o_vg != nullptr ? internal->o_vg : vg); #else - nvgDeleteGL2(internal->o_fbVg != nullptr ? internal->o_fbVg : fbVg); - nvgDeleteGL2(internal->o_vg != nullptr ? internal->o_vg : vg); + nvgDeleteGL2(internal->o_fbVg != nullptr ? internal->o_fbVg : fbVg); + nvgDeleteGL2(internal->o_vg != nullptr ? internal->o_vg : vg); #endif + } } delete internal; @@ -436,6 +455,9 @@ static void Window__writeImagePNG(void* context, void* data, int size) { void Window::step() { DISTRHO_SAFE_ASSERT_RETURN(internal->ui != nullptr,); + if (vg == nullptr) + return; + double frameTime = system::getTime(); double lastFrameTime = internal->frameTime; internal->frameTime = frameTime;