mirror of
https://github.com/brl/mutter.git
synced 2025-02-18 06:04:10 +00:00
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:
parent
ec1da588cf
commit
12ef1a5e4b
@ -1008,7 +1008,6 @@ meta_monitor_manager_kms_set_power_save_mode (MetaMonitorManager *manager,
|
|||||||
static void
|
static void
|
||||||
crtc_free (CoglKmsCrtc *crtc)
|
crtc_free (CoglKmsCrtc *crtc)
|
||||||
{
|
{
|
||||||
g_free (crtc->connectors);
|
|
||||||
g_slice_free (CoglKmsCrtc, crtc);
|
g_slice_free (CoglKmsCrtc, crtc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1087,12 +1086,6 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
|||||||
if (crtc_info->mode == NULL)
|
if (crtc_info->mode == NULL)
|
||||||
{
|
{
|
||||||
cogl_crtc->id = crtc->crtc_id;
|
cogl_crtc->id = crtc->crtc_id;
|
||||||
cogl_crtc->x = 0;
|
|
||||||
cogl_crtc->y = 0;
|
|
||||||
cogl_crtc->count = 0;
|
|
||||||
memset (&cogl_crtc->mode, 0, sizeof (drmModeModeInfo));
|
|
||||||
cogl_crtc->connectors = NULL;
|
|
||||||
cogl_crtc->count = 0;
|
|
||||||
|
|
||||||
crtc->rect.x = 0;
|
crtc->rect.x = 0;
|
||||||
crtc->rect.y = 0;
|
crtc->rect.y = 0;
|
||||||
@ -1109,11 +1102,11 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
|||||||
|
|
||||||
mode = crtc_info->mode;
|
mode = crtc_info->mode;
|
||||||
|
|
||||||
|
n_connectors = crtc_info->outputs->len;
|
||||||
|
connectors = g_new (uint32_t, n_connectors);
|
||||||
|
|
||||||
cogl_crtc->id = crtc->crtc_id;
|
cogl_crtc->id = crtc->crtc_id;
|
||||||
cogl_crtc->x = crtc_info->x;
|
cogl_crtc->connected = n_connectors > 0;
|
||||||
cogl_crtc->y = crtc_info->y;
|
|
||||||
cogl_crtc->count = n_connectors = crtc_info->outputs->len;
|
|
||||||
cogl_crtc->connectors = connectors = g_new (uint32_t, n_connectors);
|
|
||||||
|
|
||||||
for (j = 0; j < n_connectors; j++)
|
for (j = 0; j < n_connectors; j++)
|
||||||
{
|
{
|
||||||
@ -1125,9 +1118,6 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
|||||||
output->crtc = crtc;
|
output->crtc = crtc;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy (&cogl_crtc->mode, crtc_info->mode->driver_private,
|
|
||||||
sizeof (drmModeModeInfo));
|
|
||||||
|
|
||||||
if (meta_monitor_transform_is_rotated (crtc_info->transform))
|
if (meta_monitor_transform_is_rotated (crtc_info->transform))
|
||||||
{
|
{
|
||||||
width = mode->height;
|
width = mode->height;
|
||||||
@ -1177,12 +1167,6 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
|||||||
g_ptr_array_add (cogl_crtcs, cogl_crtc);
|
g_ptr_array_add (cogl_crtcs, cogl_crtc);
|
||||||
|
|
||||||
cogl_crtc->id = crtc->crtc_id;
|
cogl_crtc->id = crtc->crtc_id;
|
||||||
cogl_crtc->x = 0;
|
|
||||||
cogl_crtc->y = 0;
|
|
||||||
cogl_crtc->count = 0;
|
|
||||||
memset (&cogl_crtc->mode, 0, sizeof (drmModeModeInfo));
|
|
||||||
cogl_crtc->connectors = NULL;
|
|
||||||
cogl_crtc->count = 0;
|
|
||||||
|
|
||||||
crtc->rect.x = 0;
|
crtc->rect.x = 0;
|
||||||
crtc->rect.y = 0;
|
crtc->rect.y = 0;
|
||||||
@ -1314,6 +1298,72 @@ meta_monitor_manager_kms_init (MetaMonitorManagerKms *manager_kms)
|
|||||||
manager_kms->desktop_settings = g_settings_new ("org.gnome.desktop.interface");
|
manager_kms->desktop_settings = g_settings_new ("org.gnome.desktop.interface");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
get_crtc_connectors (MetaMonitorManager *manager,
|
||||||
|
MetaCRTC *crtc,
|
||||||
|
uint32_t **connectors,
|
||||||
|
unsigned int *n_connectors)
|
||||||
|
{
|
||||||
|
GArray *connectors_array = NULL;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < manager->n_outputs; i++)
|
||||||
|
{
|
||||||
|
MetaOutput *output = &manager->outputs[i];
|
||||||
|
|
||||||
|
if (output->crtc == crtc)
|
||||||
|
{
|
||||||
|
if (!connectors_array)
|
||||||
|
connectors_array = g_array_new (FALSE, FALSE, sizeof (uint32_t));
|
||||||
|
g_array_append_val (connectors_array, output->winsys_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (connectors_array)
|
||||||
|
{
|
||||||
|
*connectors = (uint32_t *) connectors_array->data;
|
||||||
|
*n_connectors = connectors_array->len;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*connectors = NULL;
|
||||||
|
*n_connectors = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_monitor_manager_kms_apply_crtc_modes (MetaMonitorManagerKms *manager_kms,
|
||||||
|
uint32_t fb_id)
|
||||||
|
{
|
||||||
|
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_kms);
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < manager->n_crtcs; i++)
|
||||||
|
{
|
||||||
|
MetaCRTC *crtc = &manager->crtcs[i];
|
||||||
|
uint32_t *connectors;
|
||||||
|
unsigned int n_connectors;
|
||||||
|
drmModeModeInfo *mode;
|
||||||
|
|
||||||
|
get_crtc_connectors (manager, crtc, &connectors, &n_connectors);
|
||||||
|
|
||||||
|
if (connectors)
|
||||||
|
mode = crtc->current_mode->driver_private;
|
||||||
|
else
|
||||||
|
mode = NULL;
|
||||||
|
|
||||||
|
if (drmModeSetCrtc (manager_kms->fd,
|
||||||
|
crtc->crtc_id,
|
||||||
|
fb_id,
|
||||||
|
crtc->rect.x, crtc->rect.y,
|
||||||
|
connectors, n_connectors,
|
||||||
|
mode) != 0)
|
||||||
|
g_warning ("Failed to set CRTC mode %s: %m", crtc->current_mode->name);
|
||||||
|
|
||||||
|
g_free (connectors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_manager_kms_dispose (GObject *object)
|
meta_monitor_manager_kms_dispose (GObject *object)
|
||||||
{
|
{
|
||||||
|
@ -37,4 +37,7 @@ typedef struct _MetaMonitorManagerKms MetaMonitorManagerKms;
|
|||||||
|
|
||||||
GType meta_monitor_manager_kms_get_type (void);
|
GType meta_monitor_manager_kms_get_type (void);
|
||||||
|
|
||||||
|
void meta_monitor_manager_kms_apply_crtc_modes (MetaMonitorManagerKms *manager_kms,
|
||||||
|
uint32_t fb_id);
|
||||||
|
|
||||||
#endif /* META_MONITOR_MANAGER_KMS_H */
|
#endif /* META_MONITOR_MANAGER_KMS_H */
|
||||||
|
@ -47,6 +47,7 @@
|
|||||||
#include <xf86drm.h>
|
#include <xf86drm.h>
|
||||||
|
|
||||||
#include "backends/meta-backend-private.h"
|
#include "backends/meta-backend-private.h"
|
||||||
|
#include "backends/native/meta-monitor-manager-kms.h"
|
||||||
#include "backends/native/meta-renderer-native.h"
|
#include "backends/native/meta-renderer-native.h"
|
||||||
#include "cogl/cogl.h"
|
#include "cogl/cogl.h"
|
||||||
|
|
||||||
@ -332,22 +333,13 @@ fail:
|
|||||||
static void
|
static void
|
||||||
setup_crtc_modes (CoglDisplay *display, int fb_id)
|
setup_crtc_modes (CoglDisplay *display, int fb_id)
|
||||||
{
|
{
|
||||||
CoglRendererEGL *egl_renderer = display->renderer->winsys;
|
MetaBackend *backend = meta_get_backend ();
|
||||||
MetaRendererNative *renderer_native = egl_renderer->platform;
|
MetaMonitorManager *monitor_manager =
|
||||||
GList *l;
|
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)
|
meta_monitor_manager_kms_apply_crtc_modes (monitor_manager_kms, fb_id);
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -363,7 +355,7 @@ flip_all_crtcs (CoglDisplay *display, CoglFlipKMS *flip, int fb_id)
|
|||||||
CoglKmsCrtc *crtc = l->data;
|
CoglKmsCrtc *crtc = l->data;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (crtc->count == 0 || crtc->ignore)
|
if (!crtc->connected || crtc->ignore)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
needs_flip = TRUE;
|
needs_flip = TRUE;
|
||||||
@ -392,7 +384,6 @@ flip_all_crtcs (CoglDisplay *display, CoglFlipKMS *flip, int fb_id)
|
|||||||
static void
|
static void
|
||||||
crtc_free (CoglKmsCrtc *crtc)
|
crtc_free (CoglKmsCrtc *crtc)
|
||||||
{
|
{
|
||||||
g_free (crtc->connectors);
|
|
||||||
g_slice_free (CoglKmsCrtc, crtc);
|
g_slice_free (CoglKmsCrtc, crtc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -404,7 +395,6 @@ crtc_copy (CoglKmsCrtc *from)
|
|||||||
new = g_slice_new (CoglKmsCrtc);
|
new = g_slice_new (CoglKmsCrtc);
|
||||||
|
|
||||||
*new = *from;
|
*new = *from;
|
||||||
new->connectors = g_memdup (from->connectors, from->count * sizeof(uint32_t));
|
|
||||||
|
|
||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
|
@ -32,11 +32,8 @@
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
uint32_t x, y;
|
|
||||||
drmModeModeInfo mode;
|
|
||||||
|
|
||||||
uint32_t *connectors;
|
gboolean connected;
|
||||||
uint32_t count;
|
|
||||||
|
|
||||||
CoglBool ignore;
|
CoglBool ignore;
|
||||||
} CoglKmsCrtc;
|
} CoglKmsCrtc;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user