std1.0.0-beta-7 SafeC docs

Module gui::gui_gpu

#include <std/gui/gui_gpu.h> source

GUI: GPU-accelerated presentation.

std/gui renders on the CPU (identical pixels everywhere); this is only about the last step, getting a finished frame onto the screen. By default each backend blits it in software (XPutImage, wl_shm, StretchDIBits, a CALayer's contents). A window can instead present through the GPU: the buffer is uploaded into a texture — only the rows/rectangle that changed — and drawn as one quad by the graphics API of the platform:

"gl"     OpenGL ES 2 through EGL, on X11 and Wayland (libEGL and
         libGLESv2 are dlopen()ed; Mesa, NVIDIA, ...). vsync on X11
         (swap interval 1); on Wayland the compositor paces frames
         and nothing ever tears. Damage is passed on with
         EGL_KHR/EXT_swap_buffers_with_damage when available.
"metal"  Metal on macOS: a CAMetalLayer on the window's view, the frame
         copied into an MTLTexture (replaceRegion) and blitted into the
         layer's drawable (Metal.framework is loaded at run time).
"d3d11"  Direct3D 11 on Windows: a flip-model DXGI swap chain on the
         HWND (FLIP_DISCARD, else FLIP_SEQUENTIAL), the frame copied
         into a texture with UpdateSubresource and to the back buffer
         with CopyResource, presented with vsync (d3d11.dll is loaded
         at run time).

Use it per window (GuiWindowOptions.present = GUI_PRESENT_GPU, or gui_window_use_gpu() on a live window) or for every window of a program by running it with SAFEC_GUI_PRESENT=gpu (SAFEC_GUI_PRESENT=cpu forces the software path). Any failure — no driver, no library, a context or swap chain that can't be made, a device lost later — falls back to the backend's software presentation automatically, for good, for that window; gui_window_uses_gpu() tells which path a window is on.

Worth it for large windows redrawn often (animation, video, games) where the software blit dominates; for mostly static UIs the CPU path is just as good. The pixels shown are the same either way.

Functions

gui_gpu_presenterThe GPU presenter of this platform and backend ("gl", "metal", "d3d11"), or null where there is none (WebAssembly, bare metal, headless).
gui_window_use_gpuAttaches it to 'win'. 1 if the window now presents through the GPU, 0 if it doesn't (no presenter, or it failed: the CPU path stays).
gui_window_use_cpuBack to the backend's software presentation.
gui_window_uses_gpu1 while 'win' presents through a GPU presenter.
gui_window_presenter_nameThe presenter's name ("gl", "metal", "d3d11"), or "cpu".
gui_gpu_wantedFor GuiWindow::create_with: whether a window with this GuiWindowOptions.present should get the GPU presenter ($SAFEC_GUI_PRESENT decides GUI_PRESENT_DEFAULT).