Hi, Brian

   Currently the counter used for temporaries doesn't include all
intermediate results when emitting program instructions, however a
device driver needs to allocate hardware registers for these
intermediate results. The attached patch tries to fix this issue, could
you take a look?

Thanks
Haihao
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 6f17e46..f06c474 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -1924,6 +1924,9 @@ struct gl_program
    GLuint NumNativeTexInstructions;
    GLuint NumNativeTexIndirections;
    /[EMAIL PROTECTED]/
+
+   /** Track currently how many temporaries are "live"  */
+   GLuint NumLiveTemporaries; 
 };
 
 
diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c
index ad9cf06..71df499 100644
--- a/src/mesa/shader/slang/slang_codegen.c
+++ b/src/mesa/shader/slang/slang_codegen.c
@@ -2434,7 +2434,9 @@ _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var)
          n->Store->Swizzle = SWIZZLE_NOOP;
       }
 
-      A->program->NumTemporaries++; /* an approximation */
+      A->program->NumLiveTemporaries++;
+      if (A->program->NumTemporaries < A->program->NumLiveTemporaries)
+          A->program->NumTemporaries = A->program->NumLiveTemporaries;
    }
    return n;
 }
@@ -2465,6 +2467,9 @@ _slang_gen_select(slang_assemble_ctx *A, slang_operation *oper)
 
    /* temporary var */
    tmpDecl = _slang_gen_temporary(size);
+   A->program->NumLiveTemporaries++;
+   if (A->program->NumTemporaries < A->program->NumLiveTemporaries)
+       A->program->NumTemporaries = A->program->NumLiveTemporaries;
 
    /* the condition (child 0) */
    cond = _slang_gen_operation(A, &oper->children[0]);
diff --git a/src/mesa/shader/slang/slang_emit.c b/src/mesa/shader/slang/slang_emit.c
index 9991a7c..9687248 100644
--- a/src/mesa/shader/slang/slang_emit.c
+++ b/src/mesa/shader/slang/slang_emit.c
@@ -144,6 +144,11 @@ alloc_temp_storage(slang_emit_info *emitInfo, slang_ir_node *n, GLint size)
       n->Store = NULL;
       return GL_FALSE;
    }
+
+   emitInfo->prog->NumLiveTemporaries++;
+   if (emitInfo->prog->NumTemporaries < emitInfo->prog->NumLiveTemporaries)
+       emitInfo->prog->NumTemporaries = emitInfo->prog->NumLiveTemporaries;
+
    return GL_TRUE;
 }
 
@@ -153,15 +158,16 @@ alloc_temp_storage(slang_emit_info *emitInfo, slang_ir_node *n, GLint size)
  * Otherwise, no-op.
  */
 static void
-free_temp_storage(slang_var_table *vt, slang_ir_node *n)
+free_temp_storage(slang_emit_info *emitInfo, slang_ir_node *n)
 {
    if (n->Store->File == PROGRAM_TEMPORARY &&
        n->Store->Index >= 0 &&
        n->Opcode != IR_SWIZZLE) {
-      if (_slang_is_temp(vt, n->Store)) {
-         _slang_free_temp(vt, n->Store);
+      if (_slang_is_temp(emitInfo->vt, n->Store)) {
+         _slang_free_temp(emitInfo->vt, n->Store);
          n->Store->Index = -1;
          n->Store = NULL; /* XXX this may not be needed */
+         emitInfo->prog->NumLiveTemporaries--;
       }
    }
 }
@@ -608,7 +614,7 @@ emit_arith(slang_emit_info *emitInfo, slang_ir_node *n)
    /* really free temps now */
    for (i = 0; i < 3; i++)
       if (temps[i])
-         free_temp_storage(emitInfo->vt, temps[i]);
+         free_temp_storage(emitInfo, temps[i]);
 
    /*_mesa_print_instruction(inst);*/
    return inst;
@@ -688,7 +694,7 @@ emit_compare(slang_emit_info *emitInfo, slang_ir_node *n)
       storage_to_src_reg(&inst->SrcReg[0], n->Store);
       storage_to_src_reg(&inst->SrcReg[1], n->Store);
       inst->SrcReg[0].Swizzle = inst->SrcReg[1].Swizzle = swizzle; /*override*/
-      free_temp_storage(emitInfo->vt, n); /* free tmp1 */
+      free_temp_storage(emitInfo, n); /* free tmp1 */
       if (!alloc_temp_storage(emitInfo, n, 1))  /* alloc tmp2 */
          return NULL;
       storage_to_dst_reg(&inst->DstReg, n->Store, n->Writemask);
@@ -721,6 +727,9 @@ emit_compare(slang_emit_info *emitInfo, slang_ir_node *n)
          return NULL;
          /* out of temps */
       }
+      emitInfo->prog->NumLiveTemporaries++;
+      if (emitInfo->prog->NumTemporaries < emitInfo->prog->NumLiveTemporaries)
+          emitInfo->prog->NumTemporaries = emitInfo->prog->NumLiveTemporaries;
 
       for (i = 0; i < num; i++) {
          /* SNE t0, left[i], right[i] */
@@ -770,11 +779,12 @@ emit_compare(slang_emit_info *emitInfo, slang_ir_node *n)
       }
 
       _slang_free_temp(emitInfo->vt, &accTemp);
+      emitInfo->prog->NumLiveTemporaries--;
    }
 
    /* free temps */
-   free_temp_storage(emitInfo->vt, n->Children[0]);
-   free_temp_storage(emitInfo->vt, n->Children[1]);
+   free_temp_storage(emitInfo, n->Children[0]);
+   free_temp_storage(emitInfo, n->Children[1]);
 
    return inst;
 }
@@ -853,7 +863,7 @@ emit_clamp(slang_emit_info *emitInfo, slang_ir_node *n)
    storage_to_src_reg(&inst->SrcReg[0], tmpNode.Store);
    storage_to_src_reg(&inst->SrcReg[1], n->Children[2]->Store);
 
-   free_temp_storage(emitInfo->vt, &tmpNode);
+   free_temp_storage(emitInfo, &tmpNode);
 
    return inst;
 }
@@ -1136,7 +1146,7 @@ emit_move(slang_emit_info *emitInfo, slang_ir_node *n)
          inst->Comment = instruction_annotation(inst->Opcode, dstAnnot,
                                                 srcAnnot, NULL, NULL);
       }
-      free_temp_storage(emitInfo->vt, n->Children[1]);
+      free_temp_storage(emitInfo, n->Children[1]);
       return inst;
    }
 }
@@ -1249,7 +1259,7 @@ emit_not(slang_emit_info *emitInfo, slang_ir_node *n)
    storage_to_dst_reg(&inst->DstReg, n->Store, n->Writemask);
    storage_to_src_reg(&inst->SrcReg[0], n->Children[0]->Store);
    constant_to_src_reg(&inst->SrcReg[1], 0.0, emitInfo);
-   free_temp_storage(emitInfo->vt, n->Children[0]);
+   free_temp_storage(emitInfo, n->Children[0]);
 
    inst->Comment = _mesa_strdup("NOT");
    return inst;
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to