added _mesa_count_texture_indirections(), _mesa_count_texture_instructions()

This commit is contained in:
Brian
2007-01-09 11:00:47 -07:00
parent 21f99792a9
commit 048412473b
2 changed files with 92 additions and 4 deletions
+84 -2
View File
@@ -1,8 +1,8 @@
/*
* Mesa 3-D graphics library
* Version: 6.5.2
* Version: 6.5.3
*
* Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -305,3 +305,85 @@ _mesa_append_fog_code(GLcontext *ctx, struct gl_fragment_program *fprog)
fprog->Base.InputsRead |= FRAG_BIT_FOGC;
/* XXX do this? fprog->FogOption = GL_NONE; */
}
static GLboolean
is_texture_instruction(const struct prog_instruction *inst)
{
switch (inst->Opcode) {
case OPCODE_TEX:
case OPCODE_TXB:
case OPCODE_TXD:
case OPCODE_TXL:
case OPCODE_TXP:
case OPCODE_TXP_NV:
return GL_TRUE;
default:
return GL_FALSE;
}
}
/**
* Count the number of texure indirections in the given program.
* The program's NumTexIndirections field will be updated.
* See the GL_ARB_fragment_program spec (issue 24) for details.
* XXX we count texture indirections in texenvprogram.c (maybe use this code
* instead and elsewhere).
*/
void
_mesa_count_texture_indirections(struct gl_program *prog)
{
GLuint indirections = 1;
GLbitfield tempsOutput = 0x0;
GLbitfield aluTemps = 0x0;
GLuint i;
for (i = 0; i < prog->NumInstructions; i++) {
const struct prog_instruction *inst = prog->Instructions + i;
if (is_texture_instruction(inst)) {
if (((inst->SrcReg[0].File == PROGRAM_TEMPORARY) &&
(tempsOutput & (1 << inst->SrcReg[0].Index))) ||
((inst->Opcode != OPCODE_KIL) &&
(inst->DstReg.File == PROGRAM_TEMPORARY) &&
(aluTemps & (1 << inst->DstReg.Index))))
{
indirections++;
tempsOutput = 0x0;
aluTemps = 0x0;
}
}
else {
GLuint j;
for (j = 0; j < 3; j++) {
if (inst->SrcReg[j].File == PROGRAM_TEMPORARY)
aluTemps |= (1 << inst->SrcReg[j].Index);
}
if (inst->DstReg.File == PROGRAM_TEMPORARY)
aluTemps |= (1 << inst->DstReg.Index);
}
if ((inst->Opcode != OPCODE_KIL) && (inst->DstReg.File == PROGRAM_TEMPORARY))
tempsOutput |= (1 << inst->DstReg.Index);
}
prog->NumTexIndirections = indirections;
}
/**
* Count number of texture instructions in given program and update the
* program's NumTexInstructions field.
*/
void
_mesa_count_texture_instructions(struct gl_program *prog)
{
GLuint i;
prog->NumTexInstructions = 0;
for (i = 0; i < prog->NumInstructions; i++) {
prog->NumTexInstructions += is_texture_instruction(prog->Instructions + i);
}
}
+8 -2
View File
@@ -1,8 +1,8 @@
/*
* Mesa 3-D graphics library
* Version: 6.5.2
* Version: 6.5.3
*
* Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -33,5 +33,11 @@ _mesa_insert_mvp_code(GLcontext *ctx, struct gl_vertex_program *vprog);
extern void
_mesa_append_fog_code(GLcontext *ctx, struct gl_fragment_program *fprog);
extern void
_mesa_count_texture_indirections(struct gl_program *prog);
extern void
_mesa_count_texture_instructions(struct gl_program *prog);
#endif /* PROGRAMOPT_H */