diff --git a/util/display-kms.c b/util/display-kms.c
index 3c9ed10e15f75b032a1730416bcb3ea9e10054da..c5b3c50fce5e613287586ea202be87df491fe73a 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)
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]);
{
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;
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;
}
}
+ 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: