linux graphic drm
DRM设备节点
card0 controlD64 renderD128
打开设备
int fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);
检查能力
drmIoctl(fd, DRM_IOCTL_GET_CAP, &cap)
drmGetCap(fd, DRM_CAP_DUMB_BUFFER, &has_dumb)
#DRM_CAP_ASYNC_PAGE_FLIP
#DRM_CAP_DUMB_BUFFER
#DRM_CAP_CURSOR_WIDTH
#DRM_CAP_CURSOR_HEIGHT
#DRM_CAP_TIMESTAMP_MONOTONIC
检索
drmModeResPtr drmModeGetResources(int fd)
drmModeGetResources(fd);
获取连接
drmModeConnector *conn = drmModeGetConnector(fd, res->connectors[i]);
Encoder结构
drmModeEncoder *enc = drmModeGetEncoder(fd, conn->encoder_id);
drmIoctl(fd, DRM_IOCTL_MODE_GETENCODER, &enc)
CRTC结构
struct crtc {
drmModeCrtc *crtc;
drmModeObjectProperties *props;
drmModePropertyRes **props_info;
drmModeModeInfo *mode;
};
typedef struct _drmModeCrtc {
uint32_t crtc_id;
uint32_t buffer_id; /**< FB id to connect to 0 = disconnect */
uint32_t x, y; /**< Position on the framebuffer */
uint32_t width, height;
int mode_valid;
drmModeModeInfo mode;
int gamma_size; /**< Number of gamma stops */
} drmModeCrtc, *drmModeCrtcPtr;
drmIoctl(fd, DRM_IOCTL_MODE_GETCRTC, &crtc)
DRM_IOCTL(fd, DRM_IOCTL_MODE_SETCRTC, &crtc);
FrameBuffer
drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq);
drmModeAddFB(fd, dev->width, dev->height, 24, 32, dev->stride,dev->handle, &dev->fb);
drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &mreq);
dev->map = mmap(0, dev->size, PROT_READ | PROT_WRITE, MAP_SHARED,fd, mreq.offset);
rgba
rgb565 rgba8888 rgb888 xrgb8888