From: Illia Polishchuk illia.a.polishchuk@globallogic.com
d3d9 does not do instanced for not-indexed draw calls
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54570 --- dlls/d3d9/device.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+)
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index eddb2a0ebdd..8aba3288513 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -3033,7 +3033,9 @@ static HRESULT WINAPI d3d9_device_DrawPrimitive(IDirect3DDevice9Ex *iface, D3DPRIMITIVETYPE primitive_type, UINT start_vertex, UINT primitive_count) { struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface); + const struct wined3d_stateblock_state *state; unsigned int vertex_count; + UINT saved_flags, saved_freq;
TRACE("iface %p, primitive_type %#x, start_vertex %u, primitive_count %u.\n", iface, primitive_type, start_vertex, primitive_count); @@ -3045,6 +3047,17 @@ static HRESULT WINAPI d3d9_device_DrawPrimitive(IDirect3DDevice9Ex *iface, WARN("Called without a valid vertex declaration set.\n"); return D3DERR_INVALIDCALL; } + + /* Windows D3D9 does not do non-indexed instanced draws. + * Set instance count to 1 for the not indexed draw */ + state = wined3d_stateblock_get_state(device->state); + saved_freq = state->streams[0].frequency; + if(saved_freq > 1) + { + saved_flags = state->streams[0].flags; + wined3d_stateblock_set_stream_source_freq(device->update_state, 0, saved_flags | 1); + } + wined3d_device_apply_stateblock(device->wined3d_device, device->state); vertex_count = vertex_count_from_primitive_count(primitive_type, primitive_count); d3d9_device_upload_managed_textures(device); @@ -3053,6 +3066,11 @@ static HRESULT WINAPI d3d9_device_DrawPrimitive(IDirect3DDevice9Ex *iface, wined3d_device_context_set_primitive_type(device->immediate_context, wined3d_primitive_type_from_d3d(primitive_type), 0); wined3d_device_context_draw(device->immediate_context, start_vertex, vertex_count, 0, 0); + + /* Restore instance count to previous value */ + if(saved_freq > 1) + wined3d_stateblock_set_stream_source_freq(device->update_state, 0, saved_flags | saved_freq); + d3d9_rts_flag_auto_gen_mipmap(device); wined3d_mutex_unlock();
@@ -3103,8 +3121,10 @@ static HRESULT WINAPI d3d9_device_DrawPrimitiveUP(IDirect3DDevice9Ex *iface, D3DPRIMITIVETYPE primitive_type, UINT primitive_count, const void *data, UINT stride) { struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface); + const struct wined3d_stateblock_state *state; UINT vtx_count = vertex_count_from_primitive_count(primitive_type, primitive_count); UINT size = vtx_count * stride; + UINT saved_flags, saved_freq; unsigned int vb_pos; HRESULT hr;
@@ -3143,8 +3163,24 @@ static HRESULT WINAPI d3d9_device_DrawPrimitiveUP(IDirect3DDevice9Ex *iface, d3d9_device_upload_managed_textures(device); wined3d_device_context_set_primitive_type(device->immediate_context, wined3d_primitive_type_from_d3d(primitive_type), 0); + + /* Windows D3D9 does not do non-indexed instanced draws. + * Set instance count to 1 for the not indexed draw */ + state = wined3d_stateblock_get_state(device->state); + saved_freq = state->streams[0].frequency; + if(saved_freq > 1) + { + saved_flags = state->streams[0].flags; + wined3d_stateblock_set_stream_source_freq(device->update_state, 0, saved_flags | 1); + } + wined3d_device_apply_stateblock(device->wined3d_device, device->state); wined3d_device_context_draw(device->immediate_context, vb_pos / stride, vtx_count, 0, 0); + + /* Restore instance count to previous value */ + if(saved_freq > 1) + wined3d_stateblock_set_stream_source_freq(device->update_state, 0, saved_flags | saved_freq); + wined3d_stateblock_set_stream_source(device->state, 0, NULL, 0, 0); d3d9_rts_flag_auto_gen_mipmap(device);