mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 13:40:16 +01:00
mesa/util: add allow_glsl_relaxed_es driconfig override
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>
This commit is contained in:
parent
781c23ece6
commit
725b1a406d
8 changed files with 33 additions and 10 deletions
|
|
@ -446,7 +446,8 @@ fs_oes_derivatives(const _mesa_glsl_parse_state *state)
|
||||||
{
|
{
|
||||||
return state->stage == MESA_SHADER_FRAGMENT &&
|
return state->stage == MESA_SHADER_FRAGMENT &&
|
||||||
(state->is_version(110, 300) ||
|
(state->is_version(110, 300) ||
|
||||||
state->OES_standard_derivatives_enable);
|
state->OES_standard_derivatives_enable ||
|
||||||
|
state->ctx->Const.AllowGLSLRelaxedES);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
|
|
||||||
|
|
@ -894,7 +894,7 @@ validate_intrastage_arrays(struct gl_shader_program *prog,
|
||||||
* Perform validation of global variables used across multiple shaders
|
* Perform validation of global variables used across multiple shaders
|
||||||
*/
|
*/
|
||||||
static void
|
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,
|
struct exec_list *ir, glsl_symbol_table *variables,
|
||||||
bool uniforms_only)
|
bool uniforms_only)
|
||||||
{
|
{
|
||||||
|
|
@ -1115,7 +1115,8 @@ cross_validate_globals(struct gl_shader_program *prog,
|
||||||
/* Check the precision qualifier matches for uniform variables on
|
/* Check the precision qualifier matches for uniform variables on
|
||||||
* GLSL ES.
|
* 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) {
|
existing->data.precision != var->data.precision) {
|
||||||
if ((existing->data.used && var->data.used) || prog->data->Version >= 300) {
|
if ((existing->data.used && var->data.used) || prog->data->Version >= 300) {
|
||||||
linker_error(prog, "declarations for %s `%s` have "
|
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
|
* Perform validation of uniforms used across multiple shader stages
|
||||||
*/
|
*/
|
||||||
static void
|
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;
|
glsl_symbol_table variables;
|
||||||
for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
|
for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
|
||||||
if (prog->_LinkedShaders[i] == NULL)
|
if (prog->_LinkedShaders[i] == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
cross_validate_globals(prog, prog->_LinkedShaders[i]->ir, &variables,
|
cross_validate_globals(ctx, prog, prog->_LinkedShaders[i]->ir,
|
||||||
true);
|
&variables, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2210,7 +2212,8 @@ link_intrastage_shaders(void *mem_ctx,
|
||||||
for (unsigned i = 0; i < num_shaders; i++) {
|
for (unsigned i = 0; i < num_shaders; i++) {
|
||||||
if (shader_list[i] == NULL)
|
if (shader_list[i] == NULL)
|
||||||
continue;
|
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)
|
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);
|
min_version = MIN2(min_version, prog->Shaders[i]->Version);
|
||||||
max_version = MAX2(max_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 "
|
linker_error(prog, "all shaders must use same shading "
|
||||||
"language version\n");
|
"language version\n");
|
||||||
goto done;
|
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
|
/* In desktop GLSL, different shader versions may be linked together. In
|
||||||
* GLSL ES, all shader versions must be the same.
|
* 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 "
|
linker_error(prog, "all shaders must use same shading "
|
||||||
"language version\n");
|
"language version\n");
|
||||||
goto done;
|
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
|
* performed, then locations are assigned for uniforms, attributes, and
|
||||||
* varyings.
|
* varyings.
|
||||||
*/
|
*/
|
||||||
cross_validate_uniforms(prog);
|
cross_validate_uniforms(ctx, prog);
|
||||||
if (!prog->data->LinkStatus)
|
if (!prog->data->LinkStatus)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ DRI_CONF_SECTION_DEBUG
|
||||||
DRI_CONF_FORCE_GLSL_VERSION(0)
|
DRI_CONF_FORCE_GLSL_VERSION(0)
|
||||||
DRI_CONF_ALLOW_GLSL_EXTENSION_DIRECTIVE_MIDSHADER("false")
|
DRI_CONF_ALLOW_GLSL_EXTENSION_DIRECTIVE_MIDSHADER("false")
|
||||||
DRI_CONF_ALLOW_GLSL_BUILTIN_CONST_EXPRESSION("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_BUILTIN_VARIABLE_REDECLARATION("false")
|
||||||
DRI_CONF_ALLOW_GLSL_CROSS_STAGE_INTERPOLATION_MISMATCH("false")
|
DRI_CONF_ALLOW_GLSL_CROSS_STAGE_INTERPOLATION_MISMATCH("false")
|
||||||
DRI_CONF_ALLOW_HIGHER_COMPAT_VERSION("false")
|
DRI_CONF_ALLOW_HIGHER_COMPAT_VERSION("false")
|
||||||
|
|
|
||||||
|
|
@ -223,6 +223,7 @@ struct st_config_options
|
||||||
unsigned force_glsl_version;
|
unsigned force_glsl_version;
|
||||||
boolean allow_glsl_extension_directive_midshader;
|
boolean allow_glsl_extension_directive_midshader;
|
||||||
boolean allow_glsl_builtin_const_expression;
|
boolean allow_glsl_builtin_const_expression;
|
||||||
|
boolean allow_glsl_relaxed_es;
|
||||||
boolean allow_glsl_builtin_variable_redeclaration;
|
boolean allow_glsl_builtin_variable_redeclaration;
|
||||||
boolean allow_higher_compat_version;
|
boolean allow_higher_compat_version;
|
||||||
boolean glsl_zero_init;
|
boolean glsl_zero_init;
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,8 @@ dri_fill_st_options(struct dri_screen *screen)
|
||||||
driQueryOptionb(optionCache, "allow_glsl_extension_directive_midshader");
|
driQueryOptionb(optionCache, "allow_glsl_extension_directive_midshader");
|
||||||
options->allow_glsl_builtin_const_expression =
|
options->allow_glsl_builtin_const_expression =
|
||||||
driQueryOptionb(optionCache, "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 =
|
options->allow_glsl_builtin_variable_redeclaration =
|
||||||
driQueryOptionb(optionCache, "allow_glsl_builtin_variable_redeclaration");
|
driQueryOptionb(optionCache, "allow_glsl_builtin_variable_redeclaration");
|
||||||
options->allow_higher_compat_version =
|
options->allow_higher_compat_version =
|
||||||
|
|
|
||||||
|
|
@ -3727,6 +3727,12 @@ struct gl_constants
|
||||||
*/
|
*/
|
||||||
GLboolean AllowGLSLBuiltinConstantExpression;
|
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
|
* Allow GLSL built-in variables to be redeclared verbatim
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -1137,6 +1137,9 @@ void st_init_extensions(struct pipe_screen *screen,
|
||||||
if (options->allow_glsl_builtin_const_expression)
|
if (options->allow_glsl_builtin_const_expression)
|
||||||
consts->AllowGLSLBuiltinConstantExpression = GL_TRUE;
|
consts->AllowGLSLBuiltinConstantExpression = GL_TRUE;
|
||||||
|
|
||||||
|
if (options->allow_glsl_relaxed_es)
|
||||||
|
consts->AllowGLSLRelaxedES = GL_TRUE;
|
||||||
|
|
||||||
consts->MinMapBufferAlignment =
|
consts->MinMapBufferAlignment =
|
||||||
screen->get_param(screen, PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT);
|
screen->get_param(screen, PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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_DESC(en,gettext("Allow builtins as part of constant expressions")) \
|
||||||
DRI_CONF_OPT_END
|
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) \
|
#define DRI_CONF_ALLOW_GLSL_BUILTIN_VARIABLE_REDECLARATION(def) \
|
||||||
DRI_CONF_OPT_BEGIN_B(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")) \
|
DRI_CONF_DESC(en,gettext("Allow GLSL built-in variables to be redeclared verbatim")) \
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue