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

Author: Nicolai Hähnle <nhaeh...@gmail.com>
Date:   Mon Sep 21 12:50:33 2009 +0200

r300: Zero-initialize register for NV_vertex_program

Signed-off-by: Nicolai Hähnle <nhaeh...@gmail.com>

---

 src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c |    1 +
 src/mesa/drivers/dri/r300/r300_vertprog.c          |   31 ++++++++++++++++++++
 2 files changed, 32 insertions(+), 0 deletions(-)

diff --git a/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c 
b/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c
index 93a5161..dad27fc 100644
--- a/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c
+++ b/src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c
@@ -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:
diff --git a/src/mesa/drivers/dri/r300/r300_vertprog.c 
b/src/mesa/drivers/dri/r300/r300_vertprog.c
index dd0f27f..0cb7dde 100644
--- a/src/mesa/drivers/dri/r300/r300_vertprog.c
+++ b/src/mesa/drivers/dri/r300/r300_vertprog.c
@@ -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) {

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to