Browse Source

radeonsi: move maximum gs stream calculation into create_shader

Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
tags/11.1-branchpoint
Marek Olšák 10 years ago
parent
commit
a0cf589961

+ 1
- 0
src/gallium/drivers/radeonsi/si_shader.h View File

unsigned gs_output_prim; unsigned gs_output_prim;
unsigned gs_max_out_vertices; unsigned gs_max_out_vertices;
unsigned gs_num_invocations; unsigned gs_num_invocations;
unsigned max_gs_stream; /* count - 1 */
unsigned gsvs_vertex_size; unsigned gsvs_vertex_size;
unsigned max_gsvs_emit_size; unsigned max_gsvs_emit_size;



+ 6
- 16
src/gallium/drivers/radeonsi/si_state_shaders.c View File

si_set_tesseval_regs(shader, pm4); si_set_tesseval_regs(shader, pm4);
} }


static unsigned si_gs_get_max_stream(struct si_shader *shader)
{
struct pipe_stream_output_info *so = &shader->selector->so;
unsigned max_stream = 0, i;

if (so->num_outputs == 0)
return 0;

for (i = 0; i < so->num_outputs; i++) {
if (so->output[i].stream > max_stream)
max_stream = so->output[i].stream;
}
return max_stream;
}

static void si_shader_gs(struct si_shader *shader) static void si_shader_gs(struct si_shader *shader)
{ {
unsigned gs_vert_itemsize = shader->selector->gsvs_vertex_size; unsigned gs_vert_itemsize = shader->selector->gsvs_vertex_size;
struct si_pm4_state *pm4; struct si_pm4_state *pm4;
unsigned num_sgprs, num_user_sgprs; unsigned num_sgprs, num_user_sgprs;
uint64_t va; uint64_t va;
unsigned max_stream = si_gs_get_max_stream(shader);
unsigned max_stream = shader->selector->max_gs_stream;


/* The GSVS_RING_ITEMSIZE register takes 15 bits */ /* The GSVS_RING_ITEMSIZE register takes 15 bits */
assert(gsvs_itemsize < (1 << 15)); assert(gsvs_itemsize < (1 << 15));
sel->max_gsvs_emit_size = sel->gsvs_vertex_size * sel->max_gsvs_emit_size = sel->gsvs_vertex_size *
sel->gs_max_out_vertices; sel->gs_max_out_vertices;


sel->max_gs_stream = 0;
for (i = 0; i < sel->so.num_outputs; i++)
sel->max_gs_stream = MAX2(sel->max_gs_stream,
sel->so.output[i].stream);

for (i = 0; i < sel->info.num_inputs; i++) { for (i = 0; i < sel->info.num_inputs; i++) {
unsigned name = sel->info.input_semantic_name[i]; unsigned name = sel->info.input_semantic_name[i];
unsigned index = sel->info.input_semantic_index[i]; unsigned index = sel->info.input_semantic_index[i];

Loading…
Cancel
Save