]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - glsdk/omapdrmtest.git/blobdiff - util/display-kms.c
display-kms: Fix compile warning
[glsdk/omapdrmtest.git] / util / display-kms.c
index a502fbf1b302055d363b808f8d94b2f5a2307d04..c5b3c50fce5e613287586ea202be87df491fe73a 100644 (file)
@@ -20,7 +20,6 @@
 #endif
 
 #include "util.h"
-#include <libdce.h>
 
 #include <xf86drmMode.h>
 
@@ -56,6 +55,8 @@ struct display_kms {
        drmModeResPtr resources;
        drmModePlaneRes *plane_resources;
        struct buffer *current;
+       bool no_master;
+       int mastership;
 };
 
 #define to_buffer_kms(x) container_of(x, struct buffer_kms, base)
@@ -195,8 +196,10 @@ free_buffers(struct display *disp, uint32_t n)
        uint32_t i;
        for (i = 0; i < n; i++) {
                 if (disp->buf[i]) {
+                       close(disp->buf[i]->fd[0]);
                        omap_bo_del(disp->buf[i]->bo[0]);
                        if(disp->multiplanar){
+                               close(disp->buf[i]->fd[1]);
                                omap_bo_del(disp->buf[i]->bo[1]);
                        }
                 }
@@ -337,12 +340,10 @@ int
 get_overlay_plane(struct display *disp, struct buffer *buf)
 {
        struct display_kms *disp_kms = to_display_kms(disp);
-       uint32_t i, ret;
+       uint32_t i;
+       int ret;
 
        for (i = 0; i < disp_kms->connectors_count; i++) {
-               struct connector *connector = &disp_kms->connector[i];
-               drmModeModeInfo *mode = connector->mode;
-
                disp_kms->ovr[i] = drmModeGetPlane(disp->fd,
                                        disp_kms->plane_resources->planes[1]);
 
@@ -362,6 +363,7 @@ post_vid_buffer(struct display *disp, struct buffer *buf,
 {
        struct display_kms *disp_kms = to_display_kms(disp);
        struct buffer_kms *buf_kms = to_buffer_kms(buf);
+       drmModePlane *ovr;
        int ret = 0;
        uint32_t i, j;
 
@@ -380,7 +382,7 @@ post_vid_buffer(struct display *disp, struct buffer *buf,
                                if (used_planes & (1 << j)) {
                                        continue;
                                }
-                               drmModePlane *ovr = drmModeGetPlane(disp->fd,
+                               ovr = drmModeGetPlane(disp->fd,
                                                disp_kms->plane_resources->planes[j]);
                                if (ovr->possible_crtcs & (1 << connector->pipe)) {
                                        disp_kms->ovr[i] = ovr;
@@ -398,7 +400,6 @@ post_vid_buffer(struct display *disp, struct buffer *buf,
                }
 
                if(buf->noScale) {
-printf("plane id overlay thread = %d\n", disp_kms->ovr[i]->plane_id);
                        ret = drmModeSetPlane(disp->fd, disp_kms->ovr[i]->plane_id,
                                connector->crtc, buf_kms->fb_id, 0,
                                /* Use x and y as co-ordinates of overlay */
@@ -406,7 +407,6 @@ printf("plane id overlay thread = %d\n", disp_kms->ovr[i]->plane_id);
                                /* Consider source x and y is 0 always */
                                0, 0, w << 16, h << 16);
                } else {
-printf("plane id fullscreeen thread = %d\n", disp_kms->ovr[i]->plane_id);
                        ret = drmModeSetPlane(disp->fd, disp_kms->ovr[i]->plane_id,
                                connector->crtc, buf_kms->fb_id, 0,
                                /* make video fullscreen: */
@@ -420,6 +420,15 @@ printf("plane id fullscreeen thread = %d\n", disp_kms->ovr[i]->plane_id);
                }
        }
 
+       if (disp_kms->no_master && disp_kms->mastership) {
+               /* Drop mastership after the first buffer on each plane is
+                * displayed. This will lock these planes for us and allow
+                * others to consume remaining
+                */
+               disp_kms->mastership = 0;
+               drmDropMaster(disp->fd);
+       }
+
        return ret;
 }
 
@@ -485,20 +494,45 @@ connector_find_mode(struct display *disp, struct connector *c)
        }
 
        /* Now get the encoder */
-       for (i = 0; i < disp_kms->resources->count_encoders; i++) {
+       for (i = 0; i < connector->count_encoders; i++) {
                c->encoder = drmModeGetEncoder(disp->fd,
-                               disp_kms->resources->encoders[i]);
+                               connector->encoders[i]);
 
                if (!c->encoder) {
                        ERROR("could not get encoder %i: %s",
                                        disp_kms->resources->encoders[i], strerror(errno));
-                       drmModeFreeEncoder(c->encoder);
                        continue;
                }
 
-               if (c->encoder->encoder_id  == connector->encoder_id)
-                       break;
+               /* Take the fisrt one, if none is assigned */
+               if (!connector->encoder_id)
+               {
+                       connector->encoder_id = c->encoder->encoder_id;
+               }
 
+               if (c->encoder->encoder_id  == connector->encoder_id) {
+                       /* find the first valid CRTC if not assigned */
+                       if (!c->encoder->crtc_id)
+                       {
+                               int k;
+                               for (k = 0; k < disp_kms->resources->count_crtcs; ++k) {
+                                       /* check whether this CRTC works with the encoder */
+                                       if (!(c->encoder->possible_crtcs & (1 << k)))
+                                               continue;
+
+                                       c->encoder->crtc_id = disp_kms->resources->crtcs[k];
+                                       break;
+                               }
+
+                               if (!c->encoder->crtc_id)
+                               {
+                                       ERROR("Encoder(%d): no CRTC found!\n", c->encoder->encoder_id);
+                                       drmModeFreeEncoder(c->encoder);
+                                       continue;
+                               }
+                       }
+                       break;
+               }
                drmModeFreeEncoder(c->encoder);
        }
 
@@ -529,6 +563,7 @@ disp_kms_open(int argc, char **argv)
 {
        struct display_kms *disp_kms = NULL;
        struct display *disp;
+       struct buffer **bufs;
        int i;
 
        disp_kms = calloc(1, sizeof(*disp_kms));
@@ -625,6 +660,9 @@ disp_kms_open(int argc, char **argv)
                                goto fail;
                        }
                        disp_kms->bo_flags |= OMAP_BO_SCANOUT;
+               } else if (!strcmp("-nm", argv[i])) {
+                       disp_kms->no_master = true;
+                       disp_kms->mastership = 1;
                } else {
                        /* ignore */
                        continue;
@@ -649,6 +687,9 @@ disp_kms_open(int argc, char **argv)
        MSG("using %d connectors, %dx%d display, multiplanar: %d",
                        disp_kms->connectors_count, disp->width, disp->height, disp->multiplanar);
 
+       bufs = disp_get_buffers(disp, 1);
+       disp_post_buffer(disp, bufs[0]);
+
        return disp;
 
 fail: