summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/r300
diff options
context:
space:
mode:
authorCorbin Simpson <[email protected]>2009-02-03 22:55:30 -0800
committerCorbin Simpson <[email protected]>2009-02-03 22:55:30 -0800
commitf097465bb85d3ca212a23c2dcc9cf73988de9160 (patch)
tree9c6ac22b196d8600297c536b1fd246064001d07e /src/gallium/drivers/r300
parente5018a5675603ec26e833bc0808e4150a6bba16a (diff)
r300: Moar swtcl emit. Still sucks, but getting there.
Diffstat (limited to 'src/gallium/drivers/r300')
-rw-r--r--src/gallium/drivers/r300/r300_swtcl_emit.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/src/gallium/drivers/r300/r300_swtcl_emit.c b/src/gallium/drivers/r300/r300_swtcl_emit.c
index 98340a7a7c4..f6e98d23e98 100644
--- a/src/gallium/drivers/r300/r300_swtcl_emit.c
+++ b/src/gallium/drivers/r300/r300_swtcl_emit.c
@@ -23,6 +23,7 @@
#include "draw/draw_pipe.h"
#include "util/u_memory.h"
+#include "r300_cs.h"
#include "r300_context.h"
#include "r300_reg.h"
@@ -40,12 +41,34 @@ static INLINE struct swtcl_stage* swtcl_stage(struct draw_stage* draw) {
return (struct swtcl_stage*)draw;
}
+static void r300_emit_vertex(struct r300_context* r300,
+ const struct vertex_header* vertex)
+{
+ /* XXX */
+}
+
static INLINE void r300_emit_prim(struct draw_stage* draw,
struct prim_header* prim,
unsigned hwprim,
unsigned count)
{
struct r300_context* r300 = swtcl_stage(draw)->r300;
+ CS_LOCALS(r300);
+ int i;
+
+ r300_emit_dirty_state(r300);
+
+ /* XXX should be count * vtx size */
+ BEGIN_CS(2 + count + 6);
+ OUT_CS(CP_PACKET3(R200_3D_DRAW_IMMD_2, count));
+ OUT_CS(hwprim | R300_PRIM_WALK_RING |
+ (count << R300_PRIM_NUM_VERTICES_SHIFT));
+
+ for (i = 0; i < count; i++) {
+ r300_emit_vertex(r300, prim->v[i]);
+ }
+ R300_PACIFY;
+ END_CS;
}
/* Just as an aside...
@@ -63,17 +86,17 @@ static INLINE void r300_emit_prim(struct draw_stage* draw,
static void r300_emit_point(struct draw_stage* draw, struct prim_header* prim)
{
- r300_emit_prim(draw, prim, R300_VAP_VF_CNTL__PRIM_POINTS, 1);
+ r300_emit_prim(draw, prim, R300_PRIM_TYPE_POINT, 1);
}
static void r300_emit_line(struct draw_stage* draw, struct prim_header* prim)
{
- r300_emit_prim(draw, prim, R300_VAP_VF_CNTL__PRIM_LINES, 2);
+ r300_emit_prim(draw, prim, R300_PRIM_TYPE_LINE, 2);
}
static void r300_emit_tri(struct draw_stage* draw, struct prim_header* prim)
{
- r300_emit_prim(draw, prim, R300_VAP_VF_CNTL__PRIM_TRIANGLES, 3);
+ r300_emit_prim(draw, prim, R300_PRIM_TYPE_TRI_LIST, 3);
}
static void r300_swtcl_flush(struct draw_stage* draw, unsigned flags)