Implement primitive topology in OpenGL, Metal, and D3D12 backends
diff --git a/src/backend/opengl/CommandBufferGL.cpp b/src/backend/opengl/CommandBufferGL.cpp
index 48be807..9241b73 100644
--- a/src/backend/opengl/CommandBufferGL.cpp
+++ b/src/backend/opengl/CommandBufferGL.cpp
@@ -236,11 +236,11 @@
                     {
                         DrawArraysCmd* draw = commands.NextCommand<DrawArraysCmd>();
                         if (draw->firstInstance > 0) {
-                            glDrawArraysInstancedBaseInstance(GL_TRIANGLES,
+                            glDrawArraysInstancedBaseInstance(lastRenderPipeline->GetGLPrimitiveTopology(),
                                 draw->firstVertex, draw->vertexCount, draw->instanceCount, draw->firstInstance);
                         } else {
                             // This branch is only needed on OpenGL < 4.2
-                            glDrawArraysInstanced(GL_TRIANGLES,
+                            glDrawArraysInstanced(lastRenderPipeline->GetGLPrimitiveTopology(),
                                 draw->firstVertex, draw->vertexCount, draw->instanceCount);
                         }
                     }
@@ -253,13 +253,13 @@
                         GLenum formatType = IndexFormatType(indexBufferFormat);
 
                         if (draw->firstInstance > 0) {
-                            glDrawElementsInstancedBaseInstance(GL_TRIANGLES,
+                            glDrawElementsInstancedBaseInstance(lastRenderPipeline->GetGLPrimitiveTopology(),
                                 draw->indexCount, formatType,
                                 reinterpret_cast<void*>(draw->firstIndex * formatSize + indexBufferOffset),
                                 draw->instanceCount, draw->firstInstance);
                         } else {
                             // This branch is only needed on OpenGL < 4.2
-                            glDrawElementsInstanced(GL_TRIANGLES,
+                            glDrawElementsInstanced(lastRenderPipeline->GetGLPrimitiveTopology(),
                                 draw->indexCount, formatType,
                                 reinterpret_cast<void*>(draw->firstIndex * formatSize + indexBufferOffset),
                                 draw->instanceCount);
diff --git a/src/backend/opengl/RenderPipelineGL.cpp b/src/backend/opengl/RenderPipelineGL.cpp
index 1492b4f..8992a84 100644
--- a/src/backend/opengl/RenderPipelineGL.cpp
+++ b/src/backend/opengl/RenderPipelineGL.cpp
@@ -21,8 +21,32 @@
 namespace backend {
 namespace opengl {
 
+    namespace {
+        GLenum GLPrimitiveTopology(nxt::PrimitiveTopology primitiveTopology) {
+            switch (primitiveTopology) {
+                case nxt::PrimitiveTopology::Point:
+                    return GL_POINTS;
+                case nxt::PrimitiveTopology::Line:
+                    return GL_LINES;
+                case nxt::PrimitiveTopology::LineStrip:
+                    return GL_LINE_STRIP;
+                case nxt::PrimitiveTopology::Triangle:
+                    return GL_TRIANGLES;
+                case nxt::PrimitiveTopology::TriangleStrip:
+                    return GL_TRIANGLE_STRIP;
+                default:
+                    UNREACHABLE();
+            }
+        }
+    }
+
     RenderPipeline::RenderPipeline(RenderPipelineBuilder* builder)
-        : RenderPipelineBase(builder), PipelineGL(this, builder) {
+        : RenderPipelineBase(builder), PipelineGL(this, builder),
+          glPrimitiveTopology(GLPrimitiveTopology(GetPrimitiveTopology())) {
+    }
+
+    GLenum RenderPipeline::GetGLPrimitiveTopology() const {
+        return glPrimitiveTopology;
     }
 
     void RenderPipeline::ApplyNow(PersistentPipelineState &persistentPipelineState) {
diff --git a/src/backend/opengl/RenderPipelineGL.h b/src/backend/opengl/RenderPipelineGL.h
index 3c5edde..e16ce25 100644
--- a/src/backend/opengl/RenderPipelineGL.h
+++ b/src/backend/opengl/RenderPipelineGL.h
@@ -32,7 +32,12 @@
         public:
             RenderPipeline(RenderPipelineBuilder* builder);
 
+            GLenum GetGLPrimitiveTopology() const;
+
             void ApplyNow(PersistentPipelineState &persistentPipelineState);
+
+        private:
+            GLenum glPrimitiveTopology;
     };
 
 }