summaryrefslogtreecommitdiff
path: root/src/mesa/pipe/draw
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/pipe/draw')
-rw-r--r--src/mesa/pipe/draw/draw_context.c2
-rw-r--r--src/mesa/pipe/draw/draw_context.h10
-rw-r--r--src/mesa/pipe/draw/draw_vbuf.c23
-rw-r--r--src/mesa/pipe/draw/draw_vbuf.h6
-rw-r--r--src/mesa/pipe/draw/draw_vertex_shader.c53
5 files changed, 59 insertions, 35 deletions
diff --git a/src/mesa/pipe/draw/draw_context.c b/src/mesa/pipe/draw/draw_context.c
index a9ff54404f..d134b05717 100644
--- a/src/mesa/pipe/draw/draw_context.c
+++ b/src/mesa/pipe/draw/draw_context.c
@@ -69,7 +69,7 @@ struct draw_context *draw_create( void )
/* Statically allocate maximum sized vertices for the cache - could be cleverer...
*/
{
- int i;
+ uint i;
char *tmp = MALLOC( Elements(draw->vcache.vertex) * MAX_VERTEX_SIZE );
for (i = 0; i < Elements(draw->vcache.vertex); i++)
diff --git a/src/mesa/pipe/draw/draw_context.h b/src/mesa/pipe/draw/draw_context.h
index 6dc6e4ce82..60be3e194d 100644
--- a/src/mesa/pipe/draw/draw_context.h
+++ b/src/mesa/pipe/draw/draw_context.h
@@ -45,6 +45,7 @@ struct vertex_buffer;
struct vertex_info;
struct draw_context;
struct draw_stage;
+struct draw_vertex_shader;
/**
@@ -89,12 +90,13 @@ void draw_set_rasterize_stage( struct draw_context *draw,
struct draw_stage *stage );
-void * draw_create_vertex_shader(struct draw_context *draw,
- const struct pipe_shader_state *shader);
+struct draw_vertex_shader *
+draw_create_vertex_shader(struct draw_context *draw,
+ const struct pipe_shader_state *shader);
void draw_bind_vertex_shader(struct draw_context *draw,
- void *vcso);
+ struct draw_vertex_shader *dvs);
void draw_delete_vertex_shader(struct draw_context *draw,
- void *vcso);
+ struct draw_vertex_shader *dvs);
boolean draw_use_sse(struct draw_context *draw);
diff --git a/src/mesa/pipe/draw/draw_vbuf.c b/src/mesa/pipe/draw/draw_vbuf.c
index d010aaba07..4f59b1b25d 100644
--- a/src/mesa/pipe/draw/draw_vbuf.c
+++ b/src/mesa/pipe/draw/draw_vbuf.c
@@ -275,7 +275,7 @@ vbuf_flush_indices( struct draw_stage *stage )
if(!vbuf->nr_indices)
return;
- assert(vbuf->vertex_ptr - vbuf->vertices ==
+ assert((uint) (vbuf->vertex_ptr - vbuf->vertices) ==
vbuf->nr_vertices * vbuf->vertex_size / sizeof(unsigned));
switch(vbuf->prim) {
@@ -291,8 +291,14 @@ vbuf_flush_indices( struct draw_stage *stage )
assert(0);
}
- vbuf->render->draw(vbuf->render, vbuf->indices, vbuf->nr_indices);
-
+ vbuf->render->draw( vbuf->render,
+ vbuf->prim,
+ vbuf->indices,
+ vbuf->nr_indices,
+ vbuf->vertices,
+ vbuf->nr_vertices,
+ vbuf->vertex_size );
+
vbuf->nr_indices = 0;
}
@@ -354,8 +360,14 @@ vbuf_begin( struct draw_stage *stage )
static void
vbuf_end( struct draw_stage *stage )
{
+#if 0
/* XXX: Overkill */
vbuf_flush_indices( stage );
+#else
+ /* By flushing vertices we avoid having the vertex buffer grow and grow */
+ struct vbuf_stage *vbuf = vbuf_stage(stage);
+ vbuf_flush_vertices( stage, vbuf->vertex_size );
+#endif
stage->point = vbuf_first_point;
stage->line = vbuf_first_line;
@@ -373,7 +385,7 @@ static void vbuf_destroy( struct draw_stage *stage )
{
struct vbuf_stage *vbuf = vbuf_stage( stage );
- FREE( vbuf->indices );
+ align_free( vbuf->indices );
FREE( stage );
}
@@ -399,7 +411,8 @@ struct draw_stage *draw_vbuf_stage( struct draw_context *draw,
assert(render->max_indices < UNDEFINED_VERTEX_ID);
vbuf->max_indices = render->max_indices;
- vbuf->indices = MALLOC( vbuf->max_indices );
+ vbuf->indices
+ = align_malloc( vbuf->max_indices * sizeof(vbuf->indices[0]), 16 );
vbuf->vertices = NULL;
vbuf->vertex_ptr = vbuf->vertices;
diff --git a/src/mesa/pipe/draw/draw_vbuf.h b/src/mesa/pipe/draw/draw_vbuf.h
index 43aa740f64..be4c4ab77b 100644
--- a/src/mesa/pipe/draw/draw_vbuf.h
+++ b/src/mesa/pipe/draw/draw_vbuf.h
@@ -82,8 +82,12 @@ struct vbuf_render {
* DrawElements, note indices are ushort:
*/
void (*draw)( struct vbuf_render *,
+ uint prim,
const ushort *indices,
- unsigned nr_indices );
+ uint nr_indices,
+ const void *vertices,
+ uint nr_vertices,
+ uint vertex_bytes);
/**
* Called when vbuf is done with this set of vertices:
diff --git a/src/mesa/pipe/draw/draw_vertex_shader.c b/src/mesa/pipe/draw/draw_vertex_shader.c
index d34d923018..c2e038453e 100644
--- a/src/mesa/pipe/draw/draw_vertex_shader.c
+++ b/src/mesa/pipe/draw/draw_vertex_shader.c
@@ -117,7 +117,11 @@ run_vertex_program(struct draw_context *draw,
#if defined(__i386__) || defined(__386__)
if (draw->use_sse) {
/* SSE */
- codegen_function func = (codegen_function) x86_get_func( &draw->vertex_shader->sse2_program );
+ /* cast away const */
+ struct draw_vertex_shader *shader
+ = (struct draw_vertex_shader *)draw->vertex_shader;
+ codegen_function func
+ = (codegen_function) x86_get_func( &shader->sse2_program );
func(
machine->Inputs,
machine->Outputs,
@@ -193,7 +197,8 @@ run_vertex_program(struct draw_context *draw,
* Run the vertex shader on all vertices in the vertex queue.
* Called by the draw module when the vertx cache needs to be flushed.
*/
-void draw_vertex_shader_queue_flush( struct draw_context *draw )
+void
+draw_vertex_shader_queue_flush(struct draw_context *draw)
{
unsigned i, j;
@@ -227,7 +232,7 @@ void draw_vertex_shader_queue_flush( struct draw_context *draw )
}
-void *
+struct draw_vertex_shader *
draw_create_vertex_shader(struct draw_context *draw,
const struct pipe_shader_state *shader)
{
@@ -240,33 +245,35 @@ draw_create_vertex_shader(struct draw_context *draw,
vs->state = shader;
-#if defined(__i386__) || defined(__386__)
- if (draw->use_sse) {
- /* cast-away const */
- struct pipe_shader_state *sh = (struct pipe_shader_state *) shader;
-
- x86_init_func( &vs->sse2_program );
- tgsi_emit_sse2( sh->tokens, &vs->sse2_program );
- }
-#endif
#ifdef MESA_LLVM
vs->llvm_prog = gallivm_from_tgsi(shader->tokens, GALLIVM_VS);
draw->engine = gallivm_global_cpu_engine();
if (!draw->engine) {
draw->engine = gallivm_cpu_engine_create(vs->llvm_prog);
}
- else
+ else {
gallivm_cpu_jit_compile(draw->engine, vs->llvm_prog);
+ }
+#elif defined(__i386__) || defined(__386__)
+ if (draw->use_sse) {
+ /* cast-away const */
+ struct pipe_shader_state *sh = (struct pipe_shader_state *) shader;
+
+ x86_init_func( &vs->sse2_program );
+ tgsi_emit_sse2( (struct tgsi_token *) sh->tokens, &vs->sse2_program );
+ }
#endif
return vs;
}
-void draw_bind_vertex_shader(struct draw_context *draw,
- void *vcso)
+
+void
+draw_bind_vertex_shader(struct draw_context *draw,
+ struct draw_vertex_shader *dvs)
{
draw_flush(draw);
- draw->vertex_shader = (struct draw_vertex_shader*)(vcso);
+ draw->vertex_shader = dvs;
/* specify the fragment program to interpret/execute */
tgsi_exec_machine_init(&draw->machine,
@@ -275,16 +282,14 @@ void draw_bind_vertex_shader(struct draw_context *draw,
NULL /*samplers*/ );
}
-void draw_delete_vertex_shader(struct draw_context *draw,
- void *vcso)
-{
- struct draw_vertex_shader *vs;
-
- vs = (struct draw_vertex_shader *) vcso;
+void
+draw_delete_vertex_shader(struct draw_context *draw,
+ struct draw_vertex_shader *dvs)
+{
#if defined(__i386__) || defined(__386__)
- x86_release_func( (struct x86_function *) &vs->sse2_program );
+ x86_release_func( (struct x86_function *) &dvs->sse2_program );
#endif
- FREE( vs );
+ FREE( dvs );
}