i915g: Cleanup i915_prim_vbuf.c

This commit is contained in:
Jakob Bornecrantz
2009-08-31 00:36:24 +01:00
parent 1bb3a2c648
commit bd0c51874f
+97 -106
View File
@@ -59,7 +59,7 @@
struct i915_vbuf_render {
struct vbuf_render base;
struct i915_context *i915;
struct i915_context *i915;
/** Vertex size in bytes */
size_t vertex_size;
@@ -87,32 +87,30 @@ struct i915_vbuf_render {
* Basically a cast wrapper.
*/
static INLINE struct i915_vbuf_render *
i915_vbuf_render( struct vbuf_render *render )
i915_vbuf_render(struct vbuf_render *render)
{
assert(render);
return (struct i915_vbuf_render *)render;
}
static const struct vertex_info *
i915_vbuf_render_get_vertex_info( struct vbuf_render *render )
i915_vbuf_render_get_vertex_info(struct vbuf_render *render)
{
struct i915_vbuf_render *i915_render = i915_vbuf_render(render);
struct i915_context *i915 = i915_render->i915;
if (i915->dirty) {
/* make sure we have up to date vertex layout */
i915_update_derived( i915 );
i915_update_derived(i915);
}
return &i915->current.vertex_info;
}
static boolean
i915_vbuf_render_allocate_vertices( struct vbuf_render *render,
ushort vertex_size,
ushort nr_vertices )
i915_vbuf_render_allocate_vertices(struct vbuf_render *render,
ushort vertex_size,
ushort nr_vertices)
{
struct i915_vbuf_render *i915_render = i915_vbuf_render(render);
struct i915_context *i915 = i915_render->i915;
@@ -149,9 +147,8 @@ i915_vbuf_render_allocate_vertices( struct vbuf_render *render,
return TRUE;
}
static void *
i915_vbuf_render_map_vertices( struct vbuf_render *render )
i915_vbuf_render_map_vertices(struct vbuf_render *render)
{
struct i915_vbuf_render *i915_render = i915_vbuf_render(render);
struct i915_context *i915 = i915_render->i915;
@@ -168,9 +165,9 @@ i915_vbuf_render_map_vertices( struct vbuf_render *render )
}
static void
i915_vbuf_render_unmap_vertices( struct vbuf_render *render,
ushort min_index,
ushort max_index )
i915_vbuf_render_unmap_vertices(struct vbuf_render *render,
ushort min_index,
ushort max_index)
{
struct i915_vbuf_render *i915_render = i915_vbuf_render(render);
struct i915_context *i915 = i915_render->i915;
@@ -181,8 +178,8 @@ i915_vbuf_render_unmap_vertices( struct vbuf_render *render,
}
static boolean
i915_vbuf_render_set_primitive( struct vbuf_render *render,
unsigned prim )
i915_vbuf_render_set_primitive(struct vbuf_render *render,
unsigned prim)
{
struct i915_vbuf_render *i915_render = i915_vbuf_render(render);
i915_render->prim = prim;
@@ -234,15 +231,13 @@ i915_vbuf_render_set_primitive( struct vbuf_render *render,
}
}
/**
* Used for fallbacks in draw_arrays
*/
static void
draw_arrays_generate_indices( struct vbuf_render *render,
unsigned start, uint nr,
unsigned type )
draw_arrays_generate_indices(struct vbuf_render *render,
unsigned start, uint nr,
unsigned type)
{
struct i915_vbuf_render *i915_render = i915_vbuf_render(render);
struct i915_context *i915 = i915_render->i915;
@@ -251,29 +246,29 @@ draw_arrays_generate_indices( struct vbuf_render *render,
switch(type) {
case 0:
for (i = start; i+1 < end; i += 2)
OUT_BATCH( (i+0) | (i+1) << 16 );
OUT_BATCH((i+0) | (i+1) << 16);
if (i < end)
OUT_BATCH( i );
OUT_BATCH(i);
break;
case PIPE_PRIM_LINE_LOOP:
if (nr >= 2) {
for (i = start + 1; i < end; i++)
OUT_BATCH( (i-0) | (i+0) << 16 );
OUT_BATCH( (i-0) | ( start) << 16 );
for (i = start + 1; i < end; i++)
OUT_BATCH((i-0) | (i+0) << 16);
OUT_BATCH((i-0) | ( start) << 16);
}
break;
case PIPE_PRIM_QUADS:
for (i = start; i + 3 < end; i += 4) {
OUT_BATCH( (i+0) | (i+1) << 16 );
OUT_BATCH( (i+3) | (i+1) << 16 );
OUT_BATCH( (i+2) | (i+3) << 16 );
OUT_BATCH((i+0) | (i+1) << 16);
OUT_BATCH((i+3) | (i+1) << 16);
OUT_BATCH((i+2) | (i+3) << 16);
}
break;
case PIPE_PRIM_QUAD_STRIP:
for (i = start; i + 3 < end; i += 2) {
OUT_BATCH( (i+0) | (i+1) << 16 );
OUT_BATCH( (i+3) | (i+2) << 16 );
OUT_BATCH( (i+0) | (i+3) << 16 );
OUT_BATCH((i+0) | (i+1) << 16);
OUT_BATCH((i+3) | (i+2) << 16);
OUT_BATCH((i+0) | (i+3) << 16);
}
break;
default:
@@ -282,16 +277,16 @@ draw_arrays_generate_indices( struct vbuf_render *render,
}
static unsigned
draw_arrays_calc_nr_indices( uint nr, unsigned type )
draw_arrays_calc_nr_indices(uint nr, unsigned type)
{
switch (type) {
case 0:
return nr;
case PIPE_PRIM_LINE_LOOP:
if (nr >= 2)
return nr * 2;
return nr * 2;
else
return 0;
return 0;
case PIPE_PRIM_QUADS:
return (nr / 4) * 6;
case PIPE_PRIM_QUAD_STRIP:
@@ -303,64 +298,64 @@ draw_arrays_calc_nr_indices( uint nr, unsigned type )
}
static void
draw_arrays_fallback( struct vbuf_render *render,
unsigned start,
uint nr )
draw_arrays_fallback(struct vbuf_render *render,
unsigned start,
uint nr)
{
struct i915_vbuf_render *i915_render = i915_vbuf_render(render);
struct i915_context *i915 = i915_render->i915;
unsigned nr_indices;
if (i915->dirty)
i915_update_derived( i915 );
i915_update_derived(i915);
if (i915->hardware_dirty)
i915_emit_hardware_state( i915 );
i915_emit_hardware_state(i915);
nr_indices = draw_arrays_calc_nr_indices( nr, i915_render->fallback );
nr_indices = draw_arrays_calc_nr_indices(nr, i915_render->fallback);
if (!nr_indices)
return;
if (!BEGIN_BATCH( 1 + (nr_indices + 1)/2, 1 )) {
if (!BEGIN_BATCH(1 + (nr_indices + 1)/2, 1)) {
FLUSH_BATCH(NULL);
/* Make sure state is re-emitted after a flush:
*/
i915_update_derived( i915 );
i915_emit_hardware_state( i915 );
i915_update_derived(i915);
i915_emit_hardware_state(i915);
i915->vbo_flushed = 1;
if (!BEGIN_BATCH( 1 + (nr_indices + 1)/2, 1 )) {
assert(0);
goto out;
if (!BEGIN_BATCH(1 + (nr_indices + 1)/2, 1)) {
assert(0);
goto out;
}
}
OUT_BATCH( _3DPRIMITIVE |
PRIM_INDIRECT |
i915_render->hwprim |
PRIM_INDIRECT_ELTS |
nr_indices );
OUT_BATCH(_3DPRIMITIVE |
PRIM_INDIRECT |
i915_render->hwprim |
PRIM_INDIRECT_ELTS |
nr_indices);
draw_arrays_generate_indices( render, start, nr, i915_render->fallback );
draw_arrays_generate_indices(render, start, nr, i915_render->fallback);
out:
return;
}
static void
i915_vbuf_render_draw_arrays( struct vbuf_render *render,
unsigned start,
uint nr )
i915_vbuf_render_draw_arrays(struct vbuf_render *render,
unsigned start,
uint nr)
{
struct i915_vbuf_render *i915_render = i915_vbuf_render(render);
if (i915_render->fallback) {
draw_arrays_fallback( render, start, nr );
draw_arrays_fallback(render, start, nr);
return;
}
/* JB: TODO submit direct cmds */
draw_arrays_fallback( render, start, nr );
draw_arrays_fallback(render, start, nr);
}
/**
@@ -368,10 +363,10 @@ i915_vbuf_render_draw_arrays( struct vbuf_render *render,
* If type is zero normal operation assumed.
*/
static void
draw_generate_indices( struct vbuf_render *render,
const ushort *indices,
uint nr_indices,
unsigned type )
draw_generate_indices(struct vbuf_render *render,
const ushort *indices,
uint nr_indices,
unsigned type)
{
struct i915_vbuf_render *i915_render = i915_vbuf_render(render);
struct i915_context *i915 = i915_render->i915;
@@ -380,31 +375,31 @@ draw_generate_indices( struct vbuf_render *render,
switch(type) {
case 0:
for (i = 0; i + 1 < nr_indices; i += 2) {
OUT_BATCH( indices[i] | indices[i+1] << 16 );
OUT_BATCH(indices[i] | indices[i+1] << 16);
}
if (i < nr_indices) {
OUT_BATCH( indices[i] );
OUT_BATCH(indices[i]);
}
break;
case PIPE_PRIM_LINE_LOOP:
if (nr_indices >= 2) {
for (i = 1; i < nr_indices; i++)
OUT_BATCH( indices[i-1] | indices[i] << 16 );
OUT_BATCH( indices[i-1] | indices[0] << 16 );
for (i = 1; i < nr_indices; i++)
OUT_BATCH(indices[i-1] | indices[i] << 16);
OUT_BATCH(indices[i-1] | indices[0] << 16);
}
break;
case PIPE_PRIM_QUADS:
for (i = 0; i + 3 < nr_indices; i += 4) {
OUT_BATCH( indices[i+0] | indices[i+1] << 16 );
OUT_BATCH( indices[i+3] | indices[i+1] << 16 );
OUT_BATCH( indices[i+2] | indices[i+3] << 16 );
OUT_BATCH(indices[i+0] | indices[i+1] << 16);
OUT_BATCH(indices[i+3] | indices[i+1] << 16);
OUT_BATCH(indices[i+2] | indices[i+3] << 16);
}
break;
case PIPE_PRIM_QUAD_STRIP:
for (i = 0; i + 3 < nr_indices; i += 2) {
OUT_BATCH( indices[i+0] | indices[i+1] << 16 );
OUT_BATCH( indices[i+3] | indices[i+2] << 16 );
OUT_BATCH( indices[i+0] | indices[i+3] << 16 );
OUT_BATCH(indices[i+0] | indices[i+1] << 16);
OUT_BATCH(indices[i+3] | indices[i+2] << 16);
OUT_BATCH(indices[i+0] | indices[i+3] << 16);
}
break;
default:
@@ -414,16 +409,16 @@ draw_generate_indices( struct vbuf_render *render,
}
static unsigned
draw_calc_nr_indices( uint nr_indices, unsigned type )
draw_calc_nr_indices(uint nr_indices, unsigned type)
{
switch (type) {
case 0:
return nr_indices;
case PIPE_PRIM_LINE_LOOP:
if (nr_indices >= 2)
return nr_indices * 2;
return nr_indices * 2;
else
return 0;
return 0;
case PIPE_PRIM_QUADS:
return (nr_indices / 4) * 6;
case PIPE_PRIM_QUAD_STRIP:
@@ -435,9 +430,9 @@ draw_calc_nr_indices( uint nr_indices, unsigned type )
}
static void
i915_vbuf_render_draw( struct vbuf_render *render,
const ushort *indices,
uint nr_indices)
i915_vbuf_render_draw(struct vbuf_render *render,
const ushort *indices,
uint nr_indices)
{
struct i915_vbuf_render *i915_render = i915_vbuf_render(render);
struct i915_context *i915 = i915_render->i915;
@@ -445,48 +440,47 @@ i915_vbuf_render_draw( struct vbuf_render *render,
save_nr_indices = nr_indices;
nr_indices = draw_calc_nr_indices( nr_indices, i915_render->fallback );
nr_indices = draw_calc_nr_indices(nr_indices, i915_render->fallback);
if (!nr_indices)
return;
if (i915->dirty)
i915_update_derived( i915 );
i915_update_derived(i915);
if (i915->hardware_dirty)
i915_emit_hardware_state( i915 );
i915_emit_hardware_state(i915);
if (!BEGIN_BATCH( 1 + (nr_indices + 1)/2, 1 )) {
if (!BEGIN_BATCH(1 + (nr_indices + 1)/2, 1)) {
FLUSH_BATCH(NULL);
/* Make sure state is re-emitted after a flush:
*/
i915_update_derived( i915 );
i915_emit_hardware_state( i915 );
i915_update_derived(i915);
i915_emit_hardware_state(i915);
i915->vbo_flushed = 1;
if (!BEGIN_BATCH( 1 + (nr_indices + 1)/2, 1 )) {
assert(0);
goto out;
if (!BEGIN_BATCH(1 + (nr_indices + 1)/2, 1)) {
assert(0);
goto out;
}
}
OUT_BATCH( _3DPRIMITIVE |
PRIM_INDIRECT |
i915_render->hwprim |
PRIM_INDIRECT_ELTS |
nr_indices );
draw_generate_indices( render,
indices,
save_nr_indices,
i915_render->fallback );
OUT_BATCH(_3DPRIMITIVE |
PRIM_INDIRECT |
i915_render->hwprim |
PRIM_INDIRECT_ELTS |
nr_indices);
draw_generate_indices(render,
indices,
save_nr_indices,
i915_render->fallback);
out:
return;
}
static void
i915_vbuf_render_release_vertices( struct vbuf_render *render )
i915_vbuf_render_release_vertices(struct vbuf_render *render)
{
struct i915_vbuf_render *i915_render = i915_vbuf_render(render);
struct i915_context *i915 = i915_render->i915;
@@ -499,20 +493,18 @@ i915_vbuf_render_release_vertices( struct vbuf_render *render )
i915->dirty |= I915_NEW_VBO;
}
static void
i915_vbuf_render_destroy( struct vbuf_render *render )
i915_vbuf_render_destroy(struct vbuf_render *render)
{
struct i915_vbuf_render *i915_render = i915_vbuf_render(render);
FREE(i915_render);
}
/**
* Create a new primitive render.
*/
static struct vbuf_render *
i915_vbuf_render_create( struct i915_context *i915 )
i915_vbuf_render_create(struct i915_context *i915)
{
struct i915_vbuf_render *i915_render = CALLOC_STRUCT(i915_vbuf_render);
struct pipe_screen *screen = i915->base.screen;
@@ -551,11 +543,10 @@ i915_vbuf_render_create( struct i915_context *i915 )
return &i915_render->base;
}
/**
* Create a new primitive vbuf/render stage.
*/
struct draw_stage *i915_draw_vbuf_stage( struct i915_context *i915 )
struct draw_stage *i915_draw_vbuf_stage(struct i915_context *i915)
{
struct vbuf_render *render;
struct draw_stage *stage;
@@ -564,7 +555,7 @@ struct draw_stage *i915_draw_vbuf_stage( struct i915_context *i915 )
if(!render)
return NULL;
stage = draw_vbuf_stage( i915->draw, render );
stage = draw_vbuf_stage(i915->draw, render);
if(!stage) {
render->destroy(render);
return NULL;