summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland Scheidegger <[email protected]>2006-08-30 13:44:31 +0000
committerRoland Scheidegger <[email protected]>2006-08-30 13:44:31 +0000
commita974aaaa3e77a04375e5a9ddd413507596bd743e (patch)
treee06f11b397f59703e129caa9a0d1527e84f17dd4
parente6de1edaf0479f44773e5c841612937c7a891978 (diff)
Minor r200 vertex program cleanups. Remove disabled leftovers from r300 vertex program code. Fix authors. Correct slightly wrong check to determine if ran out of temps. Simplify check to determine if ran out of max instructions. Correctly report used native temps. Always kick off program translation when ProgramStringNotify is called (otherwise the reported native resources used queried might be wrong).
-rw-r--r--src/mesa/drivers/dri/r200/r200_context.h2
-rw-r--r--src/mesa/drivers/dri/r200/r200_vertprog.c84
2 files changed, 24 insertions, 62 deletions
diff --git a/src/mesa/drivers/dri/r200/r200_context.h b/src/mesa/drivers/dri/r200/r200_context.h
index 0f646bf30b9..b7ee33aa6c9 100644
--- a/src/mesa/drivers/dri/r200/r200_context.h
+++ b/src/mesa/drivers/dri/r200/r200_context.h
@@ -102,7 +102,7 @@ typedef void (*r200_point_func)( r200ContextPtr,
struct r200_vertex_program {
struct gl_vertex_program mesa_program; /* Must be first */
int translated;
- VERTEX_SHADER_INSTRUCTION instr[R200_VSF_MAX_INST + 2];
+ VERTEX_SHADER_INSTRUCTION instr[R200_VSF_MAX_INST + 3];
int pos_end;
int inputs[VERT_ATTRIB_MAX];
int native;
diff --git a/src/mesa/drivers/dri/r200/r200_vertprog.c b/src/mesa/drivers/dri/r200/r200_vertprog.c
index 4d87d2ecf0b..8714cc7aa28 100644
--- a/src/mesa/drivers/dri/r200/r200_vertprog.c
+++ b/src/mesa/drivers/dri/r200/r200_vertprog.c
@@ -28,6 +28,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
/*
* Authors:
* Aapo Tahkola <[email protected]>
+ * Roland Scheidegger <[email protected]>
*/
#include "glheader.h"
#include "macros.h"
@@ -432,41 +433,6 @@ static GLboolean r200_translate_vertex_program(struct r200_vertex_program *vp)
int u_temp_i = R200_VSF_MAX_TEMPS - 1;
struct prog_src_register src[3];
-#if 0
- if (getenv("R300_VP_SAFETY")) {
- WARN_ONCE("R300_VP_SAFETY enabled.\n");
-
- vpi = malloc((mesa_vp->Base.NumInstructions + VSF_MAX_FRAGMENT_TEMPS) * sizeof(struct prog_instruction));
- memset(vpi, 0, VSF_MAX_FRAGMENT_TEMPS * sizeof(struct prog_instruction));
-
- for (i=0; i < VSF_MAX_FRAGMENT_TEMPS; i++) {
- vpi[i].Opcode = OPCODE_MOV;
- vpi[i].StringPos = 0;
- vpi[i].Data = 0;
-
- vpi[i].DstReg.File = PROGRAM_TEMPORARY;
- vpi[i].DstReg.Index = i;
- vpi[i].DstReg.WriteMask = WRITEMASK_XYZW;
- vpi[i].DstReg.CondMask = COND_TR;
-
- vpi[i].SrcReg[0].File = PROGRAM_STATE_VAR;
- vpi[i].SrcReg[0].Index = 0;
- vpi[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_ONE, SWIZZLE_ONE, SWIZZLE_ONE, SWIZZLE_ONE);
- }
-
- memcpy(&vpi[i], mesa_vp->Base.Instructions, mesa_vp->Base.NumInstructions * sizeof(struct prog_instruction));
-
- free(mesa_vp->Base.Instructions);
-
- mesa_vp->Base.Instructions = vpi;
-
- mesa_vp->Base.NumInstructions += VSF_MAX_FRAGMENT_TEMPS;
- vpi = &mesa_vp->Base.Instructions[mesa_vp->Base.NumInstructions-1];
-
- assert(vpi->Opcode == OPCODE_END);
- }
-#endif
-
/* FIXME: is changing the prog safe to do here? */
if (mesa_vp->IsPositionInvariant) {
struct gl_program_parameter_list *paramList;
@@ -601,21 +567,6 @@ static GLboolean r200_translate_vertex_program(struct r200_vertex_program *vp)
o_inst = vp->instr;
for(vpi = mesa_vp->Base.Instructions; vpi->Opcode != OPCODE_END; vpi++, o_inst++){
- if (u_temp_i < mesa_vp->Base.NumTemporaries) {
- if (R200_DEBUG & DEBUG_FALLBACKS) {
- fprintf(stderr, "Ran out of temps, num temps %d, us %d\n", mesa_vp->Base.NumTemporaries, u_temp_i);
- }
- return GL_FALSE;
- }
- u_temp_i = R200_VSF_MAX_TEMPS - 1;
- if(o_inst - vp->instr >= R200_VSF_MAX_INST) {
- mesa_vp->Base.NumNativeInstructions = 129;
- if (R200_DEBUG & DEBUG_FALLBACKS) {
- fprintf(stderr, "more than 128 native instructions\n");
- }
- return GL_FALSE;
- }
-
operands = op_operands(vpi->Opcode);
are_srcs_scalar = operands & SCALAR_FLAG;
operands &= OP_MASK;
@@ -914,7 +865,7 @@ else {
goto next;
case OPCODE_END:
- break;
+ assert(0);
default:
break;
}
@@ -974,19 +925,30 @@ else {
}
}
next:
+ if (mesa_vp->Base.NumNativeTemporaries <
+ (mesa_vp->Base.NumTemporaries + (R200_VSF_MAX_TEMPS - 1 - u_temp_i))) {
+ mesa_vp->Base.NumNativeTemporaries =
+ mesa_vp->Base.NumTemporaries + (R200_VSF_MAX_TEMPS - 1 - u_temp_i);
+ }
+ if (u_temp_i < mesa_vp->Base.NumTemporaries) {
+ if (R200_DEBUG & DEBUG_FALLBACKS) {
+ fprintf(stderr, "Ran out of temps, num temps %d, us %d\n", mesa_vp->Base.NumTemporaries, u_temp_i);
+ }
+ return GL_FALSE;
+ }
+ u_temp_i = R200_VSF_MAX_TEMPS - 1;
+ if(o_inst - vp->instr >= R200_VSF_MAX_INST) {
+ mesa_vp->Base.NumNativeInstructions = 129;
+ if (R200_DEBUG & DEBUG_FALLBACKS) {
+ fprintf(stderr, "more than 128 native instructions\n");
+ }
+ return GL_FALSE;
+ }
if ((o_inst->op & R200_VSF_OUT_CLASS_MASK) == R200_VSF_OUT_CLASS_RESULT_POS) {
vp->pos_end = (o_inst - vp->instr);
}
}
- /* need to test again since some instructions require more than one (up to 3) native inst */
- if(o_inst - vp->instr > R200_VSF_MAX_INST) {
- mesa_vp->Base.NumNativeInstructions = 129;
- if (R200_DEBUG & DEBUG_FALLBACKS) {
- fprintf(stderr, "more than 128 native instructions\n");
- }
- return GL_FALSE;
- }
vp->native = GL_TRUE;
mesa_vp->Base.NumNativeInstructions = (o_inst - vp->instr);
#if 0
@@ -1120,8 +1082,8 @@ r200ProgramStringNotify(GLcontext *ctx, GLenum target, struct gl_program *prog)
switch(target) {
case GL_VERTEX_PROGRAM_ARB:
vp->translated = GL_FALSE;
- memset(&vp->translated, 0, sizeof(struct r200_vertex_program) - sizeof(struct gl_vertex_program));
- /*r200_translate_vertex_shader(vp);*/
+/* memset(&vp->translated, 0, sizeof(struct r200_vertex_program) - sizeof(struct gl_vertex_program));*/
+ r200_translate_vertex_program(vp);
break;
}
/* need this for tcl fallbacks */