r300g: Respect fill modes in indices fallback.
authorCorbin Simpson <MostAwesomeDude@gmail.com>
Sun, 17 Jan 2010 01:45:34 +0000 (17:45 -0800)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Sun, 17 Jan 2010 02:17:40 +0000 (18:17 -0800)
src/gallium/drivers/r300/r300_render.c
src/gallium/drivers/r300/r300_state.c

index 710d850163f30265616a307fd3029fa2c4588b4a..64083f2dd543abb9878a0574511ef7c123bd9e5f 100644 (file)
@@ -257,10 +257,23 @@ static struct pipe_buffer* r300_translate_elts(struct r300_context* r300,
     struct pipe_buffer* new_elts;
     void *in_map, *out_map;
     unsigned out_prim, out_index_size, out_nr;
+    struct pipe_rasterizer_state* rs;
     u_translate_func out_translate;
 
-    (void)u_index_translator(~0, *mode, *size, *count, PV_LAST, PV_LAST,
-        &out_prim, &out_index_size, &out_nr, &out_translate);
+    rs = &((struct r300_rs_state*)r300->rs_state.state)->rs;
+
+    if (rs->fill_cw == rs->fill_ccw &&
+        rs->fill_cw != PIPE_POLYGON_MODE_FILL) {
+        (void)u_unfilled_translator(*mode, *size, *count, rs->fill_cw,
+            &out_prim, &out_index_size, &out_nr, &out_translate);
+    } else {
+        (void)u_index_translator(~0, *mode, *size, *count, PV_LAST, PV_LAST,
+            &out_prim, &out_index_size, &out_nr, &out_translate);
+    }
+
+    debug_printf("r300: old mode %d, new mode %d\n", *mode, out_prim);
+    debug_printf("r300: old count %d, new count %d\n", *count, out_nr);
+    debug_printf("r300: old size %d, new size %d\n", *size, out_index_size);
 
     new_elts = screen->buffer_create(screen, 32,
                                      PIPE_BUFFER_USAGE_INDEX |
index 60ad763cf489dda77b56c8e8410bf4755b77a66e..609b910e12d2cc9c53123faa2826e93053b1aaef 100644 (file)
@@ -602,9 +602,6 @@ static void* r300_create_rs_state(struct pipe_context* pipe,
     rs->line_control = pack_float_16_6x(state->line_width) |
         R300_GA_LINE_CNTL_END_TYPE_COMP;
 
-    /* XXX I think there is something wrong with the polygon mode,
-     * XXX re-test when r300g is in a better shape */
-
     /* Enable polygon mode */
     if (state->fill_cw != PIPE_POLYGON_MODE_FILL ||
         state->fill_ccw != PIPE_POLYGON_MODE_FILL) {