Wine-devel
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
July 2018
- 74 participants
- 637 discussions
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
I cleaned up the code style a little, but left the behavior of the code
alone as much as possible.
---
dlls/ddraw/tests/d3d.c | 1058 ------------------------------------
dlls/ddraw/tests/ddraw7.c | 1088 +++++++++++++++++++++++++++++++++++++
2 files changed, 1088 insertions(+), 1058 deletions(-)
diff --git a/dlls/ddraw/tests/d3d.c b/dlls/ddraw/tests/d3d.c
index 77836fd627..ec0f8d715c 100644
--- a/dlls/ddraw/tests/d3d.c
+++ b/dlls/ddraw/tests/d3d.c
@@ -1404,1063 +1404,6 @@ out:
IDirect3DVertexBuffer7_Release(lpVBufSrc);
}
-#define IS_VALUE_NEAR(a, b) ( ((a) == (b)) || ((a) == (b) - 1) || ((a) == (b) + 1) )
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-
-static void DeviceLoadTest(void)
-{
- DDSURFACEDESC2 ddsd;
- IDirectDrawSurface7 *texture_levels[2][8];
- IDirectDrawSurface7 *cube_face_levels[2][6][8];
- DWORD flags;
- HRESULT hr;
- DDBLTFX ddbltfx;
- RECT loadrect;
- POINT loadpoint;
- int i, i1, i2;
- unsigned diff_count = 0, diff_count2 = 0;
- unsigned x, y;
- BOOL load_mip_subset_broken = FALSE;
- IDirectDrawPalette *palettes[5];
- PALETTEENTRY table1[256];
- DDCOLORKEY ddckey;
- D3DDEVICEDESC7 d3dcaps;
-
- /* Test loading of texture subrectangle with a mipmap surface. */
- memset(texture_levels, 0, sizeof(texture_levels));
- memset(cube_face_levels, 0, sizeof(cube_face_levels));
- memset(palettes, 0, sizeof(palettes));
-
- for (i = 0; i < 2; i++)
- {
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
- ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
- ddsd.dwWidth = 128;
- ddsd.dwHeight = 128;
- U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
- U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB;
- U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 32;
- U2(U4(ddsd).ddpfPixelFormat).dwRBitMask = 0x00FF0000;
- U3(U4(ddsd).ddpfPixelFormat).dwGBitMask = 0x0000FF00;
- U4(U4(ddsd).ddpfPixelFormat).dwBBitMask = 0x000000FF;
- hr = IDirectDraw7_CreateSurface(lpDD, &ddsd, &texture_levels[i][0], NULL);
- ok(hr==DD_OK,"CreateSurface returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- /* Check the number of created mipmaps */
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- hr = IDirectDrawSurface7_GetSurfaceDesc(texture_levels[i][0], &ddsd);
- ok(hr==DD_OK,"IDirectDrawSurface7_GetSurfaceDesc returned: %x\n",hr);
- ok(U2(ddsd).dwMipMapCount == 8, "unexpected mip count %u\n", U2(ddsd).dwMipMapCount);
- if (U2(ddsd).dwMipMapCount != 8) goto out;
-
- for (i1 = 1; i1 < 8; i1++)
- {
- hr = IDirectDrawSurface7_GetAttachedSurface(texture_levels[i][i1 - 1], &ddsd.ddsCaps, &texture_levels[i][i1]);
- ok(hr == DD_OK, "GetAttachedSurface returned %08x\n", hr);
- if (FAILED(hr)) goto out;
- }
- }
-
- for (i1 = 0; i1 < 8; i1++)
- {
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- hr = IDirectDrawSurface7_Lock(texture_levels[0][i1], NULL, &ddsd, DDLOCK_WAIT, NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- for (y = 0 ; y < ddsd.dwHeight; y++)
- {
- DWORD *textureRow = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
-
- for (x = 0; x < ddsd.dwWidth; x++)
- {
- /* x stored in green component, y in blue. */
- DWORD color = 0xff0000 | (x << 8) | y;
- *textureRow++ = color;
- }
- }
-
- hr = IDirectDrawSurface7_Unlock(texture_levels[0][i1], NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n",hr);
- }
-
- for (i1 = 0; i1 < 8; i1++)
- {
- memset(&ddbltfx, 0, sizeof(ddbltfx));
- ddbltfx.dwSize = sizeof(ddbltfx);
- U5(ddbltfx).dwFillColor = 0;
- hr = IDirectDrawSurface7_Blt(texture_levels[1][i1], NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx);
- ok(hr == DD_OK, "IDirectDrawSurface7_Blt failed with %08x\n", hr);
- }
-
- /* First test some broken coordinates. */
- loadpoint.x = loadpoint.y = 0;
- SetRectEmpty(&loadrect);
- hr = IDirect3DDevice7_Load(lpD3DDevice, texture_levels[1][0], &loadpoint, texture_levels[0][0], &loadrect, 0);
- ok(hr==DDERR_INVALIDPARAMS, "IDirect3DDevice7_Load returned: %x\n",hr);
-
- loadpoint.x = loadpoint.y = 50;
- loadrect.left = 0;
- loadrect.top = 0;
- loadrect.right = 100;
- loadrect.bottom = 100;
- hr = IDirect3DDevice7_Load(lpD3DDevice, texture_levels[1][0], &loadpoint, texture_levels[0][0], &loadrect, 0);
- ok(hr==DDERR_INVALIDPARAMS, "IDirect3DDevice7_Load returned: %x\n",hr);
-
- /* Test actual loading. */
- loadpoint.x = loadpoint.y = 31;
- loadrect.left = 30;
- loadrect.top = 20;
- loadrect.right = 93;
- loadrect.bottom = 52;
-
- hr = IDirect3DDevice7_Load(lpD3DDevice, texture_levels[1][0], &loadpoint, texture_levels[0][0], &loadrect, 0);
- ok(hr==D3D_OK, "IDirect3DDevice7_Load returned: %x\n",hr);
-
- for (i1 = 0; i1 < 8; i1++)
- {
- diff_count = 0;
- diff_count2 = 0;
-
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- hr = IDirectDrawSurface7_Lock(texture_levels[1][i1], NULL, &ddsd, DDLOCK_WAIT, NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- for (y = 0 ; y < ddsd.dwHeight; y++)
- {
- DWORD *textureRow = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
-
- for (x = 0; x < ddsd.dwWidth; x++)
- {
- DWORD color = *textureRow++;
-
- if (x < loadpoint.x || x >= loadpoint.x + loadrect.right - loadrect.left ||
- y < loadpoint.y || y >= loadpoint.y + loadrect.bottom - loadrect.top)
- {
- if (color & 0xffffff) diff_count++;
- }
- else
- {
- DWORD r = (color & 0xff0000) >> 16;
- DWORD g = (color & 0xff00) >> 8;
- DWORD b = (color & 0xff);
-
- if (r != 0xff || g != x + loadrect.left - loadpoint.x || b != y + loadrect.top - loadpoint.y) diff_count++;
- }
-
- /* This codepath is for software RGB device. It has what looks like some weird off by one errors, but may
- technically be correct as it's not precisely defined by docs. */
- if (x < loadpoint.x || x >= loadpoint.x + loadrect.right - loadrect.left ||
- y < loadpoint.y || y >= loadpoint.y + loadrect.bottom - loadrect.top + 1)
- {
- if (color & 0xffffff) diff_count2++;
- }
- else
- {
- DWORD r = (color & 0xff0000) >> 16;
- DWORD g = (color & 0xff00) >> 8;
- DWORD b = (color & 0xff);
-
- if (r != 0xff || !IS_VALUE_NEAR(g, x + loadrect.left - loadpoint.x) ||
- !IS_VALUE_NEAR(b, y + loadrect.top - loadpoint.y)) diff_count2++;
- }
- }
- }
-
- hr = IDirectDrawSurface7_Unlock(texture_levels[1][i1], NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n",hr);
-
- ok(diff_count == 0 || diff_count2 == 0, "Unexpected destination texture level pixels; %u differences at %d level\n",
- MIN(diff_count, diff_count2), i1);
-
- loadpoint.x /= 2;
- loadpoint.y /= 2;
- loadrect.top /= 2;
- loadrect.left /= 2;
- loadrect.right = (loadrect.right + 1) / 2;
- loadrect.bottom = (loadrect.bottom + 1) / 2;
- }
-
- /* This crashes on native (tested on real windows XP / directx9 / nvidia and
- * qemu Win98 / directx7 / RGB software rasterizer):
- * passing non toplevel surfaces (sublevels) to Load (DX7 docs tell not to do this)
- hr = IDirect3DDevice7_Load(lpD3DDevice, texture_levels[1][1], NULL, texture_levels[0][1], NULL, 0);
- */
-
- /* Freed in reverse order as native seems to dislike and crash on freeing top level surface first. */
- for (i = 0; i < 2; i++)
- {
- for (i1 = 7; i1 >= 0; i1--)
- {
- if (texture_levels[i][i1]) IDirectDrawSurface7_Release(texture_levels[i][i1]);
- }
- }
- memset(texture_levels, 0, sizeof(texture_levels));
-
- /* Test texture size mismatch. */
- for (i = 0; i < 2; i++)
- {
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
- ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE;
- ddsd.dwWidth = i ? 256 : 128;
- ddsd.dwHeight = 128;
- hr = IDirectDraw7_CreateSurface(lpDD, &ddsd, &texture_levels[i][0], NULL);
- ok(hr==DD_OK,"CreateSurface returned: %x\n",hr);
- if (FAILED(hr)) goto out;
- }
-
- hr = IDirect3DDevice7_Load(lpD3DDevice, texture_levels[1][0], NULL, texture_levels[0][0], NULL, 0);
- ok(hr==DDERR_INVALIDPARAMS, "IDirect3DDevice7_Load returned: %x\n",hr);
-
- hr = IDirect3DDevice7_Load(lpD3DDevice, texture_levels[0][0], NULL, texture_levels[1][0], NULL, 0);
- ok(hr==DDERR_INVALIDPARAMS, "IDirect3DDevice7_Load returned: %x\n",hr);
-
- IDirectDrawSurface7_Release(texture_levels[0][0]);
- IDirectDrawSurface7_Release(texture_levels[1][0]);
- memset(texture_levels, 0, sizeof(texture_levels));
-
- memset(&d3dcaps, 0, sizeof(d3dcaps));
- hr = IDirect3DDevice7_GetCaps(lpD3DDevice, &d3dcaps);
- ok(hr == D3D_OK, "IDirect3DDevice7_GetCaps returned %08x\n", hr);
-
- if (!(d3dcaps.dpcTriCaps.dwTextureCaps & D3DPTEXTURECAPS_CUBEMAP))
- {
- skip("No cubemap support\n");
- }
- else
- {
- /* Test loading mipmapped cubemap texture subrectangle from another similar texture. */
- for (i = 0; i < 2; i++)
- {
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
- ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
- ddsd.ddsCaps.dwCaps2 = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_ALLFACES;
- ddsd.dwWidth = 128;
- ddsd.dwHeight = 128;
- U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
- U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB;
- U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 32;
- U2(U4(ddsd).ddpfPixelFormat).dwRBitMask = 0x00FF0000;
- U3(U4(ddsd).ddpfPixelFormat).dwGBitMask = 0x0000FF00;
- U4(U4(ddsd).ddpfPixelFormat).dwBBitMask = 0x000000FF;
- hr = IDirectDraw7_CreateSurface(lpDD, &ddsd, &cube_face_levels[i][0][0], NULL);
- ok(hr==DD_OK,"CreateSurface returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- flags = DDSCAPS2_CUBEMAP_NEGATIVEX;
- for (i1 = 1; i1 < 6; i1++, flags <<= 1)
- {
- ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE;
- ddsd.ddsCaps.dwCaps2 = DDSCAPS2_CUBEMAP | flags;
- hr = IDirectDrawSurface7_GetAttachedSurface(cube_face_levels[i][0][0], &ddsd.ddsCaps, &cube_face_levels[i][i1][0]);
- ok(hr == DD_OK, "GetAttachedSurface returned %08x\n", hr);
- if (FAILED(hr)) goto out;
- }
-
- for (i1 = 0; i1 < 6; i1++)
- {
- /* Check the number of created mipmaps */
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- hr = IDirectDrawSurface7_GetSurfaceDesc(cube_face_levels[i][i1][0], &ddsd);
- ok(hr==DD_OK,"IDirectDrawSurface7_GetSurfaceDesc returned: %x\n",hr);
- ok(U2(ddsd).dwMipMapCount == 8, "unexpected mip count %u\n", U2(ddsd).dwMipMapCount);
- if (U2(ddsd).dwMipMapCount != 8) goto out;
-
- for (i2 = 1; i2 < 8; i2++)
- {
- ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_MIPMAP;
- ddsd.ddsCaps.dwCaps2 = DDSCAPS2_MIPMAPSUBLEVEL;
- hr = IDirectDrawSurface7_GetAttachedSurface(cube_face_levels[i][i1][i2 - 1], &ddsd.ddsCaps, &cube_face_levels[i][i1][i2]);
- ok(hr == DD_OK, "GetAttachedSurface returned %08x\n", hr);
- if (FAILED(hr)) goto out;
- }
- }
- }
-
- for (i = 0; i < 6; i++)
- for (i1 = 0; i1 < 8; i1++)
- {
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- hr = IDirectDrawSurface7_Lock(cube_face_levels[0][i][i1], NULL, &ddsd, DDLOCK_WAIT, NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- for (y = 0 ; y < ddsd.dwHeight; y++)
- {
- DWORD *textureRow = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
-
- for (x = 0; x < ddsd.dwWidth; x++)
- {
- /* face number in low 4 bits of red, x stored in green component, y in blue. */
- DWORD color = 0xf00000 | (i << 16) | (x << 8) | y;
- *textureRow++ = color;
- }
- }
-
- hr = IDirectDrawSurface7_Unlock(cube_face_levels[0][i][i1], NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n",hr);
- }
-
- for (i = 0; i < 6; i++)
- for (i1 = 0; i1 < 8; i1++)
- {
- memset(&ddbltfx, 0, sizeof(ddbltfx));
- ddbltfx.dwSize = sizeof(ddbltfx);
- U5(ddbltfx).dwFillColor = 0;
- hr = IDirectDrawSurface7_Blt(cube_face_levels[1][i][i1], NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx);
- ok(hr == DD_OK, "IDirectDrawSurface7_Blt failed with %08x\n", hr);
- }
-
- loadpoint.x = loadpoint.y = 10;
- loadrect.left = 30;
- loadrect.top = 20;
- loadrect.right = 93;
- loadrect.bottom = 52;
-
- hr = IDirect3DDevice7_Load(lpD3DDevice, cube_face_levels[1][0][0], &loadpoint, cube_face_levels[0][0][0], &loadrect,
- DDSCAPS2_CUBEMAP_ALLFACES);
- ok(hr==D3D_OK, "IDirect3DDevice7_Load returned: %x\n",hr);
-
- for (i = 0; i < 6; i++)
- {
- loadpoint.x = loadpoint.y = 10;
- loadrect.left = 30;
- loadrect.top = 20;
- loadrect.right = 93;
- loadrect.bottom = 52;
-
- for (i1 = 0; i1 < 8; i1++)
- {
- diff_count = 0;
- diff_count2 = 0;
-
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- hr = IDirectDrawSurface7_Lock(cube_face_levels[1][i][i1], NULL, &ddsd, DDLOCK_WAIT, NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- for (y = 0 ; y < ddsd.dwHeight; y++)
- {
- DWORD *textureRow = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
-
- for (x = 0; x < ddsd.dwWidth; x++)
- {
- DWORD color = *textureRow++;
-
- if (x < loadpoint.x || x >= loadpoint.x + loadrect.right - loadrect.left ||
- y < loadpoint.y || y >= loadpoint.y + loadrect.bottom - loadrect.top)
- {
- if (color & 0xffffff) diff_count++;
- }
- else
- {
- DWORD r = (color & 0xff0000) >> 16;
- DWORD g = (color & 0xff00) >> 8;
- DWORD b = (color & 0xff);
-
- if (r != (0xf0 | i) || g != x + loadrect.left - loadpoint.x ||
- b != y + loadrect.top - loadpoint.y) diff_count++;
- }
-
- /* This codepath is for software RGB device. It has what looks like some weird off by one errors, but may
- technically be correct as it's not precisely defined by docs. */
- if (x < loadpoint.x || x >= loadpoint.x + loadrect.right - loadrect.left ||
- y < loadpoint.y || y >= loadpoint.y + loadrect.bottom - loadrect.top + 1)
- {
- if (color & 0xffffff) diff_count2++;
- }
- else
- {
- DWORD r = (color & 0xff0000) >> 16;
- DWORD g = (color & 0xff00) >> 8;
- DWORD b = (color & 0xff);
-
- if (r != (0xf0 | i) || !IS_VALUE_NEAR(g, x + loadrect.left - loadpoint.x) ||
- !IS_VALUE_NEAR(b, y + loadrect.top - loadpoint.y)) diff_count2++;
- }
- }
- }
-
- hr = IDirectDrawSurface7_Unlock(cube_face_levels[1][i][i1], NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n",hr);
-
- ok(diff_count == 0 || diff_count2 == 0,
- "Unexpected destination texture level pixels; %u differences at face %x level %d\n",
- MIN(diff_count, diff_count2), i, i1);
-
- loadpoint.x /= 2;
- loadpoint.y /= 2;
- loadrect.top /= 2;
- loadrect.left /= 2;
- loadrect.right = (loadrect.right + 1) / 2;
- loadrect.bottom = (loadrect.bottom + 1) / 2;
- }
- }
-
- for (i = 0; i < 2; i++)
- for (i1 = 5; i1 >= 0; i1--)
- for (i2 = 7; i2 >= 0; i2--)
- {
- if (cube_face_levels[i][i1][i2]) IDirectDrawSurface7_Release(cube_face_levels[i][i1][i2]);
- }
- memset(cube_face_levels, 0, sizeof(cube_face_levels));
-
- /* Test cubemap loading from regular texture. */
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
- ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX;
- ddsd.ddsCaps.dwCaps2 = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_ALLFACES;
- ddsd.dwWidth = 128;
- ddsd.dwHeight = 128;
- hr = IDirectDraw7_CreateSurface(lpDD, &ddsd, &cube_face_levels[0][0][0], NULL);
- ok(hr==DD_OK,"CreateSurface returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
- ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE;
- ddsd.dwWidth = 128;
- ddsd.dwHeight = 128;
- hr = IDirectDraw7_CreateSurface(lpDD, &ddsd, &texture_levels[0][0], NULL);
- ok(hr==DD_OK,"CreateSurface returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- hr = IDirect3DDevice7_Load(lpD3DDevice, cube_face_levels[0][0][0], NULL, texture_levels[0][0], NULL,
- DDSCAPS2_CUBEMAP_ALLFACES);
- ok(hr==DDERR_INVALIDPARAMS, "IDirect3DDevice7_Load returned: %x\n",hr);
-
- IDirectDrawSurface7_Release(cube_face_levels[0][0][0]);
- memset(cube_face_levels, 0, sizeof(cube_face_levels));
- IDirectDrawSurface7_Release(texture_levels[0][0]);
- memset(texture_levels, 0, sizeof(texture_levels));
-
- /* Partial cube maps(e.g. created with an explicitly set DDSCAPS2_CUBEMAP_POSITIVEX flag)
- * BSOD some Windows machines when an app tries to create them(Radeon X1600, Windows XP,
- * Catalyst 10.2 driver, 6.14.10.6925)
- */
- }
-
- /* Test texture loading with different mip level count (larger levels match, smaller levels missing in destination. */
- for (i = 0; i < 2; i++)
- {
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_MIPMAPCOUNT;
- ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
- ddsd.dwWidth = 128;
- ddsd.dwHeight = 128;
- U2(ddsd).dwMipMapCount = i ? 4 : 8;
- U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
- U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB;
- U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 32;
- U2(U4(ddsd).ddpfPixelFormat).dwRBitMask = 0x00FF0000;
- U3(U4(ddsd).ddpfPixelFormat).dwGBitMask = 0x0000FF00;
- U4(U4(ddsd).ddpfPixelFormat).dwBBitMask = 0x000000FF;
- hr = IDirectDraw7_CreateSurface(lpDD, &ddsd, &texture_levels[i][0], NULL);
- ok(hr==DD_OK,"CreateSurface returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- /* Check the number of created mipmaps */
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- hr = IDirectDrawSurface7_GetSurfaceDesc(texture_levels[i][0], &ddsd);
- ok(hr==DD_OK,"IDirectDrawSurface7_GetSurfaceDesc returned: %x\n",hr);
- ok(U2(ddsd).dwMipMapCount == (i ? 4 : 8), "unexpected mip count %u\n", U2(ddsd).dwMipMapCount);
- if (U2(ddsd).dwMipMapCount != (i ? 4 : 8)) goto out;
-
- for (i1 = 1; i1 < (i ? 4 : 8); i1++)
- {
- hr = IDirectDrawSurface7_GetAttachedSurface(texture_levels[i][i1 - 1], &ddsd.ddsCaps, &texture_levels[i][i1]);
- ok(hr == DD_OK, "GetAttachedSurface returned %08x\n", hr);
- if (FAILED(hr)) goto out;
- }
- }
-
- for (i1 = 0; i1 < 8; i1++)
- {
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- hr = IDirectDrawSurface7_Lock(texture_levels[0][i1], NULL, &ddsd, DDLOCK_WAIT, NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- for (y = 0 ; y < ddsd.dwHeight; y++)
- {
- DWORD *textureRow = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
-
- for (x = 0; x < ddsd.dwWidth; x++)
- {
- /* x stored in green component, y in blue. */
- DWORD color = 0xf00000 | (i1 << 16) | (x << 8) | y;
- *textureRow++ = color;
- }
- }
-
- hr = IDirectDrawSurface7_Unlock(texture_levels[0][i1], NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n",hr);
- }
-
- for (i1 = 0; i1 < 4; i1++)
- {
- memset(&ddbltfx, 0, sizeof(ddbltfx));
- ddbltfx.dwSize = sizeof(ddbltfx);
- U5(ddbltfx).dwFillColor = 0;
- hr = IDirectDrawSurface7_Blt(texture_levels[1][i1], NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx);
- ok(hr == DD_OK, "IDirectDrawSurface7_Blt failed with %08x\n", hr);
- }
-
- loadpoint.x = loadpoint.y = 31;
- loadrect.left = 30;
- loadrect.top = 20;
- loadrect.right = 93;
- loadrect.bottom = 52;
-
- /* Destination mip levels are a subset of source mip levels. */
- hr = IDirect3DDevice7_Load(lpD3DDevice, texture_levels[1][0], &loadpoint, texture_levels[0][0], &loadrect, 0);
- ok(hr==D3D_OK, "IDirect3DDevice7_Load returned: %x\n",hr);
-
- for (i1 = 0; i1 < 4; i1++)
- {
- diff_count = 0;
- diff_count2 = 0;
-
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- hr = IDirectDrawSurface7_Lock(texture_levels[1][i1], NULL, &ddsd, DDLOCK_WAIT, NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- for (y = 0 ; y < ddsd.dwHeight; y++)
- {
- DWORD *textureRow = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
-
- for (x = 0; x < ddsd.dwWidth; x++)
- {
- DWORD color = *textureRow++;
-
- if (x < loadpoint.x || x >= loadpoint.x + loadrect.right - loadrect.left ||
- y < loadpoint.y || y >= loadpoint.y + loadrect.bottom - loadrect.top)
- {
- if (color & 0xffffff) diff_count++;
- }
- else
- {
- DWORD r = (color & 0xff0000) >> 16;
- DWORD g = (color & 0xff00) >> 8;
- DWORD b = (color & 0xff);
-
- if (r != (0xf0 | i1) || g != x + loadrect.left - loadpoint.x ||
- b != y + loadrect.top - loadpoint.y) diff_count++;
- }
-
- /* This codepath is for software RGB device. It has what looks like some weird off by one errors, but may
- technically be correct as it's not precisely defined by docs. */
- if (x < loadpoint.x || x >= loadpoint.x + loadrect.right - loadrect.left ||
- y < loadpoint.y || y >= loadpoint.y + loadrect.bottom - loadrect.top + 1)
- {
- if (color & 0xffffff) diff_count2++;
- }
- else
- {
- DWORD r = (color & 0xff0000) >> 16;
- DWORD g = (color & 0xff00) >> 8;
- DWORD b = (color & 0xff);
-
- if (r != (0xf0 | i1) || !IS_VALUE_NEAR(g, x + loadrect.left - loadpoint.x) ||
- !IS_VALUE_NEAR(b, y + loadrect.top - loadpoint.y)) diff_count2++;
- }
- }
- }
-
- hr = IDirectDrawSurface7_Unlock(texture_levels[1][i1], NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n",hr);
-
- ok(diff_count == 0 || diff_count2 == 0, "Unexpected destination texture level pixels; %u differences at %d level\n",
- MIN(diff_count, diff_count2), i1);
-
- loadpoint.x /= 2;
- loadpoint.y /= 2;
- loadrect.top /= 2;
- loadrect.left /= 2;
- loadrect.right = (loadrect.right + 1) / 2;
- loadrect.bottom = (loadrect.bottom + 1) / 2;
- }
-
- /* Destination mip levels are a superset of source mip levels (should fail). */
- hr = IDirect3DDevice7_Load(lpD3DDevice, texture_levels[0][0], &loadpoint, texture_levels[1][0], &loadrect, 0);
- ok(hr==DDERR_INVALIDPARAMS, "IDirect3DDevice7_Load returned: %x\n",hr);
-
- for (i = 0; i < 2; i++)
- {
- for (i1 = 7; i1 >= 0; i1--)
- {
- if (texture_levels[i][i1]) IDirectDrawSurface7_Release(texture_levels[i][i1]);
- }
- }
- memset(texture_levels, 0, sizeof(texture_levels));
-
- /* Test loading from mipmap texture to a regular texture that matches one sublevel in size. */
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
- ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
- ddsd.dwWidth = 128;
- ddsd.dwHeight = 128;
- U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
- U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB;
- U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 32;
- U2(U4(ddsd).ddpfPixelFormat).dwRBitMask = 0x00FF0000;
- U3(U4(ddsd).ddpfPixelFormat).dwGBitMask = 0x0000FF00;
- U4(U4(ddsd).ddpfPixelFormat).dwBBitMask = 0x000000FF;
- hr = IDirectDraw7_CreateSurface(lpDD, &ddsd, &texture_levels[0][0], NULL);
- ok(hr==DD_OK,"CreateSurface returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
- ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE;
- ddsd.dwWidth = 32;
- ddsd.dwHeight = 32;
- U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
- U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB;
- U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 32;
- U2(U4(ddsd).ddpfPixelFormat).dwRBitMask = 0x00FF0000;
- U3(U4(ddsd).ddpfPixelFormat).dwGBitMask = 0x0000FF00;
- U4(U4(ddsd).ddpfPixelFormat).dwBBitMask = 0x000000FF;
- hr = IDirectDraw7_CreateSurface(lpDD, &ddsd, &texture_levels[1][0], NULL);
- ok(hr==DD_OK,"CreateSurface returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- for (i1 = 1; i1 < 8; i1++)
- {
- hr = IDirectDrawSurface7_GetAttachedSurface(texture_levels[0][i1 - 1], &ddsd.ddsCaps, &texture_levels[0][i1]);
- ok(hr == DD_OK, "GetAttachedSurface returned %08x\n", hr);
- if (FAILED(hr)) goto out;
- }
-
- for (i1 = 0; i1 < 8; i1++)
- {
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- hr = IDirectDrawSurface7_Lock(texture_levels[0][i1], NULL, &ddsd, DDLOCK_WAIT, NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- for (y = 0 ; y < ddsd.dwHeight; y++)
- {
- DWORD *textureRow = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
-
- for (x = 0; x < ddsd.dwWidth; x++)
- {
- /* x stored in green component, y in blue. */
- DWORD color = 0xf00000 | (i1 << 16) | (x << 8) | y;
- *textureRow++ = color;
- }
- }
-
- hr = IDirectDrawSurface7_Unlock(texture_levels[0][i1], NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n",hr);
- }
-
- memset(&ddbltfx, 0, sizeof(ddbltfx));
- ddbltfx.dwSize = sizeof(ddbltfx);
- U5(ddbltfx).dwFillColor = 0;
- hr = IDirectDrawSurface7_Blt(texture_levels[1][0], NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx);
- ok(hr == DD_OK, "IDirectDrawSurface7_Blt failed with %08x\n", hr);
-
- loadpoint.x = loadpoint.y = 32;
- loadrect.left = 32;
- loadrect.top = 32;
- loadrect.right = 96;
- loadrect.bottom = 96;
-
- hr = IDirect3DDevice7_Load(lpD3DDevice, texture_levels[1][0], &loadpoint, texture_levels[0][0], &loadrect, 0);
- ok(hr==D3D_OK, "IDirect3DDevice7_Load returned: %x\n",hr);
-
- loadpoint.x /= 4;
- loadpoint.y /= 4;
- loadrect.top /= 4;
- loadrect.left /= 4;
- loadrect.right = (loadrect.right + 3) / 4;
- loadrect.bottom = (loadrect.bottom + 3) / 4;
-
- /* NOTE: something in either nvidia driver or directx9 on WinXP appears to be broken:
- * this kind of Load calls (to subset with smaller surface(s)) produces wrong results with
- * copied subrectangles divided more than needed, without apparent logic. But it works
- * as expected on qemu / Win98 / directx7 / RGB device. Some things are broken on XP, e.g.
- * some games don't work that worked in Win98, so it is assumed here XP results are wrong.
- * The following code attempts to detect broken results, actual tests will then be skipped
- */
- load_mip_subset_broken = TRUE;
- diff_count = 0;
-
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- hr = IDirectDrawSurface7_Lock(texture_levels[1][0], NULL, &ddsd, DDLOCK_WAIT, NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- for (y = 0 ; y < ddsd.dwHeight; y++)
- {
- DWORD *textureRow = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
-
- for (x = 0; x < ddsd.dwWidth; x++)
- {
- DWORD color = *textureRow++;
-
- if (x < 2 || x >= 2 + 4 ||
- y < 2 || y >= 2 + 4)
- {
- if (color & 0xffffff) diff_count++;
- }
- else
- {
- DWORD r = (color & 0xff0000) >> 16;
-
- if ((r & (0xf0)) != 0xf0) diff_count++;
- }
- }
- }
-
- if (diff_count) load_mip_subset_broken = FALSE;
-
- if (load_mip_subset_broken) {
- skip("IDirect3DDevice7_Load is broken (happens on some modern Windows installations like XP). Skipping affected tests.\n");
- } else {
- diff_count = 0;
-
- for (y = 0 ; y < ddsd.dwHeight; y++)
- {
- DWORD *textureRow = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
-
- for (x = 0; x < ddsd.dwWidth; x++)
- {
- DWORD color = *textureRow++;
-
- if (x < loadpoint.x || x >= loadpoint.x + loadrect.right - loadrect.left ||
- y < loadpoint.y || y >= loadpoint.y + loadrect.bottom - loadrect.top)
- {
- if (color & 0xffffff) diff_count++;
- }
- else
- {
- DWORD r = (color & 0xff0000) >> 16;
- DWORD g = (color & 0xff00) >> 8;
- DWORD b = (color & 0xff);
-
- if (r != (0xf0 | 2) || g != x + loadrect.left - loadpoint.x ||
- b != y + loadrect.top - loadpoint.y) diff_count++;
- }
- }
- }
- }
-
- hr = IDirectDrawSurface7_Unlock(texture_levels[1][0], NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n",hr);
-
- ok(diff_count == 0, "Unexpected destination texture level pixels; %u differences\n", diff_count);
-
- for (i = 0; i < 2; i++)
- {
- for (i1 = 7; i1 >= 0; i1--)
- {
- if (texture_levels[i][i1]) IDirectDrawSurface7_Release(texture_levels[i][i1]);
- }
- }
- memset(texture_levels, 0, sizeof(texture_levels));
-
- if (!load_mip_subset_broken)
- {
- /* Test loading when destination mip levels are a subset of source mip levels and start from smaller
- * surface (than first source mip level)
- */
- for (i = 0; i < 2; i++)
- {
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
- if (i) ddsd.dwFlags |= DDSD_MIPMAPCOUNT;
- ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
- ddsd.dwWidth = i ? 32 : 128;
- ddsd.dwHeight = i ? 32 : 128;
- if (i) U2(ddsd).dwMipMapCount = 4;
- U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
- U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB;
- U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 32;
- U2(U4(ddsd).ddpfPixelFormat).dwRBitMask = 0x00FF0000;
- U3(U4(ddsd).ddpfPixelFormat).dwGBitMask = 0x0000FF00;
- U4(U4(ddsd).ddpfPixelFormat).dwBBitMask = 0x000000FF;
- hr = IDirectDraw7_CreateSurface(lpDD, &ddsd, &texture_levels[i][0], NULL);
- ok(hr==DD_OK,"CreateSurface returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- /* Check the number of created mipmaps */
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- hr = IDirectDrawSurface7_GetSurfaceDesc(texture_levels[i][0], &ddsd);
- ok(hr==DD_OK,"IDirectDrawSurface7_GetSurfaceDesc returned: %x\n",hr);
- ok(U2(ddsd).dwMipMapCount == (i ? 4 : 8), "unexpected mip count %u\n", U2(ddsd).dwMipMapCount);
- if (U2(ddsd).dwMipMapCount != (i ? 4 : 8)) goto out;
-
- for (i1 = 1; i1 < (i ? 4 : 8); i1++)
- {
- hr = IDirectDrawSurface7_GetAttachedSurface(texture_levels[i][i1 - 1], &ddsd.ddsCaps, &texture_levels[i][i1]);
- ok(hr == DD_OK, "GetAttachedSurface returned %08x\n", hr);
- if (FAILED(hr)) goto out;
- }
- }
-
- for (i1 = 0; i1 < 8; i1++)
- {
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- hr = IDirectDrawSurface7_Lock(texture_levels[0][i1], NULL, &ddsd, DDLOCK_WAIT, NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- for (y = 0 ; y < ddsd.dwHeight; y++)
- {
- DWORD *textureRow = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
-
- for (x = 0; x < ddsd.dwWidth; x++)
- {
- /* x stored in green component, y in blue. */
- DWORD color = 0xf00000 | (i1 << 16) | (x << 8) | y;
- *textureRow++ = color;
- }
- }
-
- hr = IDirectDrawSurface7_Unlock(texture_levels[0][i1], NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n",hr);
- }
-
- for (i1 = 0; i1 < 4; i1++)
- {
- memset(&ddbltfx, 0, sizeof(ddbltfx));
- ddbltfx.dwSize = sizeof(ddbltfx);
- U5(ddbltfx).dwFillColor = 0;
- hr = IDirectDrawSurface7_Blt(texture_levels[1][i1], NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx);
- ok(hr == DD_OK, "IDirectDrawSurface7_Blt failed with %08x\n", hr);
- }
-
- loadpoint.x = loadpoint.y = 0;
- loadrect.left = 0;
- loadrect.top = 0;
- loadrect.right = 64;
- loadrect.bottom = 64;
-
- hr = IDirect3DDevice7_Load(lpD3DDevice, texture_levels[1][0], &loadpoint, texture_levels[0][0], &loadrect, 0);
- ok(hr==D3D_OK, "IDirect3DDevice7_Load returned: %x\n",hr);
-
- i = 0;
- for (i1 = 0; i1 < 8 && i < 4; i1++)
- {
- DDSURFACEDESC2 ddsd2;
-
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- hr = IDirectDrawSurface7_GetSurfaceDesc(texture_levels[0][i1], &ddsd);
- ok(SUCCEEDED(hr), "IDirectDrawSurface7_GetSurfaceDesc returned %#x.\n", hr);
-
- memset(&ddsd2, 0, sizeof(DDSURFACEDESC2));
- ddsd2.dwSize = sizeof(ddsd2);
- hr = IDirectDrawSurface7_GetSurfaceDesc(texture_levels[1][i], &ddsd2);
- ok(SUCCEEDED(hr), "IDirectDrawSurface7_GetSurfaceDesc returned %#x.\n", hr);
-
- if (ddsd.dwWidth == ddsd2.dwWidth && ddsd.dwHeight == ddsd2.dwHeight)
- {
- diff_count = 0;
-
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- hr = IDirectDrawSurface7_Lock(texture_levels[1][i], NULL, &ddsd, DDLOCK_WAIT, NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- for (y = 0 ; y < ddsd.dwHeight; y++)
- {
- DWORD *textureRow = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
-
- for (x = 0; x < ddsd.dwWidth; x++)
- {
- DWORD color = *textureRow++;
-
- if (x < loadpoint.x || x >= loadpoint.x + loadrect.right - loadrect.left ||
- y < loadpoint.y || y >= loadpoint.y + loadrect.bottom - loadrect.top)
- {
- if (color & 0xffffff) diff_count++;
- }
- else
- {
- DWORD r = (color & 0xff0000) >> 16;
- DWORD g = (color & 0xff00) >> 8;
- DWORD b = (color & 0xff);
-
- if (r != (0xf0 | i1) || g != x + loadrect.left - loadpoint.x ||
- b != y + loadrect.top - loadpoint.y) diff_count++;
- }
- }
- }
-
- hr = IDirectDrawSurface7_Unlock(texture_levels[1][i], NULL);
- ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n",hr);
-
- ok(diff_count == 0, "Unexpected destination texture level pixels; %u differences at %d level\n", diff_count, i1);
-
- i++;
- }
-
- loadpoint.x /= 2;
- loadpoint.y /= 2;
- loadrect.top /= 2;
- loadrect.left /= 2;
- loadrect.right = (loadrect.right + 1) / 2;
- loadrect.bottom = (loadrect.bottom + 1) / 2;
- }
-
- for (i = 0; i < 2; i++)
- {
- for (i1 = 7; i1 >= 0; i1--)
- {
- if (texture_levels[i][i1]) IDirectDrawSurface7_Release(texture_levels[i][i1]);
- }
- }
- memset(texture_levels, 0, sizeof(texture_levels));
- }
-
- /* Test palette copying. */
- for (i = 0; i < 2; i++)
- {
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
- ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
- ddsd.dwWidth = 128;
- ddsd.dwHeight = 128;
- U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
- U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_PALETTEINDEXED8;
- U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 8;
- hr = IDirectDraw7_CreateSurface(lpDD, &ddsd, &texture_levels[i][0], NULL);
- ok(hr==DD_OK,"CreateSurface returned: %x\n",hr);
- if (FAILED(hr)) goto out;
-
- /* Check the number of created mipmaps */
- memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
- ddsd.dwSize = sizeof(ddsd);
- hr = IDirectDrawSurface7_GetSurfaceDesc(texture_levels[i][0], &ddsd);
- ok(hr==DD_OK,"IDirectDrawSurface7_GetSurfaceDesc returned: %x\n",hr);
- ok(U2(ddsd).dwMipMapCount == 8, "unexpected mip count %u\n", U2(ddsd).dwMipMapCount);
- if (U2(ddsd).dwMipMapCount != 8) goto out;
-
- for (i1 = 1; i1 < 8; i1++)
- {
- hr = IDirectDrawSurface7_GetAttachedSurface(texture_levels[i][i1 - 1], &ddsd.ddsCaps, &texture_levels[i][i1]);
- ok(hr == DD_OK, "GetAttachedSurface returned %08x\n", hr);
- if (FAILED(hr)) goto out;
- }
- }
-
- memset(table1, 0, sizeof(table1));
- for (i = 0; i < 3; i++)
- {
- table1[0].peBlue = i + 1;
- hr = IDirectDraw7_CreatePalette(lpDD, DDPCAPS_ALLOW256 | DDPCAPS_8BIT, table1, &palettes[i], NULL);
- ok(hr == DD_OK, "CreatePalette returned %08x\n", hr);
- if (FAILED(hr))
- {
- skip("IDirectDraw7_CreatePalette failed; skipping further tests\n");
- goto out;
- }
- }
-
- hr = IDirectDrawSurface7_SetPalette(texture_levels[0][0], palettes[0]);
- ok(hr==DD_OK, "IDirectDrawSurface7_SetPalette returned: %x\n", hr);
-
- hr = IDirect3DDevice7_Load(lpD3DDevice, texture_levels[1][0], NULL, texture_levels[0][0], NULL, 0);
- ok(hr==D3D_OK, "IDirect3DDevice7_Load returned: %x\n",hr);
-
- hr = IDirectDrawSurface7_GetPalette(texture_levels[0][1], &palettes[4]);
- ok(hr==DDERR_NOPALETTEATTACHED, "IDirectDrawSurface7_GetPalette returned: %x\n", hr);
-
- hr = IDirectDrawSurface7_GetPalette(texture_levels[1][0], &palettes[4]);
- ok(hr==DDERR_NOPALETTEATTACHED, "IDirectDrawSurface7_GetPalette returned: %x\n", hr);
-
- hr = IDirectDrawSurface7_SetPalette(texture_levels[0][1], palettes[1]);
- ok(hr==DDERR_NOTONMIPMAPSUBLEVEL, "IDirectDrawSurface7_SetPalette returned: %x\n", hr);
- hr = IDirectDrawSurface7_SetPalette(texture_levels[1][0], palettes[2]);
- ok(hr==DD_OK, "IDirectDrawSurface7_SetPalette returned: %x\n", hr);
-
- hr = IDirect3DDevice7_Load(lpD3DDevice, texture_levels[1][0], NULL, texture_levels[0][0], NULL, 0);
- ok(hr==D3D_OK, "IDirect3DDevice7_Load returned: %x\n",hr);
-
- memset(table1, 0, sizeof(table1));
- hr = IDirectDrawSurface7_GetPalette(texture_levels[1][0], &palettes[4]);
- ok(hr==DD_OK, "IDirectDrawSurface7_GetPalette returned: %x\n", hr);
- if (SUCCEEDED(hr))
- {
- hr = IDirectDrawPalette_GetEntries(palettes[4], 0, 0, 256, table1);
- ok(hr == DD_OK, "IDirectDrawPalette_GetEntries returned %08x\n", hr);
- ok(table1[0].peBlue == 1, "Unexpected palette color after load: %u\n", (unsigned)table1[0].peBlue);
- }
-
- /* Test colorkey copying. */
- ddckey.dwColorSpaceLowValue = ddckey.dwColorSpaceHighValue = 64;
- hr = IDirectDrawSurface7_SetColorKey(texture_levels[0][0], DDCKEY_SRCBLT, &ddckey);
- ok(hr==DD_OK, "IDirectDrawSurface7_SetColorKey returned: %x\n", hr);
- hr = IDirectDrawSurface7_SetColorKey(texture_levels[0][1], DDCKEY_SRCBLT, &ddckey);
- ok(hr == DDERR_NOTONMIPMAPSUBLEVEL, "Got unexpected hr %#x.\n", hr);
-
- hr = IDirectDrawSurface7_GetColorKey(texture_levels[1][0], DDCKEY_SRCBLT, &ddckey);
- ok(hr==DDERR_NOCOLORKEY, "IDirectDrawSurface7_GetColorKey returned: %x\n", hr);
-
- hr = IDirect3DDevice7_Load(lpD3DDevice, texture_levels[1][0], NULL, texture_levels[0][0], NULL, 0);
- ok(hr==D3D_OK, "IDirect3DDevice7_Load returned: %x\n",hr);
-
- hr = IDirectDrawSurface7_GetColorKey(texture_levels[1][0], DDCKEY_SRCBLT, &ddckey);
- ok(hr==DD_OK, "IDirectDrawSurface7_GetColorKey returned: %x\n", hr);
- ok(ddckey.dwColorSpaceLowValue == ddckey.dwColorSpaceHighValue && ddckey.dwColorSpaceLowValue == 64,
- "Unexpected color key values: %u - %u\n", ddckey.dwColorSpaceLowValue, ddckey.dwColorSpaceHighValue);
-
- out:
-
- for (i = 0; i < 5; i++)
- {
- if (palettes[i]) IDirectDrawPalette_Release(palettes[i]);
- }
-
- for (i = 0; i < 2; i++)
- {
- for (i1 = 7; i1 >= 0; i1--)
- {
- if (texture_levels[i][i1]) IDirectDrawSurface7_Release(texture_levels[i][i1]);
- }
- }
-
- for (i = 0; i < 2; i++)
- for (i1 = 5; i1 >= 0; i1--)
- for (i2 = 7; i2 >= 0; i2--)
- {
- if (cube_face_levels[i][i1][i2]) IDirectDrawSurface7_Release(cube_face_levels[i][i1][i2]);
- }
-}
-
static void SetMaterialTest(void)
{
HRESULT rc;
@@ -3422,7 +2365,6 @@ START_TEST(d3d)
SetMaterialTest();
CapsTest();
VertexBufferDescTest();
- DeviceLoadTest();
SetRenderTargetTest();
VertexBufferLockRest();
z_format_test();
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 35a45c0345..4a7ea61f5d 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -14267,6 +14267,1093 @@ static void test_viewport(void)
DestroyWindow(window);
}
+#define IS_VALUE_NEAR(a, b) ( ((a) == (b)) || ((a) == (b) - 1) || ((a) == (b) + 1) )
+
+static void test_device_load(void)
+{
+ HWND window;
+ IDirect3DDevice7 *device;
+ IDirect3D7 *d3d;
+ IDirectDraw7 *ddraw;
+ DDSURFACEDESC2 ddsd;
+ IDirectDrawSurface7 *texture_levels[2][8];
+ IDirectDrawSurface7 *cube_face_levels[2][6][8];
+ DWORD flags;
+ HRESULT hr;
+ DDBLTFX ddbltfx;
+ RECT loadrect;
+ POINT loadpoint;
+ int i, i1, i2;
+ unsigned int diff_count, diff_count2;
+ unsigned int x, y;
+ BOOL load_mip_subset_broken = FALSE;
+ IDirectDrawPalette *palettes[5];
+ PALETTEENTRY table1[256];
+ DDCOLORKEY ddckey;
+ D3DDEVICEDESC7 d3dcaps;
+ ULONG refcount;
+
+ window = create_window();
+ if (!(device = create_device(window, DDSCL_NORMAL)))
+ {
+ skip("Failed to create a 3D device, skipping test.\n");
+ DestroyWindow(window);
+ return;
+ }
+
+ hr = IDirect3DDevice7_GetDirect3D(device, &d3d);
+ ok(SUCCEEDED(hr), "Failed to get Direct3D7 interface, hr %#x.\n", hr);
+ hr = IDirect3D7_QueryInterface(d3d, &IID_IDirectDraw7, (void **)&ddraw);
+ ok(SUCCEEDED(hr), "Failed to get ddraw interface, hr %#x.\n", hr);
+ IDirect3D7_Release(d3d);
+
+ /* Test loading of texture subrectangle with a mipmap surface */
+ memset(texture_levels, 0, sizeof(texture_levels));
+ memset(cube_face_levels, 0, sizeof(cube_face_levels));
+ memset(palettes, 0, sizeof(palettes));
+
+ for (i = 0; i < 2; i++)
+ {
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
+ ddsd.dwWidth = 128;
+ ddsd.dwHeight = 128;
+ U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
+ U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB;
+ U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 32;
+ U2(U4(ddsd).ddpfPixelFormat).dwRBitMask = 0x00FF0000;
+ U3(U4(ddsd).ddpfPixelFormat).dwGBitMask = 0x0000FF00;
+ U4(U4(ddsd).ddpfPixelFormat).dwBBitMask = 0x000000FF;
+ hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &texture_levels[i][0], NULL);
+ ok(hr==DD_OK, "CreateSurface returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ /* Check the number of created mipmaps */
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface7_GetSurfaceDesc(texture_levels[i][0], &ddsd);
+ ok(hr==DD_OK, "IDirectDrawSurface7_GetSurfaceDesc returned: %x\n", hr);
+ ok(U2(ddsd).dwMipMapCount == 8, "unexpected mip count %u\n", U2(ddsd).dwMipMapCount);
+ if (U2(ddsd).dwMipMapCount != 8) goto out;
+
+ for (i1 = 1; i1 < 8; i1++)
+ {
+ hr = IDirectDrawSurface7_GetAttachedSurface(texture_levels[i][i1 - 1], &ddsd.ddsCaps,
+ &texture_levels[i][i1]);
+ ok(hr == DD_OK, "GetAttachedSurface returned %08x\n", hr);
+ if (FAILED(hr)) goto out;
+ }
+ }
+
+ for (i1 = 0; i1 < 8; i1++)
+ {
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface7_Lock(texture_levels[0][i1], NULL, &ddsd, DDLOCK_WAIT, NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ for (y = 0; y < ddsd.dwHeight; y++)
+ {
+ DWORD *texture_row = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
+
+ for (x = 0; x < ddsd.dwWidth; x++)
+ {
+ /* x stored in green component, y in blue. */
+ DWORD color = 0xff0000 | (x << 8) | y;
+ *texture_row++ = color;
+ }
+ }
+
+ hr = IDirectDrawSurface7_Unlock(texture_levels[0][i1], NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n", hr);
+ }
+
+ for (i1 = 0; i1 < 8; i1++)
+ {
+ memset(&ddbltfx, 0, sizeof(ddbltfx));
+ ddbltfx.dwSize = sizeof(ddbltfx);
+ U5(ddbltfx).dwFillColor = 0;
+ hr = IDirectDrawSurface7_Blt(texture_levels[1][i1], NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx);
+ ok(hr == DD_OK, "IDirectDrawSurface7_Blt failed with %08x\n", hr);
+ }
+
+ /* First test some broken coordinates */
+ loadpoint.x = loadpoint.y = 0;
+ SetRectEmpty(&loadrect);
+ hr = IDirect3DDevice7_Load(device, texture_levels[1][0], &loadpoint, texture_levels[0][0], &loadrect, 0);
+ ok(hr==DDERR_INVALIDPARAMS, "IDirect3DDevice7_Load returned: %x\n", hr);
+
+ loadpoint.x = loadpoint.y = 50;
+ loadrect.left = 0;
+ loadrect.top = 0;
+ loadrect.right = 100;
+ loadrect.bottom = 100;
+ hr = IDirect3DDevice7_Load(device, texture_levels[1][0], &loadpoint, texture_levels[0][0], &loadrect, 0);
+ ok(hr==DDERR_INVALIDPARAMS, "IDirect3DDevice7_Load returned: %x\n", hr);
+
+ /* Test actual loading */
+ loadpoint.x = loadpoint.y = 31;
+ loadrect.left = 30;
+ loadrect.top = 20;
+ loadrect.right = 93;
+ loadrect.bottom = 52;
+
+ hr = IDirect3DDevice7_Load(device, texture_levels[1][0], &loadpoint, texture_levels[0][0], &loadrect, 0);
+ ok(hr==D3D_OK, "IDirect3DDevice7_Load returned: %x\n", hr);
+
+ for (i1 = 0; i1 < 8; i1++)
+ {
+ diff_count = 0;
+ diff_count2 = 0;
+
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface7_Lock(texture_levels[1][i1], NULL, &ddsd, DDLOCK_WAIT, NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ for (y = 0; y < ddsd.dwHeight; y++)
+ {
+ DWORD *texture_row = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
+
+ for (x = 0; x < ddsd.dwWidth; x++)
+ {
+ DWORD color = *texture_row++;
+ DWORD r = (color & 0xff0000) >> 16;
+ DWORD g = (color & 0xff00) >> 8;
+ DWORD b = (color & 0xff);
+
+ if (x < loadpoint.x || x >= loadpoint.x + loadrect.right - loadrect.left ||
+ y < loadpoint.y || y >= loadpoint.y + loadrect.bottom - loadrect.top)
+ {
+ if (color & 0xffffff) diff_count++;
+ }
+ else
+ {
+ if (r != 0xff || g != x + loadrect.left - loadpoint.x || b != y + loadrect.top - loadpoint.y)
+ diff_count++;
+ }
+
+ /* This codepath is for software RGB device. It has what looks like some weird off-by-one errors, but
+ may technically be correct as it's not precisely defined by docs. */
+ if (x < loadpoint.x || x >= loadpoint.x + loadrect.right - loadrect.left ||
+ y < loadpoint.y || y >= loadpoint.y + loadrect.bottom - loadrect.top + 1)
+ {
+ if (color & 0xffffff) diff_count2++;
+ }
+ else
+ {
+ if (r != 0xff || !IS_VALUE_NEAR(g, x + loadrect.left - loadpoint.x) ||
+ !IS_VALUE_NEAR(b, y + loadrect.top - loadpoint.y)) diff_count2++;
+ }
+ }
+ }
+
+ hr = IDirectDrawSurface7_Unlock(texture_levels[1][i1], NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n", hr);
+
+ ok(diff_count == 0 || diff_count2 == 0,
+ "Unexpected destination texture level pixels; %u differences at %d level\n",
+ min(diff_count, diff_count2), i1);
+
+ loadpoint.x /= 2;
+ loadpoint.y /= 2;
+ loadrect.top /= 2;
+ loadrect.left /= 2;
+ loadrect.right = (loadrect.right + 1) / 2;
+ loadrect.bottom = (loadrect.bottom + 1) / 2;
+ }
+
+ /* This crashes on native (tested on real windows XP / directx9 / nvidia and
+ * qemu Win98 / directx7 / RGB software rasterizer):
+ * passing non toplevel surfaces (sublevels) to Load (DX7 docs tell not to do this)
+ hr = IDirect3DDevice7_Load(device, texture_levels[1][1], NULL, texture_levels[0][1], NULL, 0);
+ */
+
+ /* Freed in reverse order as native seems to dislike and crash on freeing top level surface first */
+ for (i = 0; i < 2; i++)
+ {
+ for (i1 = 7; i1 >= 0; i1--)
+ {
+ if (texture_levels[i][i1]) IDirectDrawSurface7_Release(texture_levels[i][i1]);
+ }
+ }
+ memset(texture_levels, 0, sizeof(texture_levels));
+
+ /* Test texture size mismatch */
+ for (i = 0; i < 2; i++)
+ {
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE;
+ ddsd.dwWidth = i ? 256 : 128;
+ ddsd.dwHeight = 128;
+ hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &texture_levels[i][0], NULL);
+ ok(hr==DD_OK, "CreateSurface returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+ }
+
+ hr = IDirect3DDevice7_Load(device, texture_levels[1][0], NULL, texture_levels[0][0], NULL, 0);
+ ok(hr==DDERR_INVALIDPARAMS, "IDirect3DDevice7_Load returned: %x\n", hr);
+
+ hr = IDirect3DDevice7_Load(device, texture_levels[0][0], NULL, texture_levels[1][0], NULL, 0);
+ ok(hr==DDERR_INVALIDPARAMS, "IDirect3DDevice7_Load returned: %x\n", hr);
+
+ IDirectDrawSurface7_Release(texture_levels[0][0]);
+ IDirectDrawSurface7_Release(texture_levels[1][0]);
+ memset(texture_levels, 0, sizeof(texture_levels));
+
+ memset(&d3dcaps, 0, sizeof(d3dcaps));
+ hr = IDirect3DDevice7_GetCaps(device, &d3dcaps);
+ ok(hr == D3D_OK, "IDirect3DDevice7_GetCaps returned %08x\n", hr);
+
+ if (!(d3dcaps.dpcTriCaps.dwTextureCaps & D3DPTEXTURECAPS_CUBEMAP))
+ {
+ skip("No cubemap support\n");
+ }
+ else
+ {
+ /* Test loading mipmapped cubemap texture subrectangle from another similar texture */
+ for (i = 0; i < 2; i++)
+ {
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
+ ddsd.ddsCaps.dwCaps2 = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_ALLFACES;
+ ddsd.dwWidth = 128;
+ ddsd.dwHeight = 128;
+ U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
+ U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB;
+ U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 32;
+ U2(U4(ddsd).ddpfPixelFormat).dwRBitMask = 0x00FF0000;
+ U3(U4(ddsd).ddpfPixelFormat).dwGBitMask = 0x0000FF00;
+ U4(U4(ddsd).ddpfPixelFormat).dwBBitMask = 0x000000FF;
+ hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &cube_face_levels[i][0][0], NULL);
+ ok(hr==DD_OK, "CreateSurface returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ flags = DDSCAPS2_CUBEMAP_NEGATIVEX;
+ for (i1 = 1; i1 < 6; i1++, flags <<= 1)
+ {
+ ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE;
+ ddsd.ddsCaps.dwCaps2 = DDSCAPS2_CUBEMAP | flags;
+ hr = IDirectDrawSurface7_GetAttachedSurface(cube_face_levels[i][0][0], &ddsd.ddsCaps,
+ &cube_face_levels[i][i1][0]);
+ ok(hr == DD_OK, "GetAttachedSurface returned %08x\n", hr);
+ if (FAILED(hr)) goto out;
+ }
+
+ for (i1 = 0; i1 < 6; i1++)
+ {
+ /* Check the number of created mipmaps */
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface7_GetSurfaceDesc(cube_face_levels[i][i1][0], &ddsd);
+ ok(hr==DD_OK, "IDirectDrawSurface7_GetSurfaceDesc returned: %x\n", hr);
+ ok(U2(ddsd).dwMipMapCount == 8, "unexpected mip count %u\n", U2(ddsd).dwMipMapCount);
+ if (U2(ddsd).dwMipMapCount != 8) goto out;
+
+ for (i2 = 1; i2 < 8; i2++)
+ {
+ ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_MIPMAP;
+ ddsd.ddsCaps.dwCaps2 = DDSCAPS2_MIPMAPSUBLEVEL;
+ hr = IDirectDrawSurface7_GetAttachedSurface(cube_face_levels[i][i1][i2 - 1], &ddsd.ddsCaps,
+ &cube_face_levels[i][i1][i2]);
+ ok(hr == DD_OK, "GetAttachedSurface returned %08x\n", hr);
+ if (FAILED(hr)) goto out;
+ }
+ }
+ }
+
+ for (i = 0; i < 6; i++)
+ {
+ for (i1 = 0; i1 < 8; i1++)
+ {
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface7_Lock(cube_face_levels[0][i][i1], NULL, &ddsd, DDLOCK_WAIT, NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ for (y = 0; y < ddsd.dwHeight; y++)
+ {
+ DWORD *texture_row = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
+
+ for (x = 0; x < ddsd.dwWidth; x++)
+ {
+ /* face number in low 4 bits of red, x stored in green component, y in blue. */
+ DWORD color = 0xf00000 | (i << 16) | (x << 8) | y;
+ *texture_row++ = color;
+ }
+ }
+
+ hr = IDirectDrawSurface7_Unlock(cube_face_levels[0][i][i1], NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n", hr);
+ }
+ }
+
+ for (i = 0; i < 6; i++)
+ {
+ for (i1 = 0; i1 < 8; i1++)
+ {
+ memset(&ddbltfx, 0, sizeof(ddbltfx));
+ ddbltfx.dwSize = sizeof(ddbltfx);
+ U5(ddbltfx).dwFillColor = 0;
+ hr = IDirectDrawSurface7_Blt(cube_face_levels[1][i][i1], NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT,
+ &ddbltfx);
+ ok(hr == DD_OK, "IDirectDrawSurface7_Blt failed with %08x\n", hr);
+ }
+ }
+
+ loadpoint.x = loadpoint.y = 10;
+ loadrect.left = 30;
+ loadrect.top = 20;
+ loadrect.right = 93;
+ loadrect.bottom = 52;
+
+ hr = IDirect3DDevice7_Load(device, cube_face_levels[1][0][0], &loadpoint, cube_face_levels[0][0][0], &loadrect,
+ DDSCAPS2_CUBEMAP_ALLFACES);
+ ok(hr==D3D_OK, "IDirect3DDevice7_Load returned: %x\n", hr);
+
+ for (i = 0; i < 6; i++)
+ {
+ loadpoint.x = loadpoint.y = 10;
+ loadrect.left = 30;
+ loadrect.top = 20;
+ loadrect.right = 93;
+ loadrect.bottom = 52;
+
+ for (i1 = 0; i1 < 8; i1++)
+ {
+ diff_count = 0;
+ diff_count2 = 0;
+
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface7_Lock(cube_face_levels[1][i][i1], NULL, &ddsd, DDLOCK_WAIT, NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ for (y = 0; y < ddsd.dwHeight; y++)
+ {
+ DWORD *texture_row = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
+
+ for (x = 0; x < ddsd.dwWidth; x++)
+ {
+ DWORD color = *texture_row++;
+ DWORD r = (color & 0xff0000) >> 16;
+ DWORD g = (color & 0xff00) >> 8;
+ DWORD b = (color & 0xff);
+
+ if (x < loadpoint.x || x >= loadpoint.x + loadrect.right - loadrect.left ||
+ y < loadpoint.y || y >= loadpoint.y + loadrect.bottom - loadrect.top)
+ {
+ if (color & 0xffffff) diff_count++;
+ }
+ else
+ {
+ if (r != (0xf0 | i) || g != x + loadrect.left - loadpoint.x ||
+ b != y + loadrect.top - loadpoint.y) diff_count++;
+ }
+
+ /* This codepath is for software RGB device. It has what looks like some weird off-by-one
+ errors, but may technically be correct as it's not precisely defined by docs. */
+ if (x < loadpoint.x || x >= loadpoint.x + loadrect.right - loadrect.left ||
+ y < loadpoint.y || y >= loadpoint.y + loadrect.bottom - loadrect.top + 1)
+ {
+ if (color & 0xffffff) diff_count2++;
+ }
+ else
+ {
+ if (r != (0xf0 | i) || !IS_VALUE_NEAR(g, x + loadrect.left - loadpoint.x) ||
+ !IS_VALUE_NEAR(b, y + loadrect.top - loadpoint.y)) diff_count2++;
+ }
+ }
+ }
+
+ hr = IDirectDrawSurface7_Unlock(cube_face_levels[1][i][i1], NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n", hr);
+
+ ok(diff_count == 0 || diff_count2 == 0,
+ "Unexpected destination texture level pixels; %u differences at face %x level %d\n",
+ min(diff_count, diff_count2), i, i1);
+
+ loadpoint.x /= 2;
+ loadpoint.y /= 2;
+ loadrect.top /= 2;
+ loadrect.left /= 2;
+ loadrect.right = (loadrect.right + 1) / 2;
+ loadrect.bottom = (loadrect.bottom + 1) / 2;
+ }
+ }
+
+ for (i = 0; i < 2; i++)
+ {
+ for (i1 = 5; i1 >= 0; i1--)
+ {
+ for (i2 = 7; i2 >= 0; i2--)
+ {
+ if (cube_face_levels[i][i1][i2]) IDirectDrawSurface7_Release(cube_face_levels[i][i1][i2]);
+ }
+ }
+ }
+ memset(cube_face_levels, 0, sizeof(cube_face_levels));
+
+ /* Test cubemap loading from regular texture */
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX;
+ ddsd.ddsCaps.dwCaps2 = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_ALLFACES;
+ ddsd.dwWidth = 128;
+ ddsd.dwHeight = 128;
+ hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &cube_face_levels[0][0][0], NULL);
+ ok(hr==DD_OK, "CreateSurface returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE;
+ ddsd.dwWidth = 128;
+ ddsd.dwHeight = 128;
+ hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &texture_levels[0][0], NULL);
+ ok(hr==DD_OK, "CreateSurface returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ hr = IDirect3DDevice7_Load(device, cube_face_levels[0][0][0], NULL, texture_levels[0][0], NULL,
+ DDSCAPS2_CUBEMAP_ALLFACES);
+ ok(hr==DDERR_INVALIDPARAMS, "IDirect3DDevice7_Load returned: %x\n", hr);
+
+ IDirectDrawSurface7_Release(cube_face_levels[0][0][0]);
+ memset(cube_face_levels, 0, sizeof(cube_face_levels));
+ IDirectDrawSurface7_Release(texture_levels[0][0]);
+ memset(texture_levels, 0, sizeof(texture_levels));
+
+ /* Partial cube maps(e.g. created with an explicitly set DDSCAPS2_CUBEMAP_POSITIVEX flag)
+ * BSOD some Windows machines when an app tries to create them(Radeon X1600, Windows XP,
+ * Catalyst 10.2 driver, 6.14.10.6925)
+ */
+ }
+
+ /* Test texture loading with different mip level count (larger levels match, smaller levels missing in destination) */
+ for (i = 0; i < 2; i++)
+ {
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_MIPMAPCOUNT;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
+ ddsd.dwWidth = 128;
+ ddsd.dwHeight = 128;
+ U2(ddsd).dwMipMapCount = i ? 4 : 8;
+ U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
+ U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB;
+ U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 32;
+ U2(U4(ddsd).ddpfPixelFormat).dwRBitMask = 0x00FF0000;
+ U3(U4(ddsd).ddpfPixelFormat).dwGBitMask = 0x0000FF00;
+ U4(U4(ddsd).ddpfPixelFormat).dwBBitMask = 0x000000FF;
+ hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &texture_levels[i][0], NULL);
+ ok(hr==DD_OK, "CreateSurface returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ /* Check the number of created mipmaps */
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface7_GetSurfaceDesc(texture_levels[i][0], &ddsd);
+ ok(hr==DD_OK, "IDirectDrawSurface7_GetSurfaceDesc returned: %x\n", hr);
+ ok(U2(ddsd).dwMipMapCount == (i ? 4 : 8), "unexpected mip count %u\n", U2(ddsd).dwMipMapCount);
+ if (U2(ddsd).dwMipMapCount != (i ? 4 : 8)) goto out;
+
+ for (i1 = 1; i1 < (i ? 4 : 8); i1++)
+ {
+ hr = IDirectDrawSurface7_GetAttachedSurface(texture_levels[i][i1 - 1], &ddsd.ddsCaps,
+ &texture_levels[i][i1]);
+ ok(hr == DD_OK, "GetAttachedSurface returned %08x\n", hr);
+ if (FAILED(hr)) goto out;
+ }
+ }
+
+ for (i1 = 0; i1 < 8; i1++)
+ {
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface7_Lock(texture_levels[0][i1], NULL, &ddsd, DDLOCK_WAIT, NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ for (y = 0; y < ddsd.dwHeight; y++)
+ {
+ DWORD *texture_row = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
+
+ for (x = 0; x < ddsd.dwWidth; x++)
+ {
+ /* x stored in green component, y in blue. */
+ DWORD color = 0xf00000 | (i1 << 16) | (x << 8) | y;
+ *texture_row++ = color;
+ }
+ }
+
+ hr = IDirectDrawSurface7_Unlock(texture_levels[0][i1], NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n", hr);
+ }
+
+ for (i1 = 0; i1 < 4; i1++)
+ {
+ memset(&ddbltfx, 0, sizeof(ddbltfx));
+ ddbltfx.dwSize = sizeof(ddbltfx);
+ U5(ddbltfx).dwFillColor = 0;
+ hr = IDirectDrawSurface7_Blt(texture_levels[1][i1], NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx);
+ ok(hr == DD_OK, "IDirectDrawSurface7_Blt failed with %08x\n", hr);
+ }
+
+ loadpoint.x = loadpoint.y = 31;
+ loadrect.left = 30;
+ loadrect.top = 20;
+ loadrect.right = 93;
+ loadrect.bottom = 52;
+
+ /* Destination mip levels are a subset of source mip levels. */
+ hr = IDirect3DDevice7_Load(device, texture_levels[1][0], &loadpoint, texture_levels[0][0], &loadrect, 0);
+ ok(hr==D3D_OK, "IDirect3DDevice7_Load returned: %x\n", hr);
+
+ for (i1 = 0; i1 < 4; i1++)
+ {
+ diff_count = 0;
+ diff_count2 = 0;
+
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface7_Lock(texture_levels[1][i1], NULL, &ddsd, DDLOCK_WAIT, NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ for (y = 0; y < ddsd.dwHeight; y++)
+ {
+ DWORD *texture_row = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
+
+ for (x = 0; x < ddsd.dwWidth; x++)
+ {
+ DWORD color = *texture_row++;
+ DWORD r = (color & 0xff0000) >> 16;
+ DWORD g = (color & 0xff00) >> 8;
+ DWORD b = (color & 0xff);
+
+ if (x < loadpoint.x || x >= loadpoint.x + loadrect.right - loadrect.left ||
+ y < loadpoint.y || y >= loadpoint.y + loadrect.bottom - loadrect.top)
+ {
+ if (color & 0xffffff) diff_count++;
+ }
+ else
+ {
+ if (r != (0xf0 | i1) || g != x + loadrect.left - loadpoint.x ||
+ b != y + loadrect.top - loadpoint.y) diff_count++;
+ }
+
+ /* This codepath is for software RGB device. It has what looks like some weird off-by-one errors, but
+ may technically be correct as it's not precisely defined by docs. */
+ if (x < loadpoint.x || x >= loadpoint.x + loadrect.right - loadrect.left ||
+ y < loadpoint.y || y >= loadpoint.y + loadrect.bottom - loadrect.top + 1)
+ {
+ if (color & 0xffffff) diff_count2++;
+ }
+ else
+ {
+ if (r != (0xf0 | i1) || !IS_VALUE_NEAR(g, x + loadrect.left - loadpoint.x) ||
+ !IS_VALUE_NEAR(b, y + loadrect.top - loadpoint.y)) diff_count2++;
+ }
+ }
+ }
+
+ hr = IDirectDrawSurface7_Unlock(texture_levels[1][i1], NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n", hr);
+
+ ok(diff_count == 0 || diff_count2 == 0,
+ "Unexpected destination texture level pixels; %u differences at %d level\n",
+ min(diff_count, diff_count2), i1);
+
+ loadpoint.x /= 2;
+ loadpoint.y /= 2;
+ loadrect.top /= 2;
+ loadrect.left /= 2;
+ loadrect.right = (loadrect.right + 1) / 2;
+ loadrect.bottom = (loadrect.bottom + 1) / 2;
+ }
+
+ /* Destination mip levels are a superset of source mip levels (should fail). */
+ hr = IDirect3DDevice7_Load(device, texture_levels[0][0], &loadpoint, texture_levels[1][0], &loadrect, 0);
+ ok(hr==DDERR_INVALIDPARAMS, "IDirect3DDevice7_Load returned: %x\n", hr);
+
+ for (i = 0; i < 2; i++)
+ {
+ for (i1 = 7; i1 >= 0; i1--)
+ {
+ if (texture_levels[i][i1]) IDirectDrawSurface7_Release(texture_levels[i][i1]);
+ }
+ }
+ memset(texture_levels, 0, sizeof(texture_levels));
+
+ /* Test loading from mipmap texture to a regular texture that matches one sublevel in size */
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
+ ddsd.dwWidth = 128;
+ ddsd.dwHeight = 128;
+ U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
+ U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB;
+ U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 32;
+ U2(U4(ddsd).ddpfPixelFormat).dwRBitMask = 0x00FF0000;
+ U3(U4(ddsd).ddpfPixelFormat).dwGBitMask = 0x0000FF00;
+ U4(U4(ddsd).ddpfPixelFormat).dwBBitMask = 0x000000FF;
+ hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &texture_levels[0][0], NULL);
+ ok(hr==DD_OK, "CreateSurface returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE;
+ ddsd.dwWidth = 32;
+ ddsd.dwHeight = 32;
+ U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
+ U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB;
+ U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 32;
+ U2(U4(ddsd).ddpfPixelFormat).dwRBitMask = 0x00FF0000;
+ U3(U4(ddsd).ddpfPixelFormat).dwGBitMask = 0x0000FF00;
+ U4(U4(ddsd).ddpfPixelFormat).dwBBitMask = 0x000000FF;
+ hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &texture_levels[1][0], NULL);
+ ok(hr==DD_OK, "CreateSurface returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ for (i1 = 1; i1 < 8; i1++)
+ {
+ hr = IDirectDrawSurface7_GetAttachedSurface(texture_levels[0][i1 - 1], &ddsd.ddsCaps, &texture_levels[0][i1]);
+ ok(hr == DD_OK, "GetAttachedSurface returned %08x\n", hr);
+ if (FAILED(hr)) goto out;
+ }
+
+ for (i1 = 0; i1 < 8; i1++)
+ {
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface7_Lock(texture_levels[0][i1], NULL, &ddsd, DDLOCK_WAIT, NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ for (y = 0; y < ddsd.dwHeight; y++)
+ {
+ DWORD *texture_row = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
+
+ for (x = 0; x < ddsd.dwWidth; x++)
+ {
+ /* x stored in green component, y in blue. */
+ DWORD color = 0xf00000 | (i1 << 16) | (x << 8) | y;
+ *texture_row++ = color;
+ }
+ }
+
+ hr = IDirectDrawSurface7_Unlock(texture_levels[0][i1], NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n", hr);
+ }
+
+ memset(&ddbltfx, 0, sizeof(ddbltfx));
+ ddbltfx.dwSize = sizeof(ddbltfx);
+ U5(ddbltfx).dwFillColor = 0;
+ hr = IDirectDrawSurface7_Blt(texture_levels[1][0], NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx);
+ ok(hr == DD_OK, "IDirectDrawSurface7_Blt failed with %08x\n", hr);
+
+ loadpoint.x = loadpoint.y = 32;
+ loadrect.left = 32;
+ loadrect.top = 32;
+ loadrect.right = 96;
+ loadrect.bottom = 96;
+
+ hr = IDirect3DDevice7_Load(device, texture_levels[1][0], &loadpoint, texture_levels[0][0], &loadrect, 0);
+ ok(hr==D3D_OK, "IDirect3DDevice7_Load returned: %x\n", hr);
+
+ loadpoint.x /= 4;
+ loadpoint.y /= 4;
+ loadrect.top /= 4;
+ loadrect.left /= 4;
+ loadrect.right = (loadrect.right + 3) / 4;
+ loadrect.bottom = (loadrect.bottom + 3) / 4;
+
+ /* NOTE: something in either nvidia driver or directx9 on WinXP appears to be broken:
+ * this kind of Load calls (to subset with smaller surface(s)) produces wrong results with
+ * copied subrectangles divided more than needed, without apparent logic. But it works
+ * as expected on qemu / Win98 / directx7 / RGB device. Some things are broken on XP, e.g.
+ * some games don't work that worked in Win98, so it is assumed here XP results are wrong.
+ * The following code attempts to detect broken results, actual tests will then be skipped
+ */
+ load_mip_subset_broken = TRUE;
+ diff_count = 0;
+
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface7_Lock(texture_levels[1][0], NULL, &ddsd, DDLOCK_WAIT, NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ for (y = 0; y < ddsd.dwHeight; y++)
+ {
+ DWORD *texture_row = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
+
+ for (x = 0; x < ddsd.dwWidth; x++)
+ {
+ DWORD color = *texture_row++;
+
+ if (x < 2 || x >= 2 + 4 ||
+ y < 2 || y >= 2 + 4)
+ {
+ if (color & 0xffffff) diff_count++;
+ }
+ else
+ {
+ DWORD r = (color & 0xff0000) >> 16;
+
+ if ((r & (0xf0)) != 0xf0) diff_count++;
+ }
+ }
+ }
+
+ if (diff_count) load_mip_subset_broken = FALSE;
+
+ if (load_mip_subset_broken) {
+ skip("IDirect3DDevice7_Load is broken (happens on some Windows installations like XP). Skipping affected tests.\n");
+ } else {
+ diff_count = 0;
+
+ for (y = 0; y < ddsd.dwHeight; y++)
+ {
+ DWORD *texture_row = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
+
+ for (x = 0; x < ddsd.dwWidth; x++)
+ {
+ DWORD color = *texture_row++;
+
+ if (x < loadpoint.x || x >= loadpoint.x + loadrect.right - loadrect.left ||
+ y < loadpoint.y || y >= loadpoint.y + loadrect.bottom - loadrect.top)
+ {
+ if (color & 0xffffff) diff_count++;
+ }
+ else
+ {
+ DWORD r = (color & 0xff0000) >> 16;
+ DWORD g = (color & 0xff00) >> 8;
+ DWORD b = (color & 0xff);
+
+ if (r != 0xf2 || g != x + loadrect.left - loadpoint.x || b != y + loadrect.top - loadpoint.y)
+ diff_count++;
+ }
+ }
+ }
+ }
+
+ hr = IDirectDrawSurface7_Unlock(texture_levels[1][0], NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n", hr);
+
+ ok(diff_count == 0, "Unexpected destination texture level pixels; %u differences\n", diff_count);
+
+ for (i = 0; i < 2; i++)
+ {
+ for (i1 = 7; i1 >= 0; i1--)
+ {
+ if (texture_levels[i][i1]) IDirectDrawSurface7_Release(texture_levels[i][i1]);
+ }
+ }
+ memset(texture_levels, 0, sizeof(texture_levels));
+
+ if (!load_mip_subset_broken)
+ {
+ /* Test loading when destination mip levels are a subset of source mip levels and start from smaller surface
+ (than first source mip level) */
+ for (i = 0; i < 2; i++)
+ {
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+ if (i) ddsd.dwFlags |= DDSD_MIPMAPCOUNT;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
+ ddsd.dwWidth = i ? 32 : 128;
+ ddsd.dwHeight = i ? 32 : 128;
+ if (i) U2(ddsd).dwMipMapCount = 4;
+ U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
+ U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB;
+ U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 32;
+ U2(U4(ddsd).ddpfPixelFormat).dwRBitMask = 0x00FF0000;
+ U3(U4(ddsd).ddpfPixelFormat).dwGBitMask = 0x0000FF00;
+ U4(U4(ddsd).ddpfPixelFormat).dwBBitMask = 0x000000FF;
+ hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &texture_levels[i][0], NULL);
+ ok(hr==DD_OK, "CreateSurface returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ /* Check the number of created mipmaps */
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface7_GetSurfaceDesc(texture_levels[i][0], &ddsd);
+ ok(hr==DD_OK, "IDirectDrawSurface7_GetSurfaceDesc returned: %x\n", hr);
+ ok(U2(ddsd).dwMipMapCount == (i ? 4 : 8), "unexpected mip count %u\n", U2(ddsd).dwMipMapCount);
+ if (U2(ddsd).dwMipMapCount != (i ? 4 : 8)) goto out;
+
+ for (i1 = 1; i1 < (i ? 4 : 8); i1++)
+ {
+ hr = IDirectDrawSurface7_GetAttachedSurface(texture_levels[i][i1 - 1], &ddsd.ddsCaps,
+ &texture_levels[i][i1]);
+ ok(hr == DD_OK, "GetAttachedSurface returned %08x\n", hr);
+ if (FAILED(hr)) goto out;
+ }
+ }
+
+ for (i1 = 0; i1 < 8; i1++)
+ {
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface7_Lock(texture_levels[0][i1], NULL, &ddsd, DDLOCK_WAIT, NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ for (y = 0; y < ddsd.dwHeight; y++)
+ {
+ DWORD *texture_row = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
+
+ for (x = 0; x < ddsd.dwWidth; x++)
+ {
+ /* x stored in green component, y in blue. */
+ DWORD color = 0xf00000 | (i1 << 16) | (x << 8) | y;
+ *texture_row++ = color;
+ }
+ }
+
+ hr = IDirectDrawSurface7_Unlock(texture_levels[0][i1], NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n", hr);
+ }
+
+ for (i1 = 0; i1 < 4; i1++)
+ {
+ memset(&ddbltfx, 0, sizeof(ddbltfx));
+ ddbltfx.dwSize = sizeof(ddbltfx);
+ U5(ddbltfx).dwFillColor = 0;
+ hr = IDirectDrawSurface7_Blt(texture_levels[1][i1], NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT,
+ &ddbltfx);
+ ok(hr == DD_OK, "IDirectDrawSurface7_Blt failed with %08x\n", hr);
+ }
+
+ loadpoint.x = loadpoint.y = 0;
+ loadrect.left = 0;
+ loadrect.top = 0;
+ loadrect.right = 64;
+ loadrect.bottom = 64;
+
+ hr = IDirect3DDevice7_Load(device, texture_levels[1][0], &loadpoint, texture_levels[0][0], &loadrect, 0);
+ ok(hr==D3D_OK, "IDirect3DDevice7_Load returned: %x\n", hr);
+
+ i = 0;
+ for (i1 = 0; i1 < 8 && i < 4; i1++)
+ {
+ DDSURFACEDESC2 ddsd2;
+
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface7_GetSurfaceDesc(texture_levels[0][i1], &ddsd);
+ ok(SUCCEEDED(hr), "IDirectDrawSurface7_GetSurfaceDesc returned %#x.\n", hr);
+
+ memset(&ddsd2, 0, sizeof(DDSURFACEDESC2));
+ ddsd2.dwSize = sizeof(ddsd2);
+ hr = IDirectDrawSurface7_GetSurfaceDesc(texture_levels[1][i], &ddsd2);
+ ok(SUCCEEDED(hr), "IDirectDrawSurface7_GetSurfaceDesc returned %#x.\n", hr);
+
+ if (ddsd.dwWidth == ddsd2.dwWidth && ddsd.dwHeight == ddsd2.dwHeight)
+ {
+ diff_count = 0;
+
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface7_Lock(texture_levels[1][i], NULL, &ddsd, DDLOCK_WAIT, NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Lock returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ for (y = 0; y < ddsd.dwHeight; y++)
+ {
+ DWORD *texture_row = (DWORD*)((char*)ddsd.lpSurface + y * U1(ddsd).lPitch);
+
+ for (x = 0; x < ddsd.dwWidth; x++)
+ {
+ DWORD color = *texture_row++;
+
+ if (x < loadpoint.x || x >= loadpoint.x + loadrect.right - loadrect.left ||
+ y < loadpoint.y || y >= loadpoint.y + loadrect.bottom - loadrect.top)
+ {
+ if (color & 0xffffff) diff_count++;
+ }
+ else
+ {
+ DWORD r = (color & 0xff0000) >> 16;
+ DWORD g = (color & 0xff00) >> 8;
+ DWORD b = (color & 0xff);
+
+ if (r != (0xf0 | i1) || g != x + loadrect.left - loadpoint.x ||
+ b != y + loadrect.top - loadpoint.y) diff_count++;
+ }
+ }
+ }
+
+ hr = IDirectDrawSurface7_Unlock(texture_levels[1][i], NULL);
+ ok(hr==DD_OK, "IDirectDrawSurface7_Unlock returned: %x\n", hr);
+
+ ok(diff_count == 0, "Unexpected destination texture level pixels; %u differences at %d level\n",
+ diff_count, i1);
+
+ i++;
+ }
+
+ loadpoint.x /= 2;
+ loadpoint.y /= 2;
+ loadrect.top /= 2;
+ loadrect.left /= 2;
+ loadrect.right = (loadrect.right + 1) / 2;
+ loadrect.bottom = (loadrect.bottom + 1) / 2;
+ }
+
+ for (i = 0; i < 2; i++)
+ {
+ for (i1 = 7; i1 >= 0; i1--)
+ {
+ if (texture_levels[i][i1]) IDirectDrawSurface7_Release(texture_levels[i][i1]);
+ }
+ }
+ memset(texture_levels, 0, sizeof(texture_levels));
+ }
+
+ /* Test palette copying */
+ for (i = 0; i < 2; i++)
+ {
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+ ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
+ ddsd.dwWidth = 128;
+ ddsd.dwHeight = 128;
+ U4(ddsd).ddpfPixelFormat.dwSize = sizeof(U4(ddsd).ddpfPixelFormat);
+ U4(ddsd).ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_PALETTEINDEXED8;
+ U1(U4(ddsd).ddpfPixelFormat).dwRGBBitCount = 8;
+ hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &texture_levels[i][0], NULL);
+ ok(hr==DD_OK, "CreateSurface returned: %x\n", hr);
+ if (FAILED(hr)) goto out;
+
+ /* Check the number of created mipmaps */
+ memset(&ddsd, 0, sizeof(DDSURFACEDESC2));
+ ddsd.dwSize = sizeof(ddsd);
+ hr = IDirectDrawSurface7_GetSurfaceDesc(texture_levels[i][0], &ddsd);
+ ok(hr==DD_OK, "IDirectDrawSurface7_GetSurfaceDesc returned: %x\n", hr);
+ ok(U2(ddsd).dwMipMapCount == 8, "unexpected mip count %u\n", U2(ddsd).dwMipMapCount);
+ if (U2(ddsd).dwMipMapCount != 8) goto out;
+
+ for (i1 = 1; i1 < 8; i1++)
+ {
+ hr = IDirectDrawSurface7_GetAttachedSurface(texture_levels[i][i1 - 1], &ddsd.ddsCaps,
+ &texture_levels[i][i1]);
+ ok(hr == DD_OK, "GetAttachedSurface returned %08x\n", hr);
+ if (FAILED(hr)) goto out;
+ }
+ }
+
+ memset(table1, 0, sizeof(table1));
+ for (i = 0; i < 3; i++)
+ {
+ table1[0].peBlue = i + 1;
+ hr = IDirectDraw7_CreatePalette(ddraw, DDPCAPS_ALLOW256 | DDPCAPS_8BIT, table1, &palettes[i], NULL);
+ ok(hr == DD_OK, "CreatePalette returned %08x\n", hr);
+ if (FAILED(hr))
+ {
+ skip("IDirectDraw7_CreatePalette failed; skipping further tests\n");
+ goto out;
+ }
+ }
+
+ hr = IDirectDrawSurface7_SetPalette(texture_levels[0][0], palettes[0]);
+ ok(hr==DD_OK, "IDirectDrawSurface7_SetPalette returned: %x\n", hr);
+
+ hr = IDirect3DDevice7_Load(device, texture_levels[1][0], NULL, texture_levels[0][0], NULL, 0);
+ ok(hr==D3D_OK, "IDirect3DDevice7_Load returned: %x\n", hr);
+
+ hr = IDirectDrawSurface7_GetPalette(texture_levels[0][1], &palettes[4]);
+ ok(hr==DDERR_NOPALETTEATTACHED, "IDirectDrawSurface7_GetPalette returned: %x\n", hr);
+
+ hr = IDirectDrawSurface7_GetPalette(texture_levels[1][0], &palettes[4]);
+ ok(hr==DDERR_NOPALETTEATTACHED, "IDirectDrawSurface7_GetPalette returned: %x\n", hr);
+
+ hr = IDirectDrawSurface7_SetPalette(texture_levels[0][1], palettes[1]);
+ ok(hr==DDERR_NOTONMIPMAPSUBLEVEL, "IDirectDrawSurface7_SetPalette returned: %x\n", hr);
+ hr = IDirectDrawSurface7_SetPalette(texture_levels[1][0], palettes[2]);
+ ok(hr==DD_OK, "IDirectDrawSurface7_SetPalette returned: %x\n", hr);
+
+ hr = IDirect3DDevice7_Load(device, texture_levels[1][0], NULL, texture_levels[0][0], NULL, 0);
+ ok(hr==D3D_OK, "IDirect3DDevice7_Load returned: %x\n", hr);
+
+ memset(table1, 0, sizeof(table1));
+ hr = IDirectDrawSurface7_GetPalette(texture_levels[1][0], &palettes[4]);
+ ok(hr==DD_OK, "IDirectDrawSurface7_GetPalette returned: %x\n", hr);
+ if (SUCCEEDED(hr))
+ {
+ hr = IDirectDrawPalette_GetEntries(palettes[4], 0, 0, 256, table1);
+ ok(hr == DD_OK, "IDirectDrawPalette_GetEntries returned %08x\n", hr);
+ ok(table1[0].peBlue == 1, "Unexpected palette color after load: %u\n", (unsigned)table1[0].peBlue);
+ }
+
+ /* Test colorkey copying */
+ ddckey.dwColorSpaceLowValue = ddckey.dwColorSpaceHighValue = 64;
+ hr = IDirectDrawSurface7_SetColorKey(texture_levels[0][0], DDCKEY_SRCBLT, &ddckey);
+ ok(hr==DD_OK, "IDirectDrawSurface7_SetColorKey returned: %x\n", hr);
+ hr = IDirectDrawSurface7_SetColorKey(texture_levels[0][1], DDCKEY_SRCBLT, &ddckey);
+ ok(hr == DDERR_NOTONMIPMAPSUBLEVEL, "Got unexpected hr %#x.\n", hr);
+
+ hr = IDirectDrawSurface7_GetColorKey(texture_levels[1][0], DDCKEY_SRCBLT, &ddckey);
+ ok(hr==DDERR_NOCOLORKEY, "IDirectDrawSurface7_GetColorKey returned: %x\n", hr);
+
+ hr = IDirect3DDevice7_Load(device, texture_levels[1][0], NULL, texture_levels[0][0], NULL, 0);
+ ok(hr==D3D_OK, "IDirect3DDevice7_Load returned: %x\n", hr);
+
+ hr = IDirectDrawSurface7_GetColorKey(texture_levels[1][0], DDCKEY_SRCBLT, &ddckey);
+ ok(hr==DD_OK, "IDirectDrawSurface7_GetColorKey returned: %x\n", hr);
+ ok(ddckey.dwColorSpaceLowValue == ddckey.dwColorSpaceHighValue && ddckey.dwColorSpaceLowValue == 64,
+ "Unexpected color key values: %u - %u\n", ddckey.dwColorSpaceLowValue, ddckey.dwColorSpaceHighValue);
+
+out:
+ for (i = 0; i < 5; i++)
+ {
+ if (palettes[i]) IDirectDrawPalette_Release(palettes[i]);
+ }
+
+ for (i = 0; i < 2; i++)
+ {
+ for (i1 = 7; i1 >= 0; i1--)
+ {
+ if (texture_levels[i][i1]) IDirectDrawSurface7_Release(texture_levels[i][i1]);
+ }
+ }
+
+ for (i = 0; i < 2; i++)
+ {
+ for (i1 = 5; i1 >= 0; i1--)
+ {
+ for (i2 = 7; i2 >= 0; i2--)
+ {
+ if (cube_face_levels[i][i1][i2]) IDirectDrawSurface7_Release(cube_face_levels[i][i1][i2]);
+ }
+ }
+ }
+
+ IDirectDraw7_Release(ddraw);
+ refcount = IDirect3DDevice7_Release(device);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ DestroyWindow(window);
+}
+
START_TEST(ddraw7)
{
DDDEVICEIDENTIFIER2 identifier;
@@ -14402,4 +15489,5 @@ START_TEST(ddraw7)
test_clear();
test_enum_surfaces();
test_viewport();
+ test_device_load();
}
--
2.18.0
2
2
This patch adds the ability to decompress DXTn textures, and is meant to
be used for DXTn 3D textures because they are not supported properly in
drivers.
Signed-off-by: Connor McAdams <conmanx360(a)gmail.com>
---
dlls/wined3d/texture.c | 51 +++++++-
dlls/wined3d/utils.c | 275 +++++++++++++++++++++++++++++++++++++----
dlls/wined3d/wined3d_private.h | 4 +
3 files changed, 303 insertions(+), 27 deletions(-)
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index c316906..34e9e56 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -567,6 +567,8 @@ static void wined3d_texture_allocate_gl_mutable_storage(struct wined3d_texture *
unsigned int level, level_count, layer, layer_count;
GLsizei width, height, depth;
GLenum target;
+ GLint gl_format;
+ GLint gl_type;
level_count = texture->level_count;
if (texture->target == GL_TEXTURE_1D_ARRAY || texture->target == GL_TEXTURE_2D_ARRAY)
@@ -578,6 +580,18 @@ static void wined3d_texture_allocate_gl_mutable_storage(struct wined3d_texture *
{
target = wined3d_texture_get_sub_resource_target(texture, layer * level_count);
+ if (texture->resource.format_flags & WINED3DFMT_FLAG_DECOMPRESS)
+ {
+ gl_internal_format = GL_RGBA8;
+ gl_format = GL_BGRA;
+ gl_type = GL_UNSIGNED_INT_8_8_8_8_REV;
+ }
+ else
+ {
+ gl_format = format->glFormat;
+ gl_type = format->glType;
+ }
+
for (level = 0; level < level_count; ++level)
{
width = wined3d_texture_get_level_pow2_width(texture, level);
@@ -596,19 +610,19 @@ static void wined3d_texture_allocate_gl_mutable_storage(struct wined3d_texture *
depth = wined3d_texture_get_level_depth(texture, level);
GL_EXTCALL(glTexImage3D(target, level, gl_internal_format, width, height,
target == GL_TEXTURE_2D_ARRAY ? texture->layer_count : depth, 0,
- format->glFormat, format->glType, NULL));
+ gl_format, gl_type, NULL));
checkGLcall("glTexImage3D");
}
else if (target == GL_TEXTURE_1D)
{
gl_info->gl_ops.gl.p_glTexImage1D(target, level, gl_internal_format,
- width, 0, format->glFormat, format->glType, NULL);
+ width, 0, gl_format, gl_type, NULL);
}
else
{
gl_info->gl_ops.gl.p_glTexImage2D(target, level, gl_internal_format, width,
target == GL_TEXTURE_1D_ARRAY ? texture->layer_count : height, 0,
- format->glFormat, format->glType, NULL);
+ gl_format, gl_type, NULL);
checkGLcall("glTexImage2D");
}
}
@@ -624,6 +638,9 @@ static void wined3d_texture_allocate_gl_immutable_storage(struct wined3d_texture
GLsizei height = wined3d_texture_get_level_pow2_height(texture, 0);
GLsizei width = wined3d_texture_get_level_pow2_width(texture, 0);
+ if (texture->resource.format_flags & WINED3DFMT_FLAG_DECOMPRESS)
+ gl_internal_format = GL_RGBA8;
+
switch (texture->target)
{
case GL_TEXTURE_3D:
@@ -1948,6 +1965,34 @@ void wined3d_texture_upload_data(struct wined3d_texture *texture, unsigned int s
bo.addr += src_box->left * format->byte_count;
}
+ if (texture->resource.format_flags & WINED3DFMT_FLAG_DECOMPRESS)
+ {
+ unsigned int dst_row_pitch, dst_slice_pitch;
+ void *src_mem;
+
+ f = *format;
+ format = wined3d_get_format(gl_info, WINED3DFMT_B8G8R8A8_UNORM, WINED3DUSAGE_TEXTURE);
+
+ wined3d_format_calculate_pitch(format, 1, update_w, update_h, &dst_row_pitch, &dst_slice_pitch);
+
+ if (!(converted_mem = heap_calloc(update_d, dst_slice_pitch)))
+ {
+ ERR("Failed to allocate upload buffer.\n");
+ return;
+ }
+ src_mem = context_map_bo_address(context, &bo, src_slice_pitch,
+ GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_READ);
+ f.decompress(src_mem, converted_mem, src_row_pitch, src_slice_pitch,
+ dst_row_pitch, dst_slice_pitch, update_w, update_h, update_d);
+ context_unmap_bo_address(context, &bo, GL_PIXEL_UNPACK_BUFFER);
+
+ bo.buffer_object = 0;
+ bo.addr = converted_mem;
+ src_row_pitch = dst_row_pitch;
+ src_slice_pitch = dst_slice_pitch;
+ texture->resource.format_flags &= ~WINED3DFMT_FLAG_BLOCKS;
+ }
+
if (format->upload)
{
unsigned int dst_row_pitch, dst_slice_pitch;
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 937c1bc..04128d4 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -339,6 +339,34 @@ static const struct wined3d_format_base_flags format_base_flags[] =
{WINED3DFMT_RESZ, WINED3DFMT_FLAG_EXTENSION},
};
+static void convert_dxt1_b8g8r8a8_unorm(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch,
+ UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth);
+static void convert_dxt3_b8g8r8a8_unorm(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch,
+ UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth);
+static void convert_dxt5_b8g8r8a8_unorm(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch,
+ UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth);
+
+struct wined3d_format_decompress_info
+{
+ enum wined3d_format_id id;
+ DWORD flags;
+ void (*decompress)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch,
+ unsigned int dst_row_pitch, unsigned int dst_slice_pitch,
+ unsigned int width, unsigned int height, unsigned int depth);
+};
+
+static const struct wined3d_format_decompress_info format_decompress_info[] =
+{
+ {WINED3DFMT_DXT1, WINED3DFMT_FLAG_DECOMPRESS, convert_dxt1_b8g8r8a8_unorm},
+ {WINED3DFMT_DXT2, WINED3DFMT_FLAG_DECOMPRESS, convert_dxt3_b8g8r8a8_unorm},
+ {WINED3DFMT_DXT3, WINED3DFMT_FLAG_DECOMPRESS, convert_dxt3_b8g8r8a8_unorm},
+ {WINED3DFMT_DXT4, WINED3DFMT_FLAG_DECOMPRESS, convert_dxt5_b8g8r8a8_unorm},
+ {WINED3DFMT_DXT5, WINED3DFMT_FLAG_DECOMPRESS, convert_dxt5_b8g8r8a8_unorm},
+ {WINED3DFMT_BC1_UNORM, WINED3DFMT_FLAG_DECOMPRESS, convert_dxt1_b8g8r8a8_unorm},
+ {WINED3DFMT_BC2_UNORM, WINED3DFMT_FLAG_DECOMPRESS, convert_dxt3_b8g8r8a8_unorm},
+ {WINED3DFMT_BC3_UNORM, WINED3DFMT_FLAG_DECOMPRESS, convert_dxt5_b8g8r8a8_unorm},
+};
+
struct wined3d_format_block_info
{
enum wined3d_format_id id;
@@ -437,6 +465,9 @@ struct wined3d_format_texture_info
void (*download)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch,
unsigned int dst_row_pitch, unsigned int dst_slice_pitch,
unsigned int width, unsigned int height, unsigned int depth);
+ void (*decompress)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch,
+ unsigned int dst_row_pitch, unsigned int dst_slice_pitch,
+ unsigned int width, unsigned int height, unsigned int depth);
};
static void convert_l4a4_unorm(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch,
@@ -840,6 +871,206 @@ static void convert_s8_uint_d24_float(const BYTE *src, BYTE *dst, UINT src_row_p
}
}
+static void dxtn_decompress_block(const BYTE *src, BYTE *dst, UINT width, UINT height, UINT depth,
+ UINT x_pos, UINT y_pos, UINT z_pos, UINT dst_slice_pitch, UINT64 cur_block, UINT fmt, BYTE block_offset)
+{
+ UINT64 alpha_block, alpha_index, color_block, color_index;
+ const UINT64 *source;
+ DWORD *dest;
+ DWORD alpha_lookup;
+ DWORD bgra;
+ DWORD temp;
+ DWORD i, x, y;
+ WORD color[2];
+ BYTE alpha_val, color_val;
+ BYTE alpha[8];
+ BYTE r[4];
+ BYTE g[4];
+ BYTE b[4];
+
+ source = (const UINT64 *)(src + cur_block * block_offset);
+ if (fmt == WINED3DFMT_DXT1)
+ {
+ color_block = source[0];
+ alpha_block = 0;
+ }
+ else
+ {
+ alpha_block = source[0];
+ color_block = source[1];
+ }
+
+ color[0] = color_block & 0xffff;
+ color[1] = (color_block >> 16) & 0xffff;
+ for (i = 0; i < 2; ++i)
+ {
+ temp = (color[i] >> 11) * 255 + 16;
+ r[i] = (temp / 32 + temp) / 32;
+ temp = ((color[i] >> 5) & 0x3f) * 255 + 32;
+ g[i] = (temp / 64 + temp) / 64;
+ temp = (color[i] & 0x1f) * 255 + 16;
+ b[i] = (temp / 32 + temp) / 32;
+ }
+
+ if (fmt == WINED3DFMT_DXT3 || fmt == WINED3DFMT_DXT5 || color[0] > color[1])
+ {
+ for (i = 0; i < 2; ++i)
+ {
+ r[2 + i] = (2 * r[0 + i] + r[1 - i]) / 3;
+ g[2 + i] = (2 * g[0 + i] + g[1 - i]) / 3;
+ b[2 + i] = (2 * b[0 + i] + b[1 - i]) / 3;
+ }
+ }
+ else if (fmt == WINED3DFMT_DXT1 && color[0] <= color[1])
+ {
+ r[2] = (r[0] + r[1]) / 2;
+ g[2] = (g[0] + g[1]) / 2;
+ b[2] = (b[0] + b[1]) / 2;
+
+ r[3] = 0;
+ g[3] = 0;
+ b[3] = 0;
+ }
+
+ switch (fmt)
+ {
+ case WINED3DFMT_DXT1:
+ alpha_index = 0;
+ for (i = 0; i < ARRAY_SIZE(alpha); ++i)
+ alpha[i] = 255;
+ if (color[0] <= color[1])
+ alpha[3] = 0;
+ break;
+ case WINED3DFMT_DXT3:
+ alpha_index = alpha_block;
+ for (i = 0; i < ARRAY_SIZE(alpha); ++i)
+ alpha[i] = 0;
+ break;
+ case WINED3DFMT_DXT5:
+ alpha_index = (alpha_block >> 16);
+ alpha[0] = alpha_block & 0xff;
+ alpha[1] = (alpha_block >> 8) & 0xff;
+ if (alpha[0] > alpha[1])
+ {
+ for (i = 0; i < 6; ++i)
+ alpha[2 + i] = (((6 - i) * alpha[0]) + ((1 + i) * alpha[1])) / 7;
+ }
+ else if (alpha[0] <= alpha[1])
+ {
+ for (i = 0; i < 4; ++i)
+ alpha[2 + i] = (((4 - i) * alpha[0]) + ((1 + i) * alpha[1])) / 5;
+ alpha[6] = 0;
+ alpha[7] = 255;
+ }
+ break;
+ default:
+ alpha_index = 0;
+ break;
+ }
+
+ color_index = (color_block >> 32) & 0xffffffff;
+ dest = (DWORD *)(dst + z_pos * dst_slice_pitch);
+ for (y = 0; y < 4; ++y)
+ {
+ if (y_pos + y >= height)
+ break;
+ for (x = 0; x < 4; ++x)
+ {
+ if (x_pos + x >= width)
+ break;
+
+ color_val = 0;
+ alpha_val = 0;
+ bgra = 0;
+
+ color_val = (color_index >> (y * 8));
+ color_val = (color_val >> (x * 2)) & 0x3;
+ switch (fmt)
+ {
+ case WINED3DFMT_DXT1:
+ alpha_val = color_val;
+ break;
+ case WINED3DFMT_DXT3:
+ alpha_lookup = (alpha_index >> (y * 16)) & 0xffff;
+ alpha_val = (alpha_lookup >> (x * 4)) & 0xf;
+ temp = alpha_val * 255 + 8;
+ alpha[0] = (temp / 16 + temp) / 16;
+ alpha_val = 0;
+ break;
+ case WINED3DFMT_DXT5:
+ alpha_lookup = (alpha_index >> (y * 12)) & 0xfff;
+ alpha_val = (alpha_lookup >> (x * 3)) & 0x7;
+ break;
+ }
+ bgra = ((alpha[alpha_val] << 24) | (r[color_val] << 16) | (g[color_val] << 8) | b[color_val]);
+ dest[(y_pos + y) * width + (x_pos + x)] = bgra;
+ }
+ }
+}
+
+static void convert_dxt5_b8g8r8a8_unorm(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch,
+ UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth)
+{
+ UINT64 current_block;
+ DWORD x, y, z;
+
+ current_block = 0;
+
+ for (z = 0; z < depth; ++z)
+ {
+ for (y = 0; y < height; y += 4)
+ {
+ for (x = 0; x < width; x += 4)
+ {
+ dxtn_decompress_block(src, dst, width, height, depth, x, y, z, dst_slice_pitch, current_block, WINED3DFMT_DXT5, 16);
+ current_block++;
+ }
+ }
+ }
+}
+
+static void convert_dxt3_b8g8r8a8_unorm(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch,
+ UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth)
+{
+ UINT64 current_block;
+ DWORD x, y, z;
+
+ current_block = 0;
+
+ for (z = 0; z < depth; ++z)
+ {
+ for (y = 0; y < height; y += 4)
+ {
+ for (x = 0; x < width; x += 4)
+ {
+ dxtn_decompress_block(src, dst, width, height, depth, x, y, z, dst_slice_pitch, current_block, WINED3DFMT_DXT3, 16);
+ current_block++;
+ }
+ }
+ }
+}
+
+static void convert_dxt1_b8g8r8a8_unorm(const BYTE *src, BYTE *dst, UINT src_row_pitch, UINT src_slice_pitch,
+ UINT dst_row_pitch, UINT dst_slice_pitch, UINT width, UINT height, UINT depth)
+{
+ UINT64 current_block;
+ DWORD x, y, z;
+
+ current_block = 0;
+
+ for (z = 0; z < depth; ++z)
+ {
+ for (y = 0; y < height; y += 4)
+ {
+ for (x = 0; x < width; x += 4)
+ {
+ dxtn_decompress_block(src, dst, width, height, depth, x, y, z, dst_slice_pitch, current_block, WINED3DFMT_DXT1, 8);
+ current_block++;
+ }
+ }
+ }
+}
+
static void x8_d24_unorm_upload(const BYTE *src, BYTE *dst,
unsigned int src_row_pitch, unsigned int src_slice_pitch,
unsigned int dst_row_pitch, unsigned int dst_slice_pitch,
@@ -1066,7 +1297,7 @@ static const struct wined3d_format_texture_info format_texture_info[] =
/* format id gl_internal gl_srgb_internal gl_rt_internal
gl_format gl_type conv_byte_count
flags
- extension upload download */
+ extension upload download decompress */
/* FourCC formats */
/* GL_APPLE_ycbcr_422 claims that its '2YUV' format, which is supported via the UNSIGNED_SHORT_8_8_REV_APPLE type
* is equivalent to 'UYVY' format on Windows, and the 'YUVS' via UNSIGNED_SHORT_8_8_APPLE equates to 'YUY2'. The
@@ -1897,6 +2128,23 @@ static BOOL init_format_block_info(struct wined3d_gl_info *gl_info)
return TRUE;
}
+static BOOL init_format_decompress_info(struct wined3d_gl_info *gl_info)
+{
+ struct wined3d_format *format;
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(format_decompress_info); ++i)
+ {
+ if (!(format = get_format_internal(gl_info, format_decompress_info[i].id)))
+ return FALSE;
+
+ format->flags[WINED3D_GL_RES_TYPE_TEX_3D] |= format_decompress_info[i].flags;
+ format->decompress = format_decompress_info[i].decompress;
+ }
+
+ return TRUE;
+}
+
static GLenum wined3d_gl_type_to_enum(enum wined3d_gl_resource_type type)
{
switch (type)
@@ -3394,29 +3642,7 @@ static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_
* for dx9 GPUs support it, some do not, so not supporting DXTn volumes is OK for d3d9.
*
* Note that GL_NV_texture_compression_vtc adds this functionality to OpenGL, but the
- * block layout is not compatible with the one used by d3d. See volume_dxt5_test. */
- idx = get_format_idx(WINED3DFMT_DXT1);
- gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
- idx = get_format_idx(WINED3DFMT_DXT2);
- gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
- idx = get_format_idx(WINED3DFMT_DXT3);
- gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
- idx = get_format_idx(WINED3DFMT_DXT4);
- gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
- idx = get_format_idx(WINED3DFMT_DXT5);
- gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
- idx = get_format_idx(WINED3DFMT_BC1_UNORM);
- gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
- idx = get_format_idx(WINED3DFMT_BC1_UNORM_SRGB);
- gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
- idx = get_format_idx(WINED3DFMT_BC2_UNORM);
- gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
- idx = get_format_idx(WINED3DFMT_BC2_UNORM_SRGB);
- gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
- idx = get_format_idx(WINED3DFMT_BC3_UNORM);
- gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
- idx = get_format_idx(WINED3DFMT_BC3_UNORM_SRGB);
- gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
+ * block layout is not compatible with the one used by d3d. See volume_dxtn_test. */
/* Similarly with ATI1N / ATI2N and GL_ARB_texture_compression_rgtc. */
idx = get_format_idx(WINED3DFMT_ATI1N);
gl_info->formats[idx].flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
@@ -3742,6 +3968,7 @@ BOOL wined3d_adapter_init_format_info(struct wined3d_adapter *adapter, struct wi
if (!init_format_base_info(gl_info)) return FALSE;
if (!init_format_block_info(gl_info)) goto fail;
+ if (!init_format_decompress_info(gl_info)) goto fail;
if (!ctx) /* WINED3D_NO3D */
return TRUE;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 9aa7081..b1d8b24 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -4247,6 +4247,7 @@ extern enum wined3d_format_id pixelformat_for_depth(DWORD depth) DECLSPEC_HIDDEN
#define WINED3DFMT_FLAG_BLOCKS_NO_VERIFY 0x00100000
#define WINED3DFMT_FLAG_INTEGER 0x00200000
#define WINED3DFMT_FLAG_GEN_MIPMAP 0x00400000
+#define WINED3DFMT_FLAG_DECOMPRESS 0x00800000
struct wined3d_rational
{
@@ -4306,6 +4307,9 @@ struct wined3d_format
void (*download)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch,
unsigned int dst_row_pitch, unsigned dst_slice_pitch,
unsigned int width, unsigned int height, unsigned int depth);
+ void (*decompress)(const BYTE *src, BYTE *dst, unsigned int src_row_pitch, unsigned int src_slice_pitch,
+ unsigned int dst_row_pitch, unsigned dst_slice_pitch,
+ unsigned int width, unsigned int height, unsigned int depth);
enum wined3d_format_id typeless_id;
GLenum gl_view_class;
--
2.7.4
1
1
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/wintrust/asn.c | 73 ++++++++++++++++++++++---------------------------
dlls/wintrust/softpub.c | 6 ++--
2 files changed, 34 insertions(+), 45 deletions(-)
diff --git a/dlls/wintrust/asn.c b/dlls/wintrust/asn.c
index 6406ba3428..46525f02d4 100644
--- a/dlls/wintrust/asn.c
+++ b/dlls/wintrust/asn.c
@@ -673,8 +673,8 @@ static BOOL WINAPI CRYPT_AsnEncodeAlgorithmIdWithNullParams(
items[1].pvStructInfo = &algo->Parameters;
else
items[1].pvStructInfo = &nullBlob;
- ret = CRYPT_AsnEncodeSequence(dwCertEncodingType, items,
- sizeof(items) / sizeof(items[0]), pbEncoded, pcbEncoded);
+ ret = CRYPT_AsnEncodeSequence(dwCertEncodingType, items, ARRAY_SIZE(items),
+ pbEncoded, pcbEncoded);
return ret;
}
@@ -688,8 +688,8 @@ static BOOL WINAPI CRYPT_AsnEncodeAttributeTypeValue(DWORD dwCertEncodingType,
{ &typeValue->Value, CRYPT_CopyEncodedBlob, 0 },
};
- return CRYPT_AsnEncodeSequence(X509_ASN_ENCODING,
- items, sizeof(items) / sizeof(items[0]), pbEncoded, pcbEncoded);
+ return CRYPT_AsnEncodeSequence(X509_ASN_ENCODING, items, ARRAY_SIZE(items),
+ pbEncoded, pcbEncoded);
}
struct SPCDigest
@@ -708,8 +708,8 @@ static BOOL WINAPI CRYPT_AsnEncodeSPCDigest(DWORD dwCertEncodingType,
{ &digest->Digest, CRYPT_CopyEncodedBlob, 0 },
};
- return CRYPT_AsnEncodeSequence(X509_ASN_ENCODING,
- items, sizeof(items) / sizeof(items[0]), pbEncoded, pcbEncoded);
+ return CRYPT_AsnEncodeSequence(X509_ASN_ENCODING, items, ARRAY_SIZE(items),
+ pbEncoded, pcbEncoded);
}
BOOL WINAPI WVTAsn1SpcIndirectDataContentEncode(DWORD dwCertEncodingType,
@@ -729,8 +729,8 @@ BOOL WINAPI WVTAsn1SpcIndirectDataContentEncode(DWORD dwCertEncodingType,
{ &data->DigestAlgorithm, CRYPT_AsnEncodeSPCDigest, 0 },
};
- ret = CRYPT_AsnEncodeSequence(X509_ASN_ENCODING,
- items, sizeof(items) / sizeof(items[0]), pbEncoded, pcbEncoded);
+ ret = CRYPT_AsnEncodeSequence(X509_ASN_ENCODING, items, ARRAY_SIZE(items),
+ pbEncoded, pcbEncoded);
}
__EXCEPT_PAGE_FAULT
{
@@ -996,8 +996,8 @@ BOOL WINAPI WVTAsn1CatMemberInfoEncode(DWORD dwCertEncodingType,
{ &info->dwCertVersion, CRYPT_AsnEncodeInt, 0 },
};
- ret = CRYPT_AsnEncodeSequence(X509_ASN_ENCODING,
- items, sizeof(items) / sizeof(items[0]), pbEncoded, pcbEncoded);
+ ret = CRYPT_AsnEncodeSequence(X509_ASN_ENCODING, items, ARRAY_SIZE(items),
+ pbEncoded, pcbEncoded);
}
__EXCEPT_PAGE_FAULT
{
@@ -1025,8 +1025,8 @@ BOOL WINAPI WVTAsn1CatNameValueEncode(DWORD dwCertEncodingType,
{ &value->Value, CRYPT_AsnEncodeOctets, 0 },
};
- ret = CRYPT_AsnEncodeSequence(X509_ASN_ENCODING,
- items, sizeof(items) / sizeof(items[0]), pbEncoded, pcbEncoded);
+ ret = CRYPT_AsnEncodeSequence(X509_ASN_ENCODING, items, ARRAY_SIZE(items),
+ pbEncoded, pcbEncoded);
}
__EXCEPT_PAGE_FAULT
{
@@ -1084,8 +1084,8 @@ BOOL WINAPI WVTAsn1SpcFinancialCriteriaInfoEncode(DWORD dwCertEncodingType,
{ &criteria->fMeetsCriteria, CRYPT_AsnEncodeBool, 0 },
};
- ret = CRYPT_AsnEncodeSequence(X509_ASN_ENCODING,
- items, sizeof(items) / sizeof(items[0]), pbEncoded, pcbEncoded);
+ ret = CRYPT_AsnEncodeSequence(X509_ASN_ENCODING, items, ARRAY_SIZE(items),
+ pbEncoded, pcbEncoded);
}
__EXCEPT_PAGE_FAULT
{
@@ -1808,9 +1808,8 @@ BOOL WINAPI WVTAsn1SpcPeImageDataDecode(DWORD dwCertEncodingType,
offsetof(SPC_PE_IMAGE_DATA, pFile), 0 },
};
- ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items,
- sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags,
- pvStructInfo, pcbStructInfo, NULL);
+ ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items, ARRAY_SIZE(items),
+ pbEncoded, cbEncoded, dwFlags, pvStructInfo, pcbStructInfo, NULL);
}
__EXCEPT_PAGE_FAULT
{
@@ -1995,9 +1994,8 @@ static BOOL WINAPI CRYPT_AsnDecodeAttributeTypeValue(DWORD dwCertEncodingType,
TRACE("%p, %d, %08x, %p, %d\n", pbEncoded, cbEncoded, dwFlags,
pvStructInfo, *pcbStructInfo);
- return CRYPT_AsnDecodeSequence(dwCertEncodingType, items,
- sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags,
- pvStructInfo, pcbStructInfo,
+ return CRYPT_AsnDecodeSequence(dwCertEncodingType, items, ARRAY_SIZE(items),
+ pbEncoded, cbEncoded, dwFlags, pvStructInfo, pcbStructInfo,
typeValue ? typeValue->pszObjId : NULL);
}
@@ -2019,9 +2017,8 @@ static BOOL WINAPI CRYPT_AsnDecodeAlgorithmId(DWORD dwCertEncodingType,
TRACE("%p, %d, %08x, %p, %d\n", pbEncoded, cbEncoded, dwFlags,
pvStructInfo, *pcbStructInfo);
- ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items,
- sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags,
- pvStructInfo, pcbStructInfo, algo ? algo->pszObjId : NULL);
+ ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items, ARRAY_SIZE(items),
+ pbEncoded, cbEncoded, dwFlags, pvStructInfo, pcbStructInfo, algo ? algo->pszObjId : NULL);
if (ret && pvStructInfo)
{
TRACE("pszObjId is %p (%s)\n", algo->pszObjId,
@@ -2048,9 +2045,8 @@ static BOOL WINAPI CRYPT_AsnDecodeSPCDigest(DWORD dwCertEncodingType,
TRACE("%p, %d, %08x, %p, %d\n", pbEncoded, cbEncoded, dwFlags,
pvStructInfo, *pcbStructInfo);
- return CRYPT_AsnDecodeSequence(dwCertEncodingType, items,
- sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags,
- pvStructInfo, pcbStructInfo,
+ return CRYPT_AsnDecodeSequence(dwCertEncodingType, items, ARRAY_SIZE(items),
+ pbEncoded, cbEncoded, dwFlags, pvStructInfo, pcbStructInfo,
digest ? digest->DigestAlgorithm.pszObjId : NULL);
}
@@ -2076,9 +2072,8 @@ BOOL WINAPI WVTAsn1SpcIndirectDataContentDecode(DWORD dwCertEncodingType,
offsetof(SPC_INDIRECT_DATA_CONTENT, DigestAlgorithm.pszObjId), 0 },
};
- ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items,
- sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags,
- pvStructInfo, pcbStructInfo, NULL);
+ ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items, ARRAY_SIZE(items),
+ pbEncoded, cbEncoded, dwFlags, pvStructInfo, pcbStructInfo, NULL);
}
__EXCEPT_PAGE_FAULT
{
@@ -2174,9 +2169,8 @@ BOOL WINAPI WVTAsn1SpcSpOpusInfoDecode(DWORD dwCertEncodingType,
offsetof(SPC_SP_OPUS_INFO, pPublisherInfo), 0 },
};
- ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items,
- sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags,
- pvStructInfo, pcbStructInfo, NULL);
+ ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items, ARRAY_SIZE(items),
+ pbEncoded, cbEncoded, dwFlags, pvStructInfo, pcbStructInfo, NULL);
}
__EXCEPT_PAGE_FAULT
{
@@ -2256,9 +2250,8 @@ BOOL WINAPI WVTAsn1CatMemberInfoDecode(DWORD dwCertEncodingType,
FALSE, FALSE, 0, 0 },
};
- ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items,
- sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags,
- pvStructInfo, pcbStructInfo, NULL);
+ ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items, ARRAY_SIZE(items),
+ pbEncoded, cbEncoded, dwFlags, pvStructInfo, pcbStructInfo, NULL);
}
__EXCEPT_PAGE_FAULT
{
@@ -2292,9 +2285,8 @@ BOOL WINAPI WVTAsn1CatNameValueDecode(DWORD dwCertEncodingType,
offsetof(CAT_NAMEVALUE, Value.pbData), 0 },
};
- ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items,
- sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags,
- pvStructInfo, pcbStructInfo, NULL);
+ ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items, ARRAY_SIZE(items),
+ pbEncoded, cbEncoded, dwFlags, pvStructInfo, pcbStructInfo, NULL);
}
__EXCEPT_PAGE_FAULT
{
@@ -2367,9 +2359,8 @@ BOOL WINAPI WVTAsn1SpcFinancialCriteriaInfoDecode(DWORD dwCertEncodingType,
fMeetsCriteria), FALSE, FALSE, 0, 0 },
};
- ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items,
- sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags,
- pvStructInfo, pcbStructInfo, NULL);
+ ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items, ARRAY_SIZE(items),
+ pbEncoded, cbEncoded, dwFlags, pvStructInfo, pcbStructInfo, NULL);
}
__EXCEPT_PAGE_FAULT
{
diff --git a/dlls/wintrust/softpub.c b/dlls/wintrust/softpub.c
index 4e8582e218..d65d2b681d 100644
--- a/dlls/wintrust/softpub.c
+++ b/dlls/wintrust/softpub.c
@@ -522,11 +522,9 @@ static LPCSTR filetime_to_str(const FILETIME *time)
if (!time) return NULL;
- GetLocaleInfoA(LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, dateFmt,
- sizeof(dateFmt) / sizeof(dateFmt[0]));
+ GetLocaleInfoA(LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, dateFmt, ARRAY_SIZE(dateFmt));
FileTimeToSystemTime(time, &sysTime);
- GetDateFormatA(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, dateFmt, date,
- sizeof(date) / sizeof(date[0]));
+ GetDateFormatA(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, dateFmt, date, ARRAY_SIZE(date));
return date;
}
--
2.14.4
1
0
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/sxs/cache.c | 18 +++++++++---------
dlls/sxs/name.c | 8 ++++----
2 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/dlls/sxs/cache.c b/dlls/sxs/cache.c
index 791a6ed049..3cc26f29e8 100644
--- a/dlls/sxs/cache.c
+++ b/dlls/sxs/cache.c
@@ -103,7 +103,7 @@ static unsigned int build_sxs_path( WCHAR *path )
unsigned int len = GetWindowsDirectoryW( path, MAX_PATH );
memcpy( path + len, winsxsW, sizeof(winsxsW) );
- return len + sizeof(winsxsW) / sizeof(winsxsW[0]) - 1;
+ return len + ARRAY_SIZE(winsxsW) - 1;
}
static WCHAR *build_assembly_name( const WCHAR *arch, const WCHAR *name, const WCHAR *token,
@@ -111,7 +111,7 @@ static WCHAR *build_assembly_name( const WCHAR *arch, const WCHAR *name, const W
{
static const WCHAR fmtW[] =
{'%','s','_','%','s','_','%','s','_','%','s','_','n','o','n','e','_','d','e','a','d','b','e','e','f',0};
- unsigned int buflen = sizeof(fmtW) / sizeof(fmtW[0]);
+ unsigned int buflen = ARRAY_SIZE(fmtW);
WCHAR *ret, *p;
buflen += strlenW( arch );
@@ -133,7 +133,7 @@ static WCHAR *build_manifest_path( const WCHAR *arch, const WCHAR *name, const W
unsigned int len;
if (!(path = build_assembly_name( arch, name, token, version, &len ))) return NULL;
- len += sizeof(fmtW) / sizeof(fmtW[0]);
+ len += ARRAY_SIZE(fmtW);
len += build_sxs_path( sxsdir );
if (!(ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )))
{
@@ -150,7 +150,7 @@ static WCHAR *build_policy_name( const WCHAR *arch, const WCHAR *name, const WCH
{
static const WCHAR fmtW[] =
{'%','s','_','%','s','_','%','s','_','n','o','n','e','_','d','e','a','d','b','e','e','f',0};
- unsigned int buflen = sizeof(fmtW) / sizeof(fmtW[0]);
+ unsigned int buflen = ARRAY_SIZE(fmtW);
WCHAR *ret, *p;
buflen += strlenW( arch );
@@ -171,7 +171,7 @@ static WCHAR *build_policy_path( const WCHAR *arch, const WCHAR *name, const WCH
unsigned int len;
if (!(path = build_policy_name( arch, name, token, &len ))) return NULL;
- len += sizeof(fmtW) / sizeof(fmtW[0]);
+ len += ARRAY_SIZE(fmtW);
len += build_sxs_path( sxsdir );
len += strlenW( version );
if (!(ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )))
@@ -501,9 +501,9 @@ static WCHAR *build_policy_filename( const WCHAR *arch, const WCHAR *name, const
if (!(fullname = build_policy_name( arch, name, token, &len ))) return NULL;
len += build_sxs_path( sxsdir );
- len += sizeof(policiesW) / sizeof(policiesW[0]) - 1;
+ len += ARRAY_SIZE(policiesW) - 1;
len += strlenW( version );
- len += sizeof(suffixW) / sizeof(suffixW[0]) - 1;
+ len += ARRAY_SIZE(suffixW) - 1;
if (!(ret = HeapAlloc( GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR) )))
{
HeapFree( GetProcessHeap(), 0, fullname );
@@ -572,8 +572,8 @@ static WCHAR *build_manifest_filename( const WCHAR *arch, const WCHAR *name, con
if (!(fullname = build_assembly_name( arch, name, token, version, &len ))) return NULL;
len += build_sxs_path( sxsdir );
- len += sizeof(manifestsW) / sizeof(manifestsW[0]) - 1;
- len += sizeof(suffixW) / sizeof(suffixW[0]) - 1;
+ len += ARRAY_SIZE(manifestsW) - 1;
+ len += ARRAY_SIZE(suffixW) - 1;
if (!(ret = HeapAlloc( GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR) )))
{
HeapFree( GetProcessHeap(), 0, fullname );
diff --git a/dlls/sxs/name.c b/dlls/sxs/name.c
index 74aece2bc3..e1090140b2 100644
--- a/dlls/sxs/name.c
+++ b/dlls/sxs/name.c
@@ -329,25 +329,25 @@ static HRESULT parse_displayname( struct name *name, const WCHAR *displayname )
while (*q && *q != '=') q++;
if (!*q) return E_INVALIDARG;
len = q - p;
- if (len == sizeof(archW)/sizeof(archW[0]) - 1 && !memcmp( p, archW, len * sizeof(WCHAR) ))
+ if (len == ARRAY_SIZE(archW) - 1 && !memcmp( p, archW, len * sizeof(WCHAR) ))
{
p = ++q;
if (!(name->arch = parse_value( p, &len ))) return E_INVALIDARG;
q += len;
}
- else if (len == sizeof(tokenW)/sizeof(tokenW[0]) - 1 && !memcmp( p, tokenW, len * sizeof(WCHAR) ))
+ else if (len == ARRAY_SIZE(tokenW) - 1 && !memcmp( p, tokenW, len * sizeof(WCHAR) ))
{
p = ++q;
if (!(name->token = parse_value( p, &len ))) return E_INVALIDARG;
q += len;
}
- else if (len == sizeof(typeW)/sizeof(typeW[0]) - 1 && !memcmp( p, typeW, len * sizeof(WCHAR) ))
+ else if (len == ARRAY_SIZE(typeW) - 1 && !memcmp( p, typeW, len * sizeof(WCHAR) ))
{
p = ++q;
if (!(name->type = parse_value( p, &len ))) return E_INVALIDARG;
q += len;
}
- else if (len == sizeof(versionW)/sizeof(versionW[0]) - 1 && !memcmp( p, versionW, len * sizeof(WCHAR) ))
+ else if (len == ARRAY_SIZE(versionW) - 1 && !memcmp( p, versionW, len * sizeof(WCHAR) ))
{
p = ++q;
if (!(name->version = parse_value( p, &len ))) return E_INVALIDARG;
--
2.14.4
1
0
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/secur32/schannel.c | 8 ++++----
dlls/secur32/schannel_gnutls.c | 2 +-
dlls/secur32/schannel_macosx.c | 4 ++--
dlls/secur32/secur32.c | 4 ++--
4 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c
index f0d271e0d8..6d50c97fab 100644
--- a/dlls/secur32/schannel.c
+++ b/dlls/secur32/schannel.c
@@ -195,7 +195,7 @@ static void read_config(void)
if(res == ERROR_SUCCESS) {
DWORD type, size, value;
- for(i=0; i < sizeof(protocol_config_keys)/sizeof(*protocol_config_keys); i++) {
+ for(i = 0; i < ARRAY_SIZE(protocol_config_keys); i++) {
strcpyW(subkey_name, protocol_config_keys[i].key_name);
strcatW(subkey_name, clientW);
res = RegOpenKeyExW(protocols_key, subkey_name, 0, KEY_READ, &key);
@@ -229,7 +229,7 @@ static void read_config(void)
}
}else {
/* No config, enable all known protocols. */
- for(i=0; i < sizeof(protocol_config_keys)/sizeof(*protocol_config_keys); i++) {
+ for(i = 0; i < ARRAY_SIZE(protocol_config_keys); i++) {
if(protocol_config_keys[i].enabled)
enabled |= protocol_config_keys[i].prot_client_flag;
if(protocol_config_keys[i].disabled_by_default)
@@ -986,7 +986,7 @@ static void *get_alg_name(ALG_ID id, BOOL wide)
};
unsigned i;
- for (i = 0; i < sizeof(alg_name_map)/sizeof(alg_name_map[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(alg_name_map); i++)
if (alg_name_map[i].alg_id == id)
return wide ? (void*)alg_name_map[i].nameW : (void*)alg_name_map[i].name;
@@ -1545,7 +1545,7 @@ void SECUR32_initSchannelSP(void)
goto fail;
}
- SECUR32_addPackages(provider, sizeof(info) / sizeof(info[0]), NULL, info);
+ SECUR32_addPackages(provider, ARRAY_SIZE(info), NULL, info);
return;
diff --git a/dlls/secur32/schannel_gnutls.c b/dlls/secur32/schannel_gnutls.c
index bc3bbaf67d..05e922dfe8 100644
--- a/dlls/secur32/schannel_gnutls.c
+++ b/dlls/secur32/schannel_gnutls.c
@@ -177,7 +177,7 @@ BOOL schan_imp_create_session(schan_imp_session *session, schan_credentials *cre
}
p = priority + strlen(priority);
- for(i=0; i < sizeof(protocol_priority_flags)/sizeof(*protocol_priority_flags); i++) {
+ for(i = 0; i < ARRAY_SIZE(protocol_priority_flags); i++) {
*p++ = ':';
*p++ = (cred->enabled_protocols & protocol_priority_flags[i].enable_flag) ? '+' : '-';
strcpy(p, protocol_priority_flags[i].gnutls_flag);
diff --git a/dlls/secur32/schannel_macosx.c b/dlls/secur32/schannel_macosx.c
index a2f42615e1..bd080dcb41 100644
--- a/dlls/secur32/schannel_macosx.c
+++ b/dlls/secur32/schannel_macosx.c
@@ -429,7 +429,7 @@ static const struct cipher_suite cipher_suites[] = {
static const struct cipher_suite* get_cipher_suite(SSLCipherSuite cipher_suite)
{
int i;
- for (i = 0; i < sizeof(cipher_suites)/sizeof(cipher_suites[0]); i++)
+ for (i = 0; i < ARRAY_SIZE(cipher_suites); i++)
{
if (cipher_suites[i].suite == cipher_suite)
return &cipher_suites[i];
@@ -767,7 +767,7 @@ BOOL schan_imp_create_session(schan_imp_session *session, schan_credentials *cre
goto fail;
}
- for(i=0; i < sizeof(protocol_priority_flags)/sizeof(*protocol_priority_flags); i++) {
+ for(i = 0; i < ARRAY_SIZE(protocol_priority_flags); i++) {
if(!(protocol_priority_flags[i].enable_flag & supported_protocols))
continue;
diff --git a/dlls/secur32/secur32.c b/dlls/secur32/secur32.c
index 9240c108e5..ec189fda10 100644
--- a/dlls/secur32/secur32.c
+++ b/dlls/secur32/secur32.c
@@ -995,7 +995,7 @@ BOOLEAN WINAPI GetComputerObjectNameW(
case NameSamCompatible:
{
WCHAR name[MAX_COMPUTERNAME_LENGTH + 1];
- DWORD size = sizeof(name)/sizeof(name[0]);
+ DWORD size = ARRAY_SIZE(name);
if (GetComputerNameW(name, &size))
{
DWORD len = domainInfo->Name.Length + size + 3;
@@ -1038,7 +1038,7 @@ BOOLEAN WINAPI GetComputerObjectNameW(
DWORD len, size;
WCHAR *suffix;
- size = sizeof(name) / sizeof(name[0]);
+ size = ARRAY_SIZE(name);
if (!GetComputerNameW(name, &size))
{
status = FALSE;
--
2.14.4
1
0
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/oledb32/datainit.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/oledb32/datainit.c b/dlls/oledb32/datainit.c
index 7d78e9fca2..6b05ef6389 100644
--- a/dlls/oledb32/datainit.c
+++ b/dlls/oledb32/datainit.c
@@ -328,8 +328,8 @@ static HRESULT convert_dbproperty_mode(const WCHAR *src, VARIANT *dest)
};
struct mode_propval *prop;
- if ((prop = bsearch(src, mode_propvals, sizeof(mode_propvals) / sizeof(*mode_propvals),
- sizeof(struct mode_propval), dbmodeprop_compare)))
+ if ((prop = bsearch(src, mode_propvals, ARRAY_SIZE(mode_propvals),
+ sizeof(struct mode_propval), dbmodeprop_compare)))
{
V_VT(dest) = VT_I4;
V_I4(dest) = prop->value;
@@ -511,7 +511,7 @@ static const struct dbproperty *get_known_dprop_descr(BSTR name)
int min, max, n;
min = 0;
- max = sizeof(dbproperties)/sizeof(struct dbproperty) - 1;
+ max = ARRAY_SIZE(dbproperties) - 1;
while (min <= max)
{
@@ -662,7 +662,7 @@ HRESULT get_data_source(IUnknown *outer, DWORD clsctx, LPWSTR initstring, REFIID
WCHAR *start, *progid;
int len;
- prov += sizeof(providerW)/sizeof(WCHAR)-1;
+ prov += ARRAY_SIZE(providerW)-1;
start = prov;
while (*prov && *prov != ';')
++prov;
--
2.14.4
1
0
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/oleacc/client.c | 4 ++--
dlls/oleacc/main.c | 18 +++++++++---------
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/dlls/oleacc/client.c b/dlls/oleacc/client.c
index 5b1f0eee5f..40e7fbd653 100644
--- a/dlls/oleacc/client.c
+++ b/dlls/oleacc/client.c
@@ -168,7 +168,7 @@ static HRESULT WINAPI Client_get_accName(IAccessible *iface, VARIANT varID, BSTR
if(convert_child_id(&varID) != CHILDID_SELF || !IsWindow(This->hwnd))
return E_INVALIDARG;
- len = SendMessageW(This->hwnd, WM_GETTEXT, sizeof(name)/sizeof(WCHAR), (LPARAM)name);
+ len = SendMessageW(This->hwnd, WM_GETTEXT, ARRAY_SIZE(name), (LPARAM)name);
if(!len)
return S_FALSE;
@@ -286,7 +286,7 @@ static HRESULT WINAPI Client_get_accKeyboardShortcut(IAccessible *iface,
if(convert_child_id(&varID) != CHILDID_SELF)
return E_INVALIDARG;
- len = SendMessageW(This->hwnd, WM_GETTEXT, sizeof(name)/sizeof(WCHAR), (LPARAM)name);
+ len = SendMessageW(This->hwnd, WM_GETTEXT, ARRAY_SIZE(name), (LPARAM)name);
for(i=0; i<len; i++) {
if(name[i] == '&')
break;
diff --git a/dlls/oleacc/main.c b/dlls/oleacc/main.c
index 3cfe7c105a..b90bc2c493 100644
--- a/dlls/oleacc/main.c
+++ b/dlls/oleacc/main.c
@@ -109,11 +109,11 @@ static accessible_create get_builtin_accessible_obj(HWND hwnd, LONG objid)
WCHAR class_name[64];
int i, idx;
- if(!RealGetWindowClassW(hwnd, class_name, sizeof(class_name)/sizeof(WCHAR)))
+ if(!RealGetWindowClassW(hwnd, class_name, ARRAY_SIZE(class_name)))
return NULL;
TRACE("got window class: %s\n", debugstr_w(class_name));
- for(i=0; i<sizeof(builtin_classes)/sizeof(builtin_classes[0]); i++) {
+ for(i=0; i<ARRAY_SIZE(builtin_classes); i++) {
if(!strcmpiW(class_name, builtin_classes[i].name)) {
accessible_create ret;
@@ -128,7 +128,7 @@ static accessible_create get_builtin_accessible_obj(HWND hwnd, LONG objid)
idx = SendMessageW(hwnd, WM_GETOBJECT, 0, OBJID_QUERYCLASSNAMEIDX);
if(idx) {
- for(i=0; i<sizeof(builtin_classes)/sizeof(builtin_classes[0]); i++) {
+ for(i=0; i<ARRAY_SIZE(builtin_classes); i++) {
if(idx == builtin_classes[i].idx) {
accessible_create ret;
@@ -172,7 +172,7 @@ HRESULT WINAPI CreateStdAccessibleObject( HWND hwnd, LONG idObject,
HRESULT WINAPI ObjectFromLresult( LRESULT result, REFIID riid, WPARAM wParam, void **ppObject )
{
- WCHAR atom_str[sizeof(lresult_atom_prefix)/sizeof(WCHAR)+3*8+3];
+ WCHAR atom_str[ARRAY_SIZE(lresult_atom_prefix)+3*8+3];
HANDLE server_proc, server_mapping, mapping;
DWORD proc_id, size;
IStream *stream;
@@ -193,11 +193,11 @@ HRESULT WINAPI ObjectFromLresult( LRESULT result, REFIID riid, WPARAM wParam, vo
if(result != (ATOM)result)
return E_FAIL;
- if(!GlobalGetAtomNameW(result, atom_str, sizeof(atom_str)/sizeof(WCHAR)))
+ if(!GlobalGetAtomNameW(result, atom_str, ARRAY_SIZE(atom_str)))
return E_FAIL;
if(memcmp(atom_str, lresult_atom_prefix, sizeof(lresult_atom_prefix)))
return E_FAIL;
- p = atom_str + sizeof(lresult_atom_prefix)/sizeof(WCHAR);
+ p = atom_str + ARRAY_SIZE(lresult_atom_prefix);
proc_id = strtoulW(p, &p, 16);
if(*p != ':')
return E_FAIL;
@@ -247,7 +247,7 @@ LRESULT WINAPI LresultFromObject( REFIID riid, WPARAM wParam, LPUNKNOWN pAcc )
static const WCHAR atom_fmt[] = {'%','0','8','x',':','%','0','8','x',':','%','0','8','x',0};
static const LARGE_INTEGER seek_zero = {{0}};
- WCHAR atom_str[sizeof(lresult_atom_prefix)/sizeof(WCHAR)+3*8+3];
+ WCHAR atom_str[ARRAY_SIZE(lresult_atom_prefix)+3*8+3];
IStream *stream;
HANDLE mapping;
STATSTG stat;
@@ -320,8 +320,8 @@ LRESULT WINAPI LresultFromObject( REFIID riid, WPARAM wParam, LPUNKNOWN pAcc )
}
memcpy(atom_str, lresult_atom_prefix, sizeof(lresult_atom_prefix));
- sprintfW(atom_str+sizeof(lresult_atom_prefix)/sizeof(WCHAR),
- atom_fmt, GetCurrentProcessId(), HandleToUlong(mapping), stat.cbSize.u.LowPart);
+ sprintfW(atom_str+ARRAY_SIZE(lresult_atom_prefix), atom_fmt, GetCurrentProcessId(),
+ HandleToUlong(mapping), stat.cbSize.u.LowPart);
atom = GlobalAddAtomW(atom_str);
if(!atom) {
CloseHandle(mapping);
--
2.14.4
1
0
[PATCH 01/11] shell32: _SHCreateSymbolicLinks() remove directory test for XDG Documents folder
by Rob Walker 18 Jul '18
by Rob Walker 18 Jul '18
18 Jul '18
XDG_UserDirLookup() will return a NULL result for any XDG directory path that is
not a valid directory or is a broken symlinked directory path.
So we can remove a redundant test, that ensures the returned XDG_DOCUMENTS_DIR
path is a valid directory.
Tidy up the inline code comments, removing some that are unnecessary.
Signed-off-by: Rob Walker <bob.mt.wya(a)gmail.com>
---
dlls/shell32/shellpath.c | 35 +++++++++++++++--------------------
1 file changed, 15 insertions(+), 20 deletions(-)
diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c
index de4bf7d566..0d8a5987d7 100644
--- a/dlls/shell32/shellpath.c
+++ b/dlls/shell32/shellpath.c
@@ -4424,7 +4424,7 @@ static void _SHCreateSymbolicLinks(void)
char ** xdg_results;
char * xdg_desktop_dir;
- /* Create all necessary profile sub-dirs up to 'My Documents' and get the unix path. */
+ /* Create the '%USERPROFILE%\\My Documents' directory path. */
hr = SHGetFolderPathW(NULL, CSIDL_PERSONAL|CSIDL_FLAG_CREATE, NULL,
SHGFP_TYPE_DEFAULT, wszTempPath);
if (FAILED(hr)) return;
@@ -4439,7 +4439,7 @@ static void _SHCreateSymbolicLinks(void)
{
while (1)
{
- /* Check if there's already a Wine-specific 'My Documents' folder */
+ /* Try to target a pre-existing '$HOME/My Documents' folder. */
strcpy(szPersonalTarget, pszHome);
if (_SHAppendToUnixPath(szPersonalTarget, MAKEINTRESOURCEW(IDS_PERSONAL)) &&
!stat(szPersonalTarget, &statFolder) && S_ISDIR(statFolder.st_mode))
@@ -4457,28 +4457,23 @@ static void _SHCreateSymbolicLinks(void)
break;
}
- /* Try to point to the XDG Documents folder */
- if (xdg_results && xdg_results[num-2] &&
- !stat(xdg_results[num-2], &statFolder) &&
- S_ISDIR(statFolder.st_mode))
+ /* Try to target the XDG_DOCUMENTS_DIR folder. */
+ if (xdg_results && xdg_results[num-2])
{
strcpy(szPersonalTarget, xdg_results[num-2]);
break;
}
- /* Or the hardcoded / OS X Documents folder */
+ /* Try to target the hardcoded / OS X 'Documents' folder. */
strcpy(szPersonalTarget, pszHome);
if (_SHAppendToUnixPath(szPersonalTarget, DocumentsW) &&
- !stat(szPersonalTarget, &statFolder) &&
- S_ISDIR(statFolder.st_mode))
+ !stat(szPersonalTarget, &statFolder) && S_ISDIR(statFolder.st_mode))
break;
- /* As a last resort point to $HOME. */
+ /* Target the '$HOME' folder directly (fallback). */
strcpy(szPersonalTarget, pszHome);
break;
}
-
- /* Replace 'My Documents' directory with a symlink or fail silently if not empty. */
remove(pszPersonal);
symlink(szPersonalTarget, pszPersonal);
}
@@ -4498,30 +4493,30 @@ static void _SHCreateSymbolicLinks(void)
/* Create symbolic links for 'My Pictures', 'My Videos' and 'My Music'. */
for (i=0; i < ARRAY_SIZE(aidsMyStuff); i++)
{
- /* Create the current 'My Whatever' folder and get its unix path. */
+ /* Create the '%USERPROFILE%\\My XXX' directory path. */
hr = SHGetFolderPathW(NULL, acsidlMyStuff[i]|CSIDL_FLAG_CREATE, NULL,
SHGFP_TYPE_DEFAULT, wszTempPath);
if (FAILED(hr)) continue;
pszMyStuff = wine_get_unix_file_name(wszTempPath);
if (!pszMyStuff) continue;
-
+
while (1)
{
- /* Check for the Wine-specific '$HOME/My Documents' subfolder */
+ /* Try to target a pre-existing '$HOME/My Documents/My XXX' folder. */
strcpy(szMyStuffTarget, szPersonalTarget);
if (_SHAppendToUnixPath(szMyStuffTarget, MAKEINTRESOURCEW(aidsMyStuff[i])) &&
!stat(szMyStuffTarget, &statFolder) && S_ISDIR(statFolder.st_mode))
break;
- /* Try the XDG_XXX_DIR folder */
+ /* Try to target the XDG_XXX_DIR folder. */
if (xdg_results && xdg_results[i])
{
strcpy(szMyStuffTarget, xdg_results[i]);
break;
}
- /* Or the OS X folder (these are never localized) */
+ /* Try to target the hardcoded / OS X 'XXX' folder. */
if (pszHome)
{
strcpy(szMyStuffTarget, pszHome);
@@ -4531,7 +4526,7 @@ static void _SHCreateSymbolicLinks(void)
break;
}
- /* As a last resort point to the same location as 'My Documents' */
+ /* Use the same target as '%USERPROFILE%\\My Documents' (fallback). */
strcpy(szMyStuffTarget, szPersonalTarget);
break;
}
@@ -4540,7 +4535,7 @@ static void _SHCreateSymbolicLinks(void)
heap_free(pszMyStuff);
}
- /* Last but not least, the Desktop folder */
+ /* Create a symbolic link for the 'Desktop' folder. */
if (pszHome)
strcpy(szDesktopTarget, pszHome);
else
@@ -4552,6 +4547,7 @@ static void _SHCreateSymbolicLinks(void)
(_SHAppendToUnixPath(szDesktopTarget, DesktopW) &&
!stat(szDesktopTarget, &statFolder) && S_ISDIR(statFolder.st_mode)))
{
+ /* Get the '%USERPROFILE%\\Desktop' directory path. */
hr = SHGetFolderPathW(NULL, CSIDL_DESKTOPDIRECTORY|CSIDL_FLAG_CREATE, NULL,
SHGFP_TYPE_DEFAULT, wszTempPath);
if (SUCCEEDED(hr) && (pszDesktop = wine_get_unix_file_name(wszTempPath)))
@@ -4565,7 +4561,6 @@ static void _SHCreateSymbolicLinks(void)
}
}
- /* Free resources allocated by XDG_UserDirLookup() */
if (xdg_results)
{
for (i = 0; i < num; i++)
--
2.18.0
3
12
Signed-off-by: Serge Gautherie <winehq-git_serge_180711(a)gautherie.fr>
---
"...\http.c(...) : warning C4090: 'function' : different 'const' qualifiers"
ReactOS-Bug: https://jira.reactos.org/browse/CORE-7538
---
dlls/wininet/tests/http.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index ace8512..9366482 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -6851,7 +6851,7 @@ static void init_status_tests(void)
memset(optional, 0, sizeof(optional));
memset(wine_allow, 0, sizeof(wine_allow));
memset(notified, 0, sizeof(notified));
- memset(status_string, 0, sizeof(status_string));
+ memset((void *)status_string, 0, sizeof(status_string));
#define STATUS_STRING(status) status_string[status] = #status
STATUS_STRING(INTERNET_STATUS_RESOLVING_NAME);
--
2.10.0.windows.1
3
3
[PATCH vkd3d 2/7] libs/vkd3d-shader: Treat vicp register as regular shader input.
by Józef Kucia 18 Jul '18
by Józef Kucia 18 Jul '18
18 Jul '18
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d-shader/spirv.c | 11 +++++++----
libs/vkd3d-shader/vkd3d_shader_private.h | 5 +++++
2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 1755c254cfa4..3260b2847dfd 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -1729,7 +1729,7 @@ static void vkd3d_symbol_make_register(struct vkd3d_symbol *symbol,
symbol->type = VKD3D_SYMBOL_REGISTER;
memset(&symbol->key, 0, sizeof(symbol->key));
symbol->key.reg.type = reg->type;
- if (reg->type == VKD3DSPR_INPUT && reg->idx[1].offset != ~0u)
+ if (vkd3d_shader_register_is_input(reg) && reg->idx[1].offset != ~0u)
symbol->key.reg.idx = reg->idx[1].offset;
else if (reg->type != VKD3DSPR_IMMCONSTBUFFER)
symbol->key.reg.idx = reg->idx[0].offset;
@@ -2150,6 +2150,9 @@ static bool vkd3d_dxbc_compiler_get_register_name(char *buffer, unsigned int buf
case VKD3DSPR_INPUT:
snprintf(buffer, buffer_size, "v%u", idx);
break;
+ case VKD3DSPR_INCONTROLPOINT:
+ snprintf(buffer, buffer_size, "vicp%u", idx);
+ break;
case VKD3DSPR_OUTPUT:
case VKD3DSPR_COLOROUT:
snprintf(buffer, buffer_size, "o%u", idx);
@@ -3755,10 +3758,10 @@ static void vkd3d_dxbc_compiler_emit_dcl_input(struct vkd3d_dxbc_compiler *compi
{
const struct vkd3d_shader_dst_param *dst = &instruction->declaration.dst;
- if (dst->reg.type != VKD3DSPR_INPUT)
- vkd3d_dxbc_compiler_emit_input_register(compiler, dst);
- else
+ if (vkd3d_shader_register_is_input(&dst->reg))
vkd3d_dxbc_compiler_emit_input(compiler, dst, VKD3D_SIV_NONE);
+ else
+ vkd3d_dxbc_compiler_emit_input_register(compiler, dst);
}
static void vkd3d_dxbc_compiler_emit_interpolation_decorations(struct vkd3d_dxbc_compiler *compiler,
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
index 9eb2c126332d..b1eadde08017 100644
--- a/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -778,6 +778,11 @@ static inline BOOL vkd3d_shader_instruction_has_texel_offset(const struct vkd3d_
return ins->texel_offset.u || ins->texel_offset.v || ins->texel_offset.w;
}
+static inline bool vkd3d_shader_register_is_input(const struct vkd3d_shader_register *reg)
+{
+ return reg->type == VKD3DSPR_INPUT || reg->type == VKD3DSPR_INCONTROLPOINT;
+}
+
void vkd3d_shader_trace(void *data) DECLSPEC_HIDDEN;
void *shader_sm4_init(const DWORD *byte_code, size_t byte_code_size,
--
2.16.4
2
1