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.
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user