drm/amd/display: Enable support for 16 bpc fixed-point framebuffers.
authorMario Kleiner <mario.kleiner.de@gmail.com>
Fri, 19 Mar 2021 21:03:17 +0000 (22:03 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 27 May 2021 19:00:48 +0000 (15:00 -0400)
This is intended to enable direct high-precision scanout and pageflip
of Vulkan swapchain images in format VK_FORMAT_R16G16B16A16_UNORM.

Expose DRM_FORMAT_XRGB16161616, DRM_FORMAT_ARGB16161616,
DRM_FORMAT_XBGR16161616 and DRM_FORMAT_ABGR16161616 as 16 bpc
unsigned normalized formats. These allow to take full advantage
of the maximum precision of the display hardware, ie. currently
up to 12 bpc.

Searching through old AMD M56, M76 and RV630 hw programming docs
suggests that these 16 bpc formats are supported by all DCE and
DCN display engines, so we can expose the formats unconditionally.

Successfully tested on AMD Polaris11 DCE-11.2 an RavenRidge DCN-1.0
with a HDR-10 monitor over 10 bpc DP output with spatial dithering
enabled by the driver. Picture looks good, and my photometer
measurement procedure confirms an effective 12 bpc color
reproduction.

Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index e5383242e2f9483321f47a0ee541e93e90bdcb76..f14700a0515adead657b344f1471b96ff7b7bd26 100644 (file)
@@ -4962,6 +4962,14 @@ fill_dc_plane_info_and_addr(struct amdgpu_device *adev,
        case DRM_FORMAT_ABGR16161616F:
                plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F;
                break;
+       case DRM_FORMAT_XRGB16161616:
+       case DRM_FORMAT_ARGB16161616:
+               plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616;
+               break;
+       case DRM_FORMAT_XBGR16161616:
+       case DRM_FORMAT_ABGR16161616:
+               plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616;
+               break;
        default:
                DRM_ERROR(
                        "Unsupported screen format %p4cc\n",
@@ -7093,6 +7101,10 @@ static const uint32_t rgb_formats[] = {
        DRM_FORMAT_XBGR2101010,
        DRM_FORMAT_ARGB2101010,
        DRM_FORMAT_ABGR2101010,
+       DRM_FORMAT_XRGB16161616,
+       DRM_FORMAT_XBGR16161616,
+       DRM_FORMAT_ARGB16161616,
+       DRM_FORMAT_ABGR16161616,
        DRM_FORMAT_XBGR8888,
        DRM_FORMAT_ABGR8888,
        DRM_FORMAT_RGB565,