Wine-devel
Threads by month
- ----- 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
January 2018
- 62 participants
- 503 discussions
[PATCH] urlmon/tests: Make sure we don't run more than one thread at once.
by Zebediah Figura 10 Jan '18
by Zebediah Figura 10 Jan '18
10 Jan '18
On occasion the second thread, started by Continue(), will run far enough
that it effectively steals the Switch() call out from under the first thread.
Ensure that this doesn't happen by causing the second thread to wait for the
first thread to finish before running any code.
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/urlmon/tests/protocol.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/dlls/urlmon/tests/protocol.c b/dlls/urlmon/tests/protocol.c
index d88aa07..1d9a803 100644
--- a/dlls/urlmon/tests/protocol.c
+++ b/dlls/urlmon/tests/protocol.c
@@ -156,6 +156,7 @@ static DWORD prot_read, filter_state, http_post_test, thread_id;
static BOOL security_problem, test_async_req, impl_protex;
static BOOL async_read_pending, mimefilter_test, direct_read, wait_for_switch, emulate_prot, short_read, test_abort;
static BOOL empty_file, no_mime, bind_from_cache, file_with_hash;
+static HANDLE last_thread, thread;
enum {
STATE_CONNECTING,
@@ -1592,6 +1593,10 @@ static DWORD WINAPI thread_proc(PVOID arg)
BOOL redirect_only = redirect_on_continue;
HRESULT hres;
+ /* make sure that the last thread terminates before we start this one */
+ if (last_thread)
+ ok(WaitForSingleObject(last_thread, 90000) == WAIT_OBJECT_0, "wait timed out\n");
+
memset(&protocoldata, -1, sizeof(protocoldata));
prot_state = 0;
@@ -1719,7 +1724,6 @@ static void protocol_start(IInternetProtocolSink *pOIProtSink, IInternetBindInfo
LPWSTR additional_headers = NULL;
BYTE sec_id[100];
DWORD fetched = 0, size = 100;
- DWORD tid;
SET_EXPECT(GetBindString_USER_AGENT);
hres = IInternetBindInfo_GetBindString(pOIBindInfo, BINDSTRING_USER_AGENT,
@@ -1777,7 +1781,8 @@ static void protocol_start(IInternetProtocolSink *pOIProtSink, IInternetBindInfo
IServiceProvider_Release(service_provider);
- CreateThread(NULL, 0, thread_proc, NULL, 0, &tid);
+ last_thread = thread;
+ thread = CreateThread(NULL, 0, thread_proc, NULL, 0, NULL);
return;
}
--
2.7.4
2
3
[PATCH] kernel32/tests: Test CreateFileMapping with a foreign architecture dll (try 2)
by André Hentschel 10 Jan '18
by André Hentschel 10 Jan '18
10 Jan '18
Signed-off-by: André Hentschel <nerv(a)dawncrow.de>
---
dlls/kernel32/tests/virtual.c | 92 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 92 insertions(+)
diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
index 4a449fd..67ccfcf 100644
--- a/dlls/kernel32/tests/virtual.c
+++ b/dlls/kernel32/tests/virtual.c
@@ -3774,6 +3774,97 @@ static void test_CreateFileMapping_protection(void)
DeleteFileA(file_name);
}
+static void test_CreateFileMapping_foreign(void)
+{
+ IMAGE_DOS_HEADER *dos;
+ IMAGE_NT_HEADERS *nt;
+ IMAGE_SECTION_HEADER *sec;
+ DWORD lfanew = sizeof(*dos);
+ DWORD size = lfanew + sizeof(*nt) + sizeof(*sec);
+ DWORD written;
+ BYTE *buffer;
+ char path[MAX_PATH], filename[MAX_PATH];
+ HANDLE file, handle;
+
+ GetTempPathA( MAX_PATH, path );
+ GetTempFileNameA( path, "foreign", 0, filename );
+ file = CreateFileA( filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0 );
+ ok( file != INVALID_HANDLE_VALUE, "CreateFile error %u\n", GetLastError() );
+
+ buffer = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size );
+
+ dos = (IMAGE_DOS_HEADER *)buffer;
+ dos->e_magic = IMAGE_DOS_SIGNATURE;
+ dos->e_cblp = sizeof(*dos);
+ dos->e_cp = 1;
+ dos->e_cparhdr = lfanew / 16;
+ dos->e_minalloc = 0;
+ dos->e_maxalloc = 0xffff;
+ dos->e_ss = 0x0000;
+ dos->e_sp = 0x00b8;
+ dos->e_lfarlc = lfanew;
+ dos->e_lfanew = lfanew;
+
+ nt = (IMAGE_NT_HEADERS *)(buffer + lfanew);
+ nt->Signature = IMAGE_NT_SIGNATURE;
+#if defined __aarch64__
+ nt->FileHeader.Machine = IMAGE_FILE_MACHINE_AMD64;
+#else
+ nt->FileHeader.Machine = IMAGE_FILE_MACHINE_ARM64;
+#endif
+ nt->FileHeader.NumberOfSections = 1;
+ nt->FileHeader.SizeOfOptionalHeader = sizeof(IMAGE_OPTIONAL_HEADER);
+ nt->FileHeader.Characteristics = IMAGE_FILE_DLL | IMAGE_FILE_EXECUTABLE_IMAGE;
+ nt->OptionalHeader.Magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;
+ nt->OptionalHeader.MajorLinkerVersion = 1;
+ nt->OptionalHeader.MinorLinkerVersion = 0;
+ nt->OptionalHeader.ImageBase = 0x10000000;
+ nt->OptionalHeader.SectionAlignment = 0x1000;
+ nt->OptionalHeader.FileAlignment = 0x1000;
+ nt->OptionalHeader.MajorOperatingSystemVersion = 1;
+ nt->OptionalHeader.MinorOperatingSystemVersion = 0;
+ nt->OptionalHeader.MajorImageVersion = 1;
+ nt->OptionalHeader.MinorImageVersion = 0;
+ nt->OptionalHeader.MajorSubsystemVersion = 4;
+ nt->OptionalHeader.MinorSubsystemVersion = 0;
+ nt->OptionalHeader.SizeOfImage = 0x2000;
+ nt->OptionalHeader.SizeOfHeaders = size;
+ nt->OptionalHeader.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI;
+ nt->OptionalHeader.NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
+
+ sec = (IMAGE_SECTION_HEADER *)(nt + 1);
+ memcpy( sec->Name, ".rodata", sizeof(".rodata") );
+ sec->Misc.VirtualSize = 0x1000;
+ sec->VirtualAddress = 0x1000;
+ sec->SizeOfRawData = 0;
+ sec->PointerToRawData = 0;
+ sec->Characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE;
+
+ WriteFile( file, buffer, size, &written, NULL );
+ ok( written == size, "wrong number of bytes written %u\n", written );
+ HeapFree( GetProcessHeap(), 0, buffer );
+ CloseHandle( file );
+
+ file = CreateFileA( filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 );
+
+ /* test mapping a foreign architecture dll as image */
+ SetLastError( 0xdeadbeef );
+ handle = CreateFileMappingA( file, NULL, SEC_IMAGE | PAGE_READONLY, 0, 4096, NULL );
+ ok( !handle, "CreateFileMapping succeeded\n" );
+ ok( GetLastError() == ERROR_BAD_EXE_FORMAT || broken(GetLastError() == ERROR_INVALID_PARAMETER),
+ "wrong error %u\n", GetLastError());
+
+ /* test mapping a foreign architecture dll as no execute image */
+ SetLastError( 0xdeadbeef );
+ handle = CreateFileMappingA( file, NULL, SEC_IMAGE_NO_EXECUTE | PAGE_READONLY, 0, 4096, NULL );
+ ok( !handle, "CreateFileMapping succeeded\n" );
+ ok( GetLastError() == ERROR_BAD_EXE_FORMAT || broken(GetLastError() == ERROR_INVALID_PARAMETER),
+ "wrong error %u\n", GetLastError());
+
+ CloseHandle( file );
+ DeleteFileA( filename );
+}
+
#define ACCESS_READ 0x01
#define ACCESS_WRITE 0x02
#define ACCESS_EXECUTE 0x04
@@ -4400,6 +4491,7 @@ START_TEST(virtual)
test_shared_memory_ro(FALSE, FILE_MAP_COPY|FILE_MAP_WRITE);
test_mappings();
test_CreateFileMapping_protection();
+ test_CreateFileMapping_foreign();
test_VirtualAlloc_protection();
test_VirtualProtect();
test_VirtualAllocEx();
--
2.7.4
1
0
From: Stefan Dösinger <stefan(a)codeweavers.com>
Signed-off-by: Stefan Dösinger <stefan(a)codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/ddraw/tests/ddraw1.c | 236 +++++++++++++++++++++++++++++++++++++++++++---
dlls/ddraw/tests/ddraw2.c | 218 +++++++++++++++++++++++++++++++++++++++---
dlls/ddraw/tests/ddraw4.c | 197 +++++++++++++++++++++++++++++++++++---
dlls/ddraw/tests/ddraw7.c | 154 +++++++++++++++++++++++++++---
dlls/ddraw/tests/visual.c | 47 ---------
5 files changed, 761 insertions(+), 91 deletions(-)
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index d416cf55a3d..56521f6a4e3 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -105,31 +105,33 @@ static BOOL ddraw_is_warp(IDirectDraw *ddraw)
&& strstr(identifier.szDriver, "warp");
}
-static BOOL ddraw_is_nvidia(IDirectDraw *ddraw)
+static BOOL ddraw_is_vendor(IDirectDraw *ddraw, DWORD vendor)
{
DDDEVICEIDENTIFIER identifier;
return strcmp(winetest_platform, "wine")
&& ddraw_get_identifier(ddraw, &identifier)
- && identifier.dwVendorId == 0x10de;
+ && identifier.dwVendorId == vendor;
+}
+
+static BOOL ddraw_is_amd(IDirectDraw *ddraw)
+{
+ return ddraw_is_vendor(ddraw, 0x1002);
}
static BOOL ddraw_is_intel(IDirectDraw *ddraw)
{
- DDDEVICEIDENTIFIER identifier;
+ return ddraw_is_vendor(ddraw, 0x8086);
+}
- return strcmp(winetest_platform, "wine")
- && ddraw_get_identifier(ddraw, &identifier)
- && identifier.dwVendorId == 0x8086;
+static BOOL ddraw_is_nvidia(IDirectDraw *ddraw)
+{
+ return ddraw_is_vendor(ddraw, 0x10de);
}
static BOOL ddraw_is_vmware(IDirectDraw *ddraw)
{
- DDDEVICEIDENTIFIER identifier;
-
- return strcmp(winetest_platform, "wine")
- && ddraw_get_identifier(ddraw, &identifier)
- && identifier.dwVendorId == 0x15ad;
+ return ddraw_is_vendor(ddraw, 0x15ad);
}
static IDirectDrawSurface *create_overlay(IDirectDraw *ddraw,
@@ -10913,6 +10915,217 @@ static void test_depth_readback(void)
DestroyWindow(window);
}
+static void test_clear(void)
+{
+ D3DRECT rect_negneg, rect_full = {{0}, {0}, {640}, {480}};
+ IDirect3DViewport *viewport, *viewport2, *viewport3;
+ IDirect3DMaterial *white, *red, *green, *blue;
+ IDirect3DDevice *device;
+ IDirectDrawSurface *rt;
+ IDirectDraw *ddraw;
+ D3DRECT rect[2];
+ D3DCOLOR color;
+ ULONG refcount;
+ HWND window;
+ HRESULT hr;
+
+ window = create_window();
+ ddraw = create_ddraw();
+ ok(!!ddraw, "Failed to create a ddraw object.\n");
+ if (!(device = create_device(ddraw, window, DDSCL_NORMAL)))
+ {
+ skip("Failed to create a 3D device, skipping test.\n");
+ IDirectDraw_Release(ddraw);
+ DestroyWindow(window);
+ return;
+ }
+ hr = IDirect3DDevice_QueryInterface(device, &IID_IDirectDrawSurface, (void **)&rt);
+ ok(SUCCEEDED(hr), "Failed to get render target, hr %#x.\n", hr);
+
+ viewport = create_viewport(device, 0, 0, 640, 480);
+
+ white = create_diffuse_material(device, 1.0f, 1.0f, 1.0f, 1.0f);
+ red = create_diffuse_material(device, 1.0f, 0.0f, 0.0f, 1.0f);
+ green = create_diffuse_material(device, 0.0f, 1.0f, 0.0f, 1.0f);
+ blue = create_diffuse_material(device, 0.0f, 0.0f, 1.0f, 1.0f);
+
+ viewport_set_background(device, viewport, white);
+ hr = IDirect3DViewport_Clear(viewport, 1, &rect_full, D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ /* Positive x, negative y. */
+ U1(rect[0]).x1 = 0;
+ U2(rect[0]).y1 = 480;
+ U3(rect[0]).x2 = 320;
+ U4(rect[0]).y2 = 240;
+
+ /* Positive x, positive y. */
+ U1(rect[1]).x1 = 0;
+ U2(rect[1]).y1 = 0;
+ U3(rect[1]).x2 = 320;
+ U4(rect[1]).y2 = 240;
+
+ /* Clear 2 rectangles with one call. Unlike d3d8/9, the refrast does not
+ * refuse negative rectangles, but it will not clear them either. */
+ viewport_set_background(device, viewport, red);
+ hr = IDirect3DViewport_Clear(viewport, 2, rect, D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ /* negative x, negative y.
+ *
+ * FIXME: WARP seems to clear the entire screen here. */
+ rect_negneg.x1 = 640;
+ rect_negneg.y1 = 240;
+ rect_negneg.x2 = 320;
+ rect_negneg.y2 = 0;
+ viewport_set_background(device, viewport, green);
+ hr = IDirect3DViewport_Clear(viewport, 1, &rect_negneg, D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ color = get_surface_color(rt, 160, 360);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 3 (pos, neg) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 160, 120);
+ ok(compare_color(color, 0x00ff0000, 0), "Clear rectangle 1 (pos, pos) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 480, 360);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (NULL) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 480, 120);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (neg, neg) has color 0x%08x.\n", color);
+
+ /* Test how the viewport affects clears. */
+ viewport_set_background(device, viewport, white);
+ hr = IDirect3DViewport_Clear(viewport, 1, &rect_full, D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ viewport2 = create_viewport(device, 160, 120, 160, 120);
+ viewport_set_background(device, viewport2, blue);
+ hr = IDirect3DViewport_Clear(viewport2, 1, &rect_full, D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ viewport3 = create_viewport(device, 320, 240, 320, 240);
+ viewport_set_background(device, viewport3, green);
+
+ U1(rect[0]).x1 = 160;
+ U2(rect[0]).y1 = 120;
+ U3(rect[0]).x2 = 480;
+ U4(rect[0]).y2 = 360;
+ hr = IDirect3DViewport_Clear(viewport3, 1, &rect[0], D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ /* AMD drivers do not limit the clear area to the viewport rectangle in
+ * d3d1. It works as intended on other drivers and on d3d2 and newer on
+ * AMD cards. */
+ color = get_surface_color(rt, 158, 118);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_amd(ddraw) && compare_color(color, 0x000000ff, 0)),
+ "(158, 118) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 162, 118);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_amd(ddraw) && compare_color(color, 0x000000ff, 0)),
+ "(162, 118) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 158, 122);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_amd(ddraw) && compare_color(color, 0x000000ff, 0)),
+ "(158, 122) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 162, 122);
+ ok(compare_color(color, 0x000000ff, 0)
+ || broken(ddraw_is_amd(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "(162, 122) has color 0x%08x.\n", color);
+
+ color = get_surface_color(rt, 318, 238);
+ ok(compare_color(color, 0x000000ff, 0)
+ || broken(ddraw_is_amd(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "(318, 238) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 322, 238);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_amd(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "(322, 328) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 318, 242);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_amd(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "(318, 242) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 322, 242);
+ ok(compare_color(color, 0x0000ff00, 0), "(322, 242) has color 0x%08x.\n", color);
+
+ color = get_surface_color(rt, 478, 358);
+ ok(compare_color(color, 0x0000ff00, 0), "(478, 358) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 482, 358);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_amd(ddraw) && compare_color(color, 0x000000ff, 0)),
+ "(482, 358) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 478, 362);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_amd(ddraw) && compare_color(color, 0x000000ff, 0)),
+ "(478, 362) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 482, 362);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_amd(ddraw) && compare_color(color, 0x000000ff, 0)),
+ "(482, 362) has color 0x%08x.\n", color);
+
+ /* The clear rectangle is rendertarget absolute, not relative to the
+ * viewport. */
+ hr = IDirect3DViewport_Clear(viewport, 1, &rect_full, D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+ U1(rect[0]).x1 = 330;
+ U2(rect[0]).y1 = 250;
+ U3(rect[0]).x2 = 340;
+ U4(rect[0]).y2 = 260;
+ hr = IDirect3DViewport_Clear(viewport3, 1, &rect[0], D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ color = get_surface_color(rt, 328, 248);
+ ok(compare_color(color, 0x00ffffff, 0), "(328, 248) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 332, 248);
+ ok(compare_color(color, 0x00ffffff, 0), "(332, 248) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 328, 252);
+ ok(compare_color(color, 0x00ffffff, 0), "(328, 252) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 332, 252);
+ ok(compare_color(color, 0x0000ff00, 0), "(332, 252) has color 0x%08x.\n", color);
+
+ color = get_surface_color(rt, 338, 248);
+ ok(compare_color(color, 0x00ffffff, 0), "(338, 248) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 342, 248);
+ ok(compare_color(color, 0x00ffffff, 0), "(342, 248) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 338, 252);
+ ok(compare_color(color, 0x0000ff00, 0), "(338, 252) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 342, 252);
+ ok(compare_color(color, 0x00ffffff, 0), "(342, 252) has color 0x%08x.\n", color);
+
+ color = get_surface_color(rt, 328, 258);
+ ok(compare_color(color, 0x00ffffff, 0), "(328, 258) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 332, 258);
+ ok(compare_color(color, 0x0000ff00, 0), "(332, 258) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 328, 262);
+ ok(compare_color(color, 0x00ffffff, 0), "(328, 262) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 332, 262);
+ ok(compare_color(color, 0x00ffffff, 0), "(332, 262) has color 0x%08x.\n", color);
+
+ color = get_surface_color(rt, 338, 258);
+ ok(compare_color(color, 0x0000ff00, 0), "(338, 258) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 342, 258);
+ ok(compare_color(color, 0x00ffffff, 0), "(342, 258) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 338, 262);
+ ok(compare_color(color, 0x00ffffff, 0), "(338, 262) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 342, 262);
+ ok(compare_color(color, 0x00ffffff, 0), "(342, 262) has color 0x%08x.\n", color);
+
+ /* COLORWRITEENABLE, SRGBWRITEENABLE and scissor rectangles do not exist
+ * in d3d1. */
+
+ IDirect3DViewport_Release(viewport3);
+ IDirect3DViewport_Release(viewport2);
+ IDirect3DViewport_Release(viewport);
+ IDirect3DMaterial_Release(white);
+ IDirect3DMaterial_Release(red);
+ IDirect3DMaterial_Release(green);
+ IDirect3DMaterial_Release(blue);
+ IDirectDrawSurface_Release(rt);
+ refcount = IDirect3DDevice_Release(device);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ refcount = IDirectDraw_Release(ddraw);
+ ok(!refcount, "Ddraw object has %u references left.\n", refcount);
+ DestroyWindow(window);
+}
+
START_TEST(ddraw1)
{
DDDEVICEIDENTIFIER identifier;
@@ -11012,4 +11225,5 @@ START_TEST(ddraw1)
test_texture_load();
test_ck_operation();
test_depth_readback();
+ test_clear();
}
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index 2186c314acc..9e4aebdef4b 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -107,31 +107,28 @@ static BOOL ddraw_is_warp(IDirectDraw2 *ddraw)
&& strstr(identifier.szDriver, "warp");
}
-static BOOL ddraw_is_nvidia(IDirectDraw2 *ddraw)
+static BOOL ddraw_is_vendor(IDirectDraw2 *ddraw, DWORD vendor)
{
DDDEVICEIDENTIFIER identifier;
return strcmp(winetest_platform, "wine")
&& ddraw_get_identifier(ddraw, &identifier)
- && identifier.dwVendorId == 0x10de;
+ && identifier.dwVendorId == vendor;
}
static BOOL ddraw_is_intel(IDirectDraw2 *ddraw)
{
- DDDEVICEIDENTIFIER identifier;
+ return ddraw_is_vendor(ddraw, 0x8086);
+}
- return strcmp(winetest_platform, "wine")
- && ddraw_get_identifier(ddraw, &identifier)
- && identifier.dwVendorId == 0x8086;
+static BOOL ddraw_is_nvidia(IDirectDraw2 *ddraw)
+{
+ return ddraw_is_vendor(ddraw, 0x10de);
}
static BOOL ddraw_is_vmware(IDirectDraw2 *ddraw)
{
- DDDEVICEIDENTIFIER identifier;
-
- return strcmp(winetest_platform, "wine")
- && ddraw_get_identifier(ddraw, &identifier)
- && identifier.dwVendorId == 0x15ad;
+ return ddraw_is_vendor(ddraw, 0x15ad);
}
static IDirectDrawSurface *create_overlay(IDirectDraw2 *ddraw,
@@ -12287,6 +12284,204 @@ static void test_depth_readback(void)
DestroyWindow(window);
}
+static void test_clear(void)
+{
+ D3DRECT rect_negneg, rect_full = {{0}, {0}, {640}, {480}};
+ IDirect3DViewport2 *viewport, *viewport2, *viewport3;
+ IDirect3DMaterial2 *white, *red, *green, *blue;
+ IDirect3DDevice2 *device;
+ IDirectDrawSurface *rt;
+ IDirectDraw2 *ddraw;
+ D3DRECT rect[2];
+ D3DCOLOR color;
+ ULONG refcount;
+ HWND window;
+ HRESULT hr;
+
+ window = create_window();
+ ddraw = create_ddraw();
+ ok(!!ddraw, "Failed to create a ddraw object.\n");
+ if (!(device = create_device(ddraw, window, DDSCL_NORMAL)))
+ {
+ skip("Failed to create a 3D device, skipping test.\n");
+ IDirectDraw2_Release(ddraw);
+ DestroyWindow(window);
+ return;
+ }
+ hr = IDirect3DDevice2_GetRenderTarget(device, &rt);
+ ok(SUCCEEDED(hr), "Failed to get render target, hr %#x.\n", hr);
+
+ viewport = create_viewport(device, 0, 0, 640, 480);
+ hr = IDirect3DDevice2_SetCurrentViewport(device, viewport);
+ ok(SUCCEEDED(hr), "Failed to set current viewport, hr %#x.\n", hr);
+
+ white = create_diffuse_material(device, 1.0f, 1.0f, 1.0f, 1.0f);
+ red = create_diffuse_material(device, 1.0f, 0.0f, 0.0f, 1.0f);
+ green = create_diffuse_material(device, 0.0f, 1.0f, 0.0f, 1.0f);
+ blue = create_diffuse_material(device, 0.0f, 0.0f, 1.0f, 1.0f);
+
+ viewport_set_background(device, viewport, white);
+ hr = IDirect3DViewport2_Clear(viewport, 1, &rect_full, D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ /* Positive x, negative y. */
+ U1(rect[0]).x1 = 0;
+ U2(rect[0]).y1 = 480;
+ U3(rect[0]).x2 = 320;
+ U4(rect[0]).y2 = 240;
+
+ /* Positive x, positive y. */
+ U1(rect[1]).x1 = 0;
+ U2(rect[1]).y1 = 0;
+ U3(rect[1]).x2 = 320;
+ U4(rect[1]).y2 = 240;
+
+ /* Clear 2 rectangles with one call. Unlike d3d8/9, the refrast does not
+ * refuse negative rectangles, but it will not clear them either. */
+ viewport_set_background(device, viewport, red);
+ hr = IDirect3DViewport2_Clear(viewport, 2, rect, D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ /* negative x, negative y.
+ *
+ * FIXME: WARP seems to clear the entire screen here. */
+ rect_negneg.x1 = 640;
+ rect_negneg.y1 = 240;
+ rect_negneg.x2 = 320;
+ rect_negneg.y2 = 0;
+ viewport_set_background(device, viewport, green);
+ hr = IDirect3DViewport2_Clear(viewport, 1, &rect_negneg, D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ color = get_surface_color(rt, 160, 360);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 3 (pos, neg) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 160, 120);
+ ok(compare_color(color, 0x00ff0000, 0), "Clear rectangle 1 (pos, pos) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 480, 360);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (NULL) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 480, 120);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (neg, neg) has color 0x%08x.\n", color);
+
+ /* Test how the viewport affects clears. */
+ viewport_set_background(device, viewport, white);
+ hr = IDirect3DViewport2_Clear(viewport, 1, &rect_full, D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ viewport2 = create_viewport(device, 160, 120, 160, 120);
+ hr = IDirect3DDevice2_SetCurrentViewport(device, viewport2);
+ ok(SUCCEEDED(hr), "Failed to set current viewport, hr %#x.\n", hr);
+
+ viewport_set_background(device, viewport2, blue);
+ hr = IDirect3DViewport2_Clear(viewport2, 1, &rect_full, D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ viewport3 = create_viewport(device, 320, 240, 320, 240);
+ hr = IDirect3DDevice2_SetCurrentViewport(device, viewport3);
+ ok(SUCCEEDED(hr), "Failed to set current viewport, hr %#x.\n", hr);
+
+ U1(rect[0]).x1 = 160;
+ U2(rect[0]).y1 = 120;
+ U3(rect[0]).x2 = 480;
+ U4(rect[0]).y2 = 360;
+ viewport_set_background(device, viewport3, green);
+ hr = IDirect3DViewport2_Clear(viewport3, 1, &rect[0], D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ hr = IDirect3DDevice2_SetCurrentViewport(device, viewport);
+ ok(SUCCEEDED(hr), "Failed to set current viewport, hr %#x.\n", hr);
+
+ color = get_surface_color(rt, 158, 118);
+ ok(compare_color(color, 0x00ffffff, 0), "(158, 118) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 162, 118);
+ ok(compare_color(color, 0x00ffffff, 0), "(162, 118) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 158, 122);
+ ok(compare_color(color, 0x00ffffff, 0), "(158, 122) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 162, 122);
+ ok(compare_color(color, 0x000000ff, 0), "(162, 122) has color 0x%08x.\n", color);
+
+ color = get_surface_color(rt, 318, 238);
+ ok(compare_color(color, 0x000000ff, 0), "(318, 238) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 322, 238);
+ ok(compare_color(color, 0x00ffffff, 0), "(322, 238) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 318, 242);
+ ok(compare_color(color, 0x00ffffff, 0), "(318, 242) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 322, 242);
+ ok(compare_color(color, 0x0000ff00, 0), "(322, 242) has color 0x%08x.\n", color);
+
+ color = get_surface_color(rt, 478, 358);
+ ok(compare_color(color, 0x0000ff00, 0), "(478, 358) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 482, 358);
+ ok(compare_color(color, 0x00ffffff, 0), "(482, 358) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 478, 362);
+ ok(compare_color(color, 0x00ffffff, 0), "(478, 362) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 482, 362);
+ ok(compare_color(color, 0x00ffffff, 0), "(482, 362) has color 0x%08x.\n", color);
+
+ /* The clear rectangle is rendertarget absolute, not relative to the
+ * viewport. */
+ hr = IDirect3DViewport2_Clear(viewport, 1, &rect_full, D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+ U1(rect[0]).x1 = 330;
+ U2(rect[0]).y1 = 250;
+ U3(rect[0]).x2 = 340;
+ U4(rect[0]).y2 = 260;
+ hr = IDirect3DViewport2_Clear(viewport3, 1, &rect[0], D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ color = get_surface_color(rt, 328, 248);
+ ok(compare_color(color, 0x00ffffff, 0), "(328, 248) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 332, 248);
+ ok(compare_color(color, 0x00ffffff, 0), "(332, 248) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 328, 252);
+ ok(compare_color(color, 0x00ffffff, 0), "(328, 252) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 332, 252);
+ ok(compare_color(color, 0x0000ff00, 0), "(332, 252) has color 0x%08x.\n", color);
+
+ color = get_surface_color(rt, 338, 248);
+ ok(compare_color(color, 0x00ffffff, 0), "(338, 248) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 342, 248);
+ ok(compare_color(color, 0x00ffffff, 0), "(342, 248) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 338, 252);
+ ok(compare_color(color, 0x0000ff00, 0), "(338, 252) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 342, 252);
+ ok(compare_color(color, 0x00ffffff, 0), "(342, 252) has color 0x%08x.\n", color);
+
+ color = get_surface_color(rt, 328, 258);
+ ok(compare_color(color, 0x00ffffff, 0), "(328, 258) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 332, 258);
+ ok(compare_color(color, 0x0000ff00, 0), "(332, 258) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 328, 262);
+ ok(compare_color(color, 0x00ffffff, 0), "(328, 262) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 332, 262);
+ ok(compare_color(color, 0x00ffffff, 0), "(332, 262) has color 0x%08x.\n", color);
+
+ color = get_surface_color(rt, 338, 258);
+ ok(compare_color(color, 0x0000ff00, 0), "(338, 258) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 342, 258);
+ ok(compare_color(color, 0x00ffffff, 0), "(342, 258) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 338, 262);
+ ok(compare_color(color, 0x00ffffff, 0), "(338, 262) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 342, 262);
+ ok(compare_color(color, 0x00ffffff, 0), "(342, 262) has color 0x%08x.\n", color);
+
+ /* COLORWRITEENABLE, SRGBWRITEENABLE and scissor rectangles do not exist
+ * in d3d2. */
+
+ IDirect3DViewport2_Release(viewport3);
+ IDirect3DViewport2_Release(viewport2);
+ IDirect3DViewport2_Release(viewport);
+ IDirect3DMaterial2_Release(white);
+ IDirect3DMaterial2_Release(red);
+ IDirect3DMaterial2_Release(green);
+ IDirect3DMaterial2_Release(blue);
+ IDirectDrawSurface_Release(rt);
+ refcount = IDirect3DDevice2_Release(device);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ refcount = IDirectDraw2_Release(ddraw);
+ ok(!refcount, "Ddraw object has %u references left.\n", refcount);
+ DestroyWindow(window);
+}
+
START_TEST(ddraw2)
{
DDDEVICEIDENTIFIER identifier;
@@ -12394,4 +12589,5 @@ START_TEST(ddraw2)
test_surface_desc_size();
test_ck_operation();
test_depth_readback();
+ test_clear();
}
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index 4c1bd78eefc..e4b65a5ca1f 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -113,31 +113,28 @@ static BOOL ddraw_is_warp(IDirectDraw4 *ddraw)
&& strstr(identifier.szDriver, "warp");
}
-static BOOL ddraw_is_nvidia(IDirectDraw4 *ddraw)
+static BOOL ddraw_is_vendor(IDirectDraw4 *ddraw, DWORD vendor)
{
DDDEVICEIDENTIFIER identifier;
return strcmp(winetest_platform, "wine")
&& ddraw_get_identifier(ddraw, &identifier)
- && identifier.dwVendorId == 0x10de;
+ && identifier.dwVendorId == vendor;
}
static BOOL ddraw_is_intel(IDirectDraw4 *ddraw)
{
- DDDEVICEIDENTIFIER identifier;
+ return ddraw_is_vendor(ddraw, 0x8086);
+}
- return strcmp(winetest_platform, "wine")
- && ddraw_get_identifier(ddraw, &identifier)
- && identifier.dwVendorId == 0x8086;
+static BOOL ddraw_is_nvidia(IDirectDraw4 *ddraw)
+{
+ return ddraw_is_vendor(ddraw, 0x10de);
}
static BOOL ddraw_is_vmware(IDirectDraw4 *ddraw)
{
- DDDEVICEIDENTIFIER identifier;
-
- return strcmp(winetest_platform, "wine")
- && ddraw_get_identifier(ddraw, &identifier)
- && identifier.dwVendorId == 0x15ad;
+ return ddraw_is_vendor(ddraw, 0x15ad);
}
static IDirectDrawSurface4 *create_overlay(IDirectDraw4 *ddraw,
@@ -14355,6 +14352,183 @@ static void test_depth_readback(void)
DestroyWindow(window);
}
+static void test_clear(void)
+{
+ D3DRECT rect_negneg, rect_full = {{0}, {0}, {640}, {480}};
+ IDirect3DViewport3 *viewport, *viewport2, *viewport3;
+ IDirect3DDevice3 *device;
+ IDirectDrawSurface4 *rt;
+ D3DRECT rect[2];
+ D3DCOLOR color;
+ ULONG refcount;
+ HWND window;
+ HRESULT hr;
+
+ window = create_window();
+ if (!(device = create_device(window, DDSCL_NORMAL)))
+ {
+ skip("Failed to create 3D device.\n");
+ DestroyWindow(window);
+ return;
+ }
+
+ hr = IDirect3DDevice3_GetRenderTarget(device, &rt);
+ ok(SUCCEEDED(hr), "Failed to get render target, hr %#x.\n", hr);
+
+ viewport = create_viewport(device, 0, 0, 640, 480);
+ hr = IDirect3DDevice3_SetCurrentViewport(device, viewport);
+ ok(SUCCEEDED(hr), "Failed to set current viewport, hr %#x.\n", hr);
+
+ hr = IDirect3DViewport3_Clear2(viewport, 1, &rect_full, D3DCLEAR_TARGET, 0xffffffff, 0.0, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ /* Positive x, negative y. */
+ U1(rect[0]).x1 = 0;
+ U2(rect[0]).y1 = 480;
+ U3(rect[0]).x2 = 320;
+ U4(rect[0]).y2 = 240;
+
+ /* Positive x, positive y. */
+ U1(rect[1]).x1 = 0;
+ U2(rect[1]).y1 = 0;
+ U3(rect[1]).x2 = 320;
+ U4(rect[1]).y2 = 240;
+
+ /* Clear 2 rectangles with one call. Unlike d3d8/9, the refrast does not
+ * refuse negative rectangles, but it will not clear them either. */
+ hr = IDirect3DViewport3_Clear2(viewport, 2, rect, D3DCLEAR_TARGET, 0xffff0000, 0.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ /* negative x, negative y.
+ *
+ * FIXME: WARP seems to clear the entire screen here. */
+ rect_negneg.x1 = 640;
+ rect_negneg.y1 = 240;
+ rect_negneg.x2 = 320;
+ rect_negneg.y2 = 0;
+ hr = IDirect3DViewport3_Clear2(viewport, 1, &rect_negneg, D3DCLEAR_TARGET, 0xff00ff00, 0.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ color = get_surface_color(rt, 160, 360);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 3 (pos, neg) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 160, 120);
+ ok(compare_color(color, 0x00ff0000, 0), "Clear rectangle 1 (pos, pos) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 480, 360);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (NULL) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 480, 120);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (neg, neg) has color 0x%08x.\n", color);
+
+ /* Test how the viewport affects clears. */
+ hr = IDirect3DViewport3_Clear2(viewport, 1, &rect_full, D3DCLEAR_TARGET, 0xffffffff, 0.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ viewport2 = create_viewport(device, 160, 120, 160, 120);
+ hr = IDirect3DDevice3_SetCurrentViewport(device, viewport2);
+ ok(SUCCEEDED(hr), "Failed to set current viewport, hr %#x.\n", hr);
+
+ hr = IDirect3DViewport3_Clear2(viewport2, 1, &rect_full, D3DCLEAR_TARGET, 0xff0000ff, 0.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ viewport3 = create_viewport(device, 320, 240, 320, 240);
+ hr = IDirect3DDevice3_SetCurrentViewport(device, viewport3);
+ ok(SUCCEEDED(hr), "Failed to set current viewport, hr %#x.\n", hr);
+
+ U1(rect[0]).x1 = 160;
+ U2(rect[0]).y1 = 120;
+ U3(rect[0]).x2 = 480;
+ U4(rect[0]).y2 = 360;
+ hr = IDirect3DViewport3_Clear2(viewport3, 1, &rect[0], D3DCLEAR_TARGET, 0xff00ff00, 0.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ hr = IDirect3DDevice3_SetCurrentViewport(device, viewport);
+ ok(SUCCEEDED(hr), "Failed to set current viewport, hr %#x.\n", hr);
+
+ color = get_surface_color(rt, 158, 118);
+ ok(compare_color(color, 0x00ffffff, 0), "(158, 118) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 162, 118);
+ ok(compare_color(color, 0x00ffffff, 0), "(162, 118) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 158, 122);
+ ok(compare_color(color, 0x00ffffff, 0), "(158, 122) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 162, 122);
+ ok(compare_color(color, 0x000000ff, 0), "(162, 122) has color 0x%08x.\n", color);
+
+ color = get_surface_color(rt, 318, 238);
+ ok(compare_color(color, 0x000000ff, 0), "(318, 238) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 322, 238);
+ ok(compare_color(color, 0x00ffffff, 0), "(322, 328) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 318, 242);
+ ok(compare_color(color, 0x00ffffff, 0), "(318, 242) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 322, 242);
+ ok(compare_color(color, 0x0000ff00, 0), "(322, 242) has color 0x%08x.\n", color);
+
+ color = get_surface_color(rt, 478, 358);
+ ok(compare_color(color, 0x0000ff00, 0), "(478, 358) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 482, 358);
+ ok(compare_color(color, 0x00ffffff, 0), "(482, 358) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 478, 362);
+ ok(compare_color(color, 0x00ffffff, 0), "(478, 362) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 482, 362);
+ ok(compare_color(color, 0x00ffffff, 0), "(482, 362) has color 0x%08x.\n", color);
+
+ /* The clear rectangle is rendertarget absolute, not relative to the
+ * viewport. */
+ hr = IDirect3DViewport3_Clear2(viewport, 1, &rect_full, D3DCLEAR_TARGET, 0xffffffff, 0.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+ U1(rect[0]).x1 = 330;
+ U2(rect[0]).y1 = 250;
+ U3(rect[0]).x2 = 340;
+ U4(rect[0]).y2 = 260;
+ hr = IDirect3DViewport3_Clear2(viewport3, 1, &rect[0], D3DCLEAR_TARGET, 0xff00ff00, 0.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ color = get_surface_color(rt, 328, 248);
+ ok(compare_color(color, 0x00ffffff, 0), "(328, 248) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 332, 248);
+ ok(compare_color(color, 0x00ffffff, 0), "(332, 248) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 328, 252);
+ ok(compare_color(color, 0x00ffffff, 0), "(328, 252) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 332, 252);
+ ok(compare_color(color, 0x0000ff00, 0), "(332, 252) has color 0x%08x.\n", color);
+
+ color = get_surface_color(rt, 338, 248);
+ ok(compare_color(color, 0x00ffffff, 0), "(338, 248) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 342, 248);
+ ok(compare_color(color, 0x00ffffff, 0), "(342, 248) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 338, 252);
+ ok(compare_color(color, 0x0000ff00, 0), "(338, 252) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 342, 252);
+ ok(compare_color(color, 0x00ffffff, 0), "(342, 252) has color 0x%08x.\n", color);
+
+ color = get_surface_color(rt, 328, 258);
+ ok(compare_color(color, 0x00ffffff, 0), "(328, 258) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 332, 258);
+ ok(compare_color(color, 0x0000ff00, 0), "(332, 258) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 328, 262);
+ ok(compare_color(color, 0x00ffffff, 0), "(328, 262) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 332, 262);
+ ok(compare_color(color, 0x00ffffff, 0), "(332, 262) has color 0x%08x.\n", color);
+
+ color = get_surface_color(rt, 338, 258);
+ ok(compare_color(color, 0x0000ff00, 0), "(338, 258) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 342, 258);
+ ok(compare_color(color, 0x00ffffff, 0), "(342, 258) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 338, 262);
+ ok(compare_color(color, 0x00ffffff, 0), "(338, 262) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 342, 262);
+ ok(compare_color(color, 0x00ffffff, 0), "(342, 262) has color 0x%08x.\n", color);
+
+ /* COLORWRITEENABLE, SRGBWRITEENABLE and scissor rectangles do not exist
+ * in d3d3. */
+
+ IDirect3DViewport3_Release(viewport3);
+ IDirect3DViewport3_Release(viewport2);
+ IDirect3DViewport3_Release(viewport);
+ IDirectDrawSurface4_Release(rt);
+ refcount = IDirect3DDevice3_Release(device);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ DestroyWindow(window);
+}
+
START_TEST(ddraw4)
{
DDDEVICEIDENTIFIER identifier;
@@ -14475,4 +14649,5 @@ START_TEST(ddraw4)
test_compute_sphere_visibility();
test_map_synchronisation();
test_depth_readback();
+ test_clear();
}
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index d7355cf0ea7..5b29f9cd13e 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -127,31 +127,28 @@ static BOOL ddraw_is_warp(IDirectDraw7 *ddraw)
&& strstr(identifier.szDriver, "warp");
}
-static BOOL ddraw_is_nvidia(IDirectDraw7 *ddraw)
+static BOOL ddraw_is_vendor(IDirectDraw7 *ddraw, DWORD vendor)
{
DDDEVICEIDENTIFIER2 identifier;
return strcmp(winetest_platform, "wine")
&& ddraw_get_identifier(ddraw, &identifier)
- && identifier.dwVendorId == 0x10de;
+ && identifier.dwVendorId == vendor;
}
static BOOL ddraw_is_intel(IDirectDraw7 *ddraw)
{
- DDDEVICEIDENTIFIER2 identifier;
+ return ddraw_is_vendor(ddraw, 0x8086);
+}
- return strcmp(winetest_platform, "wine")
- && ddraw_get_identifier(ddraw, &identifier)
- && identifier.dwVendorId == 0x8086;
+static BOOL ddraw_is_nvidia(IDirectDraw7 *ddraw)
+{
+ return ddraw_is_vendor(ddraw, 0x10de);
}
static BOOL ddraw_is_vmware(IDirectDraw7 *ddraw)
{
- DDDEVICEIDENTIFIER2 identifier;
-
- return strcmp(winetest_platform, "wine")
- && ddraw_get_identifier(ddraw, &identifier)
- && identifier.dwVendorId == 0x15ad;
+ return ddraw_is_vendor(ddraw, 0x15ad);
}
static IDirectDrawSurface7 *create_overlay(IDirectDraw7 *ddraw,
@@ -13726,6 +13723,140 @@ static void test_depth_readback(void)
DestroyWindow(window);
}
+static void test_clear(void)
+{
+ IDirect3DDevice7 *device;
+ IDirectDrawSurface7 *rt;
+ D3DVIEWPORT7 vp, old_vp;
+ D3DRECT rect_negneg;
+ D3DRECT rect[2];
+ D3DCOLOR color;
+ ULONG refcount;
+ HWND window;
+ HRESULT hr;
+
+ window = create_window();
+ if (!(device = create_device(window, DDSCL_NORMAL)))
+ {
+ skip("Failed to create 3D device.\n");
+ DestroyWindow(window);
+ return;
+ }
+
+ hr = IDirect3DDevice7_GetRenderTarget(device, &rt);
+ ok(SUCCEEDED(hr), "Failed to get render target, hr %#x.\n", hr);
+
+ hr = IDirect3DDevice7_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ /* Positive x, negative y. */
+ U1(rect[0]).x1 = 0;
+ U2(rect[0]).y1 = 480;
+ U3(rect[0]).x2 = 320;
+ U4(rect[0]).y2 = 240;
+
+ /* Positive x, positive y. */
+ U1(rect[1]).x1 = 0;
+ U2(rect[1]).y1 = 0;
+ U3(rect[1]).x2 = 320;
+ U4(rect[1]).y2 = 240;
+
+ /* Clear 2 rectangles with one call. Unlike d3d8/9, the refrast does not
+ * refuse negative rectangles, but it will not clear them either. */
+ hr = IDirect3DDevice7_Clear(device, 2, rect, D3DCLEAR_TARGET, 0xffff0000, 0.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ /* negative x, negative y.
+ *
+ * FIXME: WARP seems to clear the entire screen here. */
+ rect_negneg.x1 = 640;
+ rect_negneg.y1 = 240;
+ rect_negneg.x2 = 320;
+ rect_negneg.y2 = 0;
+ hr = IDirect3DDevice7_Clear(device, 1, &rect_negneg, D3DCLEAR_TARGET, 0xff00ff00, 0.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ color = get_surface_color(rt, 160, 360);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 3 (pos, neg) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 160, 120);
+ ok(compare_color(color, 0x00ff0000, 0), "Clear rectangle 1 (pos, pos) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 480, 360);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (NULL) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 480, 120);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (neg, neg) has color 0x%08x.\n", color);
+
+ /* Test how the viewport affects clears. */
+ hr = IDirect3DDevice7_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+ hr = IDirect3DDevice7_GetViewport(device, &old_vp);
+ ok(SUCCEEDED(hr), "Failed to get viewport, hr %#x.\n", hr);
+
+ vp.dwX = 160;
+ vp.dwY = 120;
+ vp.dwWidth = 160;
+ vp.dwHeight = 120;
+ vp.dvMinZ = 0.0f;
+ vp.dvMaxZ = 1.0f;
+ hr = IDirect3DDevice7_SetViewport(device, &vp);
+ ok(SUCCEEDED(hr), "Failed to set viewport, hr %#x.\n", hr);
+ hr = IDirect3DDevice7_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xff0000ff, 0.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ vp.dwX = 320;
+ vp.dwY = 240;
+ vp.dwWidth = 320;
+ vp.dwHeight = 240;
+ vp.dvMinZ = 0.0f;
+ vp.dvMaxZ = 1.0f;
+ hr = IDirect3DDevice7_SetViewport(device, &vp);
+ ok(SUCCEEDED(hr), "Failed to set viewport, hr %#x.\n", hr);
+
+ U1(rect[0]).x1 = 160;
+ U2(rect[0]).y1 = 120;
+ U3(rect[0]).x2 = 480;
+ U4(rect[0]).y2 = 360;
+ hr = IDirect3DDevice7_Clear(device, 1, &rect[0], D3DCLEAR_TARGET, 0xff00ff00, 0.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ hr = IDirect3DDevice7_SetViewport(device, &old_vp);
+ ok(SUCCEEDED(hr), "Failed to set viewport, hr %#x.\n", hr);
+
+ color = get_surface_color(rt, 158, 118);
+ ok(compare_color(color, 0x00ffffff, 0), "(158, 118) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 162, 118);
+ ok(compare_color(color, 0x00ffffff, 0), "(162, 118) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 158, 122);
+ ok(compare_color(color, 0x00ffffff, 0), "(158, 122) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 162, 122);
+ ok(compare_color(color, 0x000000ff, 0), "(162, 122) has color 0x%08x.\n", color);
+
+ color = get_surface_color(rt, 318, 238);
+ ok(compare_color(color, 0x000000ff, 0), "(318, 238) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 322, 238);
+ ok(compare_color(color, 0x00ffffff, 0), "(322, 328) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 318, 242);
+ ok(compare_color(color, 0x00ffffff, 0), "(318, 242) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 322, 242);
+ ok(compare_color(color, 0x0000ff00, 0), "(322, 242) has color 0x%08x.\n", color);
+
+ color = get_surface_color(rt, 478, 358);
+ ok(compare_color(color, 0x0000ff00, 0), "(478, 358) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 482, 358);
+ ok(compare_color(color, 0x00ffffff, 0), "(482, 358) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 478, 362);
+ ok(compare_color(color, 0x00ffffff, 0), "(478, 362) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 482, 362);
+ ok(compare_color(color, 0x00ffffff, 0), "(482, 362) has color 0x%08x.\n", color);
+
+ /* COLORWRITEENABLE, SRGBWRITEENABLE and scissor rectangles do not exist
+ * in d3d7. */
+
+ IDirectDrawSurface7_Release(rt);
+ refcount = IDirect3DDevice7_Release(device);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ DestroyWindow(window);
+}
+
START_TEST(ddraw7)
{
DDDEVICEIDENTIFIER2 identifier;
@@ -13856,4 +13987,5 @@ START_TEST(ddraw7)
test_clip_planes_limits();
test_map_synchronisation();
test_depth_readback();
+ test_clear();
}
diff --git a/dlls/ddraw/tests/visual.c b/dlls/ddraw/tests/visual.c
index 4f6213354d6..2cb1c892314 100644
--- a/dlls/ddraw/tests/visual.c
+++ b/dlls/ddraw/tests/visual.c
@@ -267,52 +267,6 @@ static void set_viewport_size(IDirect3DDevice7 *device)
return;
}
-static void clear_test(IDirect3DDevice7 *device)
-{
- /* Tests the correctness of clearing parameters */
- HRESULT hr;
- D3DRECT rect[2];
- D3DRECT rect_negneg;
- DWORD color;
-
- hr = IDirect3DDevice7_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0, 0);
- ok(hr == D3D_OK, "IDirect3DDevice7_Clear failed with %08x\n", hr);
-
- /* Positive x, negative y */
- U1(rect[0]).x1 = 0;
- U2(rect[0]).y1 = 480;
- U3(rect[0]).x2 = 320;
- U4(rect[0]).y2 = 240;
-
- /* Positive x, positive y */
- U1(rect[1]).x1 = 0;
- U2(rect[1]).y1 = 0;
- U3(rect[1]).x2 = 320;
- U4(rect[1]).y2 = 240;
- /* Clear 2 rectangles with one call. Shows that a positive value is returned, but the negative rectangle
- * is ignored, the positive is still cleared afterwards
- */
- hr = IDirect3DDevice7_Clear(device, 2, rect, D3DCLEAR_TARGET, 0xffff0000, 0.0, 0);
- ok(hr == D3D_OK, "IDirect3DDevice7_Clear failed with %08x\n", hr);
-
- /* negative x, negative y */
- U1(rect_negneg).x1 = 640;
- U2(rect_negneg).y1 = 240;
- U3(rect_negneg).x2 = 320;
- U4(rect_negneg).y2 = 0;
- hr = IDirect3DDevice7_Clear(device, 1, &rect_negneg, D3DCLEAR_TARGET, 0xff00ff00, 0.0, 0);
- ok(hr == D3D_OK, "IDirect3DDevice7_Clear failed with %08x\n", hr);
-
- color = getPixelColor(device, 160, 360); /* lower left quad */
- ok(color == 0x00ffffff, "Clear rectangle 3(pos, neg) has color %08x\n", color);
- color = getPixelColor(device, 160, 120); /* upper left quad */
- ok(color == 0x00ff0000, "Clear rectangle 1(pos, pos) has color %08x\n", color);
- color = getPixelColor(device, 480, 360); /* lower right quad */
- ok(color == 0x00ffffff, "Clear rectangle 4(NULL) has color %08x\n", color);
- color = getPixelColor(device, 480, 120); /* upper right quad */
- ok(color == 0x00ffffff, "Clear rectangle 4(neg, neg) has color %08x\n", color);
-}
-
static void fog_test(IDirect3DDevice7 *device)
{
HRESULT hr;
@@ -1681,7 +1635,6 @@ START_TEST(visual)
/* Now run the tests */
depth_clamp_test(Direct3DDevice);
- clear_test(Direct3DDevice);
fog_test(Direct3DDevice);
offscreen_test(Direct3DDevice);
test_blend(Direct3DDevice);
--
2.11.0
2
1
[PATCH 1/2] d3d11: Handle 3D textures in wined3d_resource_from_d3d10_resource().
by JĂ³zef Kucia 10 Jan '18
by JĂ³zef Kucia 10 Jan '18
10 Jan '18
Signed-off-by: JĂ³zef Kucia <jkucia(a)codeweavers.com>
---
dlls/d3d11/d3d11_private.h | 1 +
dlls/d3d11/texture.c | 8 ++++++++
dlls/d3d11/utils.c | 4 ++++
3 files changed, 13 insertions(+)
diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h
index 4d9f34ea42ff..e7fd3a7f4c79 100644
--- a/dlls/d3d11/d3d11_private.h
+++ b/dlls/d3d11/d3d11_private.h
@@ -152,6 +152,7 @@ struct d3d_texture3d
HRESULT d3d_texture3d_create(struct d3d_device *device, const D3D11_TEXTURE3D_DESC *desc,
const D3D11_SUBRESOURCE_DATA *data, struct d3d_texture3d **texture) DECLSPEC_HIDDEN;
struct d3d_texture3d *unsafe_impl_from_ID3D11Texture3D(ID3D11Texture3D *iface) DECLSPEC_HIDDEN;
+struct d3d_texture3d *unsafe_impl_from_ID3D10Texture3D(ID3D10Texture3D *iface) DECLSPEC_HIDDEN;
/* ID3D11Buffer, ID3D10Buffer */
struct d3d_buffer
diff --git a/dlls/d3d11/texture.c b/dlls/d3d11/texture.c
index 177c0cc93912..17fb4b1da37c 100644
--- a/dlls/d3d11/texture.c
+++ b/dlls/d3d11/texture.c
@@ -924,6 +924,14 @@ static const struct ID3D10Texture3DVtbl d3d10_texture3d_vtbl =
d3d10_texture3d_GetDesc,
};
+struct d3d_texture3d *unsafe_impl_from_ID3D10Texture3D(ID3D10Texture3D *iface)
+{
+ if (!iface)
+ return NULL;
+ assert(iface->lpVtbl == &d3d10_texture3d_vtbl);
+ return CONTAINING_RECORD(iface, struct d3d_texture3d, ID3D10Texture3D_iface);
+}
+
struct d3d_texture3d *unsafe_impl_from_ID3D11Texture3D(ID3D11Texture3D *iface)
{
if (!iface)
diff --git a/dlls/d3d11/utils.c b/dlls/d3d11/utils.c
index e919c58da452..c9e137c66e57 100644
--- a/dlls/d3d11/utils.c
+++ b/dlls/d3d11/utils.c
@@ -637,6 +637,10 @@ struct wined3d_resource *wined3d_resource_from_d3d10_resource(ID3D10Resource *re
return wined3d_texture_get_resource(unsafe_impl_from_ID3D10Texture2D(
(ID3D10Texture2D *)resource)->wined3d_texture);
+ case D3D10_RESOURCE_DIMENSION_TEXTURE3D:
+ return wined3d_texture_get_resource(unsafe_impl_from_ID3D10Texture3D(
+ (ID3D10Texture3D *)resource)->wined3d_texture);
+
default:
FIXME("Unhandled resource dimension %#x.\n", dimension);
return NULL;
--
2.13.6
2
4
From: Nikolay Sivov <nsivov(a)codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/ddraw/tests/ddraw1.c | 76 ++++++++++++++++++++++++++++++++++++++++++
dlls/ddraw/tests/ddraw2.c | 76 ++++++++++++++++++++++++++++++++++++++++++
dlls/ddraw/tests/ddraw4.c | 76 ++++++++++++++++++++++++++++++++++++++++++
dlls/ddraw/tests/ddraw7.c | 81 +++++++++++++++++++++++++++++++++++++++++++++
dlls/ddraw/tests/dsurface.c | 42 -----------------------
5 files changed, 309 insertions(+), 42 deletions(-)
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index ee03ee94b68..cef50ade3c6 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -11146,6 +11146,81 @@ static void test_clear(void)
DestroyWindow(window);
}
+struct enum_surfaces_param
+{
+ IDirectDrawSurface *surfaces[8];
+ unsigned int count;
+};
+
+static HRESULT WINAPI enum_surfaces_cb(IDirectDrawSurface *surface, DDSURFACEDESC *desc, void *context)
+{
+ struct enum_surfaces_param *param = context;
+ BOOL found = FALSE;
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(param->surfaces); ++i)
+ {
+ if (param->surfaces[i] == surface)
+ {
+ found = TRUE;
+ break;
+ }
+ }
+
+ ok(found, "Unexpected surface %p enumerated.\n", surface);
+ IDirectDrawSurface_Release(surface);
+ ++param->count;
+
+ return DDENUMRET_OK;
+}
+
+static void test_enum_surfaces(void)
+{
+ struct enum_surfaces_param param = {0};
+ IDirectDraw *ddraw;
+ DDSURFACEDESC desc;
+ HRESULT hr;
+
+ ddraw = create_ddraw();
+ ok(!!ddraw, "Failed to create a ddraw object.\n");
+
+ hr = IDirectDraw_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL);
+ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+
+ desc.dwSize = sizeof(desc);
+ desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_MIPMAPCOUNT;
+ desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
+ U2(desc).dwMipMapCount = 3;
+ desc.dwWidth = 32;
+ desc.dwHeight = 32;
+ hr = IDirectDraw_CreateSurface(ddraw, &desc, ¶m.surfaces[0], NULL);
+ ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
+
+ hr = IDirectDrawSurface_GetAttachedSurface(param.surfaces[0], &desc.ddsCaps, ¶m.surfaces[1]);
+ ok(SUCCEEDED(hr), "Failed to get attached surface, hr %#x.\n", hr);
+ hr = IDirectDrawSurface_GetAttachedSurface(param.surfaces[1], &desc.ddsCaps, ¶m.surfaces[2]);
+ ok(SUCCEEDED(hr), "Failed to get attached surface, hr %#x.\n", hr);
+ hr = IDirectDrawSurface_GetAttachedSurface(param.surfaces[2], &desc.ddsCaps, ¶m.surfaces[3]);
+ ok(hr == DDERR_NOTFOUND, "Got unexpected hr %#x.\n", hr);
+ ok(!param.surfaces[3], "Got unexpected pointer %p.\n", param.surfaces[3]);
+
+ hr = IDirectDraw_EnumSurfaces(ddraw, DDENUMSURFACES_DOESEXIST | DDENUMSURFACES_ALL,
+ &desc, ¶m, enum_surfaces_cb);
+ ok(SUCCEEDED(hr), "Failed to enumerate surfaces, hr %#x.\n", hr);
+ ok(param.count == 3, "Got unexpected number of enumerated surfaces %u.\n", param.count);
+
+ param.count = 0;
+ hr = IDirectDraw_EnumSurfaces(ddraw, DDENUMSURFACES_DOESEXIST | DDENUMSURFACES_ALL,
+ NULL, ¶m, enum_surfaces_cb);
+ ok(SUCCEEDED(hr), "Failed to enumerate surfaces, hr %#x.\n", hr);
+ ok(param.count == 3, "Got unexpected number of enumerated surfaces %u.\n", param.count);
+
+ IDirectDrawSurface_Release(param.surfaces[2]);
+ IDirectDrawSurface_Release(param.surfaces[1]);
+ IDirectDrawSurface_Release(param.surfaces[0]);
+ IDirectDraw_Release(ddraw);
+}
+
START_TEST(ddraw1)
{
DDDEVICEIDENTIFIER identifier;
@@ -11246,4 +11321,5 @@ START_TEST(ddraw1)
test_ck_operation();
test_depth_readback();
test_clear();
+ test_enum_surfaces();
}
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index 42dc3f262d0..3e7704f95eb 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -12502,6 +12502,81 @@ static void test_clear(void)
DestroyWindow(window);
}
+struct enum_surfaces_param
+{
+ IDirectDrawSurface *surfaces[8];
+ unsigned int count;
+};
+
+static HRESULT WINAPI enum_surfaces_cb(IDirectDrawSurface *surface, DDSURFACEDESC *desc, void *context)
+{
+ struct enum_surfaces_param *param = context;
+ BOOL found = FALSE;
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(param->surfaces); ++i)
+ {
+ if (param->surfaces[i] == surface)
+ {
+ found = TRUE;
+ break;
+ }
+ }
+
+ ok(found, "Unexpected surface %p enumerated.\n", surface);
+ IDirectDrawSurface_Release(surface);
+ ++param->count;
+
+ return DDENUMRET_OK;
+}
+
+static void test_enum_surfaces(void)
+{
+ struct enum_surfaces_param param = {0};
+ IDirectDraw2 *ddraw;
+ DDSURFACEDESC desc;
+ HRESULT hr;
+
+ ddraw = create_ddraw();
+ ok(!!ddraw, "Failed to create a ddraw object.\n");
+
+ hr = IDirectDraw2_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL);
+ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+
+ desc.dwSize = sizeof(desc);
+ desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_MIPMAPCOUNT;
+ desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
+ U2(desc).dwMipMapCount = 3;
+ desc.dwWidth = 32;
+ desc.dwHeight = 32;
+ hr = IDirectDraw2_CreateSurface(ddraw, &desc, ¶m.surfaces[0], NULL);
+ ok(SUCCEEDED(hr), "Failed to create a surface, hr %#x.\n", hr);
+
+ hr = IDirectDrawSurface_GetAttachedSurface(param.surfaces[0], &desc.ddsCaps, ¶m.surfaces[1]);
+ ok(SUCCEEDED(hr), "Failed to get attached surface, hr %#x.\n", hr);
+ hr = IDirectDrawSurface_GetAttachedSurface(param.surfaces[1], &desc.ddsCaps, ¶m.surfaces[2]);
+ ok(SUCCEEDED(hr), "Failed to get attached surface, hr %#x.\n", hr);
+ hr = IDirectDrawSurface_GetAttachedSurface(param.surfaces[2], &desc.ddsCaps, ¶m.surfaces[3]);
+ ok(hr == DDERR_NOTFOUND, "Got unexpected hr %#x.\n", hr);
+ ok(!param.surfaces[3], "Got unexpected pointer %p.\n", param.surfaces[3]);
+
+ hr = IDirectDraw2_EnumSurfaces(ddraw, DDENUMSURFACES_DOESEXIST | DDENUMSURFACES_ALL,
+ &desc, ¶m, enum_surfaces_cb);
+ ok(SUCCEEDED(hr), "Failed to enumerate surfaces, hr %#x.\n", hr);
+ ok(param.count == 3, "Got unexpected number of enumerated surfaces %u.\n", param.count);
+
+ param.count = 0;
+ hr = IDirectDraw2_EnumSurfaces(ddraw, DDENUMSURFACES_DOESEXIST | DDENUMSURFACES_ALL,
+ NULL, ¶m, enum_surfaces_cb);
+ ok(SUCCEEDED(hr), "Failed to enumerate surfaces, hr %#x.\n", hr);
+ ok(param.count == 3, "Got unexpected number of enumerated surfaces %u.\n", param.count);
+
+ IDirectDrawSurface_Release(param.surfaces[2]);
+ IDirectDrawSurface_Release(param.surfaces[1]);
+ IDirectDrawSurface_Release(param.surfaces[0]);
+ IDirectDraw2_Release(ddraw);
+}
+
START_TEST(ddraw2)
{
DDDEVICEIDENTIFIER identifier;
@@ -12610,4 +12685,5 @@ START_TEST(ddraw2)
test_ck_operation();
test_depth_readback();
test_clear();
+ test_enum_surfaces();
}
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index dab1e6d0f97..c0ffa532eed 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -14556,6 +14556,81 @@ static void test_clear(void)
DestroyWindow(window);
}
+struct enum_surfaces_param
+{
+ IDirectDrawSurface4 *surfaces[8];
+ unsigned int count;
+};
+
+static HRESULT WINAPI enum_surfaces_cb(IDirectDrawSurface4 *surface, DDSURFACEDESC2 *desc, void *context)
+{
+ struct enum_surfaces_param *param = context;
+ BOOL found = FALSE;
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(param->surfaces); ++i)
+ {
+ if (param->surfaces[i] == surface)
+ {
+ found = TRUE;
+ break;
+ }
+ }
+
+ ok(found, "Unexpected surface %p enumerated.\n", surface);
+ IDirectDrawSurface4_Release(surface);
+ ++param->count;
+
+ return DDENUMRET_OK;
+}
+
+static void test_enum_surfaces(void)
+{
+ struct enum_surfaces_param param = {0};
+ DDSURFACEDESC2 desc;
+ IDirectDraw4 *ddraw;
+ HRESULT hr;
+
+ ddraw = create_ddraw();
+ ok(!!ddraw, "Failed to create a ddraw object.\n");
+
+ hr = IDirectDraw4_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL);
+ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+
+ desc.dwSize = sizeof(desc);
+ desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_MIPMAPCOUNT;
+ desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
+ U2(desc).dwMipMapCount = 3;
+ desc.dwWidth = 32;
+ desc.dwHeight = 32;
+ hr = IDirectDraw4_CreateSurface(ddraw, &desc, ¶m.surfaces[0], NULL);
+ ok(SUCCEEDED(hr), "Failed to create a surface, hr %#x.\n", hr);
+
+ hr = IDirectDrawSurface4_GetAttachedSurface(param.surfaces[0], &desc.ddsCaps, ¶m.surfaces[1]);
+ ok(SUCCEEDED(hr), "Failed to get attached surface, hr %#x.\n", hr);
+ hr = IDirectDrawSurface4_GetAttachedSurface(param.surfaces[1], &desc.ddsCaps, ¶m.surfaces[2]);
+ ok(SUCCEEDED(hr), "Failed to get attached surface, hr %#x.\n", hr);
+ hr = IDirectDrawSurface4_GetAttachedSurface(param.surfaces[2], &desc.ddsCaps, ¶m.surfaces[3]);
+ ok(hr == DDERR_NOTFOUND, "Got unexpected hr %#x.\n", hr);
+ ok(!param.surfaces[3], "Got unexpected pointer %p.\n", param.surfaces[3]);
+
+ hr = IDirectDraw4_EnumSurfaces(ddraw, DDENUMSURFACES_DOESEXIST | DDENUMSURFACES_ALL,
+ &desc, ¶m, enum_surfaces_cb);
+ ok(SUCCEEDED(hr), "Failed to enumerate surfaces, hr %#x.\n", hr);
+ ok(param.count == 3, "Got unexpected number of enumerated surfaces %u.\n", param.count);
+
+ param.count = 0;
+ hr = IDirectDraw4_EnumSurfaces(ddraw, DDENUMSURFACES_DOESEXIST | DDENUMSURFACES_ALL,
+ NULL, ¶m, enum_surfaces_cb);
+ ok(SUCCEEDED(hr), "Failed to enumerate surfaces, hr %#x.\n", hr);
+ ok(param.count == 3, "Got unexpected number of enumerated surfaces %u.\n", param.count);
+
+ IDirectDrawSurface4_Release(param.surfaces[2]);
+ IDirectDrawSurface4_Release(param.surfaces[1]);
+ IDirectDrawSurface4_Release(param.surfaces[0]);
+ IDirectDraw4_Release(ddraw);
+}
+
START_TEST(ddraw4)
{
DDDEVICEIDENTIFIER identifier;
@@ -14677,4 +14752,5 @@ START_TEST(ddraw4)
test_map_synchronisation();
test_depth_readback();
test_clear();
+ test_enum_surfaces();
}
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index cebe0ecbf50..a187d8b80c9 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -13884,6 +13884,86 @@ static void test_clear(void)
DestroyWindow(window);
}
+struct enum_surfaces_param
+{
+ IDirectDrawSurface7 *surfaces[8];
+ unsigned int count;
+};
+
+static HRESULT WINAPI enum_surfaces_cb(IDirectDrawSurface7 *surface, DDSURFACEDESC2 *desc, void *context)
+{
+ struct enum_surfaces_param *param = context;
+ BOOL found = FALSE;
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(param->surfaces); ++i)
+ {
+ if (param->surfaces[i] == surface)
+ {
+ found = TRUE;
+ break;
+ }
+ }
+
+ ok(found, "Unexpected surface %p enumerated.\n", surface);
+ IDirectDrawSurface7_Release(surface);
+ ++param->count;
+
+ return DDENUMRET_OK;
+}
+
+static void test_enum_surfaces(void)
+{
+ struct enum_surfaces_param param = {0};
+ DDSURFACEDESC2 desc;
+ IDirectDraw7 *ddraw;
+ HRESULT hr;
+
+ ddraw = create_ddraw();
+ ok(!!ddraw, "Failed to create a ddraw object.\n");
+
+ hr = IDirectDraw7_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL);
+ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+
+ memset(&desc, 0, sizeof(desc));
+ desc.dwSize = sizeof(desc);
+ desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_MIPMAPCOUNT;
+ desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
+ U2(desc).dwMipMapCount = 3;
+ desc.dwWidth = 32;
+ desc.dwHeight = 32;
+ if (FAILED(IDirectDraw7_CreateSurface(ddraw, &desc, ¶m.surfaces[0], NULL)))
+ {
+ win_skip("Failed to create a texture, skipping tests.\n");
+ IDirectDraw7_Release(ddraw);
+ return;
+ }
+
+ hr = IDirectDrawSurface7_GetAttachedSurface(param.surfaces[0], &desc.ddsCaps, ¶m.surfaces[1]);
+ ok(SUCCEEDED(hr), "Failed to get attached surface, hr %#x.\n", hr);
+ hr = IDirectDrawSurface7_GetAttachedSurface(param.surfaces[1], &desc.ddsCaps, ¶m.surfaces[2]);
+ ok(SUCCEEDED(hr), "Failed to get attached surface, hr %#x.\n", hr);
+ hr = IDirectDrawSurface7_GetAttachedSurface(param.surfaces[2], &desc.ddsCaps, ¶m.surfaces[3]);
+ ok(hr == DDERR_NOTFOUND, "Got unexpected hr %#x.\n", hr);
+ ok(!param.surfaces[3], "Got unexpected pointer %p.\n", param.surfaces[3]);
+
+ hr = IDirectDraw7_EnumSurfaces(ddraw, DDENUMSURFACES_DOESEXIST | DDENUMSURFACES_ALL,
+ &desc, ¶m, enum_surfaces_cb);
+ ok(SUCCEEDED(hr), "Failed to enumerate surfaces, hr %#x.\n", hr);
+ ok(param.count == 3, "Got unexpected number of enumerated surfaces %u.\n", param.count);
+
+ param.count = 0;
+ hr = IDirectDraw7_EnumSurfaces(ddraw, DDENUMSURFACES_DOESEXIST | DDENUMSURFACES_ALL,
+ NULL, ¶m, enum_surfaces_cb);
+ ok(SUCCEEDED(hr), "Failed to enumerate surfaces, hr %#x.\n", hr);
+ ok(param.count == 3, "Got unexpected number of enumerated surfaces %u.\n", param.count);
+
+ IDirectDrawSurface7_Release(param.surfaces[2]);
+ IDirectDrawSurface7_Release(param.surfaces[1]);
+ IDirectDrawSurface7_Release(param.surfaces[0]);
+ IDirectDraw7_Release(ddraw);
+}
+
START_TEST(ddraw7)
{
DDDEVICEIDENTIFIER2 identifier;
@@ -14015,4 +14095,5 @@ START_TEST(ddraw7)
test_map_synchronisation();
test_depth_readback();
test_clear();
+ test_enum_surfaces();
}
diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c
index 90e7fcf781b..0f775a00625 100644
--- a/dlls/ddraw/tests/dsurface.c
+++ b/dlls/ddraw/tests/dsurface.c
@@ -368,47 +368,6 @@ static HRESULT WINAPI enumCB(IDirectDrawSurface *surf, DDSURFACEDESC *desc, void
return DDENUMRET_OK;
}
-static void EnumTest(void)
-{
- HRESULT rc;
- DDSURFACEDESC ddsd;
- IDirectDrawSurface *surface;
- struct enumstruct ctx;
-
- ddsd.dwSize = sizeof(ddsd);
- ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_MIPMAPCOUNT;
- ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
- U2(ddsd).dwMipMapCount = 3;
- ddsd.dwWidth = 32;
- ddsd.dwHeight = 32;
- rc = IDirectDraw_CreateSurface(lpDD, &ddsd, &surface, NULL);
- ok(rc==DD_OK,"CreateSurface returned: %x\n",rc);
-
- memset(&ctx, 0, sizeof(ctx));
- ctx.expected[0] = surface;
- rc = IDirectDrawSurface_GetAttachedSurface(ctx.expected[0], &ddsd.ddsCaps, &ctx.expected[1]);
- ok(rc == DD_OK, "GetAttachedSurface returned %08x\n", rc);
- rc = IDirectDrawSurface_GetAttachedSurface(ctx.expected[1], &ddsd.ddsCaps, &ctx.expected[2]);
- ok(rc == DD_OK, "GetAttachedSurface returned %08x\n", rc);
- rc = IDirectDrawSurface_GetAttachedSurface(ctx.expected[2], &ddsd.ddsCaps, &ctx.expected[3]);
- ok(rc == DDERR_NOTFOUND, "GetAttachedSurface returned %08x\n", rc);
- ok(!ctx.expected[3], "expected NULL pointer\n");
- ctx.count = 0;
-
- rc = IDirectDraw_EnumSurfaces(lpDD, DDENUMSURFACES_DOESEXIST | DDENUMSURFACES_ALL, &ddsd, &ctx, enumCB);
- ok(rc == DD_OK, "IDirectDraw_EnumSurfaces returned %08x\n", rc);
- ok(ctx.count == 3, "%d surfaces enumerated, expected 3\n", ctx.count);
-
- ctx.count = 0;
- rc = IDirectDraw_EnumSurfaces(lpDD, DDENUMSURFACES_DOESEXIST | DDENUMSURFACES_ALL, NULL, &ctx, enumCB);
- ok(rc == DD_OK, "IDirectDraw_EnumSurfaces returned %08x\n", rc);
- ok(ctx.count == 3, "%d surfaces enumerated, expected 3\n", ctx.count);
-
- IDirectDrawSurface_Release(ctx.expected[2]);
- IDirectDrawSurface_Release(ctx.expected[1]);
- IDirectDrawSurface_Release(surface);
-}
-
struct compare
{
DWORD width, height;
@@ -2609,7 +2568,6 @@ START_TEST(dsurface)
GetDDInterface_2();
GetDDInterface_4();
GetDDInterface_7();
- EnumTest();
CubeMapTest();
CompressedTest();
SizeTest();
--
2.11.0
1
0
10 Jan '18
From: Stefan Dösinger <stefan(a)codeweavers.com>
Signed-off-by: Stefan Dösinger <stefan(a)codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/ddraw/tests/ddraw1.c | 32 ++++++++++++++++++++++++++------
dlls/ddraw/tests/ddraw2.c | 32 ++++++++++++++++++++++++++------
dlls/ddraw/tests/ddraw4.c | 39 +++++++++++++++++++++++++++++++++------
dlls/ddraw/tests/ddraw7.c | 39 +++++++++++++++++++++++++++++++++------
4 files changed, 118 insertions(+), 24 deletions(-)
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index 56521f6a4e3..ee03ee94b68 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -10971,9 +10971,21 @@ static void test_clear(void)
hr = IDirect3DViewport_Clear(viewport, 2, rect, D3DCLEAR_TARGET);
ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+ color = get_surface_color(rt, 160, 360);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 3 (pos, neg) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 160, 120);
+ ok(compare_color(color, 0x00ff0000, 0), "Clear rectangle 1 (pos, pos) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 480, 360);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (NULL) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 480, 120);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (neg, neg) has color 0x%08x.\n", color);
+
+ viewport_set_background(device, viewport, white);
+ hr = IDirect3DViewport_Clear(viewport, 1, &rect_full, D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
/* negative x, negative y.
- *
- * FIXME: WARP seems to clear the entire screen here. */
+ * Also ignored, except on WARP, which clears the entire screen. */
rect_negneg.x1 = 640;
rect_negneg.y1 = 240;
rect_negneg.x2 = 320;
@@ -10983,13 +10995,21 @@ static void test_clear(void)
ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
color = get_surface_color(rt, 160, 360);
- ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 3 (pos, neg) has color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_warp(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 160, 120);
- ok(compare_color(color, 0x00ff0000, 0), "Clear rectangle 1 (pos, pos) has color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_warp(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 480, 360);
- ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (NULL) has color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_warp(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 480, 120);
- ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (neg, neg) has color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_warp(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "Got unexpected color 0x%08x.\n", color);
/* Test how the viewport affects clears. */
viewport_set_background(device, viewport, white);
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index 9e4aebdef4b..42dc3f262d0 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -12342,9 +12342,21 @@ static void test_clear(void)
hr = IDirect3DViewport2_Clear(viewport, 2, rect, D3DCLEAR_TARGET);
ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+ color = get_surface_color(rt, 160, 360);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 3 (pos, neg) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 160, 120);
+ ok(compare_color(color, 0x00ff0000, 0), "Clear rectangle 1 (pos, pos) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 480, 360);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (NULL) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 480, 120);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (neg, neg) has color 0x%08x.\n", color);
+
+ viewport_set_background(device, viewport, white);
+ hr = IDirect3DViewport2_Clear(viewport, 1, &rect_full, D3DCLEAR_TARGET);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
/* negative x, negative y.
- *
- * FIXME: WARP seems to clear the entire screen here. */
+ * Also ignored, except on WARP, which clears the entire screen. */
rect_negneg.x1 = 640;
rect_negneg.y1 = 240;
rect_negneg.x2 = 320;
@@ -12354,13 +12366,21 @@ static void test_clear(void)
ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
color = get_surface_color(rt, 160, 360);
- ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 3 (pos, neg) has color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_warp(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 160, 120);
- ok(compare_color(color, 0x00ff0000, 0), "Clear rectangle 1 (pos, pos) has color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_warp(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 480, 360);
- ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (NULL) has color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_warp(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 480, 120);
- ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (neg, neg) has color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_warp(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "Got unexpected color 0x%08x.\n", color);
/* Test how the viewport affects clears. */
viewport_set_background(device, viewport, white);
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index e4b65a5ca1f..dab1e6d0f97 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -14358,6 +14358,8 @@ static void test_clear(void)
IDirect3DViewport3 *viewport, *viewport2, *viewport3;
IDirect3DDevice3 *device;
IDirectDrawSurface4 *rt;
+ IDirectDraw4 *ddraw;
+ IDirect3D3 *d3d;
D3DRECT rect[2];
D3DCOLOR color;
ULONG refcount;
@@ -14372,6 +14374,11 @@ static void test_clear(void)
return;
}
+ hr = IDirect3DDevice3_GetDirect3D(device, &d3d);
+ ok(SUCCEEDED(hr), "Failed to get Direct3D3 interface, hr %#x.\n", hr);
+ hr = IDirect3D3_QueryInterface(d3d, &IID_IDirectDraw4, (void **)&ddraw);
+ ok(SUCCEEDED(hr), "Failed to get ddraw interface, hr %#x.\n", hr);
+
hr = IDirect3DDevice3_GetRenderTarget(device, &rt);
ok(SUCCEEDED(hr), "Failed to get render target, hr %#x.\n", hr);
@@ -14399,9 +14406,19 @@ static void test_clear(void)
hr = IDirect3DViewport3_Clear2(viewport, 2, rect, D3DCLEAR_TARGET, 0xffff0000, 0.0f, 0);
ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+ color = get_surface_color(rt, 160, 360);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 3 (pos, neg) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 160, 120);
+ ok(compare_color(color, 0x00ff0000, 0), "Clear rectangle 1 (pos, pos) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 480, 360);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (NULL) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 480, 120);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (neg, neg) has color 0x%08x.\n", color);
+
+ hr = IDirect3DViewport3_Clear2(viewport, 1, &rect_full, D3DCLEAR_TARGET, 0xffffffff, 0.0, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
/* negative x, negative y.
- *
- * FIXME: WARP seems to clear the entire screen here. */
+ * Also ignored, except on WARP, which clears the entire screen. */
rect_negneg.x1 = 640;
rect_negneg.y1 = 240;
rect_negneg.x2 = 320;
@@ -14410,13 +14427,21 @@ static void test_clear(void)
ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
color = get_surface_color(rt, 160, 360);
- ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 3 (pos, neg) has color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_warp(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 160, 120);
- ok(compare_color(color, 0x00ff0000, 0), "Clear rectangle 1 (pos, pos) has color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_warp(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 480, 360);
- ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (NULL) has color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_warp(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 480, 120);
- ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (neg, neg) has color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_warp(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "Got unexpected color 0x%08x.\n", color);
/* Test how the viewport affects clears. */
hr = IDirect3DViewport3_Clear2(viewport, 1, &rect_full, D3DCLEAR_TARGET, 0xffffffff, 0.0f, 0);
@@ -14524,6 +14549,8 @@ static void test_clear(void)
IDirect3DViewport3_Release(viewport2);
IDirect3DViewport3_Release(viewport);
IDirectDrawSurface4_Release(rt);
+ IDirectDraw4_Release(ddraw);
+ IDirect3D3_Release(d3d);
refcount = IDirect3DDevice3_Release(device);
ok(!refcount, "Device has %u references left.\n", refcount);
DestroyWindow(window);
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 5b29f9cd13e..cebe0ecbf50 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -13728,7 +13728,9 @@ static void test_clear(void)
IDirect3DDevice7 *device;
IDirectDrawSurface7 *rt;
D3DVIEWPORT7 vp, old_vp;
+ IDirectDraw7 *ddraw;
D3DRECT rect_negneg;
+ IDirect3D7 *d3d;
D3DRECT rect[2];
D3DCOLOR color;
ULONG refcount;
@@ -13743,6 +13745,11 @@ static void test_clear(void)
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);
+
hr = IDirect3DDevice7_GetRenderTarget(device, &rt);
ok(SUCCEEDED(hr), "Failed to get render target, hr %#x.\n", hr);
@@ -13766,9 +13773,19 @@ static void test_clear(void)
hr = IDirect3DDevice7_Clear(device, 2, rect, D3DCLEAR_TARGET, 0xffff0000, 0.0f, 0);
ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+ color = get_surface_color(rt, 160, 360);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 3 (pos, neg) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 160, 120);
+ ok(compare_color(color, 0x00ff0000, 0), "Clear rectangle 1 (pos, pos) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 480, 360);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (NULL) has color 0x%08x.\n", color);
+ color = get_surface_color(rt, 480, 120);
+ ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (neg, neg) has color 0x%08x.\n", color);
+
+ hr = IDirect3DDevice7_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
/* negative x, negative y.
- *
- * FIXME: WARP seems to clear the entire screen here. */
+ * Also ignored, except on WARP, which clears the entire screen. */
rect_negneg.x1 = 640;
rect_negneg.y1 = 240;
rect_negneg.x2 = 320;
@@ -13777,13 +13794,21 @@ static void test_clear(void)
ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
color = get_surface_color(rt, 160, 360);
- ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 3 (pos, neg) has color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_warp(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 160, 120);
- ok(compare_color(color, 0x00ff0000, 0), "Clear rectangle 1 (pos, pos) has color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_warp(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 480, 360);
- ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (NULL) has color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_warp(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "Got unexpected color 0x%08x.\n", color);
color = get_surface_color(rt, 480, 120);
- ok(compare_color(color, 0x00ffffff, 0), "Clear rectangle 4 (neg, neg) has color 0x%08x.\n", color);
+ ok(compare_color(color, 0x00ffffff, 0)
+ || broken(ddraw_is_warp(ddraw) && compare_color(color, 0x0000ff00, 0)),
+ "Got unexpected color 0x%08x.\n", color);
/* Test how the viewport affects clears. */
hr = IDirect3DDevice7_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0f, 0);
@@ -13852,6 +13877,8 @@ static void test_clear(void)
* in d3d7. */
IDirectDrawSurface7_Release(rt);
+ IDirectDraw7_Release(ddraw);
+ IDirect3D7_Release(d3d);
refcount = IDirect3DDevice7_Release(device);
ok(!refcount, "Device has %u references left.\n", refcount);
DestroyWindow(window);
--
2.11.0
1
0
[PATCH] msvcrt: Don't include MSVC 7.0+ exception functions in SOs for older DLLs
by Alex Henrie 10 Jan '18
by Alex Henrie 10 Jan '18
10 Jan '18
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/msvcrt/except.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/dlls/msvcrt/except.c b/dlls/msvcrt/except.c
index 8d13e7fbef..13698f8364 100644
--- a/dlls/msvcrt/except.c
+++ b/dlls/msvcrt/except.c
@@ -41,7 +41,9 @@
WINE_DEFAULT_DEBUG_CHANNEL(seh);
+#if _MSVCR_VER>=70 && _MSVCR_VER<=71
static MSVCRT_security_error_handler security_error_handler;
+#endif
static MSVCRT___sighandler_t sighandlers[MSVCRT_NSIG] = { MSVCRT_SIG_DFL };
@@ -294,6 +296,8 @@ BOOL CDECL MSVCRT___uncaught_exception(void)
return FALSE;
}
+#if _MSVCR_VER>=70 && _MSVCR_VER<=71
+
/*********************************************************************
* _set_security_error_handler (MSVCR70.@)
*/
@@ -321,6 +325,8 @@ void CDECL __security_error_handler(int code, void *data)
MSVCRT__exit(3);
}
+#endif /* _MSVCR_VER>=70 && _MSVCR_VER<=71 */
+
#if _MSVCR_VER>=110
/*********************************************************************
* __crtSetUnhandledExceptionFilter (MSVCR110.@)
@@ -470,8 +476,10 @@ struct __std_exception_data {
MSVCRT_bool dofree;
};
+#if _MSVCR_VER>=140
+
/*********************************************************************
- * __std_exception_copy (MSVCRT.@)
+ * __std_exception_copy (UCRTBASE.@)
*/
void CDECL MSVCRT___std_exception_copy(const struct __std_exception_data *src,
struct __std_exception_data *dst)
@@ -488,7 +496,7 @@ void CDECL MSVCRT___std_exception_copy(const struct __std_exception_data *src,
}
/*********************************************************************
- * __std_exception_destroy (MSVCRT.@)
+ * __std_exception_destroy (UCRTBASE.@)
*/
void CDECL MSVCRT___std_exception_destroy(struct __std_exception_data *data)
{
@@ -499,3 +507,5 @@ void CDECL MSVCRT___std_exception_destroy(struct __std_exception_data *data)
data->what = NULL;
data->dofree = 0;
}
+
+#endif /* _MSVCR_VER>=140 */
--
2.15.1
2
10
10 Jan '18
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
Coverity was complaining about one of them. The most straightforward
solution is to remove them all.
dlls/kernel32/tests/module.c | 162 +++++++++++++++----------------------------
1 file changed, 54 insertions(+), 108 deletions(-)
diff --git a/dlls/kernel32/tests/module.c b/dlls/kernel32/tests/module.c
index d3b9c92086..0b4ce14c46 100644
--- a/dlls/kernel32/tests/module.c
+++ b/dlls/kernel32/tests/module.c
@@ -29,8 +29,6 @@ static BOOL (WINAPI *pSetDllDirectoryA)(LPCSTR);
static DLL_DIRECTORY_COOKIE (WINAPI *pAddDllDirectory)(const WCHAR*);
static BOOL (WINAPI *pRemoveDllDirectory)(DLL_DIRECTORY_COOKIE);
static BOOL (WINAPI *pSetDefaultDllDirectories)(DWORD);
-static BOOL (WINAPI *pGetModuleHandleExA)(DWORD,LPCSTR,HMODULE*);
-static BOOL (WINAPI *pGetModuleHandleExW)(DWORD,LPCWSTR,HMODULE*);
static BOOL (WINAPI *pK32GetModuleInformation)(HANDLE process, HMODULE module,
MODULEINFO *modinfo, DWORD cb);
@@ -180,8 +178,7 @@ static void testGetModuleFileName(const char* name)
ok(len1W / 2 == len2W, "Correct length in GetModuleFilenameW with buffer too small (%d/%d)\n", len1W / 2, len2W);
}
- ok(len1A / 2 == len2A ||
- len1A / 2 == len2A + 1, /* Win9x */
+ ok(len1A / 2 == len2A,
"Correct length in GetModuleFilenameA with buffer too small (%d/%d)\n", len1A / 2, len2A);
}
@@ -200,9 +197,7 @@ static void testGetModuleFileName_Wrong(void)
bufA[0] = '*';
ok(GetModuleFileNameA((void*)0xffffffff, bufA, sizeof(bufA)) == 0, "Unexpected success in module handle\n");
- ok(bufA[0] == '*' ||
- bufA[0] == 0 /* Win9x */,
- "When failing, buffer shouldn't be written to\n");
+ ok(bufA[0] == '*', "When failing, buffer shouldn't be written to\n");
}
static void testLoadLibraryA(void)
@@ -221,14 +216,10 @@ static void testLoadLibraryA(void)
SetLastError(0xdeadbeef);
hModule1 = LoadLibraryA("kernel32 ");
- /* Only winNT does this */
- if (GetLastError() != ERROR_DLL_NOT_FOUND)
- {
- ok( hModule1 != NULL, "\"kernel32 \" should be loadable\n");
- ok( GetLastError() == 0xdeadbeef, "GetLastError should be 0xdeadbeef but is %d\n", GetLastError());
- ok( hModule == hModule1, "Loaded wrong module\n");
- FreeLibrary(hModule1);
- }
+ ok( hModule1 != NULL, "\"kernel32 \" should be loadable\n" );
+ ok( GetLastError() == 0xdeadbeef, "GetLastError should be 0xdeadbeef but is %d\n", GetLastError() );
+ ok( hModule == hModule1, "Loaded wrong module\n" );
+ FreeLibrary(hModule1);
FreeLibrary(hModule);
}
@@ -253,7 +244,7 @@ static void testNestedLoadLibraryA(void)
hModule1 = LoadLibraryA(path1);
if (!hModule1)
{
- /* We must be on Windows NT, so we cannot test */
+ /* We must be on Windows, so we cannot test */
return;
}
@@ -261,12 +252,7 @@ static void testNestedLoadLibraryA(void)
strcat(path2, "\\system32\\");
strcat(path2, dllname);
hModule2 = LoadLibraryA(path2);
- if (!hModule2)
- {
- /* We must be on Windows 9x, so we cannot test */
- ok(FreeLibrary(hModule1), "FreeLibrary() failed\n");
- return;
- }
+ ok(hModule2 != NULL, "LoadLibrary(%s) failed\n", path2);
/* The first LoadLibrary() call may have registered the dll under the
* system32 path. So load it, again, under the '...\system\...' path so
@@ -296,8 +282,7 @@ static void testLoadLibraryA_Wrong(void)
SetLastError(0xdeadbeef);
hModule = LoadLibraryA("non_ex_pv.dll");
ok( !hModule, "non_ex_pv.dll should be not loadable\n");
- ok( GetLastError() == ERROR_MOD_NOT_FOUND || GetLastError() == ERROR_DLL_NOT_FOUND,
- "Expected ERROR_MOD_NOT_FOUND or ERROR_DLL_NOT_FOUND (win9x), got %d\n", GetLastError());
+ ok( GetLastError() == ERROR_MOD_NOT_FOUND, "Expected ERROR_MOD_NOT_FOUND, got %d\n", GetLastError() );
/* Just in case */
FreeLibrary(hModule);
@@ -310,14 +295,12 @@ static void testGetProcAddress_Wrong(void)
SetLastError(0xdeadbeef);
fp = GetProcAddress(NULL, "non_ex_call");
ok( !fp, "non_ex_call should not be found\n");
- ok( GetLastError() == ERROR_PROC_NOT_FOUND || GetLastError() == ERROR_INVALID_HANDLE,
- "Expected ERROR_PROC_NOT_FOUND or ERROR_INVALID_HANDLE(win9x), got %d\n", GetLastError());
+ ok( GetLastError() == ERROR_PROC_NOT_FOUND, "Expected ERROR_PROC_NOT_FOUND, got %d\n", GetLastError() );
SetLastError(0xdeadbeef);
fp = GetProcAddress((HMODULE)0xdeadbeef, "non_ex_call");
ok( !fp, "non_ex_call should not be found\n");
- ok( GetLastError() == ERROR_MOD_NOT_FOUND || GetLastError() == ERROR_INVALID_HANDLE,
- "Expected ERROR_MOD_NOT_FOUND or ERROR_INVALID_HANDLE(win9x), got %d\n", GetLastError());
+ ok( GetLastError() == ERROR_MOD_NOT_FOUND, "Expected ERROR_MOD_NOT_FOUND, got %d\n", GetLastError() );
}
static void testLoadLibraryEx(void)
@@ -333,28 +316,20 @@ static void testLoadLibraryEx(void)
ok(hfile != INVALID_HANDLE_VALUE, "Expected a valid file handle\n");
/* NULL lpFileName */
- if (is_unicode_enabled)
- {
- SetLastError(0xdeadbeef);
- hmodule = LoadLibraryExA(NULL, NULL, 0);
- ok(hmodule == 0, "Expected 0, got %p\n", hmodule);
- ok(GetLastError() == ERROR_MOD_NOT_FOUND ||
- GetLastError() == ERROR_INVALID_PARAMETER, /* win9x */
- "Expected ERROR_MOD_NOT_FOUND or ERROR_INVALID_PARAMETER, got %d\n",
- GetLastError());
- }
- else
- win_skip("NULL filename crashes on WinMe\n");
+ SetLastError(0xdeadbeef);
+ hmodule = LoadLibraryExA(NULL, NULL, 0);
+ ok(hmodule == 0, "Expected 0, got %p\n", hmodule);
+ ok(GetLastError() == ERROR_MOD_NOT_FOUND ||
+ GetLastError() == ERROR_INVALID_PARAMETER,
+ "Expected ERROR_MOD_NOT_FOUND or ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
/* empty lpFileName */
SetLastError(0xdeadbeef);
hmodule = LoadLibraryExA("", NULL, 0);
ok(hmodule == 0, "Expected 0, got %p\n", hmodule);
ok(GetLastError() == ERROR_MOD_NOT_FOUND ||
- GetLastError() == ERROR_DLL_NOT_FOUND /* win9x */ ||
GetLastError() == ERROR_INVALID_PARAMETER /* win8 */,
- "Expected ERROR_MOD_NOT_FOUND or ERROR_DLL_NOT_FOUND, got %d\n",
- GetLastError());
+ "Expected ERROR_MOD_NOT_FOUND or ERROR_DLL_NOT_FOUND, got %d\n", GetLastError());
/* hFile is non-NULL */
SetLastError(0xdeadbeef);
@@ -363,8 +338,7 @@ static void testLoadLibraryEx(void)
todo_wine
{
ok(GetLastError() == ERROR_SHARING_VIOLATION ||
- GetLastError() == ERROR_INVALID_PARAMETER || /* win2k3 */
- GetLastError() == ERROR_FILE_NOT_FOUND, /* win9x */
+ GetLastError() == ERROR_INVALID_PARAMETER, /* win2k3 */
"Unexpected last error, got %d\n", GetLastError());
}
@@ -374,8 +348,7 @@ static void testLoadLibraryEx(void)
todo_wine
{
ok(GetLastError() == ERROR_SHARING_VIOLATION ||
- GetLastError() == ERROR_INVALID_PARAMETER || /* win2k3 */
- GetLastError() == ERROR_FILE_NOT_FOUND, /* win9x */
+ GetLastError() == ERROR_INVALID_PARAMETER, /* win2k3 */
"Unexpected last error, got %d\n", GetLastError());
}
@@ -385,10 +358,8 @@ static void testLoadLibraryEx(void)
ok(hmodule == 0, "Expected 0, got %p\n", hmodule);
todo_wine
{
- ok(GetLastError() == ERROR_SHARING_VIOLATION ||
- GetLastError() == ERROR_FILE_NOT_FOUND, /* win9x */
- "Expected ERROR_SHARING_VIOLATION or ERROR_FILE_NOT_FOUND, got %d\n",
- GetLastError());
+ ok(GetLastError() == ERROR_SHARING_VIOLATION,
+ "Expected ERROR_SHARING_VIOLATION, got %d\n", GetLastError());
}
/* lpFileName does not matter */
@@ -399,8 +370,7 @@ static void testLoadLibraryEx(void)
ok(hmodule == 0, "Expected 0, got %p\n", hmodule);
ok(GetLastError() == ERROR_MOD_NOT_FOUND ||
GetLastError() == ERROR_INVALID_PARAMETER, /* win2k3 */
- "Expected ERROR_MOD_NOT_FOUND or ERROR_INVALID_PARAMETER, got %d\n",
- GetLastError());
+ "Expected ERROR_MOD_NOT_FOUND or ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
}
CloseHandle(hfile);
@@ -411,10 +381,8 @@ static void testLoadLibraryEx(void)
ok(hmodule == 0, "Expected 0, got %p\n", hmodule);
todo_wine
{
- ok(GetLastError() == ERROR_FILE_INVALID ||
- GetLastError() == ERROR_BAD_FORMAT, /* win9x */
- "Expected ERROR_FILE_INVALID or ERROR_BAD_FORMAT, got %d\n",
- GetLastError());
+ ok(GetLastError() == ERROR_FILE_INVALID,
+ "Expected ERROR_FILE_INVALID, got %d\n", GetLastError());
}
DeleteFileA("testfile.dll");
@@ -429,7 +397,7 @@ static void testLoadLibraryEx(void)
hmodule = LoadLibraryExA(path, NULL, LOAD_LIBRARY_AS_DATAFILE);
ok(hmodule != 0, "Expected valid module handle\n");
ok(GetLastError() == 0xdeadbeef ||
- GetLastError() == ERROR_SUCCESS, /* win9x */
+ GetLastError() == ERROR_SUCCESS,
"Expected 0xdeadbeef or ERROR_SUCCESS, got %d\n", GetLastError());
/* try invalid file handle */
@@ -444,9 +412,7 @@ static void testLoadLibraryEx(void)
SetLastError(0xdeadbeef);
hmodule = LoadLibraryExA("kernel32.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
ok(hmodule != 0, "Expected valid module handle\n");
- ok(GetLastError() == 0xdeadbeef ||
- GetLastError() == ERROR_SUCCESS, /* win9x */
- "Expected 0xdeadbeef or ERROR_SUCCESS, got %d\n", GetLastError());
+ ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError());
FreeLibrary(hmodule);
@@ -462,8 +428,7 @@ static void testLoadLibraryEx(void)
{
ok(hmodule == 0, "Expected 0, got %p\n", hmodule);
}
- ok(GetLastError() == ERROR_FILE_NOT_FOUND ||
- broken(GetLastError() == ERROR_INVALID_HANDLE), /* nt4 */
+ ok(GetLastError() == ERROR_FILE_NOT_FOUND,
"Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
/* Free the loaded dll when it's the first time this dll is loaded
@@ -731,22 +696,15 @@ static void init_pointers(void)
MAKEFUNC(AddDllDirectory);
MAKEFUNC(RemoveDllDirectory);
MAKEFUNC(SetDefaultDllDirectories);
- MAKEFUNC(GetModuleHandleExA);
- MAKEFUNC(GetModuleHandleExW);
MAKEFUNC(K32GetModuleInformation);
#undef MAKEFUNC
- /* not all Windows versions export this in kernel32 */
+ /* before Windows 7 this was not exported in kernel32 */
if (!pK32GetModuleInformation)
{
HMODULE hPsapi = LoadLibraryA("psapi.dll");
- if (hPsapi)
- {
- pK32GetModuleInformation = (void *)GetProcAddress(hPsapi, "GetModuleInformation");
- if (!pK32GetModuleInformation) FreeLibrary(hPsapi);
- }
+ pK32GetModuleInformation = (void *)GetProcAddress(hPsapi, "GetModuleInformation");
}
-
}
static void testGetModuleHandleEx(void)
@@ -757,113 +715,107 @@ static void testGetModuleHandleEx(void)
DWORD error;
HMODULE mod, mod_kernel32;
- if (!pGetModuleHandleExA || !pGetModuleHandleExW)
- {
- win_skip( "GetModuleHandleEx not available\n" );
- return;
- }
-
SetLastError( 0xdeadbeef );
- ret = pGetModuleHandleExA( 0, NULL, NULL );
+ ret = GetModuleHandleExA( 0, NULL, NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
SetLastError( 0xdeadbeef );
- ret = pGetModuleHandleExA( 0, "kernel32", NULL );
+ ret = GetModuleHandleExA( 0, "kernel32", NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
SetLastError( 0xdeadbeef );
mod = (HMODULE)0xdeadbeef;
- ret = pGetModuleHandleExA( 0, "kernel32", &mod );
+ ret = GetModuleHandleExA( 0, "kernel32", &mod );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( mod != (HMODULE)0xdeadbeef, "got %p\n", mod );
FreeLibrary( mod );
SetLastError( 0xdeadbeef );
mod = (HMODULE)0xdeadbeef;
- ret = pGetModuleHandleExA( 0, "nosuchmod", &mod );
+ ret = GetModuleHandleExA( 0, "nosuchmod", &mod );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_MOD_NOT_FOUND, "got %u\n", error );
ok( mod == NULL, "got %p\n", mod );
SetLastError( 0xdeadbeef );
- ret = pGetModuleHandleExW( 0, NULL, NULL );
+ ret = GetModuleHandleExW( 0, NULL, NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
SetLastError( 0xdeadbeef );
- ret = pGetModuleHandleExW( 0, kernel32W, NULL );
+ ret = GetModuleHandleExW( 0, kernel32W, NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
SetLastError( 0xdeadbeef );
mod = (HMODULE)0xdeadbeef;
- ret = pGetModuleHandleExW( 0, kernel32W, &mod );
+ ret = GetModuleHandleExW( 0, kernel32W, &mod );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( mod != (HMODULE)0xdeadbeef, "got %p\n", mod );
FreeLibrary( mod );
SetLastError( 0xdeadbeef );
mod = (HMODULE)0xdeadbeef;
- ret = pGetModuleHandleExW( 0, nosuchmodW, &mod );
+ ret = GetModuleHandleExW( 0, nosuchmodW, &mod );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_MOD_NOT_FOUND, "got %u\n", error );
ok( mod == NULL, "got %p\n", mod );
SetLastError( 0xdeadbeef );
- ret = pGetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, NULL, NULL );
+ ret = GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, NULL, NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
SetLastError( 0xdeadbeef );
- ret = pGetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, "kernel32", NULL );
+ ret = GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, "kernel32", NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
SetLastError( 0xdeadbeef );
mod = (HMODULE)0xdeadbeef;
- ret = pGetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, "kernel32", &mod );
+ ret = GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, "kernel32", &mod );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( mod != (HMODULE)0xdeadbeef, "got %p\n", mod );
SetLastError( 0xdeadbeef );
mod = (HMODULE)0xdeadbeef;
- ret = pGetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, "nosuchmod", &mod );
+ ret = GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, "nosuchmod", &mod );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_MOD_NOT_FOUND, "got %u\n", error );
ok( mod == NULL, "got %p\n", mod );
SetLastError( 0xdeadbeef );
- ret = pGetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, NULL, NULL );
+ ret = GetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, NULL, NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
SetLastError( 0xdeadbeef );
- ret = pGetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, kernel32W, NULL );
+ ret = GetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, kernel32W, NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
SetLastError( 0xdeadbeef );
mod = (HMODULE)0xdeadbeef;
- ret = pGetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, kernel32W, &mod );
+ ret = GetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, kernel32W, &mod );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( mod != (HMODULE)0xdeadbeef, "got %p\n", mod );
SetLastError( 0xdeadbeef );
mod = (HMODULE)0xdeadbeef;
- ret = pGetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, nosuchmodW, &mod );
+ ret = GetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, nosuchmodW, &mod );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_MOD_NOT_FOUND, "got %u\n", error );
@@ -872,54 +824,54 @@ static void testGetModuleHandleEx(void)
mod_kernel32 = LoadLibraryA( "kernel32" );
SetLastError( 0xdeadbeef );
- ret = pGetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, NULL, NULL );
+ ret = GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, NULL, NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
SetLastError( 0xdeadbeef );
- ret = pGetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCSTR)mod_kernel32, NULL );
+ ret = GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCSTR)mod_kernel32, NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
SetLastError( 0xdeadbeef );
mod = (HMODULE)0xdeadbeef;
- ret = pGetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCSTR)mod_kernel32, &mod );
+ ret = GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCSTR)mod_kernel32, &mod );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( mod == mod_kernel32, "got %p\n", mod );
FreeLibrary( mod );
SetLastError( 0xdeadbeef );
mod = (HMODULE)0xdeadbeef;
- ret = pGetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCSTR)0xbeefdead, &mod );
+ ret = GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCSTR)0xbeefdead, &mod );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_MOD_NOT_FOUND, "got %u\n", error );
ok( mod == NULL, "got %p\n", mod );
SetLastError( 0xdeadbeef );
- ret = pGetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, NULL, NULL );
+ ret = GetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, NULL, NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
SetLastError( 0xdeadbeef );
- ret = pGetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)mod_kernel32, NULL );
+ ret = GetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)mod_kernel32, NULL );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error );
SetLastError( 0xdeadbeef );
mod = (HMODULE)0xdeadbeef;
- ret = pGetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)mod_kernel32, &mod );
+ ret = GetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)mod_kernel32, &mod );
ok( ret, "unexpected failure %u\n", GetLastError() );
ok( mod == mod_kernel32, "got %p\n", mod );
FreeLibrary( mod );
SetLastError( 0xdeadbeef );
mod = (HMODULE)0xdeadbeef;
- ret = pGetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)0xbeefdead, &mod );
+ ret = GetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)0xbeefdead, &mod );
error = GetLastError();
ok( !ret, "unexpected success\n" );
ok( error == ERROR_MOD_NOT_FOUND, "got %u\n", error );
@@ -934,12 +886,6 @@ static void testK32GetModuleInformation(void)
HMODULE mod;
BOOL ret;
- if (!pK32GetModuleInformation)
- {
- win_skip("K32GetModuleInformation not available\n");
- return;
- }
-
mod = GetModuleHandleA(NULL);
memset(&info, 0xAA, sizeof(info));
ret = pK32GetModuleInformation(GetCurrentProcess(), mod, &info, sizeof(info));
--
2.15.1
2
2
[PATCH 1/2] msxml3/tests: Add missing return value checks to domdoc tests (Coverity)
by Alex Henrie 10 Jan '18
by Alex Henrie 10 Jan '18
10 Jan '18
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
The other Coverity warning was a false positive; lstrcmp definitely does
a NULL check on both of its arguments.
dlls/msxml3/tests/domdoc.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index c1b434bc5f..620f72c1bb 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -6460,7 +6460,8 @@ static void test_save(void)
hr = IXMLDOMDocument_loadXML(doc, _bstr_(win1252xml), &b);
EXPECT_HR(hr, S_OK);
- CreateStreamOnHGlobal(NULL, TRUE, &stream);
+ hr = CreateStreamOnHGlobal(NULL, TRUE, &stream);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
V_VT(&dest) = VT_UNKNOWN;
V_UNKNOWN(&dest) = (IUnknown*)stream;
hr = IXMLDOMDocument_save(doc, dest);
@@ -10950,7 +10951,8 @@ static void test_dispex(void)
/* IXMLDOMNodeList */
hr = IXMLDOMDocument_getElementsByTagName(doc, _bstr_("*"), &node_list);
EXPECT_HR(hr, S_OK);
- IXMLDOMNodeList_QueryInterface(node_list, &IID_IUnknown, (void**)&unk);
+ hr = IXMLDOMNodeList_QueryInterface(node_list, &IID_IUnknown, (void**)&unk);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
test_domobj_dispex(unk);
IUnknown_Release(unk);
IXMLDOMNodeList_Release(node_list);
--
2.15.1
2
3
[PATCH] concrt140: Fix Concurrency::is_current_task_group_canceling spec entry
by Piotr Caban 10 Jan '18
by Piotr Caban 10 Jan '18
10 Jan '18
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/concrt140/concrt140.spec | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
1
0