mesa/util: add allow_glsl_relaxed_es driconfig override
authorTimothy Arceri <tarceri@itsqueeze.com>
Thu, 14 Jun 2018 01:00:24 +0000 (11:00 +1000)
committerTimothy Arceri <tarceri@itsqueeze.com>
Tue, 19 Jun 2018 02:09:56 +0000 (12:09 +1000)
This relaxes a number of ES shader restrictions allowing shaders
to follow more desktop GLSL like rules.

This initial implementation relaxes the following:

 - allows linking ES shaders with desktop shaders
 - allows mismatching precision qualifiers
 - always enables standard derivative builtins

These relaxations allow Google Earth VR shaders to compile.

Reviewed-by: Dave Airlie <airlied@redhat.com>
src/compiler/glsl/builtin_functions.cpp
src/compiler/glsl/linker.cpp
src/gallium/auxiliary/pipe-loader/driinfo_gallium.h
src/gallium/include/state_tracker/st_api.h
src/gallium/state_trackers/dri/dri_screen.c
src/mesa/main/mtypes.h
src/mesa/state_tracker/st_extensions.c
src/util/xmlpool/t_options.h

index efe90346d0ede14402446623408555d3e711e39b..7119903795f47dc8d628e9742040ff75b2bbb08e 100644 (file)
@@ -446,7 +446,8 @@ fs_oes_derivatives(const _mesa_glsl_parse_state *state)
 {
    return state->stage == MESA_SHADER_FRAGMENT &&
           (state->is_version(110, 300) ||
-           state->OES_standard_derivatives_enable);
+           state->OES_standard_derivatives_enable ||
+           state->ctx->Const.AllowGLSLRelaxedES);
 }
 
 static bool
