Commit 14687928 authored by Marek Olšák's avatar Marek Olšák

r300g: revisit some assertions and fix potential failures

* Turn some assertions to error messages.
* At most 16 vertex elements can be set, others are ignored.
* Rasterize at most 8 vertex-shader generic outputs, others are ignored.
  This includes fog and WPOS.
* Unknown shader semantic names are ignored.
parent 08afcaa5
......@@ -1114,10 +1114,6 @@ void r300_emit_dirty_state(struct r300_context* r300)
r300->dirty_state &= ~R300_NEW_VERTEX_SHADER_CONSTANTS;
}
/* XXX
assert(r300->dirty_state == 0);
*/
/* Emit the VBO for SWTCL. */
if (!r300screen->caps.has_tcl) {
r300_emit_vertex_buffer(r300);
......
......@@ -69,7 +69,8 @@ void r300_shader_read_fs_inputs(struct tgsi_shader_info* info,
break;
default:
assert(0);
fprintf(stderr, "r300: FP: Unknown input semantic: %i\n",
info->input_semantic_name[i]);
}
}
}
......
......@@ -273,7 +273,11 @@ void r500_emit_draw_arrays(struct r300_context *r300,
CS_LOCALS(r300);
if (alt_num_verts) {
assert(count < (1 << 24));
if (count >= (1 << 24)) {
fprintf(stderr, "r300: Got a huge number of vertices: %i, "
"refusing to render.\n", count);
return;
}
BEGIN_CS(9);
OUT_CS_REG(R500_VAP_ALT_NUM_VERTICES, count);
} else {
......@@ -309,7 +313,11 @@ void r500_emit_draw_elements(struct r300_context *r300,
#endif
CS_LOCALS(r300);
assert(count < (1 << 24));
if (count >= (1 << 24)) {
fprintf(stderr, "r300: Got a huge number of vertices: %i, "
"refusing to render.\n", count);
return;
}
maxIndex = MIN2(maxIndex, r300->vertex_buffer_max_index);
......
......@@ -1128,10 +1128,9 @@ static void r300_set_vertex_buffers(struct pipe_context* pipe,
if (buffers[i].buffer) {
if (buffers[i].stride % 4 != 0) {
// XXX Shouldn't we align the buffer?
fprintf(stderr, "r300_set_vertex_buffers: "
fprintf(stderr, "r300: set_vertex_buffers: "
"Unaligned buffer stride %i isn't supported.\n",
buffers[i].stride);
assert(0);
abort();
}
}
......@@ -1193,7 +1192,11 @@ static void r300_vertex_psc(struct r300_vertex_element_state *velems)
enum pipe_format format;
unsigned i;
assert(velems->count <= 16);
if (velems->count > 16) {
fprintf(stderr, "r300: More than 16 vertex elements are not supported,"
" requested %i, using 16.\n", velems->count);
velems->count = 16;
}
/* Vertex shaders have no semantics on their inputs,
* so PSC should just route stuff based on the vertex elements,
......
......@@ -83,8 +83,10 @@ static void r300_draw_emit_all_attribs(struct r300_context* r300)
/* XXX Back-face colors. */
/* Texture coordinates. */
/* Only 8 generic vertex attributes can be used. If there are more,
* they won't be rasterized. */
gen_count = 0;
for (i = 0; i < ATTR_GENERIC_COUNT; i++) {
for (i = 0; i < ATTR_GENERIC_COUNT && gen_count < 8; i++) {
if (vs_outputs->generic[i] != ATTR_UNUSED) {
r300_draw_emit_attrib(r300, EMIT_4F, INTERP_PERSPECTIVE,
vs_outputs->generic[i]);
......@@ -93,13 +95,11 @@ static void r300_draw_emit_all_attribs(struct r300_context* r300)
}
/* Fog coordinates. */
if (vs_outputs->fog != ATTR_UNUSED) {
if (gen_count < 8 && vs_outputs->fog != ATTR_UNUSED) {
r300_draw_emit_attrib(r300, EMIT_4F, INTERP_PERSPECTIVE,
vs_outputs->fog);
gen_count++;
}
assert(gen_count <= 8);
}
/* Update the PSC tables for SW TCL, using Draw. */
......@@ -344,7 +344,7 @@ static void r300_update_rs_block(struct r300_context* r300,
/* Rasterize WPOS. */
/* If the FS doesn't need it, it's not written by the VS. */
if (fs_inputs->wpos != ATTR_UNUSED) {
if (vs_outputs->wpos != ATTR_UNUSED && fs_inputs->wpos != ATTR_UNUSED) {
rX00_rs_tex(&rs, tex_count, tex_count, FALSE);
rX00_rs_tex_write(&rs, tex_count, fp_offset);
......
......@@ -80,11 +80,12 @@ static void r300_shader_read_vs_outputs(
case TGSI_SEMANTIC_EDGEFLAG:
assert(index == 0);
fprintf(stderr, "r300 VP: cannot handle edgeflag output\n");
assert(0);
fprintf(stderr, "r300 VP: cannot handle edgeflag output.\n");
break;
default:
assert(0);
fprintf(stderr, "r300 VP: unknown vertex output semantic: %i.\n",
info->output_semantic_name[i]);
}
}
......@@ -148,34 +149,32 @@ static void r300_init_vs_output_mapping(struct r300_vertex_shader* vs)
/* Texture coordinates. */
gen_count = 0;
for (i = 0; i < ATTR_GENERIC_COUNT; i++) {
for (i = 0; i < ATTR_GENERIC_COUNT && gen_count < 8; i++) {
if (vs_outputs->generic[i] != ATTR_UNUSED) {
vap_out->vap_vsm_vtx_assm |= (R300_INPUT_CNTL_TC0 << gen_count);
vap_out->vap_out_vtx_fmt[1] |= (4 << (3 * gen_count));
assert(tabi < 16);
stream_loc[tabi++] = 6 + gen_count;
gen_count++;
}
}
/* Fog coordinates. */
if (vs_outputs->fog != ATTR_UNUSED) {
if (gen_count < 8 && vs_outputs->fog != ATTR_UNUSED) {
vap_out->vap_vsm_vtx_assm |= (R300_INPUT_CNTL_TC0 << gen_count);
vap_out->vap_out_vtx_fmt[1] |= (4 << (3 * gen_count));
assert(tabi < 16);
stream_loc[tabi++] = 6 + gen_count;
gen_count++;
}
assert(gen_count <= 8);
/* WPOS. */
vs->wpos_tex_output = gen_count;
assert(tabi < 16);
stream_loc[tabi++] = 6 + gen_count;
if (gen_count < 8) {
vs->wpos_tex_output = gen_count;
stream_loc[tabi++] = 6 + gen_count;
} else {
vs_outputs->wpos = ATTR_UNUSED;
}
for (; tabi < 16;) {
stream_loc[tabi++] = -1;
......@@ -292,7 +291,9 @@ void r300_translate_vertex_shader(struct r300_context* r300,
compiler.SetHwInputOutput = &set_vertex_inputs_outputs;
/* Insert the WPOS output. */
rc_copy_output(&compiler.Base, 0, vs->outputs.wpos);
if (vs->outputs.wpos != ATTR_UNUSED) {
rc_copy_output(&compiler.Base, 0, vs->outputs.wpos);
}
/* Invoke the compiler */
r3xx_compile_vertex_program(&compiler);
......@@ -313,13 +314,15 @@ boolean r300_vertex_shader_setup_wpos(struct r300_context* r300)
int tex_output = vs->wpos_tex_output;
uint32_t tex_fmt = R300_INPUT_CNTL_TC0 << tex_output;
if (vs->outputs.wpos == ATTR_UNUSED) {
return FALSE;
}
if (r300->fs->inputs.wpos != ATTR_UNUSED) {
/* Enable WPOS in VAP. */
if (!(vap_out->vap_vsm_vtx_assm & tex_fmt)) {
vap_out->vap_vsm_vtx_assm |= tex_fmt;
vap_out->vap_out_vtx_fmt[1] |= (4 << (3 * tex_output));
assert(tex_output < 8);
return TRUE;
}
} else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment