mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-30 23:28:06 +02:00
i915: Made vertex submission eaven faster
This commit is contained in:
parent
08130512b9
commit
cb5e05d99c
5 changed files with 61 additions and 18 deletions
|
|
@ -245,6 +245,8 @@ struct i915_context
|
|||
|
||||
/** Vertex buffer */
|
||||
struct pipe_buffer *vbo;
|
||||
size_t vbo_offset;
|
||||
unsigned vbo_flushed;
|
||||
|
||||
struct i915_state current;
|
||||
unsigned hardware_dirty;
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@ static void i915_flush( struct pipe_context *pipe,
|
|||
/* If there are no flags, just flush pending commands to hardware:
|
||||
*/
|
||||
FLUSH_BATCH(fence);
|
||||
i915->vbo_flushed = 1;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -70,6 +70,13 @@ struct i915_vbuf_render {
|
|||
|
||||
/** Genereate a vertex list */
|
||||
unsigned fallback;
|
||||
|
||||
/* Stuff for the vbo */
|
||||
struct pipe_buffer *vbo;
|
||||
size_t vbo_size;
|
||||
size_t vbo_offset;
|
||||
void *vbo_ptr;
|
||||
size_t vbo_alloc_size;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -111,14 +118,31 @@ i915_vbuf_render_allocate_vertices( struct vbuf_render *render,
|
|||
|
||||
/* FIXME: handle failure */
|
||||
assert(!i915->vbo);
|
||||
i915->vbo = winsys->buffer_create(winsys, 64, I915_BUFFER_USAGE_LIT_VERTEX,
|
||||
size);
|
||||
|
||||
if (i915_render->vbo_size > size + i915_render->vbo_offset && !i915->vbo_flushed) {
|
||||
} else {
|
||||
i915->vbo_flushed = 0;
|
||||
pipe_buffer_reference(winsys, &i915_render->vbo, NULL);
|
||||
}
|
||||
|
||||
if (!i915_render->vbo) {
|
||||
i915_render->vbo_size = MAX2(size, i915_render->vbo_alloc_size);
|
||||
i915_render->vbo_offset = 0;
|
||||
i915_render->vbo = winsys->buffer_create(winsys,
|
||||
64,
|
||||
I915_BUFFER_USAGE_LIT_VERTEX,
|
||||
i915_render->vbo_size);
|
||||
i915_render->vbo_ptr = winsys->buffer_map(winsys,
|
||||
i915_render->vbo,
|
||||
PIPE_BUFFER_USAGE_CPU_WRITE);
|
||||
winsys->buffer_unmap(winsys, i915_render->vbo);
|
||||
}
|
||||
|
||||
i915->vbo = i915_render->vbo;
|
||||
i915->vbo_offset = i915_render->vbo_offset;
|
||||
i915->dirty |= I915_NEW_VBO;
|
||||
|
||||
return winsys->buffer_map(winsys,
|
||||
i915->vbo,
|
||||
PIPE_BUFFER_USAGE_CPU_WRITE);
|
||||
return i915_render->vbo_ptr + i915->vbo_offset;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -231,7 +255,6 @@ draw_arrays_fallback( struct vbuf_render *render,
|
|||
struct pipe_winsys *winsys = i915->pipe.winsys;
|
||||
unsigned nr_indices;
|
||||
|
||||
winsys->buffer_unmap( winsys, i915->vbo );
|
||||
if (i915->dirty)
|
||||
i915_update_derived( i915 );
|
||||
|
||||
|
|
@ -247,6 +270,7 @@ draw_arrays_fallback( struct vbuf_render *render,
|
|||
*/
|
||||
i915_update_derived( i915 );
|
||||
i915_emit_hardware_state( i915 );
|
||||
i915->vbo_flushed = 1;
|
||||
|
||||
if (!BEGIN_BATCH( 1 + (nr_indices + 1)/2, 1 )) {
|
||||
assert(0);
|
||||
|
|
@ -260,8 +284,9 @@ draw_arrays_fallback( struct vbuf_render *render,
|
|||
nr_indices );
|
||||
|
||||
draw_arrays_generate_indices( render, start, nr, i915_render->fallback );
|
||||
|
||||
out:
|
||||
winsys->buffer_map( winsys, i915->vbo, PIPE_BUFFER_USAGE_CPU_WRITE );
|
||||
return;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -353,7 +378,6 @@ i915_vbuf_render_draw( struct vbuf_render *render,
|
|||
nr_indices = draw_calc_nr_indices( nr_indices, i915_render->fallback );
|
||||
|
||||
assert(nr_indices);
|
||||
winsys->buffer_unmap( winsys, i915->vbo );
|
||||
|
||||
if (i915->dirty)
|
||||
i915_update_derived( i915 );
|
||||
|
|
@ -368,6 +392,7 @@ i915_vbuf_render_draw( struct vbuf_render *render,
|
|||
*/
|
||||
i915_update_derived( i915 );
|
||||
i915_emit_hardware_state( i915 );
|
||||
i915->vbo_flushed = 1;
|
||||
|
||||
if (!BEGIN_BATCH( 1 + (nr_indices + 1)/2, 1 )) {
|
||||
assert(0);
|
||||
|
|
@ -386,7 +411,6 @@ i915_vbuf_render_draw( struct vbuf_render *render,
|
|||
i915_render->fallback );
|
||||
|
||||
out:
|
||||
winsys->buffer_map( winsys, i915->vbo, PIPE_BUFFER_USAGE_CPU_WRITE );
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -400,10 +424,13 @@ 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;
|
||||
struct pipe_winsys *winsys = i915->pipe.winsys;
|
||||
size_t size = (size_t)vertex_size * (size_t)vertices_used;
|
||||
|
||||
assert(i915->vbo);
|
||||
winsys->buffer_unmap(winsys, i915->vbo);
|
||||
pipe_buffer_reference(winsys, &i915->vbo, NULL);
|
||||
|
||||
i915_render->vbo_offset += size;
|
||||
i915->vbo = NULL;
|
||||
i915->dirty |= I915_NEW_VBO;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -422,6 +449,7 @@ static struct vbuf_render *
|
|||
i915_vbuf_render_create( struct i915_context *i915 )
|
||||
{
|
||||
struct i915_vbuf_render *i915_render = CALLOC_STRUCT(i915_vbuf_render);
|
||||
struct pipe_winsys *winsys = i915->pipe.winsys;
|
||||
|
||||
i915_render->i915 = i915;
|
||||
|
||||
|
|
@ -431,7 +459,7 @@ i915_vbuf_render_create( struct i915_context *i915 )
|
|||
* batch buffer.
|
||||
*/
|
||||
i915_render->base.max_indices = 16*1024;
|
||||
|
||||
|
||||
i915_render->base.get_vertex_info = i915_vbuf_render_get_vertex_info;
|
||||
i915_render->base.allocate_vertices = i915_vbuf_render_allocate_vertices;
|
||||
i915_render->base.set_primitive = i915_vbuf_render_set_primitive;
|
||||
|
|
@ -439,7 +467,19 @@ i915_vbuf_render_create( struct i915_context *i915 )
|
|||
i915_render->base.draw_arrays = i915_vbuf_render_draw_arrays;
|
||||
i915_render->base.release_vertices = i915_vbuf_render_release_vertices;
|
||||
i915_render->base.destroy = i915_vbuf_render_destroy;
|
||||
|
||||
|
||||
i915_render->vbo_alloc_size = 128 * 4096;
|
||||
i915_render->vbo_size = i915_render->vbo_alloc_size;
|
||||
i915_render->vbo_offset = 0;
|
||||
i915_render->vbo = winsys->buffer_create(winsys,
|
||||
64,
|
||||
I915_BUFFER_USAGE_LIT_VERTEX,
|
||||
i915_render->vbo_size);
|
||||
i915_render->vbo_ptr = winsys->buffer_map(winsys,
|
||||
i915_render->vbo,
|
||||
PIPE_BUFFER_USAGE_CPU_WRITE);
|
||||
winsys->buffer_unmap(winsys, i915_render->vbo);
|
||||
|
||||
return &i915_render->base;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ static void upload_S0S1(struct i915_context *i915)
|
|||
|
||||
/* INTEL_NEW_VBO */
|
||||
/* TODO: re-use vertex buffers here? */
|
||||
LIS0 = 0;
|
||||
LIS0 = i915->vbo_offset;
|
||||
|
||||
/* INTEL_NEW_VERTEX_SIZE -- do this where the vertex size is calculated!
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -224,7 +224,6 @@ intel_i915_surface_alloc_storage(struct pipe_winsys *winsys,
|
|||
unsigned tex_usage)
|
||||
{
|
||||
const unsigned alignment = 64;
|
||||
//int ret;
|
||||
|
||||
surf->width = width;
|
||||
surf->height = height;
|
||||
|
|
@ -235,7 +234,8 @@ intel_i915_surface_alloc_storage(struct pipe_winsys *winsys,
|
|||
assert(!surf->buffer);
|
||||
surf->buffer = winsys->buffer_create(winsys, alignment,
|
||||
PIPE_BUFFER_USAGE_PIXEL,
|
||||
surf->pitch * surf->cpp * height);
|
||||
surf->pitch * surf->cpp * surf->height);
|
||||
|
||||
if(!surf->buffer)
|
||||
return -1;
|
||||
|
||||
|
|
@ -328,8 +328,8 @@ intel_create_pipe_winsys( int fd, struct _DriFreeSlabManager *fMan )
|
|||
DRM_BO_FLAG_READ |
|
||||
DRM_BO_FLAG_WRITE |
|
||||
DRM_BO_FLAG_MEM_TT,
|
||||
128,
|
||||
6, 120, 32 * 4096, 0,
|
||||
128 * 4096,
|
||||
1, 120, 128 * 4096 * 4, 0,
|
||||
fMan);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue