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:  | 
