From 7d49a6f23c4d5db29705e5463a258cdcecb50b90 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Thu, 6 May 2021 21:35:50 -0400 Subject: [PATCH] nouveau: improve video limit reporting This corrects max width/height/macroblocks reporting, in line with what the nvidia driver docs suggest is supported. Signed-off-by: Ilia Mirkin Part-of: --- .../drivers/nouveau/nouveau_vp3_video.c | 65 +++++++++++++++++-- src/gallium/drivers/nouveau/nv50/nv84_video.c | 2 + 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/nouveau/nouveau_vp3_video.c b/src/gallium/drivers/nouveau/nouveau_vp3_video.c index b28d31e0079..3b59fd0a513 100644 --- a/src/gallium/drivers/nouveau/nouveau_vp3_video.c +++ b/src/gallium/drivers/nouveau/nouveau_vp3_video.c @@ -436,9 +436,10 @@ nouveau_vp3_screen_get_video_param(struct pipe_screen *pscreen, enum pipe_video_entrypoint entrypoint, enum pipe_video_cap param) { - int chipset = nouveau_screen(pscreen)->device->chipset; - int vp3 = chipset < 0xa3 || chipset == 0xaa || chipset == 0xac; - int vp5 = chipset >= 0xd0; + const int chipset = nouveau_screen(pscreen)->device->chipset; + /* Feature Set B = vp3, C = vp4, D = vp5 */ + const bool vp3 = chipset < 0xa3 || chipset == 0xaa || chipset == 0xac; + const bool vp5 = chipset >= 0xd0; enum pipe_video_format codec = u_reduce_video_profile(profile); switch (param) { case PIPE_VIDEO_CAP_SUPPORTED: @@ -451,8 +452,45 @@ nouveau_vp3_screen_get_video_param(struct pipe_screen *pscreen, case PIPE_VIDEO_CAP_NPOT_TEXTURES: return 1; case PIPE_VIDEO_CAP_MAX_WIDTH: + switch (codec) { + case PIPE_VIDEO_FORMAT_MPEG12: + return vp5 ? 4032 : 2048; + case PIPE_VIDEO_FORMAT_MPEG4: + return 2048; + case PIPE_VIDEO_FORMAT_VC1: + return 2048; + case PIPE_VIDEO_FORMAT_MPEG4_AVC: + if (vp3) + return 2032; + if (vp5) + return 4032; + return 2048; /* vp4 */ + case PIPE_VIDEO_FORMAT_UNKNOWN: + return vp5 ? 4032 : 2048; + default: + debug_printf("unknown video codec: %d\n", codec); + return 0; + } case PIPE_VIDEO_CAP_MAX_HEIGHT: - return vp5 ? 4096 : 2048; + switch (codec) { + case PIPE_VIDEO_FORMAT_MPEG12: + return vp5 ? 4048 : 2048; + case PIPE_VIDEO_FORMAT_MPEG4: + return 2048; + case PIPE_VIDEO_FORMAT_VC1: + return 2048; + case PIPE_VIDEO_FORMAT_MPEG4_AVC: + if (vp3) + return 2048; + if (vp5) + return 4080; + return 2048; /* vp4 */ + case PIPE_VIDEO_FORMAT_UNKNOWN: + return vp5 ? 4080 : 2048; + default: + debug_printf("unknown video codec: %d\n", codec); + return 0; + } case PIPE_VIDEO_CAP_PREFERED_FORMAT: return PIPE_FORMAT_NV12; case PIPE_VIDEO_CAP_SUPPORTS_INTERLACED: @@ -478,6 +516,7 @@ nouveau_vp3_screen_get_video_param(struct pipe_screen *pscreen, case PIPE_VIDEO_PROFILE_VC1_ADVANCED: return 4; case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE: case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN: case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH: return 41; @@ -485,6 +524,24 @@ nouveau_vp3_screen_get_video_param(struct pipe_screen *pscreen, debug_printf("unknown video profile: %d\n", profile); return 0; } + case PIPE_VIDEO_CAP_MAX_MACROBLOCKS: + switch (codec) { + case PIPE_VIDEO_FORMAT_MPEG12: + return vp5 ? 65536 : 8192; + case PIPE_VIDEO_FORMAT_MPEG4: + return 8192; + case PIPE_VIDEO_FORMAT_VC1: + return 8190; + case PIPE_VIDEO_FORMAT_MPEG4_AVC: + if (vp3) + return 8190; + if (vp5) + return 65536; + return 8192; /* vp4 */ + default: + debug_printf("unknown video codec: %d\n", codec); + return 0; + } default: debug_printf("unknown video param: %d\n", param); return 0; diff --git a/src/gallium/drivers/nouveau/nv50/nv84_video.c b/src/gallium/drivers/nouveau/nv50/nv84_video.c index 3d276f91149..dd73cd76e5e 100644 --- a/src/gallium/drivers/nouveau/nv50/nv84_video.c +++ b/src/gallium/drivers/nouveau/nv50/nv84_video.c @@ -838,6 +838,8 @@ nv84_screen_get_video_param(struct pipe_screen *pscreen, debug_printf("unknown video profile: %d\n", profile); return 0; } + case PIPE_VIDEO_CAP_MAX_MACROBLOCKS: + return 8192; /* vc-1 actually has 8190, but this is not supported */ default: debug_printf("unknown video param: %d\n", param); return 0;