Drivers that care about crtc positions on the screen to ensure that vblank works correctly need to be notified when crtcs are changed. Provide a dri-specific hook in the mode setting code that is invoked whenever any configuration is done to the screen so that DRI clients are notified and receive updated information.
Signed-off-by: Keith Packard <[EMAIL PROTECTED]> --- hw/xfree86/dri/Makefile.am | 5 +++++ hw/xfree86/dri/dri.c | 5 +++++ hw/xfree86/loader/xf86sym.c | 1 + hw/xfree86/modes/xf86Crtc.c | 10 ++++++++++ hw/xfree86/modes/xf86Crtc.h | 3 +++ 5 files changed, 24 insertions(+), 0 deletions(-) diff --git a/hw/xfree86/dri/Makefile.am b/hw/xfree86/dri/Makefile.am index e17cea7..3ec30be 100644 --- a/hw/xfree86/dri/Makefile.am +++ b/hw/xfree86/dri/Makefile.am @@ -1,6 +1,11 @@ libdri_la_LTLIBRARIES = libdri.la libdri_la_CFLAGS = -I$(top_srcdir)/hw/xfree86/common \ -I$(top_srcdir)/hw/xfree86/os-support \ + -I$(top_srcdir)/hw/xfree86/modes \ + -I$(top_srcdir)/hw/xfree86/ddc \ + -I$(top_srcdir)/hw/xfree86/i2c \ + -I$(top_srcdir)/hw/xfree86/parser \ + -I$(top_srcdir)/hw/xfree86/ramdac \ -I$(top_srcdir)/hw/xfree86/os-support/bus \ -I$(top_srcdir)/glx \ -I$(top_srcdir)/GL/include \ diff --git a/hw/xfree86/dri/dri.c b/hw/xfree86/dri/dri.c index 3713659..13468dd 100644 --- a/hw/xfree86/dri/dri.c +++ b/hw/xfree86/dri/dri.c @@ -71,6 +71,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "mipointer.h" #include "xf86_OSproc.h" #include "inputstr.h" +#include "xf86Crtc.h" #define PCI_BUS_NO_DOMAIN(bus) ((bus) & 0xffu) @@ -302,6 +303,8 @@ DRIOpenDRMMaster(ScrnInfoPtr pScrn, return FALSE; } +static void +DRIClipNotifyAllDrawables(ScreenPtr pScreen); Bool DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD) @@ -579,6 +582,8 @@ DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD) break; } + xf86_set_dri_crtc_notify_hook(DRIClipNotifyAllDrawables); + return TRUE; } diff --git a/hw/xfree86/loader/xf86sym.c b/hw/xfree86/loader/xf86sym.c index 4891be2..7569fd6 100644 --- a/hw/xfree86/loader/xf86sym.c +++ b/hw/xfree86/loader/xf86sym.c @@ -914,6 +914,7 @@ _X_HIDDEN void *xfree86LookupTab[] = { SYMFUNC(xf86_hide_cursors) SYMFUNC(xf86_cursors_fini) SYMFUNC(xf86_crtc_clip_video_helper) + SYMFUNC(xf86_set_dri_crtc_notify_hook) SYMFUNC(xf86DoEDID_DDC1) SYMFUNC(xf86DoEDID_DDC2) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index df47598..0ae1e4d 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -2545,6 +2545,14 @@ xf86SaveScreen(ScreenPtr pScreen, int mode) return TRUE; } +static void (*dri_crtc_notify_hook) (ScreenPtr pScreen); + +_X_EXPORT void +xf86_set_dri_crtc_notify_hook (void (*hook) (ScreenPtr pScreen)) +{ + dri_crtc_notify_hook = hook; +} + /** * Disable all inactive crtcs and outputs */ @@ -2571,6 +2579,8 @@ xf86DisableUnusedFunctions(ScrnInfoPtr pScrn) memset(&crtc->mode, 0, sizeof(crtc->mode)); } } + if (dri_crtc_notify_hook && pScrn->pScreen) + dri_crtc_notify_hook (pScrn->pScreen); } #ifdef RANDR_12_INTERFACE diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h index 83b1f13..0ed6768 100644 --- a/hw/xfree86/modes/xf86Crtc.h +++ b/hw/xfree86/modes/xf86Crtc.h @@ -722,6 +722,9 @@ Bool xf86SaveScreen(ScreenPtr pScreen, int mode); void +xf86_set_dri_crtc_notify_hook (void (*hook) (ScreenPtr pScreen)); + +void xf86DisableUnusedFunctions(ScrnInfoPtr pScrn); DisplayModePtr -- 1.5.6.5 _______________________________________________ xorg mailing list xorg@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/xorg