d3d8: Add more tests for NULL render targets.
This commit is contained in:
parent
463162b414
commit
e140077cc7
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue