From 010ff106dd8b8eeb317d088ec86550f79c3c7857 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Tue, 24 Mar 2015 09:38:26 +0100 Subject: [PATCH] d3d10core: Implement d3d10_device_DrawInstanced(). --- dlls/d3d10core/device.c | 9 +++++++-- dlls/wined3d/device.c | 9 +++++++++ dlls/wined3d/directx.c | 1 + dlls/wined3d/drawprim.c | 14 ++++++++++++-- dlls/wined3d/wined3d.spec | 1 + include/wine/wined3d.h | 2 ++ 6 files changed, 32 insertions(+), 4 deletions(-) diff --git a/dlls/d3d10core/device.c b/dlls/d3d10core/device.c index ed59ee64876..d8b3d7eebf0 100644 --- a/dlls/d3d10core/device.c +++ b/dlls/d3d10core/device.c @@ -304,9 +304,14 @@ static void STDMETHODCALLTYPE d3d10_device_DrawInstanced(ID3D10Device1 *iface, UINT instance_vertex_count, UINT instance_count, UINT start_vertex_location, UINT start_instance_location) { - FIXME("iface %p, instance_vertex_count %u, instance_count %u, start_vertex_location %u,\n" - "\tstart_instance_location %u stub!\n", iface, instance_vertex_count, instance_count, + struct d3d10_device *device = impl_from_ID3D10Device(iface); + + TRACE("iface %p, instance_vertex_count %u, instance_count %u, start_vertex_location %u, " + "start_instance_location %u.\n", iface, instance_vertex_count, instance_count, start_vertex_location, start_instance_location); + + wined3d_device_draw_primitive_instanced(device->wined3d_device, start_vertex_location, + instance_vertex_count, start_instance_location, instance_count); } static void STDMETHODCALLTYPE d3d10_device_GSSetConstantBuffers(ID3D10Device1 *iface, diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 631045aa059..870e384aa3c 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3427,6 +3427,15 @@ HRESULT CDECL wined3d_device_draw_primitive(struct wined3d_device *device, UINT return WINED3D_OK; } +void CDECL wined3d_device_draw_primitive_instanced(struct wined3d_device *device, + UINT start_vertex, UINT vertex_count, UINT start_instance, UINT instance_count) +{ + TRACE("device %p, start_vertex %u, vertex_count %u, start_instance %u, instance_count %u.\n", + device, start_vertex, vertex_count, start_instance, instance_count); + + wined3d_cs_emit_draw(device->cs, start_vertex, vertex_count, start_instance, instance_count, FALSE); +} + HRESULT CDECL wined3d_device_draw_indexed_primitive(struct wined3d_device *device, UINT start_idx, UINT index_count) { const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 3667840ab29..13061f465d5 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -2890,6 +2890,7 @@ static void load_gl_funcs(struct wined3d_gl_info *gl_info) USE_GL_FUNC(glDeleteShader) /* OpenGL 2.0 */ USE_GL_FUNC(glDetachShader) /* OpenGL 2.0 */ USE_GL_FUNC(glDisableVertexAttribArray) /* OpenGL 2.0 */ + USE_GL_FUNC(glDrawArraysInstanced) /* OpenGL 3.1 */ USE_GL_FUNC(glDrawBuffers) /* OpenGL 2.0 */ USE_GL_FUNC(glDrawElementsInstanced) /* OpenGL 3.1 */ USE_GL_FUNC(glEnableVertexAttribArray) /* OpenGL 2.0 */ diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c index 4916c0545d3..c0654a615d2 100644 --- a/dlls/wined3d/drawprim.c +++ b/dlls/wined3d/drawprim.c @@ -74,8 +74,18 @@ static void drawStridedFast(const struct wined3d_gl_info *gl_info, GLenum primit } else { - gl_info->gl_ops.gl.p_glDrawArrays(primitive_type, start_idx, count); - checkGLcall("glDrawArrays"); + if (instance_count) + { + if (start_instance) + FIXME("Start instance (%u) not supported.\n", start_instance); + GL_EXTCALL(glDrawArraysInstanced(primitive_type, start_idx, count, instance_count)); + checkGLcall("glDrawArraysInstanced"); + } + else + { + gl_info->gl_ops.gl.p_glDrawArrays(primitive_type, start_idx, count); + checkGLcall("glDrawArrays"); + } } } diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 9de0baf1e82..a79d6a64e3e 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -43,6 +43,7 @@ @ cdecl wined3d_device_draw_indexed_primitive(ptr long long) @ cdecl wined3d_device_draw_indexed_primitive_instanced(ptr long long long long) @ cdecl wined3d_device_draw_primitive(ptr long long) +@ cdecl wined3d_device_draw_primitive_instanced(ptr long long long long) @ cdecl wined3d_device_end_scene(ptr) @ cdecl wined3d_device_end_stateblock(ptr ptr) @ cdecl wined3d_device_evict_managed_resources(ptr) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 116918d7046..0f70848120d 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2143,6 +2143,8 @@ HRESULT __cdecl wined3d_device_draw_indexed_primitive(struct wined3d_device *dev void __cdecl wined3d_device_draw_indexed_primitive_instanced(struct wined3d_device *device, UINT start_idx, UINT index_count, UINT start_instance, UINT instance_count); HRESULT __cdecl wined3d_device_draw_primitive(struct wined3d_device *device, UINT start_vertex, UINT vertex_count); +void __cdecl wined3d_device_draw_primitive_instanced(struct wined3d_device *device, + UINT start_vertex, UINT vertex_count, UINT start_instance, UINT instance_count); HRESULT __cdecl wined3d_device_end_scene(struct wined3d_device *device); HRESULT __cdecl wined3d_device_end_stateblock(struct wined3d_device *device, struct wined3d_stateblock **stateblock); void __cdecl wined3d_device_evict_managed_resources(struct wined3d_device *device);