xf86-video-intel: src/sna/sna_display.c

Chris Wilson ickle at kemper.freedesktop.org
Fri Feb 14 17:37:16 CET 2014


 src/sna/sna_display.c |  199 +++++++++++++++++++++++++++++---------------------
 1 file changed, 117 insertions(+), 82 deletions(-)

New commits:
commit 5f8714335729b4fbbb33d89dbaf0f13aa3d8427b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Fri Feb 14 16:18:34 2014 +0000

    sna: Reorganise native rotation ioctls to compile on old Linux
    
    It is not just the BSDs that lack these ioctls in their userspace
    headers, but everything older than about a year...
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index e78f1f3..8d2ec8a 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -883,9 +883,109 @@ sna_crtc_force_outputs_off(xf86CrtcPtr crtc)
 	to_sna_crtc(crtc)->dpms_mode = DPMSModeOff;
 }
 
+#define LOCAL_MODE_OBJECT_CRTC 0xcccccccc
+#define LOCAL_MODE_OBJECT_PLANE 0xeeeeeeee
+static void
+rotation_init(struct sna *sna, struct rotation *r, uint32_t obj_id, uint32_t obj_type)
+{
+#if USE_ROTATION
+#define LOCAL_IOCTL_MODE_OBJ_GETPROPERTIES DRM_IOWR(0xB9, struct local_mode_obj_get_properties)
+	struct local_mode_obj_get_properties {
+		uint64_t props_ptr;
+		uint64_t prop_values_ptr;
+		uint32_t count_props;
+		uint32_t obj_id;
+		uint32_t obj_type;
+		uint32_t pad;
+	} props;
+	uint64_t *prop_values;
+	int i, j;
+
+	memset(&props, 0, sizeof(struct local_mode_obj_get_properties));
+	props.obj_id = obj_id;
+	props.obj_type = obj_type;
+
+	if (drmIoctl(sna->kgem.fd, LOCAL_IOCTL_MODE_OBJ_GETPROPERTIES, &props))
+		return;
+
+	DBG(("%s: object %d (type %u) has %d props\n", __FUNCTION__,
+	     obj_id, obj_type, props.count_props));
+
+	if (props.count_props == 0)
+		return;
+
+	prop_values = malloc(2*sizeof(uint64_t)*props.count_props);
+	if (prop_values == NULL)
+		return;
+
+	props.props_ptr = (uintptr_t)prop_values;
+	props.prop_values_ptr = (uintptr_t)(prop_values + props.count_props);
+
+	if (drmIoctl(sna->kgem.fd, LOCAL_IOCTL_MODE_OBJ_GETPROPERTIES, &props))
+		props.count_props = 0;
+
+	for (i = 0; i < props.count_props; i++) {
+		struct drm_mode_get_property prop;
+		struct drm_mode_property_enum *enums;
+
+		memset(&prop, 0, sizeof(prop));
+		prop.prop_id = prop_values[i];
+		if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPROPERTY, &prop))
+			continue;
+
+		DBG(("%s: prop[%d] .id=%d, .name=%s, .flags=%x, .value=%ld\n", __FUNCTION__, i,
+		     prop_values[i], prop.name, prop.flags, prop_values[i+props.count_props]));
+		if ((prop.flags & (1 << 5)) == 0)
+			continue;
+
+		if (strcmp(prop.name, "rotation"))
+			continue;
+
+		r->obj_id = obj_id;
+		r->obj_type = obj_type;
+		r->prop_id = prop_values[i];
+		r->current = prop_values[i + props.count_props];
+
+		DBG(("%s: found rotation property .id=%d, value=%ld, num_enums=%d\n",
+		     __FUNCTION__, prop.prop_id, (long)prop_values[i+props.count_props], prop.count_enum_blobs));
+		enums = malloc(prop.count_enum_blobs * sizeof(struct drm_mode_property_enum));
+		if (enums != NULL) {
+			prop.count_values = 0;
+			prop.enum_blob_ptr = (uintptr_t)enums;
+
+			if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPROPERTY, &prop) == 0) {
+				/* XXX we assume that the mapping between kernel enum and
+				 * RandR remains fixed for our lifetimes.
+				 */
+				for (j = 0; j < prop.count_enum_blobs; j++) {
+					DBG(("%s: rotation[%d] = %s [%x]\n", __FUNCTION__,
+					     j, enums[j].name, enums[j].value));
+					r->supported |= 1 << enums[j].value;
+				}
+			}
+
+			free(enums);
+		}
+
+		break;
+	}
+
+	free(prop_values);
+#endif
+}
+
 static bool
 rotation_set(struct sna *sna, struct rotation *r, uint32_t desired)
 {
+#define LOCAL_IOCTL_MODE_OBJ_SETPROPERTY DRM_IOWR(0xBA, struct local_mode_obj_set_property)
+	struct local_mode_obj_set_property {
+		uint64_t value;
+		uint32_t prop_id;
+		uint32_t obj_id;
+		uint32_t obj_type;
+		uint32_t pad;
+	} prop;
+
 	if (desired == r->current)
 		return true;
 
@@ -899,15 +999,27 @@ rotation_set(struct sna *sna, struct rotation *r, uint32_t desired)
 	assert(r->obj_type);
 	assert(r->prop_id);
 
-	if (drmModeObjectSetProperty(sna->kgem.fd,
-				     r->obj_id, r->obj_type,
-				     r->prop_id, desired))
+	prop.obj_id = r->obj_id;
+	prop.obj_type = r->obj_type;
+	prop.prop_id = r->prop_id;
+	prop.value = desired;
+
+	if (drmIoctl(sna->kgem.fd, LOCAL_IOCTL_MODE_OBJ_SETPROPERTY, &prop))
 		return false;
 
 	r->current = desired;
 	return true;
 }
 
