case PIPE_SHADER_VERTEX:
draw->pt.user.vs_constants[slot] = buffer;
draw->pt.user.vs_constants_size[slot] = size;
- draw_vs_set_constants(draw, slot, buffer, size);
break;
case PIPE_SHADER_GEOMETRY:
draw->pt.user.gs_constants[slot] = buffer;
draw->pt.user.gs_constants_size[slot] = size;
- draw_gs_set_constants(draw, slot, buffer, size);
break;
default:
assert(0 && "invalid shader type in draw_set_mapped_constant_buffer");
tgsi_exec_machine_destroy(draw->gs.tgsi.machine);
}
-void
-draw_gs_set_constants(struct draw_context *draw,
- unsigned slot,
- const void *constants,
- unsigned size)
-{
- /* noop. added here for symmetry with the VS
- * code and in case we'll ever want to allign
- * the constants, e.g. when we'll change to a
- * different interpreter */
-}
-
-
struct draw_geometry_shader *
draw_create_geometry_shader(struct draw_context *draw,
const struct pipe_shader_state *state)
uint num_samplers;
} tgsi;
- const void *aligned_constants[PIPE_MAX_CONSTANT_BUFFERS];
-
- const void *aligned_constant_storage[PIPE_MAX_CONSTANT_BUFFERS];
- unsigned const_storage_size[PIPE_MAX_CONSTANT_BUFFERS];
-
-
struct translate *fetch;
struct translate_cache *fetch_cache;
struct translate *emit;
void draw_vs_set_viewport( struct draw_context *,
const struct pipe_viewport_state * );
-void
-draw_vs_set_constants(struct draw_context *,
- unsigned slot,
- const void *constants,
- unsigned size);
-
-
/*******************************************************************************
* Geometry shading code:
*/
boolean draw_gs_init( struct draw_context *draw );
-void
-draw_gs_set_constants(struct draw_context *,
- unsigned slot,
- const void *constants,
- unsigned size);
void draw_gs_destroy( struct draw_context *draw );
DEBUG_GET_ONCE_BOOL_OPTION(gallium_dump_vs, "GALLIUM_DUMP_VS", FALSE)
-/**
- * Set a vertex shader constant buffer.
- * \param slot which constant buffer in [0, PIPE_MAX_CONSTANT_BUFFERS-1]
- * \param constants the mapped buffer
- * \param size size of buffer in bytes
- */
-void
-draw_vs_set_constants(struct draw_context *draw,
- unsigned slot,
- const void *constants,
- unsigned size)
-{
- const int alignment = 16;
-
- /* check if buffer is 16-byte aligned */
- if (((uintptr_t)constants) & (alignment - 1)) {
- /* if not, copy the constants into a new, 16-byte aligned buffer */
- if (size > draw->vs.const_storage_size[slot]) {
- if (draw->vs.aligned_constant_storage[slot]) {
- align_free((void *)draw->vs.aligned_constant_storage[slot]);
- draw->vs.const_storage_size[slot] = 0;
- }
- draw->vs.aligned_constant_storage[slot] =
- align_malloc(size, alignment);
- if (draw->vs.aligned_constant_storage[slot]) {
- draw->vs.const_storage_size[slot] = size;
- }
- }
- assert(constants);
- if (draw->vs.aligned_constant_storage[slot]) {
- memcpy((void *)draw->vs.aligned_constant_storage[slot],
- constants,
- size);
- }
- constants = draw->vs.aligned_constant_storage[slot];
- }
-
- draw->vs.aligned_constants[slot] = constants;
-}
-
-
void draw_vs_set_viewport( struct draw_context *draw,
const struct pipe_viewport_state *viewport )
{
void
draw_vs_destroy( struct draw_context *draw )
{
- uint i;
-
if (draw->vs.fetch_cache)
translate_cache_destroy(draw->vs.fetch_cache);
if (draw->vs.emit_cache)
translate_cache_destroy(draw->vs.emit_cache);
- for (i = 0; i < PIPE_MAX_CONSTANT_BUFFERS; i++) {
- if (draw->vs.aligned_constant_storage[i]) {
- align_free((void *)draw->vs.aligned_constant_storage[i]);
- }
- }
-
tgsi_exec_machine_destroy(draw->vs.tgsi.machine);
}