st/mesa,gallium: add a workaround for Unigine Heaven 4.0 and Valley 1.0
authorMarek Olšák <marek.olsak@amd.com>
Tue, 8 Jul 2014 18:24:55 +0000 (20:24 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 17 Jul 2014 23:58:58 +0000 (01:58 +0200)
Most (all?) Unigine shaders fail to compile without this if sample shading
is advertised. This is, of course, Unigine developers' fault.

Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/include/state_tracker/st_api.h
src/gallium/state_trackers/dri/dri_context.c
src/gallium/state_trackers/dri/dri_screen.c
src/mesa/drivers/dri/common/drirc
src/mesa/drivers/dri/common/xmlpool/t_options.h
src/mesa/state_tracker/st_extensions.c

index 9dcb76f..46f0436 100644 (file)
@@ -245,6 +245,7 @@ struct st_config_options
    boolean force_glsl_extensions_warn;
    unsigned force_glsl_version;
    boolean force_s3tc_enable;
+   boolean allow_glsl_extension_directive_midshader;
 };
 
 /**
index f6979a7..827f847 100644 (file)
@@ -55,6 +55,8 @@ dri_fill_st_options(struct st_config_options *options,
       driQueryOptioni(optionCache, "force_glsl_version");
    options->force_s3tc_enable =
       driQueryOptionb(optionCache, "force_s3tc_enable");
+   options->allow_glsl_extension_directive_midshader =
+      driQueryOptionb(optionCache, "allow_glsl_extension_directive_midshader");
 }
 
 GLboolean
index 650dcb7..b639f9f 100644 (file)
@@ -69,6 +69,7 @@ const __DRIconfigOptionsExtension gallium_config_options = {
          DRI_CONF_DISABLE_BLEND_FUNC_EXTENDED("false")
          DRI_CONF_DISABLE_SHADER_BIT_ENCODING("false")
          DRI_CONF_FORCE_GLSL_VERSION(0)
+         DRI_CONF_ALLOW_GLSL_EXTENSION_DIRECTIVE_MIDSHADER("false")
       DRI_CONF_SECTION_END
 
       DRI_CONF_SECTION_MISCELLANEOUS
index ebc04cd..4b9841b 100644 (file)
@@ -11,17 +11,21 @@ Application bugs worked around in this file:
   is still 1.10.
 
 * Unigine Heaven 3.0 with ARB_texture_multisample uses a "ivec4 * vec4"
-  expression, which fails to compile with GLSL 1.10.
+  expression, which is illegal in GLSL 1.10.
   Adding "#version 130" fixes this.
 
 * Unigine Heaven 3.0 with ARB_shader_bit_encoding uses the uint keyword, which
-  fails to compile with GLSL 1.10.
+  is illegal in GLSL 1.10.
   Adding "#version 130" fixes this.
 
 * Unigine Heaven 3.0 with ARB_shader_bit_encoding uses a "uint & int"
-  expression, which fails (and should fail) to compile with any GLSL version.
+  expression, which is illegal in any GLSL version.
   Disabling ARB_shader_bit_encoding fixes this.
 
+* 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.
 
 -->
@@ -45,6 +49,7 @@ TODO: document the other workarounds.
             <option name="disable_blend_func_extended" value="true" />
             <option name="force_glsl_version" value="130" />
             <option name="disable_shader_bit_encoding" value="true" />
+            <option name="allow_glsl_extension_directive_midshader" value="true" />
        </application>
 
         <application name="Unigine Heaven (64-bit)" executable="heaven_x64">
@@ -52,6 +57,15 @@ TODO: document the other workarounds.
             <option name="disable_blend_func_extended" value="true" />
             <option name="force_glsl_version" value="130" />
             <option name="disable_shader_bit_encoding" value="true" />
+            <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">
index fc9e104..b73a662 100644 (file)
@@ -105,6 +105,11 @@ DRI_CONF_OPT_BEGIN_V(force_glsl_version, int, def, "0:999") \
         DRI_CONF_DESC(en,gettext("Force a default GLSL version for shaders that lack an explicit #version line")) \
 DRI_CONF_OPT_END
 
+#define DRI_CONF_ALLOW_GLSL_EXTENSION_DIRECTIVE_MIDSHADER(def) \
+DRI_CONF_OPT_BEGIN_B(allow_glsl_extension_directive_midshader, def) \
+        DRI_CONF_DESC(en,gettext("Allow GLSL #extension directives in the middle of shaders")) \
+DRI_CONF_OPT_END
+
 
 
 /**
index 4207cb6..aa59fbf 100644 (file)
@@ -772,6 +772,9 @@ void st_init_extensions(struct st_context *st)
    if (st->options.disable_glsl_line_continuations)
       ctx->Const.DisableGLSLLineContinuations = 1;
 
+   if (st->options.allow_glsl_extension_directive_midshader)
+      ctx->Const.AllowGLSLExtensionDirectiveMidShader = GL_TRUE;
+
    ctx->Const.MinMapBufferAlignment =
       screen->get_param(screen, PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT);