OpenGL: Fix primitive restart support
primitive restart should only be on for line-strip and triangle-strip
Bug: dawn:2121
Change-Id: I2a30e889892e967ed67f325d07a2bb045a467d03
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/175861
Reviewed-by: Stephen White <senorblanco@google.com>
Commit-Queue: Gregg Tavares <gman@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Stephen White <senorblanco@chromium.org>
diff --git a/src/dawn/native/opengl/CommandBufferGL.cpp b/src/dawn/native/opengl/CommandBufferGL.cpp
index b1443fd..a129dd7 100644
--- a/src/dawn/native/opengl/CommandBufferGL.cpp
+++ b/src/dawn/native/opengl/CommandBufferGL.cpp
@@ -1140,19 +1140,26 @@
vertexStateBufferBindingTracker.Apply(gl);
bindGroupTracker.Apply(gl);
+ const auto topology = lastPipeline->GetGLPrimitiveTopology();
+ if (topology == GL_LINE_STRIP || topology == GL_TRIANGLE_STRIP) {
+ gl.Enable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
+ } else {
+ gl.Disable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
+ }
+
if (lastPipeline->UsesInstanceIndex()) {
gl.Uniform1ui(PipelineLayout::PushConstantLocation::FirstInstance,
draw->firstInstance);
}
if (gl.DrawElementsInstancedBaseVertexBaseInstanceANGLE) {
gl.DrawElementsInstancedBaseVertexBaseInstanceANGLE(
- lastPipeline->GetGLPrimitiveTopology(), draw->indexCount, indexBufferFormat,
+ topology, draw->indexCount, indexBufferFormat,
reinterpret_cast<void*>(draw->firstIndex * indexFormatSize +
indexBufferBaseOffset),
draw->instanceCount, draw->baseVertex, draw->firstInstance);
} else if (draw->firstInstance > 0) {
gl.DrawElementsInstancedBaseVertexBaseInstance(
- lastPipeline->GetGLPrimitiveTopology(), draw->indexCount, indexBufferFormat,
+ topology, draw->indexCount, indexBufferFormat,
reinterpret_cast<void*>(draw->firstIndex * indexFormatSize +
indexBufferBaseOffset),
draw->instanceCount, draw->baseVertex, draw->firstInstance);
@@ -1160,16 +1167,14 @@
// This branch is only needed on OpenGL < 4.2; ES < 3.2
if (draw->baseVertex != 0) {
gl.DrawElementsInstancedBaseVertex(
- lastPipeline->GetGLPrimitiveTopology(), draw->indexCount,
- indexBufferFormat,
+ topology, draw->indexCount, indexBufferFormat,
reinterpret_cast<void*>(draw->firstIndex * indexFormatSize +
indexBufferBaseOffset),
draw->instanceCount, draw->baseVertex);
} else {
// This branch is only needed on OpenGL < 3.2; ES < 3.2
gl.DrawElementsInstanced(
- lastPipeline->GetGLPrimitiveTopology(), draw->indexCount,
- indexBufferFormat,
+ topology, draw->indexCount, indexBufferFormat,
reinterpret_cast<void*>(draw->firstIndex * indexFormatSize +
indexBufferBaseOffset),
draw->instanceCount);
@@ -1209,9 +1214,16 @@
Buffer* indirectBuffer = ToBackend(draw->indirectBuffer.Get());
DAWN_ASSERT(indirectBuffer != nullptr);
+ const auto topology = lastPipeline->GetGLPrimitiveTopology();
+ if (topology == GL_LINE_STRIP || topology == GL_TRIANGLE_STRIP) {
+ gl.Enable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
+ } else {
+ gl.Disable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
+ }
+
gl.BindBuffer(GL_DRAW_INDIRECT_BUFFER, indirectBuffer->GetHandle());
gl.DrawElementsIndirect(
- lastPipeline->GetGLPrimitiveTopology(), indexBufferFormat,
+ topology, indexBufferFormat,
reinterpret_cast<void*>(static_cast<intptr_t>(draw->indirectOffset)));
indirectBuffer->TrackUsage();
break;
diff --git a/src/dawn/native/opengl/DeviceGL.cpp b/src/dawn/native/opengl/DeviceGL.cpp
index 133552f..f93f8f6 100644
--- a/src/dawn/native/opengl/DeviceGL.cpp
+++ b/src/dawn/native/opengl/DeviceGL.cpp
@@ -181,7 +181,6 @@
// Set initial state.
gl.Enable(GL_DEPTH_TEST);
gl.Enable(GL_SCISSOR_TEST);
- gl.Enable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
if (gl.GetVersion().IsDesktop()) {
// These are not necessary on GLES. The functionality is enabled by default, and
// works by specifying sample counts and SRGB textures, respectively.
diff --git a/src/dawn/tests/end2end/BufferZeroInitTests.cpp b/src/dawn/tests/end2end/BufferZeroInitTests.cpp
index 7ba8f2a..196d270 100644
--- a/src/dawn/tests/end2end/BufferZeroInitTests.cpp
+++ b/src/dawn/tests/end2end/BufferZeroInitTests.cpp
@@ -1296,6 +1296,9 @@
// the offset= that Tint/GLSL produces.
DAWN_SUPPRESS_TEST_IF(IsIntel() && IsOpenGL() && IsLinux());
+ // TODO(anglebug.com/8554): Crashes when count is 0.
+ DAWN_SUPPRESS_TEST_IF(IsANGLED3D11());
+
// Bind the whole buffer as an indirect buffer.
{
constexpr uint64_t kOffset = 0u;