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:
@@ -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.InputsRead = program->InputsRead;
|
||||||
c->Program.OutputsWritten = program->OutputsWritten;
|
c->Program.OutputsWritten = program->OutputsWritten;
|
||||||
|
|
||||||
for(i = 0; i < program->Parameters->NumParameters; ++i) {
|
int isNVProgram = 0;
|
||||||
struct rc_constant constant;
|
|
||||||
|
|
||||||
constant.Type = RC_CONSTANT_EXTERNAL;
|
if (program->Target == GL_VERTEX_PROGRAM_ARB) {
|
||||||
constant.Size = 4;
|
struct gl_vertex_program * vp = (struct gl_vertex_program *) program;
|
||||||
constant.u.External = i;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -502,6 +502,7 @@ _mesa_clone_program(GLcontext *ctx, const struct gl_program *prog)
|
|||||||
= (const struct gl_vertex_program *) prog;
|
= (const struct gl_vertex_program *) prog;
|
||||||
struct gl_vertex_program *vpc = (struct gl_vertex_program *) clone;
|
struct gl_vertex_program *vpc = (struct gl_vertex_program *) clone;
|
||||||
vpc->IsPositionInvariant = vp->IsPositionInvariant;
|
vpc->IsPositionInvariant = vp->IsPositionInvariant;
|
||||||
|
vpc->IsNVProgram = vp->IsNVProgram;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_FRAGMENT_PROGRAM_ARB:
|
case GL_FRAGMENT_PROGRAM_ARB:
|
||||||
|
Reference in New Issue
Block a user