initial use of KIL for glBitmap rendering
authorBrian <brian.paul@tungstengraphics.com>
Fri, 12 Oct 2007 15:42:06 +0000 (09:42 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Fri, 12 Oct 2007 15:42:06 +0000 (09:42 -0600)
src/mesa/state_tracker/st_cb_drawpixels.c

index f58b5d947db2f469c3220d2fee07d360713b4475..f3d624f14b8a00c76f520c3a7561270d6d2b99c7 100644 (file)
@@ -66,8 +66,14 @@ make_fragment_shader(struct st_context *st, GLboolean bitmapMode)
    if (!p)
       return NULL;
 
+#define CULL 1  /* Use KIL to cull 0 bits/pixels in bitmap? */
+
    if (bitmapMode)
+#if CULL
+      p->NumInstructions = 7;
+#else
       p->NumInstructions = 3;
+#endif
    else
       p->NumInstructions = 2;
 
@@ -95,6 +101,36 @@ make_fragment_shader(struct st_context *st, GLboolean bitmapMode)
       p->Instructions[ic].TexSrcUnit = 0;
       p->Instructions[ic].TexSrcTarget = TEXTURE_2D_INDEX;
       ic++;
+#if CULL
+      /* IF temp0 */
+      p->Instructions[ic].Opcode = OPCODE_IF;
+      p->Instructions[ic].SrcReg[0].File = PROGRAM_TEMPORARY;
+      p->Instructions[ic].SrcReg[0].Index = 0;
+      p->Instructions[ic].SrcReg[0].Swizzle = SWIZZLE_WWWW;
+      p->Instructions[ic].BranchTarget = ic + 2;
+      ic++;
+
+      /* MOV result.color, fragment.color */
+      p->Instructions[ic].Opcode = OPCODE_MOV;
+      p->Instructions[ic].DstReg.File = PROGRAM_OUTPUT;
+      p->Instructions[ic].DstReg.Index = FRAG_RESULT_COLR;
+      p->Instructions[ic].SrcReg[0].File = PROGRAM_INPUT;
+      p->Instructions[ic].SrcReg[0].Index = FRAG_ATTRIB_COL0;
+      ic++;
+
+      /* ELSE */
+      p->Instructions[ic].Opcode = OPCODE_ELSE;
+      p->Instructions[ic].BranchTarget = ic + 2;
+      ic++;
+
+      /* KILL */
+      p->Instructions[ic].Opcode = OPCODE_KIL_NV;
+      ic++;
+
+      /* ENDIF */
+      p->Instructions[ic].Opcode = OPCODE_ENDIF;
+      ic++;
+#else
       /* MUL result.color, temp0.xxxx, fragment.color */
       p->Instructions[ic].Opcode = OPCODE_MUL;
       p->Instructions[ic].DstReg.File = PROGRAM_OUTPUT;
@@ -105,17 +141,18 @@ make_fragment_shader(struct st_context *st, GLboolean bitmapMode)
       p->Instructions[ic].SrcReg[1].File = PROGRAM_INPUT;
       p->Instructions[ic].SrcReg[1].Index = FRAG_ATTRIB_COL0;
       ic++;
+#endif
    }
    else {
       /* DrawPixels mode */
       /* TEX result.color, fragment.texcoord[0], texture[0], 2D; */
-      p->Instructions[0].Opcode = OPCODE_TEX;
-      p->Instructions[0].DstReg.File = PROGRAM_OUTPUT;
-      p->Instructions[0].DstReg.Index = FRAG_RESULT_COLR;
-      p->Instructions[0].SrcReg[0].File = PROGRAM_INPUT;
-      p->Instructions[0].SrcReg[0].Index = FRAG_ATTRIB_TEX0;
-      p->Instructions[0].TexSrcUnit = 0;
-      p->Instructions[0].TexSrcTarget = TEXTURE_2D_INDEX;
+      p->Instructions[ic].Opcode = OPCODE_TEX;
+      p->Instructions[ic].DstReg.File = PROGRAM_OUTPUT;
+      p->Instructions[ic].DstReg.Index = FRAG_RESULT_COLR;
+      p->Instructions[ic].SrcReg[0].File = PROGRAM_INPUT;
+      p->Instructions[ic].SrcReg[0].Index = FRAG_ATTRIB_TEX0;
+      p->Instructions[ic].TexSrcUnit = 0;
+      p->Instructions[ic].TexSrcTarget = TEXTURE_2D_INDEX;
       ic++;
    }
    /* END; */