added _mesa_count_texture_indirections(), _mesa_count_texture_instructions()
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user