st/mesa: make user constant buffers optional
This commit is contained in:
@@ -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);
|
||||
|
@@ -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 );
|
||||
}
|
||||
|
||||
|
@@ -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 */
|
||||
|
Reference in New Issue
Block a user