diff options
Diffstat (limited to 'src/render')
| -rw-r--r-- | src/render/meson.build | 22 | ||||
| -rw-r--r-- | src/render/queue_libplacebo.c | 24 | ||||
| -rw-r--r-- | src/render/queue_libplacebo.h | 1 | ||||
| -rw-r--r-- | src/render/renderer.h | 1 | ||||
| -rw-r--r-- | src/render/renderer_libplacebo.c | 27 |
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; |