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;
};
}