(Font) Pass the atlas format instead of routing it through a global

Renderers picked their glyph coverage precision by reading a
process-global hint:

    self->atlas.format = font_renderer_get_preferred_atlas_format();

which the four video drivers wanting 16-bit coverage under HDR each
set and restored around font creation - saving the previous value,
setting A16, creating the font, restoring on both the success and the
failure path. Four copies of the same dance, and the restore on the
error path is easy to drop.

Make it an argument. font_renderer_create_default() takes the format
and hands it to font_renderer_driver_t::init(), which threads it into
each renderer's atlas allocation. The two accessors and the global go
away. The A16 decision stays where it belongs, in the driver that
knows its swapchain format:

    font_renderer_create_default(&font->font_driver, &font->font_data,
          font_path, font_size,
          want_a16 ? FONT_ATLAS_FORMAT_A16 : FONT_ATLAS_FORMAT_A8);

Also drops enum font_driver_render_api, which the previous commit left
with no remaining users.

The 29 call sites that just want A8 were rewritten by walking each
call's parentheses rather than by pattern, so multi-line forms are
handled and no call was missed - verified by re-scanning for a
create_default call lacking the argument.
This commit is contained in:
F authored and libretroadmin committed 2026-08-08 03:18:52 +02:00
1 parent dcbac35e64
commit 46f46fa2ff
35 files changed
+70 -123

No files matched your search

