[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