diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c index ecb2f6d..34784bb 100644 --- a/src/mesa/shader/slang/slang_codegen.c +++ b/src/mesa/shader/slang/slang_codegen.c @@ -5118,21 +5118,11 @@ _slang_codegen_global_variable(slang_assemble_ctx *A, slang_variable *var, } if (prog) { - /* user-defined varying */ - GLbitfield flags; - GLint varyingLoc; - GLuint swizzle; - - flags = 0x0; - if (var->type.centroid == SLANG_CENTROID) - flags |= PROG_PARAM_BIT_CENTROID; - if (var->type.variant == SLANG_INVARIANT) - flags |= PROG_PARAM_BIT_INVARIANT; - - varyingLoc = _mesa_add_varying(prog->Varying, varName, - totalSize, flags); - swizzle = _slang_var_swizzle(size, 0); - store = _slang_new_ir_storage_swz(PROGRAM_VARYING, varyingLoc, + /* User-defined varying. We'll allocate storage (a register slot) + * for it later when it's first used. See emit_var_ref(). + */ + GLuint swizzle = _slang_var_swizzle(size, 0); + store = _slang_new_ir_storage_swz(PROGRAM_VARYING, -1, totalSize, swizzle); } else { diff --git a/src/mesa/shader/slang/slang_emit.c b/src/mesa/shader/slang/slang_emit.c index 7c0ea0c..efcb4c0 100644 --- a/src/mesa/shader/slang/slang_emit.c +++ b/src/mesa/shader/slang/slang_emit.c @@ -2286,6 +2286,24 @@ emit_var_decl(slang_emit_info *emitInfo, slang_ir_node *n) /** + * Examine the fully specified type to gather the optional flags for a + * varying variable. CENTROID and INVARIANT are the only flags at this time. + */ +static GLbitfield +compute_varying_flags(const slang_fully_specified_type *type) +{ + GLbitfield flags = 0x0; + + if (type->centroid == SLANG_CENTROID) + flags |= PROG_PARAM_BIT_CENTROID; + if (type->variant == SLANG_INVARIANT) + flags |= PROG_PARAM_BIT_INVARIANT; + + return flags; +} + + +/** * Emit code for a reference to a variable. * Actually, no code is generated but we may do some memory allocation. * In particular, state vars (uniforms) are allocated on an as-needed basis. @@ -2293,6 +2311,8 @@ emit_var_decl(slang_emit_info *emitInfo, slang_ir_node *n) static struct prog_instruction * emit_var_ref(slang_emit_info *emitInfo, slang_ir_node *n) { + const char *varName = n->Var ? (const char *) n->Var->a_name : NULL; + assert(n->Store); assert(n->Store->File != PROGRAM_UNDEFINED); @@ -2303,18 +2323,23 @@ emit_var_ref(slang_emit_info *emitInfo, slang_ir_node *n) /* error */ char s[100]; /* XXX isn't this really an out of memory/resources error? */ - _mesa_snprintf(s, sizeof(s), "Undefined variable '%s'", - (char *) n->Var->a_name); + _mesa_snprintf(s, sizeof(s), "Undefined variable '%s'", varName); slang_info_log_error(emitInfo->log, s); return NULL; } n->Store->Index = index; } + else if (n->Store->File == PROGRAM_VARYING && n->Store->Index < 0) { + /* Allocate storage for a user-defined varying variable */ + const GLbitfield flags = compute_varying_flags(&n->Var->type); + n->Store->Index = _mesa_add_varying(emitInfo->prog->Varying, varName, + n->Store->Size, flags); + } else if (n->Store->File == PROGRAM_UNIFORM || n->Store->File == PROGRAM_SAMPLER) { /* mark var as used */ - _mesa_use_uniform(emitInfo->prog->Parameters, (char *) n->Var->a_name); + _mesa_use_uniform(emitInfo->prog->Parameters, varName); } else if (n->Store->File == PROGRAM_INPUT) { assert(n->Store->Index >= 0);