Wine-Devel
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
June 2019
- 73 participants
- 565 discussions
[PATCH v2 1/2] ucrtbase/tests: Add some tests for __stdio_common_vsscanf().
by Zebediah Figura June 11, 2019
by Zebediah Figura June 11, 2019
June 11, 2019
Based on msvcrt:scanf tests.
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/ucrtbase/tests/Makefile.in | 1 +
dlls/ucrtbase/tests/scanf.c | 276 ++++++++++++++++++++++++++++++++
2 files changed, 277 insertions(+)
create mode 100644 dlls/ucrtbase/tests/scanf.c
diff --git a/dlls/ucrtbase/tests/Makefile.in b/dlls/ucrtbase/tests/Makefile.in
index 3fd4b1c7d389..116bdcc7b653 100644
--- a/dlls/ucrtbase/tests/Makefile.in
+++ b/dlls/ucrtbase/tests/Makefile.in
@@ -4,4 +4,5 @@ C_SRCS = \
cpp.c \
misc.c \
printf.c \
+ scanf.c \
string.c
diff --git a/dlls/ucrtbase/tests/scanf.c b/dlls/ucrtbase/tests/scanf.c
new file mode 100644
index 000000000000..7f44b7f1adf3
--- /dev/null
+++ b/dlls/ucrtbase/tests/scanf.c
@@ -0,0 +1,276 @@
+/*
+ * Conformance tests for *scanf functions.
+ *
+ * Copyright 2002 Uwe Bonnes
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdio.h>
+#include <math.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winnls.h"
+
+#include "wine/test.h"
+
+static int (__cdecl *p_vsscanf)(unsigned __int64 options, const char *str, size_t len, const char *format,
+ void *locale, __ms_va_list valist);
+
+static BOOL init(void)
+{
+ HMODULE hmod = LoadLibraryA("ucrtbase.dll");
+
+ if (!hmod)
+ {
+ win_skip("ucrtbase.dll not installed\n");
+ return FALSE;
+ }
+
+ p_vsscanf = (void *)GetProcAddress(hmod, "__stdio_common_vsscanf");
+
+ return TRUE;
+}
+
+static int WINAPIV vsscanf_wrapper(unsigned __int64 options, const char *str, const char *format, ...)
+{
+ int ret;
+ __ms_va_list valist;
+ __ms_va_start(valist, format);
+ ret = p_vsscanf(options, str, -1, format, NULL, valist);
+ __ms_va_end(valist);
+ return ret;
+}
+
+#define UCRTBASE_SCANF_SECURECRT (0x0001)
+#define UCRTBASE_SCANF_LEGACY_WIDE_SPECIFIERS (0x0002)
+#define UCRTBASE_SCANF_LEGACY_MSVCRT_COMPATIBILITY (0x0004)
+
+static void test_sscanf(void)
+{
+ static const float float1 = -82.6267f, float2 = 27.76f;
+ char buffer[100], buffer1[100];
+ int result, ret, hour, min, count;
+ LONGLONG result64;
+ char c;
+ void *ptr;
+ float ret_float1, ret_float2;
+ double double_res;
+ unsigned int i;
+
+ static const unsigned int tests[] =
+ {
+ 0,
+ UCRTBASE_SCANF_LEGACY_WIDE_SPECIFIERS,
+ UCRTBASE_SCANF_LEGACY_MSVCRT_COMPATIBILITY,
+ };
+
+ for (i = 0; i < ARRAY_SIZE(tests); ++i)
+ {
+ ret = vsscanf_wrapper(tests[i], "", "%d", &result);
+ ok(ret == EOF, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "000000000046F170", "%p", &ptr);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(ptr == (void *)0x46f170, "sscanf reads %p for flags %#x\n", ptr, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "0046F171", "%p", &ptr);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(ptr == (void *)0x46f171, "sscanf reads %p for flags %#x\n", ptr, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "46F172", "%p", &ptr);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(ptr == (void *)0x46f172, "sscanf reads %p for flags %#x\n", ptr, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "0x46F173", "%p", &ptr);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ todo_wine ok(ptr == (void *)0x46f173, "sscanf reads %p for flags %#x\n", ptr, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "-46F174", "%p", &ptr);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(ptr == (void *)(ULONG_PTR)-0x46f174, "sscanf reads %p for flags %#x\n", ptr, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "+46F175", "%p", &ptr);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(ptr == (void *)0x46f175, "sscanf reads %p for flags %#x\n", ptr, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "1233", "%p", &ptr);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(ptr == (void *)0x1233, "sscanf reads %p for flags %#x\n", ptr, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "1234", "%P", &ptr);
+ todo_wine ok(ret == 0, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "0x519", "%x", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 0x519, "sscanf reads %#x for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "0x51a", "%x", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 0x51a, "sscanf reads %#x for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "0x51g", "%x", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 0x51, "sscanf reads %#x for flags %#x\n", result, tests[i]);
+
+ result = 0;
+ ret = vsscanf_wrapper(tests[i], "-1", "%x", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == -1, "sscanf reads %#x for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "\"%12@", "%\"%%%d%@", &result);
+ todo_wine ok(ret == 0, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+
+ sprintf(buffer, "%f %f", float1, float2);
+ ret = vsscanf_wrapper(tests[i], buffer, "%f%f", &ret_float1, &ret_float2);
+ ok(ret == 2, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(ret_float1 == float1, "got wrong float %.8e for flags %#x\n", ret_float1, tests[i]);
+ ok(ret_float2 == float2, "got wrong float %.8e for flags %#x\n", ret_float2, tests[i]);
+
+ sprintf(buffer, "%lf", 32.715);
+ ret = vsscanf_wrapper(tests[i], buffer, "%lf", &double_res);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(double_res == 32.715, "got wrong double %.16e for flags %#x\n", double_res, tests[i]);
+ ret = vsscanf_wrapper(tests[i], buffer, "%Lf", &double_res);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(double_res == 32.715, "got wrong double %.16e for flags %#x\n", double_res, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "1.1e-30", "%lf", &double_res);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(double_res == 1.1e-30, "got wrong double %.16e for flags %#x\n", double_res, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], " Waverly", "%*c%[^\n]", buffer);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(!strcmp(buffer, " Waverly"), "got string '%s' for flags %#x\n", buffer, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "abcefgdh", "%*[a-cg-e]%c", &buffer[0]);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(buffer[0] == 'd', "got char '%c' for flags %#x\n", buffer[0], tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "abcefgdh", "%*[a-cd-dg-e]%c", &buffer[0]);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(buffer[0] == 'h', "got char '%c' for flags %#x\n", buffer[0], tests[i]);
+
+ strcpy(buffer, "foo");
+ strcpy(buffer1, "bar");
+ ret = vsscanf_wrapper(tests[i], "a", "%s%s", buffer, buffer1);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(!strcmp(buffer, "a"), "got string '%s' for flags %#x\n", buffer, tests[i]);
+ ok(!strcmp(buffer1, "bar"), "got string '%s' for flags %#x\n", buffer1, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "21:59:20", "%d%n", &result, &count);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 21, "got wrong number %d for flags %#x\n", result, tests[i]);
+ ok(count == 2, "got wrong count %d for flags %#x\n", count, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], ":59:20", "%*c%n", &count);
+ ok(ret == 0, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(count == 1, "got wrong count %d for flags %#x\n", count, tests[i]);
+
+ result = 0xdeadbeef;
+ ret = vsscanf_wrapper(tests[i], "12345678", "%hd", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 0xdead614e, "got wrong number %#x for flags %#x\n", result, tests[i]);
+
+ result = 0xdeadbeef;
+ ret = vsscanf_wrapper(tests[i], "12345678", "%hhd", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ todo_wine ok(result == 0xdeadbe4e, "got wrong number %#x for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "12345678901234", "%lld", &result64);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result64 == 12345678901234, "got wrong number 0x%s for flags %#x\n",
+ wine_dbgstr_longlong(result64), tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "123", "%i", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 123, "got wrong number %d for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "-1", "%i", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == -1, "got wrong number %d for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "123", "%d", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 123, "got wrong number %d for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "-1", "%d", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == -1, "got wrong number %d for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "017", "%i", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 15, "got wrong number %d for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "0x17", "%i", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 23, "got wrong number %d for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "-1", "%o", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == -1, "got wrong number %d for flags %#x\n", result, tests[i]);
+
+ ret = 0xdeadbeef;
+ ret = vsscanf_wrapper(tests[i], "-1", "%u", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == -1, "got wrong number %d for flags %#x\n", result, tests[i]);
+
+ c = 0x55;
+ ret = vsscanf_wrapper(tests[i], "a", "%c", &c);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(c == 'a', "got wrong char '%c' for flags %#x\n", c, tests[i]);
+
+ c = 0x55;
+ ret = vsscanf_wrapper(tests[i], " a", "%c", &c);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(c == ' ', "got wrong char '%c' for flags %#x\n", c, tests[i]);
+
+ c = 0x55;
+ ret = vsscanf_wrapper(tests[i], "18:59", "%d:%d%c", &hour, &min, &c);
+ ok(ret == 2, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(hour == 18, "got wrong char '%c' for flags %#x\n", hour, tests[i]);
+ ok(min == 59, "got wrong char '%c' for flags %#x\n", min, tests[i]);
+ ok(c == 0x55, "got wrong char '%c' for flags %#x\n", c, tests[i]);
+
+ strcpy(buffer, "foo");
+ strcpy(buffer1, "bar");
+ ret = vsscanf_wrapper(tests[i], "abc def", "%s %n%s", buffer, &count, buffer1);
+ ok(ret == 2, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(!strcmp(buffer, "abc"), "got wrong string '%s' for flags %#x\n", buffer, tests[i]);
+ ok(count == 6, "got wrong count %d for flags %#x\n", count, tests[i]);
+ ok(!strcmp(buffer1, "def"), "got wrong string '%s' for flags %#x\n", buffer1, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "3:45", "%d:%d%n", &hour, &min, &count);
+ ok(ret == 2, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(hour == 3, "got wrong char '%c' for flags %#x\n", hour, tests[i]);
+ ok(min == 45, "got wrong char '%c' for flags %#x\n", min, tests[i]);
+ ok(count == 4, "got wrong count %d for flags %#x\n", count, tests[i]);
+
+ strcpy(buffer, "foo");
+ strcpy(buffer1, "bar");
+ ret = vsscanf_wrapper(tests[i], "test=value\xda", "%[^=] = %[^;]", buffer, buffer1);
+ ok(ret == 2, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(!strcmp(buffer, "test"), "got wrong string '%s' for flags %#x\n", buffer, tests[i]);
+ ok(!strcmp(buffer1, "value\xda"), "got wrong string '%s' for flags %#x\n", buffer1, tests[i]);
+ }
+}
+
+START_TEST(scanf)
+{
+ if (!init()) return;
+
+ test_sscanf();
+}
--
2.20.1
2
3
[PATCH v8 1/4] ntdll/tests: Move NtAllocateVirtualMemory tests that were in kernel32
by Rémi Bernon June 11, 2019
by Rémi Bernon June 11, 2019
June 11, 2019
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/kernel32/tests/virtual.c | 49 ---------------
dlls/ntdll/tests/Makefile.in | 3 +-
dlls/ntdll/tests/virtual.c | 113 ++++++++++++++++++++++++++++++++++
3 files changed, 115 insertions(+), 50 deletions(-)
create mode 100644 dlls/ntdll/tests/virtual.c
diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
index d797df26f6c..0b718606d0e 100644
--- a/dlls/kernel32/tests/virtual.c
+++ b/dlls/kernel32/tests/virtual.c
@@ -52,8 +52,6 @@ static ULONG (WINAPI *pRtlRemoveVectoredExceptionHandler)(PVOID);
static BOOL (WINAPI *pGetProcessDEPPolicy)(HANDLE, LPDWORD, PBOOL);
static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
static NTSTATUS (WINAPI *pNtProtectVirtualMemory)(HANDLE, PVOID *, SIZE_T *, ULONG, ULONG *);
-static NTSTATUS (WINAPI *pNtAllocateVirtualMemory)(HANDLE, PVOID *, ULONG, SIZE_T *, ULONG, ULONG);
-static NTSTATUS (WINAPI *pNtFreeVirtualMemory)(HANDLE, PVOID *, SIZE_T *, ULONG);
/* ############################### */
@@ -230,8 +228,6 @@ static void test_VirtualAlloc(void)
void *addr1, *addr2;
DWORD old_prot;
MEMORY_BASIC_INFORMATION info;
- NTSTATUS status;
- SIZE_T size;
SetLastError(0xdeadbeef);
addr1 = VirtualAlloc(0, 0, MEM_RESERVE, PAGE_NOACCESS);
@@ -440,55 +436,12 @@ static void test_VirtualAlloc(void)
addr2 = VirtualAlloc(addr1, 0x1000, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
ok(addr2 == addr1, "VirtualAlloc returned %p, expected %p\n", addr2, addr1);
- /* allocation conflicts because of 64k align */
- size = 0x1000;
- addr2 = (char *)addr1 + 0x1000;
- status = pNtAllocateVirtualMemory(GetCurrentProcess(), &addr2, 0, &size,
- MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- ok(status == STATUS_CONFLICTING_ADDRESSES, "NtAllocateVirtualMemory returned %08x\n", status);
-
- /* it should conflict, even when zero_bits is explicitly set */
- size = 0x1000;
- addr2 = (char *)addr1 + 0x1000;
- status = pNtAllocateVirtualMemory(GetCurrentProcess(), &addr2, 12, &size,
- MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- todo_wine
- ok(status == STATUS_CONFLICTING_ADDRESSES, "NtAllocateVirtualMemory returned %08x\n", status);
- if (status == STATUS_SUCCESS) ok(VirtualFree(addr2, 0, MEM_RELEASE), "VirtualFree failed\n");
-
- /* 21 zero bits never succeeds */
- size = 0x1000;
- addr2 = NULL;
- status = pNtAllocateVirtualMemory(GetCurrentProcess(), &addr2, 21, &size,
- MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- todo_wine
- ok(status == STATUS_NO_MEMORY || status == STATUS_INVALID_PARAMETER,
- "NtAllocateVirtualMemory returned %08x\n", status);
- if (status == STATUS_SUCCESS) ok(VirtualFree(addr2, 0, MEM_RELEASE), "VirtualFree failed\n");
-
- /* 22 zero bits is invalid */
- size = 0x1000;
- addr2 = NULL;
- status = pNtAllocateVirtualMemory(GetCurrentProcess(), &addr2, 22, &size,
- MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- ok(status == STATUS_INVALID_PARAMETER_3 || status == STATUS_INVALID_PARAMETER,
- "NtAllocateVirtualMemory returned %08x\n", status);
- if (status == STATUS_SUCCESS) ok(VirtualFree(addr2, 0, MEM_RELEASE), "VirtualFree failed\n");
-
/* AT_ROUND_TO_PAGE flag is not supported for VirtualAlloc */
SetLastError(0xdeadbeef);
addr2 = VirtualAlloc(addr1, 0x1000, MEM_RESERVE | MEM_COMMIT | AT_ROUND_TO_PAGE, PAGE_EXECUTE_READWRITE);
ok(!addr2, "VirtualAlloc unexpectedly succeeded\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %d, expected ERROR_INVALID_PARAMETER\n", GetLastError());
- /* AT_ROUND_TO_PAGE flag is not supported for NtAllocateVirtualMemory */
- size = 0x1000;
- addr2 = (char *)addr1 + 0x1000;
- status = pNtAllocateVirtualMemory(GetCurrentProcess(), &addr2, 0, &size, MEM_RESERVE |
- MEM_COMMIT | AT_ROUND_TO_PAGE, PAGE_EXECUTE_READWRITE);
- ok(status == STATUS_INVALID_PARAMETER_5 || status == STATUS_INVALID_PARAMETER,
- "NtAllocateVirtualMemory returned %08x\n", status);
-
ok(VirtualFree(addr1, 0, MEM_RELEASE), "VirtualFree failed\n");
}
@@ -4438,8 +4391,6 @@ START_TEST(virtual)
pRtlAddVectoredExceptionHandler = (void *)GetProcAddress( hntdll, "RtlAddVectoredExceptionHandler" );
pRtlRemoveVectoredExceptionHandler = (void *)GetProcAddress( hntdll, "RtlRemoveVectoredExceptionHandler" );
pNtProtectVirtualMemory = (void *)GetProcAddress( hntdll, "NtProtectVirtualMemory" );
- pNtAllocateVirtualMemory = (void *)GetProcAddress( hntdll, "NtAllocateVirtualMemory" );
- pNtFreeVirtualMemory = (void *)GetProcAddress( hntdll, "NtFreeVirtualMemory" );
GetSystemInfo(&si);
trace("system page size %#x\n", si.dwPageSize);
diff --git a/dlls/ntdll/tests/Makefile.in b/dlls/ntdll/tests/Makefile.in
index 5c70f3f01a0..ed15c51339f 100644
--- a/dlls/ntdll/tests/Makefile.in
+++ b/dlls/ntdll/tests/Makefile.in
@@ -22,4 +22,5 @@ C_SRCS = \
rtlstr.c \
string.c \
threadpool.c \
- time.c
+ time.c \
+ virtual.c
diff --git a/dlls/ntdll/tests/virtual.c b/dlls/ntdll/tests/virtual.c
new file mode 100644
index 00000000000..21dd57e8de5
--- /dev/null
+++ b/dlls/ntdll/tests/virtual.c
@@ -0,0 +1,113 @@
+/*
+ * Unit test suite for Virtual* family of APIs.
+ *
+ * Copyright 2019 Remi Bernon for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdio.h>
+
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
+#include "windef.h"
+#include "winternl.h"
+#include "wine/test.h"
+
+static void test_AllocateVirtualMemory(void)
+{
+ void *addr1, *addr2;
+ NTSTATUS status;
+ SIZE_T size;
+
+ /* simple allocation should success */
+ size = 0x1000;
+ addr1 = NULL;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr1, 0, &size,
+ MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+ ok(status == STATUS_SUCCESS, "NtAllocateVirtualMemory returned %08x\n", status);
+
+ /* allocation conflicts because of 64k align */
+ size = 0x1000;
+ addr2 = (char *)addr1 + 0x1000;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, 0, &size,
+ MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+ ok(status == STATUS_CONFLICTING_ADDRESSES, "NtAllocateVirtualMemory returned %08x\n", status);
+
+ /* it should conflict, even when zero_bits is explicitly set */
+ size = 0x1000;
+ addr2 = (char *)addr1 + 0x1000;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, 12, &size,
+ MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+ todo_wine
+ ok(status == STATUS_CONFLICTING_ADDRESSES, "NtAllocateVirtualMemory returned %08x\n", status);
+ if (status == STATUS_SUCCESS)
+ {
+ size = 0;
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr2, &size, MEM_RELEASE);
+ ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory return %08x, addr2: %p\n", status, addr2);
+ }
+
+ /* 21 zero bits never succeeds */
+ size = 0x1000;
+ addr2 = NULL;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, 21, &size,
+ MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+ todo_wine
+ ok(status == STATUS_NO_MEMORY || status == STATUS_INVALID_PARAMETER,
+ "NtAllocateVirtualMemory returned %08x\n", status);
+ if (status == STATUS_SUCCESS)
+ {
+ size = 0;
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr2, &size, MEM_RELEASE);
+ ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory return %08x, addr2: %p\n", status, addr2);
+ }
+
+ /* 22 zero bits is invalid */
+ size = 0x1000;
+ addr2 = NULL;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, 22, &size,
+ MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+ ok(status == STATUS_INVALID_PARAMETER_3 || status == STATUS_INVALID_PARAMETER,
+ "NtAllocateVirtualMemory returned %08x\n", status);
+ if (status == STATUS_SUCCESS)
+ {
+ size = 0;
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr2, &size, MEM_RELEASE);
+ ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory return %08x, addr2: %p\n", status, addr2);
+ }
+
+ /* AT_ROUND_TO_PAGE flag is not supported for NtAllocateVirtualMemory */
+ size = 0x1000;
+ addr2 = (char *)addr1 + 0x1000;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, 0, &size, MEM_RESERVE |
+ MEM_COMMIT | AT_ROUND_TO_PAGE, PAGE_EXECUTE_READWRITE);
+ ok(status == STATUS_INVALID_PARAMETER_5 || status == STATUS_INVALID_PARAMETER,
+ "NtAllocateVirtualMemory returned %08x\n", status);
+
+ size = 0;
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr1, &size, MEM_RELEASE);
+ ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory failed\n");
+}
+
+START_TEST(virtual)
+{
+ SYSTEM_BASIC_INFORMATION sbi;
+
+ NtQuerySystemInformation(SystemBasicInformation, &sbi, sizeof(sbi), NULL);
+ trace("system page size %#x\n", sbi.PageSize);
+
+ test_AllocateVirtualMemory();
+}
--
2.20.1
3
6
[PATCH v9 2/2] ntdll/tests: Add NtAllocateVirtualMemory tests for zero_bits behavior
by Huw Davies June 11, 2019
by Huw Davies June 11, 2019
June 11, 2019
From: Rémi Bernon <rbernon(a)codeweavers.com>
The zero_bits parameter doesn't behave as expected, and some 64bit code
use it to allocate memory in the lower 32bit address space.
The expected full behaviour is:
* zero_bits == 0: no constraint on address range
* 0 < zero_bits <= 15: returned address should have as many upper bits
set to 0, starting at bit 31. In 64bit mode,
upper 32bits should all be 0 as well.
* 15 < zero_bits <= 31: unsure, but probably same as zero_bits == 15.
* zero_bits > 31: (64bit/WoW64 only) zero_bits behaves as a bitmask, as
if it was set to the number of leading 0 in the
bitmask, works in the whole 64bit range.
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/ntdll/tests/virtual.c | 77 ++++++++++++++++++++++++++++++++++++++
1 file changed, 77 insertions(+)
diff --git a/dlls/ntdll/tests/virtual.c b/dlls/ntdll/tests/virtual.c
index c1b46c959e..195a54704f 100644
--- a/dlls/ntdll/tests/virtual.c
+++ b/dlls/ntdll/tests/virtual.c
@@ -26,11 +26,15 @@
#include "winternl.h"
#include "wine/test.h"
+static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
+
static void test_AllocateVirtualMemory(void)
{
void *addr1, *addr2;
NTSTATUS status;
SIZE_T size;
+ ULONG zero_bits;
+ BOOL is_wow64;
/* simple allocation should success */
size = 0x1000;
@@ -60,6 +64,46 @@ static void test_AllocateVirtualMemory(void)
ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory return %08x, addr2: %p\n", status, addr2);
}
+ /* 1 zero bits should zero 63-31 upper bits */
+ size = 0x1000;
+ addr2 = NULL;
+ zero_bits = 1;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, 1, &size,
+ MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
+ ok(status == STATUS_SUCCESS || status == STATUS_NO_MEMORY ||
+ broken(status == STATUS_INVALID_PARAMETER_3) /* winxp */,
+ "NtAllocateVirtualMemory returned %08x\n", status);
+ if (status == STATUS_SUCCESS)
+ {
+ ok(((UINT_PTR)addr2 >> (32 - zero_bits)) == 0,
+ "NtAllocateVirtualMemory returned address: %p\n", addr2);
+
+ size = 0;
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr2, &size, MEM_RELEASE);
+ ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory return %08x, addr2: %p\n", status, addr2);
+ }
+
+ for (zero_bits = 2; zero_bits <= 20; zero_bits++)
+ {
+ size = 0x1000;
+ addr2 = NULL;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, zero_bits, &size,
+ MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
+ ok(status == STATUS_SUCCESS || status == STATUS_NO_MEMORY ||
+ broken(zero_bits == 20 && status == STATUS_CONFLICTING_ADDRESSES) /* w1064v1809 */,
+ "NtAllocateVirtualMemory with %d zero_bits returned %08x\n", zero_bits, status);
+ if (status == STATUS_SUCCESS)
+ {
+ todo_wine_if((UINT_PTR)addr2 >> (32 - zero_bits))
+ ok(((UINT_PTR)addr2 >> (32 - zero_bits)) == 0,
+ "NtAllocateVirtualMemory with %d zero_bits returned address %p\n", zero_bits, addr2);
+
+ size = 0;
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr2, &size, MEM_RELEASE);
+ ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory return %08x, addr2: %p\n", status, addr2);
+ }
+ }
+
/* 21 zero bits never succeeds */
size = 0x1000;
addr2 = NULL;
@@ -83,6 +127,35 @@ static void test_AllocateVirtualMemory(void)
ok(status == STATUS_INVALID_PARAMETER_3 || status == STATUS_INVALID_PARAMETER,
"NtAllocateVirtualMemory returned %08x\n", status);
+ /* zero bits > 31 should be considered as bitmask on 64bit and WoW64 */
+ size = 0x1000;
+ addr2 = NULL;
+ zero_bits = 0x1fffffff;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, zero_bits, &size,
+ MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
+
+ if (sizeof(void *) == sizeof(int) && (!pIsWow64Process ||
+ !pIsWow64Process(NtCurrentProcess(), &is_wow64) || !is_wow64))
+ {
+ ok(status == STATUS_INVALID_PARAMETER_3, "NtAllocateVirtualMemory returned %08x\n", status);
+ }
+ else
+ {
+ todo_wine
+ ok(status == STATUS_SUCCESS || status == STATUS_NO_MEMORY,
+ "NtAllocateVirtualMemory returned %08x\n", status);
+ if (status == STATUS_SUCCESS)
+ {
+ todo_wine
+ ok(((UINT_PTR)addr2 & ~zero_bits) == 0,
+ "NtAllocateVirtualMemory returned address %p\n", addr2);
+
+ size = 0;
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr2, &size, MEM_RELEASE);
+ ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory return %08x, addr2: %p\n", status, addr2);
+ }
+ }
+
/* AT_ROUND_TO_PAGE flag is not supported for NtAllocateVirtualMemory */
size = 0x1000;
addr2 = (char *)addr1 + 0x1000;
@@ -99,6 +172,10 @@ static void test_AllocateVirtualMemory(void)
START_TEST(virtual)
{
SYSTEM_BASIC_INFORMATION sbi;
+ HMODULE hkernel32;
+
+ hkernel32 = GetModuleHandleA("kernel32.dll");
+ pIsWow64Process = (void *)GetProcAddress(hkernel32, "IsWow64Process");
NtQuerySystemInformation(SystemBasicInformation, &sbi, sizeof(sbi), NULL);
trace("system page size %#x\n", sbi.PageSize);
--
2.17.1
1
0
[PATCH 1/2] ucrtbase/tests: Add some tests for __stdio_common_vsscanf().
by Zebediah Figura June 10, 2019
by Zebediah Figura June 10, 2019
June 10, 2019
Based on msvcrt:scanf tests.
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/ucrtbase/tests/Makefile.in | 1 +
dlls/ucrtbase/tests/scanf.c | 280 ++++++++++++++++++++++++++++++++
2 files changed, 281 insertions(+)
create mode 100644 dlls/ucrtbase/tests/scanf.c
diff --git a/dlls/ucrtbase/tests/Makefile.in b/dlls/ucrtbase/tests/Makefile.in
index 3fd4b1c7d389..116bdcc7b653 100644
--- a/dlls/ucrtbase/tests/Makefile.in
+++ b/dlls/ucrtbase/tests/Makefile.in
@@ -4,4 +4,5 @@ C_SRCS = \
cpp.c \
misc.c \
printf.c \
+ scanf.c \
string.c
diff --git a/dlls/ucrtbase/tests/scanf.c b/dlls/ucrtbase/tests/scanf.c
new file mode 100644
index 000000000000..644e79921613
--- /dev/null
+++ b/dlls/ucrtbase/tests/scanf.c
@@ -0,0 +1,280 @@
+/*
+ * Conformance tests for *scanf functions.
+ *
+ * Copyright 2002 Uwe Bonnes
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdio.h>
+#include <math.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winnls.h"
+
+#include "wine/test.h"
+
+static int (__cdecl *p_vsscanf)(unsigned __int64 options, const char *str, size_t len, const char *format,
+ void *locale, __ms_va_list valist);
+
+static BOOL init(void)
+{
+ HMODULE hmod = LoadLibraryA("ucrtbase.dll");
+
+ if (!hmod)
+ {
+ win_skip("ucrtbase.dll not installed\n");
+ return FALSE;
+ }
+
+ p_vsscanf = (void *)GetProcAddress(hmod, "__stdio_common_vsscanf");
+
+ return TRUE;
+}
+
+static int WINAPIV vsscanf_wrapper(unsigned __int64 options, const char *str, const char *format, ...)
+{
+ int ret;
+ __ms_va_list valist;
+ __ms_va_start(valist, format);
+ ret = p_vsscanf(options, str, -1, format, NULL, valist);
+ __ms_va_end(valist);
+ return ret;
+}
+
+#define UCRTBASE_SCANF_SECURECRT (0x0001)
+#define UCRTBASE_SCANF_LEGACY_WIDE_SPECIFIERS (0x0002)
+#define UCRTBASE_SCANF_LEGACY_MSVCRT_COMPATIBILITY (0x0004)
+
+static void test_sscanf(void)
+{
+ static const float float1 = -82.6267f, float2 = 27.76f;
+ char buffer[100], buffer1[100];
+ int result, ret, hour, min, count;
+ LONGLONG result64;
+ char c;
+ void *ptr;
+ float ret_float1, ret_float2;
+ double double_res;
+ unsigned int i;
+
+ static const unsigned int tests[] =
+ {
+ 0,
+ UCRTBASE_SCANF_LEGACY_WIDE_SPECIFIERS,
+ UCRTBASE_SCANF_LEGACY_MSVCRT_COMPATIBILITY,
+ };
+
+ for (i = 0; i < ARRAY_SIZE(tests); ++i)
+ {
+ ret = vsscanf_wrapper(tests[i], "", "%d", &result);
+ ok(ret == EOF, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "000000000046F170", "%p", &ptr);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(ptr == (void *)0x46f170, "sscanf reads %p for flags %#x\n", ptr, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "0046F171", "%p", &ptr);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(ptr == (void *)0x46f171, "sscanf reads %p for flags %#x\n", ptr, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "46F172", "%p", &ptr);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(ptr == (void *)0x46f172, "sscanf reads %p for flags %#x\n", ptr, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "0x46F173", "%p", &ptr);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ todo_wine ok(ptr == (void *)0x46f173, "sscanf reads %p for flags %#x\n", ptr, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "-46F174", "%p", &ptr);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(ptr == (void *)(ULONG_PTR)-0x46f174, "sscanf reads %p for flags %#x\n", ptr, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "+46F175", "%p", &ptr);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(ptr == (void *)0x46f175, "sscanf reads %p for flags %#x\n", ptr, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "1233", "%p", &ptr);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(ptr == (void *)0x1233, "sscanf reads %p for flags %#x\n", ptr, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "1234", "%P", &ptr);
+ todo_wine ok(ret == 0, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "0x519", "%x", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 0x519, "sscanf reads %#x for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "0x51a", "%x", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 0x51a, "sscanf reads %#x for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "0x51g", "%x", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 0x51, "sscanf reads %#x for flags %#x\n", result, tests[i]);
+
+ result = 0;
+ ret = vsscanf_wrapper(tests[i], "-1", "%x", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == -1, "sscanf reads %#x for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "\"%12@", "%\"%%%d%@", &result);
+ todo_wine ok(ret == 0, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+
+ sprintf(buffer, "%f %f", float1, float2);
+ ret = vsscanf_wrapper(tests[i], buffer, "%f%f", &ret_float1, &ret_float2);
+ ok(ret == 2, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(ret_float1 == float1, "got wrong float %.8e for flags %#x\n", ret_float1, tests[i]);
+ ok(ret_float2 == float2, "got wrong float %.8e for flags %#x\n", ret_float2, tests[i]);
+
+ sprintf(buffer, "%lf", 32.715);
+ ret = vsscanf_wrapper(tests[i], buffer, "%lf", &double_res);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(double_res == 32.715, "got wrong double %.16e for flags %#x\n", double_res, tests[i]);
+ ret = vsscanf_wrapper(tests[i], buffer, "%Lf", &double_res);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(double_res == 32.715, "got wrong double %.16e for flags %#x\n", double_res, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "1.1e-30", "%lf", &double_res);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(double_res == 1.1e-30, "got wrong double %.16e for flags %#x\n", double_res, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], " Waverly", "%*c%[^\n]", buffer);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(!strcmp(buffer, " Waverly"), "got string '%s' for flags %#x\n", buffer, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "abcefgdh", "%*[a-cg-e]%c", &buffer[0]);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(buffer[0] == 'd', "got char '%c' for flags %#x\n", buffer[0], tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "abcefgdh", "%*[a-cd-dg-e]%c", &buffer[0]);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(buffer[0] == 'h', "got char '%c' for flags %#x\n", buffer[0], tests[i]);
+
+ strcpy(buffer, "foo");
+ strcpy(buffer1, "bar");
+ ret = vsscanf_wrapper(tests[i], "a", "%s%s", buffer, buffer1);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(!strcmp(buffer, "a"), "got string '%s' for flags %#x\n", buffer, tests[i]);
+ ok(!strcmp(buffer1, "bar"), "got string '%s' for flags %#x\n", buffer1, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "21:59:20", "%d%n", &result, &count);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 21, "got wrong number %d for flags %#x\n", result, tests[i]);
+ ok(count == 2, "got wrong count %d for flags %#x\n", count, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], ":59:20", "%*c%n", &count);
+ ok(ret == 0, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(count == 1, "got wrong count %d for flags %#x\n", count, tests[i]);
+
+ result = 0xdeadbeef;
+ ret = vsscanf_wrapper(tests[i], "12345678", "%hd", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 0xdead614e, "got wrong number %#x for flags %#x\n", result, tests[i]);
+
+ result = 0xdeadbeef;
+ ret = vsscanf_wrapper(tests[i], "12345678", "%hhd", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ todo_wine ok(result == 0xdeadbe4e, "got wrong number %#x for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "12345678901234", "%lld", &result64);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result64 == 12345678901234, "got wrong number 0x%s for flags %#x\n",
+ wine_dbgstr_longlong(result64), tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "123", "%i", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 123, "got wrong number %d for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "-1", "%i", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == -1, "got wrong number %d for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "123", "%d", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 123, "got wrong number %d for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "-1", "%d", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == -1, "got wrong number %d for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "017", "%i", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 15, "got wrong number %d for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "0x17", "%i", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == 23, "got wrong number %d for flags %#x\n", result, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "-1", "%o", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == -1, "got wrong number %d for flags %#x\n", result, tests[i]);
+
+ ret = 0xdeadbeef;
+ ret = vsscanf_wrapper(tests[i], "-1", "%u", &result);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(result == -1, "got wrong number %d for flags %#x\n", result, tests[i]);
+
+ c = 0x55;
+ ret = vsscanf_wrapper(tests[i], "a", "%c", &c);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(c == 'a', "got wrong char '%c' for flags %#x\n", c, tests[i]);
+
+ c = 0x55;
+ ret = vsscanf_wrapper(tests[i], " a", "%c", &c);
+ ok(ret == 1, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(c == ' ', "got wrong char '%c' for flags %#x\n", c, tests[i]);
+
+ c = 0x55;
+ ret = vsscanf_wrapper(tests[i], "18:59", "%d:%d%c", &hour, &min, &c);
+ ok(ret == 2, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(hour == 18, "got wrong char '%c' for flags %#x\n", hour, tests[i]);
+ ok(min == 59, "got wrong char '%c' for flags %#x\n", min, tests[i]);
+ ok(c == 0x55, "got wrong char '%c' for flags %#x\n", c, tests[i]);
+
+ strcpy(buffer, "foo");
+ strcpy(buffer1, "bar");
+ ret = vsscanf_wrapper(tests[i], "abc def", "%s %n%s", buffer, &count, buffer1);
+ ok(ret == 2, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(!strcmp(buffer, "abc"), "got wrong string '%s' for flags %#x\n", buffer, tests[i]);
+ ok(count == 6, "got wrong count %d for flags %#x\n", count, tests[i]);
+ ok(!strcmp(buffer1, "def"), "got wrong string '%s' for flags %#x\n", buffer1, tests[i]);
+
+ ret = vsscanf_wrapper(tests[i], "3:45", "%d:%d%n", &hour, &min, &count);
+ ok(ret == 2, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(hour == 3, "got wrong char '%c' for flags %#x\n", hour, tests[i]);
+ ok(min == 45, "got wrong char '%c' for flags %#x\n", min, tests[i]);
+ ok(count == 4, "got wrong count %d for flags %#x\n", count, tests[i]);
+
+ strcpy(buffer, "foo");
+ strcpy(buffer1, "bar");
+ ret = vsscanf_wrapper(tests[i], "test=value\xda", "%[^=] = %[^;]", buffer, buffer1);
+ ok(ret == 2, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ ok(!strcmp(buffer, "test"), "got wrong string '%s' for flags %#x\n", buffer, tests[i]);
+ ok(!strcmp(buffer1, "value\xda"), "got wrong string '%s' for flags %#x\n", buffer1, tests[i]);
+
+ strcpy(buffer, "foo");
+ ret = vsscanf_wrapper(tests[i], "\x81\x82test", "\x81\x82%s", buffer);
+ todo_wine ok(ret == 0, "sscanf returned %d for flags %#x\n", ret, tests[i]);
+ }
+}
+
+START_TEST(scanf)
+{
+ if (!init()) return;
+
+ test_sscanf();
+}
--
2.20.1
2
3
[PATCH 5/5] wined3d: Upload texture data through the texture ops in wined3d_cs_exec_update_sub_resource().
by Henri Verbeet June 10, 2019
by Henri Verbeet June 10, 2019
June 10, 2019
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/cs.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index a95ba502f32..05d39038843 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -2340,11 +2340,11 @@ static void wined3d_cs_exec_update_sub_resource(struct wined3d_cs *cs, const voi
wined3d_texture_prepare_texture(texture, context, FALSE);
else
wined3d_texture_load_location(texture, op->sub_resource_idx, context, WINED3D_LOCATION_TEXTURE_RGB);
- wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), wined3d_context_gl(context), FALSE);
wined3d_box_set(&src_box, 0, 0, box->right - box->left, box->bottom - box->top, 0, box->back - box->front);
- wined3d_texture_upload_data(texture, op->sub_resource_idx, context, texture->resource.format, &src_box,
- &addr, op->data.row_pitch, op->data.slice_pitch, box->left, box->top, box->front, FALSE);
+ texture->texture_ops->texture_upload_data(context, &addr, texture->resource.format, &src_box,
+ op->data.row_pitch, op->data.slice_pitch, texture, op->sub_resource_idx,
+ WINED3D_LOCATION_TEXTURE_RGB, box->left, box->top, box->front);
wined3d_texture_validate_location(texture, op->sub_resource_idx, WINED3D_LOCATION_TEXTURE_RGB);
wined3d_texture_invalidate_location(texture, op->sub_resource_idx, ~WINED3D_LOCATION_TEXTURE_RGB);
--
2.11.0
1
0
[PATCH 4/5] wined3d: Pass a wined3d_context_gl structure to context_unload_tex_coords().
by Henri Verbeet June 10, 2019
by Henri Verbeet June 10, 2019
June 10, 2019
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/context.c | 7 ++++---
dlls/wined3d/state.c | 2 +-
dlls/wined3d/wined3d_private.h | 2 +-
3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 01d350de502..be24baf3187 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -5015,9 +5015,9 @@ void draw_primitive(struct wined3d_device *device, const struct wined3d_state *s
context_release(context);
}
-void context_unload_tex_coords(const struct wined3d_context *context)
+void wined3d_context_gl_unload_tex_coords(const struct wined3d_context_gl *context_gl)
{
- const struct wined3d_gl_info *gl_info = context->gl_info;
+ const struct wined3d_gl_info *gl_info = context_gl->c.gl_info;
unsigned int texture_idx;
for (texture_idx = 0; texture_idx < gl_info->limits.texture_coords; ++texture_idx)
@@ -5091,6 +5091,7 @@ void wined3d_context_gl_load_tex_coords(const struct wined3d_context_gl *context
/* This should match any arrays loaded in context_load_vertex_data(). */
static void context_unload_vertex_data(struct wined3d_context *context)
{
+ struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
const struct wined3d_gl_info *gl_info = context->gl_info;
if (!context->namedArraysLoaded)
@@ -5100,7 +5101,7 @@ static void context_unload_vertex_data(struct wined3d_context *context)
gl_info->gl_ops.gl.p_glDisableClientState(GL_COLOR_ARRAY);
if (gl_info->supported[EXT_SECONDARY_COLOR])
gl_info->gl_ops.gl.p_glDisableClientState(GL_SECONDARY_COLOR_ARRAY_EXT);
- context_unload_tex_coords(context);
+ wined3d_context_gl_unload_tex_coords(context_gl);
context->namedArraysLoaded = FALSE;
}
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index a31f08574ed..1e13557a98f 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -3474,7 +3474,7 @@ static void tex_coordindex(struct wined3d_context *context, const struct wined3d
*/
GLuint curVBO = gl_info->supported[ARB_VERTEX_BUFFER_OBJECT] ? ~0U : 0;
- context_unload_tex_coords(context);
+ wined3d_context_gl_unload_tex_coords(context_gl);
wined3d_context_gl_load_tex_coords(context_gl, &context->stream_info, &curVBO, state);
}
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 0dd1fc1bc75..4f0b91adaf1 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2111,6 +2111,7 @@ void wined3d_context_gl_release(struct wined3d_context_gl *context_gl) DECLSPEC_
void wined3d_context_gl_set_draw_buffer(struct wined3d_context_gl *context_gl, GLenum buffer) DECLSPEC_HIDDEN;
void wined3d_context_gl_texture_update(struct wined3d_context_gl *context_gl,
const struct wined3d_texture_gl *texture_gl) DECLSPEC_HIDDEN;
+void wined3d_context_gl_unload_tex_coords(const struct wined3d_context_gl *context_gl) DECLSPEC_HIDDEN;
void wined3d_context_gl_update_stream_sources(struct wined3d_context_gl *context_gl,
const struct wined3d_state *state) DECLSPEC_HIDDEN;
@@ -2268,7 +2269,6 @@ void context_state_drawbuf(struct wined3d_context *context,
const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
void context_state_fb(struct wined3d_context *context,
const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
-void context_unload_tex_coords(const struct wined3d_context *context) DECLSPEC_HIDDEN;
void context_unmap_bo_address(struct wined3d_context *context,
const struct wined3d_bo_address *data, GLenum binding) DECLSPEC_HIDDEN;
--
2.11.0
1
0
[PATCH 3/5] wined3d: Pass a wined3d_context_gl structure to context_map_bo_address().
by Henri Verbeet June 10, 2019
by Henri Verbeet June 10, 2019
June 10, 2019
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/context.c | 9 ++++-----
dlls/wined3d/surface.c | 31 ++++++++++++++++++++++---------
dlls/wined3d/texture.c | 18 ++++++++++++++----
dlls/wined3d/wined3d_private.h | 4 ++--
4 files changed, 42 insertions(+), 20 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 18a17163cba..01d350de502 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -2589,17 +2589,16 @@ void wined3d_context_gl_bind_texture(struct wined3d_context_gl *context_gl, GLen
checkGLcall("bind texture");
}
-void *context_map_bo_address(struct wined3d_context *context,
+void *wined3d_context_gl_map_bo_address(struct wined3d_context_gl *context_gl,
const struct wined3d_bo_address *data, size_t size, GLenum binding, DWORD flags)
{
- struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
const struct wined3d_gl_info *gl_info;
BYTE *memory;
if (!data->buffer_object)
return data->addr;
- gl_info = context->gl_info;
+ gl_info = context_gl->c.gl_info;
wined3d_context_gl_bind_bo(context_gl, binding, data->buffer_object);
if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
@@ -2656,8 +2655,8 @@ void wined3d_context_gl_copy_bo_address(struct wined3d_context_gl *context_gl,
}
else
{
- src_ptr = context_map_bo_address(&context_gl->c, src, size, src_binding, WINED3D_MAP_READ);
- dst_ptr = context_map_bo_address(&context_gl->c, dst, size, dst_binding, WINED3D_MAP_WRITE);
+ src_ptr = wined3d_context_gl_map_bo_address(context_gl, src, size, src_binding, WINED3D_MAP_READ);
+ dst_ptr = wined3d_context_gl_map_bo_address(context_gl, dst, size, dst_binding, WINED3D_MAP_WRITE);
memcpy(dst_ptr, src_ptr, size);
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 7ae4fb81877..5e28c46b114 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -614,6 +614,7 @@ static struct wined3d_texture *surface_convert_format(struct wined3d_texture *sr
const struct wined3d_format *src_format = src_texture->resource.format;
struct wined3d_device *device = src_texture->resource.device;
const struct d3dfmt_converter_desc *conv = NULL;
+ struct wined3d_context_gl *context_gl = NULL;
unsigned int src_row_pitch, src_slice_pitch;
struct wined3d_context *context = NULL;
struct wined3d_texture *dst_texture;
@@ -651,7 +652,10 @@ static struct wined3d_texture *surface_convert_format(struct wined3d_texture *sr
}
if (device->d3d_initialized)
+ {
context = context_acquire(device, NULL, 0);
+ context_gl = wined3d_context_gl(context);
+ }
map_binding = src_texture->resource.map_binding;
if (!wined3d_texture_load_location(src_texture, sub_resource_idx, context, map_binding))
@@ -672,10 +676,10 @@ static struct wined3d_texture *surface_convert_format(struct wined3d_texture *sr
wined3d_texture_get_pitch(dst_texture, 0, &dst_row_pitch, &dst_slice_pitch);
wined3d_texture_get_memory(dst_texture, 0, &dst_data, map_binding);
- src = context_map_bo_address(context, &src_data,
+ src = wined3d_context_gl_map_bo_address(context_gl, &src_data,
src_texture->sub_resources[sub_resource_idx].size, GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_READ);
- dst = context_map_bo_address(context,
- &dst_data, dst_texture->sub_resources[0].size, GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_WRITE);
+ dst = wined3d_context_gl_map_bo_address(context_gl, &dst_data,
+ dst_texture->sub_resources[0].size, GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_WRITE);
conv->convert(src, dst, src_row_pitch, dst_row_pitch, desc.width, desc.height);
@@ -1525,6 +1529,7 @@ BOOL texture2d_load_texture(struct wined3d_texture *texture, unsigned int sub_re
struct wined3d_context *context, BOOL srgb)
{
unsigned int width, height, level, src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch;
+ struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
const struct wined3d_gl_info *gl_info = context->gl_info;
struct wined3d_device *device = texture->resource.device;
const struct wined3d_color_key_conversion *conversion;
@@ -1643,8 +1648,8 @@ BOOL texture2d_load_texture(struct wined3d_texture *texture, unsigned int sub_re
wined3d_format_calculate_pitch(format, device->surface_alignment,
width, height, &dst_row_pitch, &dst_slice_pitch);
- src_mem = context_map_bo_address(context, &data, src_slice_pitch,
- GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_READ);
+ src_mem = wined3d_context_gl_map_bo_address(context_gl, &data,
+ src_slice_pitch, GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_READ);
if (!(dst_mem = heap_alloc(dst_slice_pitch)))
{
ERR("Out of memory (%u).\n", dst_slice_pitch);
@@ -2468,6 +2473,7 @@ static HRESULT surface_cpu_blt(struct wined3d_texture *dst_texture, unsigned int
const struct wined3d_format *src_format, *dst_format;
struct wined3d_texture *converted_texture = NULL;
struct wined3d_bo_address src_data, dst_data;
+ struct wined3d_context_gl *context_gl = NULL;
unsigned int src_fmt_flags, dst_fmt_flags;
struct wined3d_map_desc dst_map, src_map;
struct wined3d_context *context = NULL;
@@ -2486,7 +2492,10 @@ static HRESULT surface_cpu_blt(struct wined3d_texture *dst_texture, unsigned int
src_sub_resource_idx, debug_box(src_box), flags, fx, debug_d3dtexturefiltertype(filter));
if (device->d3d_initialized)
+ {
context = context_acquire(device, NULL, 0);
+ context_gl = wined3d_context_gl(context);
+ }
if (src_texture == dst_texture && src_sub_resource_idx == dst_sub_resource_idx)
{
@@ -2499,7 +2508,7 @@ static HRESULT surface_cpu_blt(struct wined3d_texture *dst_texture, unsigned int
wined3d_texture_invalidate_location(dst_texture, dst_sub_resource_idx, ~map_binding);
wined3d_texture_get_pitch(dst_texture, texture_level, &dst_map.row_pitch, &dst_map.slice_pitch);
wined3d_texture_get_memory(dst_texture, dst_sub_resource_idx, &dst_data, map_binding);
- dst_map.data = context_map_bo_address(context, &dst_data,
+ dst_map.data = wined3d_context_gl_map_bo_address(context_gl, &dst_data,
dst_texture->sub_resources[dst_sub_resource_idx].size,
GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_READ | WINED3D_MAP_WRITE);
@@ -2536,7 +2545,7 @@ static HRESULT surface_cpu_blt(struct wined3d_texture *dst_texture, unsigned int
ERR("Failed to load the source sub-resource into %s.\n", wined3d_debug_location(map_binding));
wined3d_texture_get_pitch(src_texture, texture_level, &src_map.row_pitch, &src_map.slice_pitch);
wined3d_texture_get_memory(src_texture, src_sub_resource_idx, &src_data, map_binding);
- src_map.data = context_map_bo_address(context, &src_data,
+ src_map.data = wined3d_context_gl_map_bo_address(context_gl, &src_data,
src_texture->sub_resources[src_sub_resource_idx].size, GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_READ);
map_binding = dst_texture->resource.map_binding;
@@ -2546,7 +2555,7 @@ static HRESULT surface_cpu_blt(struct wined3d_texture *dst_texture, unsigned int
wined3d_texture_invalidate_location(dst_texture, dst_sub_resource_idx, ~map_binding);
wined3d_texture_get_pitch(dst_texture, texture_level, &dst_map.row_pitch, &dst_map.slice_pitch);
wined3d_texture_get_memory(dst_texture, dst_sub_resource_idx, &dst_data, map_binding);
- dst_map.data = context_map_bo_address(context, &dst_data,
+ dst_map.data = wined3d_context_gl_map_bo_address(context_gl, &dst_data,
dst_texture->sub_resources[dst_sub_resource_idx].size, GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_WRITE);
}
flags &= ~WINED3D_BLT_RAW;
@@ -2944,6 +2953,7 @@ static void surface_cpu_blt_colour_fill(struct wined3d_rendertarget_view *view,
const struct wined3d_box *box, const struct wined3d_color *colour)
{
struct wined3d_device *device = view->resource->device;
+ struct wined3d_context_gl *context_gl = NULL;
struct wined3d_context *context = NULL;
struct wined3d_texture *texture;
struct wined3d_bo_address data;
@@ -2972,7 +2982,10 @@ static void surface_cpu_blt_colour_fill(struct wined3d_rendertarget_view *view,
}
if (device->d3d_initialized)
+ {
context = context_acquire(device, NULL, 0);
+ context_gl = wined3d_context_gl(context);
+ }
c = wined3d_format_convert_from_float(view->format, colour);
bpp = view->format->byte_count;
@@ -2987,7 +3000,7 @@ static void surface_cpu_blt_colour_fill(struct wined3d_rendertarget_view *view,
wined3d_texture_get_pitch(texture, view->sub_resource_idx % texture->level_count,
&map.row_pitch, &map.slice_pitch);
wined3d_texture_get_memory(texture, view->sub_resource_idx, &data, map_binding);
- map.data = context_map_bo_address(context, &data,
+ map.data = wined3d_context_gl_map_bo_address(context_gl, &data,
texture->sub_resources[view->sub_resource_idx].size, GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_WRITE);
map.data = (BYTE *)map.data
+ (box->front * map.slice_pitch)
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 6e1cc047502..2a8bff458e3 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -695,6 +695,7 @@ static void wined3d_texture_sub_resources_destroyed(struct wined3d_texture *text
static void wined3d_texture_create_dc(void *object)
{
const struct wined3d_texture_idx *idx = object;
+ struct wined3d_context_gl *context_gl = NULL;
struct wined3d_context *context = NULL;
unsigned int sub_resource_idx, level;
const struct wined3d_format *format;
@@ -732,13 +733,16 @@ static void wined3d_texture_create_dc(void *object)
}
if (device->d3d_initialized)
+ {
context = context_acquire(device, NULL, 0);
+ context_gl = wined3d_context_gl(context);
+ }
wined3d_texture_load_location(texture, sub_resource_idx, context, texture->resource.map_binding);
wined3d_texture_invalidate_location(texture, sub_resource_idx, ~texture->resource.map_binding);
wined3d_texture_get_pitch(texture, level, &row_pitch, &slice_pitch);
wined3d_texture_get_memory(texture, sub_resource_idx, &data, texture->resource.map_binding);
- desc.pMemory = context_map_bo_address(context, &data,
+ desc.pMemory = wined3d_context_gl_map_bo_address(context_gl, &data,
texture->sub_resources[sub_resource_idx].size,
GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_READ | WINED3D_MAP_WRITE);
@@ -1903,6 +1907,7 @@ void wined3d_texture_upload_data(struct wined3d_texture *texture, unsigned int s
const struct wined3d_const_bo_address *data, unsigned int src_row_pitch, unsigned int src_slice_pitch,
unsigned int dst_x, unsigned int dst_y, unsigned int dst_z, BOOL srgb)
{
+ struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
const struct wined3d_gl_info *gl_info = context->gl_info;
unsigned int update_w = src_box->right - src_box->left;
unsigned int update_h = src_box->bottom - src_box->top;
@@ -1995,8 +2000,8 @@ void wined3d_texture_upload_data(struct wined3d_texture *texture, unsigned int s
return;
}
- src_mem = context_map_bo_address(context, &bo, src_slice_pitch,
- GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_READ);
+ src_mem = wined3d_context_gl_map_bo_address(context_gl, &bo,
+ src_slice_pitch, GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_READ);
if (decompress)
compressed_format->decompress(src_mem, converted_mem, src_row_pitch, src_slice_pitch,
dst_row_pitch, dst_slice_pitch, update_w, update_h, update_d);
@@ -2577,6 +2582,7 @@ static HRESULT texture_resource_sub_resource_map(struct wined3d_resource *resour
struct wined3d_texture_sub_resource *sub_resource;
struct wined3d_device *device = resource->device;
unsigned int fmt_flags = resource->format_flags;
+ struct wined3d_context_gl *context_gl = NULL;
struct wined3d_context *context = NULL;
struct wined3d_texture *texture;
struct wined3d_bo_address data;
@@ -2613,7 +2619,10 @@ static HRESULT texture_resource_sub_resource_map(struct wined3d_resource *resour
}
if (device->d3d_initialized)
+ {
context = context_acquire(device, NULL, 0);
+ context_gl = wined3d_context_gl(context);
+ }
if (flags & WINED3D_MAP_DISCARD)
{
@@ -2641,7 +2650,8 @@ static HRESULT texture_resource_sub_resource_map(struct wined3d_resource *resour
wined3d_texture_invalidate_location(texture, sub_resource_idx, ~resource->map_binding);
wined3d_texture_get_memory(texture, sub_resource_idx, &data, resource->map_binding);
- base_memory = context_map_bo_address(context, &data, sub_resource->size, GL_PIXEL_UNPACK_BUFFER, flags);
+ base_memory = wined3d_context_gl_map_bo_address(context_gl, &data,
+ sub_resource->size, GL_PIXEL_UNPACK_BUFFER, flags);
TRACE("Base memory pointer %p.\n", base_memory);
if (context)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index dad878cab2a..0dd1fc1bc75 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2104,6 +2104,8 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl,
struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
void wined3d_context_gl_load_tex_coords(const struct wined3d_context_gl *context_gl,
const struct wined3d_stream_info *si, GLuint *current_bo, const struct wined3d_state *state) DECLSPEC_HIDDEN;
+void *wined3d_context_gl_map_bo_address(struct wined3d_context_gl *context_gl,
+ const struct wined3d_bo_address *data, size_t size, GLenum binding, DWORD flags) DECLSPEC_HIDDEN;
struct wined3d_context_gl *wined3d_context_gl_reacquire(struct wined3d_context_gl *context_gl) DECLSPEC_HIDDEN;
void wined3d_context_gl_release(struct wined3d_context_gl *context_gl) DECLSPEC_HIDDEN;
void wined3d_context_gl_set_draw_buffer(struct wined3d_context_gl *context_gl, GLenum buffer) DECLSPEC_HIDDEN;
@@ -2257,8 +2259,6 @@ void context_gl_resource_released(struct wined3d_device *device,
GLuint name, BOOL rb_namespace) DECLSPEC_HIDDEN;
void context_invalidate_compute_state(struct wined3d_context *context, DWORD state_id) DECLSPEC_HIDDEN;
void context_invalidate_state(struct wined3d_context *context, DWORD state_id) DECLSPEC_HIDDEN;
-void *context_map_bo_address(struct wined3d_context *context, const struct wined3d_bo_address *data,
- size_t size, GLenum binding, DWORD flags) DECLSPEC_HIDDEN;
void context_resource_released(const struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN;
void context_restore(struct wined3d_context *context, struct wined3d_texture *texture,
unsigned int sub_resource_idx) DECLSPEC_HIDDEN;
--
2.11.0
1
0
[PATCH 2/5] wined3d: Pass a wined3d_context_gl structure to context_end_transform_feedback().
by Henri Verbeet June 10, 2019
by Henri Verbeet June 10, 2019
June 10, 2019
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/buffer.c | 3 ++-
dlls/wined3d/context.c | 14 ++++++++------
dlls/wined3d/state.c | 3 ++-
dlls/wined3d/wined3d_private.h | 2 +-
4 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 9fcd96b864a..8e1ac4819c5 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -144,6 +144,7 @@ static void wined3d_buffer_gl_bind(struct wined3d_buffer_gl *buffer_gl, struct w
static void wined3d_buffer_gl_destroy_buffer_object(struct wined3d_buffer_gl *buffer_gl,
struct wined3d_context *context)
{
+ struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
struct wined3d_resource *resource = &buffer_gl->b.resource;
const struct wined3d_gl_info *gl_info = context->gl_info;
@@ -179,7 +180,7 @@ static void wined3d_buffer_gl_destroy_buffer_object(struct wined3d_buffer_gl *bu
* when deleting a potentially bound transform feedback buffer.
* This may happen when the device is being destroyed. */
WARN("Deleting buffer object for buffer %p, disabling transform feedback.\n", buffer_gl);
- context_end_transform_feedback(context);
+ wined3d_context_gl_end_transform_feedback(context_gl);
}
}
}
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index b443fcd98ed..18a17163cba 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -4085,20 +4085,22 @@ static BOOL use_transform_feedback(const struct wined3d_state *state)
return shader->u.gs.so_desc.element_count;
}
-void context_end_transform_feedback(struct wined3d_context *context)
+void wined3d_context_gl_end_transform_feedback(struct wined3d_context_gl *context_gl)
{
- const struct wined3d_gl_info *gl_info = context->gl_info;
- if (context->transform_feedback_active)
+ const struct wined3d_gl_info *gl_info = context_gl->c.gl_info;
+
+ if (context_gl->c.transform_feedback_active)
{
GL_EXTCALL(glEndTransformFeedback());
checkGLcall("glEndTransformFeedback");
- context->transform_feedback_active = 0;
- context->transform_feedback_paused = 0;
+ context_gl->c.transform_feedback_active = 0;
+ context_gl->c.transform_feedback_paused = 0;
}
}
static void context_pause_transform_feedback(struct wined3d_context *context, BOOL force)
{
+ struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
const struct wined3d_gl_info *gl_info = context->gl_info;
if (!context->transform_feedback_active || context->transform_feedback_paused)
@@ -4115,7 +4117,7 @@ static void context_pause_transform_feedback(struct wined3d_context *context, BO
WARN("Cannot pause transform feedback operations.\n");
if (force)
- context_end_transform_feedback(context);
+ wined3d_context_gl_end_transform_feedback(context_gl);
}
static void context_setup_target(struct wined3d_context *context,
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 2b01caa3e6e..a31f08574ed 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -4448,13 +4448,14 @@ static void state_uav_warn(struct wined3d_context *context, const struct wined3d
static void state_so(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
{
+ struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
const struct wined3d_gl_info *gl_info = context->gl_info;
struct wined3d_buffer *buffer;
unsigned int offset, size, i;
TRACE("context %p, state %p, state_id %#x.\n", context, state, state_id);
- context_end_transform_feedback(context);
+ wined3d_context_gl_end_transform_feedback(context_gl);
for (i = 0; i < ARRAY_SIZE(state->stream_output); ++i)
{
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 588d7e5b582..dad878cab2a 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2091,6 +2091,7 @@ void wined3d_context_gl_copy_bo_address(struct wined3d_context_gl *context_gl,
const struct wined3d_bo_address *src, GLenum src_binding, size_t size) DECLSPEC_HIDDEN;
void wined3d_context_gl_destroy(struct wined3d_context_gl *context_gl) DECLSPEC_HIDDEN;
void wined3d_context_gl_enable_clip_distances(struct wined3d_context_gl *context_gl, uint32_t mask) DECLSPEC_HIDDEN;
+void wined3d_context_gl_end_transform_feedback(struct wined3d_context_gl *context_gl) DECLSPEC_HIDDEN;
void wined3d_context_gl_free_fence(struct wined3d_fence *fence) DECLSPEC_HIDDEN;
void wined3d_context_gl_free_occlusion_query(struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN;
void wined3d_context_gl_free_pipeline_statistics_query(struct wined3d_pipeline_statistics_query *query) DECLSPEC_HIDDEN;
@@ -2250,7 +2251,6 @@ void context_draw_shaded_quad(struct wined3d_context *context, struct wined3d_te
void context_draw_textured_quad(struct wined3d_context *context, struct wined3d_texture_gl *texture_gl,
unsigned int sub_resource_idx, const RECT *src_rect, const RECT *dst_rect,
enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN;
-void context_end_transform_feedback(struct wined3d_context *context) DECLSPEC_HIDDEN;
struct wined3d_context *context_get_current(void) DECLSPEC_HIDDEN;
DWORD context_get_tls_idx(void) DECLSPEC_HIDDEN;
void context_gl_resource_released(struct wined3d_device *device,
--
2.11.0
1
0
[PATCH 1/5] wined3d: Pass a wined3d_context_gl structure to context_enable_clip_distances().
by Henri Verbeet June 10, 2019
by Henri Verbeet June 10, 2019
June 10, 2019
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/context.c | 15 ++++++++-------
dlls/wined3d/glsl_shader.c | 3 ++-
dlls/wined3d/state.c | 8 +++++---
dlls/wined3d/wined3d_private.h | 2 +-
4 files changed, 16 insertions(+), 12 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 933bf13fefc..b443fcd98ed 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -2401,17 +2401,18 @@ static void wined3d_context_gl_get_rt_size(const struct wined3d_context_gl *cont
size->cy = wined3d_texture_get_level_height(rt, level);
}
-void context_enable_clip_distances(struct wined3d_context *context, unsigned int enable_mask)
+void wined3d_context_gl_enable_clip_distances(struct wined3d_context_gl *context_gl, uint32_t enable_mask)
{
- const struct wined3d_gl_info *gl_info = context->gl_info;
- unsigned int clip_distance_count = gl_info->limits.user_clip_distances;
- unsigned int i, disable_mask, current_mask;
+ const struct wined3d_gl_info *gl_info = context_gl->c.gl_info;
+ unsigned int clip_distance_count, i;
+ uint32_t disable_mask, current_mask;
+ clip_distance_count = gl_info->limits.user_clip_distances;
disable_mask = ~enable_mask;
enable_mask &= (1u << clip_distance_count) - 1;
disable_mask &= (1u << clip_distance_count) - 1;
- current_mask = context->clip_distance_mask;
- context->clip_distance_mask = enable_mask;
+ current_mask = context_gl->c.clip_distance_mask;
+ context_gl->c.clip_distance_mask = enable_mask;
enable_mask &= ~current_mask;
while (enable_mask)
@@ -2850,7 +2851,7 @@ void wined3d_context_gl_apply_blit_state(struct wined3d_context_gl *context_gl,
context->last_was_rhw = TRUE;
context_invalidate_state(context, STATE_VDECL); /* because of last_was_rhw = TRUE */
- context_enable_clip_distances(context, 0);
+ wined3d_context_gl_enable_clip_distances(context_gl, 0);
context_invalidate_state(context, STATE_RENDER(WINED3D_RS_CLIPPING));
/* FIXME: Make draw_textured_quad() able to work with a upper left origin. */
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index ab62c1ca599..bb510ecf2d3 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -10533,6 +10533,7 @@ static void shader_glsl_precompile(void *shader_priv, struct wined3d_shader *sha
static void shader_glsl_select(void *shader_priv, struct wined3d_context *context,
const struct wined3d_state *state)
{
+ struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
struct glsl_context_data *ctx_data = context->shader_backend_data;
const struct wined3d_gl_info *gl_info = context->gl_info;
struct shader_glsl_priv *priv = shader_priv;
@@ -10552,7 +10553,7 @@ static void shader_glsl_select(void *shader_priv, struct wined3d_context *contex
program_id = glsl_program->id;
current_vertex_color_clamp = glsl_program->vs.vertex_color_clamp;
if (glsl_program->shader_controlled_clip_distances)
- context_enable_clip_distances(context, glsl_program->clip_distance_mask);
+ wined3d_context_gl_enable_clip_distances(context_gl, glsl_program->clip_distance_mask);
}
else
{
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index c52e25d6ce2..2b01caa3e6e 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -693,7 +693,8 @@ void state_alpha_test(struct wined3d_context *context, const struct wined3d_stat
void state_clipping(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
{
- unsigned int enable_mask;
+ struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
+ uint32_t enable_mask;
if (use_vs(state) && !context->d3d_info->vs_clipping)
{
@@ -721,7 +722,7 @@ void state_clipping(struct wined3d_context *context, const struct wined3d_state
*/
enable_mask = state->render_states[WINED3D_RS_CLIPPING] ?
state->render_states[WINED3D_RS_CLIPPLANEENABLE] : 0;
- context_enable_clip_distances(context, enable_mask);
+ wined3d_context_gl_enable_clip_distances(context_gl, enable_mask);
}
static void state_specularenable(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
@@ -3864,6 +3865,7 @@ static void vdecl_miscpart(struct wined3d_context *context, const struct wined3d
static void vertexdeclaration(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
{
+ struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
const struct wined3d_gl_info *gl_info = context->gl_info;
BOOL useVertexShaderFunction = use_vs(state);
BOOL updateFog = FALSE;
@@ -3940,7 +3942,7 @@ static void vertexdeclaration(struct wined3d_context *context, const struct wine
/* Disable all clip planes to get defined results on all drivers. See comment in the
* state_clipping state handler
*/
- context_enable_clip_distances(context, 0);
+ wined3d_context_gl_enable_clip_distances(context_gl, 0);
if (!warned && state->render_states[WINED3D_RS_CLIPPLANEENABLE])
{
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 631573816c0..588d7e5b582 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2090,6 +2090,7 @@ void wined3d_context_gl_copy_bo_address(struct wined3d_context_gl *context_gl,
const struct wined3d_bo_address *dst, GLenum dst_binding,
const struct wined3d_bo_address *src, GLenum src_binding, size_t size) DECLSPEC_HIDDEN;
void wined3d_context_gl_destroy(struct wined3d_context_gl *context_gl) DECLSPEC_HIDDEN;
+void wined3d_context_gl_enable_clip_distances(struct wined3d_context_gl *context_gl, uint32_t mask) DECLSPEC_HIDDEN;
void wined3d_context_gl_free_fence(struct wined3d_fence *fence) DECLSPEC_HIDDEN;
void wined3d_context_gl_free_occlusion_query(struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN;
void wined3d_context_gl_free_pipeline_statistics_query(struct wined3d_pipeline_statistics_query *query) DECLSPEC_HIDDEN;
@@ -2249,7 +2250,6 @@ void context_draw_shaded_quad(struct wined3d_context *context, struct wined3d_te
void context_draw_textured_quad(struct wined3d_context *context, struct wined3d_texture_gl *texture_gl,
unsigned int sub_resource_idx, const RECT *src_rect, const RECT *dst_rect,
enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN;
-void context_enable_clip_distances(struct wined3d_context *context, unsigned int mask) DECLSPEC_HIDDEN;
void context_end_transform_feedback(struct wined3d_context *context) DECLSPEC_HIDDEN;
struct wined3d_context *context_get_current(void) DECLSPEC_HIDDEN;
DWORD context_get_tls_idx(void) DECLSPEC_HIDDEN;
--
2.11.0
1
0
June 10, 2019
From: Michael Muller <michael(a)fds-team.de>
Signed-off-by: David Adam <david.adam.cnrs(a)gmail.com>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/ddraw/ddraw.c | 2 ++
dlls/ddraw/tests/ddraw1.c | 26 ++++++++++++++++++++++++++
dlls/ddraw/tests/ddraw2.c | 25 +++++++++++++++++++++++++
dlls/ddraw/tests/ddraw4.c | 26 ++++++++++++++++++++++++++
dlls/ddraw/tests/ddraw7.c | 26 ++++++++++++++++++++++++++
5 files changed, 105 insertions(+)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 04a94b6978f..8dce5ce8f82 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -1510,6 +1510,8 @@ static HRESULT WINAPI ddraw7_GetCaps(IDirectDraw7 *iface, DDCAPS *DriverCaps, DD
caps.dwCaps |= DDCAPS_ALIGNSTRIDE;
caps.dwAlignStrideAlign = DDRAW_STRIDE_ALIGNMENT;
+ caps.ddsOldCaps.dwCaps = caps.ddsCaps.dwCaps;
+
if(DriverCaps)
{
DD_STRUCT_COPY_BYSIZE(DriverCaps, &caps);
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index 68428e29650..860e101159f 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -12874,6 +12874,31 @@ static void test_clipper_refcount(void)
DestroyWindow(window);
}
+static void test_caps(void)
+{
+ DDCAPS hal_caps, hel_caps;
+ IDirectDraw *ddraw;
+ HRESULT hr;
+
+ ddraw = create_ddraw();
+ ok(!!ddraw, "Failed to create a ddraw object.\n");
+
+ memset(&hal_caps, 0, sizeof(hal_caps));
+ memset(&hel_caps, 0, sizeof(hel_caps));
+ hal_caps.dwSize = sizeof(hal_caps);
+ hel_caps.dwSize = sizeof(hel_caps);
+ hr = IDirectDraw_GetCaps(ddraw, &hal_caps, &hel_caps);
+ ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+ ok(hal_caps.ddsOldCaps.dwCaps == hal_caps.ddsCaps.dwCaps,
+ "Got unexpected caps %#x, expected %#x.\n",
+ hal_caps.ddsOldCaps.dwCaps, hal_caps.ddsCaps.dwCaps);
+ ok(hel_caps.ddsOldCaps.dwCaps == hel_caps.ddsCaps.dwCaps,
+ "Got unexpected caps %#x, expected %#x.\n",
+ hel_caps.ddsOldCaps.dwCaps, hel_caps.ddsCaps.dwCaps);
+
+ IDirectDraw_Release(ddraw);
+}
+
START_TEST(ddraw1)
{
DDDEVICEIDENTIFIER identifier;
@@ -12984,4 +13009,5 @@ START_TEST(ddraw1)
test_gdi_surface();
test_alphatest();
test_clipper_refcount();
+ test_caps();
}
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index d0569493268..2c047a5e1ff 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -13750,6 +13750,30 @@ static void test_clipper_refcount(void)
DestroyWindow(window);
}
+static void test_caps(void)
+{
+ DDCAPS hal_caps, hel_caps;
+ IDirectDraw2 *ddraw;
+ HRESULT hr;
+
+ ddraw = create_ddraw();
+ ok(!!ddraw, "Failed to create a ddraw object.\n");
+
+ memset(&hal_caps, 0, sizeof(hal_caps));
+ memset(&hel_caps, 0, sizeof(hel_caps));
+ hal_caps.dwSize = sizeof(hal_caps);
+ hel_caps.dwSize = sizeof(hel_caps);
+ hr = IDirectDraw2_GetCaps(ddraw, &hal_caps, &hel_caps);
+ ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+ ok(hal_caps.ddsOldCaps.dwCaps == hal_caps.ddsCaps.dwCaps,
+ "Got unexpected caps %#x, expected %#x.\n",
+ hal_caps.ddsOldCaps.dwCaps, hal_caps.ddsCaps.dwCaps);
+ ok(hel_caps.ddsOldCaps.dwCaps == hel_caps.ddsCaps.dwCaps,
+ "Got unexpected caps %#x, expected %#x.\n",
+ hel_caps.ddsOldCaps.dwCaps, hel_caps.ddsCaps.dwCaps);
+
+ IDirectDraw2_Release(ddraw);
+}
START_TEST(ddraw2)
{
@@ -13868,4 +13892,5 @@ START_TEST(ddraw2)
test_gdi_surface();
test_alphatest();
test_clipper_refcount();
+ test_caps();
}
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index 823af434dbb..fa6cca60db4 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -16170,6 +16170,31 @@ static void test_clipper_refcount(void)
DestroyWindow(window);
}
+static void test_caps(void)
+{
+ DDCAPS hal_caps, hel_caps;
+ IDirectDraw4 *ddraw;
+ HRESULT hr;
+
+ ddraw = create_ddraw();
+ ok(!!ddraw, "Failed to create a ddraw object.\n");
+
+ memset(&hal_caps, 0, sizeof(hal_caps));
+ memset(&hel_caps, 0, sizeof(hel_caps));
+ hal_caps.dwSize = sizeof(hal_caps);
+ hel_caps.dwSize = sizeof(hel_caps);
+ hr = IDirectDraw4_GetCaps(ddraw, &hal_caps, &hel_caps);
+ ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+ ok(hal_caps.ddsOldCaps.dwCaps == hal_caps.ddsCaps.dwCaps,
+ "Got unexpected caps %#x, expected %#x.\n",
+ hal_caps.ddsOldCaps.dwCaps, hal_caps.ddsCaps.dwCaps);
+ ok(hel_caps.ddsOldCaps.dwCaps == hel_caps.ddsCaps.dwCaps,
+ "Got unexpected caps %#x, expected %#x.\n",
+ hel_caps.ddsOldCaps.dwCaps, hel_caps.ddsCaps.dwCaps);
+
+ IDirectDraw4_Release(ddraw);
+}
+
START_TEST(ddraw4)
{
DDDEVICEIDENTIFIER identifier;
@@ -16302,4 +16327,5 @@ START_TEST(ddraw4)
test_gdi_surface();
test_alphatest();
test_clipper_refcount();
+ test_caps();
}
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index e8c36dc39af..b0fc634eef7 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -16264,6 +16264,31 @@ static void test_begin_end_state_block(void)
DestroyWindow(window);
}
+static void test_caps(void)
+{
+ DDCAPS hal_caps, hel_caps;
+ IDirectDraw7 *ddraw;
+ HRESULT hr;
+
+ ddraw = create_ddraw();
+ ok(!!ddraw, "Failed to create a ddraw object.\n");
+
+ memset(&hal_caps, 0, sizeof(hal_caps));
+ memset(&hel_caps, 0, sizeof(hel_caps));
+ hal_caps.dwSize = sizeof(hal_caps);
+ hel_caps.dwSize = sizeof(hel_caps);
+ hr = IDirectDraw7_GetCaps(ddraw, &hal_caps, &hel_caps);
+ ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+ ok(hal_caps.ddsOldCaps.dwCaps == hal_caps.ddsCaps.dwCaps,
+ "Got unexpected caps %#x, expected %#x.\n",
+ hal_caps.ddsOldCaps.dwCaps, hal_caps.ddsCaps.dwCaps);
+ ok(hel_caps.ddsOldCaps.dwCaps == hel_caps.ddsCaps.dwCaps,
+ "Got unexpected caps %#x, expected %#x.\n",
+ hel_caps.ddsOldCaps.dwCaps, hel_caps.ddsCaps.dwCaps);
+
+ IDirectDraw7_Release(ddraw);
+}
+
START_TEST(ddraw7)
{
DDDEVICEIDENTIFIER2 identifier;
@@ -16410,4 +16435,5 @@ START_TEST(ddraw7)
test_alphatest();
test_clipper_refcount();
test_begin_end_state_block();
+ test_caps();
}
--
2.11.0
2
1