diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/shader/slang/slang_codegen.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c index ea35d679694..8ab1fa8f2a6 100644 --- a/src/mesa/shader/slang/slang_codegen.c +++ b/src/mesa/shader/slang/slang_codegen.c @@ -3708,11 +3708,6 @@ _slang_codegen_global_variable(slang_assemble_ctx *A, slang_variable *var, const GLint totalSize = array_size(size, var->array_len); const GLuint swizzle = _slang_var_swizzle(totalSize, 0); - if (var->initializer) { - slang_info_log_error(A->log, "illegal initializer for uniform '%s'", varName); - return GL_FALSE; - } - if (prog) { /* user-defined uniform */ if (datatype == GL_NONE) { @@ -3737,6 +3732,12 @@ _slang_codegen_global_variable(slang_assemble_ctx *A, slang_variable *var, * "f.a" (GL_FLOAT_VEC3) * "f.b" (GL_FLOAT_VEC4) */ + + if (var->initializer) { + slang_info_log_error(A->log, + "unsupported initializer for uniform '%s'", varName); + return GL_FALSE; + } } else { slang_info_log_error(A->log, @@ -3750,6 +3751,22 @@ _slang_codegen_global_variable(slang_assemble_ctx *A, slang_variable *var, totalSize, datatype); store = _slang_new_ir_storage_swz(PROGRAM_UNIFORM, uniformLoc, totalSize, swizzle); + if (var->initializer) { + _slang_simplify(var->initializer, &A->space, A->atoms); + if (var->initializer->type == SLANG_OPER_LITERAL_FLOAT || + var->initializer->type == SLANG_OPER_LITERAL_INT) { + /* simple float/vector initializer */ + GLfloat *uniformValue = + prog->Parameters->ParameterValues[uniformLoc]; + COPY_4V(uniformValue, var->initializer->literal); + } + else { + /* complex initializer */ + slang_info_log_error(A->log, + "unsupported initializer for uniform '%s'", varName); + return GL_FALSE; + } + } } } else { |