Module: wine Branch: master Commit: cc35b6c8b3896a2020dc45db3aab61673f7c7268 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cc35b6c8b3896a2020dc45db3a...
Author: Józef Kucia jkucia@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@codeweavers.com Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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;