projects
/
mesa.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
draw: check for an integer overflow when computing stride
[mesa.git]
/
src
/
gallium
/
auxiliary
/
draw
/
draw_pipe_twoside.c
diff --git
a/src/gallium/auxiliary/draw/draw_pipe_twoside.c
b/src/gallium/auxiliary/draw/draw_pipe_twoside.c
index c329d9233908e6f6c39fbfff26249f653dc73c69..b1a70a02e479d417e9116fce6c531a1b5eec6eee 100644
(file)
--- 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 */
struct twoside_stage {
struct draw_stage stage;
float sign; /**< +1 or -1 */
-
u
int attrib_front0, attrib_back0;
-
u
int 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;
}
return (struct twoside_stage *)stage;
}
-
-
-
/**
* Copy back color(s) to front color(s).
*/
/**
* 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 );
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]);
}
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]);
}
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;
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++) {
/* 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
*/
/*
* 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 );
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 (twoside == NULL)
goto fail;
- if (!draw_alloc_temp_verts( &twoside->stage, 3 ))
- goto fail;
-
twoside->stage.draw = draw;
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;
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;
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:
return &twoside->stage;
fail: