diff options
-rw-r--r-- | src/gallium/auxiliary/draw/draw_gs.c | 31 | ||||
-rw-r--r-- | src/gallium/auxiliary/draw/draw_gs.h | 2 | ||||
-rw-r--r-- | src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c | 1 | ||||
-rw-r--r-- | src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c | 2 |
4 files changed, 32 insertions, 4 deletions
diff --git a/src/gallium/auxiliary/draw/draw_gs.c b/src/gallium/auxiliary/draw/draw_gs.c index 25c117bafae..99335af12d3 100644 --- a/src/gallium/auxiliary/draw/draw_gs.c +++ b/src/gallium/auxiliary/draw/draw_gs.c @@ -148,6 +148,22 @@ void draw_delete_geometry_shader(struct draw_context *draw, FREE(dgs); } +static INLINE int +draw_gs_get_input_index(int semantic, int index, + const struct tgsi_shader_info *input_info) +{ + int i; + const ubyte *input_semantic_names = input_info->output_semantic_name; + const ubyte *input_semantic_indices = input_info->output_semantic_index; + for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) { + if (input_semantic_names[i] == semantic && + input_semantic_indices[i] == index) + return i; + } + debug_assert(0); + return -1; +} + /*#define DEBUG_OUTPUTS 1*/ static INLINE void draw_geometry_fetch_outputs(struct draw_geometry_shader *shader, @@ -228,6 +244,10 @@ static void draw_fetch_gs_input(struct draw_geometry_shader *shader, machine->Inputs[idx].xyzw[3].f[prim_idx] = (float)shader->in_prim_idx; } else { + vs_slot = draw_gs_get_input_index( + shader->info.input_semantic_name[slot], + shader->info.input_semantic_index[slot], + shader->input_info); #if DEBUG_INPUTS debug_printf("\tSlot = %d, vs_slot = %d, idx = %d:\n", slot, vs_slot, idx); @@ -381,12 +401,14 @@ int draw_geometry_shader_run(struct draw_geometry_shader *shader, const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS], const struct draw_vertex_info *input_verts, const struct draw_prim_info *input_prim, + const struct tgsi_shader_info *input_info, struct draw_vertex_info *output_verts, struct draw_prim_info *output_prims ) { const float (*input)[4] = (const float (*)[4])input_verts->verts->data; unsigned input_stride = input_verts->vertex_size; - unsigned vertex_size = input_verts->vertex_size; + unsigned num_outputs = shader->info.num_outputs; + unsigned vertex_size = sizeof(struct vertex_header) + num_outputs * 4 * sizeof(float); struct tgsi_exec_machine *machine = shader->machine; unsigned num_input_verts = input_prim->linear ? input_verts->count : @@ -398,10 +420,10 @@ int draw_geometry_shader_run(struct draw_geometry_shader *shader, shader->max_output_vertices) * num_in_primitives; - output_verts->vertex_size = input_verts->vertex_size; - output_verts->stride = input_verts->vertex_size; + output_verts->vertex_size = vertex_size; + output_verts->stride = output_verts->vertex_size; output_verts->verts = - (struct vertex_header *)MALLOC(input_verts->vertex_size * + (struct vertex_header *)MALLOC(output_verts->vertex_size * num_in_primitives * shader->max_output_vertices); @@ -425,6 +447,7 @@ int draw_geometry_shader_run(struct draw_geometry_shader *shader, shader->in_prim_idx = 0; shader->input_vertex_stride = input_stride; shader->input = input; + shader->input_info = input_info; FREE(shader->primitive_lengths); shader->primitive_lengths = MALLOC(max_out_prims * sizeof(unsigned)); diff --git a/src/gallium/auxiliary/draw/draw_gs.h b/src/gallium/auxiliary/draw/draw_gs.h index bfac02c6635..5d10d0dcd41 100644 --- a/src/gallium/auxiliary/draw/draw_gs.h +++ b/src/gallium/auxiliary/draw/draw_gs.h @@ -64,6 +64,7 @@ struct draw_geometry_shader { unsigned in_prim_idx; unsigned input_vertex_stride; const float (*input)[4]; + const struct tgsi_shader_info *input_info; }; /* @@ -76,6 +77,7 @@ int draw_geometry_shader_run(struct draw_geometry_shader *shader, const unsigned constants_size[PIPE_MAX_CONSTANT_BUFFERS], const struct draw_vertex_info *input_verts, const struct draw_prim_info *input_prim, + const struct tgsi_shader_info *input_info, struct draw_vertex_info *output_verts, struct draw_prim_info *output_prims ); diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c index 45d964da4fa..72d391257aa 100644 --- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c @@ -270,6 +270,7 @@ static void fetch_pipeline_generic( struct draw_pt_middle_end *middle, draw->pt.user.gs_constants_size, vert_info, prim_info, + &vshader->info, &gs_vert_info, &gs_prim_info); diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c index 687dfa40459..5fc94364b4e 100644 --- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c @@ -289,11 +289,13 @@ llvm_pipeline_generic( struct draw_pt_middle_end *middle, if ((opt & PT_SHADE) && gshader) { + struct draw_vertex_shader *vshader = draw->vs.vertex_shader; draw_geometry_shader_run(gshader, draw->pt.user.gs_constants, draw->pt.user.gs_constants_size, vert_info, prim_info, + &vshader->info, &gs_vert_info, &gs_prim_info); |