mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-03 13:40:11 +01:00
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 <zackr@vmware.com> Reviewed-by: José Fonseca<jfonseca@vmware.com> Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
parent
26fe24c479
commit
d7d676252d
5 changed files with 24 additions and 16 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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 &&
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue