summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
Diffstat (limited to 'src/render')
-rw-r--r--src/render/meson.build2
-rw-r--r--src/render/queue_libplacebo.c4
-rw-r--r--src/render/queue_libplacebo.h3
-rw-r--r--src/render/renderer.h1
-rw-r--r--src/render/renderer_libplacebo.c59
-rw-r--r--src/render/renderer_libplacebo.h10
-rw-r--r--src/render/renderer_tiger.c9
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);