diff options
Diffstat (limited to 'video')
-rw-r--r-- | video/decode/vd_lavc.c | 46 | ||||
-rw-r--r-- | video/out/cocoa_cb_common.swift | 4 | ||||
-rw-r--r-- | video/out/d3d11/context.c | 7 | ||||
-rw-r--r-- | video/out/drm_common.c | 49 | ||||
-rw-r--r-- | video/out/gpu/context.c | 40 | ||||
-rw-r--r-- | video/out/gpu/context.h | 8 | ||||
-rw-r--r-- | video/out/gpu/hwdec.c | 3 | ||||
-rw-r--r-- | video/out/gpu/hwdec.h | 2 | ||||
-rw-r--r-- | video/out/gpu/lcms.c | 3 | ||||
-rw-r--r-- | video/out/gpu/video.c | 24 | ||||
-rw-r--r-- | video/out/gpu/video_shaders.c | 2 | ||||
-rw-r--r-- | video/out/hwdec/hwdec_vaapi_vk.c | 4 | ||||
-rw-r--r-- | video/out/mac/common.swift | 5 | ||||
-rw-r--r-- | video/out/mac/window.swift | 29 | ||||
-rw-r--r-- | video/out/placebo/ra_pl.c | 56 | ||||
-rw-r--r-- | video/out/vo_gpu.c | 8 | ||||
-rw-r--r-- | video/out/vo_wlshm.c | 3 | ||||
-rw-r--r-- | video/out/vulkan/context.c | 3 | ||||
-rw-r--r-- | video/out/wayland_common.c | 105 |
19 files changed, 218 insertions, 183 deletions
diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c index 15eab18bf9..460334b371 100644 --- a/video/decode/vd_lavc.c +++ b/video/decode/vd_lavc.c @@ -63,8 +63,8 @@ static void uninit_avctx(struct mp_filter *vd); static int get_buffer2_direct(AVCodecContext *avctx, AVFrame *pic, int flags); static enum AVPixelFormat get_format_hwdec(struct AVCodecContext *avctx, const enum AVPixelFormat *pix_fmt); -static int hwdec_validate_opt(struct mp_log *log, const m_option_t *opt, - struct bstr name, struct bstr param); +static int hwdec_opt_help(struct mp_log *log, const m_option_t *opt, + struct bstr name); #define HWDEC_DELAY_QUEUE_COUNT 2 @@ -117,7 +117,8 @@ const struct m_sub_options vd_lavc_conf = { {"no", INT_MAX}, {"yes", 1}), M_RANGE(1, INT_MAX)}, {"vd-lavc-o", OPT_KEYVALUELIST(avopts)}, {"vd-lavc-dr", OPT_FLAG(dr)}, - {"hwdec", OPT_STRING_VALIDATE(hwdec_api, hwdec_validate_opt), + {"hwdec", OPT_STRING(hwdec_api), + .help = hwdec_opt_help, .flags = M_OPT_OPTIONAL_PARAM | UPDATE_HWDEC}, {"hwdec-codecs", OPT_STRING(hwdec_codecs)}, {"hwdec-image-format", OPT_IMAGEFORMAT(hwdec_image_format)}, @@ -533,33 +534,30 @@ static void select_and_set_hwdec(struct mp_filter *vd) } } -static int hwdec_validate_opt(struct mp_log *log, const m_option_t *opt, - struct bstr name, struct bstr param) +static int hwdec_opt_help(struct mp_log *log, const m_option_t *opt, + struct bstr name) { - if (bstr_equals0(param, "help")) { - struct hwdec_info *hwdecs = NULL; - int num_hwdecs = 0; - add_all_hwdec_methods(&hwdecs, &num_hwdecs); + struct hwdec_info *hwdecs = NULL; + int num_hwdecs = 0; + add_all_hwdec_methods(&hwdecs, &num_hwdecs); - mp_info(log, "Valid values (with alternative full names):\n"); + mp_info(log, "Valid values (with alternative full names):\n"); - for (int n = 0; n < num_hwdecs; n++) { - struct hwdec_info *hwdec = &hwdecs[n]; + for (int n = 0; n < num_hwdecs; n++) { + struct hwdec_info *hwdec = &hwdecs[n]; - mp_info(log, " %s (%s)\n", hwdec->method_name, hwdec->name); - } + mp_info(log, " %s (%s)\n", hwdec->method_name, hwdec->name); + } - talloc_free(hwdecs); + talloc_free(hwdecs); - mp_info(log, " auto (yes '')\n"); - mp_info(log, " no\n"); - mp_info(log, " auto-safe\n"); - mp_info(log, " auto-copy\n"); - mp_info(log, " auto-copy-safe\n"); + mp_info(log, " auto (yes '')\n"); + mp_info(log, " no\n"); + mp_info(log, " auto-safe\n"); + mp_info(log, " auto-copy\n"); + mp_info(log, " auto-copy-safe\n"); - return M_OPT_EXIT; - } - return 0; + return M_OPT_EXIT; } static void force_fallback(struct mp_filter *vd) @@ -661,7 +659,9 @@ static void init_avctx(struct mp_filter *vd) if (!ctx->use_hwdec && ctx->vo && lavc_param->dr) { avctx->opaque = vd; avctx->get_buffer2 = get_buffer2_direct; +#if LIBAVCODEC_VERSION_MAJOR < 60 avctx->thread_safe_callbacks = 1; +#endif } avctx->flags |= lavc_param->bitexact ? AV_CODEC_FLAG_BITEXACT : 0; diff --git a/video/out/cocoa_cb_common.swift b/video/out/cocoa_cb_common.swift index 8dd76f4bc5..dd0738f7e3 100644 --- a/video/out/cocoa_cb_common.swift +++ b/video/out/cocoa_cb_common.swift @@ -132,11 +132,11 @@ class CocoaCB: Common { } override func windowSetToFullScreen() { - layer?.update() + layer?.update(force: true) } override func windowSetToWindow() { - layer?.update() + layer?.update(force: true) } override func windowDidUpdateFrame() { diff --git a/video/out/d3d11/context.c b/video/out/d3d11/context.c index b77e328b70..57feb27530 100644 --- a/video/out/d3d11/context.c +++ b/video/out/d3d11/context.c @@ -28,7 +28,7 @@ static int d3d11_validate_adapter(struct mp_log *log, const struct m_option *opt, - struct bstr name, struct bstr param); + struct bstr name, const char **value); struct d3d11_opts { int feature_level; @@ -61,7 +61,7 @@ const struct m_sub_options d3d11_conf = { {"d3d11-flip", OPT_FLAG(flip)}, {"d3d11-sync-interval", OPT_INT(sync_interval), M_RANGE(0, 4)}, {"d3d11-adapter", OPT_STRING_VALIDATE(adapter_name, - d3d11_validate_adapter)}, + d3d11_validate_adapter)}, {"d3d11-output-format", OPT_CHOICE(output_format, {"auto", DXGI_FORMAT_UNKNOWN}, {"rgba8", DXGI_FORMAT_R8G8B8A8_UNORM}, @@ -111,8 +111,9 @@ struct priv { static int d3d11_validate_adapter(struct mp_log *log, const struct m_option *opt, - struct bstr name, struct bstr param) + struct bstr name, const char **value) { + struct bstr param = bstr0(*value); bool help = bstr_equals0(param, "help"); bool adapter_matched = false; struct bstr listing = { 0 }; diff --git a/video/out/drm_common.c b/video/out/drm_common.c index 64c84ca315..727221b6b1 100644 --- a/video/out/drm_common.c +++ b/video/out/drm_common.c @@ -54,13 +54,15 @@ static int vt_switcher_pipe[2]; -static int drm_validate_connector_opt( - struct mp_log *log, const struct m_option *opt, struct bstr name, - struct bstr param); +static int drm_connector_opt_help( + struct mp_log *log, const struct m_option *opt, struct bstr name); + +static int drm_mode_opt_help( + struct mp_log *log, const struct m_option *opt, struct bstr name); static int drm_validate_mode_opt( struct mp_log *log, const struct m_option *opt, struct bstr name, - struct bstr param); + const char **value); static void kms_show_available_modes( struct mp_log *log, const drmModeConnector *connector); @@ -71,10 +73,10 @@ static double mode_get_Hz(const drmModeModeInfo *mode); #define OPT_BASE_STRUCT struct drm_opts const struct m_sub_options drm_conf = { .opts = (const struct m_option[]) { - {"drm-connector", OPT_STRING_VALIDATE(drm_connector_spec, - drm_validate_connector_opt)}, - {"drm-mode", OPT_STRING_VALIDATE(drm_mode_spec, - drm_validate_mode_opt)}, + {"drm-connector", OPT_STRING(drm_connector_spec), + .help = drm_connector_opt_help}, + {"drm-mode", OPT_STRING_VALIDATE(drm_mode_spec, drm_validate_mode_opt), + .help = drm_mode_opt_help}, {"drm-atomic", OPT_CHOICE(drm_atomic, {"no", 0}, {"auto", 1})}, {"drm-draw-plane", OPT_CHOICE(drm_draw_plane, {"primary", DRM_OPTS_PRIMARY_PLANE}, @@ -747,31 +749,28 @@ double kms_get_display_fps(const struct kms *kms) return mode_get_Hz(&kms->mode.mode); } -static int drm_validate_connector_opt(struct mp_log *log, const struct m_option *opt, - struct bstr name, struct bstr param) +static int drm_connector_opt_help(struct mp_log *log, const struct m_option *opt, + struct bstr name) { - if (bstr_equals0(param, "help")) { - kms_show_available_cards_and_connectors(log); - return M_OPT_EXIT; - } - return 1; + kms_show_available_cards_and_connectors(log); + return M_OPT_EXIT; } -static int drm_validate_mode_opt(struct mp_log *log, const struct m_option *opt, - struct bstr name, struct bstr param) +static int drm_mode_opt_help(struct mp_log *log, const struct m_option *opt, + struct bstr name) { - if (bstr_equals0(param, "help")) { - kms_show_available_cards_connectors_and_modes(log); - return M_OPT_EXIT; - } + kms_show_available_cards_connectors_and_modes(log); + return M_OPT_EXIT; +} - char *spec = bstrto0(NULL, param); - if (!parse_mode_spec(spec, NULL)) { +static int drm_validate_mode_opt(struct mp_log *log, const struct m_option *opt, + struct bstr name, const char **value) +{ + const char *param = *value; + if (!parse_mode_spec(param, NULL)) { mp_fatal(log, "Invalid value for option drm-mode. Must be a positive number, a string of the format WxH[@R] or 'help'\n"); - talloc_free(spec); return M_OPT_INVALID; } - talloc_free(spec); return 1; } diff --git a/video/out/gpu/context.c b/video/out/gpu/context.c index 39696fbd83..afbca2b2f4 100644 --- a/video/out/gpu/context.c +++ b/video/out/gpu/context.c @@ -110,16 +110,20 @@ static const struct ra_ctx_fns *contexts[] = { #endif }; +int ra_ctx_api_help(struct mp_log *log, const struct m_option *opt, + struct bstr name) +{ + mp_info(log, "GPU APIs (contexts):\n"); + mp_info(log, " auto (autodetect)\n"); + for (int n = 0; n < MP_ARRAY_SIZE(contexts); n++) + mp_info(log, " %s (%s)\n", contexts[n]->type, contexts[n]->name); + return M_OPT_EXIT; +} + int ra_ctx_validate_api(struct mp_log *log, const struct m_option *opt, - struct bstr name, struct bstr param) + struct bstr name, const char **value) { - if (bstr_equals0(param, "help")) { - mp_info(log, "GPU APIs (contexts):\n"); - mp_info(log, " auto (autodetect)\n"); - for (int n = 0; n < MP_ARRAY_SIZE(contexts); n++) - mp_info(log, " %s (%s)\n", contexts[n]->type, contexts[n]->name); - return M_OPT_EXIT; - } + struct bstr param = bstr0(*value); if (bstr_equals0(param, "auto")) return 1; for (int i = 0; i < MP_ARRAY_SIZE(contexts); i++) { @@ -129,16 +133,20 @@ int ra_ctx_validate_api(struct mp_log *log, const struct m_option *opt, return M_OPT_INVALID; } +int ra_ctx_context_help(struct mp_log *log, const struct m_option *opt, + struct bstr name) +{ + mp_info(log, "GPU contexts (APIs):\n"); + mp_info(log, " auto (autodetect)\n"); + for (int n = 0; n < MP_ARRAY_SIZE(contexts); n++) + mp_info(log, " %s (%s)\n", contexts[n]->name, contexts[n]->type); + return M_OPT_EXIT; +} + int ra_ctx_validate_context(struct mp_log *log, const struct m_option *opt, - struct bstr name, struct bstr param) + struct bstr name, const char **value) { - if (bstr_equals0(param, "help")) { - mp_info(log, "GPU contexts (APIs):\n"); - mp_info(log, " auto (autodetect)\n"); - for (int n = 0; n < MP_ARRAY_SIZE(contexts); n++) - mp_info(log, " %s (%s)\n", contexts[n]->name, contexts[n]->type); - return M_OPT_EXIT; - } + struct bstr param = bstr0(*value); if (bstr_equals0(param, "auto")) return 1; for (int i = 0; i < MP_ARRAY_SIZE(contexts); i++) { diff --git a/video/out/gpu/context.h b/video/out/gpu/context.h index 8c35eb0fc0..ca71150f54 100644 --- a/video/out/gpu/context.h +++ b/video/out/gpu/context.h @@ -100,7 +100,11 @@ struct ra_ctx *ra_ctx_create(struct vo *vo, const char *context_type, void ra_ctx_destroy(struct ra_ctx **ctx); struct m_option; +int ra_ctx_api_help(struct mp_log *log, const struct m_option *opt, + struct bstr name); int ra_ctx_validate_api(struct mp_log *log, const struct m_option *opt, - struct bstr name, struct bstr param); + struct bstr name, const char **value); +int ra_ctx_context_help(struct mp_log *log, const struct m_option *opt, + struct bstr name); int ra_ctx_validate_context(struct mp_log *log, const struct m_option *opt, - struct bstr name, struct bstr param); + struct bstr name, const char **value); diff --git a/video/out/gpu/hwdec.c b/video/out/gpu/hwdec.c index db75c64b05..4fb6240651 100644 --- a/video/out/gpu/hwdec.c +++ b/video/out/gpu/hwdec.c @@ -106,8 +106,9 @@ struct ra_hwdec *ra_hwdec_load_driver(struct ra *ra, struct mp_log *log, } int ra_hwdec_validate_opt(struct mp_log *log, const m_option_t *opt, - struct bstr name, struct bstr param) + struct bstr name, const char **value) { + struct bstr param = bstr0(*value); bool help = bstr_equals0(param, "help"); if (help) mp_info(log, "Available hwdecs:\n"); diff --git a/video/out/gpu/hwdec.h b/video/out/gpu/hwdec.h index 3a1ae3e2ff..050a358c74 100644 --- a/video/out/gpu/hwdec.h +++ b/video/out/gpu/hwdec.h @@ -109,7 +109,7 @@ struct ra_hwdec *ra_hwdec_load_driver(struct ra *ra, struct mp_log *log, bool is_auto); int ra_hwdec_validate_opt(struct mp_log *log, const m_option_t *opt, - struct bstr name, struct bstr param); + struct bstr name, const char **value); void ra_hwdec_uninit(struct ra_hwdec *hwdec); diff --git a/video/out/gpu/lcms.c b/video/out/gpu/lcms.c index 0f3a0bf646..894506973b 100644 --- a/video/out/gpu/lcms.c +++ b/video/out/gpu/lcms.c @@ -67,8 +67,9 @@ static bool parse_3dlut_size(const char *arg, int *p1, int *p2, int *p3) } static int validate_3dlut_size_opt(struct mp_log *log, const m_option_t *opt, - struct bstr name, struct bstr param) + struct bstr name, const char **value) { + struct bstr param = bstr0(*value); int p1, p2, p3; char s[20]; snprintf(s, sizeof(s), "%.*s", BSTR_P(param)); diff --git a/video/out/gpu/video.c b/video/out/gpu/video.c index 2aae3171e6..597286a550 100644 --- a/video/out/gpu/video.c +++ b/video/out/gpu/video.c @@ -317,7 +317,7 @@ static const struct gl_video_opts gl_video_opts_def = { }, .scaler_resizes_only = 1, .scaler_lut_size = 6, - .interpolation_threshold = 0.0001, + .interpolation_threshold = 0.01, .alpha_mode = ALPHA_BLEND_TILES, .background = {0, 0, 0, 255}, .gamma = 1.0f, @@ -337,13 +337,13 @@ static const struct gl_video_opts gl_video_opts_def = { }; static int validate_scaler_opt(struct mp_log *log, const m_option_t *opt, - struct bstr name, struct bstr param); + struct bstr name, const char **value); static int validate_window_opt(struct mp_log *log, const m_option_t *opt, - struct bstr name, struct bstr param); + struct bstr name, const char **value); static int validate_error_diffusion_opt(struct mp_log *log, const m_option_t *opt, - struct bstr name, struct bstr param); + struct bstr name, const char **value); #define OPT_BASE_STRUCT struct gl_video_opts @@ -957,9 +957,6 @@ static void init_video(struct gl_video *p) params.w, params.h); plane->tex = ra_tex_create(p->ra, ¶ms); - if (!plane->tex) - abort(); // shit happens - p->use_integer_conversion |= format->ctype == RA_CTYPE_UINT; } } @@ -3588,6 +3585,10 @@ static bool pass_upload_image(struct gl_video *p, struct mp_image *mpi, uint64_t timer_pool_start(p->upload_timer); for (int n = 0; n < p->plane_count; n++) { struct texplane *plane = &vimg->planes[n]; + if (!plane->tex) { + timer_pool_stop(p->upload_timer); + goto error; + } struct ra_tex_upload_params params = { .tex = plane->tex, @@ -4088,8 +4089,9 @@ void gl_video_configure_queue(struct gl_video *p, struct vo *vo) } static int validate_scaler_opt(struct mp_log *log, const m_option_t *opt, - struct bstr name, struct bstr param) + struct bstr name, const char **value) { + struct bstr param = bstr0(*value); char s[20] = {0}; int r = 1; bool tscale = bstr_equals0(name, "tscale"); @@ -4120,8 +4122,9 @@ static int validate_scaler_opt(struct mp_log *log, const m_option_t *opt, } static int validate_window_opt(struct mp_log *log, const m_option_t *opt, - struct bstr name, struct bstr param) + struct bstr name, const char **value) { + struct bstr param = bstr0(*value); char s[20] = {0}; int r = 1; if (bstr_equals0(param, "help")) { @@ -4145,8 +4148,9 @@ static int validate_window_opt(struct mp_log *log, const m_option_t *opt, } static int validate_error_diffusion_opt(struct mp_log *log, const m_option_t *opt, - struct bstr name, struct bstr param) + struct bstr name, const char **value) { + struct bstr param = bstr0(*value); char s[20] = {0}; int r = 1; if (bstr_equals0(param, "help")) { diff --git a/video/out/gpu/video_shaders.c b/video/out/gpu/video_shaders.c index 7073185eaf..91c9aac865 100644 --- a/video/out/gpu/video_shaders.c +++ b/video/out/gpu/video_shaders.c @@ -946,7 +946,7 @@ struct deband_opts { const struct deband_opts deband_opts_def = { .iterations = 1, - .threshold = 64.0, + .threshold = 32.0, .range = 16.0, .grain = 48.0, }; diff --git a/video/out/hwdec/hwdec_vaapi_vk.c b/video/out/hwdec/hwdec_vaapi_vk.c index 1cee9e86b9..afb81be82a 100644 --- a/video/out/hwdec/hwdec_vaapi_vk.c +++ b/video/out/hwdec/hwdec_vaapi_vk.c @@ -43,6 +43,7 @@ static bool vaapi_vk_map(struct ra_hwdec_mapper *mapper) int fd = p->desc.objects[id].fd; uint32_t size = p->desc.objects[id].size; uint32_t offset = p->desc.layers[n].offset[0]; + uint32_t pitch = p->desc.layers[n].pitch[0]; #if PL_API_VER >= 88 // AMD drivers do not return the size in the surface description, so we @@ -85,6 +86,9 @@ static bool vaapi_vk_map(struct ra_hwdec_mapper *mapper) #if PL_API_VER >= 88 .drm_format_mod = p->desc.objects[id].drm_format_modifier, #endif +#if PL_API_VER >= 106 + .stride_w = pitch, +#endif }, }; diff --git a/video/out/mac/common.swift b/video/out/mac/common.swift index 6c3d0fcfb3..7ede81cbda 100644 --- a/video/out/mac/common.swift +++ b/video/out/mac/common.swift @@ -100,6 +100,7 @@ class Common: NSObject { } window.setOnTop(Bool(mpv.opts.ontop), Int(mpv.opts.ontop_level)) + window.setOnAllWorkspaces(Bool(mpv.opts.all_workspaces)) window.keepAspect = Bool(mpv.opts.keepaspect_window) window.title = title window.border = Bool(mpv.opts.border) @@ -547,6 +548,10 @@ class Common: NSObject { DispatchQueue.main.async { self.window?.setOnTop(Bool(mpv.opts.ontop), Int(mpv.opts.ontop_level)) } + case MPVHelper.getPointer(&mpv.optsPtr.pointee.all_workspaces): + DispatchQueue.main.async { + self.window?.setOnAllWorkspaces(Bool(mpv.opts.all_workspaces)) + } case MPVHelper.getPointer(&mpv.optsPtr.pointee.keepaspect_window): DispatchQueue.main.async { self.window?.keepAspect = Bool(mpv.opts.keepaspect_window) diff --git a/video/out/mac/window.swift b/video/out/mac/window.swift index a418f2ce75..8b6c5f0518 100644 --- a/video/out/mac/window.swift +++ b/video/out/mac/window.swift @@ -30,7 +30,7 @@ class Window: NSWindow, NSWindowDelegate { var isInFullscreen: Bool = false var isAnimating: Bool = false var isMoving: Bool = false - var forceTargetScreen: Bool = false + var previousStyleMask: NSWindow.StyleMask = [.titled, .closable, .miniaturizable, .resizable] var unfsContentFramePixel: NSRect { get { return convertToBacking(unfsContentFrame ?? NSRect(x: 0, y: 0, width: 160, height: 90)) } } var framePixel: NSRect { get { return convertToBacking(frame) } } @@ -61,6 +61,7 @@ class Window: NSWindow, NSWindowDelegate { set { let responder = firstResponder let windowTitle = title + previousStyleMask = super.styleMask super.styleMask = newValue makeFirstResponder(responder) title = windowTitle @@ -229,7 +230,14 @@ class Window: NSWindow, NSWindowDelegate { func setToFullScreen() { guard let targetFrame = targetScreen?.frame else { return } - styleMask.insert(.fullScreen) + + if #available(macOS 11.0, *) { + styleMask = .borderless + common.titleBar?.hide(0.0) + } else { + styleMask.insert(.fullScreen) + } + NSApp.presentationOptions = [.autoHideMenuBar, .autoHideDock] setFrame(targetFrame, display: true) endAnimation() @@ -240,10 +248,17 @@ class Window: NSWindow, NSWindowDelegate { func setToWindow() { guard let tScreen = targetScreen else { return } + + if #available(macOS 11.0, *) { + styleMask = previousStyleMask + common.titleBar?.hide(0.0) + } else { + styleMask.remove(.fullScreen) + } + let newFrame = calculateWindowPosition(for: tScreen, withoutBounds: targetScreen == screen) NSApp.presentationOptions = [] setFrame(newFrame, display: true) - styleMask.remove(.fullScreen) endAnimation() isInFullscreen = false mpv?.setOption(fullscreen: isInFullscreen) @@ -278,6 +293,14 @@ class Window: NSWindow, NSWindowDelegate { } } + func setOnAllWorkspaces(_ state: Bool) { + if state { + collectionBehavior.insert(.canJoinAllSpaces) + } else { + collectionBehavior.remove(.canJoinAllSpaces) + } + } + func setMinimized(_ stateWanted: Bool) { if isMiniaturized == stateWanted { return } diff --git a/video/out/placebo/ra_pl.c b/video/out/placebo/ra_pl.c index 8244acff26..09ff742d38 100644 --- a/video/out/placebo/ra_pl.c +++ b/video/out/placebo/ra_pl.c @@ -22,9 +22,7 @@ const struct pl_gpu *ra_pl_get(const struct ra *ra) return ra->fns == &ra_fns_pl ? get_gpu(ra) : NULL; } -#if PL_API_VER >= 60 static struct pl_timer *get_active_timer(const struct ra *ra); -#endif struct ra *ra_create_pl(const struct pl_gpu *gpu, struct mp_log *log) { @@ -163,32 +161,6 @@ static struct ra_tex *tex_create_pl(struct ra *ra, const struct ra_tex_params *params) { const struct pl_gpu *gpu = get_gpu(ra); - - // Check size limits - bool ok = false; - switch (params->dimensions) { - case 1: - ok = params->w <= gpu->limits.max_tex_1d_dim; - break; - - case 2: - ok = params->w <= gpu->limits.max_tex_2d_dim && - params->h <= gpu->limits.max_tex_2d_dim; - break; - - case 3: - ok = params->w <= gpu->limits.max_tex_2d_dim && - params->h <= gpu->limits.max_tex_2d_dim && - params->d <= gpu->limits.max_tex_2d_dim; - break; - }; - - if (!ok) { - MP_ERR(ra, "Texture size %dx%dx%d exceeds dimension limits!\n", - params->w, params->h, params->d); - return NULL; - } - const struct pl_tex *pltex = pl_tex_create(gpu, &(struct pl_tex_params) { .w = params->w, .h = params->dimensions >= 2 ? params->h : 0, @@ -217,6 +189,10 @@ static struct ra_tex *tex_create_pl(struct ra *ra, return NULL; } + // Keep track of these, so we can correctly bind them later + ratex->params.src_repeat = params->src_repeat; + ratex->params.src_linear = params->src_linear; + return ratex; } @@ -238,9 +214,7 @@ static bool tex_upload_pl(struct ra *ra, const struct ra_tex_upload_params *para .buf = params->buf ? params->buf->priv : NULL, .buf_offset = params->buf_offset, .ptr = (void *) params->src, -#if PL_API_VER >= 60 .timer = get_active_timer(ra), -#endif }; const struct pl_buf *staging = NULL; @@ -293,9 +267,7 @@ static bool tex_download_pl(struct ra *ra, struct ra_tex_download_params *params .tex = tex, .ptr = params->dst, .stride_w = params->stride / texel_size, -#if PL_API_VER >= 60 .timer = get_active_timer(ra), -#endif }; uint8_t *staging = NULL; @@ -328,19 +300,7 @@ static struct ra_buf *buf_create_pl(struct ra *ra, [RA_BUF_TYPE_SHARED_MEMORY] = 0, }; - const struct pl_gpu *gpu = get_gpu(ra); - size_t max_size[] = { - [PL_BUF_TEX_TRANSFER] = gpu->limits.max_xfer_size, - [PL_BUF_UNIFORM] = gpu->limits.max_ubo_size, - [PL_BUF_STORAGE] = gpu->limits.max_ssbo_size, - }; - - if (params->size > max_size[buf_type[params->type]]) { - MP_ERR(ra, "Buffer size %zu exceeds size limits!\n", params->size); - return NULL; - } - - const struct pl_buf *plbuf = pl_buf_create(gpu, &(struct pl_buf_params) { + const struct pl_buf *plbuf = pl_buf_create(get_gpu(ra), &(struct pl_buf_params) { .type = buf_type[params->type], .size = params->size, .host_mapped = params->host_mapped, @@ -693,8 +653,6 @@ static void renderpass_run_pl(struct ra *ra, pl_pass_run(get_gpu(ra), &pl_params); } -#if PL_API_VER >= 60 - struct ra_timer_pl { // Because libpplacebo only supports one operation per timer, we need // to use multiple pl_timers to sum up multiple passes/transfers @@ -766,8 +724,6 @@ static struct pl_timer *get_active_timer(const struct ra *ra) return t->timers[t->idx_timers++]; } -#endif // PL_API_VER >= 60 - static struct ra_fns ra_fns_pl = { .destroy = destroy_ra_pl, .tex_create = tex_create_pl, @@ -786,11 +742,9 @@ static struct ra_fns ra_fns_pl = { .renderpass_create = renderpass_create_pl, .renderpass_destroy = renderpass_destroy_pl, .renderpass_run = renderpass_run_pl, -#if PL_API_VER >= 60 .timer_create = timer_create_pl, .timer_destroy = timer_destroy_pl, .timer_start = timer_start_pl, .timer_stop = timer_stop_pl, -#endif }; diff --git a/video/out/vo_gpu.c b/video/out/vo_gpu.c index 5d28a30054..fe17e344ec 100644 --- a/video/out/vo_gpu.c +++ b/video/out/vo_gpu.c @@ -321,8 +321,12 @@ err_out: #define OPT_BASE_STRUCT struct gpu_priv static const m_option_t options[] = { - {"gpu-context", OPT_STRING_VALIDATE(context_name, ra_ctx_validate_context)}, - {"gpu-api", OPT_STRING_VALIDATE(context_type, ra_ctx_validate_api)}, + {"gpu-context", + OPT_STRING_VALIDATE(context_name, ra_ctx_validate_context), + .help = ra_ctx_context_help}, + {"gpu-api", + OPT_STRING_VALIDATE(context_type, ra_ctx_validate_api), + .help = ra_ctx_api_help}, {"gpu-debug", OPT_FLAG(opts.debug)}, {"gpu-sw", OPT_FLAG(opts.allow_sw)}, {0} diff --git a/video/out/vo_wlshm.c b/video/out/vo_wlshm.c index 8319475f72..a71f9507fc 100644 --- a/video/out/vo_wlshm.c +++ b/video/out/vo_wlshm.c @@ -23,6 +23,7 @@ #include <libswscale/swscale.h> +#include "osdep/endian.h" #include "sub/osd.h" #include "video/fmt-conversion.h" #include "video/mp_image.h" @@ -184,7 +185,7 @@ static int resize(struct vo *vo) vo->dheight = height; vo_get_src_dst_rects(vo, &p->src, &p->dst, &p->osd); p->sws->dst = (struct mp_image_params) { - .imgfmt = IMGFMT_BGR0, + .imgfmt = MP_SELECT_LE_BE(IMGFMT_BGR0, IMGFMT_0RGB), .w = width, .h = height, .p_w = 1, diff --git a/video/out/vulkan/context.c b/video/out/vulkan/context.c index 3518d3efd2..9bdeb14d9b 100644 --- a/video/out/vulkan/context.c +++ b/video/out/vulkan/context.c @@ -31,8 +31,9 @@ struct vulkan_opts { }; static int vk_validate_dev(struct mp_log *log, const struct m_option *opt, - struct bstr name, struct bstr param) + struct bstr name, const char **value) { + struct bstr param = bstr0(*value); int ret = M_OPT_INVALID; VkResult res; diff --git a/video/out/wayland_common.c b/video/out/wayland_common.c index fe9c0b531c..df9321fca2 100644 --- a/video/out/wayland_common.c +++ b/video/out/wayland_common.c @@ -71,7 +71,8 @@ static const struct xdg_wm_base_listener xdg_wm_base_listener = { static int spawn_cursor(struct vo_wayland_state *wl) { - if (wl->allocated_cursor_scale == wl->scaling) /* Reuse if size is identical */ + /* Reuse if size is identical */ + if (!wl->pointer || wl->allocated_cursor_scale == wl->scaling) return 0; else if (wl->cursor_theme) wl_cursor_theme_destroy(wl->cursor_theme); @@ -268,6 +269,7 @@ static void pointer_handle_button(void *data, struct wl_pointer *wl_pointer, mp_input_put_key(wl->vo->input_ctx, button | state | mpmod); if (!mp_input_test_dragging(wl->vo->input_ctx, wl->mouse_x, wl->mouse_y) && + (!wl->vo_opts->fullscreen) && (!wl->vo_opts->window_maximized) && (button == MP_MBTN_LEFT) && (state == MP_KEY_STATE_DOWN)) { uint32_t edges; // Implement an edge resize zone if there are no decorations @@ -603,6 +605,44 @@ static const struct wl_seat_listener seat_listener = { seat_handle_caps, }; +static void greatest_common_divisor(struct vo_wayland_state *wl, int a, int b) { + // euclidean algorithm + int larger; + int smaller; + if (a > b) { + larger = a; + smaller = b; + } else { + larger = b; + smaller = a; + } + int remainder = larger - smaller * floor(larger/smaller); + if (remainder == 0) { + wl->gcd = smaller; + } else { + greatest_common_divisor(wl, smaller, remainder); + } +} + +static void set_geometry(struct vo_wayland_state *wl) +{ + struct vo *vo = wl->vo; + + struct vo_win_geometry geo; + struct mp_rect screenrc = wl->current_output->geometry; + vo_calc_window_geometry(vo, &screenrc, &geo); + vo_apply_window_geometry(vo, &geo); + + greatest_common_divisor(wl, vo->dwidth, vo->dheight); + wl->reduced_width = vo->dwidth / wl->gcd; + wl->reduced_height = vo->dheight / wl->gcd; + + wl->vdparams.x0 = 0; + wl->vdparams.y0 = 0; + wl->vdparams.x1 = vo->dwidth / wl->scaling; + wl->vdparams.y1 = vo->dheight / wl->scaling; +} + static void output_handle_geometry(void *data, struct wl_output *wl_output, int32_t x, int32_t y, int32_t phys_width, int32_t phys_height, int32_t subpixel, @@ -637,6 +677,7 @@ static void output_handle_mode(void *data, struct wl_output *wl_output, static void output_handle_done(void* data, struct wl_output *wl_output) { struct vo_wayland_output *o = data; + struct vo_wayland_state *wl = o->wl; o->geometry.x1 += o->geometry.x0; o->geometry.y1 += o->geometry.y0; @@ -648,8 +689,21 @@ static void output_handle_done(void* data, struct wl_output *wl_output) "\tHz: %f\n", o->make, o->model, o->id, o->geometry.x0, o->geometry.y0, mp_rect_w(o->geometry), o->phys_width, mp_rect_h(o->geometry), o->phys_height, o->scale, o->refresh_rate); + + /* If we satisfy this conditional, something about the current + * output must have changed (resolution, scale, etc). All window + * geometry and scaling should be recalculated. */ + if (wl->current_output && wl->current_output->output == wl_output) { + wl->scaling = wl->current_output->scale; + spawn_cursor(wl); + set_geometry(wl); + wl->window_size = wl->vdparams; + if (!wl->vo_opts->fullscreen && !wl->vo_opts->window_maximized) + wl->geometry = wl->window_size; + wl->pending_vo_events |= VO_EVENT_RESIZE; + } - o->wl->pending_vo_events |= VO_EVENT_WIN_STATE; + wl->pending_vo_events |= VO_EVENT_WIN_STATE; } static void output_handle_scale(void* data, struct wl_output *wl_output, @@ -793,44 +847,6 @@ static const struct wl_data_device_listener data_device_listener = { data_device_handle_selection, }; -static void greatest_common_divisor(struct vo_wayland_state *wl, int a, int b) { - // euclidean algorithm - int larger; - int smaller; - if (a > b) { - larger = a; - smaller = b; - } else { - larger = b; - smaller = a; - } - int remainder = larger - smaller * floor(larger/smaller); - if (remainder == 0) { - wl->gcd = smaller; - } else { - greatest_common_divisor(wl, smaller, remainder); - } -} - -static void set_geometry(struct vo_wayland_state *wl) -{ - struct vo *vo = wl->vo; - - struct vo_win_geometry geo; - struct mp_rect screenrc = wl->current_output->geometry; - vo_calc_window_geometry(vo, &screenrc, &geo); - vo_apply_window_geometry(vo, &geo); - - greatest_common_divisor(wl, vo->dwidth, vo->dheight); - wl->reduced_width = vo->dwidth / wl->gcd; - wl->reduced_height = vo->dheight / wl->gcd; - - wl->vdparams.x0 = 0; - wl->vdparams.y0 = 0; - wl->vdparams.x1 = vo->dwidth / wl->scaling; - wl->vdparams.y1 = vo->dheight / wl->scaling; -} - static void rescale_geometry_dimensions(struct vo_wayland_state *wl, double factor) { wl->vdparams.x1 *= factor; @@ -871,7 +887,9 @@ static void surface_handle_enter(void *data, struct wl_surface *wl_surface, if (wl->scaling != wl->current_output->scale && wl->vo_opts->hidpi_window_scale) { double factor = (double)wl->scaling / wl->current_output->scale; wl->scaling = wl->current_output->scale; + spawn_cursor(wl); rescale_geometry_dimensions(wl, factor); + wl->pending_vo_events |= VO_EVENT_DPI; } if (!wl->vo_opts->fullscreen && !wl->vo_opts->window_maximized) @@ -1569,6 +1587,7 @@ int vo_wayland_reconfig(struct vo *vo) wl->window_size = wl->vdparams; wl->geometry = wl->window_size; wl_display_roundtrip(wl->display); + wl->pending_vo_events |= VO_EVENT_DPI; } wl->pending_vo_events |= VO_EVENT_RESIZE; @@ -1729,6 +1748,12 @@ int vo_wayland_control(struct vo *vo, int *events, int request, void *arg) *(double *)arg = wl->current_output->refresh_rate; return VO_TRUE; } + case VOCTRL_GET_HIDPI_SCALE: { + if (!wl->scaling) + return VO_NOTAVAIL; + *(double *)arg = wl->scaling; + return VO_TRUE; + } case VOCTRL_UPDATE_WINDOW_TITLE: return update_window_title(wl, (const char *)arg); case VOCTRL_SET_CURSOR_VISIBILITY: |