[Intel-gfx] [PATCH i-g-t 2/6] lib/igt_kms: refactor atomic properties load/commit

Lionel Landwerlin lionel.g.landwerlin at intel.com
Thu May 12 12:58:08 UTC 2016


All properties can be listed regardless of whether we're dealing with
an atomic enabled driver, so load all of the properties ids regardless
at init time.

Also, we can have only one function loading the property ids and reuse
that for different DRM objects.

v2: Fix a typo
    Don't rename igt_atomic_populate_crtc_req() (Marius Vlad)

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
---
 lib/igt_kms.c | 185 +++++++++++++++++++++-------------------------------------
 lib/igt_kms.h |  19 +++---
 2 files changed, 75 insertions(+), 129 deletions(-)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 795ecb0..bccf148 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -173,85 +173,31 @@ static const char *igt_connector_prop_names[IGT_NUM_CONNECTOR_PROPS] = {
 };
 
 /*
- * Retrieve all the properies specified in props_name and store them into
- * plane->atomic_props_plane.
+ * Retrieve all the properties specified in props_name from object_id
+ * and store them into prop_ids.
  */
 static void
-igt_atomic_fill_plane_props(igt_display_t *display, igt_plane_t *plane,
-			int num_props, const char **prop_names)
+igt_atomic_fill_props(igt_display_t *display,
+		      uint32_t object_id, uint32_t object_type,
+		      uint32_t *prop_ids, const char **prop_names,
+		      int num_props)
 {
 	drmModeObjectPropertiesPtr props;
-	int i, j, fd;
-
-	fd = display->drm_fd;
+	int i, j;
 
-	props = drmModeObjectGetProperties(fd, plane->drm_plane->plane_id, DRM_MODE_OBJECT_PLANE);
+	props = drmModeObjectGetProperties(display->drm_fd,
+					   object_id, object_type);
 	igt_assert(props);
 
 	for (i = 0; i < props->count_props; i++) {
 		drmModePropertyPtr prop =
-			drmModeGetProperty(fd, props->props[i]);
+			drmModeGetProperty(display->drm_fd, props->props[i]);
 
 		for (j = 0; j < num_props; j++) {
 			if (strcmp(prop->name, prop_names[j]) != 0)
 				continue;
 
-			plane->atomic_props_plane[j] = props->props[i];
-			break;
-		}
-
-		drmModeFreeProperty(prop);
-	}
-
-	drmModeFreeObjectProperties(props);
-}
-
-/*
- * Retrieve all the properies specified in props_name and store them into
- * config->atomic_props_crtc and config->atomic_props_connector.
- */
-static void
-igt_atomic_fill_props(igt_display_t *display, igt_output_t *output,
-			int num_crtc_props, const char **crtc_prop_names,
-			int num_connector_props, const char **conn_prop_names)
-{
-	drmModeObjectPropertiesPtr props;
-	int i, j, fd;
-
-	fd = display->drm_fd;
-
-	props = drmModeObjectGetProperties(fd, output->config.crtc->crtc_id, DRM_MODE_OBJECT_CRTC);
-	igt_assert(props);
-
-	for (i = 0; i < props->count_props; i++) {
-		drmModePropertyPtr prop =
-			drmModeGetProperty(fd, props->props[i]);
-
-		for (j = 0; j < num_crtc_props; j++) {
-			if (strcmp(prop->name, crtc_prop_names[j]) != 0)
-				continue;
-
-			output->config.atomic_props_crtc[j] = props->props[i];
-			break;
-		}
-
-		drmModeFreeProperty(prop);
-	}
-
-	drmModeFreeObjectProperties(props);
-	props = NULL;
-	props = drmModeObjectGetProperties(fd, output->config.connector->connector_id, DRM_MODE_OBJECT_CONNECTOR);
-	igt_assert(props);
-
-	for (i = 0; i < props->count_props; i++) {
-		drmModePropertyPtr prop =
-			drmModeGetProperty(fd, props->props[i]);
-
-		for (j = 0; j < num_connector_props; j++) {
-			if (strcmp(prop->name, conn_prop_names[j]) != 0)
-				continue;
-
-			output->config.atomic_props_connector[j] = props->props[i];
+			prop_ids[j] = props->props[i];
 			break;
 		}
 
@@ -259,7 +205,6 @@ igt_atomic_fill_props(igt_display_t *display, igt_output_t *output,
 	}
 
 	drmModeFreeObjectProperties(props);
-
 }
 
 const unsigned char* igt_kms_get_alt_edid(void)
@@ -1185,8 +1130,9 @@ static void igt_output_refresh(igt_output_t *output)
 	    kmstest_pipe_name(output->config.pipe));
 
 	display->pipes_in_use |= 1 << output->config.pipe;
