[PATCH 2/6] wined3d: Invalidate device state based on buffer bind flags when buffer is deleted.
Józef Kucia
jkucia at codeweavers.com
Wed Nov 2 04:55:33 CDT 2016
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
dlls/wined3d/buffer.c | 32 +++++++++++++++++---------------
dlls/wined3d/wined3d_private.h | 1 +
2 files changed, 18 insertions(+), 15 deletions(-)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index c9493c7..70c718c 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -141,12 +141,27 @@ static void buffer_bind(struct wined3d_buffer *buffer, struct wined3d_context *c
/* Context activation is done by the caller */
static void delete_gl_buffer(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info)
{
+ struct wined3d_resource *resource = &This->resource;
+
if(!This->buffer_object) return;
GL_EXTCALL(glDeleteBuffers(1, &This->buffer_object));
checkGLcall("glDeleteBuffers");
This->buffer_object = 0;
+ /* The stream source state handler might have read the memory of the
+ * vertex buffer already and got the memory in the vbo which is not
+ * valid any longer. Dirtify the stream source to force a reload. This
+ * happens only once per changed vertexbuffer and should occur rather
+ * rarely. */
+ if (resource->bind_count)
+ {
+ if (This->bind_flags & WINED3D_BIND_VERTEX_BUFFER)
+ device_invalidate_state(resource->device, STATE_STREAMSRC);
+ if (This->bind_flags & WINED3D_BIND_INDEX_BUFFER)
+ device_invalidate_state(resource->device, STATE_INDEXBUFFER);
+ }
+
if(This->query)
{
wined3d_event_query_destroy(This->query);
@@ -637,10 +652,9 @@ static void buffer_unload(struct wined3d_resource *resource)
if (buffer->buffer_object)
{
- struct wined3d_device *device = resource->device;
struct wined3d_context *context;
- context = context_acquire(device, NULL);
+ context = context_acquire(resource->device, NULL);
/* Download the buffer, but don't permanently enable double buffering. */
wined3d_buffer_load_location(buffer, context, WINED3D_LOCATION_SYSMEM);
@@ -658,19 +672,6 @@ static void buffer_unload(struct wined3d_resource *resource)
buffer->stride = 0;
buffer->conversion_stride = 0;
buffer->flags &= ~WINED3D_BUFFER_HASDESC;
-
- /* The stream source state handler might have read the memory of the
- * vertex buffer already and got the memory in the vbo which is not
- * valid any longer. Dirtify the stream source to force a reload. This
- * happens only once per changed vertexbuffer and should occur rather
- * rarely. */
- if (resource->bind_count)
- {
- device_invalidate_state(device, STATE_STREAMSRC);
-
- if (buffer->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER)
- device_invalidate_state(device, STATE_INDEXBUFFER);
- }
}
resource_unload(resource);
@@ -1453,6 +1454,7 @@ static HRESULT buffer_init(struct wined3d_buffer *buffer, struct wined3d_device
return hr;
}
buffer->buffer_type_hint = buffer_type_hint_from_bind_flags(bind_flags);
+ buffer->bind_flags = bind_flags;
buffer->locations = WINED3D_LOCATION_SYSMEM;
TRACE("buffer %p, size %#x, usage %#x, format %s, memory @ %p.\n",
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index c56558d..19b650e 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3158,6 +3158,7 @@ struct wined3d_buffer
GLuint buffer_object;
GLenum buffer_object_usage;
GLenum buffer_type_hint;
+ unsigned int bind_flags;
DWORD flags;
void *map_ptr;
--
2.7.3
More information about the wine-patches
mailing list