diff options
Diffstat (limited to 'src/render')
| -rw-r--r-- | src/render/meson.build | 75 | ||||
| -rw-r--r-- | src/render/queue_libplacebo.c | 9 | ||||
| -rw-r--r-- | src/render/queue_tiger.c | 6 | ||||
| -rw-r--r-- | src/render/renderer.h | 6 | ||||
| -rw-r--r-- | src/render/renderer_libplacebo.c | 49 | ||||
| -rw-r--r-- | src/render/renderer_libplacebo.h | 1 | ||||
| -rw-r--r-- | src/render/renderer_tiger.c | 39 |
7 files changed, 101 insertions, 84 deletions
diff --git a/src/render/meson.build b/src/render/meson.build index 668c3d4..75cde7c 100644 --- a/src/render/meson.build +++ b/src/render/meson.build @@ -59,46 +59,49 @@ elif get_option('renderer') == 'libplacebo' render_args += ['-DCAMU_RENDERER_LIBPLACEBO'] endif -libass_opts = [] -if not is_windows - libass_opts += ['fontconfig=enabled'] - # libass(e46aede):meson.build:126 - fontconfig = dependency('fontconfig', - version: '>=2.10.92', +libass = dependency('libass', required: false, allow_fallback: false) +if not libass.found() + libass_opts = [] + if not is_windows + libass_opts += ['fontconfig=enabled'] + # libass(e46aede):meson.build:126 + fontconfig = dependency('fontconfig', + version: '>=2.10.92', + default_options: [ + 'doc=disabled', + 'nls=disabled', + 'tests=disabled', + 'tools=disabled', + 'cache-build=disabled' + ]) + endif + # libass(e46aede):meson.build:90 + fribidi = dependency('fribidi', + version: '>=0.19.1', + default_options: [ + 'docs=false', + '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', default_options: [ - 'doc=disabled', - 'nls=disabled', + 'freetype=disabled', 'tests=disabled', - 'tools=disabled', - 'cache-build=disabled' + 'introspection=disabled', + 'docs=disabled', + 'utilities=disabled' ]) + libass = dependency('libass', default_options: libass_opts) endif -# libass(e46aede):meson.build:90 -fribidi = dependency('fribidi', - version: '>=0.19.1', - default_options: [ - 'docs=false', - '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', - default_options: [ - 'freetype=disabled', - 'tests=disabled', - 'introspection=disabled', - 'docs=disabled', - 'utilities=disabled' - ]) -libass = dependency('libass', default_options: libass_opts) render_deps += [libass] render = declare_dependency(sources: render_src, dependencies: render_deps, compile_args: render_args) diff --git a/src/render/queue_libplacebo.c b/src/render/queue_libplacebo.c index 22df3dc..165fc4b 100644 --- a/src/render/queue_libplacebo.c +++ b/src/render/queue_libplacebo.c @@ -3,6 +3,7 @@ #ifdef CAMU_HAVE_FFMPEG #define PL_LIBAV_IMPLEMENTATION 1 #include <libplacebo/utils/libav.h> +#include "../codec/ffmpeg/common.h" #endif #include "../buffer/video.h" @@ -10,7 +11,7 @@ #include "queue_libplacebo.h" #ifdef CAMU_HAVE_FFMPEG -static bool queue_lp_configure_subtitiles(struct camu_frame_queue *queue, s32 width, s32 height, AVCodecParameters *codecpar) +static bool queue_lp_configure_subtitiles(struct camu_frame_queue *queue, u32 width, u32 height, AVCodecParameters *codecpar) { struct camu_frame_queue_lp *lq = (struct camu_frame_queue_lp *)queue; if (!lq->ass) return false; @@ -86,7 +87,7 @@ static bool map_frame(pl_gpu gpu, pl_tex *tex, const struct pl_source_frame *src out_frame->planes[0] = plane; out_frame->repr = pl_color_repr_unknown; out_frame->color = pl_color_space_monitor; - out_frame->crop = (pl_rect2df){ 0, 0, frame->video.width, frame->video.height }; + out_frame->crop = (pl_rect2df){ 0.f, 0.f, frame->video.width, frame->video.height }; //out_frame->profile = camu_codec_frame_discard(frame); @@ -168,7 +169,7 @@ static struct camu_overlay_lp *create_subtitle_overlay(pl_gpu gpu, ASS_Image *as // https://github.com/mpv-player/mpv/blob/70aaba71d6e3071a732069a1d222d1eb4293faf2/sub/ass_mp.c#L195 current = (struct pl_overlay *)&overlay->overlays[overlay->num++]; struct pl_overlay_part *part = (struct pl_overlay_part *)¤t->parts[0]; - part->src = (pl_rect2df){ 0, 0, ass_frame->w, ass_frame->h }; + part->src = (pl_rect2df){ 0.f, 0.f, ass_frame->w, ass_frame->h }; part->dst = (pl_rect2df){ ass_frame->dst_x, ass_frame->dst_y, @@ -280,7 +281,7 @@ static void queue_lp_push_av_frame(struct camu_frame_queue *queue, AVFrame *fram frame->opaque = lq; pl_queue_push(lq->queue, &(struct pl_source_frame){ .pts = pts, - .duration = frame->duration * av_q2d(stream->time_base), + .duration = camu_ff_frame_duration(frame) * av_q2d(stream->time_base), .map = map_av_frame, .unmap = unmap_av_frame, .discard = discard_av_frame, diff --git a/src/render/queue_tiger.c b/src/render/queue_tiger.c index d21236d..df072d2 100644 --- a/src/render/queue_tiger.c +++ b/src/render/queue_tiger.c @@ -5,7 +5,7 @@ #define GL_UNPACK_ROW_LENGTH 0x0CF2 -static void upload_texture(struct camu_frame_queue_tiger *tq, u8 *data, s32 width, s32 height, s32 format, s32 linesize) +static void upload_texture(struct camu_frame_queue_tiger *tq, u8 *data, u32 width, u32 height, s32 format, s32 linesize) { glGenTextures(1, &tq->texture_id); glActiveTexture(GL_TEXTURE0); @@ -13,7 +13,7 @@ static void upload_texture(struct camu_frame_queue_tiger *tq, u8 *data, s32 widt //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //if (frame->flags & CAMU_FRAME_DEVICE_ALLOCATED) { // glBindBuffer(GL_PIXEL_UNPACK_BUFFER, tq->tr->texture_buffer); //} @@ -31,7 +31,7 @@ static void upload_texture(struct camu_frame_queue_tiger *tq, u8 *data, s32 widt default: al_assert(false); } - glGenerateMipmap(GL_TEXTURE_2D); + //glGenerateMipmap(GL_TEXTURE_2D); } static void queue_tiger_push(struct camu_frame_queue *queue, struct camu_codec_frame *frame, f64 pts) diff --git a/src/render/renderer.h b/src/render/renderer.h index c78e1c1..101dda0 100644 --- a/src/render/renderer.h +++ b/src/render/renderer.h @@ -19,7 +19,7 @@ struct camu_frame_queue; struct camu_screen; struct camu_renderer { bool (*create_renderer)( - struct camu_renderer *, s32 *, s32 *, + struct camu_renderer *, u32 *, u32 *, #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 *), @@ -39,13 +39,11 @@ struct camu_renderer { void *priv); struct camu_frame_queue *(*create_queue)(struct camu_renderer *); u32 (*get_latency)(struct camu_renderer *); - void (*resize)(struct camu_renderer *, s32 *, s32 *, bool); + void (*resize)(struct camu_renderer *, u32 *, u32 *); void (*render)(struct camu_renderer *, struct camu_screen *, bool); #ifdef CAMU_HAVE_FFMPEG s32 (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, s32 flags); void *opaque; #endif - void *(*get_device_ptr)(struct camu_renderer *, size_t); - void (*commit_device_ptr)(struct camu_renderer *); void (*free)(struct camu_renderer **); }; diff --git a/src/render/renderer_libplacebo.c b/src/render/renderer_libplacebo.c index 0ff0326..2c632ee 100644 --- a/src/render/renderer_libplacebo.c +++ b/src/render/renderer_libplacebo.c @@ -13,7 +13,17 @@ static f32 clear_color[4] = { 0.f, 0.f, 0.f, 1.f }; -static void renderer_lp_resize(struct camu_renderer *renderer, s32 *width, s32 *height, bool double_swap) +static inline void pl_swapchain_resize_compat(pl_swapchain swapchain, u32 *width, u32 *height) +{ + s32 req_width = (s32)*width; + s32 req_height = (s32)*height; + pl_swapchain_resize(swapchain, &req_width, &req_height); + al_assert(req_width > 0 && req_height > 0); + *width = (u32)req_width; + *height = (u32)req_height; +} + +static void renderer_lp_resize(struct camu_renderer *renderer, u32 *width, u32 *height) { struct camu_renderer_lp *lr = (struct camu_renderer_lp *)renderer; if (lr->swapchain) { @@ -21,8 +31,7 @@ static void renderer_lp_resize(struct camu_renderer *renderer, s32 *width, s32 * pl_swapchain_submit_frame(lr->swapchain); lr->have_frame = false; } - pl_swapchain_resize(lr->swapchain, width, height); - lr->double_swap = double_swap; + pl_swapchain_resize_compat(lr->swapchain, width, height); } } @@ -36,7 +45,7 @@ static void log_callback(void *userdata, enum pl_log_level level, const char *me } } -static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *width, s32 *height, +static bool renderer_lp_create_renderer(struct camu_renderer *renderer, u32 *width, u32 *height, #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 *), @@ -144,9 +153,7 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *wid lr->renderer = pl_renderer_create(lr->logger, lr->gpu); - pl_swapchain_resize(lr->swapchain, width, height); - lr->double_swap = false; - + pl_swapchain_resize_compat(lr->swapchain, width, height); lr->have_frame = false; al_memset(&lr->params, 0, sizeof(struct pl_render_params)); @@ -220,11 +227,6 @@ static void renderer_lp_render(struct camu_renderer *renderer, struct camu_scree } #endif - if (lr->double_swap) { - pl_swapchain_swap_buffers(lr->swapchain); - lr->double_swap = false; - } - if (!lr->have_frame) { struct pl_swapchain_frame frame; pl_swapchain_start_frame(lr->swapchain, &frame); @@ -250,7 +252,10 @@ static void renderer_lp_render(struct camu_renderer *renderer, struct camu_scree do_gpu_finish |= weighted; // Terrible hack. Let's us distinguish single frames with the same dimensions. // Tied to a libplacebo patch to consider info_priv in the hash. - lr->params.info_priv = video->buf; + // Add in last_pts to account for buffer resets. This is a completely + // broken "hash" of the f64 pts value but hopefully works for now. + // https://www.virtualdub.org/blog2/entry_259.html + lr->params.info_priv = video->buf + (intptr_t)*((u64 *)&video->buf->last_pts); target->crop = mix.frames[0]->crop; target->crop.x1 *= video->view.zoom / video->view.stretch; target->crop.y1 *= video->view.zoom * video->view.stretch; @@ -281,25 +286,29 @@ static void renderer_lp_render(struct camu_renderer *renderer, struct camu_scree if (!scr->videos.count && !force) { // Don't spin too hard on a potential error state. - nn_thread_sleep(NNWT_TS_FROM_USEC(26)); + //al_log_warn("render_libplacebo", "Spinning in renderer."); + nn_thread_sleep(NNWT_TS_FROM_USEC(128)); return; } pl_swapchain_submit_frame(lr->swapchain); - pl_swapchain_swap_buffers(lr->swapchain); lr->have_frame = false; + pl_swapchain_swap_buffers(lr->swapchain); + if (do_gpu_finish) { // Block until render completes. pl_gpu_finish(lr->gpu); } - f64 tick = nn_get_tick(); - f64 frame_time = tick - lr->last_render_tick; - if (frame_time > (1.0 / 24.0)) { - al_log_info("render_libplacebo", "FRAME_TIME: %fs", frame_time); + if (!force) { + f64 tick = nn_get_tick(); + f64 frame_time = tick - lr->last_render_tick; + if (frame_time > (1.0 / 24.0)) { + al_log_info("render_libplacebo", "FRAME_TIME: %fs", frame_time); + } + lr->last_render_tick = tick; } - lr->last_render_tick = tick; } void renderer_lp_free(struct camu_renderer **renderer) diff --git a/src/render/renderer_libplacebo.h b/src/render/renderer_libplacebo.h index a4bd40e..38407bb 100644 --- a/src/render/renderer_libplacebo.h +++ b/src/render/renderer_libplacebo.h @@ -26,7 +26,6 @@ struct camu_renderer_lp { pl_gpu gpu; pl_log logger; pl_swapchain swapchain; - bool double_swap; struct pl_frame target; bool have_frame; pl_renderer renderer; diff --git a/src/render/renderer_tiger.c b/src/render/renderer_tiger.c index 74db594..ab6e85b 100644 --- a/src/render/renderer_tiger.c +++ b/src/render/renderer_tiger.c @@ -19,7 +19,7 @@ static const GLfloat default_vertices[] = { 1.f, 1.f, 0.f, 1.f, 1.f }; -static f32 clear_color[4] = { 0.0f, 0.0f, 0.0f, 1.f }; +static GLfloat clear_color[4] = { 0.f, 0.f, 0.f, 1.f }; static const GLchar *default_vs = \ "#version 100\n" \ @@ -86,7 +86,7 @@ static bool compile_shaders(struct camu_renderer_tiger *tr) } #endif -static void renderer_tiger_resize(struct camu_renderer *renderer, s32 *width, s32 *height) +static void renderer_tiger_resize(struct camu_renderer *renderer, u32 *width, u32 *height) { struct camu_renderer_tiger *tr = (struct camu_renderer_tiger *)renderer; (void)tr; @@ -94,12 +94,16 @@ static void renderer_tiger_resize(struct camu_renderer *renderer, s32 *width, s3 (void)height; } -static bool renderer_tiger_create_renderer(struct camu_renderer *renderer, s32 *width, s32 *height, +static bool renderer_tiger_create_renderer(struct camu_renderer *renderer, u32 *width, u32 *height, #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 *), const char *const *(*vk_get_extensions)(u32 *), #elif defined CAMU_RENDERER_OPENGL +#ifdef STELA_USE_EGL + EGLDisplay display, + EGLContext context, +#endif void (*get_gl_proc_address(char const *procname))(void), bool (*gl_load_loader)(void *), bool (*gl_make_current)(void *), @@ -109,7 +113,11 @@ static bool renderer_tiger_create_renderer(struct camu_renderer *renderer, s32 * void *priv) { struct camu_renderer_tiger *tr = (struct camu_renderer_tiger *)renderer; + (void)width; + (void)height; #ifdef CAMU_RENDERER_OPENGL + (void)display; + (void)context; (void)get_gl_proc_address; tr->load_loader = gl_load_loader; @@ -120,9 +128,9 @@ static bool renderer_tiger_create_renderer(struct camu_renderer *renderer, s32 * tr->make_current(tr->priv); - if (!tr->load_loader(tr->priv)) return false; - - tr->r.resize(&tr->r, width, height); + if (!tr->load_loader(tr->priv)) { + return false; + } clear_color[0] = ((global_color_palette.colors[0] >> 16) & 0xff) / 255.f; clear_color[1] = ((global_color_palette.colors[0] >> 8) & 0xff) / 255.f; @@ -145,7 +153,7 @@ static bool renderer_tiger_create_renderer(struct camu_renderer *renderer, s32 * glVertexAttribPointer(pos, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (void *)0); if (stl_gl_check_error()) { al_log_error("render_tiger", "glVertexAttribPointer returned error, use GLES context."); - al_assert(false); + al_assert_and_return(false); } glEnableVertexAttribArray(pos); GLint texcoord = glGetAttribLocation(tr->program, "a_TexCoord"); @@ -216,11 +224,6 @@ static void set_uniform(struct camu_renderer_tiger *tr, const GLchar *name, #endif } -#ifdef CAMU_RENDERER_OPENGL -static mat4x4 model = { 0 }; -static GLuint texture0 = 0; -#endif - static void renderer_tiger_render(struct camu_renderer *renderer, struct camu_screen *scr, bool force) { #ifdef CAMU_RENDERER_OPENGL @@ -241,19 +244,23 @@ static void renderer_tiger_render(struct camu_renderer *renderer, struct camu_sc } #endif - if (scr->videos.size > 0) { + if (scr->videos.count > 0) { struct camu_screen_video *video = &al_array_last(scr->videos); GLuint texture_id; - if (camu_video_buffer_read(video->buf, &texture_id)) { + bool weighted; + if (camu_video_buffer_read(video->buf, &texture_id, &weighted)) { glBindTexture(GL_TEXTURE_2D, texture_id); + mat4x4 model; mat4x4_identity(model); mat4x4_ortho(model, 0.f, (f32)scr->width, (f32)scr->height, 0.f, -1.f, 1.f); mat4x4_translate_in_place(model, (f32)video->view.x_offset, (f32)video->view.y_offset, 0.f); mat4x4_scale_aniso(model, model, (f32)video->view.zoom, (f32)video->view.zoom, 1.f); mat4x4_scale_aniso(model, model, (f32)video->view.width, (f32)video->view.height, 1.f); set_uniform(tr, "g_ModelViewProjectionMatrix", TYPE_MAT4, model); + + GLuint texture0 = 0; set_uniform(tr, "g_Texture0", TYPE_SAMPLER2D, &texture0); glViewport(0, 0, scr->width, scr->height); @@ -267,6 +274,7 @@ static void renderer_tiger_render(struct camu_renderer *renderer, struct camu_sc tr->release_current(tr->priv); } +/* static void *renderer_tiger_get_device_ptr(struct camu_renderer *renderer, size_t length) { (void)renderer; @@ -289,6 +297,7 @@ static void renderer_tiger_commit_device_ptr(struct camu_renderer *renderer) //glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER); #endif } +*/ static void renderer_tiger_free(struct camu_renderer **renderer) { @@ -307,8 +316,6 @@ struct camu_renderer *camu_renderer_tiger_create(void) tr->r.get_latency = renderer_tiger_get_latency; tr->r.resize = renderer_tiger_resize; tr->r.render = renderer_tiger_render; - tr->r.get_device_ptr = renderer_tiger_get_device_ptr; - tr->r.commit_device_ptr = renderer_tiger_commit_device_ptr; tr->r.free = renderer_tiger_free; return (struct camu_renderer *)tr; } |