backends/native: Let the monitor manager manage KMS modes

Let MetaMonitorManagerKms manage KMS modes. This lets us pass less
state to MetaRendererNative. Instead let MetaMonitorManager tell the
monitor manager when it should set the mode and with what framebuffer.

https://bugzilla.gnome.org/show_bug.cgi?id=768976
This commit is contained in:
Jonas Ådahl
2016-05-11 16:26:34 +08:00
parent ec1da588cf
commit 12ef1a5e4b
4 changed files with 82 additions and 42 deletions

View File

@ -47,6 +47,7 @@
#include <xf86drm.h>
#include "backends/meta-backend-private.h"
#include "backends/native/meta-monitor-manager-kms.h"
#include "backends/native/meta-renderer-native.h"
#include "cogl/cogl.h"
@ -332,22 +333,13 @@ fail:
static void
setup_crtc_modes (CoglDisplay *display, int fb_id)
{
CoglRendererEGL *egl_renderer = display->renderer->winsys;
MetaRendererNative *renderer_native = egl_renderer->platform;
GList *l;
MetaBackend *backend = meta_get_backend ();
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
MetaMonitorManagerKms *monitor_manager_kms =
META_MONITOR_MANAGER_KMS (monitor_manager);
for (l = renderer_native->crtcs; l; l = l->next)
{
CoglKmsCrtc *crtc = l->data;
int ret = drmModeSetCrtc (renderer_native->kms_fd,
crtc->id,
fb_id, crtc->x, crtc->y,
crtc->connectors, crtc->count,
crtc->count ? &crtc->mode : NULL);
if (ret)
g_warning ("Failed to set crtc mode %s: %m", crtc->mode.name);
}
meta_monitor_manager_kms_apply_crtc_modes (monitor_manager_kms, fb_id);
}
static void
@ -363,7 +355,7 @@ flip_all_crtcs (CoglDisplay *display, CoglFlipKMS *flip, int fb_id)
CoglKmsCrtc *crtc = l->data;
int ret = 0;
if (crtc->count == 0 || crtc->ignore)
if (!crtc->connected || crtc->ignore)
continue;
needs_flip = TRUE;
@ -392,7 +384,6 @@ flip_all_crtcs (CoglDisplay *display, CoglFlipKMS *flip, int fb_id)
static void
crtc_free (CoglKmsCrtc *crtc)
{
g_free (crtc->connectors);
g_slice_free (CoglKmsCrtc, crtc);
}
@ -404,7 +395,6 @@ crtc_copy (CoglKmsCrtc *from)
new = g_slice_new (CoglKmsCrtc);
*new = *from;
new->connectors = g_memdup (from->connectors, from->count * sizeof(uint32_t));
return new;
}