mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
draw: add shader buffer interfaces.
This adds the interface to add mapped shader buffers, and sets up the jit linkage for them. Reviewed-by: Roland Scheidegger <sroland@vmware.com>
This commit is contained in:
parent
b5ac381d8f
commit
d8fb66a3e1
4 changed files with 57 additions and 1 deletions
|
|
@ -464,6 +464,32 @@ draw_set_mapped_constant_buffer(struct draw_context *draw,
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
draw_set_mapped_shader_buffer(struct draw_context *draw,
|
||||
enum pipe_shader_type shader_type,
|
||||
unsigned slot,
|
||||
const void *buffer,
|
||||
unsigned size )
|
||||
{
|
||||
debug_assert(shader_type == PIPE_SHADER_VERTEX ||
|
||||
shader_type == PIPE_SHADER_GEOMETRY);
|
||||
debug_assert(slot < PIPE_MAX_SHADER_BUFFERS);
|
||||
|
||||
draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE);
|
||||
|
||||
switch (shader_type) {
|
||||
case PIPE_SHADER_VERTEX:
|
||||
draw->pt.user.vs_ssbos[slot] = buffer;
|
||||
draw->pt.user.vs_ssbos_size[slot] = size;
|
||||
break;
|
||||
case PIPE_SHADER_GEOMETRY:
|
||||
draw->pt.user.gs_ssbos[slot] = buffer;
|
||||
draw->pt.user.gs_ssbos_size[slot] = size;
|
||||
break;
|
||||
default:
|
||||
assert(0 && "invalid shader type in draw_set_mapped_shader_buffer");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tells the draw module to draw points with triangles if their size
|
||||
|
|
|
|||
|
|
@ -254,6 +254,13 @@ draw_set_mapped_constant_buffer(struct draw_context *draw,
|
|||
const void *buffer,
|
||||
unsigned size);
|
||||
|
||||
void
|
||||
draw_set_mapped_shader_buffer(struct draw_context *draw,
|
||||
enum pipe_shader_type shader_type,
|
||||
unsigned slot,
|
||||
const void *buffer,
|
||||
unsigned size);
|
||||
|
||||
void
|
||||
draw_set_mapped_so_targets(struct draw_context *draw,
|
||||
int num_targets,
|
||||
|
|
|
|||
|
|
@ -205,7 +205,13 @@ struct draw_context
|
|||
unsigned vs_constants_size[PIPE_MAX_CONSTANT_BUFFERS];
|
||||
const void *gs_constants[PIPE_MAX_CONSTANT_BUFFERS];
|
||||
unsigned gs_constants_size[PIPE_MAX_CONSTANT_BUFFERS];
|
||||
|
||||
|
||||
/** shader buffers (for vertex/geometry shader) */
|
||||
const void *vs_ssbos[PIPE_MAX_SHADER_BUFFERS];
|
||||
unsigned vs_ssbos_size[PIPE_MAX_SHADER_BUFFERS];
|
||||
const void *gs_ssbos[PIPE_MAX_SHADER_BUFFERS];
|
||||
unsigned gs_ssbos_size[PIPE_MAX_SHADER_BUFFERS];
|
||||
|
||||
/* pointer to planes */
|
||||
float (*planes)[DRAW_TOTAL_CLIP_PLANES][4];
|
||||
} user;
|
||||
|
|
|
|||
|
|
@ -297,6 +297,15 @@ llvm_middle_end_bind_parameters(struct draw_pt_middle_end *middle)
|
|||
llvm->jit_context.vs_constants[i] = fake_const_buf;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < ARRAY_SIZE(llvm->jit_context.vs_ssbos); ++i) {
|
||||
int num_ssbos = draw->pt.user.vs_ssbos_size[i];
|
||||
llvm->jit_context.vs_ssbos[i] = draw->pt.user.vs_ssbos[i];
|
||||
llvm->jit_context.num_vs_ssbos[i] = num_ssbos;
|
||||
if (num_ssbos == 0) {
|
||||
llvm->jit_context.vs_ssbos[i] = (const uint32_t *)fake_const_buf;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(llvm->gs_jit_context.constants); ++i) {
|
||||
int num_consts =
|
||||
draw->pt.user.gs_constants_size[i] / (sizeof(float) * 4);
|
||||
|
|
@ -306,6 +315,14 @@ llvm_middle_end_bind_parameters(struct draw_pt_middle_end *middle)
|
|||
llvm->gs_jit_context.constants[i] = fake_const_buf;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < ARRAY_SIZE(llvm->gs_jit_context.ssbos); ++i) {
|
||||
int num_ssbos = draw->pt.user.gs_ssbos_size[i];
|
||||
llvm->gs_jit_context.ssbos[i] = draw->pt.user.gs_ssbos[i];
|
||||
llvm->gs_jit_context.num_ssbos[i] = num_ssbos;
|
||||
if (num_ssbos == 0) {
|
||||
llvm->gs_jit_context.ssbos[i] = (const uint32_t *)fake_const_buf;
|
||||
}
|
||||
}
|
||||
|
||||
llvm->jit_context.planes =
|
||||
(float (*)[DRAW_TOTAL_CLIP_PLANES][4]) draw->pt.user.planes[0];
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue