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>
This commit is contained in:
parent
e3c692151f
commit
cc35b6c8b3
|
@ -141,12 +141,27 @@ static void buffer_bind(struct wined3d_buffer *buffer, struct wined3d_context *c
|
||||||
/* Context activation is done by the caller */
|
/* Context activation is done by the caller */
|
||||||
static void delete_gl_buffer(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info)
|
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;
|
if(!This->buffer_object) return;
|
||||||
|
|
||||||
GL_EXTCALL(glDeleteBuffers(1, &This->buffer_object));
|
GL_EXTCALL(glDeleteBuffers(1, &This->buffer_object));
|
||||||
checkGLcall("glDeleteBuffers");
|
checkGLcall("glDeleteBuffers");
|
||||||
This->buffer_object = 0;
|
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)
|
if(This->query)
|
||||||
{
|
{
|
||||||
wined3d_event_query_destroy(This->query);
|
wined3d_event_query_destroy(This->query);
|
||||||
|
@ -637,10 +652,9 @@ static void buffer_unload(struct wined3d_resource *resource)
|
||||||
|
|
||||||
if (buffer->buffer_object)
|
if (buffer->buffer_object)
|
||||||
{
|
{
|
||||||
struct wined3d_device *device = resource->device;
|
|
||||||
struct wined3d_context *context;
|
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. */
|
/* Download the buffer, but don't permanently enable double buffering. */
|
||||||
wined3d_buffer_load_location(buffer, context, WINED3D_LOCATION_SYSMEM);
|
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->stride = 0;
|
||||||
buffer->conversion_stride = 0;
|
buffer->conversion_stride = 0;
|
||||||
buffer->flags &= ~WINED3D_BUFFER_HASDESC;
|
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);
|
resource_unload(resource);
|
||||||
|
@ -1453,6 +1454,7 @@ static HRESULT buffer_init(struct wined3d_buffer *buffer, struct wined3d_device
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
buffer->buffer_type_hint = buffer_type_hint_from_bind_flags(bind_flags);
|
buffer->buffer_type_hint = buffer_type_hint_from_bind_flags(bind_flags);
|
||||||
|
buffer->bind_flags = bind_flags;
|
||||||
buffer->locations = WINED3D_LOCATION_SYSMEM;
|
buffer->locations = WINED3D_LOCATION_SYSMEM;
|
||||||
|
|
||||||
TRACE("buffer %p, size %#x, usage %#x, format %s, memory @ %p.\n",
|
TRACE("buffer %p, size %#x, usage %#x, format %s, memory @ %p.\n",
|
||||||
|
|
|
@ -3158,6 +3158,7 @@ struct wined3d_buffer
|
||||||
GLuint buffer_object;
|
GLuint buffer_object;
|
||||||
GLenum buffer_object_usage;
|
GLenum buffer_object_usage;
|
||||||
GLenum buffer_type_hint;
|
GLenum buffer_type_hint;
|
||||||
|
unsigned int bind_flags;
|
||||||
DWORD flags;
|
DWORD flags;
|
||||||
void *map_ptr;
|
void *map_ptr;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue