diff --git a/util/display-kms.c b/util/display-kms.c
index 8fc38a1d6820f5160c973618727d563191feb76f..74b59fd28b955e56cf6a3579fa9efb09b37a975e 100644 (file)
--- a/util/display-kms.c
+++ b/util/display-kms.c
uint32_t fb_id;
};
+static int global_fd = 0;
+static uint32_t used_planes = 0;
+static int ndisplays = 0;
+
static struct omap_bo *
alloc_bo(struct display *disp, uint32_t bpp, uint32_t width, uint32_t height,
uint32_t *bo_handle, uint32_t *pitch)
/* ensure we have the overlay setup: */
for (i = 0; i < disp_kms->connectors_count; i++) {
struct connector *connector = &disp_kms->connector[i];
- uint32_t used_planes = 0;
drmModeModeInfo *mode = connector->mode;
if (! mode) {
if (! disp_kms->ovr[i]) {
for (j = 0; j < disp_kms->plane_resources->count_planes; j++) {
+ if (used_planes & (1 << j)) {
+ continue;
+ }
drmModePlane *ovr = drmModeGetPlane(disp->fd,
disp_kms->plane_resources->planes[j]);
- if ((ovr->possible_crtcs & (1 << connector->pipe)) &&
- !(used_planes & (1 << j))) {
+ if (ovr->possible_crtcs & (1 << connector->pipe)) {
disp_kms->ovr[i] = ovr;
used_planes |= (1 << j);
break;
static void
close_kms(struct display *disp)
{
+ omap_device_del(disp->dev);
+ disp->dev = NULL;
+ if (used_planes) {
+ used_planes >>= 1;
+ }
+ if (--ndisplays == 0) {
+ close(global_fd);
+ }
}
static void
}
disp = &disp_kms->base;
- disp->fd = drmOpen("omapdrm", NULL);
- if (disp->fd < 0) {
- ERROR("could not open drm device: %s (%d)", strerror(errno), errno);
- goto fail;
+ if (!global_fd) {
+ global_fd = drmOpen("omapdrm", NULL);
+ if (global_fd < 0) {
+ ERROR("could not open drm device: %s (%d)", strerror(errno), errno);
+ goto fail;
+ }
}
+ disp->fd = global_fd;
+ ndisplays++; /* increment the number of displays counter */
+
disp->dev = omap_device_new(disp->fd);
if (!disp->dev) {
ERROR("couldn't create device");