12bpc RGB video output!


For my application, I need 12bpc HDMI output on TX2 (later DP on Xavier NX). I’m not very familiar with Linux display/graphics stack, but so far I’ve understood that / tried:

  1. Jetson hardware should support 12bpc RGB,
  2. On X11 I tried a simple OpenGL + GLFW application, but GLFW fails to create a window if I hint more than 8 bpc. As I understand, X11 only supports 8bpc windows/frame buffers (or this is EGL constraint?), so using it (EGL?) to manage frame buffers won’t work.
  3. Tried using EGL directly with eglstreamcube sample application - compiled it with NV_WINSYS=egldevice and ran from VT. But EGL fails to find a suitable frame buffer configuration if I set more than 8bpc (nvgldemo_main.c line 442).
  4. According to this thread, DRM does support 8 and 12bpc RGB. So I tried simple test based on /08_video_dec_drm/ example. But the dumb buffer API fails to create a buffer if I use formats like DRM_FORMAT_XRGB2101010 or DRM_FORMAT_XRGB16161616F

So the question is, how can I create a framebuffer with RGB 12bpc format?

Could yo try DRM_FORMAT_ARGB2101010?

Thanks for the quick reply.

Still can’t create buffer: Can't make a FB of type 808669761

Btw, I’m using the NvDrmRenderer::createDumbFB() method and it checks whether the supplied format is one of the formats defined in NvBOFormats[] @ NvDrmRenderer.cpp:50.

I’ll try creating NvBOFormat manually with 12bpp.
drmIoctl(drm_fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq) fails with Unsupported dumb buffer bpp 36 :/

Which jetpack release are you using?

I’ve forgotten which JetPack version I used. But L4T version from /etc/nv_tegra_realse is R32 (release), REVISION: 3.1, GCID: 18186506, BOARD: t186ref, EABI: aarch64, DATE: Tue Dec 10 07:03:07 UTC 2019. So it’s not the newest. I’ll reflash the board with the newest JetPack.

I got the same results with the newest JetPack/L4T.


Per checked the driver, the dumb buffer only supports 8/16/24/32 bpp.

The NvBOFormat in MMAPI sample NvDrmRenderer.cpp shall give you the answer for that " Still can’t create buffer: Can't make a FB of type 808669761"

OK. Then how can I create a frame buffer which supports 12bpc? Should I use the Buffer Manager? NvBufferColorFormat doesn’t seem to have a format for 12bpc RGB.

Then there is no support for 12bpc.

That’s disappointing… What about you saying:



The kernel supported but the userspace lib does not implement all formats.


Ok. What are my options? Is there any way/hope to get it working?


Is it possible to use RGB format for other bpc on your usecase?


No, we’re driving custom display and need more than 8bpc. 12bpc would be ideal, 10bpc could work.


Can I expect a userspace library update to support this? Or can I submit a request for such an update? We’re looking for a solution for a mass produced system in multiple k units/year, and I’d really like to know if this is a dead end or not. Thanks!

I will check with internal team next week.


I think we need to clarify what is the exact 12bpc you want here.

  1. The NvBOFormats indicate the input buffer format which will be sent to the display driver. This does not represent the monitor will give you a 12bpc result.

  2. The display kernel driver has some 12bpc code but the nv libdrm library does not support this.

Which one do you want? Do you have a monitor that supports 12bpc RGB and you want to set that mode as output?

Hi Wayne,

We have a custom configurable monitor which supports RGB 12bpc, and we need a means to HEVC decode and output 12bpc content to it. It’ll be a portable, battery operated, space constrained device, and Jetson SoCs seem like a good fit.