vbo: handle GS and tess primitive types when splitting Begin/End
authorMarek Olšák <marek.olsak@amd.com>
Wed, 19 Feb 2020 00:38:33 +0000 (19:38 -0500)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 5 Mar 2020 00:54:42 +0000 (19:54 -0500)
Reviewed-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4052>

src/mesa/vbo/vbo_exec.c

index afda3635fc93c2116078ea6de1a6e3a0c83a43cd..8fae73adfa221fd29aa7ccd99b961b71387610e5 100644 (file)
@@ -256,11 +256,36 @@ vbo_copy_vertices(struct gl_context *ctx,
       copy = count % 3;
       break;
    case GL_QUADS:
+   case GL_LINES_ADJACENCY:
       copy = count % 4;
       break;
+   case GL_TRIANGLES_ADJACENCY:
+      copy = count % 6;
+      break;
    case GL_LINE_STRIP:
       copy = MIN2(1, count);
       break;
+   case GL_LINE_STRIP_ADJACENCY:
+      /* We need to copy 3 vertices, because:
+       *    Last strip:  ---o---o---x     (last line)
+       *    Next strip:     x---o---o---  (next line)
+       */
+      copy = MIN2(3, count);
+      break;
+   case GL_PATCHES:
+      if (in_dlist) {
+         /* We don't know the value of GL_PATCH_VERTICES when compiling
+          * a display list.
+          *
+          * Fail an assertion in debug builds and use the value of 3
+          * in release builds, which is more likely than any other value.
+          */
+         assert(!"patch_vertices is unknown");
+         copy = count % 3;
+      } else {
+         copy = count % ctx->TessCtrlProgram.patch_vertices;
+      }
+      break;
    case GL_LINE_LOOP:
       if (!in_dlist && last_prim->begin == 0) {
          /* We're dealing with the second or later section of a split/wrapped
@@ -299,6 +324,8 @@ vbo_copy_vertices(struct gl_context *ctx,
       break;
    case PRIM_OUTSIDE_BEGIN_END:
       return 0;
+   case GL_TRIANGLE_STRIP_ADJACENCY:
+      /* TODO: Splitting tri strips with adjacency is too complicated. */
    default:
       unreachable("Unexpected primitive type");
       return 0;