public inbox for amd-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
From: <sunpeng.li-5C7GfCeVMHo@public.gmane.org>
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
Subject: [PATCH xf86-video-amdgpu 3/5] Keep CRTC properties consistent
Date: Mon, 26 Mar 2018 16:00:16 -0400	[thread overview]
Message-ID: <1522094418-9102-4-git-send-email-sunpeng.li@amd.com> (raw)
In-Reply-To: <1522094418-9102-1-git-send-email-sunpeng.li-5C7GfCeVMHo@public.gmane.org>

From: "Leo (Sunpeng) Li" <sunpeng.li@amd.com>

In cases where CRTC properties are updated without going through
RRChangeOutputProperty, we don't update the properties in user land.

Consider setting legacy gamma. It doesn't go through
RRChangeOutputProperty, but modifies the CRTC's color management
properties. Unless they are updated, the user properties will remain
stale.

Therefore, add a function to update user CRTC properties by querying DRM,
and call it whenever legacy gamma is changed.

Also modify the configure and change helper to take in a 'pending'
argument, to allow property updates for user only.

Signed-off-by: Leo (Sunpeng) Li <sunpeng.li@amd.com>
---
 src/drmmode_display.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 98 insertions(+), 4 deletions(-)

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 1966fd2..45457c4 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -61,8 +61,13 @@
 
 #define DEFAULT_NOMINAL_FRAME_RATE 60
 
+/* Forward declarations */
+
 static Bool drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height);
 
+static void drmmode_crtc_update_resources(xf86CrtcPtr crtc);
+
+
 static Bool
 AMDGPUZaphodStringMatches(ScrnInfoPtr pScrn, const char *s, char *output_name)
 {
@@ -768,6 +773,7 @@ drmmode_crtc_gamma_do_set(xf86CrtcPtr crtc, uint16_t *red, uint16_t *green,
 
 	drmModeCrtcSetGamma(pAMDGPUEnt->fd, drmmode_crtc->mode_crtc->crtc_id,
 			    size, red, green, blue);
+	drmmode_crtc_update_resources(crtc);
 }
 
 Bool
@@ -1653,10 +1659,15 @@ static Bool drmmode_property_ignore(drmModePropertyPtr prop)
 * Configure and change the given output property through randr. Currently
 * ignores DRM_MODE_PROP_ENU property types. Used as part of create_resources.
 *
+* @output: The output to configure and change the property on.
+* @pmode_prop: The driver-private property object.
+* @pending: Whether the property changes are pending.
+*
 * Return: 0 on success, X-defined error codes on failure.
 */
 static int __rr_configure_and_change_property(xf86OutputPtr output,
-					      drmmode_prop_ptr pmode_prop)
+					      drmmode_prop_ptr pmode_prop,
+					      Bool pending)
 {
 	drmModePropertyPtr mode_prop = pmode_prop->mode_prop;
 	Bool is_immutable = mode_prop->flags & DRM_MODE_PROP_IMMUTABLE ?
@@ -1689,7 +1700,7 @@ static int __rr_configure_and_change_property(xf86OutputPtr output,
 					     pmode_prop->atoms[0],
 					     XA_INTEGER, 32,
 					     PropModeReplace, 1, &blob_id,
-					     FALSE, TRUE);
+					     FALSE, pending);
 		if (err)
 			goto rrchange_error;
 	}
@@ -1718,7 +1729,7 @@ static int __rr_configure_and_change_property(xf86OutputPtr output,
 					     pmode_prop->atoms[0],
 					     XA_INTEGER, 32,
 					     PropModeReplace, 1, &value,
-					     FALSE, TRUE);
+					     FALSE, pending);
 		if (err)
 			goto rrchange_error;
 	}
@@ -1739,6 +1750,89 @@ rrchange_error:
 
 }
 
+
+/**
+ * Update user properties on the given CRTC with values from DRM.
+ *
+ * This should be called when a CRTC property is set, without going through
+ * RRChangeOutputProperty.
+ *
+ * For example, setting legacy gamma will modify color management CRTC
+ * properties, but it does not go through RRChangeOutputProperty. This leaves
+ * the user property values in a stale state. Calling this function will grab
+ * updated values from DRM, and update the user properties.
+ */
+static void drmmode_crtc_update_resources(xf86CrtcPtr crtc)
+{
+	AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(crtc->scrn);
+	xf86CrtcConfigPtr xf86_crtc_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
+	int i;
+
+	drmmode_crtc_private_ptr user_crtc = crtc->driver_private;
+
+	/* Get list of DRM CRTC properties, and their values */
+	drmModeObjectPropertiesPtr drm_props;
+	drm_props = drmModeObjectGetProperties(pAMDGPUEnt->fd,
+					       user_crtc->mode_crtc->crtc_id,
+					       DRM_MODE_OBJECT_CRTC);
+	if (!drm_props)
+		goto err_allocs;
+
+	for (i = 0; i < drm_props->count_props; i++) {
+		drmmode_prop_ptr user_prop = NULL;
+		drmModePropertyPtr drm_prop;
+		int j;
+
+		drm_prop = drmModeGetProperty(pAMDGPUEnt->fd,
+					       drm_props->props[i]);
+		if (!drm_prop)
+			goto err_allocs;
+
+		/* Check if property is currently on user CRTC */
+		for (j = 0; j < user_crtc->num_props; j++) {
+			user_prop = &user_crtc->props[j];
+
+			if (!strcmp(drm_prop->name,
+				    user_prop->mode_prop->name))
+				/* Found */
+				break;
+		}
+		if (j == user_crtc->num_props) {
+			/* Not found */
+			drmModeFreeProperty(drm_prop);
+			continue;
+		}
+
+		/* If found, update it with value from kernel */
+		drmModeFreeProperty(user_prop->mode_prop);
+		user_prop->mode_prop = drm_prop;
+		user_prop->value = drm_props->prop_values[i];
+
+		for (j = 0; j < xf86_crtc_config->num_output; j++) {
+			xf86OutputPtr output = xf86_crtc_config->output[j];
+			if (output->crtc != crtc)
+				continue;
+
+			/* Non-pending configure and change: Just updating
+			 * values on user-side */
+			__rr_configure_and_change_property(output,
+							   user_prop,
+							   FALSE);
+		}
+	}
+
+	drmModeFreeObjectProperties(drm_props);
+	return;
+
+err_allocs:
+	xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR,
+		   "Memory error updating resources for CRTC %d\n",
+		   user_crtc->mode_crtc->crtc_id);
+	drmModeFreeObjectProperties(drm_props);
+	return;
+
+}
+
 static void drmmode_crtc_create_resources(xf86CrtcPtr crtc,
 					  xf86OutputPtr output)
 {
@@ -1792,7 +1886,7 @@ static void drmmode_crtc_create_resources(xf86CrtcPtr crtc,
 	/* Finally, configure and set the properties */
 	for (i = 0; i < pmode_crtc->num_props; i++) {
 		pmode_prop = &pmode_crtc->props[i];
-		__rr_configure_and_change_property(output, pmode_prop);
+		__rr_configure_and_change_property(output, pmode_prop, TRUE);
 	}
 
 	drmModeFreeObjectProperties(mode_props);
-- 
2.7.4

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

  parent reply	other threads:[~2018-03-26 20:00 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-26 20:00 [PATCH xf86-video-amdgpu 0/5] Implementing non-legacy color management sunpeng.li-5C7GfCeVMHo
     [not found] ` <1522094418-9102-1-git-send-email-sunpeng.li-5C7GfCeVMHo@public.gmane.org>
2018-03-26 20:00   ` [PATCH xf86-video-amdgpu 1/5] Add functions for changing CRTC color management properties sunpeng.li-5C7GfCeVMHo
     [not found]     ` <1522094418-9102-2-git-send-email-sunpeng.li-5C7GfCeVMHo@public.gmane.org>
2018-04-09 15:03       ` Michel Dänzer
     [not found]         ` <0f5652b1-82af-23a2-969e-0e47844fef28-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-04-10 18:02           ` Leo Li
     [not found]             ` <25c493fd-dfa3-1549-6d7c-30790d48acae-5C7GfCeVMHo@public.gmane.org>
2018-04-11  8:39               ` Michel Dänzer
     [not found]                 ` <90b36645-a08a-b36d-2e76-64ad9709b1a8-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-04-11 21:26                   ` Leo Li
2018-03-26 20:00   ` [PATCH xf86-video-amdgpu 2/5] Hook up CRTC color management functions sunpeng.li-5C7GfCeVMHo
     [not found]     ` <1522094418-9102-3-git-send-email-sunpeng.li-5C7GfCeVMHo@public.gmane.org>
2018-04-09 15:03       ` Michel Dänzer
     [not found]         ` <01457540-fbc7-b608-4aee-5df18f7a7dde-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-04-10 18:02           ` Leo Li
     [not found]             ` <8994afe3-812f-432f-27ef-ab5db3513d15-5C7GfCeVMHo@public.gmane.org>
2018-04-11  8:48               ` Michel Dänzer
     [not found]                 ` <ce29def3-b0f5-3c4a-cd3f-ca3c61770f81-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-04-11 21:26                   ` Leo Li
2018-03-26 20:00   ` sunpeng.li-5C7GfCeVMHo [this message]
     [not found]     ` <1522094418-9102-4-git-send-email-sunpeng.li-5C7GfCeVMHo@public.gmane.org>
2018-04-09 15:03       ` [PATCH xf86-video-amdgpu 3/5] Keep CRTC properties consistent Michel Dänzer
     [not found]         ` <2fbbae9b-c874-7187-9b69-0a929dcaf5cf-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-04-10 18:02           ` Leo Li
     [not found]             ` <0b884ad3-c193-9eab-ca93-ff0ca0672f1e-5C7GfCeVMHo@public.gmane.org>
2018-04-11  8:39               ` Michel Dänzer
     [not found]                 ` <4cd3224e-fd14-e66f-56bf-b983b8f74bc8-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-04-11 21:26                   ` Leo Li
     [not found]                     ` <78b780f2-d075-9496-e62a-8f6de989b992-5C7GfCeVMHo@public.gmane.org>
2018-04-12 10:30                       ` Michel Dänzer
     [not found]                         ` <cc580a31-0679-5492-afff-2ff683ca975d-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-04-12 16:48                           ` Leo Li
     [not found]                             ` <f915a0db-4756-91de-e9dd-336da66060e6-5C7GfCeVMHo@public.gmane.org>
2018-04-13  9:12                               ` Michel Dänzer
2018-03-26 20:00   ` [PATCH xf86-video-amdgpu 4/5] Enable configure & change helper to handle enums sunpeng.li-5C7GfCeVMHo
     [not found]     ` <1522094418-9102-5-git-send-email-sunpeng.li-5C7GfCeVMHo@public.gmane.org>
2018-04-09 15:03       ` Michel Dänzer
2018-03-26 20:00   ` [PATCH xf86-video-amdgpu 5/5] Modify output_create_resources to use configure & change helper sunpeng.li-5C7GfCeVMHo
2018-04-09 14:10   ` [PATCH xf86-video-amdgpu 0/5] Implementing non-legacy color management Michel Dänzer
     [not found]     ` <53e9ea09-8b20-70fd-b7ef-c0219d46bdcc-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-04-10 18:02       ` Leo Li

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1522094418-9102-4-git-send-email-sunpeng.li@amd.com \
    --to=sunpeng.li-5c7gfcevmho@public.gmane.org \
    --cc=amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox