summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-05-02 10:40:47 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2014-05-02 11:20:41 +0100
commit3123dec3dfc55fbca32d32eaaa8ac29396b28c49 (patch)
treeb8613f01f3f25566dc061bab7ff1124054793a2a
parent7b072074aa2b08c09a3d920d67f38ae73009ced6 (diff)
sna: Do not stash drmModeResPtr
In the near future we will be dealing with dynamic discovery of connectors, and so we cannot assume that the mode resources will be static for our lifetime. The first step is to not keep that struct around, but pull out the useful information and discard it. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/sna.h4
-rw-r--r--src/sna/sna_display.c84
-rw-r--r--src/sna/sna_display_fake.c4
-rw-r--r--src/sna/sna_driver.c2
4 files changed, 50 insertions, 44 deletions
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 8522a49b..cf9a4d57 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -270,14 +270,14 @@ struct sna {
PixmapPtr freed_pixmap;
struct sna_mode {
- drmModeResPtr kmode;
-
DamagePtr shadow_damage;
struct kgem_bo *shadow;
int shadow_active;
int shadow_flip;
int front_active;
+ int max_crtc_width, max_crtc_height;
+
unsigned num_real_crtc;
unsigned num_real_output;
unsigned num_fake;
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 624c579c..ae072524 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1213,13 +1213,12 @@ static bool use_shadow(struct sna *sna, xf86CrtcPtr crtc)
return true;
}
- if (sna->scrn->virtualX > sna->mode.kmode->max_width ||
- sna->scrn->virtualY > sna->mode.kmode->max_height) {
+ if (sna->scrn->virtualX > sna->mode.max_crtc_width ||
+ sna->scrn->virtualY > sna->mode.max_crtc_height) {
DBG(("%s: framebuffer too large (%dx%d) > (%dx%d)\n",
__FUNCTION__,
sna->scrn->virtualX, sna->scrn->virtualY,
- sna->mode.kmode->max_width,
- sna->mode.kmode->max_height));
+ sna->mode.max_crtc_width, sna->mode.max_crtc_height));
return true;
}
@@ -1571,8 +1570,8 @@ sna_crtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
outputs_for_crtc(crtc, outputs, sizeof(outputs)), sna_crtc->pipe,
x, y, rotation_to_str(rotation), reflection_to_str(rotation));
- assert(mode->HDisplay <= sna->mode.kmode->max_width &&
- mode->VDisplay <= sna->mode.kmode->max_height);
+ assert(mode->HDisplay <= sna->mode.max_crtc_width &&
+ mode->VDisplay <= sna->mode.max_crtc_height);
#if HAS_GAMMA
drmModeCrtcSetGamma(sna->kgem.fd, sna_crtc->id,
@@ -1800,20 +1799,20 @@ sna_crtc_init__cursor(struct sna *sna, struct sna_crtc *crtc)
}
static bool
-sna_crtc_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
+sna_crtc_init(ScrnInfoPtr scrn, int id)
{
struct sna *sna = to_sna(scrn);
xf86CrtcPtr crtc;
struct sna_crtc *sna_crtc;
struct drm_i915_get_pipe_from_crtc_id get_pipe;
- DBG(("%s(%d)\n", __FUNCTION__, num));
+ DBG(("%s(%d)\n", __FUNCTION__, id));
sna_crtc = calloc(sizeof(struct sna_crtc), 1);
if (sna_crtc == NULL)
return false;
- sna_crtc->id = mode->kmode->crtcs[num];
+ sna_crtc->id = id;
sna_crtc->dpms_mode = -1;
VG_CLEAR(get_pipe);
@@ -1844,8 +1843,8 @@ sna_crtc_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
sna_crtc_init__cursor(sna, sna_crtc);
crtc->driver_private = sna_crtc;
- DBG(("%s: attached crtc[%d] id=%d, pipe=%d\n",
- __FUNCTION__, num, sna_crtc->id, sna_crtc->pipe));
+ DBG(("%s: attached crtc[%d] pipe=%d\n",
+ __FUNCTION__, id, sna_crtc->pipe));
return true;
}
@@ -1953,9 +1952,9 @@ sna_output_mode_valid(xf86OutputPtr output, DisplayModePtr mode)
struct sna_output *sna_output = output->driver_private;
struct sna *sna = to_sna(output->scrn);
- if (mode->HDisplay > sna->mode.kmode->max_width)
+ if (mode->HDisplay > sna->mode.max_crtc_width)
return MODE_VIRTUAL_X;
- if (mode->VDisplay > sna->mode.kmode->max_height)
+ if (mode->VDisplay > sna->mode.max_crtc_height)
return MODE_VIRTUAL_Y;
/* Check that we can successfully pin this into the global GTT */
@@ -2636,7 +2635,7 @@ output_ignored(ScrnInfoPtr scrn, const char *name)
}
static bool
-sna_output_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
+sna_output_init(ScrnInfoPtr scrn, int id, drmModeResPtr res)
{
struct sna *sna = to_sna(scrn);
xf86OutputPtr output;
@@ -2651,12 +2650,12 @@ sna_output_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
COMPILE_TIME_ASSERT(sizeof(struct drm_mode_get_connector) <= sizeof(compat_conn.pad));
- DBG(("%s(num=%d)\n", __FUNCTION__, num));
+ DBG(("%s(%d)\n", __FUNCTION__, id));
VG_CLEAR(compat_conn);
VG_CLEAR(enc);
- compat_conn.conn.connector_id = mode->kmode->connectors[num];
+ compat_conn.conn.connector_id = id;
compat_conn.conn.count_props = 0;
compat_conn.conn.count_modes = 1; /* skip detect */
compat_conn.conn.modes_ptr = (uintptr_t)&dummy;
@@ -2761,8 +2760,8 @@ sna_output_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
output->subpixel_order = subpixel_conv_table[compat_conn.conn.subpixel];
output->driver_private = sna_output;
- for (i = 0; i < mode->kmode->count_encoders; i++) {
- if (enc.encoder_id == mode->kmode->encoders[i]) {
+ for (i = 0; i < res->count_encoders; i++) {
+ if (enc.encoder_id == res->encoders[i]) {
sna_output->encoder_idx = i;
break;
}
@@ -2780,8 +2779,8 @@ sna_output_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
if (compat_conn.conn.connection != DRM_MODE_DISCONNECTED)
output->crtc = (void *)(uintptr_t)enc.crtc_id;
- DBG(("%s: created output '%s' %d [%ld] (possible crtc:%x, possible clones:%x), edid=%d, dpms=%d, crtc=%lu\n",
- __FUNCTION__, name, num, (long)sna_output->id,
+ DBG(("%s: created output '%s' %d (possible crtc:%x, possible clones:%x), edid=%d, dpms=%d, crtc=%lu\n",
+ __FUNCTION__, name, id,
(uint32_t)output->possible_crtcs,
(uint32_t)output->possible_clones,
sna_output->edid_idx, sna_output->dpms_id,
@@ -3683,7 +3682,7 @@ sna_cursor_pre_init(struct sna *sna)
sna->cursor.max_size = 0;
}
- sna->cursor.num_stash = -sna->mode.kmode->count_crtcs;
+ sna->cursor.num_stash = -sna->mode.num_real_crtc;
xf86DrvMsg(sna->scrn->scrnIndex, X_PROBED,
"Using a maximum size of %dx%d for hardware cursors\n",
@@ -3702,7 +3701,7 @@ sna_cursor_close(struct sna *sna)
free(cursor);
}
- sna->cursor.num_stash = -sna->mode.kmode->count_crtcs;
+ sna->cursor.num_stash = -sna->mode.num_real_crtc;
}
bool
@@ -4223,7 +4222,7 @@ sna_crtc_config_notify(ScreenPtr screen)
bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna)
{
- struct sna_mode *mode = &sna->mode;
+ drmModeResPtr res;
int num_fake = 0;
int i;
@@ -4235,32 +4234,43 @@ bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna)
if (!xf86GetOptValInteger(sna->Options, OPTION_VIRTUAL, &num_fake))
num_fake = 1;
- mode->kmode = drmModeGetResources(sna->kgem.fd);
- if (mode->kmode &&
- (mode->kmode->count_crtcs == 0 ||
- mode->kmode->count_connectors == 0)) {
- drmModeFreeResources(mode->kmode);
- mode->kmode = NULL;
+ res = drmModeGetResources(sna->kgem.fd);
+ if (res &&
+ (res->count_crtcs == 0 || res->count_connectors == 0)) {
+ drmModeFreeResources(res);
+ res = NULL;
}
- if (mode->kmode) {
- assert(mode->kmode->count_crtcs);
- assert(mode->kmode->count_connectors);
+ if (res) {
+ xf86CrtcConfigPtr xf86_config;
+
+ assert(res->count_crtcs);
+ assert(res->count_connectors);
sna_cursor_pre_init(sna);
xf86CrtcConfigInit(scrn, &sna_mode_funcs);
- XF86_CRTC_CONFIG_PTR(scrn)->xf86_crtc_notify = sna_crtc_config_notify;
- for (i = 0; i < mode->kmode->count_crtcs; i++)
- if (!sna_crtc_init(scrn, mode, i))
+ xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ xf86_config->xf86_crtc_notify = sna_crtc_config_notify;
+
+ for (i = 0; i < res->count_crtcs; i++)
+ if (!sna_crtc_init(scrn, res->crtcs[i]))
return false;
- for (i = 0; i < mode->kmode->count_connectors; i++)
- if (!sna_output_init(scrn, mode, i))
+ for (i = 0; i < res->count_connectors; i++)
+ if (!sna_output_init(scrn, res->connectors[i], res))
return false;
+ sna->mode.num_real_crtc = xf86_config->num_crtc;
+ sna->mode.num_real_output = xf86_config->num_output;
+
if (!xf86IsEntityShared(scrn->entityList[0]))
sna_mode_compute_possible_outputs(scrn);
+
+ sna->mode.max_crtc_width = res->max_width;
+ sna->mode.max_crtc_height = res->max_height;
+
+ drmModeFreeResources(res);
} else {
if (num_fake == 0)
num_fake = 1;
diff --git a/src/sna/sna_display_fake.c b/src/sna/sna_display_fake.c
index 8604d200..08214788 100644
--- a/src/sna/sna_display_fake.c
+++ b/src/sna/sna_display_fake.c
@@ -340,15 +340,11 @@ err:
bool sna_mode_fake_init(struct sna *sna, int num_fake)
{
- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(sna->scrn);
bool ret;
if (num_fake == 0)
return true;
- sna->mode.num_real_crtc = xf86_config->num_crtc;
- sna->mode.num_real_output = xf86_config->num_output;
-
if (sna->mode.num_real_crtc == 0)
xf86CrtcConfigInit(sna->scrn, &sna_mode_funcs);
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 5f885137..673e2a5c 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -1032,7 +1032,7 @@ sna_screen_init(SCREEN_INIT_ARGS_DECL)
if (!miCreateDefColormap(screen))
return FALSE;
- if (sna->mode.kmode &&
+ if (sna->mode.num_real_crtc &&
!xf86HandleColormaps(screen, 256, 8, sna_load_palette, NULL,
CMAP_RELOAD_ON_MODE_SWITCH |
CMAP_PALETTED_TRUECOLOR))