diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h index a0703ab5263..b618ff40206 100644 --- a/dlls/d3d9/d3d9_private.h +++ b/dlls/d3d9/d3d9_private.h @@ -167,6 +167,7 @@ struct d3d9_device LONG device_state; BOOL in_destruction; BOOL in_scene; + BOOL has_vertex_declaration; UINT implicit_swapchain_count; struct d3d9_swapchain **implicit_swapchains; diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 4bbdd42af01..6301ae970ed 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -2292,6 +2292,12 @@ static HRESULT WINAPI d3d9_device_DrawPrimitive(IDirect3DDevice9Ex *iface, iface, primitive_type, start_vertex, primitive_count); wined3d_mutex_lock(); + if (!device->has_vertex_declaration) + { + wined3d_mutex_unlock(); + WARN("Called without a valid vertex declaration set.\n"); + return D3DERR_INVALIDCALL; + } wined3d_device_set_primitive_type(device->wined3d_device, primitive_type); hr = wined3d_device_draw_primitive(device->wined3d_device, start_vertex, vertex_count_from_primitive_count(primitive_type, primitive_count)); @@ -2313,6 +2319,12 @@ static HRESULT WINAPI d3d9_device_DrawIndexedPrimitive(IDirect3DDevice9Ex *iface vertex_count, start_idx, primitive_count); wined3d_mutex_lock(); + if (!device->has_vertex_declaration) + { + wined3d_mutex_unlock(); + WARN("Called without a valid vertex declaration set.\n"); + return D3DERR_INVALIDCALL; + } wined3d_device_set_base_vertex_index(device->wined3d_device, base_vertex_idx); wined3d_device_set_primitive_type(device->wined3d_device, primitive_type); hr = wined3d_device_draw_indexed_primitive(device->wined3d_device, start_idx, @@ -2373,6 +2385,13 @@ static HRESULT WINAPI d3d9_device_DrawPrimitiveUP(IDirect3DDevice9Ex *iface, wined3d_mutex_lock(); + if (!device->has_vertex_declaration) + { + wined3d_mutex_unlock(); + WARN("Called without a valid vertex declaration set.\n"); + return D3DERR_INVALIDCALL; + } + hr = d3d9_device_prepare_vertex_buffer(device, size); if (FAILED(hr)) goto done; @@ -2466,6 +2485,13 @@ static HRESULT WINAPI d3d9_device_DrawIndexedPrimitiveUP(IDirect3DDevice9Ex *ifa wined3d_mutex_lock(); + if (!device->has_vertex_declaration) + { + wined3d_mutex_unlock(); + WARN("Called without a valid vertex declaration set.\n"); + return D3DERR_INVALIDCALL; + } + hr = d3d9_device_prepare_vertex_buffer(device, vtx_size); if (FAILED(hr)) goto done; @@ -2579,6 +2605,7 @@ static HRESULT WINAPI d3d9_device_SetVertexDeclaration(IDirect3DDevice9Ex *iface wined3d_mutex_lock(); wined3d_device_set_vertex_declaration(device->wined3d_device, decl_impl ? decl_impl->wined3d_declaration : NULL); + device->has_vertex_declaration = !!decl_impl; wined3d_mutex_unlock(); return D3D_OK; @@ -2702,6 +2729,7 @@ static HRESULT WINAPI d3d9_device_SetFVF(IDirect3DDevice9Ex *iface, DWORD fvf) } wined3d_device_set_vertex_declaration(device->wined3d_device, decl); + device->has_vertex_declaration = TRUE; wined3d_mutex_unlock(); return D3D_OK;