r300: Fix handling of NV_vertex_program parameters

The handling is a bit inefficient, unfortunately, but I don't want to make
any intrusive changes for Mesa 7.6.

Signed-off-by: Nicolai Hähnle <nhaehnle@gmail.com>
This commit is contained in:
Nicolai Hähnle
2009-09-09 19:56:57 +02:00
parent 1d4dbd8d9b
commit 736e1ae42f
2 changed files with 30 additions and 6 deletions

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

@@ -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: