Codebase list kmscube / 13bd303
common: use drmModeAddFB2* API over the legacy drmModeAddFB one Note: nothing happens here yet since LINEAR == 0. Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Reviewed-by: Emil Velikov <emil.velikov@collabora.com> Ben Widawsky 7 years ago
3 changed file(s) with 42 addition(s) and 12 deletion(s). Raw diff Collapse all Expand all
5353 gbm.surface = gbm_surface_create(gbm.dev, w, h,
5454 GBM_FORMAT_XRGB8888,
5555 GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING);
56 if (!gbm.surface) {
57 printf("failed to create gbm surface\n");
58 return NULL;
59 }
6056 #else
6157 uint64_t *mods;
6258 int count = get_modifiers(&mods);
6460 GBM_FORMAT_XRGB8888, mods, count);
6561 #endif
6662
63 if (!gbm.surface) {
64 printf("failed to create gbm surface\n");
65 return NULL;
66 }
67
6768 gbm.width = w;
6869 gbm.height = h;
6970
7071 return &gbm;
7172 }
72
7373
7474 int init_egl(struct egl *egl, const struct gbm *gbm)
7575 {
3434 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
3535
3636 # Obtain compiler/linker options for depedencies
37 PKG_CHECK_MODULES(DRM, libdrm)
37 PKG_CHECK_MODULES(DRM, [libdrm >= 2.4.71])
3838 PKG_CHECK_MODULES(GBM, gbm >= 13.0)
3939 PKG_CHECK_MODULES(EGL, egl)
4040 PKG_CHECK_MODULES(GLES2, glesv2)
4545 {
4646 int drm_fd = gbm_device_get_fd(gbm_bo_get_device(bo));
4747 struct drm_fb *fb = gbm_bo_get_user_data(bo);
48 uint32_t width, height, stride, handle;
49 int ret;
48 uint32_t width, height,
49 strides[4] = {0}, handles[4] = {0},
50 offsets[4] = {0}, flags = 0;
51 int ret = -1;
5052
5153 if (fb)
5254 return fb;
5658
5759 width = gbm_bo_get_width(bo);
5860 height = gbm_bo_get_height(bo);
59 stride = gbm_bo_get_stride(bo);
60 handle = gbm_bo_get_handle(bo).u32;
61
62 ret = drmModeAddFB(drm_fd, width, height, 24, 32, stride, handle, &fb->fb_id);
61
62 #ifdef HAVE_GBM_MODIFIERS
63 uint64_t modifiers[4] = {0};
64 modifiers[0] = gbm_bo_get_modifier(bo);
65 const int num_planes = gbm_bo_get_plane_count(bo);
66 for (int i = 0; i < num_planes; i++) {
67 strides[i] = gbm_bo_get_stride_for_plane(bo, i);
68 handles[i] = gbm_bo_get_handle(bo).u32;
69 offsets[i] = gbm_bo_get_offset(bo, i);
70 modifiers[i] = modifiers[0];
71 }
72
73 if (modifiers[0]) {
74 flags = DRM_MODE_FB_MODIFIERS;
75 printf("Using modifier %lx\n", modifiers[0]);
76 }
77
78 ret = drmModeAddFB2WithModifiers(drm_fd, width, height,
79 DRM_FORMAT_XRGB8888, handles, strides, offsets,
80 modifiers, &fb->fb_id, flags);
81 #endif
82 if (ret) {
83 if (flags)
84 fprintf(stderr, "Modifiers failed!\n");
85
86 memcpy(handles, (uint32_t [4]){gbm_bo_get_handle(bo).u32,0,0,0}, 16);
87 memcpy(strides, (uint32_t [4]){gbm_bo_get_stride(bo),0,0,0}, 16);
88 memset(offsets, 0, 16);
89 ret = drmModeAddFB2(drm_fd, width, height, DRM_FORMAT_XRGB8888,
90 handles, strides, offsets, &fb->fb_id, 0);
91 }
92
6393 if (ret) {
6494 printf("failed to create fb: %s\n", strerror(errno));
6595 free(fb);