[Intel-gfx] [PATCH i-g-t 06/10] igt_kms: Handle atomic pipe properties better.

Maarten Lankhorst maarten.lankhorst at linux.intel.com
Thu Jun 30 12:57:15 UTC 2016


Move properties to the pipe, they don't belong in the output
and make atomic commit use the pipes for crtc properties.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
---
 lib/igt_kms.c | 98 +++++++++++++++++++++++++++++------------------------------
 lib/igt_kms.h | 12 +++++---
 2 files changed, 55 insertions(+), 55 deletions(-)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index c1a033992845..eefdc74af1a6 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -213,8 +213,7 @@ igt_atomic_fill_plane_props(igt_display_t *display, igt_plane_t *plane,
  * 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,
+igt_atomic_fill_connector_props(igt_display_t *display, igt_output_t *output,
 			int num_connector_props, const char **conn_prop_names)
 {
 	drmModeObjectPropertiesPtr props;
@@ -222,18 +221,18 @@ igt_atomic_fill_props(igt_display_t *display, igt_output_t *output,
 
 	fd = display->drm_fd;
 
-	props = drmModeObjectGetProperties(fd, output->config.crtc->crtc_id, DRM_MODE_OBJECT_CRTC);
+	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_crtc_props; j++) {
-			if (strcmp(prop->name, crtc_prop_names[j]) != 0)
+		for (j = 0; j < num_connector_props; j++) {
+			if (strcmp(prop->name, conn_prop_names[j]) != 0)
 				continue;
 
-			output->config.atomic_props_crtc[j] = props->props[i];
+			output->config.atomic_props_connector[j] = props->props[i];
 			break;
 		}
 
@@ -241,19 +240,29 @@ igt_atomic_fill_props(igt_display_t *display, igt_output_t *output,
 	}
 
 	drmModeFreeObjectProperties(props);
-	props = NULL;
-	props = drmModeObjectGetProperties(fd, output->config.connector->connector_id, DRM_MODE_OBJECT_CONNECTOR);
+}
+
+static void
+igt_atomic_fill_pipe_props(igt_display_t *display, igt_pipe_t *pipe,
+			int num_crtc_props, const char **crtc_prop_names)
+{
+	drmModeObjectPropertiesPtr props;
+	int i, j, fd;
+
+	fd = display->drm_fd;
+
+	props = drmModeObjectGetProperties(fd, pipe->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_connector_props; j++) {
-			if (strcmp(prop->name, conn_prop_names[j]) != 0)
+		for (j = 0; j < num_crtc_props; j++) {
+			if (strcmp(prop->name, crtc_prop_names[j]) != 0)
 				continue;
 
-			output->config.atomic_props_connector[j] = props->props[i];
+			pipe->atomic_props_crtc[j] = props->props[i];
 			break;
 		}
 
@@ -261,7 +270,6 @@ igt_atomic_fill_props(igt_display_t *display, igt_output_t *output,
 	}
 
 	drmModeFreeObjectProperties(props);
-
 }
 
 const unsigned char* igt_kms_get_alt_edid(void)
@@ -1217,6 +1225,9 @@ static void igt_output_refresh(igt_output_t *output)
 			       -1);
 	}
 
+	igt_atomic_fill_connector_props(display, output,
+		IGT_NUM_CONNECTOR_PROPS, igt_connector_prop_names);
+
 	if (!output->valid)
 		return;
 
@@ -1227,8 +1238,6 @@ 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);
 }
 
 static bool
@@ -1353,6 +1362,8 @@ void igt_display_init(igt_display_t *display, int drm_fd)
 				  NULL,
 				  NULL);
 
