mesa: fix fallthrough in glformats
[mesa.git] / src / mesa / state_tracker / st_atom_clip.c
index 23d709b814c7cbaac57aca81212cb9a5ac122de5..0db3a5d543199af798c703825d652778e3365576 100644 (file)
@@ -1,6 +1,6 @@
 /**************************************************************************
  * 
- * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * Copyright 2007 VMware, Inc.
  * All Rights Reserved.
  * 
  * Permission is hereby granted, free of charge, to any person obtaining a
@@ -18,7 +18,7 @@
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
  /*
   * Authors:
-  *   Keith Whitwell <keith@tungstengraphics.com>
+  *   Keith Whitwell <keithw@vmware.com>
   */
  
 
 #include "st_context.h"
 #include "pipe/p_context.h"
 #include "st_atom.h"
+#include "st_program.h"
+#include "util/u_debug.h"
+#include "cso_cache/cso_context.h"
 
 
 /* Second state atom for user clip planes:
  */
-static void update_clip( struct st_context *st )
+void st_update_clip( struct st_context *st )
 {
    struct pipe_clip_state clip;
-   GLuint i;
+   const struct gl_context *ctx = st->ctx;
+   bool use_eye = FALSE;
 
-   memset(&clip, 0, sizeof(clip));
+   STATIC_ASSERT(sizeof(clip.ucp) <= sizeof(ctx->Transform._ClipUserPlane));
 
-   for (i = 0; i < PIPE_MAX_CLIP_PLANES; i++) {
-      if (st->ctx->Transform.ClipPlanesEnabled & (1 << i)) {
-        memcpy(clip.ucp[clip.nr], 
-               st->ctx->Transform._ClipUserPlane[i], 
-               sizeof(clip.ucp[0]));
-        clip.nr++;
-      }
-   }
-      
-   if (memcmp(&clip, &st->state.clip, sizeof(clip)) != 0) {
+   /* if we have a vertex shader that writes clip vertex we need to pass
+      the pre-projection transformed coordinates into the driver. */
+   if (ctx->_Shader->CurrentProgram[MESA_SHADER_VERTEX])
+      use_eye = TRUE;
+
+   /* _ClipUserPlane = _NEW_TRANSFORM | _NEW_PROJECTION
+    * EyeUserPlane = _NEW_TRANSFORM
+    */
+   memcpy(clip.ucp,
+          use_eye ? ctx->Transform.EyeUserPlane
+                  : ctx->Transform._ClipUserPlane, sizeof(clip.ucp));
+
+   if (memcmp(&st->state.clip, &clip, sizeof(clip)) != 0) {
       st->state.clip = clip;
       st->pipe->set_clip_state(st->pipe, &clip);
    }
 }
-
-
-const struct st_tracked_state st_update_clip = {
-   "st_update_clip",                                   /* name */
-   {                                                   /* dirty */
-      (_NEW_TRANSFORM),                                        /* mesa */
-      0,                                               /* st */
-   },
-   update_clip                                         /* update */
-};