ddraw/tests: Extend p8_primary_test.
Additional tests for blitting and locking.
This commit is contained in:
parent
cf9d3e3a00
commit
18b9c2bb83
|
@ -1733,7 +1733,7 @@ static void p8_surface_fill_rect(IDirectDrawSurface *dest, UINT x, UINT y, UINT
|
||||||
hr = IDirectDrawSurface_Lock(dest, NULL, &ddsd, DDLOCK_WRITEONLY | DDLOCK_WAIT, NULL);
|
hr = IDirectDrawSurface_Lock(dest, NULL, &ddsd, DDLOCK_WRITEONLY | DDLOCK_WAIT, NULL);
|
||||||
ok(hr==DD_OK, "IDirectDrawSurface_Lock returned: %x\n", hr);
|
ok(hr==DD_OK, "IDirectDrawSurface_Lock returned: %x\n", hr);
|
||||||
|
|
||||||
p = (BYTE *)ddsd.lpSurface + ddsd.lPitch * y;
|
p = (BYTE *)ddsd.lpSurface + ddsd.lPitch * y + x;
|
||||||
|
|
||||||
for (i = 0; i < h; i++) {
|
for (i = 0; i < h; i++) {
|
||||||
for (i1 = 0; i1 < w; i1++) {
|
for (i1 = 0; i1 < w; i1++) {
|
||||||
|
@ -1785,12 +1785,14 @@ static void p8_primary_test()
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
PALETTEENTRY entries[256];
|
PALETTEENTRY entries[256];
|
||||||
RGBQUAD coltable[256];
|
RGBQUAD coltable[256];
|
||||||
UINT i;
|
UINT i, i1, i2;
|
||||||
IDirectDrawPalette *ddprimpal = NULL;
|
IDirectDrawPalette *ddprimpal = NULL;
|
||||||
IDirectDrawSurface *offscreen = NULL;
|
IDirectDrawSurface *offscreen = NULL;
|
||||||
WNDCLASS wc = {0};
|
WNDCLASS wc = {0};
|
||||||
DDBLTFX ddbltfx;
|
DDBLTFX ddbltfx;
|
||||||
COLORREF color;
|
COLORREF color;
|
||||||
|
RECT rect;
|
||||||
|
unsigned differences;
|
||||||
|
|
||||||
/* An IDirect3DDevice cannot be queryInterfaced from an IDirect3DDevice7 on windows */
|
/* An IDirect3DDevice cannot be queryInterfaced from an IDirect3DDevice7 on windows */
|
||||||
hr = DirectDrawCreate(NULL, &DirectDraw1, NULL);
|
hr = DirectDrawCreate(NULL, &DirectDraw1, NULL);
|
||||||
|
@ -1917,6 +1919,107 @@ static void p8_primary_test()
|
||||||
"got R %02X G %02X B %02X, expected R 00 G FF B 00\n",
|
"got R %02X G %02X B %02X, expected R 00 G FF B 00\n",
|
||||||
GetRValue(color), GetGValue(color), GetBValue(color));
|
GetRValue(color), GetGValue(color), GetBValue(color));
|
||||||
|
|
||||||
|
/* Test blitting and locking patterns that are likely to trigger bugs in opengl renderer (p8
|
||||||
|
surface conversion and uploading/downloading to/from opengl texture). Similar patterns (
|
||||||
|
blitting front buffer areas to/from an offscreen surface mixed with locking) are used by C&C
|
||||||
|
Red Alert I. */
|
||||||
|
IDirectDrawSurface_Release(offscreen);
|
||||||
|
|
||||||
|
memset (&ddsd, 0, sizeof (ddsd));
|
||||||
|
ddsd.dwSize = sizeof (ddsd);
|
||||||
|
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
|
||||||
|
ddsd.dwWidth = 640;
|
||||||
|
ddsd.dwHeight = 480;
|
||||||
|
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
|
||||||
|
ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat);
|
||||||
|
ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_PALETTEINDEXED8;
|
||||||
|
U1(ddsd.ddpfPixelFormat).dwRGBBitCount = 8;
|
||||||
|
hr = IDirectDraw_CreateSurface(DirectDraw1, &ddsd, &offscreen, NULL);
|
||||||
|
ok(hr == DD_OK, "IDirectDraw_CreateSurface returned %08x\n", hr);
|
||||||
|
|
||||||
|
if (FAILED(hr)) goto out;
|
||||||
|
|
||||||
|
/* Test two times, first time front buffer has a palette and second time front buffer
|
||||||
|
has no palette; the latter is somewhat contrived example, but an app could set
|
||||||
|
front buffer palette later. */
|
||||||
|
for (i2 = 0; i2 < 2; i2++) {
|
||||||
|
if (i2 == 1) {
|
||||||
|
hr = IDirectDrawSurface_SetPalette(Surface1, NULL);
|
||||||
|
ok(hr==DD_OK, "IDirectDrawSurface_SetPalette returned: %x\n", hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&ddsd, 0, sizeof(ddsd));
|
||||||
|
ddsd.dwSize = sizeof(ddsd);
|
||||||
|
hr = IDirectDrawSurface_Lock(Surface1, NULL, &ddsd, DDLOCK_WAIT, NULL);
|
||||||
|
ok(hr==DD_OK, "IDirectDrawSurface_Lock returned: %x\n", hr);
|
||||||
|
|
||||||
|
for (i = 0; i < 256; i++) {
|
||||||
|
unsigned x = (i % 128) * 4;
|
||||||
|
unsigned y = (i / 128) * 4;
|
||||||
|
BYTE *p = (BYTE *)ddsd.lpSurface + ddsd.lPitch * y + x;
|
||||||
|
|
||||||
|
for (i1 = 0; i1 < 4; i1++) {
|
||||||
|
p[0] = p[1] = p[2] = p[3] = i;
|
||||||
|
p += ddsd.lPitch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = IDirectDrawSurface_Unlock(Surface1, NULL);
|
||||||
|
ok(hr==DD_OK, "IDirectDrawSurface_UnLock returned: %x\n", hr);
|
||||||
|
|
||||||
|
hr = IDirectDrawSurface_BltFast(offscreen, 0, 0, Surface1, NULL, 0);
|
||||||
|
ok(hr==DD_OK, "IDirectDrawSurface_BltFast returned: %x\n", hr);
|
||||||
|
|
||||||
|
/* This ensures offscreen surface contens will be downloaded to system memory. */
|
||||||
|
memset(&ddsd, 0, sizeof(ddsd));
|
||||||
|
ddsd.dwSize = sizeof(ddsd);
|
||||||
|
hr = IDirectDrawSurface_Lock(offscreen, NULL, &ddsd, DDLOCK_WAIT, NULL);
|
||||||
|
ok(hr==DD_OK, "IDirectDrawSurface_Lock returned: %x\n", hr);
|
||||||
|
hr = IDirectDrawSurface_Unlock(offscreen, NULL);
|
||||||
|
ok(hr==DD_OK, "IDirectDrawSurface_UnLock returned: %x\n", hr);
|
||||||
|
|
||||||
|
/* Offscreen surface data will have to be converted and uploaded to texture. */
|
||||||
|
rect.left = 0;
|
||||||
|
rect.top = 0;
|
||||||
|
rect.right = 16;
|
||||||
|
rect.bottom = 16;
|
||||||
|
hr = IDirectDrawSurface_BltFast(offscreen, 600, 400, Surface1, &rect, 0);
|
||||||
|
ok(hr==DD_OK, "IDirectDrawSurface_BltFast returned: %x\n", hr);
|
||||||
|
|
||||||
|
/* This ensures offscreen surface contens will be downloaded to system memory. */
|
||||||
|
memset(&ddsd, 0, sizeof(ddsd));
|
||||||
|
ddsd.dwSize = sizeof(ddsd);
|
||||||
|
hr = IDirectDrawSurface_Lock(offscreen, NULL, &ddsd, DDLOCK_WAIT, NULL);
|
||||||
|
ok(hr==DD_OK, "IDirectDrawSurface_Lock returned: %x\n", hr);
|
||||||
|
hr = IDirectDrawSurface_Unlock(offscreen, NULL);
|
||||||
|
ok(hr==DD_OK, "IDirectDrawSurface_UnLock returned: %x\n", hr);
|
||||||
|
|
||||||
|
hr = IDirectDrawSurface_BltFast(Surface1, 0, 0, offscreen, NULL, 0);
|
||||||
|
ok(hr==DD_OK, "IDirectDrawSurface_BltFast returned: %x\n", hr);
|
||||||
|
|
||||||
|
memset(&ddsd, 0, sizeof(ddsd));
|
||||||
|
ddsd.dwSize = sizeof(ddsd);
|
||||||
|
hr = IDirectDrawSurface_Lock(Surface1, NULL, &ddsd, DDLOCK_WAIT, NULL);
|
||||||
|
ok(hr==DD_OK, "IDirectDrawSurface_Lock returned: %x\n", hr);
|
||||||
|
|
||||||
|
differences = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 256; i++) {
|
||||||
|
unsigned x = (i % 128) * 4 + 1;
|
||||||
|
unsigned y = (i / 128) * 4 + 1;
|
||||||
|
BYTE *p = (BYTE *)ddsd.lpSurface + ddsd.lPitch * y + x;
|
||||||
|
|
||||||
|
if (*p != i) differences++;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = IDirectDrawSurface_Unlock(Surface1, NULL);
|
||||||
|
ok(hr==DD_OK, "IDirectDrawSurface_UnLock returned: %x\n", hr);
|
||||||
|
|
||||||
|
ok(differences == 0, i2 == 0 ? "Pass 1. Unexpected front buffer contens after blit (%u differences)\n" :
|
||||||
|
"Pass 2 (with NULL front buffer palette). Unexpected front buffer contens after blit (%u differences)\n",
|
||||||
|
differences);
|
||||||
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
if(ddprimpal) IDirectDrawPalette_Release(ddprimpal);
|
if(ddprimpal) IDirectDrawPalette_Release(ddprimpal);
|
||||||
|
|
Loading…
Reference in New Issue