st_atom_constbuf.c [plain text]
#include "main/imports.h"
#include "shader/prog_parameter.h"
#include "shader/prog_print.h"
#include "pipe/p_context.h"
#include "pipe/p_defines.h"
#include "util/u_inlines.h"
#include "st_debug.h"
#include "st_context.h"
#include "st_atom.h"
#include "st_atom_constbuf.h"
#include "st_program.h"
#include "st_inlines.h"
void st_upload_constants( struct st_context *st,
struct gl_program_parameter_list *params,
unsigned shader_type)
{
struct pipe_context *pipe = st->pipe;
struct pipe_buffer **cbuf = &st->state.constants[shader_type];
assert(shader_type == PIPE_SHADER_VERTEX ||
shader_type == PIPE_SHADER_FRAGMENT);
if (params && params->NumParameters) {
const uint paramBytes = params->NumParameters * sizeof(GLfloat) * 4;
_mesa_load_state_parameters(st->ctx, params);
pipe_buffer_reference(cbuf, NULL );
*cbuf = pipe_buffer_create(pipe->screen, 16,
PIPE_BUFFER_USAGE_CONSTANT,
paramBytes );
if (ST_DEBUG & DEBUG_CONSTANTS) {
debug_printf("%s(shader=%d, numParams=%d, stateFlags=0x%x)\n",
__FUNCTION__, shader_type, params->NumParameters,
params->StateFlags);
_mesa_print_parameter_list(params);
}
if (cbuf)
st_no_flush_pipe_buffer_write(st, *cbuf,
0, paramBytes,
params->ParameterValues);
st->pipe->set_constant_buffer(st->pipe, shader_type, 0, *cbuf);
}
else {
st->constants.tracked_state[shader_type].dirty.mesa = 0x0;
}
}
static void update_vs_constants(struct st_context *st )
{
struct st_vertex_program *vp = st->vp;
struct gl_program_parameter_list *params = vp->Base.Base.Parameters;
st_upload_constants( st, params, PIPE_SHADER_VERTEX );
}
const struct st_tracked_state st_update_vs_constants = {
"st_update_vs_constants",
{
(_NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS),
ST_NEW_VERTEX_PROGRAM,
},
update_vs_constants
};
static void update_fs_constants(struct st_context *st )
{
struct st_fragment_program *fp = st->fp;
struct gl_program_parameter_list *params = fp->Base.Base.Parameters;
st_upload_constants( st, params, PIPE_SHADER_FRAGMENT );
}
const struct st_tracked_state st_update_fs_constants = {
"st_update_fs_constants",
{
(_NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS),
ST_NEW_FRAGMENT_PROGRAM,
},
update_fs_constants
};