Mesa (arb_geometry_shader4): gs: redo input swizzling for geometry shaders in the draw module
Zack Rusin
zack at kemper.freedesktop.org
Sun Sep 13 00:13:55 UTC 2009
Module: Mesa
Branch: arb_geometry_shader4
Commit: 1308bd96ee717bd4b4611ffa63e013332daa84dc
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1308bd96ee717bd4b4611ffa63e013332daa84dc
Author: Zack Rusin <zackr at vmware.com>
Date: Sat Sep 12 01:07:13 2009 -0400
gs: redo input swizzling for geometry shaders in the draw module
---
src/gallium/auxiliary/draw/draw_gs.c | 76 +++++++++++++++++++---------------
1 files changed, 43 insertions(+), 33 deletions(-)
diff --git a/src/gallium/auxiliary/draw/draw_gs.c b/src/gallium/auxiliary/draw/draw_gs.c
index b39d260..6df87e1 100644
--- a/src/gallium/auxiliary/draw/draw_gs.c
+++ b/src/gallium/auxiliary/draw/draw_gs.c
@@ -147,53 +147,63 @@ static INLINE int num_vertices_for_prim(int prim)
static void draw_fetch_geometry_input(struct draw_geometry_shader *shader,
int start_primitive,
int num_primitives,
- const float (*input)[4],
- unsigned input_stride,
+ const float (*input_ptr)[4],
+ unsigned input_vertex_stride,
unsigned inputs_from_vs)
{
struct tgsi_exec_machine *machine = shader->machine;
unsigned slot, vs_slot, k, j;
unsigned num_vertices = num_vertices_for_prim(shader->state.input_type);
-
- for (k = 0; k < num_primitives; ++k) {
- debug_printf("%d) Prim (num_verts = %d)\n", start_primitive + k,
- num_vertices);
- for (j = 0; j < num_vertices; j++) {
- int idx = ((start_primitive + k) * num_vertices + j) * inputs_from_vs;
- debug_printf("\t%d)(%d) Input vert:\n", idx, j);
-
- for (slot = 0, vs_slot = 0; slot < shader->info.num_inputs; slot++) {
- if (shader->info.input_semantic_name[slot] ==
- TGSI_SEMANTIC_VERTICES) {
- machine->Inputs[idx + slot].xyzw[0].f[j] = (float)num_vertices;
- machine->Inputs[idx + slot].xyzw[1].f[j] = (float)num_vertices;
- machine->Inputs[idx + slot].xyzw[2].f[j] = (float)num_vertices;
- machine->Inputs[idx + slot].xyzw[3].f[j] = (float)num_vertices;
- }
- else {
+ int idx = 0;
+
+ for (slot = 0, vs_slot = 0; slot < shader->info.num_inputs; slot++) {
+ debug_printf("Slot = %d (semantic = %d)\n", slot,
+ shader->info.input_semantic_name[slot]);
+ if (shader->info.input_semantic_name[slot] ==
+ TGSI_SEMANTIC_VERTICES) {
+ for (j = 0; j < num_primitives; ++j) {
+ machine->Inputs[idx].xyzw[0].f[j] = (float)num_vertices;
+ machine->Inputs[idx].xyzw[1].f[j] = (float)num_vertices;
+ machine->Inputs[idx].xyzw[2].f[j] = (float)num_vertices;
+ machine->Inputs[idx].xyzw[3].f[j] = (float)num_vertices;
+ }
+ ++idx;
+ } else {
+ for (j = 0; j < num_primitives; ++j) {
+ int vidx = idx;
+ const float (*prim_ptr)[4];
+ debug_printf(" %d) Prim (num_verts = %d)\n", start_primitive + j,
+ num_vertices);
+ prim_ptr = (const float (*)[4])(
+ (const char *)input_ptr +
+ (j * num_vertices * input_vertex_stride));
+
+ for (k = 0; k < num_vertices; ++k, ++vidx) {
+ const float (*input)[4];
+ input = (const float (*)[4])(
+ (const char *)prim_ptr + (k * input_vertex_stride));
+ debug_printf("\t%d)(%d) Input vert:\n", vidx, k);
#if 1
assert(!util_is_inf_or_nan(input[vs_slot][0]));
assert(!util_is_inf_or_nan(input[vs_slot][1]));
assert(!util_is_inf_or_nan(input[vs_slot][2]));
assert(!util_is_inf_or_nan(input[vs_slot][3]));
#endif
-
- machine->Inputs[idx + slot].xyzw[0].f[j] = input[vs_slot][0];
- machine->Inputs[idx + slot].xyzw[1].f[j] = input[vs_slot][1];
- machine->Inputs[idx + slot].xyzw[2].f[j] = input[vs_slot][2];
- machine->Inputs[idx + slot].xyzw[3].f[j] = input[vs_slot][3];
- ++vs_slot;
- }
+ machine->Inputs[vidx].xyzw[0].f[j] = input[vs_slot][0];
+ machine->Inputs[vidx].xyzw[1].f[j] = input[vs_slot][1];
+ machine->Inputs[vidx].xyzw[2].f[j] = input[vs_slot][2];
+ machine->Inputs[vidx].xyzw[3].f[j] = input[vs_slot][3];
#if 1
- debug_printf("\t%d: %f %f %f %f\n", slot,
- machine->Inputs[idx + slot].xyzw[0].f[j],
- machine->Inputs[idx + slot].xyzw[1].f[j],
- machine->Inputs[idx + slot].xyzw[2].f[j],
- machine->Inputs[idx + slot].xyzw[3].f[j]);
+ debug_printf("\t\t%f %f %f %f\n", slot,
+ machine->Inputs[vidx].xyzw[0].f[j],
+ machine->Inputs[vidx].xyzw[1].f[j],
+ machine->Inputs[vidx].xyzw[2].f[j],
+ machine->Inputs[vidx].xyzw[3].f[j]);
#endif
+ }
}
-
- input = (const float (*)[4])((const char *)input + input_stride);
+ ++vs_slot;
+ idx += num_vertices;
}
}
}
More information about the mesa-commit
mailing list