mesa: fix assignment / parameter passing of sampler types
authorBrian Paul <brian.paul@tungstengraphics.com>
Sat, 1 Nov 2008 22:02:32 +0000 (16:02 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sat, 1 Nov 2008 22:02:32 +0000 (16:02 -0600)
src/mesa/shader/slang/slang_codegen.c
src/mesa/shader/slang/slang_emit.c
src/mesa/shader/slang/slang_vartable.c

index b412741d2f3c6382f2207d474829270cb4e0cda3..d8a92e23c002365396f2a822d5b3ca14f05325ee 100644 (file)
@@ -2439,8 +2439,6 @@ _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var)
    /*assert(!var->declared);*/
    var->declared = GL_TRUE;
 
-   assert(!is_sampler_type(&var->type));
-
    n = new_node0(IR_VAR_DECL);
    if (n) {
       _slang_attach_storage(n, var);
@@ -2449,7 +2447,13 @@ _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var)
       assert(n->Store);
       assert(n->Store->Index < 0);
 
-      n->Store->File = PROGRAM_TEMPORARY;
+      if (is_sampler_type(&var->type)) {
+         n->Store->File = PROGRAM_SAMPLER;
+      }
+      else {
+         n->Store->File = PROGRAM_TEMPORARY;
+      }
+
       n->Store->Size = _slang_sizeof_type_specifier(&n->Var->type.specifier);
 
       if (n->Store->Size <= 0) {
index 9e8daa10517c28570b60a8e2116d33db1eb75114..010b55827f6d2be2311d22f3f9c266040137db54 100644 (file)
@@ -1085,6 +1085,14 @@ emit_copy(slang_emit_info *emitInfo, slang_ir_node *n)
 
    n->Store = n->Children[0]->Store;
 
+   if (n->Store->File == PROGRAM_SAMPLER) {
+      /* no code generated for sampler assignments,
+       * just copy the sampler index at compile time.
+       */
+      n->Store->Index = n->Children[1]->Store->Index;
+      return NULL;
+   }
+
 #if PEEPHOLE_OPTIMIZATIONS
    if (inst &&
        _slang_is_temp(emitInfo->vt, n->Children[1]->Store) &&
index 9b607e640374d5b35753f5f17aadc930ee9ab846..95971a70a932c16cc1719d149bd996b06cf5ac2f 100644 (file)
@@ -115,6 +115,11 @@ _slang_pop_var_table(slang_var_table *vt)
                       store->Index,
                       _mesa_swizzle_string(store->Swizzle, 0, 0));
 
+      if (store->File == PROGRAM_SAMPLER) {
+         /* samplers have no storage */
+         continue;
+      }
+
       if (store->Size == 1)
          comp = GET_SWZ(store->Swizzle, 0);
       else
@@ -241,7 +246,15 @@ GLboolean
 _slang_alloc_var(slang_var_table *vt, slang_ir_storage *store)
 {
    struct table *t = vt->Top;
-   const int i = alloc_reg(vt, store->Size, GL_FALSE);
+   int i;
+
+   if (store->File == PROGRAM_SAMPLER) {
+      /* don't really allocate storage */
+      store->Index = 0;
+      return GL_TRUE;
+   }
+
+   i = alloc_reg(vt, store->Size, GL_FALSE);
    if (i < 0)
       return GL_FALSE;