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