Mesa (mesa_7_6_branch): r300: Fix handling of NV_vertex_program parameters

Nicolai Hähnle nh at kemper.freedesktop.org
Mon Sep 21 10:58:30 UTC 2009


Module: Mesa
Branch: mesa_7_6_branch
Commit: 736e1ae42fd61f2b9f982b0491ca7daea7e615ed
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=736e1ae42fd61f2b9f982b0491ca7daea7e615ed

Author: Nicolai Hähnle <nhaehnle at gmail.com>
Date:   Wed Sep  9 19:56:57 2009 +0200

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 at gmail.com>

---

 .../drivers/dri/r300/compiler/radeon_program.c     |   35 ++++++++++++++++---
 src/mesa/shader/program.c                          |    1 +
 2 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_program.c b/src/mesa/drivers/dri/r300/compiler/radeon_program.c
index bbbf0dd..b636f90 100644
--- a/src/mesa/drivers/dri/r300/compiler/radeon_program.c
+++ b/src/mesa/drivers/dri/r300/compiler/radeon_program.c
@@ -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;
+	}
+
+	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;
 
-		rc_constants_add(&c->Program.Constants, &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);
+		}
 	}
 }
 
diff --git a/src/mesa/shader/program.c b/src/mesa/shader/program.c
index 963478f..2cd6eb8 100644
--- a/src/mesa/shader/program.c
+++ b/src/mesa/shader/program.c
@@ -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:




More information about the mesa-commit mailing list