struct sp_bo *create_sp_bo(struct sp_dev *dev, uint32_t width, uint32_t height, uint32_t depth, uint32_t bpp, uint32_t format, uint32_t flags) { int ret; struct drm_mode_create_dumb cd; struct sp_bo *bo; memset(&cd, 0, sizeof(cd)); bo = calloc(1, sizeof(*bo)); if (!bo) return NULL; cd.height = height; cd.width = width; cd.bpp = bpp; cd.flags = flags; ret = drmIoctl(dev->fd, DRM_IOCTL_MODE_CREATE_DUMB, &cd); if (ret) { printf("failed to create sp_bo %d\n", ret); goto err; } bo->dev = dev; bo->width = width; bo->height = height; bo->depth = depth; bo->bpp = bpp; bo->format = format; bo->flags = flags; bo->handle = cd.handle; bo->pitch = cd.pitch; bo->size = cd.size; ret = add_fb_sp_bo(bo, format); if (ret) { printf("failed to add fb ret=%d\n", ret); goto err; } ret = map_sp_bo(bo); if (ret) { printf("failed to map bo ret=%d\n", ret); goto err; } return bo; err: free_sp_bo(bo); return NULL; }
void destroy_sp_dev(struct sp_dev *dev) { int i; if (dev->planes) { for (i = 0; i < dev->num_planes; i++) { if (dev->planes[i].in_use) put_sp_plane(&dev->planes[i]); if (dev->planes[i].plane) drmModeFreePlane(dev->planes[i].plane); if (dev->planes[i].bo) free_sp_bo(dev->planes[i].bo); } free(dev->planes); } if (dev->crtcs) { for (i = 0; i < dev->num_crtcs; i++) { if (dev->crtcs[i].crtc) drmModeFreeCrtc(dev->crtcs[i].crtc); if (dev->crtcs[i].scanout) free_sp_bo(dev->crtcs[i].scanout); } free(dev->crtcs); } if (dev->encoders) { for (i = 0; i < dev->num_encoders; i++) { if (dev->encoders[i]) drmModeFreeEncoder(dev->encoders[i]); } free(dev->encoders); } if (dev->connectors) { for (i = 0; i < dev->num_connectors; i++) { if (dev->connectors[i]) drmModeFreeConnector(dev->connectors[i]); } free(dev->connectors); } close(dev->fd); free(dev); }
void put_sp_plane(struct sp_plane *plane) { drmModePlanePtr p; /* Get the latest plane information (most notably the crtc_id) */ p = drmModeGetPlane(plane->dev->fd, plane->plane->plane_id); if (p) plane->plane = p; if (plane->plane->crtc_id) drmModeSetPlane(plane->dev->fd, plane->plane->plane_id, plane->plane->crtc_id, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); if (plane->bo) { free_sp_bo(plane->bo); plane->bo = NULL; } plane->in_use = 0; }