ddraw/tests: Port D3D1_ViewportClearTest to ddraw1.c (v2).

This commit is contained in:
Stefan Dösinger 2015-02-16 19:10:41 +01:00 committed by Alexandre Julliard
parent e37272ee86
commit f64815e651
3 changed files with 134 additions and 289 deletions

View File

@ -6303,6 +6303,71 @@ static void test_texturemapblend(void)
DestroyWindow(window);
}
static void test_viewport_clear_rect(void)
{
HRESULT hr;
static D3DRECT clear_rect = {{0}, {0}, {640}, {480}};
static D3DRECT clear_rect2 = {{90}, {90}, {110}, {110}};
IDirectDrawSurface *rt;
HWND window;
IDirectDraw *ddraw;
IDirect3DDevice *device;
IDirect3DMaterial *red, *green;
IDirect3DViewport *viewport, *viewport2;
ULONG ref;
D3DCOLOR color;
window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
0, 0, 640, 480, 0, 0, 0, 0);
ddraw = create_ddraw();
ok(!!ddraw, "Failed to create a ddraw object.\n");
if (!(device = create_device(ddraw, window, DDSCL_NORMAL)))
{
skip("Failed to create a 3D device, skipping test.\n");
DestroyWindow(window);
IDirectDraw_Release(ddraw);
return;
}
hr = IDirect3DDevice_QueryInterface(device, &IID_IDirectDrawSurface, (void **)&rt);
ok(SUCCEEDED(hr), "Failed to get render target, hr %#x.\n", hr);
red = create_diffuse_material(device, 1.0f, 0.0f, 0.0f, 1.0f);
viewport = create_viewport(device, 0, 0, 640, 480);
viewport_set_background(device, viewport, red);
hr = IDirect3DViewport_Clear(viewport, 1, &clear_rect, D3DCLEAR_TARGET);
ok(SUCCEEDED(hr), "Failed to clear viewport, hr %#x.\n", hr);
green = create_diffuse_material(device, 0.0f, 1.0f, 0.0f, 1.0f);
viewport2 = create_viewport(device, 100, 100, 20, 20);
viewport_set_background(device, viewport2, green);
hr = IDirect3DViewport_Clear(viewport2, 1, &clear_rect2, D3DCLEAR_TARGET);
ok(SUCCEEDED(hr), "Failed to clear viewport, hr %#x.\n", hr);
color = get_surface_color(rt, 85, 85); /* Outside both. */
ok(compare_color(color, 0x00ff0000, 1), "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 95, 95); /* Outside vp, inside rect. */
/* AMD GPUs ignore the viewport dimensions and only care about the rectangle. */
ok(compare_color(color, 0x00ff0000, 1) || broken(compare_color(color, 0x0000ff00, 1)),
"Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 105, 105); /* Inside both. */
ok(compare_color(color, 0x0000ff00, 1), "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 115, 115); /* Inside vp, outside rect. */
ok(compare_color(color, 0x00ff0000, 1), "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 125, 125); /* Outside both. */
ok(compare_color(color, 0x00ff0000, 1), "Got unexpected color 0x%08x.\n", color);
destroy_viewport(device, viewport2);
destroy_material(green);
destroy_viewport(device, viewport);
destroy_material(red);
IDirectDrawSurface_Release(rt);
IDirect3DDevice_Release(device);
ref = IDirectDraw_Release(ddraw);
ok(ref == 0, "Ddraw object not properly released, refcount %u.\n", ref);
DestroyWindow(window);
}
START_TEST(ddraw1)
{
IDirectDraw *ddraw;
@ -6369,4 +6434,5 @@ START_TEST(ddraw1)
test_lost_device();
test_surface_desc_lock();
test_texturemapblend();
test_viewport_clear_rect();
}

View File

@ -7329,6 +7329,71 @@ static void test_texturemapblend(void)
DestroyWindow(window);
}
static void test_viewport_clear_rect(void)
{
HRESULT hr;
static D3DRECT clear_rect = {{0}, {0}, {640}, {480}};
static D3DRECT clear_rect2 = {{90}, {90}, {110}, {110}};
IDirectDrawSurface *rt;
HWND window;
IDirectDraw2 *ddraw;
IDirect3DDevice2 *device;
IDirect3DMaterial2 *red, *green;
IDirect3DViewport2 *viewport, *viewport2;
ULONG ref;
D3DCOLOR color;
window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
0, 0, 640, 480, 0, 0, 0, 0);
ddraw = create_ddraw();
ok(!!ddraw, "Failed to create a ddraw object.\n");
if (!(device = create_device(ddraw, window, DDSCL_NORMAL)))
{
skip("Failed to create a 3D device, skipping test.\n");
DestroyWindow(window);
IDirectDraw2_Release(ddraw);
return;
}
hr = IDirect3DDevice2_GetRenderTarget(device, &rt);
ok(SUCCEEDED(hr), "Failed to get render target, hr %#x.\n", hr);
red = create_diffuse_material(device, 1.0f, 0.0f, 0.0f, 1.0f);
viewport = create_viewport(device, 0, 0, 640, 480);
viewport_set_background(device, viewport, red);
hr = IDirect3DViewport2_Clear(viewport, 1, &clear_rect, D3DCLEAR_TARGET);
ok(SUCCEEDED(hr), "Failed to clear viewport, hr %#x.\n", hr);
green = create_diffuse_material(device, 0.0f, 1.0f, 0.0f, 1.0f);
viewport2 = create_viewport(device, 100, 100, 20, 20);
viewport_set_background(device, viewport2, green);
hr = IDirect3DViewport2_Clear(viewport2, 1, &clear_rect2, D3DCLEAR_TARGET);
ok(SUCCEEDED(hr), "Failed to clear viewport, hr %#x.\n", hr);
color = get_surface_color(rt, 85, 85); /* Outside both. */
ok(compare_color(color, 0x00ff0000, 1), "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 95, 95); /* Outside vp, inside rect. */
/* AMD GPUs ignore the viewport dimensions and only care about the rectangle. */
ok(compare_color(color, 0x00ff0000, 1) || broken(compare_color(color, 0x0000ff00, 1)),
"Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 105, 105); /* Inside both. */
ok(compare_color(color, 0x0000ff00, 1), "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 115, 115); /* Inside vp, outside rect. */
ok(compare_color(color, 0x00ff0000, 1), "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 125, 125); /* Outside both. */
ok(compare_color(color, 0x00ff0000, 1), "Got unexpected color 0x%08x.\n", color);
destroy_viewport(device, viewport2);
destroy_material(green);
destroy_viewport(device, viewport);
destroy_material(red);
IDirectDrawSurface_Release(rt);
IDirect3DDevice2_Release(device);
ref = IDirectDraw2_Release(ddraw);
ok(ref == 0, "Ddraw object not properly released, refcount %u.\n", ref);
DestroyWindow(window);
}
START_TEST(ddraw2)
{
IDirectDraw2 *ddraw;
@ -7401,4 +7466,5 @@ START_TEST(ddraw2)
test_lost_device();
test_surface_desc_lock();
test_texturemapblend();
test_viewport_clear_rect();
}

View File

@ -40,13 +40,6 @@ static IDirectDrawSurface7 *depth_buffer;
static IDirect3D7 *Direct3D;
static IDirect3DDevice7 *Direct3DDevice;
static IDirectDraw *DirectDraw1;
static IDirectDrawSurface *Surface1;
static IDirect3D *Direct3D1;
static IDirect3DDevice *Direct3DDevice1;
static IDirect3DExecuteBuffer *ExecuteBuffer;
static IDirect3DViewport *Viewport;
static BOOL refdevice = FALSE;
static HRESULT (WINAPI *pDirectDrawCreateEx)(GUID *driver_guid,
@ -1151,281 +1144,6 @@ static void rhw_zero_test(IDirect3DDevice7 *device)
ok(color == 0, "Got color %08x, expected 00000000\n", color);
}
static BOOL D3D1_createObjects(void)
{
WNDCLASSA wc = {0};
HRESULT hr;
DDSURFACEDESC ddsd;
D3DEXECUTEBUFFERDESC exdesc;
D3DVIEWPORT vp_data;
/* An IDirect3DDevice cannot be queryInterfaced from an IDirect3DDevice7 on windows */
hr = DirectDrawCreate(NULL, &DirectDraw1, NULL);
ok(hr==DD_OK || hr==DDERR_NODIRECTDRAWSUPPORT, "DirectDrawCreate returned: %x\n", hr);
if (FAILED(hr)) {
return FALSE;
}
wc.lpfnWndProc = DefWindowProcA;
wc.lpszClassName = "texturemapblend_test_wc";
RegisterClassA(&wc);
window = CreateWindowA("texturemapblend_test_wc", "texturemapblend_test",
WS_MAXIMIZE | WS_VISIBLE | WS_CAPTION, 0, 0, 640, 480, 0, 0, 0, 0);
hr = IDirectDraw_SetCooperativeLevel(DirectDraw1, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
ok(hr==DD_OK, "SetCooperativeLevel returned: %x\n", hr);
if(FAILED(hr)) {
return FALSE;
}
hr = IDirectDraw_SetDisplayMode(DirectDraw1, 640, 480, 32);
if(FAILED(hr)) {
/* 24 bit is fine too */
hr = IDirectDraw_SetDisplayMode(DirectDraw1, 640, 480, 24);
}
ok(hr==DD_OK || hr == DDERR_UNSUPPORTED, "SetDisplayMode returned: %x\n", hr);
if (FAILED(hr)) {
return FALSE;
}
hr = IDirectDraw_QueryInterface(DirectDraw1, &IID_IDirect3D, (void**) &Direct3D1);
ok(hr==DD_OK, "QueryInterface returned: %x\n", hr);
if (FAILED(hr)) {
return FALSE;
}
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE;
hr = IDirectDraw_CreateSurface(DirectDraw1, &ddsd, &Surface1, NULL);
ok(hr==DD_OK, "CreateSurface returned: %x\n", hr);
if (FAILED(hr)) {
return FALSE;
}
hr = IDirectDrawSurface_QueryInterface(Surface1, &IID_IDirect3DHALDevice, (void **) &Direct3DDevice1);
if(FAILED(hr)) {
trace("Creating a HAL device failed, trying Ref\n");
hr = IDirectDrawSurface_QueryInterface(Surface1, &IID_IDirect3DRefDevice, (void **) &Direct3DDevice1);
}
ok(hr==D3D_OK, "Creating 3D device returned: %x\n", hr);
if(FAILED(hr)) {
return FALSE;
}
hr = IDirect3D_CreateViewport(Direct3D1, &Viewport, NULL);
ok(hr == D3D_OK, "IDirect3D_CreateViewport failed: %08x\n", hr);
if (FAILED(hr)) {
return FALSE;
}
hr = IDirect3DViewport_Initialize(Viewport, Direct3D1);
ok(hr == D3D_OK || hr == DDERR_ALREADYINITIALIZED, "IDirect3DViewport_Initialize returned %08x\n", hr);
hr = IDirect3DDevice_AddViewport(Direct3DDevice1, Viewport);
ok(hr == D3D_OK, "IDirect3DDevice_AddViewport returned %08x\n", hr);
vp_data.dwSize = sizeof(vp_data);
vp_data.dwX = 0;
vp_data.dwY = 0;
vp_data.dwWidth = 640;
vp_data.dwHeight = 480;
vp_data.dvScaleX = 1;
vp_data.dvScaleY = 1;
vp_data.dvMaxX = 640;
vp_data.dvMaxY = 480;
vp_data.dvMinZ = 0;
vp_data.dvMaxZ = 1;
hr = IDirect3DViewport_SetViewport(Viewport, &vp_data);
ok(hr == D3D_OK, "IDirect3DViewport_SetViewport returned %08x\n", hr);
memset(&exdesc, 0, sizeof(D3DEXECUTEBUFFERDESC));
exdesc.dwSize = sizeof(D3DEXECUTEBUFFERDESC);
exdesc.dwFlags = D3DDEB_BUFSIZE | D3DDEB_CAPS;
exdesc.dwBufferSize = 512;
exdesc.dwCaps = D3DDEBCAPS_SYSTEMMEMORY;
hr = IDirect3DDevice_CreateExecuteBuffer(Direct3DDevice1, &exdesc, &ExecuteBuffer, NULL);
ok(hr == D3D_OK, "IDirect3DDevice_CreateExecuteBuffer failed with %08x\n", hr);
if (FAILED(hr)) {
return FALSE;
}
return TRUE;
}
static void D3D1_releaseObjects(void)
{
if(ExecuteBuffer) IDirect3DExecuteBuffer_Release(ExecuteBuffer);
if(Surface1) IDirectDrawSurface_Release(Surface1);
if(Viewport) IDirect3DViewport_Release(Viewport);
if(Direct3DDevice1) IDirect3DDevice_Release(Direct3DDevice1);
if(Direct3D1) IDirect3D_Release(Direct3D1);
if(DirectDraw1) IDirectDraw_Release(DirectDraw1);
if(window) DestroyWindow(window);
}
static DWORD D3D1_getPixelColor(IDirectDraw *DirectDraw1, IDirectDrawSurface *Surface, UINT x, UINT y)
{
DWORD ret;
HRESULT hr;
DDSURFACEDESC ddsd;
RECT rectToLock = {x, y, x+1, y+1};
IDirectDrawSurface *surf = NULL;
/* Some implementations seem to dislike direct locking on the front buffer. Thus copy the front buffer
* to an offscreen surface and lock it instead of the front buffer
*/
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat);
ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
ddsd.dwWidth = 640;
ddsd.dwHeight = 480;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
hr = IDirectDraw_CreateSurface(DirectDraw1, &ddsd, &surf, NULL);
ok(hr == DD_OK, "IDirectDraw_CreateSurface failed with %08x\n", hr);
if(!surf)
{
trace("cannot create helper surface\n");
return 0xdeadbeef;
}
memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat);
hr = IDirectDrawSurface_BltFast(surf, 0, 0, Surface, NULL, 0);
ok(hr == DD_OK, "IDirectDrawSurface_BltFast returned %08x\n", hr);
if(FAILED(hr))
{
trace("Cannot blit\n");
ret = 0xdeadbee;
goto out;
}
hr = IDirectDrawSurface_Lock(surf, &rectToLock, &ddsd, DDLOCK_READONLY | DDLOCK_WAIT, NULL);
if(FAILED(hr))
{
trace("Can't lock the offscreen surface, hr=%08x\n", hr);
ret = 0xdeadbeec;
goto out;
}
/* Remove the X channel for now. DirectX and OpenGL have different ideas how to treat it apparently, and it isn't
* really important for these tests
*/
ret = ((DWORD *) ddsd.lpSurface)[0] & 0x00ffffff;
hr = IDirectDrawSurface_Unlock(surf, NULL);
if(FAILED(hr))
{
trace("Can't unlock the offscreen surface, hr=%08x\n", hr);
}
out:
IDirectDrawSurface_Release(surf);
return ret;
}
static void D3D1_ViewportClearTest(void)
{
HRESULT hr;
IDirect3DMaterial *bgMaterial = NULL;
D3DMATERIAL mat;
D3DMATERIALHANDLE hMat;
D3DVIEWPORT vp_data;
IDirect3DViewport *Viewport2 = NULL;
DWORD color, red, green, blue;
hr = IDirect3D_CreateMaterial(Direct3D1, &bgMaterial, NULL);
ok(hr == D3D_OK, "IDirect3D_CreateMaterial failed: %08x\n", hr);
if (FAILED(hr)) {
goto out;
}
hr = IDirect3D_CreateViewport(Direct3D1, &Viewport2, NULL);
ok(hr == D3D_OK, "IDirect3D_CreateViewport failed: %08x\n", hr);
if (FAILED(hr)) {
goto out;
}
hr = IDirect3DViewport_Initialize(Viewport2, Direct3D1);
ok(hr == D3D_OK || hr == DDERR_ALREADYINITIALIZED, "IDirect3DViewport_Initialize returned %08x\n", hr);
hr = IDirect3DDevice_AddViewport(Direct3DDevice1, Viewport2);
ok(hr == D3D_OK, "IDirect3DDevice_AddViewport returned %08x\n", hr);
vp_data.dwSize = sizeof(vp_data);
vp_data.dwX = 200;
vp_data.dwY = 200;
vp_data.dwWidth = 100;
vp_data.dwHeight = 100;
vp_data.dvScaleX = 1;
vp_data.dvScaleY = 1;
vp_data.dvMaxX = 100;
vp_data.dvMaxY = 100;
vp_data.dvMinZ = 0;
vp_data.dvMaxZ = 1;
hr = IDirect3DViewport_SetViewport(Viewport2, &vp_data);
ok(hr == D3D_OK, "IDirect3DViewport_SetViewport returned %08x\n", hr);
memset(&mat, 0, sizeof(mat));
mat.dwSize = sizeof(mat);
U1(U(mat).diffuse).r = 1.0f;
hr = IDirect3DMaterial_SetMaterial(bgMaterial, &mat);
ok(hr == D3D_OK, "IDirect3DMaterial_SetMaterial failed: %08x\n", hr);
hr = IDirect3DMaterial_GetHandle(bgMaterial, Direct3DDevice1, &hMat);
ok(hr == D3D_OK, "IDirect3DMaterial_GetHandle failed: %08x\n", hr);
hr = IDirect3DViewport_SetBackground(Viewport, hMat);
ok(hr == D3D_OK, "IDirect3DViewport_SetBackground failed: %08x\n", hr);
hr = IDirect3DViewport_SetBackground(Viewport2, hMat);
ok(hr == D3D_OK, "IDirect3DViewport_SetBackground failed: %08x\n", hr);
hr = IDirect3DDevice_BeginScene(Direct3DDevice1);
ok(hr == D3D_OK, "IDirect3DDevice_BeginScene failed with %08x\n", hr);
if (SUCCEEDED(hr)) {
D3DRECT rect;
U1(rect).x1 = U2(rect).y1 = 0;
U3(rect).x2 = 640;
U4(rect).y2 = 480;
hr = IDirect3DViewport_Clear(Viewport, 1, &rect, D3DCLEAR_TARGET);
ok(hr == D3D_OK, "IDirect3DViewport_Clear failed: %08x\n", hr);
memset(&mat, 0, sizeof(mat));
mat.dwSize = sizeof(mat);
U3(U(mat).diffuse).b = 1.0f;
hr = IDirect3DMaterial_SetMaterial(bgMaterial, &mat);
ok(hr == D3D_OK, "IDirect3DMaterial_SetMaterial failed: %08x\n", hr);
hr = IDirect3DViewport_Clear(Viewport2, 1, &rect, D3DCLEAR_TARGET);
ok(hr == D3D_OK, "IDirect3DViewport_Clear failed: %08x\n", hr);
hr = IDirect3DDevice_EndScene(Direct3DDevice1);
ok(hr == D3D_OK, "IDirect3DDevice_EndScene failed, hr = %08x\n", hr);
}
color = D3D1_getPixelColor(DirectDraw1, Surface1, 5, 5);
red = (color & 0x00ff0000) >> 16;
green = (color & 0x0000ff00) >> 8;
blue = (color & 0x000000ff);
ok((red == 0xff && green == 0 && blue == 0) ||
broken(red == 0 && green == 0 && blue == 0xff), /* VMware and some native boxes */
"Got color %08x, expected 00ff0000\n", color);
color = D3D1_getPixelColor(DirectDraw1, Surface1, 205, 205);
red = (color & 0x00ff0000) >> 16;
green = (color & 0x0000ff00) >> 8;
blue = (color & 0x000000ff);
ok(red == 0 && green == 0 && blue == 0xff, "Got color %08x, expected 000000ff\n", color);
out:
if (bgMaterial) IDirect3DMaterial_Release(bgMaterial);
if (Viewport2) IDirect3DViewport_Release(Viewport2);
}
static DWORD D3D3_getPixelColor(IDirectDraw4 *DirectDraw, IDirectDrawSurface4 *Surface, UINT x, UINT y)
{
DWORD ret;
@ -1783,6 +1501,8 @@ static void p8_primary_test(void)
RECT rect;
DDCOLORKEY clrKey;
unsigned differences;
IDirectDraw *DirectDraw1;
IDirectDrawSurface *Surface1;
/* An IDirect3DDevice cannot be queryInterfaced from an IDirect3DDevice7 on windows */
hr = DirectDrawCreate(NULL, &DirectDraw1, NULL);
@ -2545,13 +2265,6 @@ START_TEST(visual)
releaseObjects(); /* release DX7 interfaces to test D3D1 */
if(!D3D1_createObjects())
skip("Cannot initialize D3D1, skipping\n");
else
D3D1_ViewportClearTest();
D3D1_releaseObjects();
D3D3_ViewportClearTest();
p8_primary_test();
DX1_BackBufferFlipTest();