Module: wine Branch: master Commit: c7d3a8a478238097842e8c74d42888be2ffd586e URL: http://source.winehq.org/git/wine.git/?a=commit;h=c7d3a8a478238097842e8c74d4...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Wed Mar 28 20:22:36 2012 +0200
wined3d: Drop the "vbo" check in wined3d_device_process_vertices().
We care about individual streams having a VBO or not, and there's no way for device_stream_info_from_declaration() to properly express that, so just check the individual streams.
---
dlls/wined3d/device.c | 50 +++++++++++++++++++++++------------------------- 1 files changed, 24 insertions(+), 26 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 8c99533..4cc80ad 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3452,11 +3452,12 @@ HRESULT CDECL wined3d_device_process_vertices(struct wined3d_device *device, const struct wined3d_vertex_declaration *declaration, DWORD flags, DWORD dst_fvf) { struct wined3d_state *state = &device->stateBlock->state; - BOOL vbo = FALSE, streamWasUP = state->user_stream; struct wined3d_stream_info stream_info; const struct wined3d_gl_info *gl_info; + BOOL streamWasUP = state->user_stream; struct wined3d_context *context; struct wined3d_shader *vs; + unsigned int i; HRESULT hr;
TRACE("device %p, src_start_idx %u, dst_idx %u, vertex_count %u, " @@ -3477,38 +3478,35 @@ HRESULT CDECL wined3d_device_process_vertices(struct wined3d_device *device, vs = state->vertex_shader; state->vertex_shader = NULL; state->user_stream = FALSE; - device_stream_info_from_declaration(device, &stream_info, &vbo); + device_stream_info_from_declaration(device, &stream_info, NULL); state->user_stream = streamWasUP; state->vertex_shader = vs;
- if (vbo || src_start_idx) + /* We can't convert FROM a VBO, and vertex buffers used to source into + * process_vertices() are unlikely to ever be used for drawing. Release + * VBOs in those buffers and fix up the stream_info structure. + * + * Also apply the start index. */ + for (i = 0; i < (sizeof(stream_info.elements) / sizeof(*stream_info.elements)); ++i) { - unsigned int i; - /* ProcessVertices can't convert FROM a vbo, and vertex buffers used to source into ProcessVertices are - * unlikely to ever be used for drawing. Release vbos in those buffers and fix up the stream_info structure - * - * Also get the start index in, but only loop over all elements if there's something to add at all. - */ - for (i = 0; i < (sizeof(stream_info.elements) / sizeof(*stream_info.elements)); ++i) - { - struct wined3d_stream_info_element *e; + struct wined3d_stream_info_element *e;
- if (!(stream_info.use_map & (1 << i))) continue; + if (!(stream_info.use_map & (1 << i))) + continue;
- e = &stream_info.elements[i]; - if (e->data.buffer_object) - { - struct wined3d_buffer *vb = state->streams[e->stream_idx].buffer; - e->data.buffer_object = 0; - e->data.addr = (BYTE *)((ULONG_PTR)e->data.addr + (ULONG_PTR)buffer_get_sysmem(vb, gl_info)); - ENTER_GL(); - GL_EXTCALL(glDeleteBuffersARB(1, &vb->buffer_object)); - vb->buffer_object = 0; - LEAVE_GL(); - } - if (e->data.addr) - e->data.addr += e->stride * src_start_idx; + e = &stream_info.elements[i]; + if (e->data.buffer_object) + { + struct wined3d_buffer *vb = state->streams[e->stream_idx].buffer; + e->data.buffer_object = 0; + e->data.addr = (BYTE *)((ULONG_PTR)e->data.addr + (ULONG_PTR)buffer_get_sysmem(vb, gl_info)); + ENTER_GL(); + GL_EXTCALL(glDeleteBuffersARB(1, &vb->buffer_object)); + vb->buffer_object = 0; + LEAVE_GL(); } + if (e->data.addr) + e->data.addr += e->stride * src_start_idx; }
hr = process_vertices_strided(device, dst_idx, vertex_count,