diff options
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/shader/slang/slang_codegen.c | 77 |
1 files changed, 59 insertions, 18 deletions
diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c index b807d2cc183..e1515c74ee4 100644 --- a/src/mesa/shader/slang/slang_codegen.c +++ b/src/mesa/shader/slang/slang_codegen.c @@ -2717,6 +2717,8 @@ static slang_ir_node * _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var, slang_operation *initializer) { + const char *varName = (const char *) var->a_name; + const GLenum datatype = _slang_gltype_from_specifier(&var->type.specifier); slang_ir_node *varDecl, *n; slang_ir_storage *store; @@ -2736,29 +2738,24 @@ _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var, assert(store == varDecl->Store); - /* determine GPU storage file */ - /* XXX if the variable is const, use PROGRAM_CONSTANT */ + /* determine GPU register file for simple cases */ if (is_sampler_type(&var->type)) { store->File = PROGRAM_SAMPLER; } + else if (var->type.qualifier == SLANG_QUAL_UNIFORM) { + store->File = PROGRAM_UNIFORM; + } else { store->File = PROGRAM_TEMPORARY; } store->Size = _slang_sizeof_type_specifier(&varDecl->Var->type.specifier); - if (store->Size <= 0) { slang_info_log_error(A->log, "invalid declaration for '%s'", (char*) var->a_name); return NULL; } -#if 0 - printf("%s var %p %s store=%p index=%d size=%d\n", - __FUNCTION__, (void *) var, (char *) var->a_name, - (void *) store, store->Index, store->Size); -#endif - if (var->type.array_len > 0) { /* the type is an array, ex: float[4] x; */ GLint sz = (store->Size + 3) & ~3; @@ -2778,7 +2775,6 @@ _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var, /* if there's an initializer, generate IR for the expression */ if (initializer) { - const char *varName = (const char *) var->a_name; slang_ir_node *varRef, *init; if (var->type.qualifier == SLANG_QUAL_CONST) { @@ -2804,14 +2800,39 @@ _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var, /* constant-folding, etc here */ _slang_simplify(initializer, &A->space, A->atoms); - if ((var->type.qualifier == SLANG_QUAL_CONST || - var->type.qualifier == SLANG_QUAL_UNIFORM) && - initializer->type == SLANG_OPER_CALL && - initializer->array_constructor) { - printf("Constant array initializer\n"); - make_constant_array(A, var, initializer); - n = varRef; - return n; + /* look for simple constant-valued variables and uniforms */ + if (var->type.qualifier == SLANG_QUAL_CONST || + var->type.qualifier == SLANG_QUAL_UNIFORM) { + + if (initializer->type == SLANG_OPER_CALL && + initializer->array_constructor) { + /* array initializer */ + make_constant_array(A, var, initializer); + return varRef; + } + else if (initializer->type == SLANG_OPER_LITERAL_FLOAT || + initializer->type == SLANG_OPER_LITERAL_INT) { + /* simple float/vector initializer */ + if (store->File == PROGRAM_UNIFORM) { + store->Index = _mesa_add_uniform(A->program->Parameters, + varName, + store->Size, datatype, + initializer->literal); + /* XXX fix store->Swizzle here */ + return varRef; + } +#if 0 + else { + store->File = PROGRAM_CONSTANT; + store->Index = _mesa_add_named_constant(A->program->Parameters, + varName, + initializer->literal, + store->Size); + /* XXX fix swizzle here */ + return varRef; + } +#endif + } } /* IR for initializer */ @@ -2834,6 +2855,19 @@ _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var, n = varDecl; } + if (store->File == PROGRAM_UNIFORM && store->Index < 0) { + /* */ + store->Index = _mesa_add_uniform(A->program->Parameters, varName, + store->Size, datatype, NULL); + store->Swizzle = _slang_var_swizzle(store->Size, 0); + } + +#if 0 + printf("%s var %p %s store=%p index=%d size=%d\n", + __FUNCTION__, (void *) var, (char *) varName, + (void *) store, store->Index, store->Size); +#endif + return n; } @@ -4024,6 +4058,12 @@ _slang_codegen_global_variable(slang_assemble_ctx *A, slang_variable *var, } } else { + /* non-struct uniform */ +#if 01 + if (!_slang_gen_var_decl(A, var, var->initializer)) + return GL_FALSE; + store = var->store; +#else GLint uniformLoc; const GLfloat *initialValues = NULL; #if 0 @@ -4052,6 +4092,7 @@ _slang_codegen_global_variable(slang_assemble_ctx *A, slang_variable *var, totalSize, datatype, initialValues); store = _slang_new_ir_storage_swz(PROGRAM_UNIFORM, uniformLoc, totalSize, swizzle); +#endif } } else { |