diff options
Diffstat (limited to 'src/mesa/math')
| -rw-r--r-- | src/mesa/math/m_clip_tmp.h | 44 | ||||
| -rw-r--r-- | src/mesa/math/m_debug_clip.c | 31 | ||||
| -rw-r--r-- | src/mesa/math/m_xform.h | 6 | 
3 files changed, 54 insertions, 27 deletions
| diff --git a/src/mesa/math/m_clip_tmp.h b/src/mesa/math/m_clip_tmp.h index f3a589be05..2e30964057 100644 --- a/src/mesa/math/m_clip_tmp.h +++ b/src/mesa/math/m_clip_tmp.h @@ -44,7 +44,8 @@ static GLvector4f * _XFORMAPI TAG(cliptest_points4)( GLvector4f *clip_vec,                                                       GLvector4f *proj_vec,                                                       GLubyte clipMask[],                                                       GLubyte *orMask, -                                                     GLubyte *andMask ) +                                                     GLubyte *andMask, +						     GLboolean viewport_z_clip )  {     const GLuint stride = clip_vec->stride;     const GLfloat *from = (GLfloat *)clip_vec->start; @@ -66,16 +67,20 @@ static GLvector4f * _XFORMAPI TAG(cliptest_points4)( GLvector4f *clip_vec,        mask |= (((cw < -cx) << CLIP_LEFT_SHIFT));        mask |= (((cw < cy) << CLIP_TOP_SHIFT));        mask |= (((cw < -cy) << CLIP_BOTTOM_SHIFT)); -      mask |= (((cw < cz) << CLIP_FAR_SHIFT)); -      mask |= (((cw < -cz) << CLIP_NEAR_SHIFT)); +      if (viewport_z_clip) { +	 mask |= (((cw < cz) << CLIP_FAR_SHIFT)); +	 mask |= (((cw < -cz) << CLIP_NEAR_SHIFT)); +      }  #else /* !defined(macintosh)) */        GLubyte mask = 0;        if (-cx + cw < 0) mask |= CLIP_RIGHT_BIT;        if ( cx + cw < 0) mask |= CLIP_LEFT_BIT;        if (-cy + cw < 0) mask |= CLIP_TOP_BIT;        if ( cy + cw < 0) mask |= CLIP_BOTTOM_BIT; -      if (-cz + cw < 0) mask |= CLIP_FAR_BIT; -      if ( cz + cw < 0) mask |= CLIP_NEAR_BIT; +      if (viewport_z_clip) { +	 if (-cz + cw < 0) mask |= CLIP_FAR_BIT; +	 if ( cz + cw < 0) mask |= CLIP_NEAR_BIT; +      }  #endif /* defined(macintosh) */        clipMask[i] = mask; @@ -119,7 +124,8 @@ static GLvector4f * _XFORMAPI TAG(cliptest_np_points4)( GLvector4f *clip_vec,  							GLvector4f *proj_vec,  							GLubyte clipMask[],  							GLubyte *orMask, -							GLubyte *andMask ) +							GLubyte *andMask, +							GLboolean viewport_z_clip )  {     const GLuint stride = clip_vec->stride;     const GLuint count = clip_vec->count; @@ -141,16 +147,20 @@ static GLvector4f * _XFORMAPI TAG(cliptest_np_points4)( GLvector4f *clip_vec,        mask |= (((cw < -cx) << CLIP_LEFT_SHIFT));        mask |= (((cw < cy) << CLIP_TOP_SHIFT));        mask |= (((cw < -cy) << CLIP_BOTTOM_SHIFT)); -      mask |= (((cw < cz) << CLIP_FAR_SHIFT)); -      mask |= (((cw < -cz) << CLIP_NEAR_SHIFT)); +      if (viewport_z_clip) { +	 mask |= (((cw < cz) << CLIP_FAR_SHIFT)); +	 mask |= (((cw < -cz) << CLIP_NEAR_SHIFT)); +      }  #else /* !defined(macintosh)) */        GLubyte mask = 0;        if (-cx + cw < 0) mask |= CLIP_RIGHT_BIT;        if ( cx + cw < 0) mask |= CLIP_LEFT_BIT;        if (-cy + cw < 0) mask |= CLIP_TOP_BIT;        if ( cy + cw < 0) mask |= CLIP_BOTTOM_BIT; -      if (-cz + cw < 0) mask |= CLIP_FAR_BIT; -      if ( cz + cw < 0) mask |= CLIP_NEAR_BIT; +      if (viewport_z_clip) { +	 if (-cz + cw < 0) mask |= CLIP_FAR_BIT; +	 if ( cz + cw < 0) mask |= CLIP_NEAR_BIT; +      }  #endif /* defined(macintosh) */        clipMask[i] = mask; @@ -171,7 +181,8 @@ static GLvector4f * _XFORMAPI TAG(cliptest_points3)( GLvector4f *clip_vec,                                                       GLvector4f *proj_vec,                                                       GLubyte clipMask[],                                                       GLubyte *orMask, -                                                     GLubyte *andMask ) +                                                     GLubyte *andMask, +						     GLboolean viewport_z_clip )  {     const GLuint stride = clip_vec->stride;     const GLuint count = clip_vec->count; @@ -187,8 +198,10 @@ static GLvector4f * _XFORMAPI TAG(cliptest_points3)( GLvector4f *clip_vec,        else if (cx < -1.0)  mask |= CLIP_LEFT_BIT;        if (cy >  1.0)       mask |= CLIP_TOP_BIT;        else if (cy < -1.0)  mask |= CLIP_BOTTOM_BIT; -      if (cz >  1.0)       mask |= CLIP_FAR_BIT; -      else if (cz < -1.0)  mask |= CLIP_NEAR_BIT; +      if (viewport_z_clip) { +	 if (cz >  1.0)       mask |= CLIP_FAR_BIT; +	 else if (cz < -1.0)  mask |= CLIP_NEAR_BIT; +      }        clipMask[i] = mask;        tmpOrMask |= mask;        tmpAndMask &= mask; @@ -204,7 +217,8 @@ static GLvector4f * _XFORMAPI TAG(cliptest_points2)( GLvector4f *clip_vec,                                                       GLvector4f *proj_vec,                                                       GLubyte clipMask[],                                                       GLubyte *orMask, -                                                     GLubyte *andMask ) +                                                     GLubyte *andMask, +						     GLboolean viewport_z_clip )  {     const GLuint stride = clip_vec->stride;     const GLuint count = clip_vec->count; @@ -231,7 +245,7 @@ static GLvector4f * _XFORMAPI TAG(cliptest_points2)( GLvector4f *clip_vec,  } -static void TAG(init_c_cliptest)( void ) +void TAG(init_c_cliptest)( void )  {     _mesa_clip_tab[4] = TAG(cliptest_points4);     _mesa_clip_tab[3] = TAG(cliptest_points3); diff --git a/src/mesa/math/m_debug_clip.c b/src/mesa/math/m_debug_clip.c index 460fed4a75..95ae5a347d 100644 --- a/src/mesa/math/m_debug_clip.c +++ b/src/mesa/math/m_debug_clip.c @@ -67,7 +67,8 @@ static GLvector4f *ref_cliptest_points4( GLvector4f *clip_vec,  					 GLvector4f *proj_vec,  					 GLubyte clipMask[],  					 GLubyte *orMask, -					 GLubyte *andMask ) +					 GLubyte *andMask, +					 GLboolean viewport_z_clip )  {     const GLuint stride = clip_vec->stride;     const GLuint count = clip_vec->count; @@ -87,8 +88,10 @@ static GLvector4f *ref_cliptest_points4( GLvector4f *clip_vec,        if (  cx + cw < 0 ) mask |= CLIP_LEFT_BIT;        if ( -cy + cw < 0 ) mask |= CLIP_TOP_BIT;        if (  cy + cw < 0 ) mask |= CLIP_BOTTOM_BIT; -      if ( -cz + cw < 0 ) mask |= CLIP_FAR_BIT; -      if (  cz + cw < 0 ) mask |= CLIP_NEAR_BIT; +      if (viewport_z_clip) { +	 if ( -cz + cw < 0 ) mask |= CLIP_FAR_BIT; +	 if (  cz + cw < 0 ) mask |= CLIP_NEAR_BIT; +      }        clipMask[i] = mask;        if ( mask ) {  	 c++; @@ -122,7 +125,8 @@ static GLvector4f *ref_cliptest_points3( GLvector4f *clip_vec,  					 GLvector4f *proj_vec,  					 GLubyte clipMask[],  					 GLubyte *orMask, -					 GLubyte *andMask ) +					 GLubyte *andMask, +                                         GLboolean viewport_z_clip )  {     const GLuint stride = clip_vec->stride;     const GLuint count = clip_vec->count; @@ -138,8 +142,10 @@ static GLvector4f *ref_cliptest_points3( GLvector4f *clip_vec,        else if ( cx < -1.0 )	mask |= CLIP_LEFT_BIT;        if ( cy >  1.0 )		mask |= CLIP_TOP_BIT;        else if ( cy < -1.0 )	mask |= CLIP_BOTTOM_BIT; -      if ( cz >  1.0 )		mask |= CLIP_FAR_BIT; -      else if ( cz < -1.0 )	mask |= CLIP_NEAR_BIT; +      if (viewport_z_clip) { +         if ( cz >  1.0 )		mask |= CLIP_FAR_BIT; +         else if ( cz < -1.0 )	mask |= CLIP_NEAR_BIT; +      }        clipMask[i] = mask;        tmpOrMask |= mask;        tmpAndMask &= mask; @@ -154,7 +160,8 @@ static GLvector4f * ref_cliptest_points2( GLvector4f *clip_vec,  					  GLvector4f *proj_vec,  					  GLubyte clipMask[],  					  GLubyte *orMask, -					  GLubyte *andMask ) +					  GLubyte *andMask, +                                          GLboolean viewport_z_clip )  {     const GLuint stride = clip_vec->stride;     const GLuint count = clip_vec->count; @@ -163,6 +170,9 @@ static GLvector4f * ref_cliptest_points2( GLvector4f *clip_vec,     GLubyte tmpOrMask = *orMask;     GLubyte tmpAndMask = *andMask;     GLuint i; + +   (void) viewport_z_clip; +     for ( i = 0 ; i < count ; i++, STRIDE_F(from, stride) ) {        const GLfloat cx = from[0], cy = from[1];        GLubyte mask = 0; @@ -208,6 +218,7 @@ static int test_cliptest_function( clip_func func, int np,  #ifdef  RUN_DEBUG_BENCHMARK     int cycle_i;                /* the counter for the benchmarks we run */  #endif +   GLboolean viewport_z_clip = GL_TRUE;     (void) cycles; @@ -247,15 +258,15 @@ static int test_cliptest_function( clip_func func, int np,     dco = rco = 0;     dca = rca = CLIP_FRUSTUM_BITS; -   ref_cliptest[psize]( source, ref, rm, &rco, &rca ); +   ref_cliptest[psize]( source, ref, rm, &rco, &rca, viewport_z_clip );     if ( mesa_profile ) {        BEGIN_RACE( *cycles ); -      func( source, dest, dm, &dco, &dca ); +      func( source, dest, dm, &dco, &dca, viewport_z_clip );        END_RACE( *cycles );     }     else { -      func( source, dest, dm, &dco, &dca ); +      func( source, dest, dm, &dco, &dca, viewport_z_clip );     }     if ( dco != rco ) { diff --git a/src/mesa/math/m_xform.h b/src/mesa/math/m_xform.h index 7ef76e0b92..33421ad1c0 100644 --- a/src/mesa/math/m_xform.h +++ b/src/mesa/math/m_xform.h @@ -43,7 +43,8 @@  extern void  _math_init_transformation(void); - +extern void +init_c_cliptest(void);  /* KW: Clip functions now do projective divide as well.  The projected   * coordinates are very useful to us because they let us cull @@ -102,7 +103,8 @@ typedef GLvector4f * (_XFORMAPIP clip_func)( GLvector4f *vClip,  					     GLvector4f *vProj,  					     GLubyte clipMask[],  					     GLubyte *orMask, -					     GLubyte *andMask ); +					     GLubyte *andMask, +					     GLboolean viewport_z_clip );  typedef void (*dotprod_func)( GLfloat *out,  			      GLuint out_stride, | 
