diff options
| author | 2026-04-13 17:36:54 -0400 | |
|---|---|---|
| committer | 2026-04-13 17:36:54 -0400 | |
| commit | 4ceadc74f0086168fbc576032ba3e6f23af16e39 (patch) | |
| tree | a542703d78f2b29ac1a756fdceec78e40860bab0 /src/render/renderer_libplacebo.c | |
| parent | 77b54c35bf9587450cd636e0d7df37e190e28bfb (diff) | |
| download | camu-4ceadc74f0086168fbc576032ba3e6f23af16e39.tar.gz camu-4ceadc74f0086168fbc576032ba3e6f23af16e39.tar.bz2 camu-4ceadc74f0086168fbc576032ba3e6f23af16e39.zip | |
Changes that went uncommitted for too long
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/render/renderer_libplacebo.c')
| -rw-r--r-- | src/render/renderer_libplacebo.c | 65 |
1 files changed, 51 insertions, 14 deletions
diff --git a/src/render/renderer_libplacebo.c b/src/render/renderer_libplacebo.c index 0995f6f..48b7ea6 100644 --- a/src/render/renderer_libplacebo.c +++ b/src/render/renderer_libplacebo.c @@ -20,7 +20,14 @@ #define RENDERER_DEBUG 0 #endif +#define CRT_BACKGROUND +#define CRT_BACKGROUND_COLOR (1.f / 7.5f) + +#ifdef CRT_BACKGROUND +static f32 clear_color[4] = { CRT_BACKGROUND_COLOR, CRT_BACKGROUND_COLOR, CRT_BACKGROUND_COLOR, 1.f }; +#else static f32 clear_color[4] = { 0.f, 0.f, 0.f, 1.f }; +#endif static struct pl_render_params default_params; @@ -146,9 +153,11 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, u32 *wid { struct camu_renderer_lp *lr = (struct camu_renderer_lp *)renderer; +#ifndef CRT_BACKGROUND clear_color[0] = ((global_color_palette.colors[0] >> 16) & 0xff) / 255.f; clear_color[1] = ((global_color_palette.colors[0] >> 8) & 0xff) / 255.f; clear_color[2] = ((global_color_palette.colors[0]) & 0xff) / 255.f; +#endif lr->logger = pl_log_create(PL_API_VER, pl_log_params( .log_cb = log_callback, @@ -173,13 +182,13 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, u32 *wid )); if (!lr->vk_inst) { log_error("Failed to create vulkan instance."); - goto err; + return false; } VkResult ret = vk_create_surface(priv, lr->vk_inst->instance, &lr->surface); if (ret != VK_SUCCESS) { log_error("Failed to create vulkan surface."); - goto err; + return false; } lr->vk = pl_vulkan_create(lr->logger, pl_vulkan_params( @@ -190,7 +199,7 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, u32 *wid )); if (!lr->vk) { log_error("Failed to create vulkan device."); - goto err; + return false; } lr->swapchain = pl_vulkan_create_swapchain(lr->vk, pl_vulkan_swapchain_params( @@ -200,7 +209,7 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, u32 *wid )); if (!lr->swapchain) { log_error("Failed to create vulkan swapchain."); - goto err; + return false; } lr->gpu = lr->vk->gpu; @@ -213,18 +222,21 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, u32 *wid )); if (!lr->d3d11) { log_error("Failed to create D3D11 device."); - goto err; + return false; } // https://learn.microsoft.com/en-us/windows/win32/api/dxgi/ne-dxgi-dxgi_swap_chain_flag + // https://learn.microsoft.com/en-us/windows/win32/api/dxgi/ne-dxgi-dxgi_swap_effect + char *FLIP = getenv("SINK_DXGI_FLIP"); + if (!FLIP) FLIP = "0"; lr->swapchain = pl_d3d11_create_swapchain(lr->d3d11, pl_d3d11_swapchain_params( .window = win32_window, - //.blit = true, + .blit = al_strscmp(FLIP, "0") == 0, //.flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING )); if (!lr->swapchain) { log_error("Failed to create D3D11 swapchain."); - goto err; + return false; } lr->gpu = lr->d3d11->gpu; @@ -247,7 +259,7 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, u32 *wid )); if (!lr->gl) { log_error("Failed to create GL device."); - goto err; + return false; } // max_swapchain_depth is returned as-is by pl_swapchain_latency(). @@ -259,7 +271,7 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, u32 *wid )); if (!lr->swapchain) { log_error("Failed to create GL swapchain."); - goto err; + return false; } lr->gpu = lr->gl->gpu; @@ -307,15 +319,16 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, u32 *wid #ifdef CAMU_HAVE_SUBTITLES lr->ass = ass_library_init(); + if (!lr->ass) { + log_error("Failed to initialize libass."); + return false; + } ass_set_message_cb(lr->ass, ass_log_callback, lr); #endif lr->last_swap_tick = nn_get_tick(); return true; -err: - lr->r.free((struct camu_renderer **)&lr); - return false; } static struct camu_frame_queue *renderer_lp_create_queue(struct camu_renderer *renderer) @@ -333,7 +346,7 @@ static struct camu_frame_queue *renderer_lp_create_queue(struct camu_renderer *r lq->copy_frame_fallback = false; #endif #ifdef CAMU_HAVE_SUBTITLES - lq->ass = lr->ass; + lq->subs.ass = lr->ass; #endif return queue; } @@ -385,8 +398,13 @@ static bool renderer_lp_render(struct camu_renderer *renderer, struct camu_scree struct pl_swapchain_frame frame; if (pl_swapchain_start_frame(lr->swapchain, &frame)) { pl_frame_from_swapchain(&lr->target, &frame); - pl_frame_clear_rgba(lr->gpu, &lr->target, clear_color); lr->have_frame = true; +#ifdef CRT_BACKGROUND + lr->frame_cleared = false; +#else + pl_frame_clear_rgba(lr->gpu, &lr->target, clear_color); + lr->frame_cleared = true; +#endif } else { log_error("Failed to start frame, fatal."); return false; @@ -473,6 +491,15 @@ static bool renderer_lp_render(struct camu_renderer *renderer, struct camu_scree target->color.hdr.min_luma = (PL_COLOR_SDR_WHITE - 50.f) / PL_COLOR_SDR_CONTRAST; } */ +#ifdef CRT_BACKGROUND + if (!lr->frame_cleared) { + clear_color[0] = 0.03f; + clear_color[1] = 0.03f; + clear_color[2] = 0.03f; + pl_frame_clear_rgba(lr->gpu, &lr->target, clear_color); + lr->frame_cleared = true; + } +#endif pl_render_image_mix(lr->renderer, &mix, target, &lr->params); } } else { @@ -503,6 +530,16 @@ static bool renderer_lp_render(struct camu_renderer *renderer, struct camu_scree return true; } +#ifdef CRT_BACKGROUND + if (!lr->frame_cleared) { + clear_color[0] = CRT_BACKGROUND_COLOR; + clear_color[1] = CRT_BACKGROUND_COLOR; + clear_color[2] = CRT_BACKGROUND_COLOR; + pl_frame_clear_rgba(lr->gpu, &lr->target, clear_color); + lr->frame_cleared = true; + } +#endif + if (pl_swapchain_submit_frame(lr->swapchain)) { lr->have_frame = false; } else { |