diff options
author | Brian <brian@yutani.localnet.net> | 2007-01-18 17:29:23 -0700 |
---|---|---|
committer | Brian <brian@yutani.localnet.net> | 2007-01-18 17:29:23 -0700 |
commit | 16183e6430d782ff3576e352e24310dfe53fa8ab (patch) | |
tree | daca9cdd9f8b98aca4cf7d21388a488312975120 | |
parent | ce6640001dd9a1f3062dc58b199973d6ca94b883 (diff) |
Implement constant sharing so that 4 float constants can share a single
float[4] register slot.
-rw-r--r-- | src/mesa/shader/slang/slang_codegen.c | 6 | ||||
-rw-r--r-- | src/mesa/shader/slang/slang_emit.c | 25 |
2 files changed, 19 insertions, 12 deletions
diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c index b389f41177..ea08c46fcf 100644 --- a/src/mesa/shader/slang/slang_codegen.c +++ b/src/mesa/shader/slang/slang_codegen.c @@ -546,8 +546,12 @@ new_label(slang_atom labName) static slang_ir_node * new_float_literal(float x, float y, float z, float w) { - GLuint size = 4; /* XXX fix */ + GLuint size; slang_ir_node *n = new_node(IR_FLOAT, NULL, NULL); + if (x == y && x == z && x == w) + size = 1; + else + size = 4; n->Value[0] = x; n->Value[1] = y; n->Value[2] = z; diff --git a/src/mesa/shader/slang/slang_emit.c b/src/mesa/shader/slang/slang_emit.c index a30552b909..ee348e5326 100644 --- a/src/mesa/shader/slang/slang_emit.c +++ b/src/mesa/shader/slang/slang_emit.c @@ -36,6 +36,7 @@ #include "prog_parameter.h" #include "prog_print.h" #include "slang_emit.h" +#include "slang_error.h" /** @@ -125,22 +126,20 @@ slang_ir_name(slang_ir_opcode opcode) } -#if 0 /** - * Swizzle a swizzle. + * Swizzle a swizzle. That is, return swz2(swz1) */ static GLuint -swizzle_compose(GLuint swz1, GLuint swz2) +swizzle_swizzle(GLuint swz1, GLuint swz2) { GLuint i, swz, s[4]; for (i = 0; i < 4; i++) { - GLuint c = GET_SWZ(swz1, i); - s[i] = GET_SWZ(swz2, c); + GLuint c = GET_SWZ(swz2, i); + s[i] = GET_SWZ(swz1, c); } swz = MAKE_SWIZZLE4(s[0], s[1], s[2], s[3]); return swz; } -#endif slang_ir_storage * @@ -381,7 +380,7 @@ storage_to_src_reg(struct prog_src_register *src, const slang_ir_storage *st, assert(st->Size >= 1); assert(st->Size <= 4); /* XXX swizzling logic here may need some work */ - /*src->Swizzle = swizzle_compose(swizzle, defaultSwizzle[st->Size - 1]);*/ + /*src->Swizzle = swizzle_swizzlee(swizzle, defaultSwizzle[st->Size - 1]);*/ if (st->Swizzle != SWIZZLE_NOOP) src->Swizzle = st->Swizzle; else @@ -767,7 +766,8 @@ emit(slang_var_table *vt, slang_ir_node *n, struct gl_program *prog) n->Store->Index = n->Children[0]->Store->Index; n->Store->Size = n->Children[0]->Store->Size; assert(n->Store->Index >= 0); - /* XXX compose swizzles here!!! */ + n->Store->Swizzle = swizzle_swizzle(n->Children[0]->Store->Swizzle, + n->Store->Swizzle); return NULL; /* Simple binary operators */ @@ -806,10 +806,13 @@ emit(slang_var_table *vt, slang_ir_node *n, struct gl_program *prog) case IR_NEG: return emit_negation(vt, n, prog); case IR_FLOAT: - /* find storage location for this float */ + /* find storage location for this float constant */ n->Store->Index = _mesa_add_unnamed_constant(prog->Parameters, n->Value, - 4, &n->Store->Swizzle); - assert(n->Store->Index >= 0); + n->Store->Size/*4*/, + &n->Store->Swizzle); + if (n->Store->Index < 0) { + RETURN_ERROR("Ran out of space for constants.", 0); + } return NULL; case IR_MOVE: |