mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-16 15:50:19 +01:00
slang_variable_scope now stores array of pointers to slang_variables.
This commit is contained in:
parent
97c7937c65
commit
5daa99d2a4
6 changed files with 63 additions and 39 deletions
|
|
@ -218,7 +218,7 @@ sizeof_variables(slang_assemble_ctx * A, slang_variable_scope * vars,
|
|||
GLuint i;
|
||||
|
||||
for (i = start; i < stop; i++)
|
||||
if (!sizeof_variable2(A, &vars->variables[i], size))
|
||||
if (!sizeof_variable2(A, vars->variables[i], size))
|
||||
return GL_FALSE;
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
|
@ -270,7 +270,7 @@ _slang_locate_function(const slang_function_scope * funcs, slang_atom a_name,
|
|||
return NULL;
|
||||
}
|
||||
if (!slang_type_specifier_equal(&ti.spec,
|
||||
&f->parameters->variables[j/* + haveRetValue*/].type.specifier)) {
|
||||
&f->parameters->variables[j/* + haveRetValue*/]->type.specifier)) {
|
||||
slang_assembly_typeinfo_destruct(&ti);
|
||||
break;
|
||||
}
|
||||
|
|
@ -278,8 +278,8 @@ _slang_locate_function(const slang_function_scope * funcs, slang_atom a_name,
|
|||
|
||||
/* "out" and "inout" formal parameter requires the actual parameter to be l-value */
|
||||
if (!ti.can_be_referenced &&
|
||||
(f->parameters->variables[j/* + haveRetValue*/].type.qualifier == slang_qual_out ||
|
||||
f->parameters->variables[j/* + haveRetValue*/].type.qualifier == slang_qual_inout))
|
||||
(f->parameters->variables[j/* + haveRetValue*/]->type.qualifier == slang_qual_out ||
|
||||
f->parameters->variables[j/* + haveRetValue*/]->type.qualifier == slang_qual_inout))
|
||||
break;
|
||||
}
|
||||
if (j == num_args)
|
||||
|
|
@ -599,8 +599,8 @@ _slang_assemble_function_call(slang_assemble_ctx * A, slang_function * fun,
|
|||
|
||||
/* push the actual parameters on the stack */
|
||||
for (i = 0; i < param_count; i++) {
|
||||
if (fun->parameters->variables[i /*+ haveRetValue*/].type.qualifier == slang_qual_inout ||
|
||||
fun->parameters->variables[i /*+ haveRetValue*/].type.qualifier == slang_qual_out) {
|
||||
if (fun->parameters->variables[i /*+ haveRetValue*/]->type.qualifier == slang_qual_inout ||
|
||||
fun->parameters->variables[i /*+ haveRetValue*/]->type.qualifier == slang_qual_out) {
|
||||
if (!PLAB2(A->file, slang_asm_local_addr, A->local.addr_tmp, 4))
|
||||
return GL_FALSE;
|
||||
/* TODO: optimize the "out" parameter case */
|
||||
|
|
@ -644,8 +644,8 @@ _slang_assemble_function_call(slang_assemble_ctx * A, slang_function * fun,
|
|||
|
||||
A->swz = p_swz[j];
|
||||
A->ref = p_ref[j];
|
||||
if (fun->parameters->variables[j /*+ haveRetValue*/].type.qualifier == slang_qual_inout ||
|
||||
fun->parameters->variables[j/* + haveRetValue*/].type.qualifier == slang_qual_out) {
|
||||
if (fun->parameters->variables[j /*+ haveRetValue*/]->type.qualifier == slang_qual_inout ||
|
||||
fun->parameters->variables[j/* + haveRetValue*/]->type.qualifier == slang_qual_out) {
|
||||
/* for output parameter copy the contents of the formal parameter
|
||||
* back to the original actual parameter
|
||||
*/
|
||||
|
|
@ -1088,7 +1088,7 @@ handle_field(slang_assemble_ctx * A, slang_assembly_typeinfo * tia,
|
|||
slang_storage_aggregate agg;
|
||||
GLuint size;
|
||||
|
||||
field = &tib->spec._struct->fields->variables[i];
|
||||
field = tib->spec._struct->fields->variables[i];
|
||||
if (!slang_storage_aggregate_construct(&agg))
|
||||
RETURN_NIL();
|
||||
if (!_slang_aggregate_variable(&agg, &field->type.specifier,
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
#include "imports.h"
|
||||
#include "mtypes.h"
|
||||
#include "slang_utility.h"
|
||||
#include "slang_vartable.h"
|
||||
|
||||
#if defined __cplusplus
|
||||
extern "C" {
|
||||
|
|
@ -243,12 +244,6 @@ typedef struct slang_assembly_name_space_
|
|||
} slang_assembly_name_space;
|
||||
|
||||
|
||||
typedef struct {
|
||||
GLboolean TempUsed[MAX_PROGRAM_TEMPS];
|
||||
GLuint NumSamplers;
|
||||
} slang_gen_context;
|
||||
|
||||
|
||||
typedef struct slang_assemble_ctx_
|
||||
{
|
||||
slang_assembly_file *file;
|
||||
|
|
@ -260,7 +255,7 @@ typedef struct slang_assemble_ctx_
|
|||
slang_ref_type ref;
|
||||
slang_swizzle swz;
|
||||
struct gl_program *program;
|
||||
slang_gen_context *codegen;
|
||||
slang_var_table *vartable;
|
||||
} slang_assemble_ctx;
|
||||
|
||||
extern struct slang_function_ *
|
||||
|
|
|
|||
|
|
@ -196,8 +196,8 @@ slang_function_scope_find(slang_function_scope * funcs, slang_function * fun,
|
|||
continue;
|
||||
for (j = haveRetValue; j < fun->param_count; j++) {
|
||||
if (!slang_type_specifier_equal
|
||||
(&fun->parameters->variables[j].type.specifier,
|
||||
&f->parameters->variables[j].type.specifier))
|
||||
(&fun->parameters->variables[j]->type.specifier,
|
||||
&f->parameters->variables[j]->type.specifier))
|
||||
break;
|
||||
}
|
||||
if (j == fun->param_count) {
|
||||
|
|
|
|||
|
|
@ -153,8 +153,8 @@ int slang_struct_equal (const slang_struct *x, const slang_struct *y)
|
|||
return 0;
|
||||
for (i = 0; i < x->fields->num_variables; i++)
|
||||
{
|
||||
slang_variable *varx = &x->fields->variables[i];
|
||||
slang_variable *vary = &y->fields->variables[i];
|
||||
slang_variable *varx = x->fields->variables[i];
|
||||
slang_variable *vary = y->fields->variables[i];
|
||||
|
||||
if (varx->a_name != vary->a_name)
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -123,6 +123,29 @@ slang_fully_specified_type_copy(slang_fully_specified_type * x,
|
|||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static slang_variable *
|
||||
slang_variable_new(void)
|
||||
{
|
||||
slang_variable *v = (slang_variable *) malloc(sizeof(slang_variable));
|
||||
if (v) {
|
||||
if (!slang_variable_construct(v)) {
|
||||
free(v);
|
||||
v = NULL;
|
||||
}
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
slang_variable_delete(slang_variable * var)
|
||||
{
|
||||
slang_variable_destruct(var);
|
||||
free(var);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* slang_variable_scope
|
||||
*/
|
||||
|
|
@ -152,8 +175,10 @@ slang_variable_scope_destruct(slang_variable_scope * scope)
|
|||
|
||||
if (!scope)
|
||||
return;
|
||||
for (i = 0; i < scope->num_variables; i++)
|
||||
slang_variable_destruct(scope->variables + i);
|
||||
for (i = 0; i < scope->num_variables; i++) {
|
||||
if (scope->variables[i])
|
||||
slang_variable_delete(scope->variables[i]);
|
||||
}
|
||||
slang_alloc_free(scope->variables);
|
||||
/* do not free scope->outer_scope */
|
||||
}
|
||||
|
|
@ -166,21 +191,22 @@ slang_variable_scope_copy(slang_variable_scope * x,
|
|||
unsigned int i;
|
||||
|
||||
_slang_variable_scope_ctr(&z);
|
||||
z.variables = (slang_variable *)
|
||||
slang_alloc_malloc(y->num_variables * sizeof(slang_variable));
|
||||
z.variables = (slang_variable **)
|
||||
_mesa_calloc(y->num_variables * sizeof(slang_variable *));
|
||||
if (z.variables == NULL) {
|
||||
slang_variable_scope_destruct(&z);
|
||||
return 0;
|
||||
}
|
||||
for (z.num_variables = 0; z.num_variables < y->num_variables;
|
||||
z.num_variables++) {
|
||||
if (!slang_variable_construct(&z.variables[z.num_variables])) {
|
||||
z.variables[z.num_variables] = slang_variable_new();
|
||||
if (!z.variables[z.num_variables]) {
|
||||
slang_variable_scope_destruct(&z);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < z.num_variables; i++) {
|
||||
if (!slang_variable_copy(&z.variables[i], &y->variables[i])) {
|
||||
if (!slang_variable_copy(z.variables[i], y->variables[i])) {
|
||||
slang_variable_scope_destruct(&z);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -200,19 +226,20 @@ slang_variable *
|
|||
slang_variable_scope_grow(slang_variable_scope *scope)
|
||||
{
|
||||
const int n = scope->num_variables;
|
||||
scope->variables = (slang_variable *)
|
||||
scope->variables = (slang_variable **)
|
||||
slang_alloc_realloc(scope->variables,
|
||||
n * sizeof(slang_variable),
|
||||
(n + 1) * sizeof(slang_variable));
|
||||
n * sizeof(slang_variable *),
|
||||
(n + 1) * sizeof(slang_variable *));
|
||||
if (!scope->variables)
|
||||
return NULL;
|
||||
|
||||
scope->num_variables++;
|
||||
|
||||
if (!slang_variable_construct(scope->variables + n))
|
||||
scope->variables[n] = slang_variable_new();
|
||||
if (!scope->variables[n])
|
||||
return NULL;
|
||||
|
||||
return scope->variables + n;
|
||||
return scope->variables[n];
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -230,12 +257,13 @@ slang_variable_construct(slang_variable * var)
|
|||
var->address = ~0;
|
||||
var->size = 0;
|
||||
var->global = GL_FALSE;
|
||||
var->declared = GL_FALSE;
|
||||
var->isTemp = GL_FALSE;
|
||||
var->used = GL_FALSE;
|
||||
var->aux = NULL;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
slang_variable_destruct(slang_variable * var)
|
||||
{
|
||||
|
|
@ -246,6 +274,7 @@ slang_variable_destruct(slang_variable * var)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
slang_variable_copy(slang_variable * x, const slang_variable * y)
|
||||
{
|
||||
|
|
@ -291,8 +320,8 @@ _slang_locate_variable(const slang_variable_scope * scope,
|
|||
GLuint i;
|
||||
|
||||
for (i = 0; i < scope->num_variables; i++)
|
||||
if (a_name == scope->variables[i].a_name)
|
||||
return &scope->variables[i];
|
||||
if (a_name == scope->variables[i]->a_name)
|
||||
return scope->variables[i];
|
||||
if (all && scope->outer_scope != NULL)
|
||||
return _slang_locate_variable(scope->outer_scope, a_name, 1);
|
||||
return NULL;
|
||||
|
|
@ -384,7 +413,7 @@ build_quant(slang_export_data_quant * q, const slang_variable * var)
|
|||
slang_export_data_quant_ctr(&q->structure[i]);
|
||||
for (i = 0; i < q->u.field_count; i++) {
|
||||
if (!build_quant(&q->structure[i],
|
||||
&spec->_struct->fields->variables[i]))
|
||||
spec->_struct->fields->variables[i]))
|
||||
return GL_FALSE;
|
||||
}
|
||||
}
|
||||
|
|
@ -400,7 +429,7 @@ _slang_build_export_data_table(slang_export_data_table * tbl,
|
|||
GLuint i;
|
||||
|
||||
for (i = 0; i < vars->num_variables; i++) {
|
||||
const slang_variable *var = &vars->variables[i];
|
||||
const slang_variable *var = vars->variables[i];
|
||||
slang_export_data_entry *e;
|
||||
|
||||
e = slang_export_data_table_add(tbl);
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ typedef struct slang_variable_
|
|||
GLuint size; /**< Variable's size in bytes */
|
||||
GLboolean global; /**< A global var? */
|
||||
GLboolean used; /**< Ever referenced by code? */
|
||||
GLboolean declared; /**< Declared by slang_variable_decl? */
|
||||
GLboolean isTemp; /**< a named temporary (__resultTmp) */
|
||||
void *aux; /**< Used during code gen */
|
||||
} slang_variable;
|
||||
|
||||
|
|
@ -91,7 +91,7 @@ typedef struct slang_variable_
|
|||
*/
|
||||
typedef struct slang_variable_scope_
|
||||
{
|
||||
slang_variable *variables; /**< Array [num_variables] */
|
||||
slang_variable **variables; /**< Array [num_variables] of ptrs to vars */
|
||||
GLuint num_variables;
|
||||
struct slang_variable_scope_ *outer_scope;
|
||||
} slang_variable_scope;
|
||||
|
|
@ -110,7 +110,7 @@ extern int
|
|||
slang_variable_scope_copy(slang_variable_scope *,
|
||||
const slang_variable_scope *);
|
||||
|
||||
slang_variable *
|
||||
extern slang_variable *
|
||||
slang_variable_scope_grow(slang_variable_scope *);
|
||||
|
||||
extern int
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue