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=3ac825f56566a32f958f9288d74edc116e5bcf6e;hpb=938d9d596324e411fde5312f2bb65b444c502c37;p=mesa.git diff --git a/src/gallium/auxiliary/draw/draw_pipe_twoside.c b/src/gallium/auxiliary/draw/draw_pipe_twoside.c index 3ac825f5656..b1a70a02e47 100644 --- a/src/gallium/auxiliary/draw/draw_pipe_twoside.c +++ b/src/gallium/auxiliary/draw/draw_pipe_twoside.c @@ -28,7 +28,8 @@ /* Authors: Keith Whitwell */ -#include "pipe/p_util.h" +#include "util/u_math.h" +#include "util/u_memory.h" #include "pipe/p_defines.h" #include "pipe/p_shader_tokens.h" #include "draw_vs.h" @@ -37,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; }; @@ -47,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). */ @@ -59,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]); } @@ -108,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++) { @@ -129,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 ); @@ -176,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; @@ -188,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: