st/mesa: make user constant buffers optional
authorMarek Olšák <maraeo@gmail.com>
Tue, 24 Apr 2012 18:16:50 +0000 (20:16 +0200)
committerMarek Olšák <maraeo@gmail.com>
Sun, 29 Apr 2012 23:09:57 +0000 (01:09 +0200)
src/mesa/state_tracker/st_atom_constbuf.c
src/mesa/state_tracker/st_context.c
src/mesa/state_tracker/st_context.h

index 87bb51543f5af1aa82408dc4bf98f28635a6c012..eb98161dbd0fd2ed322676f4a3d1f2072f9451a3 100644 (file)
@@ -38,6 +38,7 @@
 #include "pipe/p_context.h"
 #include "pipe/p_defines.h"
 #include "util/u_inlines.h"
+#include "util/u_upload_mgr.h"
 
 #include "st_debug.h"
 #include "st_context.h"
@@ -77,15 +78,21 @@ void st_upload_constants( struct st_context *st,
        * avoid gratuitous rendering synchronization.
        * Let's use a user buffer to avoid an unnecessary copy.
        */
-      cb.buffer = pipe_user_buffer_create(pipe->screen,
-                                          params->ParameterValues,
-                                          paramBytes,
-                                          PIPE_BIND_CONSTANT_BUFFER);
-      cb.buffer_offset = 0;
+      if (st->constbuf_uploader) {
+         cb.buffer = NULL;
+         u_upload_data(st->constbuf_uploader, 0, paramBytes,
+                       params->ParameterValues, &cb.buffer_offset, &cb.buffer);
+      } else {
+         cb.buffer = pipe_user_buffer_create(pipe->screen,
+                                             params->ParameterValues,
+                                             paramBytes,
+                                             PIPE_BIND_CONSTANT_BUFFER);
+         cb.buffer_offset = 0;
+      }
       cb.buffer_size = paramBytes;
 
       if (ST_DEBUG & DEBUG_CONSTANTS) {
-        debug_printf("%s(shader=%d, numParams=%d, stateFlags=0x%x)\n", 
+         debug_printf("%s(shader=%d, numParams=%d, stateFlags=0x%x)\n",
                       __FUNCTION__, shader_type, params->NumParameters,
                       params->StateFlags);
          _mesa_print_parameter_list(params);
index d50c6be6c4dac3f1b576727258f3d6ad8f78f784..a804e77af8ba2e2f6bea432dd2f92c57f3e3b0e9 100644 (file)
@@ -163,6 +163,14 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe )
                                               PIPE_BIND_INDEX_BUFFER);
    }
 
+   if (!screen->get_param(screen, PIPE_CAP_USER_CONSTANT_BUFFERS)) {
+      unsigned alignment =
+         screen->get_param(screen, PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT);
+
+      st->constbuf_uploader = u_upload_create(pipe, 128 * 1024, alignment,
+                                              PIPE_BIND_CONSTANT_BUFFER);
+   }
+
    st->cso_context = cso_create_context(pipe);
 
    st_init_vbuf(st);
@@ -273,6 +281,9 @@ static void st_destroy_context_priv( struct st_context *st )
    if (st->indexbuf_uploader) {
       u_upload_destroy(st->indexbuf_uploader);
    }
+   if (st->constbuf_uploader) {
+      u_upload_destroy(st->constbuf_uploader);
+   }
    free( st );
 }
 
index 8f557e81a7c1c9361c415e944cf45d08a5acb5ae..4e40d533e0526d04fae36cb11f25ce99d965ed94 100644 (file)
@@ -73,7 +73,7 @@ struct st_context
 
    struct pipe_context *pipe;
 
-   struct u_upload_mgr *uploader, *indexbuf_uploader;
+   struct u_upload_mgr *uploader, *indexbuf_uploader, *constbuf_uploader;
    struct u_vbuf *vbuf;
 
    struct draw_context *draw;  /**< For selection/feedback/rastpos only */