summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorbin Simpson <MostAwesomeDude@gmail.com>2009-02-18 06:38:21 -0800
committerCorbin Simpson <MostAwesomeDude@gmail.com>2009-02-18 06:38:21 -0800
commit7de075179ebd3bd6343dfb2e5982a7d7da477ffb (patch)
treed3ab5e9f0d730b65cc0559bc1c64bd0723a9a4ce
parent8833ae87a2426fff6327c738e03480b170985cb4 (diff)
r300-gallium: Factor out common functionality in vbuf emit.draw-vbuf-interface
-rw-r--r--src/gallium/drivers/r300/r300_swtcl_emit.c57
1 files changed, 29 insertions, 28 deletions
diff --git a/src/gallium/drivers/r300/r300_swtcl_emit.c b/src/gallium/drivers/r300/r300_swtcl_emit.c
index 9799eef786..81dd35c7f5 100644
--- a/src/gallium/drivers/r300/r300_swtcl_emit.c
+++ b/src/gallium/drivers/r300/r300_swtcl_emit.c
@@ -174,13 +174,9 @@ static boolean r300_swtcl_render_set_primitive(struct vbuf_render* render,
return true;
}
-static void r300_swtcl_render_draw_arrays(struct vbuf_render* render,
- unsigned start,
- unsigned count)
+static void prepare_render(struct r300_swtcl_render* render)
{
- struct r300_swtcl_render* r300render = r300_swtcl_render(render);
- struct r300_context* r300 = r300render->r300;
- struct pipe_screen* screen = r300->context.screen;
+ struct r300_context* r300 = render->r300;
CS_LOCALS(r300);
@@ -188,7 +184,7 @@ static void r300_swtcl_render_draw_arrays(struct vbuf_render* render,
r300_update_derived_state(r300);
r300_emit_dirty_state(r300);
- /* Take care of vertex formats and routes */
+ /* Take care of vertex formats and routes. */
BEGIN_CS(3);
OUT_CS_REG_SEQ(R300_VAP_OUTPUT_VTX_FMT_0, 2);
OUT_CS(r300->vertex_info.hwfmt[0]);
@@ -198,15 +194,37 @@ static void r300_swtcl_render_draw_arrays(struct vbuf_render* render,
/* Draw stuff! */
BEGIN_CS(6);
- /* Set the pointer to our vertex buffer. */
+ /* Set the pointer to our vertex buffer. The emitted values are this:
+ * PACKET3 [3D_LOAD_VBPNTR]
+ * COUNT [1]
+ * FORMAT [size | stride << 8]
+ * VBPNTR [relocated BO]
+ *
+ * And of course that extra dword is space for the relocation. */
OUT_CS(CP_PACKET3(R300_PACKET3_3D_LOAD_VBPNTR, 3));
OUT_CS(1);
OUT_CS(r300->vertex_info.size | (r300->vertex_info.size << 8));
- OUT_CS_RELOC(r300render->vbo, 0, RADEON_GEM_DOMAIN_GTT, 0, 0);
+ OUT_CS(0);
+ OUT_CS_RELOC(render->vbo, 0, RADEON_GEM_DOMAIN_GTT, 0, 0);
+}
+
+static void r300_swtcl_render_draw_arrays(struct vbuf_render* render,
+ unsigned start,
+ unsigned count)
+{
+ struct r300_swtcl_render* r300render = r300_swtcl_render(render);
+ struct r300_context* r300 = r300render->r300;
+ struct pipe_screen* screen = r300->context.screen;
+
+ CS_LOCALS(r300);
+ prepare_render(r300render);
+
+ BEGIN_CS(2);
OUT_CS(CP_PACKET3(R300_PACKET3_3D_DRAW_VBUF_2, 0));
OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_INDICES | (count << 16) |
r300render->hwprim | R300_VAP_VF_CNTL__INDEX_SIZE_32bit);
+ END_CS;
}
static void r300_swtcl_render_draw(struct vbuf_render* render,
@@ -221,9 +239,7 @@ static void r300_swtcl_render_draw(struct vbuf_render* render,
CS_LOCALS(r300);
- /* Make sure that all possible state is emitted. */
- r300_update_derived_state(r300);
- r300_emit_dirty_state(r300);
+ prepare_render(r300render);
/* Send our indices into an index buffer. */
index_buffer = pipe_buffer_create(screen, 64, PIPE_BUFFER_USAGE_VERTEX,
@@ -237,22 +253,7 @@ static void r300_swtcl_render_draw(struct vbuf_render* render,
memcpy(index_map, indices, count * 4);
pipe_buffer_unmap(screen, index_buffer);
- /* Take care of vertex formats and routes */
- BEGIN_CS(3);
- OUT_CS_REG_SEQ(R300_VAP_OUTPUT_VTX_FMT_0, 2);
- OUT_CS(r300->vertex_info.hwfmt[0]);
- OUT_CS(r300->vertex_info.hwfmt[1]);
- END_CS;
-
- /* Draw stuff! */
- BEGIN_CS(14);
-
- /* Set the pointer to our vertex buffer. */
- OUT_CS(CP_PACKET3(R300_PACKET3_3D_LOAD_VBPNTR, 3));
- OUT_CS(1);
- OUT_CS(r300->vertex_info.size | (r300->vertex_info.size << 8));
- OUT_CS_RELOC(r300render->vbo, 0, RADEON_GEM_DOMAIN_GTT, 0, 0);
-
+ BEGIN_CS(5);
OUT_CS(CP_PACKET3(R300_PACKET3_3D_DRAW_INDX_2, 0));
OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_INDICES | (count << 16) |
r300render->hwprim | R300_VAP_VF_CNTL__INDEX_SIZE_32bit);