=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Invalidate device state based on buffer bind flags when buffer is deleted.

Alexandre Julliard julliard at winehq.org
Wed Nov 2 15:04:07 CDT 2016


Module: wine
Branch: master
Commit: cc35b6c8b3896a2020dc45db3aab61673f7c7268
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=cc35b6c8b3896a2020dc45db3aab61673f7c7268

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Wed Nov  2 10:55:33 2016 +0100

wined3d: Invalidate device state based on buffer bind flags when buffer is deleted.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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;
 




More information about the wine-cvs mailing list