diff options
author | Brian <brian@yutani.localnet.net> | 2007-02-20 14:03:43 -0700 |
---|---|---|
committer | Brian <brian@yutani.localnet.net> | 2007-02-20 14:03:43 -0700 |
commit | 243c2dd7469fb3e6af7206b1a6e60bfe6134fb71 (patch) | |
tree | 4437bd0367aec4a11bd2c45f15732d4c0266e261 /src/mesa/shader/slang/slang_emit.c | |
parent | 48d65aabbc1e679fbf56fb7c4f7d4d702d43501a (diff) |
implement support for pre-defined uniform structs (state vars)
Diffstat (limited to 'src/mesa/shader/slang/slang_emit.c')
-rw-r--r-- | src/mesa/shader/slang/slang_emit.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/mesa/shader/slang/slang_emit.c b/src/mesa/shader/slang/slang_emit.c index 955f428b95..67cf9c32d4 100644 --- a/src/mesa/shader/slang/slang_emit.c +++ b/src/mesa/shader/slang/slang_emit.c @@ -35,6 +35,7 @@ #include "prog_instruction.h" #include "prog_parameter.h" #include "prog_print.h" +#include "slang_builtin.h" #include "slang_emit.h" #include "slang_error.h" @@ -1307,6 +1308,36 @@ emit_swizzle(slang_var_table *vt, slang_ir_node *n, struct gl_program *prog) } +/** + * Resolve storage for accessing a structure field. + */ +static struct prog_instruction * +emit_field(slang_var_table *vt, slang_ir_node *n, struct gl_program *prog) +{ + /* field of a struct */ + if (n->Children[0]->Store->File == PROGRAM_STATE_VAR) { + /* state variable sub-field */ + GLint pos; + GLuint swizzle; + pos = _slang_lookup_statevar_field((char *) n->Children[0]->Var->a_name, + n->Target, + prog->Parameters, &swizzle); + if (pos < 0) { + RETURN_ERROR2("Undefined structure member", n->Target, 0); + } + + n->Store = _slang_new_ir_storage(PROGRAM_STATE_VAR, pos, 4);/*XXX size*/ + if (n->Store) + n->Store->Swizzle = swizzle; + } + + /* + _mesa_problem(NULL, "glsl structs/fields not supported yet"); + */ + return NULL; +} + + static struct prog_instruction * emit(slang_var_table *vt, slang_ir_node *n, struct gl_program *prog) { @@ -1391,6 +1422,9 @@ emit(slang_var_table *vt, slang_ir_node *n, struct gl_program *prog) } return NULL; /* no instruction */ + case IR_FIELD: + return emit_field(vt, n, prog); + case IR_SWIZZLE: return emit_swizzle(vt, n, prog); |