[Mesa-dev] [PATCH 2/3] st/mesa: add support for clip vertex.

Brian Paul brianp at vmware.com
Wed Jan 4 08:37:41 PST 2012


On 01/04/2012 05:13 AM, Dave Airlie wrote:
> From: Dave Airlie<airlied at redhat.com>
>
> We need to pass the pre-projection matrix clip planes into the driver,
> instead of the post for the case we have a vertex shader that writes clip
> vertex.
>
> Signed-off-by: Dave Airlie<airlied at redhat.com>
> ---
>   src/mesa/state_tracker/st_atom_clip.c |   20 ++++++++++++++------
>   src/mesa/state_tracker/st_program.c   |    4 ++++
>   2 files changed, 18 insertions(+), 6 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_atom_clip.c b/src/mesa/state_tracker/st_atom_clip.c
> index 1330db8..f1a8979 100644
> --- a/src/mesa/state_tracker/st_atom_clip.c
> +++ b/src/mesa/state_tracker/st_atom_clip.c
> @@ -34,7 +34,7 @@
>   #include "st_context.h"
>   #include "pipe/p_context.h"
>   #include "st_atom.h"
> -
> +#include "st_program.h"
>   #include "cso_cache/cso_context.h"
>
>
> @@ -45,15 +45,23 @@ static void update_clip( struct st_context *st )
>      struct pipe_clip_state clip;
>      const struct gl_context *ctx = st->ctx;
>      GLuint i;
> +   bool use_eye = FALSE;
>
>      memset(&clip, 0, sizeof(clip));
>
> +   /* if we have a vertex shader that writes clip vertex we need to pass
> +      the pre-projection transformed coordinates into the driver. */
> +   if (st->vp) {
> +      if (st->vp->Base.Base.OutputsWritten&  (1<<  VERT_RESULT_CLIP_VERTEX))
> +         use_eye = TRUE;
> +   }
> +
>      for (i = 0; i<  PIPE_MAX_CLIP_PLANES; i++) {
>         if (ctx->Transform.ClipPlanesEnabled&  (1<<  i)) {
> -	 memcpy(clip.ucp[clip.nr],
> -		ctx->Transform._ClipUserPlane[i],
> -		sizeof(clip.ucp[0]));
> -	 clip.nr++;
> +         memcpy(clip.ucp[clip.nr],
> +                use_eye ? ctx->Transform.EyeUserPlane[i] : ctx->Transform._ClipUserPlane[i],
> +                sizeof(clip.ucp[0]));
> +         clip.nr++;
>         }
>      }
>
> @@ -69,7 +77,7 @@ static void update_clip( struct st_context *st )
>   const struct st_tracked_state st_update_clip = {
>      "st_update_clip",					/* name */
>      {							/* dirty */
> -      (_NEW_TRANSFORM),					/* mesa */
> +      (_NEW_TRANSFORM|_NEW_PROGRAM),					/* mesa */

Whitespace before/after the | is a little more readable.


>         0,						/* st */
>      },
>      update_clip						/* update */
> diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
> index d62bfcd..3d9d45b 100644
> --- a/src/mesa/state_tracker/st_program.c
> +++ b/src/mesa/state_tracker/st_program.c
> @@ -260,6 +260,10 @@ st_prepare_vertex_program(struct gl_context *ctx,
>               stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0;
>               break;
>
> +         case VERT_RESULT_CLIP_VERTEX:
> +            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_CLIPVERTEX;
> +            stvp->output_semantic_index[slot] = 0;
> +            break;
>            case VERT_RESULT_VAR0:
>            default:
>               assert(attr<  VERT_RESULT_MAX);

Would you mind moving this case up so it follows VERT_RESULT_EDGE so 
that the switch cases more closely match the enum order?

-Brian


More information about the mesa-dev mailing list