wined3d: End transform feedback on SO buffer destruction even if the D3D buffer isn't bound.
It might still be bound in GL. Signed-off-by: Zebediah Figura <zfigura@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
04f78cb5d0
commit
e2abbf9c58
|
@ -145,12 +145,16 @@ static void wined3d_buffer_gl_destroy_buffer_object(struct wined3d_buffer_gl *bu
|
||||||
if (!buffer_gl->b.buffer_object)
|
if (!buffer_gl->b.buffer_object)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (context_gl->c.transform_feedback_active && resource->bind_count
|
if (context_gl->c.transform_feedback_active && (resource->bind_flags & WINED3D_BIND_STREAM_OUTPUT)
|
||||||
&& resource->bind_flags & WINED3D_BIND_STREAM_OUTPUT)
|
&& wined3d_context_is_graphics_state_dirty(&context_gl->c, STATE_STREAM_OUTPUT))
|
||||||
{
|
{
|
||||||
/* We have to make sure that transform feedback is not active
|
/* It's illegal to (un)bind GL_TRANSFORM_FEEDBACK_BUFFER while transform
|
||||||
* when deleting a potentially bound transform feedback buffer.
|
* feedback is active. Deleting a buffer implicitly unbinds it, so we
|
||||||
* This may happen when the device is being destroyed. */
|
* need 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);
|
WARN("Deleting buffer object for buffer %p, disabling transform feedback.\n", buffer_gl);
|
||||||
wined3d_context_gl_end_transform_feedback(context_gl);
|
wined3d_context_gl_end_transform_feedback(context_gl);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1182,7 +1182,7 @@ void wined3d_device_uninit_3d(struct wined3d_device *device)
|
||||||
wined3d_texture_decref(texture);
|
wined3d_texture_decref(texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
wined3d_device_context_emit_reset_state(&device->cs->c, false);
|
wined3d_device_context_emit_reset_state(&device->cs->c, true);
|
||||||
state_cleanup(state);
|
state_cleanup(state);
|
||||||
|
|
||||||
wine_rb_clear(&device->samplers, device_free_sampler, NULL);
|
wine_rb_clear(&device->samplers, device_free_sampler, NULL);
|
||||||
|
|
Loading…
Reference in New Issue