summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/r300
diff options
context:
space:
mode:
authorCorbin Simpson <MostAwesomeDude@gmail.com>2009-11-07 09:47:01 -0800
committerCorbin Simpson <MostAwesomeDude@gmail.com>2009-11-07 11:53:14 -0800
commit96b729f926fafeca6479eed0933bc4275fb7843b (patch)
tree040c3fe385707d148702b2377232610c7ac48d17 /src/gallium/drivers/r300
parent24c6fdbd32a84314c81897d0d1567121ed1c6118 (diff)
r300g: Don't pass hw_prim around in the context.
And some other fixes.
Diffstat (limited to 'src/gallium/drivers/r300')
-rw-r--r--src/gallium/drivers/r300/r300_context.h1
-rw-r--r--src/gallium/drivers/r300/r300_emit.c58
-rw-r--r--src/gallium/drivers/r300/r300_emit.h10
-rw-r--r--src/gallium/drivers/r300/r300_render.c76
-rw-r--r--src/gallium/drivers/r300/r300_vbo.c10
5 files changed, 74 insertions, 81 deletions
diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h
index a6748852d8..8d14c53f49 100644
--- a/src/gallium/drivers/r300/r300_context.h
+++ b/src/gallium/drivers/r300/r300_context.h
@@ -299,7 +299,6 @@ struct r300_context {
/* Vertex elements for Gallium. */
struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS];
int aos_count;
- unsigned hw_prim;
/* Bitmask of dirty state objects. */
uint32_t dirty_state;
diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c
index 92e6ec606c..ec1d521800 100644
--- a/src/gallium/drivers/r300/r300_emit.c
+++ b/src/gallium/drivers/r300/r300_emit.c
@@ -647,64 +647,6 @@ void r300_emit_draw_packet(struct r300_context* r300)
END_CS;
}
#endif
-void r300_emit_draw_arrays(struct r300_context *r300,
- unsigned count)
-{
- CS_LOCALS(r300);
- assert(count < 65536);
-
- BEGIN_CS(4);
- OUT_CS_REG(R300_VAP_VF_MAX_VTX_INDX, count);
- OUT_CS_PKT3(R300_PACKET3_3D_DRAW_VBUF_2, 0);
- OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST | (count << 16) |
- r300->hw_prim);
- END_CS;
-}
-
-void r300_emit_draw_elements(struct r300_context *r300,
- struct pipe_buffer* indexBuffer,
- unsigned indexSize,
- unsigned minIndex,
- unsigned maxIndex,
- unsigned start,
- unsigned count)
-{
- CS_LOCALS(r300);
- assert(indexSize == 4 || indexSize == 2);
- assert(count < 65536);
- assert((start * indexSize) % 4 == 0);
-
- uint32_t size_dwords;
- uint32_t skip_dwords = indexSize * start / sizeof(uint32_t);
- assert(skip_dwords == 0);
-
- BEGIN_CS(10);
- OUT_CS_REG(R300_VAP_VF_MAX_VTX_INDX, maxIndex);
- OUT_CS_PKT3(R300_PACKET3_3D_DRAW_INDX_2, 0);
- if (indexSize == 4) {
- size_dwords = count + start;
- OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_INDICES | (count << 16) |
- R300_VAP_VF_CNTL__INDEX_SIZE_32bit | r300->hw_prim);
- } else {
- size_dwords = (count + start + 1) / 2;
- OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_INDICES |
- (count << 16) | r300->hw_prim);
- }
-
- OUT_CS_PKT3(R300_PACKET3_INDX_BUFFER, 2);
- OUT_CS(R300_INDX_BUFFER_ONE_REG_WR | (R300_VAP_PORT_IDX0 >> 2) |
- (0 << R300_INDX_BUFFER_SKIP_SHIFT));
- OUT_CS(skip_dwords);
- OUT_CS(size_dwords);
- cs_winsys->write_cs_reloc(cs_winsys,
- indexBuffer,
- RADEON_GEM_DOMAIN_GTT,
- 0,
- 0);
- cs_count -= 2;
-
- END_CS;
-}
void r300_emit_vertex_format_state(struct r300_context* r300)
{
diff --git a/src/gallium/drivers/r300/r300_emit.h b/src/gallium/drivers/r300/r300_emit.h
index b4fdfecde0..7c83c5166d 100644
--- a/src/gallium/drivers/r300/r300_emit.h
+++ b/src/gallium/drivers/r300/r300_emit.h
@@ -40,16 +40,6 @@ void r300_emit_blend_color_state(struct r300_context* r300,
void r300_emit_clip_state(struct r300_context* r300,
struct pipe_clip_state* clip);
-void r300_emit_draw_arrays(struct r300_context *r300, unsigned count);
-
-void r300_emit_draw_elements(struct r300_context *r300,
- struct pipe_buffer* indexBuffer,
- unsigned indexSize,
- unsigned minIndex,
- unsigned maxIndex,
- unsigned start,
- unsigned count);
-
void r300_emit_dsa_state(struct r300_context* r300,
struct r300_dsa_state* dsa);
diff --git a/src/gallium/drivers/r300/r300_render.c b/src/gallium/drivers/r300/r300_render.c
index cbda30227d..6f7c645334 100644
--- a/src/gallium/drivers/r300/r300_render.c
+++ b/src/gallium/drivers/r300/r300_render.c
@@ -31,13 +31,13 @@
#include "util/u_memory.h"
#include "util/u_prim.h"
-#include "r300_vbo.h"
#include "r300_cs.h"
#include "r300_context.h"
#include "r300_emit.h"
#include "r300_reg.h"
#include "r300_render.h"
#include "r300_state_derived.h"
+#include "r300_vbo.h"
/* r300_render: Vertex and index buffer primitive emission. */
#define R300_MAX_VBO_SIZE (1024 * 1024)
@@ -70,6 +70,70 @@ uint32_t r300_translate_primitive(unsigned prim)
}
}
+static void r300_emit_draw_arrays(struct r300_context *r300,
+ unsigned mode,
+ unsigned count)
+{
+ CS_LOCALS(r300);
+ assert(count < 65536);
+
+ BEGIN_CS(4);
+ OUT_CS_REG(R300_VAP_VF_MAX_VTX_INDX, count);
+ OUT_CS_PKT3(R300_PACKET3_3D_DRAW_VBUF_2, 0);
+ OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST | (count << 16) |
+ r300_translate_primitive(mode));
+ END_CS;
+}
+
+static void r300_emit_draw_elements(struct r300_context *r300,
+ struct pipe_buffer* indexBuffer,
+ unsigned indexSize,
+ unsigned minIndex,
+ unsigned maxIndex,
+ unsigned mode,
+ unsigned start,
+ unsigned count)
+{
+ CS_LOCALS(r300);
+ assert(indexSize == 4 || indexSize == 2);
+ assert(count < 65536);
+ assert((start * indexSize) % 4 == 0);
+
+ uint32_t size_dwords;
+ uint32_t skip_dwords = indexSize * start / sizeof(uint32_t);
+ assert(skip_dwords == 0);
+
+ BEGIN_CS(10);
+ OUT_CS_REG(R300_VAP_VF_MAX_VTX_INDX, maxIndex);
+ OUT_CS_PKT3(R300_PACKET3_3D_DRAW_INDX_2, 0);
+ if (indexSize == 4) {
+ size_dwords = count + start;
+ OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_INDICES | (count << 16) |
+ R300_VAP_VF_CNTL__INDEX_SIZE_32bit |
+ r300_translate_primitive(mode));
+ } else {
+ size_dwords = (count + start + 1) / 2;
+ OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_INDICES | (count << 16) |
+ r300_translate_primitive(mode));
+ }
+
+ OUT_CS_PKT3(R300_PACKET3_INDX_BUFFER, 2);
+ OUT_CS(R300_INDX_BUFFER_ONE_REG_WR | (R300_VAP_PORT_IDX0 >> 2) |
+ (0 << R300_INDX_BUFFER_SKIP_SHIFT));
+ OUT_CS(skip_dwords);
+ OUT_CS(size_dwords);
+ /* XXX hax */
+ cs_winsys->write_cs_reloc(cs_winsys,
+ indexBuffer,
+ RADEON_GEM_DOMAIN_GTT,
+ 0,
+ 0);
+ cs_count -= 2;
+
+ END_CS;
+}
+
+
static boolean setup_vertex_buffers(struct r300_context *r300)
{
unsigned vbuf_count = r300->aos_count;
@@ -123,14 +187,12 @@ boolean r300_draw_range_elements(struct pipe_context* pipe,
setup_index_buffer(r300, indexBuffer, indexSize);
- r300->hw_prim = r300_translate_primitive(mode);
-
r300_emit_dirty_state(r300);
r300_emit_aos(r300, 0);
r300_emit_draw_elements(r300, indexBuffer, indexSize, minIndex, maxIndex,
- start, count);
+ mode, start, count);
return TRUE;
}
@@ -159,13 +221,11 @@ boolean r300_draw_arrays(struct pipe_context* pipe, unsigned mode,
setup_vertex_attributes(r300);
- r300->hw_prim = r300_translate_primitive(mode);
-
r300_emit_dirty_state(r300);
r300_emit_aos(r300, start);
- r300_emit_draw_arrays(r300, count);
+ r300_emit_draw_arrays(r300, mode, count);
return TRUE;
}
@@ -186,8 +246,8 @@ boolean r300_swtcl_draw_range_elements(struct pipe_context* pipe,
unsigned count)
{
assert(0);
- struct r300_context* r300 = r300_context(pipe);
#if 0
+ struct r300_context* r300 = r300_context(pipe);
int i;
if (!u_trim_pipe_prim(mode, &count)) {
diff --git a/src/gallium/drivers/r300/r300_vbo.c b/src/gallium/drivers/r300/r300_vbo.c
index 37b5c9224f..ab6f5c5942 100644
--- a/src/gallium/drivers/r300/r300_vbo.c
+++ b/src/gallium/drivers/r300/r300_vbo.c
@@ -56,7 +56,8 @@ static INLINE void setup_vertex_attribute(struct r300_vertex_info *vinfo,
static void finish_vertex_attribs_setup(struct r300_vertex_info *vinfo,
unsigned attribs_num)
{
- uint32_t last_vec_bit = (attribs_num % 2 == 0) ? (R300_LAST_VEC << 16) : R300_LAST_VEC;
+ uint32_t last_vec_bit = (attribs_num % 2 == 0) ?
+ (R300_LAST_VEC << 16) : R300_LAST_VEC;
assert(attribs_num > 0 && attribs_num <= 16);
vinfo->vap_prog_stream_cntl[(attribs_num - 1) >> 1] |= last_vec_bit;
@@ -64,10 +65,11 @@ static void finish_vertex_attribs_setup(struct r300_vertex_info *vinfo,
void setup_vertex_attributes(struct r300_context *r300)
{
- for (int i=0; i<r300->aos_count; i++)
- {
- struct pipe_vertex_element *vert_elem = &r300->vertex_element[i];
+ struct pipe_vertex_element *vert_elem;
+ int i;
+ for (i = 0; i < r300->aos_count; i++) {
+ vert_elem = &r300->vertex_element[i];
setup_vertex_attribute(r300->vertex_info, vert_elem, i);
}