diff options
Diffstat (limited to 'src/render')
| -rw-r--r-- | src/render/meson.build | 2 | ||||
| -rw-r--r-- | src/render/queue_libplacebo.c | 4 | ||||
| -rw-r--r-- | src/render/queue_libplacebo.h | 3 | ||||
| -rw-r--r-- | src/render/renderer.h | 1 | ||||
| -rw-r--r-- | src/render/renderer_libplacebo.c | 59 | ||||
| -rw-r--r-- | src/render/renderer_libplacebo.h | 10 | ||||
| -rw-r--r-- | src/render/renderer_tiger.c | 9 |
7 files changed, 42 insertions, 46 deletions
diff --git a/src/render/meson.build b/src/render/meson.build index cc11eea..e9c093a 100644 --- a/src/render/meson.build +++ b/src/render/meson.build @@ -23,7 +23,7 @@ libplacebo = dependency('libplacebo', 'd3d11=disabled', 'gl-proc-addr=disabled', 'vk-proc-addr=disabled', - 'lcms=disabled', + 'lcms=enabled', 'dovi=disabled', 'libdovi=disabled' ], required: false, allow_fallback: true) diff --git a/src/render/queue_libplacebo.c b/src/render/queue_libplacebo.c index ee64920..327397f 100644 --- a/src/render/queue_libplacebo.c +++ b/src/render/queue_libplacebo.c @@ -1,5 +1,9 @@ #include <al/lib.h> #include <al/log.h> +#ifdef HAVE_FFMPEG +#define PL_LIBAV_IMPLEMENTATION 1 +#include <libplacebo/utils/libav.h> +#endif #include "../buffer/video.h" diff --git a/src/render/queue_libplacebo.h b/src/render/queue_libplacebo.h index 7da99ca..829ef87 100644 --- a/src/render/queue_libplacebo.h +++ b/src/render/queue_libplacebo.h @@ -4,9 +4,6 @@ #include <libplacebo/utils/frame_queue.h> #include <libplacebo/utils/upload.h> -#ifdef HAVE_FFMPEG -#include <libplacebo/utils/libav.h> -#endif struct camu_frame_queue_lp { struct camu_frame_queue q; diff --git a/src/render/renderer.h b/src/render/renderer.h index 61965ed..64dc691 100644 --- a/src/render/renderer.h +++ b/src/render/renderer.h @@ -18,7 +18,6 @@ struct camu_screen; struct camu_renderer { bool (*create_renderer)( struct camu_renderer *, s32 *, s32 *, - bool (*poll)(struct skh_window *, bool), #if defined CAMU_RENDERER_VULKAN VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL (*get_vk_proc_address)(VkInstance, const char *), VkResult (*vk_create_surface)(void *, VkInstance, VkSurfaceKHR *), diff --git a/src/render/renderer_libplacebo.c b/src/render/renderer_libplacebo.c index 019a5ce..148574b 100644 --- a/src/render/renderer_libplacebo.c +++ b/src/render/renderer_libplacebo.c @@ -1,6 +1,9 @@ #include <al/lib.h> #include <al/log.h> #include <aki/file.h> +#ifdef HAVE_FFMPEG +#include <libplacebo/utils/libav.h> +#endif #include "../screen/screen.h" #include "../util/color_palette.h" @@ -16,8 +19,14 @@ static void renderer_lp_resize(struct camu_renderer *renderer, s32 *width, s32 * if (lr->swapchain) pl_swapchain_resize(lr->swapchain, width, height); } +static void log_callback(void *userdata, enum pl_log_level level, const char *msg) +{ + (void)userdata; + (void)level; + al_log_debug("render_libplacebo", msg); +} + static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *width, s32 *height, - bool (*poll)(struct skh_window *, bool), #if defined CAMU_RENDERER_VULKAN VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL (*get_vk_proc_address)(VkInstance, const char *), VkResult (*vk_create_surface)(void *, VkInstance, VkSurfaceKHR *), @@ -38,29 +47,32 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *wid clear_color[2] = ((global_color_palette.colors[0]) & 0xff) / 255.f; lr->logger = pl_log_create(PL_API_VER, pl_log_params( - .log_cb = pl_log_color, - .log_level = PL_LOG_NONE, -// .log_level = PL_LOG_INFO, + .log_cb = log_callback, + .log_priv = NULL, + .log_level = PL_LOG_INFO )); #if defined CAMU_RENDERER_VULKAN VkResult err; u32 num; + const char *const *extensions = vk_get_extensions(&num); lr->vk_inst = pl_vk_inst_create(lr->logger, pl_vk_inst_params( .get_proc_addr = get_vk_proc_address, .debug = false, - .extensions = vk_get_extensions(&num), + .extensions = extensions, .num_extensions = num, )); if (!lr->vk_inst) { al_log_error("render_libplacebo", "Failed to create vulkan instance."); + goto err; } err = vk_create_surface(priv, lr->vk_inst->instance, &lr->surface); if (err != VK_SUCCESS) { al_log_error("render_libplacebo", "Failed to create vulkan surface."); + goto err; } lr->vk = pl_vulkan_create(lr->logger, pl_vulkan_params( @@ -72,6 +84,7 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *wid if (!lr->vk) { al_log_error("render_libplacebo", "Failed to create vulkan device."); + goto err; } lr->swapchain = pl_vulkan_create_swapchain(lr->vk, pl_vulkan_swapchain_params( @@ -81,6 +94,7 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *wid if (!lr->swapchain) { al_log_error("render_libplacebo", "Failed to create vulkan swapchain."); + goto err; } lr->gpu = lr->vk->gpu; @@ -98,6 +112,7 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *wid if (!lr->gl) { al_log_error("render_libplacebo", "Failed to create GL device."); + goto err; } lr->swapchain = pl_opengl_create_swapchain(lr->gl, pl_opengl_swapchain_params( @@ -107,6 +122,7 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *wid if (!lr->swapchain) { al_log_error("render_libplacebo", "Failed to create GL swapchain."); + goto err; } lr->gpu = lr->gl->gpu; @@ -114,32 +130,24 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *wid lr->renderer = pl_renderer_create(lr->logger, lr->gpu); - renderer_lp_resize(renderer, width, height); - -#define PRE_SWAPS 2 - // See renderer_tiger.c:122. - for (u32 i = 0; i < PRE_SWAPS; i++) { - poll(priv, true); - struct pl_swapchain_frame frame; - pl_swapchain_start_frame(lr->swapchain, &frame); - struct pl_frame target; - pl_frame_from_swapchain(&target, &frame); - pl_frame_clear_rgba(lr->gpu, &target, clear_color); - pl_swapchain_submit_frame(lr->swapchain); - pl_swapchain_swap_buffers(lr->swapchain); - } + lr->r.resize(&lr->r, width, height); al_memset(&lr->params, 0, sizeof(struct pl_render_params)); lr->params = pl_render_default_params; //lr->params = pl_render_high_quality_params; - lr->params.upscaler = &pl_filter_bicubic; + //lr->params.upscaler = &pl_filter_bicubic; + //lr->params.upscaler = &pl_filter_nearest; + // Clear manually so we can draw multiple images per frame. lr->params.skip_target_clearing = true; + // Breaks zoom/pan. lr->params.skip_caching_single_frame = true; + // Prioritize a more consistant image (should be configurable). + lr->params.correct_subpixel_offsets = true; #if 0 struct aki_file file; - if (aki_file_open(&file, al_str_c(""))) { + if (aki_file_open(&file, al_str_c(""), 0)) { char *str; size_t len = aki_file_read_as_c_str(&file, &str); const struct pl_hook *hook = pl_mpv_user_shader_parse(lr->gpu, (const char *)str, len); @@ -157,6 +165,9 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *wid #endif 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) @@ -166,9 +177,9 @@ static struct camu_frame_queue *renderer_lp_create_queue(struct camu_renderer *r struct camu_frame_queue_lp *lq = (struct camu_frame_queue_lp *)queue; lq->queue = pl_queue_create(lr->gpu); al_memset(&lq->params, 0, sizeof(struct pl_queue_params)); - lq->params.interpolation_threshold = 0.01; + lq->params.interpolation_threshold = 0.01f; lq->params.radius = pl_frame_mix_radius(&lr->params); - lq->params.timeout = 0; // vsync + lq->params.timeout = 0uL; // vsync return queue; } @@ -211,7 +222,7 @@ static void renderer_lp_render(struct camu_renderer *renderer, struct camu_scree pl_swapchain_swap_buffers(lr->swapchain); } -static void renderer_lp_free(struct camu_renderer **renderer) +void renderer_lp_free(struct camu_renderer **renderer) { struct camu_renderer_lp *lr = (struct camu_renderer_lp *)*renderer; if (lr->renderer) pl_renderer_destroy(&lr->renderer); diff --git a/src/render/renderer_libplacebo.h b/src/render/renderer_libplacebo.h index 661faff..80f4688 100644 --- a/src/render/renderer_libplacebo.h +++ b/src/render/renderer_libplacebo.h @@ -1,7 +1,6 @@ #pragma once #include <libplacebo/common.h> -#include <libplacebo/opengl.h> #include <libplacebo/renderer.h> #include <libplacebo/shaders/lut.h> #include <libplacebo/colorspace.h> @@ -10,13 +9,10 @@ #if defined CAMU_RENDERER_VULKAN #include <libplacebo/vulkan.h> +#elif defined CAMU_RENDERER_OPENGL +#include <libplacebo/opengl.h> #endif -struct camu_renderer_lp_resource { - pl_tex tex; - struct pl_plane plane; -}; - struct camu_renderer_lp { struct camu_renderer r; #if defined CAMU_RENDERER_VULKAN @@ -31,8 +27,6 @@ struct camu_renderer_lp { pl_swapchain swapchain; pl_renderer renderer; struct pl_render_params params; - struct pl_overlay overlays[10]; - s32 overlay_count; }; struct camu_renderer *camu_renderer_lp_create(void); diff --git a/src/render/renderer_tiger.c b/src/render/renderer_tiger.c index 7cbbbb9..e4ae239 100644 --- a/src/render/renderer_tiger.c +++ b/src/render/renderer_tiger.c @@ -96,7 +96,6 @@ static void renderer_tiger_resize(struct camu_renderer *renderer, s32 *width, s3 } static bool renderer_tiger_create_renderer(struct camu_renderer *renderer, s32 *width, s32 *height, - bool (*poll)(struct skh_window *, bool), #if defined CAMU_RENDERER_VULKAN VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL (*get_vk_proc_address)(VkInstance, const char *), void (*vk_create_surface)(void *, VkInstance, VkSurfaceKHR *), @@ -132,14 +131,6 @@ static bool renderer_tiger_create_renderer(struct camu_renderer *renderer, s32 * glClearColor(clear_color[0], clear_color[1], clear_color[2], 1.f); -#define PRE_SWAPS 2 - // Hack? to make the window appear quicker. Only tested on linux/wayland. - for (u32 i = 0; i < PRE_SWAPS; i++) { - poll(priv, true); - glClear(GL_COLOR_BUFFER_BIT); - tr->swap_buffers(tr->priv); - } - glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |