Add --renderer for displays with no usable GPU; gate the header reading
GTK4 defaults to Vulkan, and an X11-forwarded display has no device to make a swapchain from; the plot is a GtkGLArea, so it then asks for a GL context that is not there either. --renderer cairo is the software preset for that display: it exports GSK_RENDERER=cairo and LIBGL_ALWAYS_SOFTWARE=1 in main() before gtk_init()/adw_init(), because both are read when the renderer and the context are created. --renderer gl is the faster choice when indirect GL works, and --renderer vulkan makes the default explicit. Nothing is exported, and GTK's own choice stands, when the option is absent. The once-a-second header line is now behind UDPSCOPE_PROBE_HEADER, following the [notrace] rule: its widths are still sampled for the exit dump, but the line is detail behind that reading rather than output every run prints. UDPSCOPE_PROBE_RENDERER prints the exported pair before GTK starts and the GskRenderer GTK actually built. README, the manual's overview and docs/claude record the two symptoms and the cure.
This commit is contained in:
1 parent
ac054a30c9
commit
fcf268d249
9 files changed
+151
-7
No files matched your search
@@ -10,6 +10,8 @@
|
||||
#include "source_dialog.hpp"
|
||||
#include "ui.hpp"
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include <cstdio>
|
||||
#include <exception>
|
||||
|
||||
@@ -26,6 +28,31 @@ int main(int argc, char** argv) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
// `--renderer` is exported here and nowhere else, because GSK reads `GSK_RENDERER` when it
|
||||
// *creates* its renderer: inside the first `adw_init()`/`gtk_init()`, which `choose_source()`
|
||||
// below may call. Setting it after that point is a silent no-op, so the one place it can be
|
||||
// honoured is before anything touches GTK. Overwrite: a flag on the command line is a
|
||||
// statement about this run, and the environment is only a default it may override.
|
||||
//
|
||||
// `cairo` is the whole software preset and not just GSK's half: the plot is a `GtkGLArea`,
|
||||
// which asks GDK for a GL context of its own whatever GSK draws with. Over X11 forwarding
|
||||
// that request is what leaves the window unallocated (no `buffer allocated:` line, zero
|
||||
// width) once the Vulkan swapchain failure is out of the way, so `LIBGL_ALWAYS_SOFTWARE`
|
||||
// makes Mesa answer it with llvmpipe. This is the pair `tools/make-help-shots.sh` sets.
|
||||
if (!cfg.renderer.empty()) g_setenv("GSK_RENDERER", cfg.renderer.c_str(), TRUE);
|
||||
if (cfg.renderer == "cairo") g_setenv("LIBGL_ALWAYS_SOFTWARE", "1", TRUE);
|
||||
// The startup half of the renderer probe, printed before GTK exists: the request and the
|
||||
// variables this process actually exported. The window's `[renderer] realized=` line is the
|
||||
// other half and says which renderer GTK built.
|
||||
if (g_getenv("UDPSCOPE_PROBE_RENDERER") != nullptr) {
|
||||
const char* gsk = g_getenv("GSK_RENDERER");
|
||||
const char* gl = g_getenv("LIBGL_ALWAYS_SOFTWARE");
|
||||
std::fprintf(stderr, "[renderer] option=%s GSK_RENDERER=%s LIBGL_ALWAYS_SOFTWARE=%s\n",
|
||||
cfg.renderer.empty() ? "(unset)" : cfg.renderer.c_str(),
|
||||
gsk != nullptr ? gsk : "(unset)", gl != nullptr ? gl : "(unset)");
|
||||
std::fflush(stderr);
|
||||
}
|
||||
|
||||
// No `--server` means the user has not said which source to open, so ask. Before the model:
|
||||
// declining must cost no buffer and no socket, and nothing below has to cope with "no source".
|
||||
// `--open` is the other answer to that question, and the chooser knows it: its Waveforms page
|
||||
|
||||
Reference in new issue
Block a user