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_context.h"
#include "pipe/p_defines.h" #include "pipe/p_defines.h"
#include "util/u_inlines.h" #include "util/u_inlines.h"
#include "util/u_upload_mgr.h"
#include "st_debug.h" #include "st_debug.h"
#include "st_context.h" #include "st_context.h"
@@ -77,15 +78,21 @@ void st_upload_constants( struct st_context *st,
* avoid gratuitous rendering synchronization. * avoid gratuitous rendering synchronization.
* Let's use a user buffer to avoid an unnecessary copy. * Let's use a user buffer to avoid an unnecessary copy.
*/ */
cb.buffer = pipe_user_buffer_create(pipe->screen, if (st->constbuf_uploader) {
params->ParameterValues, cb.buffer = NULL;
paramBytes, u_upload_data(st->constbuf_uploader, 0, paramBytes,
PIPE_BIND_CONSTANT_BUFFER); params->ParameterValues, &cb.buffer_offset, &cb.buffer);
cb.buffer_offset = 0; } else {
cb.buffer = pipe_user_buffer_create(pipe->screen,
params->ParameterValues,
paramBytes,
PIPE_BIND_CONSTANT_BUFFER);
cb.buffer_offset = 0;
}
cb.buffer_size = paramBytes; cb.buffer_size = paramBytes;
if (ST_DEBUG & DEBUG_CONSTANTS) { 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, __FUNCTION__, shader_type, params->NumParameters,
params->StateFlags); params->StateFlags);
_mesa_print_parameter_list(params); _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); 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->cso_context = cso_create_context(pipe);
st_init_vbuf(st); st_init_vbuf(st);
@@ -273,6 +281,9 @@ static void st_destroy_context_priv( struct st_context *st )
if (st->indexbuf_uploader) { if (st->indexbuf_uploader) {
u_upload_destroy(st->indexbuf_uploader); u_upload_destroy(st->indexbuf_uploader);
} }
if (st->constbuf_uploader) {
u_upload_destroy(st->constbuf_uploader);
}
free( st ); free( st );
} }

View File

@@ -73,7 +73,7 @@ struct st_context
struct pipe_context *pipe; 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 u_vbuf *vbuf;
struct draw_context *draw; /**< For selection/feedback/rastpos only */ struct draw_context *draw; /**< For selection/feedback/rastpos only */