Merge branch 'mesa_7_6_branch'

This commit is contained in:
Nicolai Hähnle 2009-09-21 13:08:34 +02:00
commit 3083ba38f4
4 changed files with 62 additions and 6 deletions

View file

@ -89,6 +89,7 @@ static unsigned long t_dst_index(struct r300_vertex_program_code *vp,
static unsigned long t_src_class(gl_register_file file)
{
switch (file) {
case PROGRAM_BUILTIN:
case PROGRAM_TEMPORARY:
return PVS_SRC_REG_TEMPORARY;
case PROGRAM_INPUT:

View file

@ -150,14 +150,37 @@ void rc_mesa_to_rc_program(struct radeon_compiler * c, struct gl_program * progr
c->Program.InputsRead = program->InputsRead;
c->Program.OutputsWritten = program->OutputsWritten;
for(i = 0; i < program->Parameters->NumParameters; ++i) {
struct rc_constant constant;
int isNVProgram = 0;
constant.Type = RC_CONSTANT_EXTERNAL;
constant.Size = 4;
constant.u.External = i;
if (program->Target == GL_VERTEX_PROGRAM_ARB) {
struct gl_vertex_program * vp = (struct gl_vertex_program *) program;
isNVProgram = vp->IsNVProgram;
}
rc_constants_add(&c->Program.Constants, &constant);
if (isNVProgram) {
/* NV_vertex_program has a fixed-sized constant environment.
* This could be handled more efficiently for programs that
* do not use relative addressing.
*/
for(i = 0; i < 96; ++i) {
struct rc_constant constant;
constant.Type = RC_CONSTANT_EXTERNAL;
constant.Size = 4;
constant.u.External = i;
rc_constants_add(&c->Program.Constants, &constant);
}
} else {
for(i = 0; i < program->Parameters->NumParameters; ++i) {
struct rc_constant constant;
constant.Type = RC_CONSTANT_EXTERNAL;
constant.Size = 4;
constant.u.External = i;
rc_constants_add(&c->Program.Constants, &constant);
}
}
}

View file

@ -203,6 +203,34 @@ static void t_inputs_outputs(struct r300_vertex_program_compiler * c)
}
}
/**
* The NV_vertex_program spec mandates that all registers be
* initialized to zero. We do this here unconditionally.
*
* \note We rely on dead-code elimination in the compiler.
*/
static void initialize_NV_registers(struct radeon_compiler * compiler)
{
unsigned int reg;
struct rc_instruction * inst;
for(reg = 0; reg < 12; ++reg) {
inst = rc_insert_new_instruction(compiler, &compiler->Program.Instructions);
inst->I.Opcode = OPCODE_MOV;
inst->I.DstReg.File = PROGRAM_TEMPORARY;
inst->I.DstReg.Index = reg;
inst->I.SrcReg[0].File = PROGRAM_BUILTIN;
inst->I.SrcReg[0].Swizzle = SWIZZLE_0000;
}
inst = rc_insert_new_instruction(compiler, &compiler->Program.Instructions);
inst->I.Opcode = OPCODE_ARL;
inst->I.DstReg.File = PROGRAM_ADDRESS;
inst->I.DstReg.Index = 0;
inst->I.DstReg.WriteMask = WRITEMASK_X;
inst->I.SrcReg[0].File = PROGRAM_BUILTIN;
inst->I.SrcReg[0].Swizzle = SWIZZLE_0000;
}
static struct r300_vertex_program *build_program(GLcontext *ctx,
struct r300_vertex_program_key *wanted_key,
@ -234,6 +262,9 @@ static struct r300_vertex_program *build_program(GLcontext *ctx,
rc_mesa_to_rc_program(&compiler.Base, &vp->Base->Base);
if (mesa_vp->IsNVProgram)
initialize_NV_registers(&compiler.Base);
rc_move_output(&compiler.Base, VERT_RESULT_PSIZ, VERT_RESULT_PSIZ, WRITEMASK_X);
if (vp->key.WPosAttr != FRAG_ATTRIB_MAX) {

View file

@ -502,6 +502,7 @@ _mesa_clone_program(GLcontext *ctx, const struct gl_program *prog)
= (const struct gl_vertex_program *) prog;
struct gl_vertex_program *vpc = (struct gl_vertex_program *) clone;
vpc->IsPositionInvariant = vp->IsPositionInvariant;
vpc->IsNVProgram = vp->IsNVProgram;
}
break;
case GL_FRAGMENT_PROGRAM_ARB: