Commit cc35b6c8 authored by Józef Kucia's avatar Józef Kucia Committed by Alexandre Julliard

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

parent e3c69215
......@@ -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",
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment