st/mesa: make user index buffers optional
authorMarek Olšák <maraeo@gmail.com>
Tue, 24 Apr 2012 15:04:18 +0000 (17:04 +0200)
committerMarek Olšák <maraeo@gmail.com>
Sun, 29 Apr 2012 23:09:57 +0000 (01:09 +0200)
v2: use a separate upload buffer for indices

src/mesa/state_tracker/st_context.c
src/mesa/state_tracker/st_context.h
src/mesa/state_tracker/st_draw.c

index 19d9da131f3f7018114411842f5ec27af6ddaeca..d50c6be6c4dac3f1b576727258f3d6ad8f78f784 100644 (file)
@@ -138,6 +138,7 @@ static void st_init_vbuf(struct st_context *st)
 static struct st_context *
 st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe )
 {
+   struct pipe_screen *screen = pipe->screen;
    uint i;
    struct st_context *st = ST_CALLOC_STRUCT( st_context );
    
@@ -156,6 +157,12 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe )
    st->dirty.st = ~0;
 
    st->uploader = u_upload_create(st->pipe, 65536, 4, PIPE_BIND_VERTEX_BUFFER);
+
+   if (!screen->get_param(screen, PIPE_CAP_USER_INDEX_BUFFERS)) {
+      st->indexbuf_uploader = u_upload_create(st->pipe, 128 * 1024, 4,
+                                              PIPE_BIND_INDEX_BUFFER);
+   }
+
    st->cso_context = cso_create_context(pipe);
 
    st_init_vbuf(st);
@@ -263,6 +270,9 @@ static void st_destroy_context_priv( struct st_context *st )
    }
 
    u_upload_destroy(st->uploader);
+   if (st->indexbuf_uploader) {
+      u_upload_destroy(st->indexbuf_uploader);
+   }
    free( st );
 }
 
index 3ec98ada196d5f718e188a821ed2342ccc756021..8f557e81a7c1c9361c415e944cf45d08a5acb5ae 100644 (file)
@@ -73,7 +73,7 @@ struct st_context
 
    struct pipe_context *pipe;
 
-   struct u_upload_mgr *uploader;
+   struct u_upload_mgr *uploader, *indexbuf_uploader;
    struct u_vbuf *vbuf;
 
    struct draw_context *draw;  /**< For selection/feedback/rastpos only */
index c24ae75a2a9fad9cf2996caca45a8c2638d6cb07..fa7c18895c74819289aa604e694523f8f01d63ec 100644 (file)
@@ -61,6 +61,7 @@
 #include "util/u_format.h"
 #include "util/u_prim.h"
 #include "util/u_draw_quad.h"
+#include "util/u_upload_mgr.h"
 #include "draw/draw_context.h"
 #include "cso_cache/cso_context.h"
 
@@ -645,6 +646,10 @@ setup_index_buffer(struct st_context *st,
       pipe_resource_reference(&ibuffer->buffer, stobj->buffer);
       ibuffer->offset = pointer_to_offset(ib->ptr);
    }
+   else if (st->indexbuf_uploader) {
+      u_upload_data(st->indexbuf_uploader, 0, ib->count * ibuffer->index_size,
+                    ib->ptr, &ibuffer->offset, &ibuffer->buffer);
+   }
    else {
       /* indices are in user space memory */
       ibuffer->buffer =