d3d8: Add more tests for NULL render targets.

This commit is contained in:
Stefan Dösinger 2011-04-25 20:22:50 +02:00 committed by Alexandre Julliard
parent 463162b414
commit e140077cc7
2 changed files with 45 additions and 4 deletions

View file

@ -1028,11 +1028,25 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetRenderTarget(IDirect3DDevice8 *ifa
{
struct wined3d_resource_desc ds_desc, rt_desc;
struct wined3d_resource *wined3d_resource;
IDirect3DSurface8 *orig_rt = NULL;
/* If no render target is passed in check the size against the current RT */
if (!pRenderTarget)
{
hr = IDirect3DDevice8_GetRenderTarget(iface, &orig_rt);
if (FAILED(hr))
{
wined3d_mutex_unlock();
return hr;
}
pSurface = (IDirect3DSurface8Impl *)orig_rt;
}
wined3d_resource = IWineD3DSurface_GetResource(pZSurface->wineD3DSurface);
wined3d_resource_get_desc(wined3d_resource, &ds_desc);
wined3d_resource = IWineD3DSurface_GetResource(pSurface->wineD3DSurface);
wined3d_resource_get_desc(wined3d_resource, &rt_desc);
if (orig_rt) IDirect3DSurface8_Release(orig_rt);
if (ds_desc.width < rt_desc.width || ds_desc.height < rt_desc.height)
{
@ -1046,7 +1060,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetRenderTarget(IDirect3DDevice8 *ifa
if (hr == WINED3D_OK || hr == WINED3DERR_NOTFOUND)
{
hr = IWineD3DDevice_SetDepthStencilSurface(This->WineD3DDevice, pZSurface ? pZSurface->wineD3DSurface : NULL);
if (SUCCEEDED(hr) && pSurface)
if (SUCCEEDED(hr) && pRenderTarget)
{
hr = IWineD3DDevice_SetRenderTarget(This->WineD3DDevice, 0, pSurface->wineD3DSurface, TRUE);
if (FAILED(hr)) IWineD3DDevice_SetDepthStencilSurface(This->WineD3DDevice, original_ds);

View file

@ -1409,7 +1409,7 @@ static void test_depth_stencil_reset(void)
{
D3DPRESENT_PARAMETERS present_parameters;
D3DDISPLAYMODE display_mode;
IDirect3DSurface8 *surface;
IDirect3DSurface8 *surface, *orig_rt;
IDirect3DDevice8 *device = NULL;
IDirect3D8 *d3d8;
UINT refcount;
@ -1438,6 +1438,9 @@ static void test_depth_stencil_reset(void)
goto cleanup;
}
hr = IDirect3DDevice8_GetRenderTarget(device, &orig_rt);
ok(hr == D3D_OK, "GetRenderTarget failed with 0x%08x\n", hr);
hr = IDirect3DDevice8_TestCooperativeLevel(device);
ok(SUCCEEDED(hr), "TestCooperativeLevel failed with %#x\n", hr);
@ -1446,8 +1449,9 @@ static void test_depth_stencil_reset(void)
hr = IDirect3DDevice8_GetRenderTarget(device, &surface);
ok(hr == D3D_OK, "GetRenderTarget failed with 0x%08x\n", hr);
ok(surface != NULL, "Render target should not be NULL\n");
ok(surface == orig_rt, "Render target is %p, should be %p\n", surface, orig_rt);
if (surface) IDirect3DSurface8_Release(surface);
IDirect3DSurface8_Release(orig_rt);
hr = IDirect3DDevice8_GetDepthStencilSurface(device, &surface);
ok(hr == D3DERR_NOTFOUND, "GetDepthStencilSurface returned 0x%08x, expected D3DERR_NOTFOUND\n", hr);
@ -2120,7 +2124,8 @@ cleanup:
static void test_depth_stencil_size(void)
{
IDirect3DDevice8 *device;
IDirect3DSurface8 *ds, *rt, *ds_bigger;
IDirect3DSurface8 *ds, *rt, *ds_bigger, *ds_bigger2;
IDirect3DSurface8 *surf;
IDirect3D8 *d3d8;
HRESULT hr;
HWND hwnd;
@ -2140,15 +2145,37 @@ static void test_depth_stencil_size(void)
ok(SUCCEEDED(hr), "IDirect3DDevice8_CreateDepthStencilSurface failed, hr %#x.\n", hr);
hr = IDirect3DDevice8_CreateDepthStencilSurface(device, 128, 128, D3DFMT_D24X8, D3DMULTISAMPLE_NONE, &ds_bigger);
ok(SUCCEEDED(hr), "IDirect3DDevice8_CreateDepthStencilSurface failed, hr %#x.\n", hr);
hr = IDirect3DDevice8_CreateDepthStencilSurface(device, 128, 128, D3DFMT_D24X8, D3DMULTISAMPLE_NONE, &ds_bigger2);
ok(SUCCEEDED(hr), "IDirect3DDevice8_CreateDepthStencilSurface failed, hr %#x.\n", hr);
hr = IDirect3DDevice8_SetRenderTarget(device, rt, ds);
ok(hr == D3DERR_INVALIDCALL, "IDirect3DDevice8_SetRenderTarget returned %#x, expected D3DERR_INVALIDCALL.\n", hr);
hr = IDirect3DDevice8_SetRenderTarget(device, rt, ds_bigger);
ok(SUCCEEDED(hr), "IDirect3DDevice8_CreateDepthStencilSurface failed, hr %#x.\n", hr);
/* try to set the small ds without changing the render target at the same time */
hr = IDirect3DDevice8_SetRenderTarget(device, NULL, ds);
ok(hr == D3DERR_INVALIDCALL, "IDirect3DDevice8_SetRenderTarget returned %#x, expected D3DERR_INVALIDCALL.\n", hr);
hr = IDirect3DDevice8_SetRenderTarget(device, NULL, ds_bigger2);
ok(SUCCEEDED(hr), "IDirect3DDevice8_CreateDepthStencilSurface failed, hr %#x.\n", hr);
hr = IDirect3DDevice8_GetRenderTarget(device, &surf);
ok(surf == rt, "The render target is %p, expected %p\n", surf, rt);
IDirect3DSurface8_Release(surf);
hr = IDirect3DDevice8_GetDepthStencilSurface(device, &surf);
ok(surf == ds_bigger2, "The depth stencil is %p, expected %p\n", surf, ds_bigger2);
IDirect3DSurface8_Release(surf);
hr = IDirect3DDevice8_SetRenderTarget(device, NULL, NULL);
ok(SUCCEEDED(hr), "IDirect3DDevice8_CreateDepthStencilSurface failed, hr %#x.\n", hr);
hr = IDirect3DDevice8_GetDepthStencilSurface(device, &surf);
ok(surf == NULL, "The depth stencil is %p, expected NULL\n", surf);
if (surf) IDirect3DSurface8_Release(surf);
IDirect3DSurface8_Release(rt);
IDirect3DSurface8_Release(ds);
IDirect3DSurface8_Release(ds_bigger);
IDirect3DSurface8_Release(ds_bigger2);
cleanup:
if (d3d8) IDirect3D8_Release(d3d8);