Correct dmabuf feedback configuration for split renderer
This is more of a support request than an issue with Smithay, so feel free to close at your own leisure. I'm going to lay out my setup first for some context, but feel free to just skip to the question at the end.
Device Configuration
The device in use is the PinePhone (not pro), which has a split renderer with card1 being the render node, while card0 is the display engine:
/dev/dri layout
platform-1c40000.gpu-card -> ../card1
platform-1c40000.gpu-render -> ../renderD128
platform-display-engine-card -> ../card0
The drm_info only shows details for the display engine (card0), which I believe is normal in these scenarios:
drm_info
drmModeGetResources: Operation not supported
Failed to retrieve information from /dev/dri/card1
Node: /dev/dri/card0
├───Driver: sun4i-drm (Allwinner sun4i Display Engine) version 1.0.0
│ ├───DRM_CLIENT_CAP_STEREO_3D supported
│ ├───DRM_CLIENT_CAP_UNIVERSAL_PLANES supported
│ ├───DRM_CLIENT_CAP_ATOMIC supported
│ ├───DRM_CLIENT_CAP_ASPECT_RATIO supported
│ ├───DRM_CLIENT_CAP_WRITEBACK_CONNECTORS supported
│ ├───DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT not supported
│ ├───DRM_CAP_DUMB_BUFFER = 1
│ ├───DRM_CAP_VBLANK_HIGH_CRTC = 1
│ ├───DRM_CAP_DUMB_PREFERRED_DEPTH = 0
│ ├───DRM_CAP_DUMB_PREFER_SHADOW = 0
│ ├───DRM_CAP_PRIME = 3
│ ├───DRM_CAP_TIMESTAMP_MONOTONIC = 1
│ ├───DRM_CAP_ASYNC_PAGE_FLIP = 0
│ ├───DRM_CAP_CURSOR_WIDTH = 64
│ ├───DRM_CAP_CURSOR_HEIGHT = 64
│ ├───DRM_CAP_ADDFB2_MODIFIERS = 1
│ ├───DRM_CAP_PAGE_FLIP_TARGET = 0
│ ├───DRM_CAP_CRTC_IN_VBLANK_EVENT = 1
│ ├───DRM_CAP_SYNCOBJ = 0
│ ├───DRM_CAP_SYNCOBJ_TIMELINE = 0
│ └───DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP = 0
├───Device: platform allwinner,sun50i-a64-display-engine
│ ├───Bus: /display-engine
│ └───Available nodes: primary
├───Framebuffer size
│ ├───Width: [0, 8192]
│ └───Height: [0, 8192]
├───Connectors
│ ├───Connector 0
│ │ ├───Object ID: 63
│ │ ├───Type: DSI
│ │ ├───Status: connected
│ │ ├───Physical size: 68×136 mm
│ │ ├───Subpixel: unknown
│ │ ├───Encoders: {0}
│ │ ├───Modes
│ │ │ └───720×[email protected] preferred driver nhsync nvsync
│ │ └───Properties
│ │ ├───"EDID" (immutable): blob = 0
│ │ ├───"DPMS": enum {On, Standby, Suspend, Off} = On
│ │ ├───"link-status": enum {Good, Bad} = Good
│ │ ├───"non-desktop" (immutable): range [0, 1] = 0
│ │ ├───"TILE" (immutable): blob = 0
│ │ └───"CRTC_ID" (atomic): object CRTC = 50
│ └───Connector 1
│ ├───Object ID: 65
│ ├───Type: HDMI-A
│ ├───Status: disconnected
│ ├───Encoders: {1}
│ └───Properties
│ ├───"EDID" (immutable): blob = 0
│ ├───"DPMS": enum {On, Standby, Suspend, Off} = On
│ ├───"link-status": enum {Good, Bad} = Good
│ ├───"non-desktop" (immutable): range [0, 1] = 0
│ ├───"TILE" (immutable): blob = 0
│ ├───"CRTC_ID" (atomic): object CRTC = 0
│ └───"max bpc": range [8, 16] = 0
├───Encoders
│ ├───Encoder 0
│ │ ├───Object ID: 62
│ │ ├───Type: DSI
│ │ ├───CRTCS: {0}
│ │ └───Clones: {0}
│ └───Encoder 1
│ ├───Object ID: 64
│ ├───Type: TMDS
│ ├───CRTCS: {1}
│ └───Clones: {1}
├───CRTCs
│ ├───CRTC 0
│ │ ├───Object ID: 50
│ │ ├───Legacy info
│ │ │ ├───Mode: 720×[email protected] preferred driver nhsync nvsync
│ │ │ └───Gamma size: 256
│ │ └───Properties
│ │ ├───"ACTIVE" (atomic): range [0, 1] = 1
│ │ ├───"MODE_ID" (atomic): blob = 68
│ │ │ └───720×[email protected] preferred driver nhsync nvsync
│ │ ├───"OUT_FENCE_PTR" (atomic): range [0, UINT64_MAX] = 0
│ │ ├───"VRR_ENABLED": range [0, 1] = 0
│ │ ├───"GAMMA_LUT": blob = 0
│ │ └───"GAMMA_LUT_SIZE" (immutable): range [0, UINT32_MAX] = 256
│ └───CRTC 1
│ ├───Object ID: 61
│ ├───Legacy info
│ │ └───Gamma size: 256
│ └───Properties
│ ├───"ACTIVE" (atomic): range [0, 1] = 0
│ ├───"MODE_ID" (atomic): blob = 0
│ ├───"OUT_FENCE_PTR" (atomic): range [0, UINT64_MAX] = 0
│ ├───"VRR_ENABLED": range [0, 1] = 0
│ ├───"GAMMA_LUT": blob = 0
│ └───"GAMMA_LUT_SIZE" (immutable): range [0, UINT32_MAX] = 256
└───Planes
├───Plane 0
│ ├───Object ID: 32
│ ├───CRTCs: {0}
│ ├───Legacy info
│ │ ├───FB ID: 0
│ │ └───Formats:
│ │ ├───BGR565 (0x36314742)
│ │ ├───BGR888 (0x34324742)
│ │ ├───BGRX4444 (0x32315842)
│ │ ├───BGRX5551 (0x35315842)
│ │ ├───BGRX8888 (0x34325842)
│ │ ├───RGB565 (0x36314752)
│ │ ├───RGB888 (0x34324752)
│ │ ├───RGBX4444 (0x32315852)
│ │ ├───RGBX5551 (0x35315852)
│ │ ├───RGBX8888 (0x34325852)
│ │ ├───XBGR1555 (0x35314258)
│ │ ├───XBGR4444 (0x32314258)
│ │ ├───XBGR8888 (0x34324258)
│ │ ├───XRGB1555 (0x35315258)
│ │ ├───XRGB4444 (0x32315258)
│ │ ├───XRGB8888 (0x34325258)
│ │ ├───NV16 (0x3631564e)
│ │ ├───NV12 (0x3231564e)
│ │ ├───NV21 (0x3132564e)
│ │ ├───NV61 (0x3136564e)
│ │ ├───UYVY (0x59565955)
│ │ ├───VYUY (0x59555956)
│ │ ├───YUYV (0x56595559)
│ │ ├───YVYU (0x55595659)
│ │ ├───YUV411 (0x31315559)
│ │ ├───YUV420 (0x32315559)
│ │ ├───YUV422 (0x36315559)
│ │ ├───YVU411 (0x31315659)
│ │ ├───YVU420 (0x32315659)
│ │ └───YVU422 (0x36315659)
│ └───Properties
│ ├───"type" (immutable): enum {Overlay, Primary, Cursor} = Overlay
│ ├───"FB_ID" (atomic): object framebuffer = 0
│ ├───"IN_FENCE_FD" (atomic): srange [-1, INT32_MAX] = -1
│ ├───"CRTC_ID" (atomic): object CRTC = 0
│ ├───"CRTC_X" (atomic): srange [INT32_MIN, INT32_MAX] = 0
│ ├───"CRTC_Y" (atomic): srange [INT32_MIN, INT32_MAX] = 0
│ ├───"CRTC_W" (atomic): range [0, INT32_MAX] = 0
│ ├───"CRTC_H" (atomic): range [0, INT32_MAX] = 0
│ ├───"SRC_X" (atomic): range [0, UINT32_MAX] = 0
│ ├───"SRC_Y" (atomic): range [0, UINT32_MAX] = 0
│ ├───"SRC_W" (atomic): range [0, UINT32_MAX] = 0
│ ├───"SRC_H" (atomic): range [0, UINT32_MAX] = 0
│ ├───"IN_FORMATS" (immutable): blob = 33
│ │ └───DRM_FORMAT_MOD_LINEAR (0x0000000000000000)
│ │ ├───BGR565 (0x36314742)
│ │ ├───BGR888 (0x34324742)
│ │ ├───BGRX4444 (0x32315842)
│ │ ├───BGRX5551 (0x35315842)
│ │ ├───BGRX8888 (0x34325842)
│ │ ├───RGB565 (0x36314752)
│ │ ├───RGB888 (0x34324752)
│ │ ├───RGBX4444 (0x32315852)
│ │ ├───RGBX5551 (0x35315852)
│ │ ├───RGBX8888 (0x34325852)
│ │ ├───XBGR1555 (0x35314258)
│ │ ├───XBGR4444 (0x32314258)
│ │ ├───XBGR8888 (0x34324258)
│ │ ├───XRGB1555 (0x35315258)
│ │ ├───XRGB4444 (0x32315258)
│ │ ├───XRGB8888 (0x34325258)
│ │ ├───NV16 (0x3631564e)
│ │ ├───NV12 (0x3231564e)
│ │ ├───NV21 (0x3132564e)
│ │ ├───NV61 (0x3136564e)
│ │ ├───UYVY (0x59565955)
│ │ ├───VYUY (0x59555956)
│ │ ├───YUYV (0x56595559)
│ │ ├───YVYU (0x55595659)
│ │ ├───YUV411 (0x31315559)
│ │ ├───YUV420 (0x32315559)
│ │ ├───YUV422 (0x36315559)
│ │ ├───YVU411 (0x31315659)
│ │ ├───YVU420 (0x32315659)
│ │ └───YVU422 (0x36315659)
│ ├───"alpha": range [0, UINT16_MAX] = 65535
│ ├───"zpos": range [0, 3] = 0
│ ├───"COLOR_ENCODING": enum {ITU-R BT.601 YCbCr, ITU-R BT.709 YCbCr} = ITU-R BT.709 YCbCr
│ └───"COLOR_RANGE": enum {YCbCr limited range, YCbCr full range} = YCbCr limited range
├───Plane 1
│ ├───Object ID: 38
│ ├───CRTCs: {0}
│ ├───Legacy info
│ │ ├───FB ID: 71
│ │ │ ├───Object ID: 71
│ │ │ ├───Size: 720×1440
│ │ │ ├───Format: ARGB8888 (0x34325241)
│ │ │ ├───Modifier: DRM_FORMAT_MOD_LINEAR (0x0000000000000000)
│ │ │ └───Planes:
│ │ │ └───Plane 0: offset = 0, pitch = 2880 bytes
│ │ └───Formats:
│ │ ├───ABGR1555 (0x35314241)
│ │ ├───ABGR4444 (0x32314241)
│ │ ├───ABGR8888 (0x34324241)
│ │ ├───ARGB1555 (0x35315241)
│ │ ├───ARGB4444 (0x32315241)
│ │ ├───ARGB8888 (0x34325241)
│ │ ├───BGR565 (0x36314742)
│ │ ├───BGR888 (0x34324742)
│ │ ├───BGRA5551 (0x35314142)
│ │ ├───BGRA4444 (0x32314142)
│ │ ├───BGRA8888 (0x34324142)
│ │ ├───BGRX8888 (0x34325842)
│ │ ├───RGB565 (0x36314752)
│ │ ├───RGB888 (0x34324752)
│ │ ├───RGBA4444 (0x32314152)
│ │ ├───RGBA5551 (0x35314152)
│ │ ├───RGBA8888 (0x34324152)
│ │ ├───RGBX8888 (0x34325852)
│ │ ├───XBGR8888 (0x34324258)
│ │ └───XRGB8888 (0x34325258)
│ └───Properties
│ ├───"type" (immutable): enum {Overlay, Primary, Cursor} = Primary
│ ├───"FB_ID" (atomic): object framebuffer = 71
│ │ ├───Object ID: 71
│ │ ├───Size: 720×1440
│ │ ├───Format: ARGB8888 (0x34325241)
│ │ ├───Modifier: DRM_FORMAT_MOD_LINEAR (0x0000000000000000)
│ │ └───Planes:
│ │ └───Plane 0: offset = 0, pitch = 2880 bytes
│ ├───"IN_FENCE_FD" (atomic): srange [-1, INT32_MAX] = -1
│ ├───"CRTC_ID" (atomic): object CRTC = 50
│ ├───"CRTC_X" (atomic): srange [INT32_MIN, INT32_MAX] = 0
│ ├───"CRTC_Y" (atomic): srange [INT32_MIN, INT32_MAX] = 0
│ ├───"CRTC_W" (atomic): range [0, INT32_MAX] = 720
│ ├───"CRTC_H" (atomic): range [0, INT32_MAX] = 1440
│ ├───"SRC_X" (atomic): range [0, UINT32_MAX] = 0
│ ├───"SRC_Y" (atomic): range [0, UINT32_MAX] = 0
│ ├───"SRC_W" (atomic): range [0, UINT32_MAX] = 720
│ ├───"SRC_H" (atomic): range [0, UINT32_MAX] = 1440
│ ├───"IN_FORMATS" (immutable): blob = 39
│ │ └───DRM_FORMAT_MOD_LINEAR (0x0000000000000000)
│ │ ├───ABGR1555 (0x35314241)
│ │ ├───ABGR4444 (0x32314241)
│ │ ├───ABGR8888 (0x34324241)
│ │ ├───ARGB1555 (0x35315241)
│ │ ├───ARGB4444 (0x32315241)
│ │ ├───ARGB8888 (0x34325241)
│ │ ├───BGR565 (0x36314742)
│ │ ├───BGR888 (0x34324742)
│ │ ├───BGRA5551 (0x35314142)
│ │ ├───BGRA4444 (0x32314142)
│ │ ├───BGRA8888 (0x34324142)
│ │ ├───BGRX8888 (0x34325842)
│ │ ├───RGB565 (0x36314752)
│ │ ├───RGB888 (0x34324752)
│ │ ├───RGBA4444 (0x32314152)
│ │ ├───RGBA5551 (0x35314152)
│ │ ├───RGBA8888 (0x34324152)
│ │ ├───RGBX8888 (0x34325852)
│ │ ├───XBGR8888 (0x34324258)
│ │ └───XRGB8888 (0x34325258)
│ ├───"alpha": range [0, UINT16_MAX] = 65535
│ └───"zpos": range [0, 3] = 1
├───Plane 2
│ ├───Object ID: 42
│ ├───CRTCs: {0}
│ ├───Legacy info
│ │ ├───FB ID: 0
│ │ └───Formats:
│ │ ├───ABGR1555 (0x35314241)
│ │ ├───ABGR4444 (0x32314241)
│ │ ├───ABGR8888 (0x34324241)
│ │ ├───ARGB1555 (0x35315241)
│ │ ├───ARGB4444 (0x32315241)
│ │ ├───ARGB8888 (0x34325241)
│ │ ├───BGR565 (0x36314742)
│ │ ├───BGR888 (0x34324742)
│ │ ├───BGRA5551 (0x35314142)
│ │ ├───BGRA4444 (0x32314142)
│ │ ├───BGRA8888 (0x34324142)
│ │ ├───BGRX8888 (0x34325842)
│ │ ├───RGB565 (0x36314752)
│ │ ├───RGB888 (0x34324752)
│ │ ├───RGBA4444 (0x32314152)
│ │ ├───RGBA5551 (0x35314152)
│ │ ├───RGBA8888 (0x34324152)
│ │ ├───RGBX8888 (0x34325852)
│ │ ├───XBGR8888 (0x34324258)
│ │ └───XRGB8888 (0x34325258)
│ └───Properties
│ ├───"type" (immutable): enum {Overlay, Primary, Cursor} = Overlay
│ ├───"FB_ID" (atomic): object framebuffer = 0
│ ├───"IN_FENCE_FD" (atomic): srange [-1, INT32_MAX] = -1
│ ├───"CRTC_ID" (atomic): object CRTC = 0
│ ├───"CRTC_X" (atomic): srange [INT32_MIN, INT32_MAX] = 0
│ ├───"CRTC_Y" (atomic): srange [INT32_MIN, INT32_MAX] = 0
│ ├───"CRTC_W" (atomic): range [0, INT32_MAX] = 0
│ ├───"CRTC_H" (atomic): range [0, INT32_MAX] = 0
│ ├───"SRC_X" (atomic): range [0, UINT32_MAX] = 0
│ ├───"SRC_Y" (atomic): range [0, UINT32_MAX] = 0
│ ├───"SRC_W" (atomic): range [0, UINT32_MAX] = 0
│ ├───"SRC_H" (atomic): range [0, UINT32_MAX] = 0
│ ├───"IN_FORMATS" (immutable): blob = 43
│ │ └───DRM_FORMAT_MOD_LINEAR (0x0000000000000000)
│ │ ├───ABGR1555 (0x35314241)
│ │ ├───ABGR4444 (0x32314241)
│ │ ├───ABGR8888 (0x34324241)
│ │ ├───ARGB1555 (0x35315241)
│ │ ├───ARGB4444 (0x32315241)
│ │ ├───ARGB8888 (0x34325241)
│ │ ├───BGR565 (0x36314742)
│ │ ├───BGR888 (0x34324742)
│ │ ├───BGRA5551 (0x35314142)
│ │ ├───BGRA4444 (0x32314142)
│ │ ├───BGRA8888 (0x34324142)
│ │ ├───BGRX8888 (0x34325842)
│ │ ├───RGB565 (0x36314752)
│ │ ├───RGB888 (0x34324752)
│ │ ├───RGBA4444 (0x32314152)
│ │ ├───RGBA5551 (0x35314152)
│ │ ├───RGBA8888 (0x34324152)
│ │ ├───RGBX8888 (0x34325852)
│ │ ├───XBGR8888 (0x34324258)
│ │ └───XRGB8888 (0x34325258)
│ ├───"alpha": range [0, UINT16_MAX] = 65535
│ └───"zpos": range [0, 3] = 2
├───Plane 3
│ ├───Object ID: 46
│ ├───CRTCs: {0}
│ ├───Legacy info
│ │ ├───FB ID: 0
│ │ └───Formats:
│ │ ├───ABGR1555 (0x35314241)
│ │ ├───ABGR4444 (0x32314241)
│ │ ├───ABGR8888 (0x34324241)
│ │ ├───ARGB1555 (0x35315241)
│ │ ├───ARGB4444 (0x32315241)
│ │ ├───ARGB8888 (0x34325241)
│ │ ├───BGR565 (0x36314742)
│ │ ├───BGR888 (0x34324742)
│ │ ├───BGRA5551 (0x35314142)
│ │ ├───BGRA4444 (0x32314142)
│ │ ├───BGRA8888 (0x34324142)
│ │ ├───BGRX8888 (0x34325842)
│ │ ├───RGB565 (0x36314752)
│ │ ├───RGB888 (0x34324752)
│ │ ├───RGBA4444 (0x32314152)
│ │ ├───RGBA5551 (0x35314152)
│ │ ├───RGBA8888 (0x34324152)
│ │ ├───RGBX8888 (0x34325852)
│ │ ├───XBGR8888 (0x34324258)
│ │ └───XRGB8888 (0x34325258)
│ └───Properties
│ ├───"type" (immutable): enum {Overlay, Primary, Cursor} = Cursor
│ ├───"FB_ID" (atomic): object framebuffer = 0
│ ├───"IN_FENCE_FD" (atomic): srange [-1, INT32_MAX] = -1
│ ├───"CRTC_ID" (atomic): object CRTC = 0
│ ├───"CRTC_X" (atomic): srange [INT32_MIN, INT32_MAX] = 0
│ ├───"CRTC_Y" (atomic): srange [INT32_MIN, INT32_MAX] = 0
│ ├───"CRTC_W" (atomic): range [0, INT32_MAX] = 0
│ ├───"CRTC_H" (atomic): range [0, INT32_MAX] = 0
│ ├───"SRC_X" (atomic): range [0, UINT32_MAX] = 0
│ ├───"SRC_Y" (atomic): range [0, UINT32_MAX] = 0
│ ├───"SRC_W" (atomic): range [0, UINT32_MAX] = 0
│ ├───"SRC_H" (atomic): range [0, UINT32_MAX] = 0
│ ├───"IN_FORMATS" (immutable): blob = 47
│ │ └───DRM_FORMAT_MOD_LINEAR (0x0000000000000000)
│ │ ├───ABGR1555 (0x35314241)
│ │ ├───ABGR4444 (0x32314241)
│ │ ├───ABGR8888 (0x34324241)
│ │ ├───ARGB1555 (0x35315241)
│ │ ├───ARGB4444 (0x32315241)
│ │ ├───ARGB8888 (0x34325241)
│ │ ├───BGR565 (0x36314742)
│ │ ├───BGR888 (0x34324742)
│ │ ├───BGRA5551 (0x35314142)
│ │ ├───BGRA4444 (0x32314142)
│ │ ├───BGRA8888 (0x34324142)
│ │ ├───BGRX8888 (0x34325842)
│ │ ├───RGB565 (0x36314752)
│ │ ├───RGB888 (0x34324752)
│ │ ├───RGBA4444 (0x32314152)
│ │ ├───RGBA5551 (0x35314152)
│ │ ├───RGBA8888 (0x34324152)
│ │ ├───RGBX8888 (0x34325852)
│ │ ├───XBGR8888 (0x34324258)
│ │ └───XRGB8888 (0x34325258)
│ ├───"alpha": range [0, UINT16_MAX] = 65535
│ └───"zpos": range [0, 3] = 3
├───Plane 4
│ ├───Object ID: 51
│ ├───CRTCs: {1}
│ ├───Legacy info
│ │ ├───FB ID: 0
│ │ └───Formats:
│ │ ├───BGR565 (0x36314742)
│ │ ├───BGR888 (0x34324742)
│ │ ├───BGRX4444 (0x32315842)
│ │ ├───BGRX5551 (0x35315842)
│ │ ├───BGRX8888 (0x34325842)
│ │ ├───RGB565 (0x36314752)
│ │ ├───RGB888 (0x34324752)
│ │ ├───RGBX4444 (0x32315852)
│ │ ├───RGBX5551 (0x35315852)
│ │ ├───RGBX8888 (0x34325852)
│ │ ├───XBGR1555 (0x35314258)
│ │ ├───XBGR4444 (0x32314258)
│ │ ├───XBGR8888 (0x34324258)
│ │ ├───XRGB1555 (0x35315258)
│ │ ├───XRGB4444 (0x32315258)
│ │ ├───XRGB8888 (0x34325258)
│ │ ├───NV16 (0x3631564e)
│ │ ├───NV12 (0x3231564e)
│ │ ├───NV21 (0x3132564e)
│ │ ├───NV61 (0x3136564e)
│ │ ├───UYVY (0x59565955)
│ │ ├───VYUY (0x59555956)
│ │ ├───YUYV (0x56595559)
│ │ ├───YVYU (0x55595659)
│ │ ├───YUV411 (0x31315559)
│ │ ├───YUV420 (0x32315559)
│ │ ├───YUV422 (0x36315559)
│ │ ├───YVU411 (0x31315659)
│ │ ├───YVU420 (0x32315659)
│ │ └───YVU422 (0x36315659)
│ └───Properties
│ ├───"type" (immutable): enum {Overlay, Primary, Cursor} = Overlay
│ ├───"FB_ID" (atomic): object framebuffer = 0
│ ├───"IN_FENCE_FD" (atomic): srange [-1, INT32_MAX] = -1
│ ├───"CRTC_ID" (atomic): object CRTC = 0
│ ├───"CRTC_X" (atomic): srange [INT32_MIN, INT32_MAX] = 0
│ ├───"CRTC_Y" (atomic): srange [INT32_MIN, INT32_MAX] = 0
│ ├───"CRTC_W" (atomic): range [0, INT32_MAX] = 0
│ ├───"CRTC_H" (atomic): range [0, INT32_MAX] = 0
│ ├───"SRC_X" (atomic): range [0, UINT32_MAX] = 0
│ ├───"SRC_Y" (atomic): range [0, UINT32_MAX] = 0
│ ├───"SRC_W" (atomic): range [0, UINT32_MAX] = 0
│ ├───"SRC_H" (atomic): range [0, UINT32_MAX] = 0
│ ├───"IN_FORMATS" (immutable): blob = 52
│ │ └───DRM_FORMAT_MOD_LINEAR (0x0000000000000000)
│ │ ├───BGR565 (0x36314742)
│ │ ├───BGR888 (0x34324742)
│ │ ├───BGRX4444 (0x32315842)
│ │ ├───BGRX5551 (0x35315842)
│ │ ├───BGRX8888 (0x34325842)
│ │ ├───RGB565 (0x36314752)
│ │ ├───RGB888 (0x34324752)
│ │ ├───RGBX4444 (0x32315852)
│ │ ├───RGBX5551 (0x35315852)
│ │ ├───RGBX8888 (0x34325852)
│ │ ├───XBGR1555 (0x35314258)
│ │ ├───XBGR4444 (0x32314258)
│ │ ├───XBGR8888 (0x34324258)
│ │ ├───XRGB1555 (0x35315258)
│ │ ├───XRGB4444 (0x32315258)
│ │ ├───XRGB8888 (0x34325258)
│ │ ├───NV16 (0x3631564e)
│ │ ├───NV12 (0x3231564e)
│ │ ├───NV21 (0x3132564e)
│ │ ├───NV61 (0x3136564e)
│ │ ├───UYVY (0x59565955)
│ │ ├───VYUY (0x59555956)
│ │ ├───YUYV (0x56595559)
│ │ ├───YVYU (0x55595659)
│ │ ├───YUV411 (0x31315559)
│ │ ├───YUV420 (0x32315559)
│ │ ├───YUV422 (0x36315559)
│ │ ├───YVU411 (0x31315659)
│ │ ├───YVU420 (0x32315659)
│ │ └───YVU422 (0x36315659)
│ ├───"alpha": range [0, UINT16_MAX] = 65535
│ ├───"zpos": range [0, 1] = 0
│ ├───"COLOR_ENCODING": enum {ITU-R BT.601 YCbCr, ITU-R BT.709 YCbCr} = ITU-R BT.709 YCbCr
│ └───"COLOR_RANGE": enum {YCbCr limited range, YCbCr full range} = YCbCr limited range
└───Plane 5
├───Object ID: 57
├───CRTCs: {1}
├───Legacy info
│ ├───FB ID: 0
│ └───Formats:
│ ├───ABGR1555 (0x35314241)
│ ├───ABGR4444 (0x32314241)
│ ├───ABGR8888 (0x34324241)
│ ├───ARGB1555 (0x35315241)
│ ├───ARGB4444 (0x32315241)
│ ├───ARGB8888 (0x34325241)
│ ├───BGR565 (0x36314742)
│ ├───BGR888 (0x34324742)
│ ├───BGRA5551 (0x35314142)
│ ├───BGRA4444 (0x32314142)
│ ├───BGRA8888 (0x34324142)
│ ├───BGRX8888 (0x34325842)
│ ├───RGB565 (0x36314752)
│ ├───RGB888 (0x34324752)
│ ├───RGBA4444 (0x32314152)
│ ├───RGBA5551 (0x35314152)
│ ├───RGBA8888 (0x34324152)
│ ├───RGBX8888 (0x34325852)
│ ├───XBGR8888 (0x34324258)
│ └───XRGB8888 (0x34325258)
└───Properties
├───"type" (immutable): enum {Overlay, Primary, Cursor} = Primary
├───"FB_ID" (atomic): object framebuffer = 0
├───"IN_FENCE_FD" (atomic): srange [-1, INT32_MAX] = -1
├───"CRTC_ID" (atomic): object CRTC = 0
├───"CRTC_X" (atomic): srange [INT32_MIN, INT32_MAX] = 0
├───"CRTC_Y" (atomic): srange [INT32_MIN, INT32_MAX] = 0
├───"CRTC_W" (atomic): range [0, INT32_MAX] = 0
├───"CRTC_H" (atomic): range [0, INT32_MAX] = 0
├───"SRC_X" (atomic): range [0, UINT32_MAX] = 0
├───"SRC_Y" (atomic): range [0, UINT32_MAX] = 0
├───"SRC_W" (atomic): range [0, UINT32_MAX] = 0
├───"SRC_H" (atomic): range [0, UINT32_MAX] = 0
├───"IN_FORMATS" (immutable): blob = 58
│ └───DRM_FORMAT_MOD_LINEAR (0x0000000000000000)
│ ├───ABGR1555 (0x35314241)
│ ├───ABGR4444 (0x32314241)
│ ├───ABGR8888 (0x34324241)
│ ├───ARGB1555 (0x35315241)
│ ├───ARGB4444 (0x32315241)
│ ├───ARGB8888 (0x34325241)
│ ├───BGR565 (0x36314742)
│ ├───BGR888 (0x34324742)
│ ├───BGRA5551 (0x35314142)
│ ├───BGRA4444 (0x32314142)
│ ├───BGRA8888 (0x34324142)
│ ├───BGRX8888 (0x34325842)
│ ├───RGB565 (0x36314752)
│ ├───RGB888 (0x34324752)
│ ├───RGBA4444 (0x32314152)
│ ├───RGBA5551 (0x35314152)
│ ├───RGBA8888 (0x34324152)
│ ├───RGBX8888 (0x34325852)
│ ├───XBGR8888 (0x34324258)
│ └───XRGB8888 (0x34325258)
├───"alpha": range [0, UINT16_MAX] = 65535
└───"zpos": range [0, 1] = 1
As far as I'm aware, the DrmCompositor, its surface, drm device, and gbm device, all must be created from the same node. The DrmDevice::new call fails for card1 so to my knowledge these must all use card0, which is the display engine.
Traditionally from what I've seen with most compositors, this node is also used for dmabuf feedback. However due to an issue discovered on the PinePhone Pro, which also seems to apply to the PinePhone, not using a render node for DmabufFeedbackBuilder::new would lead to software rendering:
https://github.com/catacombing/catacomb/commit/7366341e57e06f9907c81e6af54d3a41dbefe2a1
The Question(s)
From what I can tell, this means the DrmCompositor must use the display engine (card0), while DmabufFeedbackBuilder must use a render node. However with my web browser when using the surface's node (card0) as the target device for the preference tranche, I get rendering glitches. Note this works fine with applications that get their dmabuf feedback through mesa, but with my browser I need to pass it along manually using the actual Wayland protocol response.
Which node are the tranches supposed to use? The one that actually has the stuff show up in drm_info output (display engine card0), or the render node which is used for the base feedback type (render node card1)?
If I'm supposed to use the surface's node, is this just a driver bug?
Your findings are correct. DrmCompositor and the stuff around it, except the renderer are expected to use the display engine node (card0 in your case). This is typically initialized during enumeration with udev, initially and when handling hot plug events.
The composition is done using the gpu, in your case using the gles renderer on card1/renderD128. So you probably already know the render node and use it.
The main device of the feedback is typically the primary render gpu you use in your compositor for composition. You want this gpu to be able to sample the client provided buffers.
Preference tranches do not necessarily represent a scan-out tranche, but could also be used in a multi-gpu setup. But in your case a scan-out tranche with card0 should be correct.
So why does this work with simple mesa clients but might break in your setup? Mesa (at least the egl wayland platform) does not switch drm nodes, it will stick to the device announced through the default feedback. Later when it receives the surface feedback it will use it to re-evaluate the modifiers it uses and in case of a scan-out tranche will forward this information to dri.
For what is the preference node used in your browser? Do you change the allocator or also the node used for rendering?
For what is the preference node used in your browser? Do you change the allocator or also the node used for rendering?
I just pass the dmabuf feedback to WebKit 1:1, which they then use to allocate buffers. I would assume this node is used for rendering. WebKit just gives me a dmabuf, for which I then create a WlBuffer. Note that not passing any feedback seems to work just fine, in which case I'd assume the render node is used instead.
Your findings are correct. DrmCompositor and the stuff around it, except the renderer are expected to use the display engine node (card0 in your case).
Is the renderer expected to use the render node? As you can see here, I use the gbm device to initialize the display, so this would use the display driver (not the render node): https://github.com/catacombing/catacomb/blob/28f9ae23184e2f636a1a04346b402592c728f597/src/udev.rs#L355-L358
Preference tranches do not necessarily represent a scan-out tranche, but could also be used in a multi-gpu setup. But in your case a scan-out tranche with card0 should be correct.
Just to be 100% clear, in this instance the tranche creating problems is indeed a scanout tranche. I only have one GPU.
Maybe this can speed things up: If Mesa doesn't switch nodes and always uses the base for any tranche, then would it be 'wrong' to use the render node for every tranche?
You mention the following:
Preference tranches do not necessarily represent a scan-out tranche, but could also be used in a multi-gpu setup. But in your case a scan-out tranche with card0 should be correct.
If card0 is correct, does that mean card1 is incorrect? If so, isn't Mesa technically doing things incorrectly by ignoring this information?