+1 -1
View File
@@ -88,7 +88,7 @@ static void *caca_font_init(void *data,
if (!font_renderer_create_default(
&font->font_driver,
&font->font_data, font_path, font_size))
&font->font_data, font_path, font_size, FONT_ATLAS_FORMAT_A8))
return NULL;
return font;
+1 -1
View File
@@ -411,7 +411,7 @@ static void* ctr_font_init(void* data, const char* font_path,
font_size = 10;
if (!font_renderer_create_default(
&font->font_driver,
&font->font_data, font_path, font_size))
&font->font_data, font_path, font_size, FONT_ATLAS_FORMAT_A8))
{
free(font);
return NULL;
+1 -1
View File
@@ -882,7 +882,7 @@ static void *d3d10_font_init(void* data, const char* font_path,
return NULL;
if (!font_renderer_create_default(
&font->font_driver, &font->font_data, font_path, font_size))
&font->font_driver, &font->font_data, font_path, font_size, FONT_ATLAS_FORMAT_A8))
{
free(font);
return NULL;
+2 -8
View File
@@ -1052,7 +1052,6 @@ static void * d3d11_font_init(void* data, const char* font_path,
d3d11_video_t* d3d11 = (d3d11_video_t*)data;
d3d11_font_t* font = (d3d11_font_t*)calloc(1, sizeof(*font));
bool want_a16 = false;
enum font_atlas_format prev_fmt;
if (!font)
return NULL;
@@ -1063,18 +1062,13 @@ static void * d3d11_font_init(void* data, const char* font_path,
want_a16 = (d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE) ? true : false;
#endif
prev_fmt = font_renderer_get_preferred_atlas_format();
if (want_a16)
font_renderer_set_preferred_atlas_format(FONT_ATLAS_FORMAT_A16);
if (!font_renderer_create_default(
&font->font_driver, &font->font_data, font_path, font_size))
&font->font_driver, &font->font_data, font_path, font_size,
want_a16 ? FONT_ATLAS_FORMAT_A16 : FONT_ATLAS_FORMAT_A8))
{
font_renderer_set_preferred_atlas_format(prev_fmt);
free(font);
return NULL;
}
font_renderer_set_preferred_atlas_format(prev_fmt);
font->atlas = font->font_driver->get_atlas(font->font_data);
font->texture.sampler = d3d11->samplers[RARCH_FILTER_LINEAR][RARCH_WRAP_BORDER];
+2 -8
View File
@@ -1369,7 +1369,6 @@ static void * d3d12_font_init(void* data, const char* font_path,
d3d12_video_t* d3d12 = (d3d12_video_t*)data;
d3d12_font_t* font = (d3d12_font_t*)calloc(1, sizeof(*font));
bool want_a16 = false;
enum font_atlas_format prev_fmt;
if (!font)
return NULL;
@@ -1382,19 +1381,14 @@ static void * d3d12_font_init(void* data, const char* font_path,
|| (d3d12->chain.current_rt_format == DXGI_FORMAT_R16G16B16A16_FLOAT);
#endif
prev_fmt = font_renderer_get_preferred_atlas_format();
if (want_a16)
font_renderer_set_preferred_atlas_format(FONT_ATLAS_FORMAT_A16);
if (!font_renderer_create_default(
&font->font_driver,
&font->font_data, font_path, font_size))
&font->font_data, font_path, font_size,
want_a16 ? FONT_ATLAS_FORMAT_A16 : FONT_ATLAS_FORMAT_A8))
{
font_renderer_set_preferred_atlas_format(prev_fmt);
free(font);
return NULL;
}
font_renderer_set_preferred_atlas_format(prev_fmt);
font->d3d12 = d3d12;
font->atlas = font->font_driver->get_atlas(font->font_data);
+1 -1
View File
@@ -1221,7 +1221,7 @@ static void *d3d8_font_init(void *data,
if (!font_renderer_create_default(
&font->font_driver, &font->font_data,
font_path, font_size))
font_path, font_size, FONT_ATLAS_FORMAT_A8))
{
free(font);
return NULL;
+1 -1
View File
@@ -1293,7 +1293,7 @@ static void *d3d9_cg_font_init(void *data,
if (!font_renderer_create_default(
&font->font_driver, &font->font_data,
font_path, font_size))
font_path, font_size, FONT_ATLAS_FORMAT_A8))
{
free(font);
return NULL;
+1 -1
View File
@@ -1413,7 +1413,7 @@ static void *d3d9_font_init(void *data,
if (!font_renderer_create_default(
&font->font_driver, &font->font_data,
font_path, font_size))
font_path, font_size, FONT_ATLAS_FORMAT_A8))
{
free(font);
return NULL;
+1 -1
View File
@@ -1065,7 +1065,7 @@ static int exynos_init_font(struct exynos_video *vid)
if (font_renderer_create_default(&vid->font_driver, &vid->font,
*font_path ? font_path : NULL,
video_font_size))
video_font_size, FONT_ATLAS_FORMAT_A8))
{
const int r = video_msg_color_r * 15;
const int g = video_msg_color_g * 15;
+1 -1
View File
@@ -1804,7 +1804,7 @@ static void *gdi_font_init(void *data,
if (!font_renderer_create_default(
&font->font_driver,
&font->font_data, font_path, font_size))
&font->font_data, font_path, font_size, FONT_ATLAS_FORMAT_A8))
{
free(font);
return NULL;
+1 -1
View File
@@ -659,7 +659,7 @@ static void *gl1_raster_font_init(void *data,
if (!font_renderer_create_default(
&font->font_driver,
&font->font_data, font_path, font_size))
&font->font_data, font_path, font_size, FONT_ATLAS_FORMAT_A8))
{
free(font);
return NULL;
+1 -1
View File
@@ -915,7 +915,7 @@ static void *gl2_raster_font_init(void *data,
if (!font_renderer_create_default(
&font->font_driver,
&font->font_data, font_path, font_size))
&font->font_data, font_path, font_size, FONT_ATLAS_FORMAT_A8))
{
free(font);
return NULL;
+1 -1
View File
@@ -996,7 +996,7 @@ static void *gl3_raster_font_init(void *data,
if (!font_renderer_create_default(
&font->font_driver,
&font->font_data, font_path, font_size))
&font->font_data, font_path, font_size, FONT_ATLAS_FORMAT_A8))
{
free(font);
return NULL;
+1 -1
View File
@@ -663,7 +663,7 @@ static void* gx2_font_init(void* data, const char* font_path,
if (!font_renderer_create_default(
&font->font_driver,
&font->font_data, font_path, font_size))
&font->font_data, font_path, font_size, FONT_ATLAS_FORMAT_A8))
{
free(font);
return NULL;
+1 -1
View File
@@ -1650,7 +1650,7 @@ static void *gxm_font_init(void *data,
if (!font_renderer_create_default(
&font->font_driver,
&font->font_data, font_path, font_size))
&font->font_data, font_path, font_size, FONT_ATLAS_FORMAT_A8))
goto error;
font->atlas = font->font_driver->get_atlas(font->font_data);
+3 -9
View File
@@ -3343,18 +3343,12 @@ gfx_display_ctx_driver_t gfx_display_ctx_metal = {
/* When outputting HDR (scRGB or HDR10), ask the font
* renderer for a higher-precision coverage atlas; same
* policy as the d3d12 and vulkan drivers. */
enum font_atlas_format prev_fmt =
font_renderer_get_preferred_atlas_format();
if (_context.hdrEnabled)
font_renderer_set_preferred_atlas_format(FONT_ATLAS_FORMAT_A16);
if (!font_renderer_create_default(
&_font_driver,
&_font_data, font_path, font_size))
{
font_renderer_set_preferred_atlas_format(prev_fmt);
&_font_data, font_path, font_size,
_context.hdrEnabled
? FONT_ATLAS_FORMAT_A16 : FONT_ATLAS_FORMAT_A8))
return nil;
}
font_renderer_set_preferred_atlas_format(prev_fmt);
}
_uniforms.projectionMatrix = matrix_proj_ortho(0, 1, 0, 1);
+1 -1
View File
@@ -828,7 +828,7 @@ static void omap_init_font(omap_video_t *vid)
return;
if (!(font_renderer_create_default(&vid->font_driver, &vid->font,
*path_font ? path_font : NULL, video_font_size)))
*path_font ? path_font : NULL, video_font_size, FONT_ATLAS_FORMAT_A8)))
{
RARCH_ERR("[Omap] Font init failed.\n");
return;
+1 -1
View File
@@ -145,7 +145,7 @@ static void* ps2_font_init(void* data, const char* font_path,
if (!font_renderer_create_default(
&font->font_driver,
&font->font_data, font_path, font_size))
&font->font_data, font_path, font_size, FONT_ATLAS_FORMAT_A8))
{
free(font);
return NULL;
+1 -1
View File
@@ -600,7 +600,7 @@ static void *rsx_font_init(void *data,
if (!font_renderer_create_default(
&font->font_driver,
&font->font_data, font_path, font_size))
&font->font_data, font_path, font_size, FONT_ATLAS_FORMAT_A8))
{
free(font);
return NULL;
+2 -2
View File
@@ -94,7 +94,7 @@ static void sdl2_init_font(sdl2_video_t *vid, const char *font_path,
if (!font_renderer_create_default(
&vid->font_driver, &vid->font_data,
*font_path ? font_path : NULL, font_size))
*font_path ? font_path : NULL, font_size, FONT_ATLAS_FORMAT_A8))
{
RARCH_WARN("[SDL2] Could not initialize fonts.\n");
return;
@@ -1553,7 +1553,7 @@ static void *sdl2_raster_font_init(void *data, const char *font_path,
if (!font_renderer_create_default(
&font->font_driver, &font->font_data,
font_path, font_size))
font_path, font_size, FONT_ATLAS_FORMAT_A8))
{
RARCH_WARN("[SDL2] sdl2_raster_font_init: font_renderer_create_default "
"failed for path '%s' size %.1f\n",
+1 -1
View File
@@ -1316,7 +1316,7 @@ static void *sdl3_raster_font_init(void *data, const char *font_path,
if (!font_renderer_create_default(
&font->font_driver, &font->font_data,
font_path, font_size))
font_path, font_size, FONT_ATLAS_FORMAT_A8))
{
RARCH_WARN("[SDL3] sdl3_raster_font_init: font_renderer_create_default "
"failed for path \"%s\" size %.1f.\n",
+1 -1
View File
@@ -98,7 +98,7 @@ static void sdl_init_font(sdl_video_t *vid,
if (!font_renderer_create_default(
&vid->font_driver, &vid->font,
*path_font ? path_font : NULL,
video_font_size))
video_font_size, FONT_ATLAS_FORMAT_A8))
{
RARCH_LOG("[SDL] Could not initialize fonts.\n");
return;
+1 -1
View File
@@ -91,7 +91,7 @@ static void *sixel_font_init(void *data,
if (!font_renderer_create_default(
&font->font_driver,
&font->font_data, font_path, font_size))
&font->font_data, font_path, font_size, FONT_ATLAS_FORMAT_A8))
return NULL;
return font;
+1 -1
View File
@@ -113,7 +113,7 @@ static void *switch_font_init(void *data, const char *font_path,
return NULL;
if (!font_renderer_create_default(&font->font_driver,
&font->font_data, font_path, font_size))
&font->font_data, font_path, font_size, FONT_ATLAS_FORMAT_A8))
{
free(font);
return NULL;
+1 -1
View File
@@ -228,7 +228,7 @@ static void *vg_init(const video_info_t *video,
&& font_renderer_create_default(
&vg->font_driver, &vg->mFontRenderer,
*path_font ? path_font : NULL,
video_font_size))
video_font_size, FONT_ATLAS_FORMAT_A8))
{
vg->mFont = vgCreateFont(0);
+1 -1
View File
@@ -78,7 +78,7 @@ static void *vga_font_init(void *data,
if (!font_renderer_create_default(
&font->font_driver,
&font->font_data, font_path, font_size))
&font->font_data, font_path, font_size, FONT_ATLAS_FORMAT_A8))
return NULL;
return font;
+3 -6
View File
@@ -2269,8 +2269,7 @@ static void *vulkan_font_init(void *data,
font->vk = (vk_t*)data;
{
enum font_atlas_format prev_fmt =
font_renderer_get_preferred_atlas_format();
enum font_atlas_format fmt = FONT_ATLAS_FORMAT_A8;
#ifdef VULKAN_HDR_SWAPCHAIN
/* When the swapchain is HDR, ask for a higher-precision
* coverage atlas (same policy as the d3d12 driver). */
@@ -2279,17 +2278,15 @@ static void *vulkan_font_init(void *data,
== VK_FORMAT_R16G16B16A16_SFLOAT
|| font->vk->context->swapchain_format
== VK_FORMAT_A2B10G10R10_UNORM_PACK32))
font_renderer_set_preferred_atlas_format(FONT_ATLAS_FORMAT_A16);
fmt = FONT_ATLAS_FORMAT_A16;
#endif
if (!font_renderer_create_default(
&font->font_driver,
&font->font_data, font_path, font_size))
&font->font_data, font_path, font_size, fmt))
{
font_renderer_set_preferred_atlas_format(prev_fmt);
free(font);
return NULL;
}
font_renderer_set_preferred_atlas_format(prev_fmt);
}
font->atlas = font->font_driver->get_atlas(font->font_data);
+1 -1
View File
@@ -185,7 +185,7 @@ static void xv_init_font(xv_t *xv, const char *font_path, unsigned font_size)
&xv->font_driver,
&xv->font, *path_font
? path_font : NULL,
video_font_size))
video_font_size, FONT_ATLAS_FORMAT_A8))
{
int r = msg_color_r * 255;
int g = msg_color_g * 255;
+2 -1
View File
@@ -170,7 +170,8 @@ static void char_to_texture(bm_renderer_t *handle, uint8_t letter,
handle->atlas.dirty = true;
}
static void *font_renderer_bmp_init(const char *font_path, float font_size)
static void *font_renderer_bmp_init(const char *font_path, float font_size,
enum font_atlas_format fmt)
{
unsigned i;
bm_renderer_t *handle = (bm_renderer_t*)calloc(1, sizeof(*handle));
+7 -4
View File
@@ -196,7 +196,9 @@ static void font_renderer_ct_free(void *data)
free(handle);
}
static bool coretext_font_renderer_create_atlas(CTFontRef face, ct_font_renderer_t *handle, float font_size)
static bool coretext_font_renderer_create_atlas(CTFontRef face,
ct_font_renderer_t *handle, float font_size,
enum font_atlas_format fmt)
{
unsigned i, x, y;
coretext_atlas_slot_t* slot = NULL;
@@ -216,7 +218,7 @@ static bool coretext_font_renderer_create_atlas(CTFontRef face, ct_font_renderer
/* Higher-precision coverage when the video driver asked for it
* (HDR output); the atlas then stores uint16_t samples. */
handle->atlas.format = font_renderer_get_preferred_atlas_format();
handle->atlas.format = fmt;
handle->atlas.buffer = (uint8_t*)calloc(
(size_t)handle->atlas.height,
(size_t)handle->atlas.width *
@@ -517,7 +519,8 @@ static bool coretext_font_renderer_render_glyph(CTFontRef face, ct_font_renderer
return true;
}
static void *font_renderer_ct_init(const char *font_path, float font_size)
static void *font_renderer_ct_init(const char *font_path, float font_size,
enum font_atlas_format fmt)
{
char err = 0;
CFStringRef cf_font_path = NULL;
@@ -591,7 +594,7 @@ static void *font_renderer_ct_init(const char *font_path, float font_size)
goto error;
}
if (!coretext_font_renderer_create_atlas(face, handle, font_size))
if (!coretext_font_renderer_create_atlas(face, handle, font_size, fmt))
{
err = 1;
goto error;
+6 -4
View File
@@ -316,7 +316,8 @@ static const struct font_glyph *font_renderer_ft_get_glyph(
return &atlas_slot->glyph;
}
static bool font_renderer_create_atlas(ft_font_renderer_t *handle, float font_size)
static bool font_renderer_create_atlas(ft_font_renderer_t *handle,
float font_size, enum font_atlas_format fmt)
{
unsigned i, x, y;
unsigned max_width, max_height;
@@ -354,7 +355,7 @@ static bool font_renderer_create_atlas(ft_font_renderer_t *handle, float font_si
atlas_height = (max_height + FT_ATLAS_PADDING) * FT_ATLAS_ROWS;
/* Higher-precision coverage when the video driver asked for it
* (HDR output); the atlas then stores uint16_t samples. */
handle->atlas.format = font_renderer_get_preferred_atlas_format();
handle->atlas.format = fmt;
atlas_buffer = (uint8_t*)calloc((size_t)atlas_height,
(size_t)atlas_width *
((handle->atlas.format == FONT_ATLAS_FORMAT_A16) ? 2 : 1));
@@ -386,7 +387,8 @@ static bool font_renderer_create_atlas(ft_font_renderer_t *handle, float font_si
return true;
}
static void *font_renderer_ft_init(const char *font_path, float font_size)
static void *font_renderer_ft_init(const char *font_path, float font_size,
enum font_atlas_format fmt)
{
FT_Error err;
@@ -541,7 +543,7 @@ fc_done:
if ((err = FT_Set_Pixel_Sizes(handle->face, 0, font_size)))
goto error;
if (!font_renderer_create_atlas(handle, font_size))
if (!font_renderer_create_atlas(handle, font_size, fmt))
goto error;
handle->line_metrics.ascender = (float)handle->face->size->metrics.ascender / 64.0f;
+7 -5
View File
@@ -1492,8 +1492,9 @@ static const struct font_glyph *font_renderer_stb_get_glyph(
return &atlas_slot->glyph;
}
static bool font_renderer_stb_create_atlas(
stb_font_renderer_t *self, float font_size)
static bool font_renderer_stb_create_atlas_fmt(
stb_font_renderer_t *self, float font_size,
enum font_atlas_format fmt)
{
unsigned i, x, y;
stb_atlas_slot_t* slot = NULL;
@@ -1517,7 +1518,7 @@ static bool font_renderer_stb_create_atlas(
self->atlas.height = (self->max_glyph_height + STB_ATLAS_PADDING) * STB_ATLAS_ROWS;
/* Higher-precision coverage when the video driver asked for it
* (HDR output); the atlas then stores uint16_t samples. */
self->atlas.format = font_renderer_get_preferred_atlas_format();
self->atlas.format = fmt;
/* Pass the two dimensions separately so the C library's calloc overflow
* check applies, rather than pre-multiplying into a single argument. */
@@ -1550,7 +1551,8 @@ static bool font_renderer_stb_create_atlas(
return true;
}
static void *font_renderer_stb_init(const char *font_path, float font_size)
static void *font_renderer_stb_init(const char *font_path, float font_size,
enum font_atlas_format fmt)
{
int ascent, descent, line_gap;
stb_font_renderer_t *self =
@@ -1617,7 +1619,7 @@ static void *font_renderer_stb_init(const char *font_path, float font_size)
self->line_metrics.descender = 0.5f + ((float)(-descent) * self->scale_factor);
self->line_metrics.height = 0.5f + (float)(ascent - descent + line_gap) * self->scale_factor;
if (!font_renderer_stb_create_atlas(self, font_size))
if (!font_renderer_stb_create_atlas_fmt(self, font_size, fmt))
goto error;
return self;
+3 -15
View File
@@ -53,22 +53,10 @@ uint32_t font_driver_get_generation(void)
return font_driver_generation;
}
static enum font_atlas_format font_atlas_preferred_format =
FONT_ATLAS_FORMAT_A8;
void font_renderer_set_preferred_atlas_format(enum font_atlas_format fmt)
{
font_atlas_preferred_format = fmt;
}
enum font_atlas_format font_renderer_get_preferred_atlas_format(void)
{
return font_atlas_preferred_format;
}
int font_renderer_create_default(
const font_renderer_driver_t **drv,
void **handle, const char *font_path, unsigned font_size)
void **handle, const char *font_path, unsigned font_size,
enum font_atlas_format fmt)
{
static const font_renderer_driver_t *font_backends[] = {
#ifdef HAVE_FREETYPE
@@ -94,7 +82,7 @@ int font_renderer_create_default(
if (!path)
continue;
*handle = font_backends[i]->init(path, font_size);
*handle = font_backends[i]->init(path, font_size, fmt);
if (*handle)
{
*drv = font_backends[i];
+10 -10
View File
@@ -51,7 +51,8 @@ typedef struct font_renderer
typedef struct font_renderer_driver
{
void *(*init)(const char *font_path, float font_size);
void *(*init)(const char *font_path, float font_size,
enum font_atlas_format fmt);
struct font_atlas *(*get_atlas)(void *data);
@@ -100,19 +101,18 @@ static INLINE void font_unbind(font_data_impl_t *font_data)
font_driver_bind_block(font_data->font, NULL);
}
/* font_path can be NULL for default font. */
/* Video drivers that want higher-precision glyph coverage (HDR
* output) set the preferred atlas format before creating their
* fonts; renderers consult it when allocating the atlas. The hint is
* process-global, so callers set it around font creation and restore
* it afterwards. Renderers without 16-bit support ignore it. */
void font_renderer_set_preferred_atlas_format(enum font_atlas_format fmt);
enum font_atlas_format font_renderer_get_preferred_atlas_format(void);
/* font_path can be NULL for default font.
*
* @fmt is the glyph coverage precision the caller wants in the atlas.
* Video drivers producing HDR output ask for FONT_ATLAS_FORMAT_A16;
* everything else passes FONT_ATLAS_FORMAT_A8. Renderers without
* 16-bit support ignore it. */
int font_renderer_create_default(
const font_renderer_driver_t **drv,
void **handle,
const char *font_path, unsigned font_size);
const char *font_path, unsigned font_size,
enum font_atlas_format fmt);
void font_driver_render_msg(void *data,
const char *msg, size_t msg_len,
-28
View File
@@ -134,34 +134,6 @@ enum rarch_display_type
RARCH_DISPLAY_KMS
};
enum font_driver_render_api
{
FONT_DRIVER_RENDER_DONT_CARE,
FONT_DRIVER_RENDER_OPENGL_API,
FONT_DRIVER_RENDER_OPENGL_CORE_API,
FONT_DRIVER_RENDER_OPENGL1_API,
FONT_DRIVER_RENDER_D3D8_API,
FONT_DRIVER_RENDER_D3D9_API,
FONT_DRIVER_RENDER_D3D9_CG_API,
FONT_DRIVER_RENDER_D3D10_API,
FONT_DRIVER_RENDER_D3D11_API,
FONT_DRIVER_RENDER_D3D12_API,
FONT_DRIVER_RENDER_PS2,
FONT_DRIVER_RENDER_GXM,
FONT_DRIVER_RENDER_CTR,
FONT_DRIVER_RENDER_WIIU,
FONT_DRIVER_RENDER_VULKAN_API,
FONT_DRIVER_RENDER_METAL_API,
FONT_DRIVER_RENDER_SDL2,
FONT_DRIVER_RENDER_CACA,
FONT_DRIVER_RENDER_SIXEL,
FONT_DRIVER_RENDER_NETWORK_VIDEO,
FONT_DRIVER_RENDER_GDI,
FONT_DRIVER_RENDER_VGA,
FONT_DRIVER_RENDER_SWITCH,
FONT_DRIVER_RENDER_RSX,
FONT_DRIVER_RENDER_SDL3
};
enum text_alignment
{