summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorZack Rusin <[email protected]>2013-05-25 01:02:46 -0400
committerZack Rusin <[email protected]>2013-05-25 09:49:20 -0400
commitd7d676252d2ae1fd6d3dd76d4e205251ad7c6152 (patch)
treeee2de4e74375ddb379c1da9f440231eb557216a3 /src
parent26fe24c47975f1484c193617a18cd2a9cdb65eb4 (diff)
draw: clamp the viewports to always be between 0 and max
If the viewport index is larger than the PIPE_MAX_VIEWPORTS, then the first (0-th) viewport should be used. Signed-off-by: Zack Rusin <[email protected]> Reviewed-by: José Fonseca<[email protected]> Reviewed-by: Brian Paul <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/auxiliary/draw/draw_cliptest_tmp.h8
-rw-r--r--src/gallium/auxiliary/draw/draw_context.c8
-rw-r--r--src/gallium/auxiliary/draw/draw_pipe_clip.c8
-rw-r--r--src/gallium/auxiliary/draw/draw_private.h11
-rw-r--r--src/gallium/auxiliary/draw/draw_vs_variant.c5
5 files changed, 24 insertions, 16 deletions
diff --git a/src/gallium/auxiliary/draw/draw_cliptest_tmp.h b/src/gallium/auxiliary/draw/draw_cliptest_tmp.h
index 09e1fd71334..d316b777154 100644
--- a/src/gallium/auxiliary/draw/draw_cliptest_tmp.h
+++ b/src/gallium/auxiliary/draw/draw_cliptest_tmp.h
@@ -25,8 +25,6 @@
*
**************************************************************************/
-
-
static boolean TAG(do_cliptest)( struct pt_post_vs *pvs,
struct draw_vertex_info *info )
{
@@ -57,8 +55,10 @@ static boolean TAG(do_cliptest)( struct pt_post_vs *pvs,
draw_current_shader_uses_viewport_index(pvs->draw) ?
*((unsigned*)out->data[viewport_index_output]): 0;
unsigned mask = 0x0;
- const float *scale = pvs->draw->viewports[viewport_index].scale;
- const float *trans = pvs->draw->viewports[viewport_index].translate;
+ const float *scale = pvs->draw->viewports[
+ draw_clamp_viewport_idx(viewport_index)].scale;
+ const float *trans = pvs->draw->viewports[
+ draw_clamp_viewport_idx(viewport_index)].translate;
initialize_vertex_header(out);
diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c
index 63ccf386f29..58ce270cdd0 100644
--- a/src/gallium/auxiliary/draw/draw_context.c
+++ b/src/gallium/auxiliary/draw/draw_context.c
@@ -319,14 +319,12 @@ void draw_set_viewport_states( struct draw_context *draw,
const struct pipe_viewport_state *viewport = vps;
draw_do_flush(draw, DRAW_FLUSH_PARAMETER_CHANGE);
- if (start_slot > PIPE_MAX_VIEWPORTS)
- return;
-
- if ((start_slot + num_viewports) > PIPE_MAX_VIEWPORTS)
- num_viewports = PIPE_MAX_VIEWPORTS - start_slot;
+ debug_assert(start_slot < PIPE_MAX_VIEWPORTS);
+ debug_assert((start_slot + num_viewports) <= PIPE_MAX_VIEWPORTS);
memcpy(draw->viewports + start_slot, vps,
sizeof(struct pipe_viewport_state) * num_viewports);
+
draw->identity_viewport = (num_viewports == 1) &&
(viewport->scale[0] == 1.0f &&
viewport->scale[1] == 1.0f &&
diff --git a/src/gallium/auxiliary/draw/draw_pipe_clip.c b/src/gallium/auxiliary/draw/draw_pipe_clip.c
index b01e51994cb..aacda15f466 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_clip.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_clip.c
@@ -112,8 +112,6 @@ static void copy_flat( struct draw_stage *stage,
}
}
-
-
/* Interpolate between two vertices to produce a third.
*/
static void interp( const struct clip_stage *clip,
@@ -152,9 +150,11 @@ static void interp( const struct clip_stage *clip,
*((unsigned*)in->data[viewport_index_output]) : 0;
const float *pos = dst->pre_clip_pos;
const float *scale =
- clip->stage.draw->viewports[viewport_index].scale;
+ clip->stage.draw->viewports[
+ draw_clamp_viewport_idx(viewport_index)].scale;
const float *trans =
- clip->stage.draw->viewports[viewport_index].translate;
+ clip->stage.draw->viewports[
+ draw_clamp_viewport_idx(viewport_index)].translate;
const float oow = 1.0f / pos[3];
dst->data[pos_attr][0] = pos[0] * oow * scale[0] + trans[0];
diff --git a/src/gallium/auxiliary/draw/draw_private.h b/src/gallium/auxiliary/draw/draw_private.h
index e5f192b7576..f30f9af388b 100644
--- a/src/gallium/auxiliary/draw/draw_private.h
+++ b/src/gallium/auxiliary/draw/draw_private.h
@@ -469,4 +469,15 @@ draw_get_rasterizer_no_cull( struct draw_context *draw,
#define DRAW_GET_IDX(_elts, _i) \
(((_i) >= draw->pt.user.eltMax) ? 0 : (_elts)[_i])
+/**
+ * Return index of the given viewport clamping it
+ * to be between 0 <= and < PIPE_MAX_VIEWPORTS
+ */
+static INLINE unsigned
+draw_clamp_viewport_idx(int idx)
+{
+ return ((PIPE_MAX_VIEWPORTS > idx || idx < 0) ? idx : 0);
+}
+
+
#endif /* DRAW_PRIVATE_H */
diff --git a/src/gallium/auxiliary/draw/draw_vs_variant.c b/src/gallium/auxiliary/draw/draw_vs_variant.c
index 0387eafbbce..152c1303183 100644
--- a/src/gallium/auxiliary/draw/draw_vs_variant.c
+++ b/src/gallium/auxiliary/draw/draw_vs_variant.c
@@ -91,9 +91,8 @@ find_viewport(struct draw_context *draw,
int viewport_index =
draw_current_shader_uses_viewport_index(draw) ?
data[viewport_index_output * 4] : 0;
-
- debug_assert(viewport_index < PIPE_MAX_VIEWPORTS);
- viewport_index = MIN2(viewport_index, PIPE_MAX_VIEWPORTS - 1);
+
+ viewport_index = draw_clamp_viewport_idx(viewport_index);
return &draw->viewports[viewport_index];
}