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

Author: Eric Anholt <e...@anholt.net>
Date:   Thu Sep 24 11:58:33 2009 -0700

i965: Emit zero initialization for NV VP temporaries as required.

This is similar to what r300 does inside the driver, but I've added it as
a generic option since it seems most hardware will want it.

Fixes piglit nv-init-zero-reg.vpfp and nv-init-zero-addr.vpfp.

---

 src/mesa/drivers/dri/i965/brw_context.c |    1 +
 src/mesa/main/mtypes.h                  |    1 +
 src/mesa/shader/nvprogram.c             |   44 +++++++++++++++++++++++++++++++
 src/mesa/shader/nvprogram.h             |    4 +++
 src/mesa/shader/nvvertparse.c           |    1 +
 5 files changed, 51 insertions(+), 0 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_context.c 
b/src/mesa/drivers/dri/i965/brw_context.c
index 3c5b848..c300c33 100644
--- a/src/mesa/drivers/dri/i965/brw_context.c
+++ b/src/mesa/drivers/dri/i965/brw_context.c
@@ -125,6 +125,7 @@ GLboolean brwCreateContext( const __GLcontextModes *mesaVis,
 
    /* We want the GLSL compiler to emit code that uses condition codes */
    ctx->Shader.EmitCondCodes = GL_TRUE;
+   ctx->Shader.EmitNVTempInitialization = GL_TRUE;
 
    ctx->Const.VertexProgram.MaxNativeInstructions = (16 * 1024);
    ctx->Const.VertexProgram.MaxAluInstructions = 0;
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 6b64bf8..f8e4e41 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2079,6 +2079,7 @@ struct gl_shader_state
    GLboolean EmitContReturn;            /**< Emit CONT/RET opcodes? */
    GLboolean EmitCondCodes;             /**< Use condition codes? */
    GLboolean EmitComments;              /**< Annotated instructions */
+   GLboolean EmitNVTempInitialization;  /**< 0-fill NV temp registers */
    void *MemPool;
    GLbitfield Flags;                    /**< Mask of GLSL_x flags */
    struct gl_sl_pragmas DefaultPragmas; /**< Default #pragma settings */
diff --git a/src/mesa/shader/nvprogram.c b/src/mesa/shader/nvprogram.c
index fdb2f42..471a735 100644
--- a/src/mesa/shader/nvprogram.c
+++ b/src/mesa/shader/nvprogram.c
@@ -509,7 +509,51 @@ _mesa_GetVertexAttribPointervNV(GLuint index, GLenum 
pname, GLvoid **pointer)
    *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[index].Ptr;
 }
 
+void
+_mesa_emit_nv_temp_initialization(GLcontext *ctx,
+                                 struct gl_program *program)
+{
+   struct prog_instruction *inst;
+   int i;
+
+   if (!ctx->Shader.EmitNVTempInitialization)
+      return;
 
+   /* We'll swizzle up a zero temporary so we can use it for the
+    * ARL.
+    */
+   if (program->NumTemporaries == 0)
+      program->NumTemporaries = 1;
+
+   _mesa_insert_instructions(program, 0, program->NumTemporaries + 1);
+
+   for (i = 0; i < program->NumTemporaries; i++) {
+      struct prog_instruction *inst = &program->Instructions[i];
+
+      inst->Opcode = OPCODE_SWZ;
+      inst->DstReg.File = PROGRAM_TEMPORARY;
+      inst->DstReg.Index = i;
+      inst->DstReg.WriteMask = WRITEMASK_XYZW;
+      inst->SrcReg[0].File = PROGRAM_TEMPORARY;
+      inst->SrcReg[0].Index = 0;
+      inst->SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_ZERO,
+                                             SWIZZLE_ZERO,
+                                             SWIZZLE_ZERO,
+                                             SWIZZLE_ZERO);
+   }
+
+   inst = &program->Instructions[i];
+   inst->Opcode = OPCODE_ARL;
+   inst->DstReg.File = PROGRAM_ADDRESS;
+   inst->DstReg.Index = 0;
+   inst->DstReg.WriteMask = WRITEMASK_XYZW;
+   inst->SrcReg[0].File = PROGRAM_TEMPORARY;
+   inst->SrcReg[0].Index = 0;
+   inst->SrcReg[0].Swizzle = SWIZZLE_XXXX;
+
+   if (program->NumAddressRegs == 0)
+      program->NumAddressRegs = 1;
+}
 
 void
 _mesa_setup_nv_temporary_count(GLcontext *ctx, struct gl_program *program)
diff --git a/src/mesa/shader/nvprogram.h b/src/mesa/shader/nvprogram.h
index 0ed143d..8ee5966 100644
--- a/src/mesa/shader/nvprogram.h
+++ b/src/mesa/shader/nvprogram.h
@@ -106,4 +106,8 @@ _mesa_GetProgramNamedParameterdvNV(GLuint id, GLsizei len, 
const GLubyte *name,
 extern void
 _mesa_setup_nv_temporary_count(GLcontext *ctx, struct gl_program *program);
 
+extern void
+_mesa_emit_nv_temp_initialization(GLcontext *ctx,
+                                 struct gl_program *program);
+
 #endif
diff --git a/src/mesa/shader/nvvertparse.c b/src/mesa/shader/nvvertparse.c
index a94e6b8..6ab8a14 100644
--- a/src/mesa/shader/nvvertparse.c
+++ b/src/mesa/shader/nvvertparse.c
@@ -1423,6 +1423,7 @@ _mesa_parse_nv_vertex_program(GLcontext *ctx, GLenum 
dstTarget,
       program->Base.NumParameters = program->Base.Parameters->NumParameters;
 
       _mesa_setup_nv_temporary_count(ctx, &program->Base);
+      _mesa_emit_nv_temp_initialization(ctx, &program->Base);
    }
    else {
       /* Error! */

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

Reply via email to