X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fauxiliary%2Fdraw%2Fdraw_pipe_twoside.c;h=b1a70a02e479d417e9116fce6c531a1b5eec6eee;hb=2f13f28120fdfe2f5a64e87b4ec19db94bf63713;hp=c329d9233908e6f6c39fbfff26249f653dc73c69;hpb=7468765b18be202a64d58b83f6267b6973ea4897;p=mesa.git diff --git a/src/gallium/auxiliary/draw/draw_pipe_twoside.c b/src/gallium/auxiliary/draw/draw_pipe_twoside.c index c329d923390..b1a70a02e47 100644 --- a/src/gallium/auxiliary/draw/draw_pipe_twoside.c +++ b/src/gallium/auxiliary/draw/draw_pipe_twoside.c @@ -38,8 +38,8 @@ struct twoside_stage { struct draw_stage stage; float sign; /**< +1 or -1 */ - uint attrib_front0, attrib_back0; - uint attrib_front1, attrib_back1; + int attrib_front0, attrib_back0; + int attrib_front1, attrib_back1; }; @@ -48,9 +48,6 @@ static INLINE struct twoside_stage *twoside_stage( struct draw_stage *stage ) return (struct twoside_stage *)stage; } - - - /** * Copy back color(s) to front color(s). */ @@ -60,12 +57,12 @@ copy_bfc( struct twoside_stage *twoside, unsigned idx ) { struct vertex_header *tmp = dup_vert( &twoside->stage, v, idx ); - - if (twoside->attrib_back0) { + + if (twoside->attrib_back0 >= 0 && twoside->attrib_front0 >= 0) { COPY_4FV(tmp->data[twoside->attrib_front0], tmp->data[twoside->attrib_back0]); } - if (twoside->attrib_back1) { + if (twoside->attrib_back1 >= 0 && twoside->attrib_front1 >= 0) { COPY_4FV(tmp->data[twoside->attrib_front1], tmp->data[twoside->attrib_back1]); } @@ -109,10 +106,10 @@ static void twoside_first_tri( struct draw_stage *stage, const struct draw_vertex_shader *vs = stage->draw->vs.vertex_shader; uint i; - twoside->attrib_front0 = 0; - twoside->attrib_front1 = 0; - twoside->attrib_back0 = 0; - twoside->attrib_back1 = 0; + twoside->attrib_front0 = -1; + twoside->attrib_front1 = -1; + twoside->attrib_back0 = -1; + twoside->attrib_back1 = -1; /* Find which vertex shader outputs are front/back colors */ for (i = 0; i < vs->info.num_outputs; i++) { @@ -130,18 +127,12 @@ static void twoside_first_tri( struct draw_stage *stage, } } - if (!twoside->attrib_back0) - twoside->attrib_front0 = 0; - - if (!twoside->attrib_back1) - twoside->attrib_front1 = 0; - /* * We'll multiply the primitive's determinant by this sign to determine * if the triangle is back-facing (negative). * sign = -1 for CCW, +1 for CW */ - twoside->sign = (stage->draw->rasterizer->front_winding == PIPE_WINDING_CCW) ? -1.0f : 1.0f; + twoside->sign = stage->draw->rasterizer->front_ccw ? -1.0f : 1.0f; stage->tri = twoside_tri; stage->tri( stage, header ); @@ -177,10 +168,8 @@ struct draw_stage *draw_twoside_stage( struct draw_context *draw ) if (twoside == NULL) goto fail; - if (!draw_alloc_temp_verts( &twoside->stage, 3 )) - goto fail; - twoside->stage.draw = draw; + twoside->stage.name = "twoside"; twoside->stage.next = NULL; twoside->stage.point = draw_pipe_passthrough_point; twoside->stage.line = draw_pipe_passthrough_line; @@ -189,6 +178,9 @@ struct draw_stage *draw_twoside_stage( struct draw_context *draw ) twoside->stage.reset_stipple_counter = twoside_reset_stipple_counter; twoside->stage.destroy = twoside_destroy; + if (!draw_alloc_temp_verts( &twoside->stage, 3 )) + goto fail; + return &twoside->stage; fail: