st/mesa: make user constant buffers optional

This commit is contained in:
Marek Olšák
2012-04-24 20:16:50 +02:00
parent 507337864f
commit 7a05459726
3 changed files with 25 additions and 7 deletions

View 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);

View 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 );
}

View 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 */