[Mesa-dev] [PATCH 2/6][RFC] drirc: Add string support

Axel Davy axel.davy at ens.fr
Sun Jan 5 13:26:38 PST 2014


This may require changes to the driconf gui.

Signed-off-by: Axel Davy <axel.davy at ens.fr>
---
 src/mesa/drivers/dri/common/xmlconfig.c | 24 ++++++++++++++++++++++++
 src/mesa/drivers/dri/common/xmlconfig.h |  7 ++++++-
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/src/mesa/drivers/dri/common/xmlconfig.c b/src/mesa/drivers/dri/common/xmlconfig.c
index b95e452..c1dae20 100644
--- a/src/mesa/drivers/dri/common/xmlconfig.c
+++ b/src/mesa/drivers/dri/common/xmlconfig.c
@@ -311,6 +311,9 @@ static GLboolean parseValue (driOptionValue *v, driOptionType type,
       case DRI_FLOAT:
 	v->_float = strToF (string, &tail);
 	break;
+      case DRI_STRING:
+	v->_string = strndup(string, STRING_CONF_MAXLEN);
+	return GL_TRUE;
     }
 
     if (tail == string)
@@ -404,6 +407,8 @@ static GLboolean checkValue (const driOptionValue *v, const driOptionInfo *info)
 		v->_float <= info->ranges[i].end._float)
 		return GL_TRUE;
 	break;
+      case DRI_STRING:
+	break;
       default:
 	assert (0); /* should never happen */
     }
@@ -567,6 +572,8 @@ static void parseOptInfoAttr (struct OptInfoData *data, const XML_Char **attr) {
 	cache->info[opt].type = DRI_INT;
     else if (!strcmp (attrVal[OA_TYPE], "float"))
 	cache->info[opt].type = DRI_FLOAT;
+    else if (!strcmp (attrVal[OA_TYPE], "string"))
+	cache->info[opt].type = DRI_STRING;
     else
 	XML_FATAL ("illegal type in option: %s.", attrVal[OA_TYPE]);
 
@@ -981,6 +988,15 @@ void driDestroyOptionInfo (driOptionCache *info) {
 }
 
 void driDestroyOptionCache (driOptionCache *cache) {
+    if (cache->info) {
+	GLuint i, size = 1 << cache->tableSize;
+	for (i = 0; i < size; ++i) {
+	    if (cache->info[i].type == DRI_STRING) {
+		char *str = cache->values[i]._string;
+		free (str);
+	    }
+	}
+    }
     free(cache->values);
 }
 
@@ -1013,3 +1029,11 @@ GLfloat driQueryOptionf (const driOptionCache *cache, const char *name) {
     assert (cache->info[i].type == DRI_FLOAT);
     return cache->values[i]._float;
 }
+
+char * driQueryOptionstr (const driOptionCache *cache, const char *name) {
+    GLuint i = findOption (cache, name);
+  /* make sure the option is defined and has the correct type */
+    assert (cache->info[i].name != NULL);
+    assert (cache->info[i].type == DRI_STRING);
+    return cache->values[i]._string;
+}
diff --git a/src/mesa/drivers/dri/common/xmlconfig.h b/src/mesa/drivers/dri/common/xmlconfig.h
index d0ad42c..93fd3f3 100644
--- a/src/mesa/drivers/dri/common/xmlconfig.h
+++ b/src/mesa/drivers/dri/common/xmlconfig.h
@@ -30,9 +30,11 @@
 #ifndef __XMLCONFIG_H
 #define __XMLCONFIG_H
 
+#define STRING_CONF_MAXLEN 25
+
 /** \brief Option data types */
 typedef enum driOptionType {
-    DRI_BOOL, DRI_ENUM, DRI_INT, DRI_FLOAT
+    DRI_BOOL, DRI_ENUM, DRI_INT, DRI_FLOAT, DRI_STRING
 } driOptionType;
 
 /** \brief Option value */
@@ -40,6 +42,7 @@ typedef union driOptionValue {
     GLboolean _bool; /**< \brief Boolean */
     GLint _int;      /**< \brief Integer or Enum */
     GLfloat _float;  /**< \brief Floating-point */
+    char* _string;   /**< \brief String */
 } driOptionValue;
 
 /** \brief Single range of valid values
@@ -118,5 +121,7 @@ GLboolean driQueryOptionb (const driOptionCache *cache, const char *name);
 GLint driQueryOptioni (const driOptionCache *cache, const char *name);
 /** \brief Query a floating-point option value */
 GLfloat driQueryOptionf (const driOptionCache *cache, const char *name);
+/** \brief Query a string option value */
+char* driQueryOptionstr (const driOptionCache *cache, const char *name);
 
 #endif
-- 
1.8.3.2



More information about the mesa-dev mailing list