build-dev / nix-build (push) Successful in 42s
SDL_CreateWindow hardcoded a 1920x1080 backbuffer while SDL_WINDOW_FULLSCREEN
let compositors run a different output mode; the mismatched buffer reached
the panel unscaled — quarter-size in the top-left on 4K sets, cropped ("4x
too large") on smaller non-1080p panels under cage/Wayland. Logical
presentation never got to map the fixed design space because its target
(the backbuffer) was pinned to stale dimensions.
Size the fullscreen window from SDL_GetCurrentDisplayMode so the first
commit already matches scanout 1:1, switch logical presentation to LETTERBOX
(aspect-safe bars on non-16:9 panels), and route both through new
kDesignWidth/kDesignHeight constants. Harden getLayoutSize() to always write
its out params and null-check the renderer/render-window before use.
Log requested/window/pixel-buffer/render-output sizes at startup and on
every resize event so field units self-diagnose this bug class into
~/.local/radiantwave/log.txt. SDL_WINDOW_HIGH_PIXEL_DENSITY stays off on
purpose: kiosk panels are not HiDPI, and keeping the pixel buffer equal to
the display mode keeps compositor scanout unscaled.
52 lines
1.3 KiB
C++
52 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include <SDL3/SDL.h>
|
|
|
|
namespace radiantwave {
|
|
|
|
// Design resolution every page lays out against. The renderer's logical
|
|
// presentation (LETTERBOX) scales this fixed space onto whatever
|
|
// window/backbuffer the display actually provides.
|
|
inline constexpr int kDesignWidth = 1920;
|
|
inline constexpr int kDesignHeight = 1080;
|
|
|
|
// Returns the size pages should lay out against: the renderer's logical size
|
|
// when presentation is active, otherwise the real window size. The output
|
|
// params are always written — design constants are the last-resort fallback.
|
|
inline void getLayoutSize(SDL_Renderer *renderer, int *w, int *h)
|
|
{
|
|
if (!w || !h)
|
|
return;
|
|
*w = kDesignWidth;
|
|
*h = kDesignHeight;
|
|
|
|
if (!renderer)
|
|
return;
|
|
|
|
SDL_RendererLogicalPresentation mode = SDL_LOGICAL_PRESENTATION_DISABLED;
|
|
int logicalW = 0;
|
|
int logicalH = 0;
|
|
if (SDL_GetRenderLogicalPresentation(renderer, &logicalW, &logicalH,
|
|
&mode) &&
|
|
mode != SDL_LOGICAL_PRESENTATION_DISABLED && logicalW > 0 &&
|
|
logicalH > 0) {
|
|
*w = logicalW;
|
|
*h = logicalH;
|
|
return;
|
|
}
|
|
|
|
SDL_Window *window = SDL_GetRenderWindow(renderer);
|
|
if (!window)
|
|
return;
|
|
|
|
int windowW = 0;
|
|
int windowH = 0;
|
|
SDL_GetWindowSize(window, &windowW, &windowH);
|
|
if (windowW > 0 && windowH > 0) {
|
|
*w = windowW;
|
|
*h = windowH;
|
|
}
|
|
}
|
|
|
|
} // namespace radiantwave
|