ddraw/tests: Add some IDirect3DViewport interface tests.

oldstable
Stefan Dösinger 2012-02-02 12:56:00 +01:00 committed by Alexandre Julliard
parent c47677fee5
commit acf82ff1f5
4 changed files with 272 additions and 0 deletions

View File

@ -15,6 +15,7 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#define COBJMACROS
#include "wine/test.h"
#include "d3d.h"
@ -815,6 +816,96 @@ static void test_coop_level_threaded(void)
destroy_window_thread(&p);
}
static LONG get_refcount(IUnknown *test_iface)
{
IUnknown_AddRef(test_iface);
return IUnknown_Release(test_iface);
}
static void test_viewport_interfaces(void)
{
IDirectDraw *ddraw;
IDirect3D *d3d;
HRESULT hr;
LONG ref;
IDirect3DViewport *viewport;
IDirect3DViewport2 *viewport2;
IDirect3DViewport3 *viewport3;
IDirectDrawGammaControl *gamma;
IUnknown *unknown;
if (!(ddraw = create_ddraw()))
{
skip("Failed to create ddraw object, skipping test.\n");
return;
}
hr = IDirectDraw_QueryInterface(ddraw, &IID_IDirect3D, (void **)&d3d);
ok(SUCCEEDED(hr) || hr == E_NOINTERFACE, "Failed to get d3d interface, hr %#x.\n", hr);
if (FAILED(hr))
{
skip("Direct3D not available, skipping tests\n");
IDirectDraw_Release(ddraw);
return;
}
ref = get_refcount((IUnknown *)d3d);
ok(ref == 2, "IDirect3D refcount is %d\n", ref);
hr = IDirect3D_CreateViewport(d3d, &viewport, NULL);
ok(SUCCEEDED(hr), "Failed to create viewport, hr %#x.\n", hr);
ref = get_refcount((IUnknown *)viewport);
ok(ref == 1, "Initial IDirect3DViewport refcount is %d\n", ref);
ref = get_refcount((IUnknown *)d3d);
ok(ref == 2, "IDirect3D refcount is %d\n", ref);
/* E_FAIL return values are returned by Winetestbot Windows NT machines. While not supporting
* newer interfaces is legitimate for old ddraw versions, E_FAIL violates Microsoft's rules
* for QueryInterface, hence the broken() */
gamma = (IDirectDrawGammaControl *)0xdeadbeef;
hr = IDirect3DViewport_QueryInterface(viewport, &IID_IDirectDrawGammaControl, (void **)&gamma);
ok(hr == E_NOINTERFACE || broken(hr == E_FAIL), "Got unexpected hr %#x.\n", hr);
ok(gamma == NULL, "Interface not set to NULL by failed QI call: %p\n", gamma);
if (SUCCEEDED(hr)) IDirectDrawGammaControl_Release(gamma);
/* NULL iid: Segfaults */
hr = IDirect3DViewport_QueryInterface(viewport, &IID_IDirect3DViewport2, (void **)&viewport2);
ok(SUCCEEDED(hr) || broken(hr == E_FAIL), "Failed to QI IDirect3DViewport2, hr %#x.\n", hr);
if (viewport2)
{
ref = get_refcount((IUnknown *)viewport);
ok(ref == 2, "IDirect3DViewport refcount is %d\n", ref);
ref = get_refcount((IUnknown *)viewport2);
ok(ref == 2, "IDirect3DViewport2 refcount is %d\n", ref);
IDirect3DViewport2_Release(viewport2);
viewport2 = NULL;
}
hr = IDirect3DViewport_QueryInterface(viewport, &IID_IDirect3DViewport3, (void **)&viewport3);
ok(SUCCEEDED(hr) || broken(hr == E_FAIL), "Failed to QI IDirect3DViewport3, hr %#x.\n", hr);
if (viewport3)
{
ref = get_refcount((IUnknown *)viewport);
ok(ref == 2, "IDirect3DViewport refcount is %d\n", ref);
ref = get_refcount((IUnknown *)viewport3);
ok(ref == 2, "IDirect3DViewport3 refcount is %d\n", ref);
IDirect3DViewport3_Release(viewport3);
}
hr = IDirect3DViewport_QueryInterface(viewport, &IID_IUnknown, (void **)&unknown);
ok(SUCCEEDED(hr), "Failed to QI IUnknown, hr %#x.\n", hr);
if (unknown)
{
ref = get_refcount((IUnknown *)viewport);
ok(ref == 2, "IDirect3DViewport refcount is %d\n", ref);
ref = get_refcount(unknown);
ok(ref == 2, "IUnknown refcount is %d\n", ref);
IUnknown_Release(unknown);
}
IDirect3DViewport_Release(viewport);
IDirect3D_Release(d3d);
IDirectDraw_Release(ddraw);
}
START_TEST(ddraw1)
{
test_coop_level_create_device_window();
@ -822,4 +913,5 @@ START_TEST(ddraw1)
test_coop_level_d3d_state();
test_surface_interface_mismatch();
test_coop_level_threaded();
test_viewport_interfaces();
}

View File

@ -15,6 +15,7 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#define COBJMACROS
#include "wine/test.h"
#include "d3d.h"
@ -1178,6 +1179,93 @@ done:
if (ddraw) IDirectDraw2_Release(ddraw);
}
static LONG get_refcount(IUnknown *test_iface)
{
IUnknown_AddRef(test_iface);
return IUnknown_Release(test_iface);
}
static void test_viewport_interfaces(void)
{
IDirectDraw2 *ddraw;
IDirect3D2 *d3d;
HRESULT hr;
LONG ref, old_d3d_ref;
IDirect3DViewport *viewport;
IDirect3DViewport2 *viewport2;
IDirect3DViewport3 *viewport3;
IDirectDrawGammaControl *gamma;
IUnknown *unknown;
if (!(ddraw = create_ddraw()))
{
skip("Failed to create ddraw object, skipping test.\n");
return;
}
hr = IDirectDraw2_QueryInterface(ddraw, &IID_IDirect3D2, (void **)&d3d);
ok(SUCCEEDED(hr) || hr == E_NOINTERFACE, "Failed to get d3d interface, hr %#x.\n", hr);
if (FAILED(hr))
{
skip("Direct3D not available, skipping tests\n");
IDirectDraw2_Release(ddraw);
return;
}
old_d3d_ref = get_refcount((IUnknown *)d3d);
hr = IDirect3D2_CreateViewport(d3d, &viewport2, NULL);
ok(SUCCEEDED(hr), "Failed to create viewport, hr %#x.\n", hr);
ref = get_refcount((IUnknown *)viewport2);
ok(ref == 1, "Initial IDirect3DViewport2 refcount is %d\n", ref);
ref = get_refcount((IUnknown *)d3d);
ok(ref == old_d3d_ref, "IDirect3D2 refcount is %d\n", ref);
gamma = (IDirectDrawGammaControl *)0xdeadbeef;
hr = IDirect3DViewport2_QueryInterface(viewport2, &IID_IDirectDrawGammaControl, (void **)&gamma);
ok(hr == E_NOINTERFACE, "Got unexpected hr %#x.\n", hr);
ok(gamma == NULL, "Interface not set to NULL by failed QI call: %p\n", gamma);
if (SUCCEEDED(hr)) IDirectDrawGammaControl_Release(gamma);
/* NULL iid: Segfaults */
hr = IDirect3DViewport2_QueryInterface(viewport2, &IID_IDirect3DViewport, (void **)&viewport);
ok(SUCCEEDED(hr), "Failed to QI IDirect3DViewport, hr %#x.\n", hr);
if (viewport)
{
ref = get_refcount((IUnknown *)viewport);
ok(ref == 2, "IDirect3DViewport refcount is %d\n", ref);
ref = get_refcount((IUnknown *)viewport2);
ok(ref == 2, "IDirect3DViewport2 refcount is %d\n", ref);
IDirect3DViewport_Release(viewport);
viewport = NULL;
}
hr = IDirect3DViewport2_QueryInterface(viewport2, &IID_IDirect3DViewport3, (void **)&viewport3);
ok(SUCCEEDED(hr), "Failed to QI IDirect3DViewport3, hr %#x.\n", hr);
if (viewport3)
{
ref = get_refcount((IUnknown *)viewport2);
ok(ref == 2, "IDirect3DViewport2 refcount is %d\n", ref);
ref = get_refcount((IUnknown *)viewport3);
ok(ref == 2, "IDirect3DViewport3 refcount is %d\n", ref);
IDirect3DViewport3_Release(viewport3);
}
hr = IDirect3DViewport2_QueryInterface(viewport2, &IID_IUnknown, (void **)&unknown);
ok(SUCCEEDED(hr), "Failed to QI IUnknown, hr %#x.\n", hr);
if (unknown)
{
ref = get_refcount((IUnknown *)viewport2);
ok(ref == 2, "IDirect3DViewport2 refcount is %d\n", ref);
ref = get_refcount(unknown);
ok(ref == 2, "IUnknown refcount is %d\n", ref);
IUnknown_Release(unknown);
}
IDirect3DViewport2_Release(viewport2);
IDirect3D2_Release(d3d);
IDirectDraw2_Release(ddraw);
}
START_TEST(ddraw2)
{
test_coop_level_create_device_window();
@ -1187,4 +1275,5 @@ START_TEST(ddraw2)
test_coop_level_threaded();
test_depth_blit();
test_texture_load_ckey();
test_viewport_interfaces();
}

View File

@ -15,6 +15,7 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#define COBJMACROS
#include "wine/test.h"
#include <limits.h>
@ -1309,6 +1310,92 @@ static void test_texture_load_ckey(void)
IDirectDraw4_Release(ddraw);
}
static LONG get_refcount(IUnknown *test_iface)
{
IUnknown_AddRef(test_iface);
return IUnknown_Release(test_iface);
}
static void test_viewport_interfaces(void)
{
IDirectDraw4 *ddraw;
IDirect3D3 *d3d;
HRESULT hr, old_d3d_ref;
LONG ref;
IDirect3DViewport *viewport;
IDirect3DViewport2 *viewport2;
IDirect3DViewport3 *viewport3;
IDirectDrawGammaControl *gamma;
IUnknown *unknown;
if (!(ddraw = create_ddraw()))
{
skip("Failed to create ddraw object, skipping test.\n");
return;
}
hr = IDirectDraw4_QueryInterface(ddraw, &IID_IDirect3D3, (void **)&d3d);
ok(SUCCEEDED(hr) || hr == E_NOINTERFACE, "Failed to get d3d interface, hr %#x.\n", hr);
if (FAILED(hr))
{
skip("Direct3D not available, skipping tests\n");
IDirectDraw4_Release(ddraw);
return;
}
old_d3d_ref = get_refcount((IUnknown *)d3d);
hr = IDirect3D3_CreateViewport(d3d, &viewport3, NULL);
ok(SUCCEEDED(hr), "Failed to create viewport, hr %#x.\n", hr);
ref = get_refcount((IUnknown *)viewport3);
ok(ref == 1, "Initial IDirect3DViewport3 refcount is %d\n", ref);
ref = get_refcount((IUnknown *)d3d);
ok(ref == old_d3d_ref, "IDirect3D3 refcount is %d\n", ref);
gamma = (IDirectDrawGammaControl *)0xdeadbeef;
hr = IDirect3DViewport2_QueryInterface(viewport3, &IID_IDirectDrawGammaControl, (void **)&gamma);
ok(hr == E_NOINTERFACE, "Got unexpected hr %#x.\n", hr);
ok(gamma == NULL, "Interface not set to NULL by failed QI call: %p\n", gamma);
if (SUCCEEDED(hr)) IDirectDrawGammaControl_Release(gamma);
/* NULL iid: Segfaults */
hr = IDirect3DViewport3_QueryInterface(viewport3, &IID_IDirect3DViewport, (void **)&viewport);
ok(SUCCEEDED(hr), "Failed to QI IDirect3DViewport, hr %#x.\n", hr);
if (viewport)
{
ref = get_refcount((IUnknown *)viewport);
ok(ref == 2, "IDirect3DViewport refcount is %d\n", ref);
ref = get_refcount((IUnknown *)viewport3);
ok(ref == 2, "IDirect3DViewport3 refcount is %d\n", ref);
IDirect3DViewport_Release(viewport);
viewport = NULL;
}
hr = IDirect3DViewport3_QueryInterface(viewport3, &IID_IDirect3DViewport3, (void **)&viewport2);
ok(SUCCEEDED(hr), "Failed to QI IDirect3DViewport3, hr %#x.\n", hr);
if (viewport2)
{
ref = get_refcount((IUnknown *)viewport2);
ok(ref == 2, "IDirect3DViewport2 refcount is %d\n", ref);
ref = get_refcount((IUnknown *)viewport3);
ok(ref == 2, "IDirect3DViewport3 refcount is %d\n", ref);
IDirect3DViewport3_Release(viewport2);
}
hr = IDirect3DViewport3_QueryInterface(viewport2, &IID_IUnknown, (void **)&unknown);
ok(SUCCEEDED(hr), "Failed to QI IUnknown, hr %#x.\n", hr);
if (unknown)
{
ref = get_refcount((IUnknown *)viewport3);
ok(ref == 2, "IDirect3DViewport3 refcount is %d\n", ref);
ref = get_refcount(unknown);
ok(ref == 2, "IUnknown refcount is %d\n", ref);
IUnknown_Release(unknown);
}
IDirect3DViewport3_Release(viewport3);
IDirect3D3_Release(d3d);
IDirectDraw4_Release(ddraw);
}
START_TEST(ddraw4)
{
test_process_vertices();
@ -1319,4 +1406,5 @@ START_TEST(ddraw4)
test_coop_level_threaded();
test_depth_blit();
test_texture_load_ckey();
test_viewport_interfaces();
}

View File

@ -356,6 +356,9 @@ static void test_d3d_ifaces(void)
ref = getRefcount( (IUnknown *) DDraw1);
ok(ref == 1, "IDirectDraw reference count is %ld\n", ref);
/* FIXME: This test suggests that IDirect3D, IDirect3D2 and IDirect3D3 are linked
* to IDirectDraw. However, they are linked to whatever interface is used to QI the
* first IDirect3D? interface. If DDraw1 is replaced with DDraw4 here the tests break */
hr = IDirectDraw_QueryInterface(DDraw1, &IID_IDirect3D, (void **) &D3D1);
if (hr == E_NOINTERFACE) /* win64 */
{