[Mesa-dev] [PATCH 2/2] draw/gs: don't crash when vs/gs signatures don't match
Zack Rusin
zackr at vmware.com
Wed May 1 18:13:57 PDT 2013
instead of crashing just fill zeros at the input slots that don't
match, that's the mandated behavior and it avoids debug asserts.
Signed-off-by: Zack Rusin <zackr at vmware.com>
---
src/gallium/auxiliary/draw/draw_gs.c | 93 ++++++++++++++++++++--------------
1 file changed, 54 insertions(+), 39 deletions(-)
diff --git a/src/gallium/auxiliary/draw/draw_gs.c b/src/gallium/auxiliary/draw/draw_gs.c
index fbb01b4..fcd6e2d 100644
--- a/src/gallium/auxiliary/draw/draw_gs.c
+++ b/src/gallium/auxiliary/draw/draw_gs.c
@@ -57,7 +57,6 @@ draw_gs_get_input_index(int semantic, int index,
input_semantic_indices[i] == index)
return i;
}
- debug_assert(0);
return -1;
}
@@ -154,29 +153,37 @@ static void tgsi_fetch_gs_input(struct draw_geometry_shader *shader,
(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);
+ shader->info.input_semantic_name[slot],
+ shader->info.input_semantic_index[slot],
+ shader->input_info);
+ if (vs_slot < 0) {
+ debug_printf("VS/GS signature mismatch!\n");
+ machine->Inputs[idx].xyzw[0].f[prim_idx] = 0;
+ machine->Inputs[idx].xyzw[1].f[prim_idx] = 0;
+ machine->Inputs[idx].xyzw[2].f[prim_idx] = 0;
+ machine->Inputs[idx].xyzw[3].f[prim_idx] = 0;
+ } else {
#if DEBUG_INPUTS
- debug_printf("\tSlot = %d, vs_slot = %d, idx = %d:\n",
- slot, vs_slot, idx);
- 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]));
+ debug_printf("\tSlot = %d, vs_slot = %d, idx = %d:\n",
+ slot, vs_slot, idx);
+ 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].xyzw[0].f[prim_idx] = input[vs_slot][0];
- machine->Inputs[idx].xyzw[1].f[prim_idx] = input[vs_slot][1];
- machine->Inputs[idx].xyzw[2].f[prim_idx] = input[vs_slot][2];
- machine->Inputs[idx].xyzw[3].f[prim_idx] = input[vs_slot][3];
+ machine->Inputs[idx].xyzw[0].f[prim_idx] = input[vs_slot][0];
+ machine->Inputs[idx].xyzw[1].f[prim_idx] = input[vs_slot][1];
+ machine->Inputs[idx].xyzw[2].f[prim_idx] = input[vs_slot][2];
+ machine->Inputs[idx].xyzw[3].f[prim_idx] = input[vs_slot][3];
#if DEBUG_INPUTS
- debug_printf("\t\t%f %f %f %f\n",
- machine->Inputs[idx].xyzw[0].f[prim_idx],
- machine->Inputs[idx].xyzw[1].f[prim_idx],
- machine->Inputs[idx].xyzw[2].f[prim_idx],
- machine->Inputs[idx].xyzw[3].f[prim_idx]);
+ debug_printf("\t\t%f %f %f %f\n",
+ machine->Inputs[idx].xyzw[0].f[prim_idx],
+ machine->Inputs[idx].xyzw[1].f[prim_idx],
+ machine->Inputs[idx].xyzw[2].f[prim_idx],
+ machine->Inputs[idx].xyzw[3].f[prim_idx]);
#endif
- ++vs_slot;
+ ++vs_slot;
+ }
}
}
}
@@ -241,29 +248,37 @@ llvm_fetch_gs_input(struct draw_geometry_shader *shader,
/* skip. we handle system values through gallivm */
} else {
vs_slot = draw_gs_get_input_index(
- shader->info.input_semantic_name[slot],
- shader->info.input_semantic_index[slot],
- shader->input_info);
+ shader->info.input_semantic_name[slot],
+ shader->info.input_semantic_index[slot],
+ shader->input_info);
+ if (vs_slot < 0) {
+ debug_printf("VS/GS signature mismatch!\n");
+ (*input_data)[i][slot][0][prim_idx] = 0;
+ (*input_data)[i][slot][1][prim_idx] = 0;
+ (*input_data)[i][slot][2][prim_idx] = 0;
+ (*input_data)[i][slot][3][prim_idx] = 0;
+ } else {
#if DEBUG_INPUTS
- debug_printf("\tSlot = %d, vs_slot = %d, i = %d:\n",
- slot, vs_slot, i);
- 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]));
+ debug_printf("\tSlot = %d, vs_slot = %d, i = %d:\n",
+ slot, vs_slot, i);
+ 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
- (*input_data)[i][slot][0][prim_idx] = input[vs_slot][0];
- (*input_data)[i][slot][1][prim_idx] = input[vs_slot][1];
- (*input_data)[i][slot][2][prim_idx] = input[vs_slot][2];
- (*input_data)[i][slot][3][prim_idx] = input[vs_slot][3];
+ (*input_data)[i][slot][0][prim_idx] = input[vs_slot][0];
+ (*input_data)[i][slot][1][prim_idx] = input[vs_slot][1];
+ (*input_data)[i][slot][2][prim_idx] = input[vs_slot][2];
+ (*input_data)[i][slot][3][prim_idx] = input[vs_slot][3];
#if DEBUG_INPUTS
- debug_printf("\t\t%f %f %f %f\n",
- (*input_data)[i][slot][0][prim_idx],
- (*input_data)[i][slot][1][prim_idx],
- (*input_data)[i][slot][2][prim_idx],
- (*input_data)[i][slot][3][prim_idx]);
+ debug_printf("\t\t%f %f %f %f\n",
+ (*input_data)[i][slot][0][prim_idx],
+ (*input_data)[i][slot][1][prim_idx],
+ (*input_data)[i][slot][2][prim_idx],
+ (*input_data)[i][slot][3][prim_idx]);
#endif
- ++vs_slot;
+ ++vs_slot;
+ }
}
}
}
--
1.7.10.4
More information about the mesa-dev
mailing list