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 <imirkin@alum.mit.edu> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10677>
This commit is contained in:
parent
d50e43c8a1
commit
7d49a6f23c
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue