From f36c52b97883063453557070b6294bda88faf5e3 Mon Sep 17 00:00:00 2001 From: Marcus Sundberg Date: Wed, 12 Jan 2000 00:53:21 +0000 Subject: [PATCH] Made VID_CheckDGA() check for DirectVideo capability. Made VID_CheckVMode() return a list of supported modes. --- common/dga_check.c | 54 +++++++++++++++++++++++++++++++++++++++------- common/dga_check.h | 12 +++++++++-- 2 files changed, 56 insertions(+), 10 deletions(-) diff --git a/common/dga_check.c b/common/dga_check.c index db7d8d2..43478a6 100644 --- a/common/dga_check.c +++ b/common/dga_check.c @@ -28,8 +28,7 @@ #include -#include "dga_check.h" - +#include #include #ifdef HAS_DGA @@ -37,22 +36,34 @@ #include #endif +#include "dga_check.h" + + /* VID_CheckDGA Check for the presence of the XFree86-DGA X server extension */ int -VID_CheckDGA(Display *dpy, int *maj_ver, int *min_ver) +VID_CheckDGA(Display *dpy, int *maj_ver, int *min_ver, int *hasvideo) { #ifdef HAS_DGA - int event_base, error_base; - + int event_base, error_base, dgafeat; + if (! XF86DGAQueryExtension(dpy, &event_base, &error_base)) { return 0; } - return XF86DGAQueryVersion(dpy, maj_ver, min_ver); + if (! XF86DGAQueryVersion(dpy, maj_ver, min_ver)) { + return 0; + } + if (! XF86DGAQueryDirectVideo(dpy, DefaultScreen(dpy), &dgafeat)) { + *hasvideo = 0; + } else { + *hasvideo = (dgafeat & XF86DGADirectPresent); + } + + return 1; #else return 0; #endif // HAS_DGA @@ -65,16 +76,43 @@ VID_CheckDGA(Display *dpy, int *maj_ver, int *min_ver) Check for the presence of the XFree86-VidMode X server extension */ int -VID_CheckVMode(Display *dpy, int *maj_ver, int *min_ver) +VID_CheckVMode(Display *dpy, int *maj_ver, int *min_ver, int *num_modes, + struct qfvm_modes **modes) { #ifdef HAS_DGA + XF86VidModeModeInfo **vidmodes; int event_base, error_base; + int ret, i; if (! XF86VidModeQueryExtension(dpy, &event_base, &error_base)) { return 0; } - return XF86VidModeQueryVersion(dpy, maj_ver, min_ver); + if (! XF86VidModeQueryVersion(dpy, maj_ver, min_ver)) { + return 0; + } + + if (! XF86VidModeGetAllModeLines(dpy, DefaultScreen(dpy), + num_modes, &vidmodes)) { + return 0; + } + if (*num_modes <= 0) return 0; + + ret = 0; + *modes = malloc(sizeof(struct qfvm_modes) * *num_modes); + if (*modes) { + ret = 1; + for (i = 0; i < *num_modes; i++) { + (*modes)[i].x = vidmodes[i]->hdisplay; + (*modes)[i].y = vidmodes[i]->vdisplay; + } + } + for (i = 0; i < *num_modes; i++) { + if (vidmodes[i]->private) XFree(vidmodes[i]->private); + } + XFree(vidmodes); + + return ret; #else return 0; #endif // HAS_DGA diff --git a/common/dga_check.h b/common/dga_check.h index d5605b9..45e654e 100644 --- a/common/dga_check.h +++ b/common/dga_check.h @@ -36,13 +36,21 @@ Check for the presence of the XFree86-DGA support in the X server */ -int VID_CheckDGA(Display *dpy, int *maj_ver, int *min_ver); +int VID_CheckDGA(Display *dpy, int *maj_ver, int *min_ver, int *hasvideo); + /* VID_CheckVMode Check for the presence of the XFree86-VMode X server extension */ -int VID_CheckVMode(Display *dpy, int *maj_ver, int *min_ver); + +struct qfvm_modes { + int x; + int y; +}; + +int VID_CheckVMode(Display *dpy, int *maj_ver, int *min_ver, int *num_modes, + struct qfvm_modes **modes); #endif /* DGA_CHECK_H */