OSDN Git Service

make pass-through vertex shader
authorBrian <brian.paul@tungstengraphics.com>
Thu, 16 Aug 2007 23:32:24 +0000 (17:32 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Thu, 16 Aug 2007 23:32:24 +0000 (17:32 -0600)
src/mesa/state_tracker/st_cb_clear.c

index 3777c53..492073e 100644 (file)
@@ -152,8 +152,62 @@ make_color_shader(struct st_context *st)
 
 
 /**
+ * Create a simple vertex shader that just passes through the
+ * vertex position and color.
+ */
+static struct st_vertex_program *
+make_vertex_shader(struct st_context *st)
+{
+   GLcontext *ctx = st->ctx;
+   struct st_vertex_program *stvp;
+   struct gl_program *p;
+   GLboolean b;
+
+   p = ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0);
+   if (!p)
+      return NULL;
+
+   p->NumInstructions = 3;
+   p->Instructions = _mesa_alloc_instructions(3);
+   if (!p->Instructions) {
+      ctx->Driver.DeleteProgram(ctx, p);
+      return NULL;
+   }
+   _mesa_init_instructions(p->Instructions, 3);
+   /* MOV result.pos, vertex.pos; */
+   p->Instructions[0].Opcode = OPCODE_MOV;
+   p->Instructions[0].DstReg.File = PROGRAM_OUTPUT;
+   p->Instructions[0].DstReg.Index = VERT_RESULT_HPOS;
+   p->Instructions[0].SrcReg[0].File = PROGRAM_INPUT;
+   p->Instructions[0].SrcReg[0].Index = VERT_ATTRIB_POS;
+   /* MOV result.color, vertex.color; */
+   p->Instructions[1].Opcode = OPCODE_MOV;
+   p->Instructions[1].DstReg.File = PROGRAM_OUTPUT;
+   p->Instructions[1].DstReg.Index = VERT_RESULT_COL0;
+   p->Instructions[1].SrcReg[0].File = PROGRAM_INPUT;
+   p->Instructions[1].SrcReg[0].Index = VERT_ATTRIB_COLOR0;
+   /* END; */
+   p->Instructions[2].Opcode = OPCODE_END;
+
+   p->InputsRead = VERT_BIT_POS | VERT_BIT_COLOR0;
+   p->OutputsWritten = ((1 << VERT_RESULT_COL0) |
+                        (1 << VERT_RESULT_HPOS));
+
+   stvp = (struct st_vertex_program *) p;
+   /* compile into tgsi format */
+   b = tgsi_mesa_compile_vp_program(&stvp->Base,
+                                    stvp->tokens, ST_FP_MAX_TOKENS);
+   assert(b);
+
+   return stvp;
+}
+
+
+
+/**
  * Draw a screen-aligned quadrilateral.
  * Coords are window coords.
+ * XXX need to emit clip coords when using a vertex program!
  */
 static void
 draw_quad(GLcontext *ctx,