Browse Source

gs: make sure we end primitives when finishing executing shaders

tags/mesa-7.9-rc1
Zack Rusin 16 years ago
parent
commit
3560652ccf

+ 7
- 21
src/gallium/auxiliary/draw/draw_gs.c View File

@@ -416,11 +416,18 @@ int draw_geometry_shader_run(struct draw_geometry_shader *shader,
output_prims->linear = TRUE;
output_prims->elts = NULL;
output_prims->start = 0;
output_prims->count = shader->emitted_vertices;
output_prims->prim = shader->output_primitive;
output_prims->primitive_lengths = shader->primitive_lengths;
output_prims->primitive_count = shader->emitted_primitives;
output_verts->count = shader->emitted_vertices;

#if 0
debug_printf("GS finished, prims = %d, verts = %d\n",
output_prims->primitive_count,
output_verts->count);
#endif

return shader->emitted_vertices;
}

@@ -440,24 +447,3 @@ void draw_geometry_shader_prepare(struct draw_geometry_shader *shader,
draw->gs.samplers);
}
}

int draw_max_output_vertices(struct draw_context *draw,
unsigned pipe_prim,
unsigned count)
{
unsigned alloc_count = align( count, 4 );

if (draw->gs.geometry_shader) {
unsigned input_primitives = u_gs_prims_for_vertices(pipe_prim,
count);
/* max GS output is number of input primitives * max output
* vertices per each invocation */
unsigned gs_max_verts = input_primitives *
draw->gs.geometry_shader->max_output_vertices;
if (gs_max_verts > count)
alloc_count = align(gs_max_verts, 4);
}
/*debug_printf("------- alloc count = %d (input = %d)\n",
alloc_count, count);*/
return alloc_count;
}

+ 0
- 5
src/gallium/auxiliary/draw/draw_private.h View File

@@ -403,9 +403,4 @@ draw_get_rasterizer_no_cull( struct draw_context *draw,
boolean flatshade );


int draw_max_output_vertices(struct draw_context *draw,
unsigned pipe_prim,
unsigned count);


#endif /* DRAW_PRIVATE_H */

+ 16
- 0
src/gallium/auxiliary/tgsi/tgsi_exec.c View File

@@ -1541,6 +1541,19 @@ emit_primitive(struct tgsi_exec_machine *mach)
}
}

static void
conditional_emit_primitive(struct tgsi_exec_machine *mach)
{
if (TGSI_PROCESSOR_GEOMETRY == mach->Processor) {
int emitted_verts =
mach->Primitives[mach->Temps[TEMP_PRIMITIVE_I].xyzw[TEMP_PRIMITIVE_C].u[0]];
if (emitted_verts) {
emit_primitive(mach);
}
}
}


/*
* Fetch four texture samples using STR texture coordinates.
*/
@@ -3190,6 +3203,9 @@ exec_instruction(
break;

case TGSI_OPCODE_END:
/* make sure we end primitives which haven't
* been explicitly emitted */
conditional_emit_primitive(mach);
/* halt execution */
*pc = -1;
break;

Loading…
Cancel
Save