index e4bf634abe881986c8fdd83e74a952bf99ae6be3..487a1ffcb0548a95b014aaf7524d717d62458f4e 100644 (file)
@@ -894,7 +894,7 @@ validate_intrastage_arrays(struct gl_shader_program *prog,
  * Perform validation of global variables used across multiple shaders
  */
 static void
-cross_validate_globals(struct gl_shader_program *prog,
+cross_validate_globals(struct gl_context *ctx, struct gl_shader_program *prog,
                        struct exec_list *ir, glsl_symbol_table *variables,
                        bool uniforms_only)
 {
@@ -1115,7 +1115,8 @@ cross_validate_globals(struct gl_shader_program *prog,
          /* Check the precision qualifier matches for uniform variables on
           * GLSL ES.
           */
-         if (prog->IsES && !var->get_interface_type() &&
+         if (!ctx->Const.AllowGLSLRelaxedES &&
+             prog->IsES && !var->get_interface_type() &&
              existing->data.precision != var->data.precision) {
             if ((existing->data.used && var->data.used) || prog->data->Version >= 300) {
                linker_error(prog, "declarations for %s `%s` have "
@@ -1168,15 +1169,16 @@ cross_validate_globals(struct gl_shader_program *prog,
  * Perform validation of uniforms used across multiple shader stages
  */
 static void
-cross_validate_uniforms(struct gl_shader_program *prog)
+cross_validate_uniforms(struct gl_context *ctx,
+                        struct gl_shader_program *prog)
 {
    glsl_symbol_table variables;
    for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
       if (prog->_LinkedShaders[i] == NULL)
          continue;
 
-      cross_validate_globals(prog, prog->_LinkedShaders[i]->ir, &variables,
-                             true);
+      cross_validate_globals(ctx, prog, prog->_LinkedShaders[i]->ir,
+                             &variables, true);
    }
 }
 
@@ -2210,7 +2212,8 @@ link_intrastage_shaders(void *mem_ctx,
    for (unsigned i = 0; i < num_shaders; i++) {
       if (shader_list[i] == NULL)
          continue;
-      cross_validate_globals(prog, shader_list[i]->ir, &variables, false);
+      cross_validate_globals(ctx, prog, shader_list[i]->ir, &variables,
+                             false);
    }
 
    if (!prog->data->LinkStatus)
@@ -4807,7 +4810,8 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
       min_version = MIN2(min_version, prog->Shaders[i]->Version);
       max_version = MAX2(max_version, prog->Shaders[i]->Version);
 
-      if (prog->Shaders[i]->IsES != prog->Shaders[0]->IsES) {
+      if (!ctx->Const.AllowGLSLRelaxedES &&
+          prog->Shaders[i]->IsES != prog->Shaders[0]->IsES) {
          linker_error(prog, "all shaders must use same shading "
                       "language version\n");
          goto done;
@@ -4825,7 +4829,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
    /* In desktop GLSL, different shader versions may be linked together.  In
     * GLSL ES, all shader versions must be the same.
     */
-   if (prog->Shaders[0]->IsES && min_version != max_version) {
+   if (!ctx->Const.AllowGLSLRelaxedES && min_version != max_version) {
       linker_error(prog, "all shaders must use same shading "
                    "language version\n");
       goto done;
@@ -4951,7 +4955,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
     * performed, then locations are assigned for uniforms, attributes, and
     * varyings.
     */
-   cross_validate_uniforms(prog);
+   cross_validate_uniforms(ctx, prog);
    if (!prog->data->LinkStatus)
       goto done;
 
index f25f208008057acad0fe0ab46115a34d25726fbd..90dbf658a6d58053693dfc1e92d47dbe683b2807 100644 (file)
@@ -24,6 +24,7 @@ DRI_CONF_SECTION_DEBUG
    DRI_CONF_FORCE_GLSL_VERSION(0)
    DRI_CONF_ALLOW_GLSL_EXTENSION_DIRECTIVE_MIDSHADER("false")
    DRI_CONF_ALLOW_GLSL_BUILTIN_CONST_EXPRESSION("false")
+   DRI_CONF_ALLOW_GLSL_RELAXED_ES("false")
    DRI_CONF_ALLOW_GLSL_BUILTIN_VARIABLE_REDECLARATION("false")
    DRI_CONF_ALLOW_GLSL_CROSS_STAGE_INTERPOLATION_MISMATCH("false")
    DRI_CONF_ALLOW_HIGHER_COMPAT_VERSION("false")
index 1efc7f081d1ab85b2ffc64401bc1598fd312e77c..5b72c0afc9948d7dba11e7c9ed31b24b72c3aba3 100644 (file)
@@ -223,6 +223,7 @@ struct st_config_options
    unsigned force_glsl_version;
    boolean allow_glsl_extension_directive_midshader;
    boolean allow_glsl_builtin_const_expression;
+   boolean allow_glsl_relaxed_es;
    boolean allow_glsl_builtin_variable_redeclaration;
    boolean allow_higher_compat_version;
    boolean glsl_zero_init;
index a86b7519364e92326a1502e68c0806de8b6075d3..6228425d9a2d6e3a11c47d6ee906059660eae2fd 100644 (file)
@@ -76,6 +76,8 @@ dri_fill_st_options(struct dri_screen *screen)
       driQueryOptionb(optionCache, "allow_glsl_extension_directive_midshader");
    options->allow_glsl_builtin_const_expression =
       driQueryOptionb(optionCache, "allow_glsl_builtin_const_expression");
+   options->allow_glsl_relaxed_es =
+      driQueryOptionb(optionCache, "allow_glsl_relaxed_es");
    options->allow_glsl_builtin_variable_redeclaration =
       driQueryOptionb(optionCache, "allow_glsl_builtin_variable_redeclaration");
    options->allow_higher_compat_version =
index e7d9c03cfde9efa8a24cf4a23b6670f843f103ec..220751ba7bbcb9411d89b6148dac2c55150463b6 100644 (file)
@@ -3727,6 +3727,12 @@ struct gl_constants
     */
    GLboolean AllowGLSLBuiltinConstantExpression;
 
+   /**
+    * Allow some relaxation of GLSL ES shader restrictions. This encompasses
+    * a number of relaxations to the ES shader rules.
+    */
+   GLboolean AllowGLSLRelaxedES;
+
    /**
     * Allow GLSL built-in variables to be redeclared verbatim
     */
index 6586240cb03b8e4dd1c9b65c1ed466840dc21a47..f18eafe898d25cf2e1be1206b3eacc93fbe406cc 100644 (file)
@@ -1137,6 +1137,9 @@ void st_init_extensions(struct pipe_screen *screen,
    if (options->allow_glsl_builtin_const_expression)
       consts->AllowGLSLBuiltinConstantExpression = GL_TRUE;
 
+   if (options->allow_glsl_relaxed_es)
+      consts->AllowGLSLRelaxedES = GL_TRUE;
+
    consts->MinMapBufferAlignment =
       screen->get_param(screen, PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT);
 
index 1a4945d6888c13dc79eec1b102851d2d85867dbf..f0537e965b8a3cda894c51937691a0d5d9504dd4 100644 (file)
@@ -120,6 +120,11 @@ DRI_CONF_OPT_BEGIN_B(allow_glsl_builtin_const_expression, def) \
         DRI_CONF_DESC(en,gettext("Allow builtins as part of constant expressions")) \
 DRI_CONF_OPT_END
 
+#define DRI_CONF_ALLOW_GLSL_RELAXED_ES(def) \
+DRI_CONF_OPT_BEGIN_B(allow_glsl_relaxed_es, def) \
+        DRI_CONF_DESC(en,gettext("Allow some relaxation of GLSL ES shader restrictions")) \
+DRI_CONF_OPT_END
+
 #define DRI_CONF_ALLOW_GLSL_BUILTIN_VARIABLE_REDECLARATION(def) \
 DRI_CONF_OPT_BEGIN_B(allow_glsl_builtin_variable_redeclaration, def) \
         DRI_CONF_DESC(en,gettext("Allow GLSL built-in variables to be redeclared verbatim")) \