cherry-pick candidate for a future 1.20.9 release

2020-04-13 Thread Matthieu Herrb
Hi,

I'd like to nominate 364d64981549544213e2bca8de6ff8a5b2b5a69e as a
commit to cherry-pick into a future release of the 1.20 branch.

Without this commit, SDL 1.2 games in full screen get FocusOut events
every couple of seconds, and this is causing in some of them
(burgerspace is an example that was used to show me the issue) it will
pause the game, rendering it un-playable.

|commit 364d64981549544213e2bca8de6ff8a5b2b5a69e
|Author: Samuel Thibault 
|Date:   Tue Oct 30 18:43:51 2018 +0100
|
|dix: do not send focus event when grab actually does not change

Thanks in advance.
-- 
Matthieu Herrb


signature.asc
Description: PGP signature
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel


[PATCH xserver] xfree86: Refine drm modes on continuous freq panel

2020-04-13 Thread Aaron Ma
EDID1.4 replaced GTF Bit with Continuous or Non-Continuous Frequency Display.

Check the "Display Range Limits Descriptor" for GTF support.
If panel doesn't support GTF, then add gtf modes.

Otherwise X will only show the modes in "Detailed Timing Descriptor".

BugLink: https://gitlab.freedesktop.org/drm/intel/issues/313
Signed-off-by: Aaron Ma 
---
 hw/xfree86/ddc/edid.h |  6 
 hw/xfree86/ddc/interpret_edid.c   | 32 +++
 hw/xfree86/ddc/xf86DDC.h  |  3 ++
 .../drivers/modesetting/drmmode_display.c |  2 +-
 4 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/hw/xfree86/ddc/edid.h b/hw/xfree86/ddc/edid.h
index 750e4270b..dffcb3749 100644
--- a/hw/xfree86/ddc/edid.h
+++ b/hw/xfree86/ddc/edid.h
@@ -262,6 +262,10 @@
 #define MAX_H (_MAX_H(c) + _MAX_H_OFFSET(c))
 #define _MAX_CLOCK(x) x[9]
 #define MAX_CLOCK _MAX_CLOCK(c)
+#define _DEFAULT_GTF(x) (x[10] == 0x00)
+#define DEFAULT_GTF _DEFAULT_GTF(c)
+#define _RANGE_LIMITS_ONLY(x) (x[10] == 0x01)
+#define RANGE_LIMITS_ONLY _RANGE_LIMITS_ONLY(c)
 #define _HAVE_2ND_GTF(x) (x[10] == 0x02)
 #define HAVE_2ND_GTF _HAVE_2ND_GTF(c)
 #define _F_2ND_GTF(x) (x[12] * 2)
