summaryrefslogtreecommitdiff
path: root/src/render/renderer_libplacebo.c
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2026-04-13 17:36:54 -0400
committerAndrew Opalach <andrew@akon.city> 2026-04-13 17:36:54 -0400
commit4ceadc74f0086168fbc576032ba3e6f23af16e39 (patch)
treea542703d78f2b29ac1a756fdceec78e40860bab0 /src/render/renderer_libplacebo.c
parent77b54c35bf9587450cd636e0d7df37e190e28bfb (diff)
downloadcamu-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.c65
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 {