diff options
Diffstat (limited to 'video/out/placebo')
-rw-r--r-- | video/out/placebo/ra_pl.c | 85 | ||||
-rw-r--r-- | video/out/placebo/utils.c | 114 | ||||
-rw-r--r-- | video/out/placebo/utils.h | 13 |
3 files changed, 25 insertions, 187 deletions
diff --git a/video/out/placebo/ra_pl.c b/video/out/placebo/ra_pl.c index d2590d35d3..14c9444fd3 100644 --- a/video/out/placebo/ra_pl.c +++ b/video/out/placebo/ra_pl.c @@ -45,13 +45,10 @@ struct ra *ra_create_pl(pl_gpu gpu, struct mp_log *log) ra->caps |= RA_CAP_COMPUTE | RA_CAP_NUM_GROUPS; if (gpu->limits.compute_queues > gpu->limits.fragment_queues) ra->caps |= RA_CAP_PARALLEL_COMPUTE; -#if PL_API_VER >= 180 if (gpu->limits.max_variable_comps) ra->caps |= RA_CAP_GLOBAL_UNIFORM; -#else - if (gpu->limits.max_variables) - ra->caps |= RA_CAP_GLOBAL_UNIFORM; -#endif + if (!gpu->limits.host_cached) + ra->caps |= RA_CAP_SLOW_DR; if (gpu->limits.max_tex_1d_dim) ra->caps |= RA_CAP_TEX_1D; @@ -220,36 +217,7 @@ static bool tex_upload_pl(struct ra *ra, const struct ra_tex_upload_params *para }; } -#if PL_API_VER >= 168 pl_params.row_pitch = params->stride; -#else - // Older libplacebo uses texel-sized strides, so we have to manually - // compensate for possibly misaligned sources (typically rgb24). - size_t texel_size = tex->params.format->texel_size; - pl_params.stride_w = params->stride / texel_size; - size_t stride = pl_params.stride_w * texel_size; - - if (stride != params->stride) { - // Fall back to uploading via a staging buffer prepared in CPU - int lines = params->rc ? pl_rect_h(pl_params.rc) : tex->params.h; - staging = pl_buf_create(gpu, &(struct pl_buf_params) { - .size = lines * stride, - .memory_type = PL_BUF_MEM_HOST, - .host_mapped = true, - }); - if (!staging) - return false; - - const uint8_t *src = params->buf ? params->buf->data : params->src; - assert(src); - for (int y = 0; y < lines; y++) - memcpy(staging->data + y * stride, src + y * params->stride, stride); - - pl_params.ptr = NULL; - pl_params.buf = staging; - pl_params.buf_offset = 0; - } -#endif } bool ok = pl_tex_upload(gpu, &pl_params); @@ -264,33 +232,10 @@ static bool tex_download_pl(struct ra *ra, struct ra_tex_download_params *params .tex = tex, .ptr = params->dst, .timer = get_active_timer(ra), + .row_pitch = params->stride, }; -#if PL_API_VER >= 168 - pl_params.row_pitch = params->stride; return pl_tex_download(get_gpu(ra), &pl_params); -#else - size_t texel_size = tex->params.format->texel_size; - pl_params.stride_w = params->stride / texel_size; - size_t stride = pl_params.stride_w * texel_size; - uint8_t *staging = NULL; - if (stride != params->stride) { - staging = talloc_size(NULL, tex->params.h * stride); - pl_params.ptr = staging; - } - - bool ok = pl_tex_download(get_gpu(ra), &pl_params); - if (ok && staging) { - for (int y = 0; y < tex->params.h; y++) { - memcpy((uint8_t *) params->dst + y * params->stride, - staging + y * stride, - stride); - } - } - - talloc_free(staging); - return ok; -#endif } static struct ra_buf *buf_create_pl(struct ra *ra, @@ -505,8 +450,6 @@ static struct ra_renderpass *renderpass_create_pl(struct ra *ra, .glsl_shader = params->type == RA_RENDERPASS_TYPE_COMPUTE ? params->compute_shader : params->frag_shader, - .cached_program = params->cached_program.start, - .cached_program_len = params->cached_program.len, }; struct pl_blend_params blend_params; @@ -516,21 +459,16 @@ static struct ra_renderpass *renderpass_create_pl(struct ra *ra, pl_params.vertex_type = PL_PRIM_TRIANGLE_LIST; pl_params.vertex_stride = params->vertex_stride; pl_params.load_target = !params->invalidate_target; - -#if PL_API_VER >= 169 pl_params.target_format = params->target_format->priv; -#else - pl_params.target_dummy.params.format = params->target_format->priv; -#endif if (params->enable_blend) { pl_params.blend_params = &blend_params; blend_params = (struct pl_blend_params) { // Same enum order as ra_blend - .src_rgb = (enum ra_blend) params->blend_src_rgb, - .dst_rgb = (enum ra_blend) params->blend_dst_rgb, - .src_alpha = (enum ra_blend) params->blend_src_alpha, - .dst_alpha = (enum ra_blend) params->blend_dst_alpha, + .src_rgb = (enum pl_blend_mode) params->blend_src_rgb, + .dst_rgb = (enum pl_blend_mode) params->blend_dst_rgb, + .src_alpha = (enum pl_blend_mode) params->blend_src_alpha, + .dst_alpha = (enum pl_blend_mode) params->blend_dst_alpha, }; } @@ -565,11 +503,6 @@ static struct ra_renderpass *renderpass_create_pl(struct ra *ra, .priv = talloc_steal(pass, priv), }; - pass->params.cached_program = (struct bstr) { - .start = (void *) priv->pass->params.cached_program, - .len = priv->pass->params.cached_program_len, - }; - // fall through error: talloc_free(tmp); @@ -601,7 +534,7 @@ static void renderpass_run_pl(struct ra *ra, .data = val->data, }); } else { - struct pl_desc_binding bind; + struct pl_desc_binding bind = {0}; switch (inp->type) { case RA_VARTYPE_TEX: case RA_VARTYPE_IMG_W: { @@ -617,7 +550,7 @@ static void renderpass_run_pl(struct ra *ra, case RA_VARTYPE_BUF_RW: bind.object = (* (struct ra_buf **) val->data)->priv; break; - default: abort(); + default: MP_ASSERT_UNREACHABLE(); }; p->binds[p->inp_index[val->index]] = bind; diff --git a/video/out/placebo/utils.c b/video/out/placebo/utils.c index a3d852fb14..dae9b14761 100644 --- a/video/out/placebo/utils.c +++ b/video/out/placebo/utils.c @@ -1,6 +1,8 @@ #include "common/common.h" #include "utils.h" +#include <libplacebo/utils/dolbyvision.h> + static const int pl_log_to_msg_lev[PL_LOG_ALL+1] = { [PL_LOG_FATAL] = MSGL_FATAL, [PL_LOG_ERR] = MSGL_ERR, @@ -23,7 +25,7 @@ static const enum pl_log_level msg_lev_to_pl_log[MSGL_MAX+1] = { }; // translates log levels while probing -static const enum pl_log_level probing_map(enum pl_log_level level) +static enum pl_log_level probing_map(enum pl_log_level level) { switch (level) { case PL_LOG_FATAL: @@ -42,6 +44,12 @@ static void log_cb(void *priv, enum pl_log_level level, const char *msg) mp_msg(log, pl_log_to_msg_lev[level], "%s\n", msg); } +static int determine_pl_log_level(struct mp_log *log) +{ + int log_level = mp_msg_level(log); + return log_level == -1 ? PL_LOG_NONE : msg_lev_to_pl_log[log_level]; +} + static void log_cb_probing(void *priv, enum pl_log_level level, const char *msg) { struct mp_log *log = priv; @@ -52,7 +60,7 @@ pl_log mppl_log_create(void *tactx, struct mp_log *log) { return pl_log_create(PL_API_VER, &(struct pl_log_params) { .log_cb = log_cb, - .log_level = msg_lev_to_pl_log[mp_msg_level(log)], + .log_level = determine_pl_log_level(log), .log_priv = mp_log_new(tactx, log, "libplacebo"), }); } @@ -63,105 +71,3 @@ void mppl_log_set_probing(pl_log log, bool probing) params.log_cb = probing ? log_cb_probing : log_cb; pl_log_update(log, ¶ms); } - -enum pl_color_primaries mp_prim_to_pl(enum mp_csp_prim prim) -{ - switch (prim) { - case MP_CSP_PRIM_AUTO: return PL_COLOR_PRIM_UNKNOWN; - case MP_CSP_PRIM_BT_601_525: return PL_COLOR_PRIM_BT_601_525; - case MP_CSP_PRIM_BT_601_625: return PL_COLOR_PRIM_BT_601_625; - case MP_CSP_PRIM_BT_709: return PL_COLOR_PRIM_BT_709; - case MP_CSP_PRIM_BT_2020: return PL_COLOR_PRIM_BT_2020; - case MP_CSP_PRIM_BT_470M: return PL_COLOR_PRIM_BT_470M; - case MP_CSP_PRIM_APPLE: return PL_COLOR_PRIM_APPLE; - case MP_CSP_PRIM_ADOBE: return PL_COLOR_PRIM_ADOBE; - case MP_CSP_PRIM_PRO_PHOTO: return PL_COLOR_PRIM_PRO_PHOTO; - case MP_CSP_PRIM_CIE_1931: return PL_COLOR_PRIM_CIE_1931; - case MP_CSP_PRIM_DCI_P3: return PL_COLOR_PRIM_DCI_P3; - case MP_CSP_PRIM_DISPLAY_P3: return PL_COLOR_PRIM_DISPLAY_P3; - case MP_CSP_PRIM_V_GAMUT: return PL_COLOR_PRIM_V_GAMUT; - case MP_CSP_PRIM_S_GAMUT: return PL_COLOR_PRIM_S_GAMUT; - case MP_CSP_PRIM_COUNT: return PL_COLOR_PRIM_COUNT; - } - - MP_ASSERT_UNREACHABLE(); -} - -enum pl_color_transfer mp_trc_to_pl(enum mp_csp_trc trc) -{ - switch (trc) { - case MP_CSP_TRC_AUTO: return PL_COLOR_TRC_UNKNOWN; - case MP_CSP_TRC_BT_1886: return PL_COLOR_TRC_BT_1886; - case MP_CSP_TRC_SRGB: return PL_COLOR_TRC_SRGB; - case MP_CSP_TRC_LINEAR: return PL_COLOR_TRC_LINEAR; - case MP_CSP_TRC_GAMMA18: return PL_COLOR_TRC_GAMMA18; - case MP_CSP_TRC_GAMMA20: return PL_COLOR_TRC_GAMMA20; - case MP_CSP_TRC_GAMMA22: return PL_COLOR_TRC_GAMMA22; - case MP_CSP_TRC_GAMMA24: return PL_COLOR_TRC_GAMMA24; - case MP_CSP_TRC_GAMMA26: return PL_COLOR_TRC_GAMMA26; - case MP_CSP_TRC_GAMMA28: return PL_COLOR_TRC_GAMMA28; - case MP_CSP_TRC_PRO_PHOTO: return PL_COLOR_TRC_PRO_PHOTO; - case MP_CSP_TRC_PQ: return PL_COLOR_TRC_PQ; - case MP_CSP_TRC_HLG: return PL_COLOR_TRC_HLG; - case MP_CSP_TRC_V_LOG: return PL_COLOR_TRC_V_LOG; - case MP_CSP_TRC_S_LOG1: return PL_COLOR_TRC_S_LOG1; - case MP_CSP_TRC_S_LOG2: return PL_COLOR_TRC_S_LOG2; - case MP_CSP_TRC_COUNT: return PL_COLOR_TRC_COUNT; - } - - MP_ASSERT_UNREACHABLE(); -} - -enum pl_color_system mp_csp_to_pl(enum mp_csp csp) -{ - switch (csp) { - case MP_CSP_AUTO: return PL_COLOR_SYSTEM_UNKNOWN; - case MP_CSP_BT_601: return PL_COLOR_SYSTEM_BT_601; - case MP_CSP_BT_709: return PL_COLOR_SYSTEM_BT_709; - case MP_CSP_SMPTE_240M: return PL_COLOR_SYSTEM_SMPTE_240M; - case MP_CSP_BT_2020_NC: return PL_COLOR_SYSTEM_BT_2020_NC; - case MP_CSP_BT_2020_C: return PL_COLOR_SYSTEM_BT_2020_C; - case MP_CSP_RGB: return PL_COLOR_SYSTEM_RGB; - case MP_CSP_XYZ: return PL_COLOR_SYSTEM_XYZ; - case MP_CSP_YCGCO: return PL_COLOR_SYSTEM_YCGCO; - case MP_CSP_COUNT: return PL_COLOR_SYSTEM_COUNT; - } - - MP_ASSERT_UNREACHABLE(); -} - -enum pl_color_levels mp_levels_to_pl(enum mp_csp_levels levels) -{ - switch (levels) { - case MP_CSP_LEVELS_AUTO: return PL_COLOR_LEVELS_UNKNOWN; - case MP_CSP_LEVELS_TV: return PL_COLOR_LEVELS_TV; - case MP_CSP_LEVELS_PC: return PL_COLOR_LEVELS_PC; - case MP_CSP_LEVELS_COUNT: return PL_COLOR_LEVELS_COUNT; - } - - MP_ASSERT_UNREACHABLE(); -} - -enum pl_alpha_mode mp_alpha_to_pl(enum mp_alpha_type alpha) -{ - switch (alpha) { - case MP_ALPHA_AUTO: return PL_ALPHA_UNKNOWN; - case MP_ALPHA_STRAIGHT: return PL_ALPHA_INDEPENDENT; - case MP_ALPHA_PREMUL: return PL_ALPHA_PREMULTIPLIED; - } - - MP_ASSERT_UNREACHABLE(); -} - -enum pl_chroma_location mp_chroma_to_pl(enum mp_chroma_location chroma) -{ - switch (chroma) { - case MP_CHROMA_AUTO: return PL_CHROMA_UNKNOWN; - case MP_CHROMA_TOPLEFT: return PL_CHROMA_TOP_LEFT; - case MP_CHROMA_LEFT: return PL_CHROMA_LEFT; - case MP_CHROMA_CENTER: return PL_CHROMA_CENTER; - case MP_CHROMA_COUNT: return PL_CHROMA_COUNT; - } - - MP_ASSERT_UNREACHABLE(); -} diff --git a/video/out/placebo/utils.h b/video/out/placebo/utils.h index ca0f065a8c..3f61d8b504 100644 --- a/video/out/placebo/utils.h +++ b/video/out/placebo/utils.h @@ -1,12 +1,18 @@ #pragma once +#include "config.h" #include "common/common.h" #include "common/msg.h" #include "video/csputils.h" +#include "video/mp_image.h" + +#include <libavutil/buffer.h> #include <libplacebo/common.h> #include <libplacebo/log.h> #include <libplacebo/colorspace.h> +#include <libplacebo/renderer.h> +#include <libplacebo/utils/libav.h> pl_log mppl_log_create(void *tactx, struct mp_log *log); void mppl_log_set_probing(pl_log log, bool probing); @@ -20,10 +26,3 @@ static inline struct pl_rect2d mp_rect2d_to_pl(struct mp_rect rc) .y1 = rc.y1, }; } - -enum pl_color_primaries mp_prim_to_pl(enum mp_csp_prim prim); -enum pl_color_transfer mp_trc_to_pl(enum mp_csp_trc trc); -enum pl_color_system mp_csp_to_pl(enum mp_csp csp); -enum pl_color_levels mp_levels_to_pl(enum mp_csp_levels levels); -enum pl_alpha_mode mp_alpha_to_pl(enum mp_alpha_type alpha); -enum pl_chroma_location mp_chroma_to_pl(enum mp_chroma_location chroma); |