@@ -490,6 +494,8 @@ struct monitor_ranges {
 int gtf_2nd_j;
 int max_clock_khz;
 int maxwidth;   /* in pixels */
+BOOL supported_default_gtf;
+BOOL range_limits_only;
 char supported_aspect;
 char preferred_aspect;
 char supported_blanking;
diff --git a/hw/xfree86/ddc/interpret_edid.c b/hw/xfree86/ddc/interpret_edid.c
index 17a8f81c0..4f3cbc587 100644
--- a/hw/xfree86/ddc/interpret_edid.c
+++ b/hw/xfree86/ddc/interpret_edid.c
@@ -672,7 +672,19 @@ get_monitor_ranges(Uchar * c, struct monitor_ranges *r)
 r->max_clock = 0;
 if (MAX_CLOCK != 0xff)  /* is specified? */
 r->max_clock = MAX_CLOCK * 10 + 5;
+
+if (DEFAULT_GTF) {
+   r->supported_default_gtf = TRUE;
+} else
+   r->supported_default_gtf = FALSE;
+
+if (RANGE_LIMITS_ONLY) {
+   r->range_limits_only = TRUE;
+} else
+   r->range_limits_only = FALSE;
+
 if (HAVE_2ND_GTF) {
+r->supported_default_gtf = TRUE;
 r->gtf_2nd_f = F_2ND_GTF;
 r->gtf_2nd_c = C_2ND_GTF;
 r->gtf_2nd_m = M_2ND_GTF;
@@ -751,6 +763,26 @@ validate_version(int scrnIndex, struct edid_version *r)
 return TRUE;
 }
 
+Bool
+gtf_supported(int scrnIndex, xf86MonPtr mon)
+{
+struct detailed_monitor_section *det_timing_des = mon->det_mon;
+int i;
+
+if (mon && (mon->ver.revision < 4)) {
+if (GTF_SUPPORTED(mon->features.msc))
+   return TRUE;
+} else {
+for (i = 0; i < DET_TIMINGS; det_timing_des = &(mon->det_mon[++i])) {
+   if ((det_timing_des) && (det_timing_des->type == DS_RANGES))
+   if (det_timing_des->section.ranges.supported_default_gtf)
+   return TRUE;
+   }
+}
+
+return FALSE;
+}
+
 /*
  * Returns true if HDMI, false if definitely not or unknown.
  */
diff --git a/hw/xfree86/ddc/xf86DDC.h b/hw/xfree86/ddc/xf86DDC.h
index 7d81ab911..2fa4ba55a 100644
--- a/hw/xfree86/ddc/xf86DDC.h
+++ b/hw/xfree86/ddc/xf86DDC.h
@@ -48,6 +48,9 @@ extern _X_EXPORT Bool xf86SetDDCproperties(ScrnInfoPtr 
pScreen, xf86MonPtr DDC);
 extern _X_EXPORT Bool
  xf86MonitorIsHDMI(xf86MonPtr mon);
 
+extern _X_EXPORT Bool
+gtf_supported(int scrnIndex, xf86MonPtr mon);
+
 extern _X_EXPORT DisplayModePtr
 FindDMTMode(int hsize, int vsize, int refresh, Bool rb);
 
diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c 
b/hw/xfree86/drivers/modesetting/drmmode_display.c
index 8e6b697c4..031e5efea 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.c
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
@@ -2459,7 +2459,7 @@ drmmode_output_add_gtf_modes(xf86OutputPtr output, 
DisplayModePtr Modes)
 int max_x = 0, max_y = 0;
 float max_vrefresh = 0.0;
 
-if (mon && GTF_SUPPORTED(mon->features.msc))
+if (mon && gtf_supported(output->scrn->scrnIndex, mon))
 return Modes;
 
 if (!has_panel_fitter(output))
-- 
2.26.0

___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel


AW V2: [PATCH xserver] xfree86: Refine drm modes on continuous freq panel

2020-04-13 Thread Walter Harms




Von: xorg-devel  im Auftrag von Aaron Ma 

Gesendet: Samstag, 11. April 2020 12:14
An: xorg-devel@lists.x.org; aaron...@canonical.com
Betreff: [PATCH xserver] xfree86: Refine drm modes on continuous freq panel

EDID1.4 replaced GTF Bit with Continuous or Non-Continuous Frequency Display.

Check the "Display Range Limits Descriptor" for GTF support.
If panel doesn't support GTF, then add gtf modes.

Otherwise X will only show the modes in "Detailed Timing Descriptor".

BugLink: https://gitlab.freedesktop.org/drm/intel/issues/313
Signed-off-by: Aaron Ma 
---
 hw/xfree86/ddc/edid.h |  6 
 hw/xfree86/ddc/interpret_edid.c   | 32 +++
 hw/xfree86/ddc/xf86DDC.h  |  3 ++
 .../drivers/modesetting/drmmode_display.c |  2 +-
 4 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/hw/xfree86/ddc/edid.h b/hw/xfree86/ddc/edid.h
index 750e4270b..dffcb3749 100644
--- a/hw/xfree86/ddc/edid.h
+++ b/hw/xfree86/ddc/edid.h
@@ -262,6 +262,10 @@
 #define MAX_H (_MAX_H(c) + _MAX_H_OFFSET(c))
 #define _MAX_CLOCK(x) x[9]
 #define MAX_CLOCK _MAX_CLOCK(c)
+#define _DEFAULT_GTF(x) (x[10] == 0x00)
+#define DEFAULT_GTF _DEFAULT_GTF(c)
+#define _RANGE_LIMITS_ONLY(x) (x[10] == 0x01)
+#define RANGE_LIMITS_ONLY _RANGE_LIMITS_ONLY(c)
 #define _HAVE_2ND_GTF(x) (x[10] == 0x02)
 #define HAVE_2ND_GTF _HAVE_2ND_GTF(c)
 #define _F_2ND_GTF(x) (x[12] * 2)
@@ -490,6 +494,8 @@ struct monitor_ranges {
 int gtf_2nd_j;
 int max_clock_khz;
 int maxwidth;   /* in pixels */
+BOOL supported_default_gtf;
+BOOL range_limits_only;
 char supported_aspect;
 char preferred_aspect;
 char supported_blanking;
diff --git a/hw/xfree86/ddc/interpret_edid.c b/hw/xfree86/ddc/interpret_edid.c
index 17a8f81c0..4f3cbc587 100644
--- a/hw/xfree86/ddc/interpret_edid.c
+++ b/hw/xfree86/ddc/interpret_edid.c
@@ -672,7 +672,19 @@ get_monitor_ranges(Uchar * c, struct monitor_ranges *r)
 r->max_clock = 0;
 if (MAX_CLOCK != 0xff)  /* is specified? */
 r->max_clock = MAX_CLOCK * 10 + 5;
+
+if (DEFAULT_GTF) {
+   r->supported_default_gtf = TRUE;
+} else
+   r->supported_default_gtf = FALSE;
+
+if (RANGE_LIMITS_ONLY) {
+   r->range_limits_only = TRUE;
+} else
+   r->range_limits_only = FALSE;
+
 if (HAVE_2ND_GTF) {
+r->supported_default_gtf = TRUE;
 r->gtf_2nd_f = F_2ND_GTF;
 r->gtf_2nd_c = C_2ND_GTF;
 r->gtf_2nd_m = M_2ND_GTF;
@@ -751,6 +763,26 @@ validate_version(int scrnIndex, struct edid_version *r)
 return TRUE;
 }

+Bool
+gtf_supported(int scrnIndex, xf86MonPtr mon)
+{

+struct detailed_monitor_section *det_timing_des = mon->det_mon;
+int i;
+
+if (mon && (mon->ver.revision < 4)) {

can mon be NULL ? if yes det_timing_des = mon->det_mon; will crash.
a simple
   if (!mon)
 return FALSE;

clears the fog.

+if (GTF_SUPPORTED(mon->features.msc))
+   return TRUE;
+} else {

maybe you can improve readability this way:

 if ( mon->ver.revision < 4 ) {
 if (GTF_SUPPORTED(mon->features.msc))
   return TRUE;
  else
return FALSE;
   }





+for (i = 0; i < DET_TIMINGS; det_timing_des = &(mon->det_mon[++i])) {
+   if ((det_timing_des) && (det_timing_des->type == DS_RANGES))

using a simple loop makes it more readable, and avoids the init at start
(case mon==NULL). The scope of det_timing_des is small you could call it dms or 
so.

 for(i=0;i < DET_TIMINGS;i++) 
  {
  struct detailed_monitor_section *det_timing_des = 
&(mon->det_mon[i]))
   if (! det_timing_des)// is 
this possible ?
 return FALSE;
if ( det_timing_des->type == DS_RANGES && 
   det_timing_des->section.ranges.supported_default_gtf )
return TRUE;

 }

hope that helps,
re,
 wh
+   if (det_timing_des->section.ranges.supported_default_gtf)
+   return TRUE;
+   }
+}
+
+return FALSE;
+}
+
 /*
  * Returns true if HDMI, false if definitely not or unknown.
  */
diff --git a/hw/xfree86/ddc/xf86DDC.h b/hw/xfree86/ddc/xf86DDC.h
index 7d81ab911..2fa4ba55a 100644
--- a/hw/xfree86/ddc/xf86DDC.h
+++ b/hw/xfree86/ddc/xf86DDC.h
@@ -48,6 +48,9 @@ extern _X_EXPORT Bool xf86SetDDCproperties(ScrnInfoPtr 
pScreen, xf86MonPtr DDC);
 extern _X_EXPORT Bool
  xf86MonitorIsHDMI(xf86MonPtr mon);

+extern _X_EXPORT Bool
+gtf_supported(int scrnIndex, xf86MonPtr mon);
+
 extern _X_EXPORT DisplayModePtr
 FindDMTMode(int hsize, int vsize, int refresh, Bool rb);

diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c 
b/hw/xfree86/drivers/modesetting/drmmode_display.c
index 8e6b697c4..031e5efea 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.c
+++ 

AW: [PATCH xserver] xfree86: Refine drm modes on continuous freq panel

2020-04-13 Thread Walter Harms



Von: xorg-devel  im Auftrag von Aaron Ma 

Gesendet: Samstag, 11. April 2020 12:14
An: xorg-devel@lists.x.org; aaron...@canonical.com
Betreff: [PATCH xserver] xfree86: Refine drm modes on continuous freq panel

EDID1.4 replaced GTF Bit with Continuous or Non-Continuous Frequency Display.

Check the "Display Range Limits Descriptor" for GTF support.
If panel doesn't support GTF, then add gtf modes.

Otherwise X will only show the modes in "Detailed Timing Descriptor".

BugLink: https://gitlab.freedesktop.org/drm/intel/issues/313
Signed-off-by: Aaron Ma 
---
 hw/xfree86/ddc/edid.h |  6 
 hw/xfree86/ddc/interpret_edid.c   | 32 +++
 hw/xfree86/ddc/xf86DDC.h  |  3 ++
 .../drivers/modesetting/drmmode_display.c |  2 +-
 4 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/hw/xfree86/ddc/edid.h b/hw/xfree86/ddc/edid.h
index 750e4270b..dffcb3749 100644
--- a/hw/xfree86/ddc/edid.h
+++ b/hw/xfree86/ddc/edid.h
@@ -262,6 +262,10 @@
 #define MAX_H (_MAX_H(c) + _MAX_H_OFFSET(c))
 #define _MAX_CLOCK(x) x[9]
 #define MAX_CLOCK _MAX_CLOCK(c)
+#define _DEFAULT_GTF(x) (x[10] == 0x00)
+#define DEFAULT_GTF _DEFAULT_GTF(c)
+#define _RANGE_LIMITS_ONLY(x) (x[10] == 0x01)
+#define RANGE_LIMITS_ONLY _RANGE_LIMITS_ONLY(c)
 #define _HAVE_2ND_GTF(x) (x[10] == 0x02)
 #define HAVE_2ND_GTF _HAVE_2ND_GTF(c)
 #define _F_2ND_GTF(x) (x[12] * 2)
@@ -490,6 +494,8 @@ struct monitor_ranges {
 int gtf_2nd_j;
 int max_clock_khz;
 int maxwidth;   /* in pixels */
+BOOL supported_default_gtf;
+BOOL range_limits_only;
 char supported_aspect;
 char preferred_aspect;
 char supported_blanking;
diff --git a/hw/xfree86/ddc/interpret_edid.c b/hw/xfree86/ddc/interpret_edid.c
index 17a8f81c0..4f3cbc587 100644
--- a/hw/xfree86/ddc/interpret_edid.c
+++ b/hw/xfree86/ddc/interpret_edid.c
@@ -672,7 +672,19 @@ get_monitor_ranges(Uchar * c, struct monitor_ranges *r)
 r->max_clock = 0;
 if (MAX_CLOCK != 0xff)  /* is specified? */
 r->max_clock = MAX_CLOCK * 10 + 5;
+
+if (DEFAULT_GTF) {
+   r->supported_default_gtf = TRUE;
+} else
+   r->supported_default_gtf = FALSE;
+
+if (RANGE_LIMITS_ONLY) {
+   r->range_limits_only = TRUE;
+} else
+   r->range_limits_only = FALSE;
+
 if (HAVE_2ND_GTF) {
+r->supported_default_gtf = TRUE;
 r->gtf_2nd_f = F_2ND_GTF;
 r->gtf_2nd_c = C_2ND_GTF;
 r->gtf_2nd_m = M_2ND_GTF;
@@ -751,6 +763,26 @@ validate_version(int scrnIndex, struct edid_version *r)
 return TRUE;
 }

+Bool
+gtf_supported(int scrnIndex, xf86MonPtr mon)
+{
+struct detailed_monitor_section *det_timing_des = mon->det_mon;
+int i;
+
+if (mon && (mon->ver.revision < 4)) {

can mon be NULL ? if yes det_timing_des = mon->det_mon; will crash.

+if (GTF_SUPPORTED(mon->features.msc))
+   return TRUE;
+} else {

maybe you can improve readability this way:

 if ( mon->ver.revision < 4 ) {
 if (GTF_SUPPORTED(mon->features.msc))





+for (i = 0; i < DET_TIMINGS; det_timing_des = &(mon->det_mon[++i])) {
+   if ((det_timing_des) && (det_timing_des->type == DS_RANGES))
+   if (det_timing_des->section.ranges.supported_default_gtf)
+   return TRUE;
+   }
+}
+
+return FALSE;
+}
+
 /*
  * Returns true if HDMI, false if definitely not or unknown.
  */
diff --git a/hw/xfree86/ddc/xf86DDC.h b/hw/xfree86/ddc/xf86DDC.h
index 7d81ab911..2fa4ba55a 100644
--- a/hw/xfree86/ddc/xf86DDC.h
+++ b/hw/xfree86/ddc/xf86DDC.h
@@ -48,6 +48,9 @@ extern _X_EXPORT Bool xf86SetDDCproperties(ScrnInfoPtr 
pScreen, xf86MonPtr DDC);
 extern _X_EXPORT Bool
  xf86MonitorIsHDMI(xf86MonPtr mon);

+extern _X_EXPORT Bool
+gtf_supported(int scrnIndex, xf86MonPtr mon);
+
 extern _X_EXPORT DisplayModePtr
 FindDMTMode(int hsize, int vsize, int refresh, Bool rb);

diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c 
b/hw/xfree86/drivers/modesetting/drmmode_display.c
index 8e6b697c4..031e5efea 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.c
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
@@ -2459,7 +2459,7 @@ drmmode_output_add_gtf_modes(xf86OutputPtr output, 
DisplayModePtr Modes)
 int max_x = 0, max_y = 0;
 float max_vrefresh = 0.0;

-if (mon && GTF_SUPPORTED(mon->features.msc))
+if (mon && gtf_supported(output->scrn->scrnIndex, mon))
 return Modes;

 if (!has_panel_fitter(output))
--
2.26.0

___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel