[Mesa-dev] [PATCH 1/2] dri/common: embed drirc into driver binaries

Marek Olšák maraeo at gmail.com
Tue Sep 1 17:26:55 PDT 2015


From: Marek Olšák <marek.olsak at amd.com>

People are having issues with apps because drirc wasn't installed
into /etc. I've lost patience.
---
 src/mesa/drivers/dri/common/Makefile.am      |   4 +-
 src/mesa/drivers/dri/common/Makefile.sources |   3 +-
 src/mesa/drivers/dri/common/drirc            |  84 --------------------
 src/mesa/drivers/dri/common/drirc_built_in.h | 111 +++++++++++++++++++++++++++
 src/mesa/drivers/dri/common/xmlconfig.c      |  30 +++++++-
 5 files changed, 140 insertions(+), 92 deletions(-)
 delete mode 100644 src/mesa/drivers/dri/common/drirc
 create mode 100644 src/mesa/drivers/dri/common/drirc_built_in.h

diff --git a/src/mesa/drivers/dri/common/Makefile.am b/src/mesa/drivers/dri/common/Makefile.am
index b307f10..7106abe 100644
--- a/src/mesa/drivers/dri/common/Makefile.am
+++ b/src/mesa/drivers/dri/common/Makefile.am
@@ -23,7 +23,7 @@ SUBDIRS = xmlpool
 
 include Makefile.sources
 
-EXTRA_DIST = drirc xmlpool.h SConscript
+EXTRA_DIST = xmlpool.h SConscript
 
 AM_CFLAGS = \
 	-I$(top_srcdir)/include \
@@ -52,5 +52,3 @@ libdri_test_stubs_la_SOURCES = $(test_stubs_FILES)
 libdri_test_stubs_la_CFLAGS = $(AM_CFLAGS) -DNO_MAIN
 
 libmegadriver_stub_la_SOURCES = $(megadriver_stub_FILES)
-
-sysconf_DATA = drirc
diff --git a/src/mesa/drivers/dri/common/Makefile.sources b/src/mesa/drivers/dri/common/Makefile.sources
index d5d8da8..71ba01d 100644
--- a/src/mesa/drivers/dri/common/Makefile.sources
+++ b/src/mesa/drivers/dri/common/Makefile.sources
@@ -6,7 +6,8 @@ DRI_COMMON_FILES := \
 
 XMLCONFIG_FILES := \
 	xmlconfig.c \
-	xmlconfig.h
+	xmlconfig.h \
+	drirc_built_in.h
 
 # Paths are relative to MESA_TOP.
 mesa_dri_common_INCLUDES := \
diff --git a/src/mesa/drivers/dri/common/drirc b/src/mesa/drivers/dri/common/drirc
deleted file mode 100644
index bb840ea..0000000
--- a/src/mesa/drivers/dri/common/drirc
+++ /dev/null
@@ -1,84 +0,0 @@
-<!--
-
-============================================
-Application bugs worked around in this file:
-============================================
-
-* Unigine Heaven 3.0 and older contain too many bugs and can't be supported
-  by drivers that want to be compliant.
-
-* Various Unigine products don't use the #version and #extension GLSL
-  directives, meaning they only get GLSL 1.10 and no extensions for their
-  shaders.
-  Enabling all extensions for Unigine fixes most issues, but the GLSL version
-  is still 1.10.
-
-* If ARB_sample_shading is supported, Unigine Heaven 4.0 and Valley 1.0 uses
-  an #extension directive in the middle of its shaders, which is illegal
-  in GLSL.
-
-TODO: document the other workarounds.
-
--->
-
-<driconf>
-    <!-- Please always enable app-specific workarounds for all drivers and
-         screens. -->
-    <device>
-        <application name="Unigine Sanctuary" executable="Sanctuary">
-            <option name="force_glsl_extensions_warn" value="true" />
-            <option name="disable_blend_func_extended" value="true" />
-	</application>
-
-        <application name="Unigine Tropics" executable="Tropics">
-            <option name="force_glsl_extensions_warn" value="true" />
-            <option name="disable_blend_func_extended" value="true" />
-	</application>
-
-        <application name="Unigine Heaven (32-bit)" executable="heaven_x86">
-            <option name="allow_glsl_extension_directive_midshader" value="true" />
-	</application>
-
-        <application name="Unigine Heaven (64-bit)" executable="heaven_x64">
-            <option name="allow_glsl_extension_directive_midshader" value="true" />
-	</application>
-
-        <application name="Unigine Valley (32-bit)" executable="valley_x86">
-            <option name="allow_glsl_extension_directive_midshader" value="true" />
-	</application>
-
-        <application name="Unigine Valley (64-bit)" executable="valley_x64">
-            <option name="allow_glsl_extension_directive_midshader" value="true" />
-	</application>
-
-        <application name="Unigine OilRush (32-bit)" executable="OilRush_x86">
-            <option name="disable_blend_func_extended" value="true" />
-            <option name="allow_glsl_extension_directive_midshader" value="true" />
-	</application>
-
-        <application name="Unigine OilRush (64-bit)" executable="OilRush_x64">
-            <option name="disable_blend_func_extended" value="true" />
-            <option name="allow_glsl_extension_directive_midshader" value="true" />
-	</application>
-
-        <application name="Savage 2" executable="savage2.bin">
-            <option name="disable_glsl_line_continuations" value="true" />
-        </application>
-
-        <application name="Topogun (32-bit)" executable="topogun32">
-            <option name="always_have_depth_buffer" value="true" />
-        </application>
-
-        <application name="Topogun (64-bit)" executable="topogun64">
-            <option name="always_have_depth_buffer" value="true" />
-        </application>
-
-        <application name="Dead Island" executable="DeadIslandGame">
-            <option name="allow_glsl_extension_directive_midshader" value="true" />
-        </application>
-
-        <application name="Second Life" executable="do-not-directly-run-secondlife-bin">
-            <option name="allow_glsl_extension_directive_midshader" value="true" />
-        </application>
-    </device>
-</driconf>
diff --git a/src/mesa/drivers/dri/common/drirc_built_in.h b/src/mesa/drivers/dri/common/drirc_built_in.h
new file mode 100644
index 0000000..592b1d1
--- /dev/null
+++ b/src/mesa/drivers/dri/common/drirc_built_in.h
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2015 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef DRIRC_BUILT_IN_H
+#define DRIRC_BUILT_IN_H
+
+/*
+============================================
+Application bugs worked around here:
+============================================
+
+* Unigine Heaven 3.0 and older contain too many bugs and can't be supported
+  by drivers that want to be compliant.
+
+* Various Unigine products don't use the #version and #extension GLSL
+  directives, meaning they only get GLSL 1.10 and no extensions for their
+  shaders.
+  Enabling all extensions for Unigine fixes most issues, but the GLSL version
+  is still 1.10.
+
+* If ARB_sample_shading is supported, Unigine Heaven 4.0 and Valley 1.0 uses
+  an #extension directive in the middle of its shaders, which is illegal
+  in GLSL.
+
+TODO: document the other workarounds.
+
+*/
+
+static const char *drirc_built_in =
+"<driconf>"
+"    <device>"
+"        <application name='Unigine Sanctuary' executable='Sanctuary'>"
+"            <option name='force_glsl_extensions_warn' value='true' />"
+"            <option name='disable_blend_func_extended' value='true' />"
+"        </application>"
+
+"        <application name='Unigine Tropics' executable='Tropics'>"
+"            <option name='force_glsl_extensions_warn' value='true' />"
+"            <option name='disable_blend_func_extended' value='true' />"
+"        </application>"
+
+"        <application name='Unigine Heaven (32-bit)' executable='heaven_x86'>"
+"            <option name='allow_glsl_extension_directive_midshader' value='true' />"
+"        </application>"
+
+"        <application name='Unigine Heaven (64-bit)' executable='heaven_x64'>"
+"            <option name='allow_glsl_extension_directive_midshader' value='true' />"
+"        </application>"
+
+"        <application name='Unigine Valley (32-bit)' executable='valley_x86'>"
+"            <option name='allow_glsl_extension_directive_midshader' value='true' />"
+"        </application>"
+
+"        <application name='Unigine Valley (64-bit)' executable='valley_x64'>"
+"            <option name='allow_glsl_extension_directive_midshader' value='true' />"
+"        </application>"
+
+"        <application name='Unigine OilRush (32-bit)' executable='OilRush_x86'>"
+"            <option name='disable_blend_func_extended' value='true' />"
+"            <option name='allow_glsl_extension_directive_midshader' value='true' />"
+"        </application>"
+
+"        <application name='Unigine OilRush (64-bit)' executable='OilRush_x64'>"
+"            <option name='disable_blend_func_extended' value='true' />"
+"            <option name='allow_glsl_extension_directive_midshader' value='true' />"
+"        </application>"
+
+"        <application name='Savage 2' executable='savage2.bin'>"
+"            <option name='disable_glsl_line_continuations' value='true' />"
+"        </application>"
+
+"        <application name='Topogun (32-bit)' executable='topogun32'>"
+"            <option name='always_have_depth_buffer' value='true' />"
+"        </application>"
+
+"        <application name='Topogun (64-bit)' executable='topogun64'>"
+"            <option name='always_have_depth_buffer' value='true' />"
+"        </application>"
+
+"        <application name='Dead Island' executable='DeadIslandGame'>"
+"            <option name='allow_glsl_extension_directive_midshader' value='true' />"
+"        </application>"
+
+"        <application name='Second Life' executable='do-not-directly-run-secondlife-bin'>"
+"            <option name='allow_glsl_extension_directive_midshader' value='true' />"
+"        </application>"
+"    </device>"
+"</driconf>";
+
+#endif
diff --git a/src/mesa/drivers/dri/common/xmlconfig.c b/src/mesa/drivers/dri/common/xmlconfig.c
index f17693e..47a9aef 100644
--- a/src/mesa/drivers/dri/common/xmlconfig.c
+++ b/src/mesa/drivers/dri/common/xmlconfig.c
@@ -39,6 +39,7 @@
 #include "main/imports.h"
 #include "utils.h"
 #include "xmlconfig.h"
+#include "drirc_built_in.h"
 
 #undef GET_PROGRAM_NAME
 
@@ -896,6 +897,23 @@ static void initOptionCache (driOptionCache *cache, const driOptionCache *info)
     }
 }
 
+static void parseConfigFromString(XML_Parser p, const char *string)
+{
+   struct OptConfData *data = (struct OptConfData *)XML_GetUserData (p);
+   int size = strlen(string);
+
+   void *buffer = XML_GetBuffer(p, size);
+   if (!buffer) {
+      __driUtilMessage("Can't allocate parser buffer.");
+      return;
+   }
+
+   memcpy(buffer, string, size);
+
+   if (!XML_ParseBuffer(p, size, true))
+      XML_ERROR("%s.", XML_ErrorString(XML_GetErrorCode(p)));
+}
+
 /** \brief Parse the named configuration file */
 static void parseOneConfigFile (XML_Parser p) {
 #define BUF_SIZE 0x1000
@@ -960,16 +978,16 @@ void driParseConfigFiles (driOptionCache *cache, const driOptionCache *info,
 	}
     }
 
-    for (i = 0; i < 2; ++i) {
+    for (i = 0; i < 3; ++i) {
 	XML_Parser p;
-	if (filenames[i] == NULL)
+	if (i && filenames[i-1] == NULL)
 	    continue;
 
 	p = XML_ParserCreate (NULL); /* use encoding specified by file */
 	XML_SetElementHandler (p, optConfStartElem, optConfEndElem);
 	XML_SetUserData (p, &userData);
 	userData.parser = p;
-	userData.name = filenames[i];
+	userData.name = i ? filenames[i-1] : NULL;
 	userData.ignoringDevice = 0;
 	userData.ignoringApp = 0;
 	userData.inDriConf = 0;
@@ -977,7 +995,11 @@ void driParseConfigFiles (driOptionCache *cache, const driOptionCache *info,
 	userData.inApp = 0;
 	userData.inOption = 0;
 
-	parseOneConfigFile (p);
+        if (i == 0)
+           parseConfigFromString(p, drirc_built_in);
+        else
+           parseOneConfigFile(p);
+
 	XML_ParserFree (p);
     }
 
-- 
2.1.4



More information about the mesa-dev mailing list