summaryrefslogtreecommitdiff
path: root/hw/xgl/xglparse.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/xgl/xglparse.c')
-rw-r--r--hw/xgl/xglparse.c138
1 files changed, 115 insertions, 23 deletions
diff --git a/hw/xgl/xglparse.c b/hw/xgl/xglparse.c
index c1f7e6527..5292692a4 100644
--- a/hw/xgl/xglparse.c
+++ b/hw/xgl/xglparse.c
@@ -1,6 +1,6 @@
/*
* Copyright © 2004 David Reveman
- *
+ *
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without
* fee, provided that the above copyright notice appear in all copies
@@ -12,11 +12,11 @@
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*
- * DAVID REVEMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * DAVID REVEMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
* NO EVENT SHALL DAVID REVEMAN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
@@ -33,13 +33,13 @@ xglParseFindNext (char *cur,
{
while (*cur && !strchr (delim, *cur))
*save++ = *cur++;
-
+
*save = 0;
*last = *cur;
-
+
if (*cur)
cur++;
-
+
return cur;
}
@@ -57,28 +57,28 @@ xglParseScreen (char *arg)
if (!arg)
return;
-
+
if (strlen (arg) >= sizeof (save))
return;
-
+
for (i = 0; i < 2; i++)
{
- arg = xglParseFindNext (arg, "x/@XY", save, &delim);
+ arg = xglParseFindNext (arg, "x/", save, &delim);
if (!save[0])
return;
-
+
pixels = atoi (save);
mm = 0;
-
+
if (delim == '/')
{
- arg = xglParseFindNext (arg, "x@XY", save, &delim);
+ arg = xglParseFindNext (arg, "x", save, &delim);
if (!save[0])
return;
-
+
mm = atoi (save);
}
-
+
if (i == 0)
{
xglScreenInfo.width = pixels;
@@ -89,12 +89,98 @@ xglParseScreen (char *arg)
xglScreenInfo.height = pixels;
xglScreenInfo.heightMm = mm;
}
-
+
if (delim != 'x')
return;
}
}
+static void
+xglParseAccel (char *arg)
+{
+ xglAccelInfoPtr pAccel;
+ char delim;
+ char save[1024];
+
+ if (!arg)
+ return;
+
+ if (strlen (arg) >= sizeof (save))
+ return;
+
+ arg = xglParseFindNext (arg, "@:", save, &delim);
+ if (!save[0])
+ return;
+
+ if (strcasecmp (save, "pixmap") == 0)
+ pAccel = &xglScreenInfo.accel.pixmap;
+ else if (strcasecmp (save, "window") == 0)
+ pAccel = &xglScreenInfo.accel.window;
+ else if (strcasecmp (save, "glx") == 0)
+ pAccel = &xglScreenInfo.accel.glx;
+ else if (strcasecmp (save, "xv") == 0)
+ pAccel = &xglScreenInfo.accel.xv;
+ else
+ return;
+
+ if (delim == '@')
+ {
+ arg = xglParseFindNext (arg, "/x:", save, &delim);
+ if (!save[0])
+ return;
+
+ pAccel->size.aboveWidth = pAccel->size.minWidth = atoi (save);
+
+ if (delim == '/')
+ {
+ arg = xglParseFindNext (arg, "x:", save, &delim);
+ if (!save[0])
+ return;
+
+ pAccel->size.aboveWidth = atoi (save);
+ }
+
+ if (delim == 'x')
+ {
+ arg = xglParseFindNext (arg, "/:", save, &delim);
+ if (!save[0])
+ return;
+
+ pAccel->size.aboveHeight = pAccel->size.minHeight = atoi (save);
+
+ if (delim == '/')
+ {
+ arg = xglParseFindNext (arg, ":", save, &delim);
+ if (!save[0])
+ return;
+
+ pAccel->size.aboveHeight = atoi (save);
+ }
+ }
+ }
+
+ pAccel->enabled = TRUE;
+ pAccel->pbuffer = FALSE;
+
+ if (delim == ':')
+ {
+ if (strcasecmp (arg, "fbo") == 0)
+ ;
+ else if (strcasecmp (arg, "off") == 0 ||
+ strncasecmp (arg, "0", 1) == 0 ||
+ strncasecmp (arg, "f", 1) == 0 ||
+ strncasecmp (arg, "n", 1) == 0)
+ {
+ pAccel->enabled = FALSE;
+ pAccel->pbuffer = FALSE;
+ }
+ else if (strcasecmp (arg, "pbuffer") == 0)
+ {
+ pAccel->pbuffer = TRUE;
+ }
+ }
+}
+
void
xglUseMsg (void)
{
@@ -106,8 +192,8 @@ xglUseMsg (void)
"use vertex buffer objects for streaming of vertex data\n");
ErrorF ("-pbomask [1|4|8|16|32] "
"set bpp's to use with pixel buffer objects\n");
- ErrorF ("-fbo "
- "use frame buffer objects for accelerate offscreen drawing\n");
+ ErrorF ("-accel TYPE[@WIDTH[/MIN]xHEIGHT[/MIN]][:METHOD] "
+ "offscreen acceleration\n");
}
int
@@ -126,7 +212,7 @@ xglProcessArgument (int argc,
}
else
return 1;
-
+
return 2;
}
else if (!strcmp (argv[i], "-yinverted"))
@@ -152,14 +238,20 @@ xglProcessArgument (int argc,
}
else
return 1;
-
+
return 2;
}
- else if (!strcmp (argv[i], "-fbo"))
+ else if (!strcmp (argv[i], "-accel"))
{
- xglScreenInfo.fbo = TRUE;
- return 1;
+ if ((i + 1) < argc)
+ {
+ xglParseAccel (argv[i + 1]);
+ }
+ else
+ return 1;
+
+ return 2;
}
-
+
return 0;
}