+static void
+rotation_reset(struct rotation *r)
+{
+	if (r->prop_id == 0)
+		return;
+
+	r->current = 0;
+}
+
 bool sna_crtc_set_sprite_rotation(xf86CrtcPtr crtc, uint32_t rotation)
 {
 	DBG(("%s: CRTC:%d [pipe=%d], sprite=%u set-rotation=%x\n",
@@ -2030,79 +2142,6 @@ sna_crtc_find_sprite(struct sna *sna, int pipe)
 }
 
 static void
-rotation_init(struct sna *sna, struct rotation *r, uint32_t obj_id, uint32_t obj_type)
-{
-#if USE_ROTATION
-	drmModeObjectPropertiesPtr props;
-	int i, j;
-
-	props = drmModeObjectGetProperties(sna->kgem.fd, obj_id, obj_type);
-	if (props == NULL)
-		return;
-
-	DBG(("%s: object %d (type %u) has %d props\n", __FUNCTION__,
-	     obj_id, obj_type, props->count_props));
-
-	for (i = 0; i < props->count_props; i++) {
-		struct drm_mode_get_property prop;
-		struct drm_mode_property_enum *enums;
-
-		memset(&prop, 0, sizeof(prop));
-		prop.prop_id = props->props[i];
-		if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPROPERTY, &prop))
-			continue;
-
-		DBG(("%s: prop[%d] .id=%d, .name=%s, .flags=%x, .value=%ld\n", __FUNCTION__, i,
-		     props->props[i], prop.name, prop.flags, props->prop_values[i]));
-		if ((prop.flags & DRM_MODE_PROP_BITMASK) == 0)
-			continue;
-
-		if (strcmp(prop.name, "rotation"))
-			continue;
-
-		r->obj_id = obj_id;
-		r->obj_type = obj_type;
-		r->prop_id = props->props[i];
-		r->current = props->prop_values[i];
-
-		DBG(("%s: found rotation property .id=%d, value=%ld, num_enums=%d\n",
-		     __FUNCTION__, prop.prop_id, (long)props->prop_values[i], prop.count_enum_blobs));
-		enums = malloc(prop.count_enum_blobs * sizeof(struct drm_mode_property_enum));
-		if (enums != NULL) {
-			prop.count_values = 0;
-			prop.enum_blob_ptr = (uintptr_t)enums;
-
-			if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPROPERTY, &prop) == 0) {
-				/* XXX we assume that the mapping between kernel enum and
-				 * RandR remains fixed for our lifetimes.
-				 */
-				for (j = 0; j < prop.count_enum_blobs; j++) {
-					DBG(("%s: rotation[%d] = %s [%x]\n", __FUNCTION__,
-					     j, enums[j].name, enums[j].value));
-					r->supported |= 1 << enums[j].value;
-				}
-			}
-
-			free(enums);
-		}
-
-		break;
-	}
-
-	drmModeFreeObjectProperties(props);
-#endif
-}
-
-static void
-rotation_reset(struct rotation *r)
-{
-	if (r->prop_id == 0)
-		return;
-
-	r->current = 0;
-}
-
-static void
 sna_crtc_init__rotation(struct sna *sna, struct sna_crtc *sna_crtc)
 {
 	sna_crtc->rotation = RR_Rotate_0;
@@ -2110,12 +2149,8 @@ sna_crtc_init__rotation(struct sna *sna, struct sna_crtc *sna_crtc)
 	sna_crtc->primary_rotation.current = RR_Rotate_0;
 	sna_crtc->sprite_rotation = sna_crtc->primary_rotation;
 
-#ifdef DRM_MODE_OBJECT_CRTC
-	rotation_init(sna, &sna_crtc->primary_rotation, sna_crtc->id, DRM_MODE_OBJECT_CRTC);
-#endif
-#ifdef DRM_MODE_OBJECT_PLANE
-	rotation_init(sna, &sna_crtc->sprite_rotation, sna_crtc->sprite, DRM_MODE_OBJECT_PLANE);
-#endif
+	rotation_init(sna, &sna_crtc->primary_rotation, sna_crtc->id, LOCAL_MODE_OBJECT_CRTC);
+	rotation_init(sna, &sna_crtc->sprite_rotation, sna_crtc->sprite, LOCAL_MODE_OBJECT_PLANE);
 
 	DBG(("%s: CRTC:%d [pipe=%d], primary: supported-rotations=%x, current-rotation=%x, sprite: supported-rotations=%x, current-rotation=%x\n",
 	     __FUNCTION__, sna_crtc->id, sna_crtc->pipe,


More information about the xorg-commit mailing list