d3d8: Read the backbuffer in the visual test.

This commit is contained in:
Stefan Dösinger 2009-11-07 16:39:03 +01:00 committed by Alexandre Julliard
parent 267e890220
commit 18c1d6033a

View File

@ -53,13 +53,13 @@ static BOOL color_match(D3DCOLOR c1, D3DCOLOR c2, BYTE max_diff)
static DWORD getPixelColor(IDirect3DDevice8 *device, UINT x, UINT y)
{
DWORD ret;
IDirect3DSurface8 *surf;
IDirect3DTexture8 *tex;
IDirect3DTexture8 *tex = NULL;
IDirect3DSurface8 *surf = NULL, *backbuf = NULL;
HRESULT hr;
D3DLOCKED_RECT lockedRect;
RECT rectToLock = {x, y, x+1, y+1};
hr = IDirect3DDevice8_CreateTexture(device, 640, 480, 1 /* Levels */, 0 /* usage */, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &tex);
hr = IDirect3DDevice8_CreateTexture(device, 640, 480, 1 /* Levels */, 0, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &tex);
if(FAILED(hr) || !tex ) /* This is not a test */
{
trace("Can't create an offscreen plain surface to read the render target data, hr=%#08x\n", hr);
@ -73,19 +73,26 @@ static DWORD getPixelColor(IDirect3DDevice8 *device, UINT x, UINT y)
goto out;
}
hr = IDirect3DDevice8_GetFrontBuffer(device, surf);
hr = IDirect3DDevice8_GetRenderTarget(device, &backbuf);
if(FAILED(hr))
{
trace("Can't read the front buffer data, hr=%#08x\n", hr);
trace("Can't get the render target, hr=%#08x\n", hr);
ret = 0xdeadbeed;
goto out;
}
hr = IDirect3DDevice8_CopyRects(device, backbuf, NULL, 0, surf, NULL);
if(FAILED(hr))
{
trace("Can't read the render target, hr=%#08x\n", hr);
ret = 0xdeadbeec;
goto out;
}
hr = IDirect3DSurface8_LockRect(surf, &lockedRect, &rectToLock, D3DLOCK_READONLY);
if(FAILED(hr))
{
trace("Can't lock the offscreen surface, hr=%#08x\n", hr);
ret = 0xdeadbeec;
ret = 0xdeadbeeb;
goto out;
}
/* Remove the X channel for now. DirectX and OpenGL have different ideas how to treat it apparently, and it isn't
@ -99,6 +106,7 @@ static DWORD getPixelColor(IDirect3DDevice8 *device, UINT x, UINT y)
}
out:
if(backbuf) IDirect3DSurface8_Release(backbuf);
if(surf) IDirect3DSurface8_Release(surf);
if(tex) IDirect3DTexture8_Release(tex);
return ret;
@ -260,8 +268,6 @@ static void lighting_test(IDirect3DDevice8 *device)
ok(hr == D3D_OK, "IDirect3DDevice8_EndScene failed with %#08x\n", hr);
}
IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
color = getPixelColor(device, 160, 360); /* lower left quad - unlit without normals */
ok(color == 0x00ff0000, "Unlit quad without normals has color %08x\n", color);
color = getPixelColor(device, 160, 120); /* upper left quad - lit without normals */
@ -271,6 +277,8 @@ static void lighting_test(IDirect3DDevice8 *device)
color = getPixelColor(device, 480, 120); /* upper left quad - lit width normals */
ok(color == 0x00000000, "Lit quad width normals has color %08x\n", color);
IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
hr = IDirect3DDevice8_SetRenderState(device, D3DRS_LIGHTING, FALSE);
ok(hr == D3D_OK, "IDirect3DDevice8_SetRenderState returned %#08x\n", hr);
}
@ -311,8 +319,6 @@ static void clear_test(IDirect3DDevice8 *device)
hr = IDirect3DDevice8_Clear(device, 1, &rect_negneg, D3DCLEAR_TARGET, 0xff00ff00, 0.0, 0);
ok(hr == D3D_OK, "IDirect3DDevice8_Clear failed with %#08x\n", hr);
IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
color = getPixelColor(device, 160, 360); /* lower left quad */
ok(color == 0x00ffffff, "Clear rectangle 3(pos, neg) has color %08x\n", color);
color = getPixelColor(device, 160, 120); /* upper left quad */
@ -321,6 +327,8 @@ static void clear_test(IDirect3DDevice8 *device)
ok(color == 0x00ffffff, "Clear rectangle 4(NULL) has color %08x\n", color);
color = getPixelColor(device, 480, 120); /* upper right quad */
ok(color == 0x00ffffff, "Clear rectangle 4(neg, neg) has color %08x\n", color);
IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
}
struct sVertex {
@ -443,7 +451,6 @@ static void fog_test(IDirect3DDevice8 *device)
ok(FALSE, "BeginScene failed\n");
}
IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
color = getPixelColor(device, 160, 360);
ok(color == 0x00FF0000, "Untransformed vertex with no table or vertex fog has color %08x\n", color);
color = getPixelColor(device, 160, 120);
@ -453,6 +460,8 @@ static void fog_test(IDirect3DDevice8 *device)
color = getPixelColor(device, 480, 360);
ok(color == 0x0000FF00, "Transformed vertex with linear table fog has color %08x\n", color);
IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
/* Turn off the fog master switch to avoid confusing other tests */
hr = IDirect3DDevice8_SetRenderState(device, D3DRS_FOGENABLE, FALSE);
ok(hr == D3D_OK, "Turning off fog calculations returned %#08x\n", hr);
@ -504,12 +513,13 @@ static void present_test(IDirect3DDevice8 *device)
hr = IDirect3DDevice8_SetRenderState(device, D3DRS_ZENABLE, D3DZB_FALSE);
ok(hr == D3D_OK, "IDirect3DDevice8_SetRenderState returned %08x\n", hr);
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Present failed (%#08x)\n", hr);
color = getPixelColor(device, 512, 240);
ok(color == 0x00ffffff, "Present failed: Got color 0x%08x, expected 0x00ffffff.\n", color);
color = getPixelColor(device, 64, 240);
ok(color == 0x00ff0000, "Present failed: Got color 0x%08x, expected 0x00ff0000.\n", color);
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Present failed (%#08x)\n", hr);
}
static void test_rcp_rsq(IDirect3DDevice8 *device)
@ -580,8 +590,6 @@ static void test_rcp_rsq(IDirect3DDevice8 *device)
ok(hr == D3D_OK, "IDirect3DDevice8_EndScene returned %#08x\n", hr);
}
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Present failed (%#08x)\n", hr);
color = getPixelColor(device, 320, 240);
c1 = (color & 0x00ff0000 )>> 16;
c2 = (color & 0x0000ff00 )>> 8;
@ -590,6 +598,9 @@ static void test_rcp_rsq(IDirect3DDevice8 *device)
c1, c2, c3);
ok(c1 >= 0x7c && c1 <= 0x84, "Color component value is %02x\n", c1);
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Present failed (%#08x)\n", hr);
IDirect3DDevice8_SetVertexShader(device, 0);
IDirect3DDevice8_DeleteVertexShader(device, shader);
@ -613,8 +624,6 @@ static void test_rcp_rsq(IDirect3DDevice8 *device)
ok(hr == D3D_OK, "IDirect3DDevice8_EndScene returned %#08x\n", hr);
}
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Present failed (%#08x)\n", hr);
color = getPixelColor(device, 320, 240);
c1 = (color & 0x00ff0000 )>> 16;
c2 = (color & 0x0000ff00 )>> 8;
@ -623,6 +632,9 @@ static void test_rcp_rsq(IDirect3DDevice8 *device)
c1, c2, c3);
ok(c1 >= 0xb0 && c1 <= 0xb8, "Color component value is %02x\n", c1);
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Present failed (%#08x)\n", hr);
IDirect3DDevice8_SetVertexShader(device, 0);
IDirect3DDevice8_DeleteVertexShader(device, shader);
}
@ -707,8 +719,6 @@ static void offscreen_test(IDirect3DDevice8 *device)
IDirect3DDevice8_EndScene(device);
}
IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
/* Center quad - should be white */
color = getPixelColor(device, 320, 240);
ok(color == 0x00ffffff, "Offscreen failed: Got color 0x%08x, expected 0x00ffffff.\n", color);
@ -727,6 +737,8 @@ static void offscreen_test(IDirect3DDevice8 *device)
ok(color == 0x00ff0000, "Offscreen failed: Got color 0x%08x, expected 0x00ff0000.\n", color);
}
IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
out:
hr = IDirect3DDevice8_SetTexture(device, 0, NULL);
ok(SUCCEEDED(hr), "IDirect3DDevice8_SetTexture returned %#x.\n", hr);
@ -874,8 +886,6 @@ static void alpha_test(IDirect3DDevice8 *device)
ok(hr == D3D_OK, "IDirect3DDevice7_EndScene failed, hr = %08x\n", hr);
}
IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
color = getPixelColor(device, 160, 360);
ok(color_match(color, D3DCOLOR_ARGB(0x00, 0xbf, 0x40, 0x00), 1),
"SRCALPHA on frame buffer returned color %08x, expected 0x00bf4000\n", color);
@ -892,6 +902,8 @@ static void alpha_test(IDirect3DDevice8 *device)
ok(color_match(color, D3DCOLOR_ARGB(0x00, 0x00, 0x00, 0xff), 1),
"DSTALPHA on texture returned color %08x, expected 0x000000ff\n", color);
IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
out:
/* restore things */
if(backbuffer) {
@ -1029,9 +1041,6 @@ static void p8_texture_test(IDirect3DDevice8 *device)
ok(hr == D3D_OK, "IDirect3DDevice8_EndScene failed, hr = %08x\n", hr);
}
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(hr == D3D_OK, "IDirect3DDevice8_Present failed, hr = %08x\n", hr);
color = getPixelColor(device, 32, 32);
red = (color & 0x00ff0000) >> 16;
green = (color & 0x0000ff00) >> 8;
@ -1046,6 +1055,9 @@ static void p8_texture_test(IDirect3DDevice8 *device)
ok(red == 0 && blue == 0xff && green == 0,
"got color %08x, expected 0x000000ff\n", color);
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(hr == D3D_OK, "IDirect3DDevice8_Present failed, hr = %08x\n", hr);
hr = IDirect3DDevice8_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xff000000, 0.0, 0);
ok(hr == D3D_OK, "IDirect3DDevice8_Clear failed, hr = %08x\n", hr);
@ -1062,8 +1074,6 @@ static void p8_texture_test(IDirect3DDevice8 *device)
ok(hr == D3D_OK, "IDirect3DDevice8_EndScene failed, hr = %08x\n", hr);
}
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(hr == D3D_OK, "IDirect3DDevice8_Present failed, hr = %08x\n", hr);
color = getPixelColor(device, 32, 32);
red = (color & 0x00ff0000) >> 16;
@ -1072,6 +1082,9 @@ static void p8_texture_test(IDirect3DDevice8 *device)
ok(red == 0 && blue == 0xff && green == 0,
"got color %08x, expected 0x000000ff\n", color);
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(hr == D3D_OK, "IDirect3DDevice8_Present failed, hr = %08x\n", hr);
/* Test palettes with alpha */
IDirect3DDevice8_GetDeviceCaps(device, &caps);
if (!(caps.TextureCaps & D3DPTEXTURECAPS_ALPHAPALETTE)) {
@ -1125,9 +1138,6 @@ static void p8_texture_test(IDirect3DDevice8 *device)
ok(hr == D3D_OK, "IDirect3DDevice8_EndScene failed, hr = %08x\n", hr);
}
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(hr == D3D_OK, "IDirect3DDevice8_Present failed, hr = %08x\n", hr);
color = getPixelColor(device, 32, 32);
red = (color & 0x00ff0000) >> 16;
green = (color & 0x0000ff00) >> 8;
@ -1141,6 +1151,9 @@ static void p8_texture_test(IDirect3DDevice8 *device)
blue = (color & 0x000000ff) >> 0;
ok(red == 0 && blue >= 0x7e && blue <= 0x81 && green == 0,
"got color %08x, expected 0x00000080 or near\n", color);
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(hr == D3D_OK, "IDirect3DDevice8_Present failed, hr = %08x\n", hr);
}
hr = IDirect3DDevice8_SetTexture(device, 0, NULL);
@ -1186,8 +1199,10 @@ static void texop_test(IDirect3DDevice8 *device)
{D3DTOP_MODULATE2X, "MODULATE2X", D3DTEXOPCAPS_MODULATE2X, D3DCOLOR_ARGB(0x00, 0x00, 0x66, 0x00)},
{D3DTOP_MODULATE4X, "MODULATE4X", D3DTEXOPCAPS_MODULATE4X, D3DCOLOR_ARGB(0x00, 0x00, 0xcc, 0x00)},
{D3DTOP_ADD, "ADD", D3DTEXOPCAPS_ADD, D3DCOLOR_ARGB(0x00, 0x33, 0xff, 0x33)},
{D3DTOP_ADDSIGNED, "ADDSIGNED", D3DTEXOPCAPS_ADDSIGNED, D3DCOLOR_ARGB(0x00, 0x00, 0xb2, 0x00)},
{D3DTOP_ADDSIGNED2X, "ADDSIGNED2X", D3DTEXOPCAPS_ADDSIGNED2X, D3DCOLOR_ARGB(0x00, 0x00, 0xff, 0x00)},
{D3DTOP_SUBTRACT, "SUBTRACT", D3DTEXOPCAPS_SUBTRACT, D3DCOLOR_ARGB(0x00, 0x00, 0xcc, 0x00)},
{D3DTOP_ADDSMOOTH, "ADDSMOOTH", D3DTEXOPCAPS_ADDSMOOTH, D3DCOLOR_ARGB(0x00, 0x33, 0xff, 0x33)},
{D3DTOP_BLENDDIFFUSEALPHA, "BLENDDIFFUSEALPHA", D3DTEXOPCAPS_BLENDDIFFUSEALPHA, D3DCOLOR_ARGB(0x00, 0x22, 0x77, 0x22)},
@ -1262,12 +1277,15 @@ static void texop_test(IDirect3DDevice8 *device)
hr = IDirect3DDevice8_EndScene(device);
ok(SUCCEEDED(hr), "EndScene failed with 0x%08x\n", hr);
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Present failed with 0x%08x\n", hr);
color = getPixelColor(device, 320, 240);
ok(color_match(color, test_data[i].result, 3), "Operation %s returned color 0x%08x, expected 0x%08x\n",
test_data[i].name, color, test_data[i].result);
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Present failed with 0x%08x\n", hr);
hr = IDirect3DDevice8_Clear(device, 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
ok(SUCCEEDED(hr), "IDirect3DDevice9_Clear failed with 0x%08x\n", hr);
}
if (texture) IDirect3DTexture8_Release(texture);
@ -1303,7 +1321,6 @@ START_TEST(visual)
skip("Clear failed, can't assure correctness of the test results\n");
goto cleanup;
}
IDirect3DDevice8_Present(device_ptr, NULL, NULL, NULL, NULL);
color = getPixelColor(device_ptr, 1, 1);
if(color !=0x00ff0000)
@ -1311,6 +1328,7 @@ START_TEST(visual)
skip("Sanity check returned an incorrect color(%08x), can't assure the correctness of the tests\n", color);
goto cleanup;
}
IDirect3DDevice8_Present(device_ptr, NULL, NULL, NULL, NULL);
hr = IDirect3DDevice8_Clear(device_ptr, 0, NULL, D3DCLEAR_TARGET, 0xff00ddee, 0.0, 0);
if(FAILED(hr))
@ -1318,7 +1336,6 @@ START_TEST(visual)
skip("Clear failed, can't assure correctness of the test results\n");
goto cleanup;
}
IDirect3DDevice8_Present(device_ptr, NULL, NULL, NULL, NULL);
color = getPixelColor(device_ptr, 639, 479);
if(color != 0x0000ddee)
@ -1326,6 +1343,7 @@ START_TEST(visual)
skip("Sanity check returned an incorrect color(%08x), can't assure the correctness of the tests\n", color);
goto cleanup;
}
IDirect3DDevice8_Present(device_ptr, NULL, NULL, NULL, NULL);
/* Now run the real test */
lighting_test(device_ptr);