Commit bdccebca authored by Józef Kucia's avatar Józef Kucia Committed by Alexandre Julliard

d3d8: Fix Reset() with system memory buffers.

Fixes a regression introduced by commit 75b7ff60. Signed-off-by: 's avatarJózef Kucia <jkucia@codeweavers.com> Signed-off-by: 's avatarHenri Verbeet <hverbeet@codeweavers.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent 70a95cea
......@@ -826,6 +826,8 @@ static HRESULT WINAPI d3d8_device_CreateAdditionalSwapChain(IDirect3DDevice8 *if
static HRESULT CDECL reset_enum_callback(struct wined3d_resource *resource)
{
struct d3d8_vertexbuffer *vertex_buffer;
struct d3d8_indexbuffer *index_buffer;
struct wined3d_resource_desc desc;
IDirect3DBaseTexture8 *texture;
struct d3d8_surface *surface;
......@@ -837,6 +839,19 @@ static HRESULT CDECL reset_enum_callback(struct wined3d_resource *resource)
if (desc.resource_type != WINED3D_RTYPE_TEXTURE_2D)
{
if (desc.bind_flags & WINED3D_BIND_VERTEX_BUFFER)
{
vertex_buffer = wined3d_resource_get_parent(resource);
if (vertex_buffer && vertex_buffer->draw_buffer)
return D3D_OK;
}
if (desc.bind_flags & WINED3D_BIND_INDEX_BUFFER)
{
index_buffer = wined3d_resource_get_parent(resource);
if (index_buffer && index_buffer->draw_buffer)
return D3D_OK;
}
WARN("Resource %p in pool D3DPOOL_DEFAULT blocks the Reset call.\n", resource);
return D3DERR_DEVICELOST;
}
......
......@@ -1312,6 +1312,8 @@ static void test_reset(void)
D3DPRESENT_PARAMETERS d3dpp;
IDirect3DSurface8 *surface;
IDirect3DTexture8 *texture;
IDirect3DVertexBuffer8 *vb;
IDirect3DIndexBuffer8 *ib;
UINT adapter_mode_count;
D3DLOCKED_RECT lockrect;
UINT mode_count = 0;
......@@ -1704,6 +1706,20 @@ static void test_reset(void)
ok(SUCCEEDED(hr), "TestCooperativeLevel failed, hr %#x.\n", hr);
IDirect3DTexture8_Release(texture);
hr = IDirect3DDevice8_CreateVertexBuffer(device1, 16, 0,
D3DFVF_XYZ, D3DPOOL_SYSTEMMEM, &vb);
ok(hr == D3D_OK, "Failed to create vertex buffer, hr %#x.\n", hr);
hr = IDirect3DDevice8_Reset(device1, &d3dpp);
ok(hr == D3D_OK, "Failed to reset device, hr %#x.\n", hr);
IDirect3DVertexBuffer8_Release(vb);
hr = IDirect3DDevice8_CreateIndexBuffer(device1, 16, 0,
D3DFMT_INDEX16, D3DPOOL_SYSTEMMEM, &ib);
ok(hr == D3D_OK, "Failed to create index buffer, hr %#x.\n", hr);
hr = IDirect3DDevice8_Reset(device1, &d3dpp);
ok(hr == D3D_OK, "Failed to reset device, hr %#x.\n", hr);
IDirect3DIndexBuffer8_Release(ib);
/* The depth stencil should get reset to the auto depth stencil when present. */
hr = IDirect3DDevice8_SetRenderTarget(device1, NULL, NULL);
ok(SUCCEEDED(hr), "SetRenderTarget failed, hr %#x.\n", hr);
......@@ -2878,7 +2894,7 @@ static void test_wndproc(void)
&& devmode.dmPelsHeight == registry_mode.dmPelsHeight, "Got unexpect screen size %ux%u.\n",
devmode.dmPelsWidth, devmode.dmPelsHeight);
/* I have to minimize and restore the focus window, otherwise native d3d9 fails
/* I have to minimize and restore the focus window, otherwise native d3d8 fails
* device::reset with D3DERR_DEVICELOST. This does not happen when the window
* restore is triggered by the user. */
expect_messages = reactivate_messages;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment