i965: Allow C++ type safety in the use of enum brw_urb_write_flags.
[mesa.git] / src / mesa / drivers / dri / i965 / brw_clip.h
index 1c6825510a2995e13b2d0c6faa370b4f24755cdc..41f5c75d1aa0045d24b78a59719125ae9629cfe3 100644 (file)
 #include "brw_context.h"
 #include "brw_eu.h"
 
-#define MAX_VERTS (3+6+6)      
+/* Initial 3 verts, plus at most 6 additional verts from intersections
+ * with fixed planes, plus at most 8 additional verts from intersections
+ * with user clip planes
+ */
+#define MAX_VERTS (3+6+8)
 
 /* Note that if unfilled primitives are being emitted, we have to fix
  * up polygon offset and flatshading at this point:
  */
 struct brw_clip_prog_key {
    GLbitfield64 attrs;
+   struct interpolation_mode_map interpolation_mode;
    GLuint primitive:4;
-   GLuint nr_userclip:3;
-   GLuint do_flat_shading:1;
+   GLuint nr_userclip:4;
    GLuint pv_first:1;
    GLuint do_unfilled:1;
    GLuint fill_cw:2;           /* includes cull information */
@@ -55,7 +59,6 @@ struct brw_clip_prog_key {
    GLuint copy_bfc_cw:1;
    GLuint copy_bfc_ccw:1;
    GLuint clip_mode:3;
-   GLuint pad0:11;
 
    GLfloat offset_factor;
    GLfloat offset_units;
@@ -101,27 +104,42 @@ struct brw_clip_compile {
       struct brw_reg plane_equation;
        
       struct brw_reg ff_sync;
+
+      /* Bitmask indicating which coordinate attribute should be used for
+       * comparison to each clipping plane. A 0 indicates that VARYING_SLOT_POS
+       * should be used, because it's one of the fixed +/- x/y/z planes that
+       * constitute the bounds of the view volume. A 1 indicates that
+       * VARYING_SLOT_CLIP_VERTEX should be used (if available) since it's a user-
+       * defined clipping plane.
+       */
+      struct brw_reg vertex_src_mask;
+
+      /* Offset into the vertex of the current plane's clipdistance value */
+      struct brw_reg clipdistance_offset;
    } reg;
 
-   /* 3 different ways of expressing vertex size:
-    */
-   GLuint nr_attrs;
+   /* Number of registers storing VUE data */
    GLuint nr_regs;
-   GLuint nr_bytes;
 
    GLuint first_tmp;
    GLuint last_tmp;
 
-   GLboolean need_direction;
+   bool need_direction;
 
-   GLuint last_mrf;
+   struct brw_vue_map vue_map;
 
-   GLuint header_position_offset;
-   GLuint offset[VERT_ATTRIB_MAX];
-   GLboolean need_ff_sync;
+   bool has_flat_shading;
+   bool has_noperspective_shading;
 };
 
-#define ATTR_SIZE  (4*4)
+/**
+ * True if the given varying is one of the outputs of the vertex shader.
+ */
+static inline bool brw_clip_have_varying(struct brw_clip_compile *c,
+                                         GLuint varying)
+{
+   return (c->key.attrs & BITFIELD64_BIT(varying)) ? 1 : 0;
+}
 
 /* Points are only culled, so no need for a clip routine, however it
  * works out easier to have a dummy one.
@@ -149,14 +167,13 @@ void brw_clip_interp_vertex( struct brw_clip_compile *c,
                             struct brw_indirect v0_ptr, /* from */
                             struct brw_indirect v1_ptr, /* to */
                             struct brw_reg t0,
-                            GLboolean force_edgeflag );
+                            bool force_edgeflag );
 
 void brw_clip_init_planes( struct brw_clip_compile *c );
 
 void brw_clip_emit_vue(struct brw_clip_compile *c, 
                       struct brw_indirect vert,
-                      GLboolean allocate,
-                      GLboolean eot,
+                       enum brw_urb_write_flags flags,
                       GLuint header);
 
 void brw_clip_kill_thread(struct brw_clip_compile *c);
@@ -164,8 +181,8 @@ void brw_clip_kill_thread(struct brw_clip_compile *c);
 struct brw_reg brw_clip_plane_stride( struct brw_clip_compile *c );
 struct brw_reg brw_clip_plane0_address( struct brw_clip_compile *c );
 
-void brw_clip_copy_colors( struct brw_clip_compile *c,
-                          GLuint to, GLuint from );
+void brw_clip_copy_flatshaded_attributes( struct brw_clip_compile *c,
+                                          GLuint to, GLuint from );
 
 void brw_clip_init_clipmask( struct brw_clip_compile *c );