Replace slang_allocate_storage() with simpler _slang_attach_storage()

This commit is contained in:
Brian
2007-02-22 10:56:41 -07:00
parent b618ac8c0b
commit 50040573d7
+32 -74
View File
@@ -52,31 +52,6 @@ static slang_ir_node *
_slang_gen_operation(slang_assemble_ctx * A, slang_operation *oper);
/**
* Lookup a named constant and allocate storage for the parameter in
* the given parameter list.
* \param swizzleOut returns swizzle mask for accessing the constant
* \return position of the constant in the paramList.
*/
static GLint
slang_lookup_constant(const char *name,
struct gl_program_parameter_list *paramList,
GLuint *swizzleOut)
{
GLint value = _slang_lookup_constant(name);
if (value >= 0) {
/* XXX named constant! */
GLfloat fvalue = (GLfloat) value;
GLint pos;
pos = _mesa_add_unnamed_constant(paramList, &fvalue, 1, swizzleOut);
return pos;
}
return -1;
}
static GLboolean
is_sampler_type(const slang_fully_specified_type *t)
{
@@ -161,19 +136,24 @@ _slang_sizeof_type_specifier(const slang_type_specifier *spec)
/**
* Allocate storage info for an IR node (n->Store).
* If n is an IR_VAR_DECL, allocate a temporary for the variable.
* Otherwise, if n is an IR_VAR, check if it's a uniform or constant
* that needs to have storage allocated.
* Establish the binding between a slang_ir_node and a slang_variable.
* Then, allocate/attach a slang_ir_storage object to the IR node if needed.
* The IR node must be a IR_VAR or IR_VAR_DECL node.
* \param n the IR node
* \param var the variable to associate with the IR node
*/
static void
slang_allocate_storage(slang_assemble_ctx *A, slang_ir_node *n)
slang_attach_storage(slang_ir_node *n, slang_variable *var)
{
assert(A->vartable);
assert(n);
assert(var);
assert(n->Opcode == IR_VAR || n->Opcode == IR_VAR_DECL);
assert(!n->Var || n->Var == var);
n->Var = var;
if (!n->Store) {
/* allocate storage info for this node */
/* need to setup storage */
if (n->Var && n->Var->aux) {
/* node storage info = var storage info */
n->Store = (slang_ir_storage *) n->Var->aux;
@@ -186,35 +166,6 @@ slang_allocate_storage(slang_assemble_ctx *A, slang_ir_node *n)
assert(n->Var->aux);
}
}
if (n->Opcode == IR_VAR_DECL) {
/* variable declaration */
assert(n->Var);
assert(!is_sampler_type(&n->Var->type));
n->Store->File = PROGRAM_TEMPORARY;
n->Store->Size = _slang_sizeof_type_specifier(&n->Var->type.specifier);
assert(n->Store->Size > 0);
return;
}
else {
assert(n->Opcode == IR_VAR);
assert(n->Var);
if (n->Store->Index < 0) {
const char *varName = (char *) n->Var->a_name;
struct gl_program *prog = A->program;
assert(prog);
if (n->Store->File == PROGRAM_CONSTANT) {
/* XXX compile-time constants should be converted to literals */
GLint i = slang_lookup_constant(varName, prog->Parameters,
&n->Store->Swizzle);
assert(i >= 0);
assert(n->Store->Size == 1);
n->Store->Index = i;
}
}
}
}
@@ -619,15 +570,18 @@ new_if(slang_ir_node *cond, slang_ir_node *ifPart, slang_ir_node *elsePart)
static slang_ir_node *
new_var(slang_assemble_ctx *A, slang_operation *oper, slang_atom name)
{
slang_variable *v = _slang_locate_variable(oper->locals, name, GL_TRUE);
slang_ir_node *n = new_node0(IR_VAR);
if (!v)
slang_ir_node *n;
slang_variable *var = _slang_locate_variable(oper->locals, name, GL_TRUE);
if (!var)
return NULL;
assert(!oper->var || oper->var == v);
v->used = GL_TRUE;
n->Var = v;
slang_allocate_storage(A, n);
assert(!oper->var || oper->var == var);
n = new_node0(IR_VAR);
if (n) {
var->used = GL_TRUE;
slang_attach_storage(n, var);
}
return n;
}
@@ -1643,15 +1597,19 @@ static slang_ir_node *
_slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var)
{
slang_ir_node *n;
assert(!is_sampler_type(&var->type));
n = new_node0(IR_VAR_DECL);
if (n) {
n->Var = var;
slang_allocate_storage(A, n);
assert(n->Store);
assert(n->Store->Index < 0);
assert(n->Store->Size > 0);
slang_attach_storage(n, var);
assert(var->aux);
assert(n->Store == var->aux);
assert(n->Store);
assert(n->Store->Index < 0);
n->Store->File = PROGRAM_TEMPORARY;
n->Store->Size = _slang_sizeof_type_specifier(&n->Var->type.specifier);
assert(n->Store->Size > 0);
}
return n;
}
@@ -2564,7 +2522,7 @@ _slang_gen_operation(slang_assemble_ctx * A, slang_operation *oper)
abort();
return new_node0(IR_NOP);
}
abort();
return NULL;
}