diff options
| author | Michal Krol <michal@vmware.com> | 2010-02-24 15:16:54 +0100 | 
|---|---|---|
| committer | Michal Krol <michal@vmware.com> | 2010-02-24 15:16:54 +0100 | 
| commit | 227ae7b968c1351921babdbf6f052239766ffce4 (patch) | |
| tree | 7aab3f1c434f68a8ed8d25daa96bcc13acdfc39f | |
| parent | 63cb6f59eac91ba34cf80ff3736568e40b094fe1 (diff) | |
cso: Track clip state with cso context.
| -rw-r--r-- | src/gallium/auxiliary/cso_cache/cso_context.c | 54 | ||||
| -rw-r--r-- | src/gallium/auxiliary/cso_cache/cso_context.h | 13 | 
2 files changed, 67 insertions, 0 deletions
| diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c index b5241fa64c..a7335c340c 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.c +++ b/src/gallium/auxiliary/cso_cache/cso_context.c @@ -90,6 +90,9 @@ struct cso_context {     void *fragment_shader, *fragment_shader_saved, *geometry_shader;     void *vertex_shader, *vertex_shader_saved, *geometry_shader_saved; +   struct pipe_clip_state clip; +   struct pipe_clip_state clip_saved; +     struct pipe_framebuffer_state fb, fb_saved;     struct pipe_viewport_state vp, vp_saved;     struct pipe_blend_color blend_color; @@ -1126,3 +1129,54 @@ void cso_restore_geometry_shader(struct cso_context *ctx)     }     ctx->geometry_shader_saved = NULL;  } + + +/* clip state */ + +static INLINE void +clip_state_cpy(struct pipe_clip_state *dst, +               const struct pipe_clip_state *src) +{ +   dst->nr = src->nr; +   if (src->nr) { +      memcpy(dst->ucp, src->ucp, src->nr * sizeof(src->ucp[0])); +   } +} + +static INLINE int +clip_state_cmp(const struct pipe_clip_state *a, +               const struct pipe_clip_state *b) +{ +   if (a->nr != b->nr) { +      return 1; +   } +   if (a->nr) { +      return memcmp(a->ucp, b->ucp, a->nr * sizeof(a->ucp[0])); +   } +   return 0; +} + +void +cso_set_clip(struct cso_context *ctx, +             const struct pipe_clip_state *clip) +{ +   if (clip_state_cmp(&ctx->clip, clip)) { +      clip_state_cpy(&ctx->clip, clip); +      ctx->pipe->set_clip_state(ctx->pipe, clip); +   } +} + +void +cso_save_clip(struct cso_context *ctx) +{ +   clip_state_cpy(&ctx->clip_saved, &ctx->clip); +} + +void +cso_restore_clip(struct cso_context *ctx) +{ +   if (clip_state_cmp(&ctx->clip, &ctx->clip_saved)) { +      clip_state_cpy(&ctx->clip, &ctx->clip_saved); +      ctx->pipe->set_clip_state(ctx->pipe, &ctx->clip_saved); +   } +} diff --git a/src/gallium/auxiliary/cso_cache/cso_context.h b/src/gallium/auxiliary/cso_cache/cso_context.h index 707b3c2cee..251a9a644f 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.h +++ b/src/gallium/auxiliary/cso_cache/cso_context.h @@ -180,6 +180,19 @@ void cso_save_stencil_ref(struct cso_context *cso);  void cso_restore_stencil_ref(struct cso_context *cso); +/* clip state */ + +void +cso_set_clip(struct cso_context *cso, +             const struct pipe_clip_state *clip); + +void +cso_save_clip(struct cso_context *cso); + +void +cso_restore_clip(struct cso_context *cso); + +  #ifdef	__cplusplus  }  #endif | 