+		igt_atomic_fill_pipe_props(display, pipe, IGT_NUM_CRTC_PROPS, igt_crtc_prop_names);
+
 		/* add the planes that can be used with that pipe */
 		for (j = 0; j < plane_resources->count_planes; j++) {
 			drmModePlane *drm_plane;
@@ -1653,11 +1664,10 @@ static uint32_t igt_plane_get_fb_gem_handle(igt_plane_t *plane)
  * Add position and fb changes of a plane to the atomic property set
  */
 static void
-igt_atomic_prepare_plane_commit(igt_plane_t *plane, igt_output_t *output,
+igt_atomic_prepare_plane_commit(igt_plane_t *plane, igt_pipe_t *pipe,
 	drmModeAtomicReq *req)
 {
-
-	igt_display_t *display = output->display;
+	igt_display_t *display = pipe->display;
 	uint32_t fb_id, crtc_id;
 
 	igt_assert(plane->drm_plane);
@@ -1667,12 +1677,11 @@ igt_atomic_prepare_plane_commit(igt_plane_t *plane, igt_output_t *output,
 			!plane->rotation_changed);
 
 	fb_id = igt_plane_get_fb_id(plane);
-	crtc_id = output->config.crtc->crtc_id;
+	crtc_id = pipe->crtc_id;
 
 	LOG(display,
-	    "%s: populating plane data: %s.%d, fb %u\n",
-	    igt_output_name(output),
-	    kmstest_pipe_name(output->config.pipe),
+	    "populating plane data: %s.%d, fb %u\n",
+	    kmstest_pipe_name(pipe->pipe),
 	    plane->index,
 	    fb_id);
 
@@ -2033,21 +2042,15 @@ static int igt_pipe_commit(igt_pipe_t *pipe,
 /*
  * 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_obj, drmModeAtomicReq *req)
 {
-
-	igt_pipe_t *pipe_obj = igt_output_get_driving_pipe(output);
-
-	if (!pipe_obj)
-		return;
-
 	if (pipe_obj->background_changed)
-		igt_atomic_populate_crtc_req(req, output, IGT_CRTC_BACKGROUND, pipe_obj->background);
+		igt_atomic_populate_crtc_req(req, pipe_obj, 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);
+		igt_atomic_populate_crtc_req(req, pipe_obj, IGT_CRTC_DEGAMMA_LUT, pipe_obj->degamma_blob);
+		igt_atomic_populate_crtc_req(req, pipe_obj, IGT_CRTC_CTM, pipe_obj->ctm_blob);
+		igt_atomic_populate_crtc_req(req, pipe_obj, IGT_CRTC_GAMMA_LUT, pipe_obj->gamma_blob);
 	}
 
 	/*
@@ -2081,42 +2084,37 @@ static void igt_atomic_prepare_connector_commit(igt_output_t *output, drmModeAto
 static int igt_atomic_commit(igt_display_t *display)
 {
 
-	int ret = 0;
+	int ret = 0, i;
+	enum pipe pipe;
 	drmModeAtomicReq *req;
 	igt_output_t *output;
+
 	if (display->is_atomic != 1)
 		return -1;
 	req = drmModeAtomicAlloc();
 	drmModeAtomicSetCursor(req, 0);
 
-	for_each_connected_output(display, output) {
-		igt_pipe_t *pipe_obj;
+	for_each_pipe(display, pipe) {
+		igt_pipe_t *pipe_obj = &display->pipes[pipe];
 		igt_plane_t *plane;
-		enum pipe pipe;
 
 		/*
 		 * Add CRTC Properties to the property set
 		 */
-		igt_atomic_prepare_crtc_commit(output, req);
-
-		/*
-		 * Add Connector Properties to the property set
-		 */
-		igt_atomic_prepare_connector_commit(output, req);
-
-
-		pipe_obj = igt_output_get_driving_pipe(output);
-		if (!pipe_obj)
-			continue;
-
-		pipe = pipe_obj->pipe;
+		igt_atomic_prepare_crtc_commit(pipe_obj, req);
 
 		for_each_plane_on_pipe(display, pipe, plane) {
-			igt_atomic_prepare_plane_commit(plane, output, req);
+			igt_atomic_prepare_plane_commit(plane, pipe_obj, req);
 		}
 
 	}
 
+	for (i = 0; i < display->n_outputs; i++) {
+		output = &display->outputs[i];
+
+		igt_atomic_prepare_connector_commit(output, req);
+	}
+
 	ret = drmModeAtomicCommit(display->drm_fd, req, 0, NULL);
 	drmModeAtomicFree(req);
 	return ret;
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index a3505a1a6b25..718af11fa333 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -111,7 +111,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 pipe;
 	unsigned valid_crtc_idx_mask;
@@ -251,6 +250,9 @@ struct igt_pipe {
 	bool enabled;
 	int n_planes;
 	igt_plane_t planes[IGT_MAX_PLANES];
+
+	uint32_t atomic_props_crtc[IGT_NUM_CRTC_PROPS];
+
 	uint64_t background; /* Background color MSB BGR 16bpc LSB */
 	uint32_t background_changed : 1;
 	uint32_t background_property;
@@ -389,13 +391,13 @@ static inline bool igt_pipe_connector_valid(enum pipe pipe,
 /**
  * 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->atomic_props_crtc[prop], value))
 /**
  * igt_atomic_populate_connector_req:
  * @req: A pointer to drmModeAtomicReq
-- 
2.5.5



More information about the Intel-gfx mailing list