Добрый день.
Я использую SK-iMX8Mini-MOD с экраном SK-iMX8Mini-MB-LCD.
Я хочу запустить на нем OpenGL ES пример и добавить подержку отрисовки мышки.
Я взял пример из opengles-book-samples репозитория и подправил, чтобы dri card был по умолчанию /dev/dri/card0 или читался из переменной окружения DRI_CARD.
Сначала я собираю и запускаю пример из моего opengles-book-samples форка branch imx8-drm на Raspberry Pi 4 с Ubuntu 21.04 aarch64:
https://github.com/AlexanderScherbatiy/opengles-book-samples/pull/1
Код
git clone https://github.com/AlexanderScherbatiy/opengles-book-samples.git
cd opengles-book-samples
git checkout imx8-drm
cd LinuxDRM
make
sudo init 3
export DRI_CARD="/dev/dri/card1"
sudo -E Chapter_2/Hello_Triangle/CH02_HelloTriangle
и вижу красный треугольник в левом нижнем углу.
Потом копирую CH02_HelloTriangle на SK-iMX8Mini-MOD и запускаю
Код
init 3
export DRI_CARD="/dev/dri/card0"
./CH02_HelloTriangle
и вижу тот же красный треугольник.
card0 выбираую, так как imx8 выдает:
Код
ls /sys/class/drm/
card0 card0-DSI-1 version
После этого добавляю код, который рисует курсор используя gbm
https://github.com/AlexanderScherbatiy/opengles-book-samples/pull/2
вот такой код:
Код
static DRM_CURSOR *drm_create_cursor(int drmFd, struct gbm_device *gbmDevice, uint32_t crtc_id)
{
int w = 16;
int h = 16;
DRM_CURSOR * c = calloc(1, sizeof(DRM_CURSOR));
uint32_t buf[w * h];
int ret;
c->crtc_id = crtc_id;
c->bo = gbm_bo_create(gbmDevice, w, h,
GBM_FORMAT_ARGB8888,
GBM_BO_USE_CURSOR_64X64 | GBM_BO_USE_WRITE);
if( NULL == c->bo )
{
printf("Failed to create gbm_bo\n");
return NULL;
}
c->bo_handle = gbm_bo_get_handle(c->bo).u32;
memset(buf, 255, sizeof buf); // white for now
if ( gbm_bo_write(c->bo, buf, sizeof(buf)) < 0 ) {
printf("Failed to write gbm_bo\n");
return NULL;
}
Собираю и запускаю из branch imx8-drm-cursor на Raspberry Pi 4:
Код
git checkout imx8-drm-cursor
make
sudo init 3
export DRI_CARD="/dev/dri/card1"
sudo -E Chapter_2/Hello_Triangle/CH02_HelloTriangle
При этом в левом нижнем углу появляется треугольник и в правом верхнем углу белый квадратик курсора.
Копирую CH02_HelloTriangle на SK-iMX8Mini-MOD, запускаю, и код падает:
Код
init 3
export DRI_CARD="/dev/dri/card0"
./CH02_HelloTriangle
Used dri card: /dev/dri/card0
Try to init gbm with fd=3, h=800 v=1280
Segmentation fault (core dumped)
падает при вызове gbm_bo_write вот в этом коде:
Код
memset(buf, 255, sizeof buf); // white for now
if ( gbm_bo_write(c->bo, buf, sizeof(buf)) < 0 ) { // Segmentation fault
printf("Failed to write gbm_bo\n");
return NULL;
}
не понятно, что не так с этим вызовом.
gdb показывает, что buf правильно инициализирован и gbm_bo_create выдает не NULL значение.
вот что выдает ldd CH02_HelloTriangle на SK-iMX8Mini-MOD:
Код
ldd CH02_HelloTriangle
linux-vdso.so.1 (0x0000ffff971e9000)
libGLESv2.so.2 => /usr/lib/libGLESv2.so.2 (0x0000ffff97035000)
libEGL.so.1 => /usr/lib/libEGL.so.1 (0x0000ffff96ff2000)
libm.so.6 => /lib/libm.so.6 (0x0000ffff96f39000)
libgbm.so.1 => /usr/lib/libgbm.so.1 (0x0000ffff96f26000)
libdrm.so.2 => /usr/lib/libdrm.so.2 (0x0000ffff96f06000)
libc.so.6 => /lib/libc.so.6 (0x0000ffff96db2000)
/lib/ld-linux-aarch64.so.1 (0x0000ffff971be000)
libGAL.so => /usr/lib/libGAL.so (0x0000ffff96c0e000)
libVSC.so => /usr/lib/libVSC.so (0x0000ffff96699000)
libdl.so.2 => /lib/libdl.so.2 (0x0000ffff96686000)
gbm_viv.so => /usr/lib/gbm_viv.so (0x0000ffff96672000)
libwayland-server.so.0 => /usr/lib/libwayland-server.so.0 (0x0000ffff96651000)
libwayland-client.so.0 => /usr/lib/libwayland-client.so.0 (0x0000ffff96634000)
libpthread.so.0 => /lib/libpthread.so.0 (0x0000ffff96608000)
librt.so.1 => /lib/librt.so.1 (0x0000ffff965f1000)
libffi.so.6 => /usr/lib/libffi.so.6 (0x0000ffff965d9000)
ldd /usr/lib/libgbm.so.1
Код
ldd /usr/lib/libgbm.so.1
ldd: warning: you do not have execution permission for `/usr/lib/libgbm.so.1'
linux-vdso.so.1 (0x0000ffffb37f4000)
gbm_viv.so => /usr/lib/gbm_viv.so (0x0000ffffb37a2000)
libc.so.6 => /lib/libc.so.6 (0x0000ffffb364e000)
libdrm.so.2 => /usr/lib/libdrm.so.2 (0x0000ffffb362e000)
libGAL.so => /usr/lib/libGAL.so (0x0000ffffb348a000)
libwayland-server.so.0 => /usr/lib/libwayland-server.so.0 (0x0000ffffb3469000)
/lib/ld-linux-aarch64.so.1 (0x0000ffffb37c9000)
libm.so.6 => /lib/libm.so.6 (0x0000ffffb33b0000)
libdl.so.2 => /lib/libdl.so.2 (0x0000ffffb339d000)
librt.so.1 => /lib/librt.so.1 (0x0000ffffb3386000)
libpthread.so.0 => /lib/libpthread.so.0 (0x0000ffffb335a000)
libffi.so.6 => /usr/lib/libffi.so.6 (0x0000ffffb3342000)