r300g: revisit some assertions and fix potential failures
authorMarek Olšák <maraeo@gmail.com>
Sun, 11 Apr 2010 06:28:39 +0000 (08:28 +0200)
committerMarek Olšák <maraeo@gmail.com>
Sun, 11 Apr 2010 08:15:50 +0000 (10:15 +0200)
* 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.

src/gallium/drivers/r300/r300_emit.c
src/gallium/drivers/r300/r300_fs.c
src/gallium/drivers/r300/r300_render.c
src/gallium/drivers/r300/r300_state.c
src/gallium/drivers/r300/r300_state_derived.c
src/gallium/drivers/r300/r300_vs.c

index 60ec164dde91dd1b3a12a1b0da23df5edc502c5c..63cd41a57b7d4e2ab20ab2507cf0956921de7bb6 100644 (file)
@@ -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);
index 0444e58f0ddb362e492aa6624347304c68370953..d9319525d41592b13edc45278757c45eb256dd22 100644 (file)
@@ -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]);
         }
     }
 }
index 44da7aa3777abac65ffaa7f438ae5f475a70bf85..751a7e6d5bd667b50e30d3c9d356eb9e75206896 100644 (file)
@@ -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);
 
index 95ce1a9600de366b7e7dd11387908a6ad06b208c..6e69155068bb1f75ef203537cb6b9fb5ddb4e770 100644 (file)
@@ -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, "r300set_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,
index 94968153836844736b4d8c017dad5371955ad295..10e854dac9305e2d44e206852ea8ab036e800c9a 100644 (file)
@@ -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);
 
index b9b049afad6f10a7ba2bad32f25e79060d33ee62..d8900f73eb6f2bfc5e1d8e6a63c4dffb22645b8d 100644 (file)
@@ -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 {