[PATCH v2 1/3] wined3d: End transform feedback on SO buffer destruction even if the d3d buffer isn't bound.
Zebediah Figura
zfigura at codeweavers.com
Mon Oct 18 11:01:59 CDT 2021
From: Matteo Bruni <mbruni at codeweavers.com>
It might still be bound in GL.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
dlls/wined3d/buffer.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index d259b64bfaf..1d0d4d23cc5 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -145,12 +145,16 @@ static void wined3d_buffer_gl_destroy_buffer_object(struct wined3d_buffer_gl *bu
if (!buffer_gl->b.buffer_object)
return;
- if (context_gl->c.transform_feedback_active && resource->bind_count
- && resource->bind_flags & WINED3D_BIND_STREAM_OUTPUT)
+ if (context_gl->c.transform_feedback_active && (resource->bind_flags & WINED3D_BIND_STREAM_OUTPUT)
+ && isStateDirty(&context_gl->c, STATE_STREAM_OUTPUT))
{
- /* We have to make sure that transform feedback is not active
- * when deleting a potentially bound transform feedback buffer.
- * This may happen when the device is being destroyed. */
+ /* It's illegal to (un)bind GL_TRANSFORM_FEEDBACK_BUFFER while transform
+ * feedback is active. Deleting a buffer implicitly unbinds it, so we
+ * meed to end transform feedback here if this buffer was bound.
+ *
+ * This should only be possible if STATE_STREAM_OUTPUT is dirty; if we
+ * do a draw call before destroying this buffer then the draw call will
+ * already rebind the GL target. */
WARN("Deleting buffer object for buffer %p, disabling transform feedback.\n", buffer_gl);
wined3d_context_gl_end_transform_feedback(context_gl);
}
--
2.33.0
More information about the wine-devel
mailing list