diff options
-rw-r--r-- | video/out/gpu/hwdec.h | 1 | ||||
-rw-r--r-- | video/out/gpu/video.c | 45 | ||||
-rw-r--r-- | video/out/opengl/hwdec_vdpau.c | 171 |
3 files changed, 47 insertions, 170 deletions
diff --git a/video/out/gpu/hwdec.h b/video/out/gpu/hwdec.h index 258ab881b6..3a1ae3e2ff 100644 --- a/video/out/gpu/hwdec.h +++ b/video/out/gpu/hwdec.h @@ -43,7 +43,6 @@ struct ra_hwdec_mapper { // The common code won't mess with these, so you can e.g. set them in the // .init() callback. struct ra_tex *tex[4]; - bool vdpau_fields; }; // This can be used to map frames of a specific hw format as GL textures. diff --git a/video/out/gpu/video.c b/video/out/gpu/video.c index a7369f185c..3ec5cdfcd9 100644 --- a/video/out/gpu/video.c +++ b/video/out/gpu/video.c @@ -216,7 +216,6 @@ struct gl_video { struct ra_tex *error_diffusion_tex[2]; struct ra_tex *screen_tex; struct ra_tex *output_tex; - struct ra_tex *vdpau_deinterleave_tex[2]; struct ra_tex **hook_textures; int num_hook_textures; int idx_hook_textures; @@ -1044,9 +1043,6 @@ static void uninit_video(struct gl_video *p) p->hwdec_active = false; p->hwdec_overlay = NULL; ra_hwdec_mapper_free(&p->hwdec_mapper); - - for (int n = 0; n < 2; n++) - ra_tex_free(p->ra, &p->vdpau_deinterleave_tex[n]); } static void pass_record(struct gl_video *p, struct mp_pass_perf perf) @@ -3502,42 +3498,6 @@ void gl_video_perfdata(struct gl_video *p, struct voctrl_performance_data *out) frame_perf_data(p->pass_redraw, &out->redraw); } -// This assumes nv12, with textures set to GL_NEAREST filtering. -static void reinterleave_vdpau(struct gl_video *p, - struct ra_tex *input[4], struct ra_tex *output[2]) -{ - for (int n = 0; n < 2; n++) { - struct ra_tex **tex = &p->vdpau_deinterleave_tex[n]; - // This is an array of the 2 to-merge planes. - struct ra_tex **src = &input[n * 2]; - int w = src[0]->params.w; - int h = src[0]->params.h; - int ids[2]; - for (int t = 0; t < 2; t++) { - ids[t] = pass_bind(p, (struct image){ - .tex = src[t], - .multiplier = 1.0, - .transform = identity_trans, - .w = w, - .h = h, - }); - } - - pass_describe(p, "vdpau reinterleaving"); - GLSLF("color = fract(gl_FragCoord.y * 0.5) < 0.5\n"); - GLSLF(" ? texture(texture%d, texcoord%d)\n", ids[0], ids[0]); - GLSLF(" : texture(texture%d, texcoord%d);", ids[1], ids[1]); - - int comps = n == 0 ? 1 : 2; - const struct ra_format *fmt = ra_find_unorm_format(p->ra, 1, comps); - ra_tex_resize(p->ra, p->log, tex, w, h * 2, fmt); - struct ra_fbo fbo = { *tex }; - finish_pass_fbo(p, fbo, true, &(struct mp_rect){0, 0, w, h * 2}); - - output[n] = *tex; - } -} - // Returns false on failure. static bool pass_upload_image(struct gl_video *p, struct mp_image *mpi, uint64_t id) { @@ -3574,11 +3534,6 @@ static bool pass_upload_image(struct gl_video *p, struct mp_image *mpi, uint64_t struct mp_image layout = {0}; mp_image_set_params(&layout, &p->image_params); struct ra_tex **tex = p->hwdec_mapper->tex; - struct ra_tex *tmp[4] = {0}; - if (p->hwdec_mapper->vdpau_fields) { - reinterleave_vdpau(p, tex, tmp); - tex = tmp; - } for (int n = 0; n < p->plane_count; n++) { vimg->planes[n] = (struct texplane){ .w = mp_image_plane_w(&layout, n), diff --git a/video/out/opengl/hwdec_vdpau.c b/video/out/opengl/hwdec_vdpau.c index ce0d32b3a9..df58905f4d 100644 --- a/video/out/opengl/hwdec_vdpau.c +++ b/video/out/opengl/hwdec_vdpau.c @@ -35,13 +35,12 @@ struct priv { struct mp_vdpau_ctx *ctx; GL *gl; uint64_t preemption_counter; - GLuint gl_textures[4]; + GLuint gl_texture; bool vdpgl_initialized; GLvdpauSurfaceNV vdpgl_surface; VdpOutputSurface vdp_surface; struct mp_vdpau_mixer *mixer; struct ra_imgfmt_desc direct_desc; - bool direct_mode; bool mapped; }; @@ -85,10 +84,6 @@ static void mapper_unmap(struct ra_hwdec_mapper *mapper) if (p->mapped) { gl->VDPAUUnmapSurfacesNV(1, &p->vdpgl_surface); - if (p->direct_mode) { - gl->VDPAUUnregisterSurfaceNV(p->vdpgl_surface); - p->vdpgl_surface = 0; - } } p->mapped = false; } @@ -114,7 +109,7 @@ static void mapper_uninit(struct ra_hwdec_mapper *mapper) gl->VDPAUUnregisterSurfaceNV(p->vdpgl_surface); p->vdpgl_surface = 0; - gl->DeleteTextures(4, p->gl_textures); + gl->DeleteTextures(1, &p->gl_texture); if (p->vdp_surface != VDP_INVALID_HANDLE) { vdp_st = vdp->output_surface_destroy(p->vdp_surface); @@ -160,58 +155,32 @@ static int mapper_init(struct ra_hwdec_mapper *mapper) p->vdpgl_initialized = true; - p->direct_mode = mapper->dst_params.hw_subfmt == IMGFMT_NV12 || - mapper->dst_params.hw_subfmt == IMGFMT_NV24 || - mapper->dst_params.hw_subfmt == IMGFMT_420P || - mapper->dst_params.hw_subfmt == IMGFMT_444P; - mapper->vdpau_fields = p->direct_mode; - - gl->GenTextures(4, p->gl_textures); - - if (p->direct_mode) { - int imgfmt = mapper->dst_params.hw_subfmt; - if (!ra_get_imgfmt_desc(mapper->ra, imgfmt, &p->direct_desc)) { - MP_ERR(mapper, "Unsupported format: %s\n", mp_imgfmt_to_name(imgfmt)); - return -1; - } - mapper->dst_params.imgfmt = p->direct_desc.chroma_w == 1 ? - IMGFMT_NV24 : IMGFMT_NV12; - mapper->dst_params.hw_subfmt = 0; - - for (int n = 0; n < 4; n++) { - gl->BindTexture(GL_TEXTURE_2D, p->gl_textures[n]); - gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - gl->BindTexture(GL_TEXTURE_2D, 0); - } - } else { - gl->BindTexture(GL_TEXTURE_2D, p->gl_textures[0]); - gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - gl->BindTexture(GL_TEXTURE_2D, 0); - - vdp_st = vdp->output_surface_create(p->ctx->vdp_device, - VDP_RGBA_FORMAT_B8G8R8A8, - mapper->src_params.w, - mapper->src_params.h, - &p->vdp_surface); - CHECK_VDP_ERROR(mapper, "Error when calling vdp_output_surface_create"); - - p->vdpgl_surface = gl->VDPAURegisterOutputSurfaceNV(BRAINDEATH(p->vdp_surface), - GL_TEXTURE_2D, - 1, p->gl_textures); - if (!p->vdpgl_surface) - return -1; + gl->GenTextures(1, &p->gl_texture); + + gl->BindTexture(GL_TEXTURE_2D, p->gl_texture); + gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + gl->BindTexture(GL_TEXTURE_2D, 0); + + vdp_st = vdp->output_surface_create(p->ctx->vdp_device, + VDP_RGBA_FORMAT_B8G8R8A8, + mapper->src_params.w, + mapper->src_params.h, + &p->vdp_surface); + CHECK_VDP_ERROR(mapper, "Error when calling vdp_output_surface_create"); + + p->vdpgl_surface = gl->VDPAURegisterOutputSurfaceNV(BRAINDEATH(p->vdp_surface), + GL_TEXTURE_2D, + 1, &p->gl_texture); + if (!p->vdpgl_surface) + return -1; - gl->VDPAUSurfaceAccessNV(p->vdpgl_surface, GL_READ_ONLY); + gl->VDPAUSurfaceAccessNV(p->vdpgl_surface, GL_READ_ONLY); - mapper->dst_params.imgfmt = IMGFMT_RGB0; - mapper->dst_params.hw_subfmt = 0; - } + mapper->dst_params.imgfmt = IMGFMT_RGB0; + mapper->dst_params.hw_subfmt = 0; gl_check_error(gl, mapper->log, "After initializing vdpau OpenGL interop"); @@ -222,8 +191,6 @@ static int mapper_map(struct ra_hwdec_mapper *mapper) { struct priv *p = mapper->priv; GL *gl = p->gl; - struct vdp_functions *vdp = &p->ctx->vdp; - VdpStatus vdp_st; int pe = mp_vdpau_handle_preemption(p->ctx, &p->preemption_counter); if (pe < 1) { @@ -235,77 +202,33 @@ static int mapper_map(struct ra_hwdec_mapper *mapper) return -1; } - if (p->direct_mode) { - VdpVideoSurface surface = (intptr_t)mapper->src->planes[3]; - - // We need the uncropped size. - VdpChromaType s_chroma_type; - uint32_t s_w, s_h; - vdp_st = vdp->video_surface_get_parameters(surface, &s_chroma_type, &s_w, &s_h); - CHECK_VDP_ERROR(mapper, "Error when calling vdp_video_surface_get_parameters"); - - p->vdpgl_surface = gl->VDPAURegisterVideoSurfaceNV(BRAINDEATH(surface), - GL_TEXTURE_2D, - 4, p->gl_textures); - if (!p->vdpgl_surface) - return -1; - - gl->VDPAUSurfaceAccessNV(p->vdpgl_surface, GL_READ_ONLY); - gl->VDPAUMapSurfacesNV(1, &p->vdpgl_surface); - - p->mapped = true; - - for (int n = 0; n < 4; n++) { - bool chroma = n >= 2; - int w_scale = chroma ? p->direct_desc.chroma_w : 1; - int h_scale = chroma ? p->direct_desc.chroma_h * 2 : 2; - - struct ra_tex_params params = { - .dimensions = 2, - .w = s_w / w_scale, - .h = s_h / h_scale, - .d = 1, - .format = ra_find_unorm_format(mapper->ra, 1, chroma ? 2 : 1), - .render_src = true, - }; - - if (!params.format) - return -1; - - mapper->tex[n] = - ra_create_wrapped_tex(mapper->ra, ¶ms, p->gl_textures[n]); - if (!mapper->tex[n]) - return -1; - } - } else { - if (!p->vdpgl_surface) - return -1; + if (!p->vdpgl_surface) + return -1; - mp_vdpau_mixer_render(p->mixer, NULL, p->vdp_surface, NULL, mapper->src, - NULL); + mp_vdpau_mixer_render(p->mixer, NULL, p->vdp_surface, NULL, mapper->src, + NULL); - gl->VDPAUMapSurfacesNV(1, &p->vdpgl_surface); + gl->VDPAUMapSurfacesNV(1, &p->vdpgl_surface); - p->mapped = true; + p->mapped = true; - struct ra_tex_params params = { - .dimensions = 2, - .w = mapper->src_params.w, - .h = mapper->src_params.h, - .d = 1, - .format = ra_find_unorm_format(mapper->ra, 1, 4), - .render_src = true, - .src_linear = true, - }; + struct ra_tex_params params = { + .dimensions = 2, + .w = mapper->src_params.w, + .h = mapper->src_params.h, + .d = 1, + .format = ra_find_unorm_format(mapper->ra, 1, 4), + .render_src = true, + .src_linear = true, + }; - if (!params.format) - return -1; + if (!params.format) + return -1; - mapper->tex[0] = - ra_create_wrapped_tex(mapper->ra, ¶ms, p->gl_textures[0]); - if (!mapper->tex[0]) - return -1; - } + mapper->tex[0] = + ra_create_wrapped_tex(mapper->ra, ¶ms, p->gl_texture); + if (!mapper->tex[0]) + return -1; return 0; } |