diff options
author | Brian <brian@yutani.localnet.net> | 2007-02-20 15:22:38 -0700 |
---|---|---|
committer | Brian <brian@yutani.localnet.net> | 2007-02-20 15:22:38 -0700 |
commit | 10f42ddb9ea75fcce05d5777e8c64cdf42152ff2 (patch) | |
tree | be1ae0186d9909731b12cacfdd4e6042c95f4f11 | |
parent | 361b60678e7d2c005593c289baf3263a1a461bf5 (diff) |
work on struct/array handling
-rw-r--r-- | src/mesa/shader/slang/slang_codegen.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c index 4088720fdb..a23d4e16d0 100644 --- a/src/mesa/shader/slang/slang_codegen.c +++ b/src/mesa/shader/slang/slang_codegen.c @@ -94,20 +94,11 @@ is_sampler_type(const slang_fully_specified_type *t) } -static GLuint -_slang_sizeof_struct(const slang_struct *s) -{ - /* XXX TBD */ - return 0; -} - - GLuint _slang_sizeof_type_specifier(const slang_type_specifier *spec) { switch (spec->type) { case SLANG_SPEC_VOID: - abort(); return 0; case SLANG_SPEC_BOOL: return 1; @@ -147,11 +138,22 @@ _slang_sizeof_type_specifier(const slang_type_specifier *spec) case SLANG_SPEC_SAMPLER2DSHADOW: return 1; /* special case */ case SLANG_SPEC_STRUCT: - return _slang_sizeof_struct(spec->_struct); + { + GLuint sum = 0, i; + for (i = 0; i < spec->_struct->fields->num_variables; i++) { + slang_variable *v = spec->_struct->fields->variables[i]; + GLuint sz = _slang_sizeof_type_specifier(&v->type.specifier); + /* XXX verify padding */ + if (sz < 4) + sz = 4; + sum += sz; + } + return sum; + } case SLANG_SPEC_ARRAY: - return 1; /* XXX */ + return _slang_sizeof_type_specifier(spec->_array); default: - abort(); + _mesa_problem(NULL, "Unexpected type in _slang_sizeof_type_specifier()"); return 0; } return 0; @@ -2612,7 +2614,8 @@ _slang_codegen_global_variable(slang_assemble_ctx *A, slang_variable *var, } else if (var->type.qualifier == SLANG_QUAL_UNIFORM) { /* Uniform variable */ - const GLint size = _slang_sizeof_type_specifier(&var->type.specifier); + const GLint size = _slang_sizeof_type_specifier(&var->type.specifier) + * MAX2(var->array_len, 1); if (prog) { /* user-defined uniform */ GLint uniformLoc = _mesa_add_uniform(prog->Parameters, varName, size); @@ -2625,7 +2628,7 @@ _slang_codegen_global_variable(slang_assemble_ctx *A, slang_variable *var, */ store = _slang_new_ir_storage(PROGRAM_STATE_VAR, -1, size); } - if (dbg) printf("UNIFORM "); + if (dbg) printf("UNIFORM (sz %d) ", size); } else if (var->type.qualifier == SLANG_QUAL_VARYING) { const GLint size = 4; /* XXX fix */ |