Mesa (master): radeonsi: replace the hard coded video decode and encode caps

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Apr 12 18:08:23 UTC 2021


Module: Mesa
Branch: master
Commit: 544044b29ee3b6bf9ba6939b2cb922bd0749c7b2
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=544044b29ee3b6bf9ba6939b2cb922bd0749c7b2

Author: Leo Liu <leo.liu at amd.com>
Date:   Tue Jan 19 19:01:00 2021 -0500

radeonsi: replace the hard coded video decode and encode caps

For the caps of max_width, max_height and max_level with those
that are available via querying the kernel.

Signed-off-by: Leo Liu <leo.liu at amd.com>
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10095>

---

 src/gallium/drivers/radeonsi/si_get.c | 114 ++++++++++++++++++++--------------
 1 file changed, 69 insertions(+), 45 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_get.c b/src/gallium/drivers/radeonsi/si_get.c
index 6bc873d9578..ed82f388eae 100644
--- a/src/gallium/drivers/radeonsi/si_get.c
+++ b/src/gallium/drivers/radeonsi/si_get.c
@@ -517,9 +517,17 @@ static int si_get_video_param(struct pipe_screen *screen, enum pipe_video_profil
       case PIPE_VIDEO_CAP_NPOT_TEXTURES:
          return 1;
       case PIPE_VIDEO_CAP_MAX_WIDTH:
-         return (sscreen->info.family < CHIP_TONGA) ? 2048 : 4096;
+         if (codec != PIPE_VIDEO_FORMAT_UNKNOWN &&
+               sscreen->info.enc_caps.codec_info[codec - 1].valid)
+            return sscreen->info.enc_caps.codec_info[codec - 1].max_width;
+         else
+            return (sscreen->info.family < CHIP_TONGA) ? 2048 : 4096;
       case PIPE_VIDEO_CAP_MAX_HEIGHT:
-         return (sscreen->info.family < CHIP_TONGA) ? 1152 : 2304;
+         if (codec != PIPE_VIDEO_FORMAT_UNKNOWN &&
+               sscreen->info.enc_caps.codec_info[codec - 1].valid)
+            return sscreen->info.enc_caps.codec_info[codec - 1].max_height;
+         else
+            return (sscreen->info.family < CHIP_TONGA) ? 1152 : 2304;
       case PIPE_VIDEO_CAP_PREFERED_FORMAT:
          return PIPE_FORMAT_NV12;
       case PIPE_VIDEO_CAP_PREFERS_INTERLACED:
@@ -583,26 +591,34 @@ static int si_get_video_param(struct pipe_screen *screen, enum pipe_video_profil
    case PIPE_VIDEO_CAP_NPOT_TEXTURES:
       return 1;
    case PIPE_VIDEO_CAP_MAX_WIDTH:
-      switch (codec) {
-      case PIPE_VIDEO_FORMAT_HEVC:
-      case PIPE_VIDEO_FORMAT_VP9:
-      case PIPE_VIDEO_FORMAT_AV1:
-         return (sscreen->info.family < CHIP_RENOIR)
-                   ? ((sscreen->info.family < CHIP_TONGA) ? 2048 : 4096)
-                   : 8192;
-      default:
-         return (sscreen->info.family < CHIP_TONGA) ? 2048 : 4096;
+      if (codec != PIPE_VIDEO_FORMAT_UNKNOWN &&
+            sscreen->info.dec_caps.codec_info[codec - 1].valid) {
+         return sscreen->info.dec_caps.codec_info[codec - 1].max_width;
+      } else {
+         switch (codec) {
+         case PIPE_VIDEO_FORMAT_HEVC:
+         case PIPE_VIDEO_FORMAT_VP9:
+         case PIPE_VIDEO_FORMAT_AV1:
+            return (sscreen->info.family < CHIP_RENOIR) ?
+               ((sscreen->info.family < CHIP_TONGA) ? 2048 : 4096) : 8192;
+         default:
+            return (sscreen->info.family < CHIP_TONGA) ? 2048 : 4096;
+         }
       }
    case PIPE_VIDEO_CAP_MAX_HEIGHT:
-      switch (codec) {
-      case PIPE_VIDEO_FORMAT_HEVC:
-      case PIPE_VIDEO_FORMAT_VP9:
-      case PIPE_VIDEO_FORMAT_AV1:
-         return (sscreen->info.family < CHIP_RENOIR)
-                   ? ((sscreen->info.family < CHIP_TONGA) ? 1152 : 4096)
-                   : 4352;
-      default:
-         return (sscreen->info.family < CHIP_TONGA) ? 1152 : 4096;
+      if (codec != PIPE_VIDEO_FORMAT_UNKNOWN &&
+            sscreen->info.dec_caps.codec_info[codec - 1].valid) {
+         return sscreen->info.dec_caps.codec_info[codec - 1].max_height;
+      } else {
+         switch (codec) {
+         case PIPE_VIDEO_FORMAT_HEVC:
+         case PIPE_VIDEO_FORMAT_VP9:
+         case PIPE_VIDEO_FORMAT_AV1:
+            return (sscreen->info.family < CHIP_RENOIR) ?
+               ((sscreen->info.family < CHIP_TONGA) ? 1152 : 4096) : 4352;
+         default:
+            return (sscreen->info.family < CHIP_TONGA) ? 1152 : 4096;
+         }
       }
    case PIPE_VIDEO_CAP_PREFERED_FORMAT:
       if (profile == PIPE_VIDEO_PROFILE_HEVC_MAIN_10)
@@ -623,31 +639,39 @@ static int si_get_video_param(struct pipe_screen *screen, enum pipe_video_profil
    case PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE:
       return true;
    case PIPE_VIDEO_CAP_MAX_LEVEL:
-      switch (profile) {
-      case PIPE_VIDEO_PROFILE_MPEG1:
-         return 0;
-      case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE:
-      case PIPE_VIDEO_PROFILE_MPEG2_MAIN:
-         return 3;
-      case PIPE_VIDEO_PROFILE_MPEG4_SIMPLE:
-         return 3;
-      case PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE:
-         return 5;
-      case PIPE_VIDEO_PROFILE_VC1_SIMPLE:
-         return 1;
-      case PIPE_VIDEO_PROFILE_VC1_MAIN:
-         return 2;
-      case PIPE_VIDEO_PROFILE_VC1_ADVANCED:
-         return 4;
-      case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE:
-      case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN:
-      case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
-         return (sscreen->info.family < CHIP_TONGA) ? 41 : 52;
-      case PIPE_VIDEO_PROFILE_HEVC_MAIN:
-      case PIPE_VIDEO_PROFILE_HEVC_MAIN_10:
-         return 186;
-      default:
-         return 0;
+      if ((profile == PIPE_VIDEO_PROFILE_MPEG2_SIMPLE ||
+           profile == PIPE_VIDEO_PROFILE_MPEG2_MAIN ||
+           profile == PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE ||
+           profile == PIPE_VIDEO_PROFILE_VC1_ADVANCED) &&
+          sscreen->info.dec_caps.codec_info[codec - 1].valid) {
+         return sscreen->info.dec_caps.codec_info[codec - 1].max_level;
+      } else {
+         switch (profile) {
+         case PIPE_VIDEO_PROFILE_MPEG1:
+            return 0;
+         case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE:
+         case PIPE_VIDEO_PROFILE_MPEG2_MAIN:
+            return 3;
+         case PIPE_VIDEO_PROFILE_MPEG4_SIMPLE:
+            return 3;
+         case PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE:
+            return 5;
+         case PIPE_VIDEO_PROFILE_VC1_SIMPLE:
+            return 1;
+         case PIPE_VIDEO_PROFILE_VC1_MAIN:
+            return 2;
+         case PIPE_VIDEO_PROFILE_VC1_ADVANCED:
+            return 4;
+         case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE:
+         case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN:
+         case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
+            return (sscreen->info.family < CHIP_TONGA) ? 41 : 52;
+         case PIPE_VIDEO_PROFILE_HEVC_MAIN:
+         case PIPE_VIDEO_PROFILE_HEVC_MAIN_10:
+            return 186;
+         default:
+            return 0;
+         }
       }
    default:
       return 0;



More information about the mesa-commit mailing list