radeonsi: fix user fence space when MCBP is enabled
[mesa.git] / src / gallium / auxiliary / draw / draw_gs_tmp.h
index 7a8683cf7c2a39b988af1b67d7ee1c30ca173b33..5a5b9e22ab380a75614fb788a95d1bf1f099a42f 100644 (file)
-
-static void FUNC( struct draw_geometry_shader *shader,
-                  const struct draw_prim_info *input_prims,
-                  const struct draw_vertex_info *input_verts,
-                  struct draw_prim_info *output_prims,
-                  struct draw_vertex_info *output_verts)
-{
-   struct draw_context *draw = shader->draw;
-
-   boolean flatfirst = (draw->rasterizer->flatshade &&
-                        draw->rasterizer->flatshade_first);
-   unsigned i, j;
-   unsigned count = input_prims->count;
-   LOCAL_VARS
-
-   if (0) debug_printf("%s %d\n", __FUNCTION__, count);
-
-   debug_assert(input_prims->primitive_count == 1);
-
-   switch (input_prims->prim) {
-   case PIPE_PRIM_POINTS:
-      for (i = 0; i < count; i++) {
-        POINT( shader, i + 0 );
-      }
-      break;
-
-   case PIPE_PRIM_LINES:
-      for (i = 0; i+1 < count; i += 2) {
-         LINE( shader , i + 0 , i + 1 );
-      }
-      break;
-
-   case PIPE_PRIM_LINE_LOOP:
-      if (count >= 2) {
-
-         for (i = 1; i < count; i++) {
-            LINE( shader, i - 1, i );
-         }
-
-        LINE( shader, i - 1, 0 );
-      }
-      break;
-
-   case PIPE_PRIM_LINE_STRIP:
-      for (i = 1; i < count; i++) {
-         LINE( shader, i - 1, i );
-      }
-      break;
-
-   case PIPE_PRIM_TRIANGLES:
-      for (i = 0; i+2 < count; i += 3) {
-         TRIANGLE( shader, i + 0, i + 1, i + 2 );
-      }
-      break;
-
-   case PIPE_PRIM_TRIANGLE_STRIP:
-      if (flatfirst) {
-         for (i = 0; i+2 < count; i++) {
-            TRIANGLE( shader,
-                      i + 0,
-                      i + 1 + (i&1),
-                      i + 2 - (i&1) );
-         }
-      }
-      else {
-         for (i = 0; i+2 < count; i++) {
-            TRIANGLE( shader,
-                      i + 0 + (i&1),
-                      i + 1 - (i&1),
-                      i + 2 );
-         }
-      }
-      break;
-
-   case PIPE_PRIM_TRIANGLE_FAN:
-      if (count >= 3) {
-         if (flatfirst) {
-            for (i = 0; i+2 < count; i++) {
-               TRIANGLE( shader,
-                         i + 1,
-                         i + 2,
-                         0 );
-            }
-         }
-         else {
-            for (i = 0; i+2 < count; i++) {
-               TRIANGLE( shader,
-                         0,
-                         i + 1,
-                         i + 2 );
-            }
-         }
-      }
-      break;
-
-   case PIPE_PRIM_POLYGON:
-      {
-        for (i = 0; i+2 < count; i++) {
-
-            if (flatfirst) {
-               TRIANGLE( shader, 0, i + 1, i + 2 );
-            }
-            else {
-               TRIANGLE( shader, i + 1, i + 2, 0 );
-            }
-        }
-      }
-      break;
-
-   case PIPE_PRIM_LINES_ADJACENCY:
-      for (i = 0; i+3 < count; i += 4) {
-         LINE_ADJ( shader , i + 0 , i + 1, i + 2, i + 3 );
-      }
-      break;
-   case PIPE_PRIM_LINE_STRIP_ADJACENCY:
-      for (i = 1; i + 2 < count; i++) {
-         LINE_ADJ( shader, i - 1, i, i + 1, i + 2 );
-      }
-      break;
-
-   case PIPE_PRIM_TRIANGLES_ADJACENCY:
-      for (i = 0; i+5 < count; i += 5) {
-         TRI_ADJ( shader, i + 0, i + 1, i + 2,
-                  i + 3, i + 4, i + 5);
-      }
-      break;
-   case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
-      for (i = 0, j = 0; i+5 < count; i += 2, ++j) {
-         TRI_ADJ( shader,
-                  i + 0,
-                  i + 1 + 2*(j&1),
-                  i + 2 + 2*(j&1),
-                  i + 3 - 2*(j&1),
-                  i + 4 - 2*(j&1),
-                  i + 5);
-      }
-      break;
-
-   default:
-      debug_assert(!"Unsupported primitive in geometry shader");
-      break;
-   }
-}
-
-
-#undef TRIANGLE
-#undef TRI_ADJ
-#undef POINT
-#undef LINE
-#undef LINE_ADJ
-#undef FUNC
-#undef LOCAL_VARS
+#define FUNC_VARS struct draw_geometry_shader *gs,             \
+                  const struct draw_prim_info *input_prims,    \
+                  const struct draw_vertex_info *input_verts,  \
+                  struct draw_prim_info *output_prims,         \
+                  struct draw_vertex_info *output_verts
+
+#define FUNC_ENTER                                                \
+   /* declare more local vars */                                  \
+   const unsigned prim = input_prims->prim;                       \
+   const unsigned prim_flags = input_prims->flags;                \
+   const unsigned count = input_prims->count;                     \
+   const boolean quads_flatshade_last = FALSE;                    \
+   const boolean last_vertex_last = !gs->draw->rasterizer->flatshade_first;  \
+   do {                                                           \
+      switch (prim) {                                             \
+      case PIPE_PRIM_QUADS:                                       \
+      case PIPE_PRIM_QUAD_STRIP:                                  \
+      case PIPE_PRIM_POLYGON:                                     \
+         debug_assert(!"unexpected primitive type in GS");        \
+         return;                                                  \
+      default:                                                    \
+         break;                                                   \
+      }                                                           \
+   } while (0)
+
+#define POINT(i0)                             gs_point(gs,i0)
+#define LINE(flags,i0,i1)                     gs_line(gs,i0,i1)
+#define TRIANGLE(flags,i0,i1,i2)              gs_tri(gs,i0,i1,i2)
+#define LINE_ADJ(flags,i0,i1,i2,i3)           gs_line_adj(gs,i0,i1,i2,i3)
+#define TRIANGLE_ADJ(flags,i0,i1,i2,i3,i4,i5) gs_tri_adj(gs,i0,i1,i2,i3,i4,i5)
+
+#include "draw_decompose_tmp.h"