-	igt_atomic_fill_props(display, output, IGT_NUM_CRTC_PROPS, igt_crtc_prop_names,
-		IGT_NUM_CONNECTOR_PROPS, igt_connector_prop_names);
+	igt_atomic_fill_props(display, output->id, DRM_MODE_OBJECT_CONNECTOR,
+			      output->properties, igt_connector_prop_names,
+			      IGT_NUM_CONNECTOR_PROPS);
 }
 
 static bool
@@ -1256,7 +1202,6 @@ void igt_display_init(igt_display_t *display, int drm_fd)
 	drmModeRes *resources;
 	drmModePlaneRes *plane_resources;
 	int i;
-	int is_atomic = 0;
 
 	memset(display, 0, sizeof(igt_display_t));
 
@@ -1274,7 +1219,7 @@ void igt_display_init(igt_display_t *display, int drm_fd)
 	display->n_pipes = resources->count_crtcs;
 
 	drmSetClientCap(drm_fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
-	is_atomic = drmSetClientCap(drm_fd, DRM_CLIENT_CAP_ATOMIC, 1);
+	display->is_atomic = drmSetClientCap(drm_fd, DRM_CLIENT_CAP_ATOMIC, 1) == 0;
 	plane_resources = drmModeGetPlaneResources(display->drm_fd);
 	igt_assert(plane_resources);
 
@@ -1332,10 +1277,12 @@ void igt_display_init(igt_display_t *display, int drm_fd)
 
 			plane->pipe = pipe;
 			plane->drm_plane = drm_plane;
-			if (is_atomic == 0) {
-				display->is_atomic = 1;
-				igt_atomic_fill_plane_props(display, plane, IGT_NUM_PLANE_PROPS, igt_plane_prop_names);
-			}
+			igt_atomic_fill_props(display,
+					      plane->drm_plane->plane_id,
+					      DRM_MODE_OBJECT_PLANE,
+					      plane->properties,
+					      igt_plane_prop_names,
+					      IGT_NUM_PLANE_PROPS);
 
 			get_plane_property(display->drm_fd, drm_plane->plane_id,
 					   "rotation",
@@ -1383,6 +1330,36 @@ void igt_display_init(igt_display_t *display, int drm_fd)
 		/* planes = 1 primary, (p-1) sprites, 1 cursor */
 		pipe->n_planes = p + 1;
 
+		igt_atomic_fill_props(display, pipe->crtc_id, DRM_MODE_OBJECT_CRTC,
+				      pipe->properties, igt_crtc_prop_names,
+				      IGT_NUM_CRTC_PROPS);
+		if (pipe->crtc_id) {
+			uint64_t prop_value;
+
+			get_crtc_property(display->drm_fd, pipe->crtc_id,
+					  "background_color",
+					  &pipe->background_property,
+					  &prop_value,
+					  NULL);
+			pipe->background = (uint32_t)prop_value;
+			get_crtc_property(display->drm_fd, pipe->crtc_id,
+					  "DEGAMMA_LUT",
+					  &pipe->degamma_property,
+					  NULL,
+					  NULL);
+			get_crtc_property(display->drm_fd, pipe->crtc_id,
+					  "CTM",
+					  &pipe->ctm_property,
+					  NULL,
+					  NULL);
+			get_crtc_property(display->drm_fd, pipe->crtc_id,
+					  "GAMMA_LUT",
+					  &pipe->gamma_property,
+					  NULL,
+					  NULL);
+		}
+
+
 		/* make sure we don't overflow the plane array */
 		igt_assert(pipe->n_planes <= IGT_MAX_PLANES);
 	}
@@ -1397,7 +1374,6 @@ void igt_display_init(igt_display_t *display, int drm_fd)
 	igt_assert(display->outputs);
 
 	for (i = 0; i < display->n_outputs; i++) {
-		int j;
 		igt_output_t *output = &display->outputs[i];
 
 		/*
@@ -1409,35 +1385,6 @@ void igt_display_init(igt_display_t *display, int drm_fd)
 		output->display = display;
 
 		igt_output_refresh(output);
-
-		for (j = 0; j < display->n_pipes; j++) {
-			uint64_t prop_value;
-			igt_pipe_t *pipe = &display->pipes[j];
-
-			if (output->config.crtc) {
-				get_crtc_property(display->drm_fd, output->config.crtc->crtc_id,
-						   "background_color",
-						   &pipe->background_property,
-						   &prop_value,
-						   NULL);
-				pipe->background = (uint32_t)prop_value;
-				get_crtc_property(display->drm_fd, output->config.crtc->crtc_id,
-						  "DEGAMMA_LUT",
-						  &pipe->degamma_property,
-						  NULL,
-						  NULL);
-				get_crtc_property(display->drm_fd, output->config.crtc->crtc_id,
-						  "CTM",
-						  &pipe->ctm_property,
-						  NULL,
-						  NULL);
-				get_crtc_property(display->drm_fd, output->config.crtc->crtc_id,
-						  "GAMMA_LUT",
-						  &pipe->gamma_property,
-						  NULL,
-						  NULL);
-			}
-		}
 	}
 
 	drmModeFreePlaneResources(plane_resources);
@@ -2012,22 +1959,19 @@ static int igt_output_commit(igt_output_t *output,
 /*
  * Add crtc property changes to the atomic property set
  */
-static void igt_atomic_prepare_crtc_commit(igt_output_t *output, drmModeAtomicReq *req)
+static void igt_atomic_prepare_crtc_commit(igt_pipe_t *pipe, drmModeAtomicReq *req)
 {
+	if (pipe->background_changed)
+		igt_atomic_populate_crtc_req(req, pipe, IGT_CRTC_BACKGROUND, pipe->background);
 
-	igt_pipe_t *pipe_obj = igt_output_get_driving_pipe(output);
-
-	if (pipe_obj->background_changed)
-		igt_atomic_populate_crtc_req(req, output, IGT_CRTC_BACKGROUND, pipe_obj->background);
-
-	if (pipe_obj->color_mgmt_changed) {
-		igt_atomic_populate_crtc_req(req, output, IGT_CRTC_DEGAMMA_LUT, pipe_obj->degamma_blob);
-		igt_atomic_populate_crtc_req(req, output, IGT_CRTC_CTM, pipe_obj->ctm_blob);
-		igt_atomic_populate_crtc_req(req, output, IGT_CRTC_GAMMA_LUT, pipe_obj->gamma_blob);
+	if (pipe->color_mgmt_changed) {
+		igt_atomic_populate_crtc_req(req, pipe, IGT_CRTC_DEGAMMA_LUT, pipe->degamma_blob);
+		igt_atomic_populate_crtc_req(req, pipe, IGT_CRTC_CTM, pipe->ctm_blob);
+		igt_atomic_populate_crtc_req(req, pipe, IGT_CRTC_GAMMA_LUT, pipe->gamma_blob);
 	}
 
-	pipe_obj->background_changed = false;
-	pipe_obj->color_mgmt_changed = false;
+	pipe->background_changed = false;
+	pipe->color_mgmt_changed = false;
 }
 
 /*
@@ -2068,10 +2012,14 @@ static int igt_atomic_commit(igt_display_t *display)
 		igt_plane_t *plane;
 		enum pipe pipe;
 
+		pipe_obj = igt_output_get_driving_pipe(output);
+
+		pipe = pipe_obj->pipe;
+
 		/*
 		 * Add CRTC Properties to the property set
 		 */
-		igt_atomic_prepare_crtc_commit(output, req);
+		igt_atomic_prepare_crtc_commit(pipe_obj, req);
 
 		/*
 		 * Add Connector Properties to the property set
@@ -2079,9 +2027,6 @@ static int igt_atomic_commit(igt_display_t *display)
 		igt_atomic_prepare_connector_commit(output, req);
 
 
-		pipe_obj = igt_output_get_driving_pipe(output);
-
-		pipe = pipe_obj->pipe;
 
 		for_each_plane_on_pipe(display, pipe, plane) {
 			igt_atomic_prepare_plane_commit(plane, output, req);
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 5c83401..d6b92cf 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -130,8 +130,6 @@ struct kmstest_connector_config {
 	bool connector_scaling_mode_changed;
 	uint64_t connector_dpms;
 	bool connector_dpms_changed;
-	uint32_t atomic_props_crtc[IGT_NUM_CRTC_PROPS];
-	uint32_t atomic_props_connector[IGT_NUM_CONNECTOR_PROPS];
 	int crtc_idx;
 	int pipe;
 };
@@ -261,7 +259,7 @@ typedef struct {
 	/* panning offset within the fb */
 	unsigned int pan_x, pan_y;
 	igt_rotation_t rotation;
-	uint32_t atomic_props_plane[IGT_NUM_PLANE_PROPS];
+	uint32_t properties[IGT_NUM_PLANE_PROPS];
 } igt_plane_t;
 
 struct igt_pipe {
@@ -283,6 +281,8 @@ struct igt_pipe {
 	uint32_t color_mgmt_changed : 1;
 
 	uint32_t crtc_id;
+
+	uint32_t properties[IGT_NUM_CRTC_PROPS];
 };
 
 typedef struct {
@@ -295,6 +295,7 @@ typedef struct {
 	unsigned long pending_crtc_idx_mask;
 	bool use_override_mode;
 	drmModeModeInfo override_mode;
+	uint32_t properties[IGT_NUM_CONNECTOR_PROPS];
 } igt_output_t;
 
 struct igt_display {
@@ -369,18 +370,18 @@ void igt_wait_for_vblank(int drm_fd, enum pipe pipe);
  */
 #define igt_atomic_populate_plane_req(req, plane, prop, value) \
 	igt_assert_lt(0, drmModeAtomicAddProperty(req, plane->drm_plane->plane_id,\
-						  plane->atomic_props_plane[prop], value))
+						  plane->properties[prop], value))
 
 /**
  * igt_atomic_populate_crtc_req:
  * @req: A pointer to drmModeAtomicReq
- * @output: A pointer igt_output_t
+ * @pipe: A pointer igt_pipe_t
  * @prop: one of igt_atomic_crtc_properties
  * @value: the value to add
  */
-#define igt_atomic_populate_crtc_req(req, output, prop, value) \
-	igt_assert_lt(0, drmModeAtomicAddProperty(req, output->config.crtc->crtc_id,\
-						  output->config.atomic_props_crtc[prop], value))
+#define igt_atomic_populate_crtc_req(req, pipe, prop, value) \
+	igt_assert_lt(0, drmModeAtomicAddProperty(req, pipe->crtc_id,\
+						  pipe->properties[prop], value))
 /**
  * igt_atomic_populate_connector_req:
  * @req: A pointer to drmModeAtomicReq
@@ -390,7 +391,7 @@ void igt_wait_for_vblank(int drm_fd, enum pipe pipe);
  */
 #define igt_atomic_populate_connector_req(req, output, prop, value) \
 	igt_assert_lt(0, drmModeAtomicAddProperty(req, output->config.connector->connector_id,\
-						  output->config.atomic_props_connector[prop], value))
+						  output->properties[prop], value))
 
 void igt_enable_connectors(void);
 void igt_reset_connectors(void);
-- 
2.8.1



More information about the Intel-gfx mailing list