summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
Diffstat (limited to 'src/render')
-rw-r--r--src/render/meson.build22
-rw-r--r--src/render/queue_libplacebo.c24
-rw-r--r--src/render/queue_libplacebo.h1
-rw-r--r--src/render/renderer.h1
-rw-r--r--src/render/renderer_libplacebo.c27
5 files changed, 58 insertions, 17 deletions
diff --git a/src/render/meson.build b/src/render/meson.build
index f0fd2fd..1dd2dce 100644
--- a/src/render/meson.build
+++ b/src/render/meson.build
@@ -95,7 +95,7 @@ elif get_option('renderer') == 'libplacebo'
spirv_cross_c_shared
]
meson.override_dependency('spirv-cross-c-shared', spirv_cross_c_shared)
- libplacebo_opts += ['shaderc=enabled', 'd3d11=enabled', 'vulkan=enabled', 'opengl=disabled']
+ libplacebo_opts += ['shaderc=enabled', 'd3d11=enabled', 'vulkan=disabled', 'opengl=disabled']
else
libplacebo_opts += ['shaderc=disabled', 'opengl=enabled', 'vulkan=disabled', 'd3d11=disabled']
endif
@@ -122,6 +122,13 @@ if not libass.found()
'cache-build=disabled'
])
endif
+ # libass(e46aede):meson.build:84
+ # fontconfig(72b9a48):meson.build:28
+ freetype = dependency('freetype2',
+ version: '>=9.17.3',
+ default_options: [
+ 'harfbuzz=disabled'
+ ])
# libass(e46aede):meson.build:90
fribidi = dependency('fribidi',
version: '>=0.19.1',
@@ -130,13 +137,6 @@ if not libass.found()
'tests=false',
'bin=false'
])
- # libass(e46aede):meson.build:84
- # fontconfig(72b9a48):meson.build:28
- freetype = dependency('freetype2',
- version: '>=9.17.3',
- default_options: [
- 'harfbuzz=disabled'
- ])
# freetype2(42608f7):meson.build:346
harfbuz = dependency('harfbuzz',
version: '>=2.0.0',
@@ -145,7 +145,11 @@ if not libass.found()
'tests=disabled',
'introspection=disabled',
'docs=disabled',
- 'utilities=disabled'
+ 'utilities=disabled',
+ 'glib=disabled',
+ 'gobject=disabled',
+ 'cairo=disabled',
+ 'chafa=disabled'
])
libass = dependency('libass', default_options: libass_opts)
endif
diff --git a/src/render/queue_libplacebo.c b/src/render/queue_libplacebo.c
index d078cbc..65a713e 100644
--- a/src/render/queue_libplacebo.c
+++ b/src/render/queue_libplacebo.c
@@ -31,6 +31,7 @@ static bool queue_lp_configure_subtitiles(struct camu_frame_queue *queue, u32 wi
AVCodecParameters *codecpar = stream->av.stream->codecpar;
ass_process_codec_private(lq->ass_track, (const char *)codecpar->extradata,
codecpar->extradata_size);
+ nn_mutex_init(&lq->subtitle_lock);
lq->have_subtitles = true;
return true;
}
@@ -130,6 +131,7 @@ static void queue_lp_push(struct camu_frame_queue *queue, struct camu_codec_fram
static struct camu_overlay_lp *create_subtitle_overlay(pl_gpu gpu, ASS_Image *ass_frame)
{
struct camu_overlay_lp *overlay = al_alloc_object(struct camu_overlay_lp);
+
for (; ass_frame; ass_frame = ass_frame->next) {
pl_tex tex = pl_tex_create(gpu, pl_tex_params(
.w = ass_frame->w,
@@ -196,6 +198,7 @@ static struct camu_overlay_lp *create_subtitle_overlay(pl_gpu gpu, ASS_Image *as
current->coords = PL_OVERLAY_COORDS_SRC_FRAME;
current->num_parts = 1;
}
+
return overlay;
}
@@ -215,6 +218,8 @@ static bool map_av_frame(pl_gpu gpu, pl_tex *tex, const struct pl_source_frame *
));
}
+ // https://github.com/streetpea/chiaki-ng/blob/dd145ec2c802814e98fb833d3a9692169aa67315/gui/src/qmlmainwindow.cpp#L860
+ // https://github.com/streetpea/chiaki-ng/blob/dd145ec2c802814e98fb833d3a9692169aa67315/gui/src/qmlbackend.cpp#L786
if (!ok && frame->hw_frames_ctx) {
if (!lq->copy_frame_fallback) {
al_log_warn("frame_queue_libplacebo", "Falling back to software copy.");
@@ -225,7 +230,8 @@ static bool map_av_frame(pl_gpu gpu, pl_tex *tex, const struct pl_source_frame *
lq->swframe->format = fmts[0];
av_free(fmts);
}
- ok = av_hwframe_transfer_data(lq->swframe, frame, 0) == 0;
+ s32 ret = av_hwframe_transfer_data(lq->swframe, frame, 0);
+ ok = ret == 0;
if (ok) {
av_frame_copy_props(lq->swframe, frame);
ok = pl_map_avframe_ex(gpu, out_frame, pl_avframe_params(
@@ -233,6 +239,8 @@ static bool map_av_frame(pl_gpu gpu, pl_tex *tex, const struct pl_source_frame *
.tex = tex
));
av_frame_unref(lq->swframe);
+ } else {
+ al_log_error("frame_queue_libplacebo", "Failed to transfer hwframe from the device (%s).", av_err2str(ret));
}
}
@@ -240,13 +248,12 @@ static bool map_av_frame(pl_gpu gpu, pl_tex *tex, const struct pl_source_frame *
if (ok && lq->have_subtitles) {
s64 now = av_rescale_q(frame->best_effort_timestamp, stream->time_base, (AVRational){ 1, 1000 });
- s32 change;
+ nn_mutex_lock(&lq->subtitle_lock);
+ s32 change; // 1 = different position, 2 = different content.
ASS_Image *ass_frame = ass_render_frame(lq->ass_renderer, lq->ass_track, now, &change);
if (ass_frame) {
struct camu_overlay_lp *overlay = NULL;
- if (lq->overlays.count > 0) {
- overlay = al_array_last(lq->overlays);
- }
+ if (lq->overlays.count > 0) overlay = al_array_last(lq->overlays);
if (!overlay || change > 0) {
overlay = create_subtitle_overlay(gpu, ass_frame);
overlay->lq = lq;
@@ -257,6 +264,7 @@ static bool map_av_frame(pl_gpu gpu, pl_tex *tex, const struct pl_source_frame *
out_frame->num_overlays = overlay->num;
((struct pl_source_frame *)src)->frame_data = overlay;
}
+ nn_mutex_unlock(&lq->subtitle_lock);
}
av_frame_free(&frame);
@@ -284,6 +292,7 @@ static void unmap_av_frame(pl_gpu gpu, struct pl_frame *frame, const struct pl_s
}
al_free((struct pl_overlay_part *)current->parts);
}
+ al_free(overlay->overlays);
al_array_remove(lq->overlays, overlay);
al_free(overlay);
}
@@ -318,9 +327,11 @@ static void queue_lp_push_av_frame(struct camu_frame_queue *queue, AVFrame *fram
static void queue_lp_push_subtitle(struct camu_frame_queue *queue, struct camu_codec_packet *packet)
{
struct camu_frame_queue_lp *lq = (struct camu_frame_queue_lp *)queue;
- al_assert(lq->ass_track && lq->ass_renderer);
AVPacket *pkt = packet->av.pkt;
+ nn_mutex_lock(&lq->subtitle_lock);
+ al_assert(lq->ass_track && lq->ass_renderer);
ass_process_chunk(lq->ass_track, (const char *)pkt->data, pkt->size, pkt->pts, pkt->duration);
+ nn_mutex_unlock(&lq->subtitle_lock);
}
static void queue_lp_flush(struct camu_frame_queue *queue)
@@ -367,6 +378,7 @@ static void queue_lp_free(struct camu_frame_queue **queue)
if (lq->have_subtitles) {
ass_free_track(lq->ass_track);
ass_renderer_done(lq->ass_renderer);
+ nn_mutex_destroy(&lq->subtitle_lock);
}
if (lq->copy_frame_fallback) {
av_frame_free(&lq->swframe);
diff --git a/src/render/queue_libplacebo.h b/src/render/queue_libplacebo.h
index f87a34d..67d2479 100644
--- a/src/render/queue_libplacebo.h
+++ b/src/render/queue_libplacebo.h
@@ -24,6 +24,7 @@ struct camu_frame_queue_lp {
ASS_Library *ass;
ASS_Renderer *ass_renderer;
ASS_Track *ass_track;
+ struct nn_mutex subtitle_lock;
bool have_subtitles;
};
diff --git a/src/render/renderer.h b/src/render/renderer.h
index a4d3a53..b4863a0 100644
--- a/src/render/renderer.h
+++ b/src/render/renderer.h
@@ -47,6 +47,7 @@ struct camu_renderer {
void (*add_font)(struct camu_renderer *, struct camu_codec_stream *);
u32 (*get_latency)(struct camu_renderer *);
void (*resize)(struct camu_renderer *, u32 *, u32 *);
+ void (*set_fullscreen)(struct camu_renderer *, bool);
void (*render)(struct camu_renderer *, struct camu_screen *, bool);
#ifdef CAMU_HAVE_FFMPEG
s32 (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, s32 flags);
diff --git a/src/render/renderer_libplacebo.c b/src/render/renderer_libplacebo.c
index 8ff718e..a3a3109 100644
--- a/src/render/renderer_libplacebo.c
+++ b/src/render/renderer_libplacebo.c
@@ -8,6 +8,12 @@
#include "../screen/screen.h"
#include "../util/color_palette.h"
+#ifdef CAMU_RENDERER_DX11
+#include <nnwt/windows.h>
+#define COBJMACROS
+#include <libplacebo/d3d11.h>
+#endif
+
#include "renderer_libplacebo.h"
#include "queue_libplacebo.h"
@@ -35,6 +41,16 @@ static void renderer_lp_resize(struct camu_renderer *renderer, u32 *width, u32 *
}
}
+#ifdef CAMU_RENDERER_DX11
+static void renderer_lp_set_fullscreen(struct camu_renderer *renderer, bool fullscreen)
+{
+ struct camu_renderer_lp *lr = (struct camu_renderer_lp *)renderer;
+ IDXGISwapChain *d3d_swapchain = pl_d3d11_swapchain_unwrap(lr->swapchain);
+ IDXGISwapChain1_SetFullscreenState(d3d_swapchain, fullscreen, NULL);
+ IDXGISwapChain1_Release(d3d_swapchain);
+}
+#endif
+
static void log_callback(void *userdata, enum pl_log_level level, const char *message)
{
(void)userdata;
@@ -123,6 +139,7 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, u32 *wid
al_log_info("render_libplacebo", "Using Vulkan.");
#elif defined CAMU_RENDERER_DX11
+ (void)priv;
lr->d3d11 = pl_d3d11_create(lr->logger, pl_d3d11_params(
.debug = false
));
@@ -188,6 +205,7 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, u32 *wid
lr->params = pl_render_default_params;
//lr->params = pl_render_high_quality_params;
lr->params.deband_params = NULL;
+ //lr->params.frame_mixer = NULL;
// Clear manually so we can draw multiple images per frame.
lr->params.border = PL_CLEAR_SKIP;
@@ -232,7 +250,7 @@ static struct camu_frame_queue *renderer_lp_create_queue(struct camu_renderer *r
al_memset(&lq->params, 0, sizeof(struct pl_queue_params));
lq->params.interpolation_threshold = 0.01f;
lq->params.radius = pl_frame_mix_radius(&lr->params);
- lq->params.timeout = 0uL; // vsync
+ lq->params.timeout = 0;
lq->copy_frame_fallback = false;
lq->ass = lr->ass;
return queue;
@@ -347,7 +365,7 @@ static void renderer_lp_render(struct camu_renderer *renderer, struct camu_scree
f64 tick = nn_get_tick();
f64 frame_time = tick - lr->last_render_tick;
if (frame_time > (1.0 / 24.0)) { // 24fps is totally arbitrary.
- al_log_info("render_libplacebo", "FRAME_TIME: %fs", frame_time);
+ al_log_info("render_libplacebo", "FRAME_TIME: %fs (%.2ffps)", frame_time, 1.0 / frame_time);
}
lr->last_render_tick = tick;
#endif
@@ -376,6 +394,11 @@ struct camu_renderer *camu_renderer_lp_create(void)
lr->r.add_font = renderer_lp_add_font;
lr->r.get_latency = renderer_lp_get_latency;
lr->r.resize = renderer_lp_resize;
+#ifdef CAMU_RENDERER_DX11
+ lr->r.set_fullscreen = renderer_lp_set_fullscreen;
+#else
+ lr->r.set_fullscreen = NULL;
+#endif
lr->r.render = renderer_lp_render;
lr->r.free = renderer_lp_free;
return (struct camu_renderer *)lr;