diff --git a/util/display-kms.c b/util/display-kms.c
index c0730bc55ae04fcdcf13d0c9902247383109be78..89c480e25e57e7a58464e408084f2b660895d4d4 100644 (file)
--- a/util/display-kms.c
+++ b/util/display-kms.c
#endif
#include "util.h"
-#include <libdce.h>
#include <xf86drmMode.h>
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)
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]);
}
}
}
}
+ 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;
}
}
/* 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);
}
{
struct display_kms *disp_kms = NULL;
struct display *disp;
+ struct buffer **bufs;
int i;
disp_kms = calloc(1, sizeof(*disp_kms));
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;
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: