Compare commits

..

35 Commits

Author SHA1 Message Date
Sebastian Lackner
b22ec60228 Release 2.0-rc6. 2017-01-22 04:54:28 +01:00
Sebastian Lackner
15a75851db ntdll-_aulldvrm: Add missing ntoskrnl forwards. 2017-01-22 04:20:55 +01:00
Sebastian Lackner
5cd91c5928 Added patch to implement stub for QUERY_TYPE_PIPELINE_STATISTICS. 2017-01-22 02:51:58 +01:00
Sebastian Lackner
5e623ee4d9 Added patch to implement semi-stub for d3d11 context ResolveSubresource method. 2017-01-21 23:56:59 +01:00
Sebastian Lackner
2677244e40 Added patch to fix crash when trying to rendering without render target. 2017-01-21 23:30:12 +01:00
Sebastian Lackner
65a5de8630 Added patch to implement ntdll._aulldvrm. 2017-01-21 22:56:05 +01:00
Sebastian Lackner
b2341b8d08 Added patch to fix ordinal number of winmm.PlaySoundA. 2017-01-21 21:21:20 +01:00
Sebastian Lackner
c4de5ab774 winecfg-Staging: Add ' (Staging)' suffix in about dialog. 2017-01-21 21:17:51 +01:00
Sebastian Lackner
f3854126b1 Added patch to print process arguments in winedbg backtraces. 2017-01-21 20:20:13 +01:00
Sebastian Lackner
c40429f3c9 Added patch with multiple fixes for ole32 property storage. 2017-01-21 19:24:12 +01:00
Sebastian Lackner
d1af5f06fa ddraw-FlipToGDISurface: Update patchset and missing NULL pointer check. 2017-01-20 20:49:08 +01:00
Sebastian Lackner
af5ec899c3 winex11-MWM_Decorations: Update patchset. 2017-01-20 20:34:06 +01:00
Sebastian Lackner
3c781f3862 Added patch to implement semi-stubs for D3D11 deferred context. 2017-01-20 17:22:51 +01:00
Sebastian Lackner
7257898858 Added patch to fix DrawIndexedPrimitiveUP with non-zero min_vertex_idx. 2017-01-20 07:53:43 +01:00
Sebastian Lackner
3ad216bb25 patchutils.py: Fix Python 3 compatibility. 2017-01-20 05:00:18 +01:00
Sebastian Lackner
32823d7014 Rebase against 3ba2b5898cf9c78f81afc1fd620e5046a3392be0. 2017-01-20 04:58:12 +01:00
Sebastian Lackner
efca1a6845 patchutils.py: Generate more compact autogenerated patches. 2017-01-20 02:00:52 +01:00
Sebastian Lackner
76177e1da2 Added patch to relax dwSize validation ddraw_surface*_Lock. 2017-01-19 15:46:19 +01:00
Sebastian Lackner
dbaede0fc8 dxva2-Video_Decoder: Fixes for Makefile.in. 2017-01-19 11:57:31 +01:00
Sebastian Lackner
5353b4a5a4 widl-SLTG_Typelib_Support: Fixes for Makefile.in. 2017-01-19 11:37:50 +01:00
Sebastian Lackner
910abaa327 nvcuda-CUDA_Support: Fixes for Makefile.in. 2017-01-19 11:32:46 +01:00
Sebastian Lackner
6db72e951e bcrypt-Improvements: Add missing ncrypt forwards. 2017-01-19 11:02:48 +01:00
Sebastian Lackner
b9514dd7b0 patchinstall.sh: Further replacements echo -> printf.
Also remove a broken link.
2017-01-19 10:21:47 +01:00
Sebastian Lackner
76a233502e patchupdate.py: Use printf instead of echo to workaround bash/dash incompatibilities. 2017-01-19 09:15:23 +01:00
Sebastian Lackner
c0993595fe Added patch to implement msvcrt.nan functions. 2017-01-19 07:29:21 +01:00
Sebastian Lackner
49ba202882 Added patch to fix return type of shlwapi.SHAddDataBlock.
Also fixes parsing of multiline From: headers in staging/patchutils.py.
2017-01-19 07:17:02 +01:00
Sebastian Lackner
80a4e6bdd7 Added patch to fix calling function with instance and VARIANT return type in DispCallFunc. 2017-01-19 06:09:18 +01:00
Sebastian Lackner
0c4032f598 Rebase against 274a82b33c2907a2d28a50ba6919711cfabf1b20. 2017-01-18 23:41:07 +01:00
Sebastian Lackner
96bce84236 Added patch to fix API signature of ntdll.NtAllocateUuids. 2017-01-18 23:27:48 +01:00
Sebastian Lackner
e0e48313df vulkan-Vulkan_Implementation: Do not use conversion for ignored fields. 2017-01-18 20:56:21 +01:00
Sebastian Lackner
105afd2146 iphlpapi-TCP_Table: Fix a test failure. 2017-01-18 17:45:06 +01:00
Sebastian Lackner
966293c5d3 Rebase against b510dccecbfe80c26b030b78b903b38350d41012. 2017-01-18 16:52:22 +01:00
Sebastian Lackner
b19d0ea3ca Rebase against c3e6ecde36692d03dc360200c7a7044a02c4a392. 2017-01-16 23:23:59 +01:00
Sebastian Lackner
e745798070 ntdll-Grow_Virtual_Heap: Never attempt to release or decommit memory of a subheap.
This fixes a possible memory leak.
2017-01-16 05:01:38 +01:00
Sebastian Lackner
bb54734bd3 user32-Auto_Radio_Button: Add a missing Fixes line. 2017-01-16 02:34:33 +01:00
74 changed files with 6655 additions and 1993 deletions

View File

@@ -1,4 +1,4 @@
From b6efa0b8bb1bba73863ca985c13d46a5eaec4198 Mon Sep 17 00:00:00 2001
From c178117abacbf8644ae05429999ff8e8f8585a7e Mon Sep 17 00:00:00 2001
From: Hans Leidekker <hans@codeweavers.com>
Date: Mon, 19 Dec 2016 19:38:52 +0100
Subject: bcrypt: Add AES provider.
@@ -7,11 +7,12 @@ Subject: bcrypt: Add AES provider.
dlls/bcrypt/bcrypt.spec | 10 +-
dlls/bcrypt/bcrypt_main.c | 347 ++++++++++++++++++++++++++++++++++++++++++++-
dlls/bcrypt/tests/bcrypt.c | 18 +--
dlls/ncrypt/ncrypt.spec | 10 +-
include/bcrypt.h | 3 +
4 files changed, 352 insertions(+), 26 deletions(-)
5 files changed, 357 insertions(+), 31 deletions(-)
diff --git a/dlls/bcrypt/bcrypt.spec b/dlls/bcrypt/bcrypt.spec
index e299fe0..962953e 100644
index e299fe0cce8..962953e509b 100644
--- a/dlls/bcrypt/bcrypt.spec
+++ b/dlls/bcrypt/bcrypt.spec
@@ -5,15 +5,15 @@
@@ -52,7 +53,7 @@ index e299fe0..962953e 100644
@ stub BCryptUnregisterConfigChangeNotify
@ stub BCryptUnregisterProvider
diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c
index 6023c94..937bdf7 100644
index 6023c942e49..5e066283f6e 100644
--- a/dlls/bcrypt/bcrypt_main.c
+++ b/dlls/bcrypt/bcrypt_main.c
@@ -49,6 +49,10 @@ WINE_DECLARE_DEBUG_CHANNEL(winediag);
@@ -498,7 +499,7 @@ index 6023c94..937bdf7 100644
{
switch (reason)
diff --git a/dlls/bcrypt/tests/bcrypt.c b/dlls/bcrypt/tests/bcrypt.c
index 3e41335..2668153 100644
index 422f2cfd340..d2df74ed919 100644
--- a/dlls/bcrypt/tests/bcrypt.c
+++ b/dlls/bcrypt/tests/bcrypt.c
@@ -780,7 +780,7 @@ static void test_aes(void)
@@ -510,7 +511,7 @@ index 3e41335..2668153 100644
alg = NULL;
ret = pBCryptOpenAlgorithmProvider(&alg, BCRYPT_AES_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0);
ok(ret == STATUS_SUCCESS, "got %08x\n", ret);
@@ -828,7 +828,6 @@ todo_wine {
@@ -814,7 +814,6 @@ todo_wine {
ret = pBCryptCloseAlgorithmProvider(alg, 0);
ok(ret == STATUS_SUCCESS, "got %08x\n", ret);
}
@@ -518,7 +519,7 @@ index 3e41335..2668153 100644
static void test_BCryptGenerateSymmetricKey(void)
{
@@ -847,11 +846,6 @@ static void test_BCryptGenerateSymmetricKey(void)
@@ -833,11 +832,6 @@ static void test_BCryptGenerateSymmetricKey(void)
NTSTATUS ret;
ret = pBCryptOpenAlgorithmProvider(&aes, BCRYPT_AES_ALGORITHM, NULL, 0);
@@ -530,7 +531,7 @@ index 3e41335..2668153 100644
ok(ret == STATUS_SUCCESS, "got %08x\n", ret);
len = size = 0xdeadbeef;
@@ -936,11 +930,6 @@ static void test_BCryptEncrypt(void)
@@ -922,11 +916,6 @@ static void test_BCryptEncrypt(void)
NTSTATUS ret;
ret = pBCryptOpenAlgorithmProvider(&aes, BCRYPT_AES_ALGORITHM, NULL, 0);
@@ -542,7 +543,7 @@ index 3e41335..2668153 100644
ok(ret == STATUS_SUCCESS, "got %08x\n", ret);
len = 0xdeadbeef;
@@ -1027,11 +1016,6 @@ static void test_BCryptDecrypt(void)
@@ -1013,11 +1002,6 @@ static void test_BCryptDecrypt(void)
NTSTATUS ret;
ret = pBCryptOpenAlgorithmProvider(&aes, BCRYPT_AES_ALGORITHM, NULL, 0);
@@ -554,8 +555,51 @@ index 3e41335..2668153 100644
ok(ret == STATUS_SUCCESS, "got %08x\n", ret);
len = 0xdeadbeef;
diff --git a/dlls/ncrypt/ncrypt.spec b/dlls/ncrypt/ncrypt.spec
index 04127608d68..60b7eb37075 100644
--- a/dlls/ncrypt/ncrypt.spec
+++ b/dlls/ncrypt/ncrypt.spec
@@ -5,17 +5,17 @@
@ stub BCryptConfigureContextFunction
@ stub BCryptCreateContext
@ stdcall BCryptCreateHash(ptr ptr ptr long ptr long long) bcrypt.BCryptCreateHash
-@ stub BCryptDecrypt
+@ stdcall BCryptDecrypt(ptr ptr long ptr ptr long ptr long ptr long) bcrypt.BCryptDecrypt
@ stub BCryptDeleteContext
@ stub BCryptDeriveKey
@ stub BCryptDeriveKeyCapi
@ stub BCryptDeriveKeyPBKDF2
@ stdcall BCryptDestroyHash(ptr) bcrypt.BCryptDestroyHash
-@ stub BCryptDestroyKey
+@ stdcall BCryptDestroyKey(ptr) bcrypt.BCryptDestroyKey
@ stub BCryptDestroySecret
@ stub BCryptDuplicateHash
@ stub BCryptDuplicateKey
-@ stub BCryptEncrypt
+@ stdcall BCryptEncrypt(ptr ptr long ptr ptr long ptr long ptr long) bcrypt.BCryptEncrypt
@ stdcall BCryptEnumAlgorithms(long ptr ptr long) bcrypt.BCryptEnumAlgorithms
@ stub BCryptEnumContextFunctionProviders
@ stub BCryptEnumContextFunctions
@@ -28,7 +28,7 @@
@ stub BCryptFreeBuffer
@ stdcall BCryptGenRandom(ptr ptr long long) bcrypt.BCryptGenRandom
@ stub BCryptGenerateKeyPair
-@ stub BCryptGenerateSymmetricKey
+@ stdcall BCryptGenerateSymmetricKey(ptr ptr ptr long ptr long long) bcrypt.BCryptGenerateSymmetricKey
@ stdcall BCryptGetFipsAlgorithmMode(ptr) bcrypt.BCryptGetFipsAlgorithmMode
@ stdcall BCryptGetProperty(ptr wstr ptr long ptr long) bcrypt.BCryptGetProperty
@ stdcall BCryptHash(ptr ptr long ptr long ptr long) bcrypt.BCryptHash
@@ -49,7 +49,7 @@
@ stub BCryptSecretAgreement
@ stub BCryptSetAuditingInterface
@ stub BCryptSetContextFunctionProperty
-@ stub BCryptSetProperty
+@ stdcall BCryptSetProperty(ptr wstr ptr long long) bcrypt.BCryptSetProperty
@ stub BCryptSignHash
@ stub BCryptUnregisterConfigChangeNotify
@ stub BCryptUnregisterProvider
diff --git a/include/bcrypt.h b/include/bcrypt.h
index 05d0691..6af85e3 100644
index 05d0691f9c3..6af85e36143 100644
--- a/include/bcrypt.h
+++ b/include/bcrypt.h
@@ -74,6 +74,9 @@ typedef LONG NTSTATUS;
@@ -569,5 +613,5 @@ index 05d0691..6af85e3 100644
typedef struct _BCRYPT_ALGORITHM_IDENTIFIER
{
--
2.9.0
2.11.0

View File

@@ -1,4 +1,4 @@
From ecff30df4deadc0df006a880a5528343a4ab788f Mon Sep 17 00:00:00 2001
From 3439b4e5a1fd05c4fb68491c3814de2581e8a5aa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Tue, 20 Dec 2016 02:36:57 +0100
Subject: bcrypt: Add internal fallback implementation for hash calculations.
@@ -17,7 +17,7 @@ Subject: bcrypt: Add internal fallback implementation for hash calculations.
create mode 100644 dlls/bcrypt/sha512.c
diff --git a/dlls/bcrypt/Makefile.in b/dlls/bcrypt/Makefile.in
index ef9d7ea..38753bd 100644
index ef9d7ead6bc..f54fc5cd482 100644
--- a/dlls/bcrypt/Makefile.in
+++ b/dlls/bcrypt/Makefile.in
@@ -4,6 +4,9 @@ IMPORTLIB = bcrypt
@@ -27,13 +27,13 @@ index ef9d7ea..38753bd 100644
- bcrypt_main.c
+ bcrypt_main.c \
+ sha256.c \
+ sha512.c \
+ sha384.c
+ sha384.c \
+ sha512.c
RC_SRCS = version.rc
diff --git a/dlls/bcrypt/bcrypt_internal.h b/dlls/bcrypt/bcrypt_internal.h
new file mode 100644
index 0000000..8a8f6d1
index 00000000000..8a8f6d170c4
--- /dev/null
+++ b/dlls/bcrypt/bcrypt_internal.h
@@ -0,0 +1,79 @@
@@ -117,7 +117,7 @@ index 0000000..8a8f6d1
+
+#endif /* __BCRYPT_INTERNAL_H */
diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c
index af2314a..9441cf0 100644
index 1f22063dbda..fbaece21f47 100644
--- a/dlls/bcrypt/bcrypt_main.c
+++ b/dlls/bcrypt/bcrypt_main.c
@@ -36,6 +36,8 @@
@@ -251,7 +251,7 @@ index af2314a..9441cf0 100644
diff --git a/dlls/bcrypt/sha256.c b/dlls/bcrypt/sha256.c
new file mode 100644
index 0000000..48c4a48
index 00000000000..48c4a48d031
--- /dev/null
+++ b/dlls/bcrypt/sha256.c
@@ -0,0 +1,169 @@
@@ -426,7 +426,7 @@ index 0000000..48c4a48
+}
diff --git a/dlls/bcrypt/sha384.c b/dlls/bcrypt/sha384.c
new file mode 100644
index 0000000..81e7e08
index 00000000000..81e7e08fd07
--- /dev/null
+++ b/dlls/bcrypt/sha384.c
@@ -0,0 +1,41 @@
@@ -473,7 +473,7 @@ index 0000000..81e7e08
+}
diff --git a/dlls/bcrypt/sha512.c b/dlls/bcrypt/sha512.c
new file mode 100644
index 0000000..fdd7867
index 00000000000..fdd7867eab7
--- /dev/null
+++ b/dlls/bcrypt/sha512.c
@@ -0,0 +1,191 @@
@@ -669,5 +669,5 @@ index 0000000..fdd7867
+ }
+}
--
2.9.0
2.11.0

View File

@@ -1,4 +1,4 @@
From 9331e2a78e8ec0ba29ed1041a9f851ffd39cc249 Mon Sep 17 00:00:00 2001
From 3dc21336baced97a110773ac9e72db210a56af82 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Tue, 20 Dec 2016 03:59:19 +0100
Subject: bcrypt: Implement BCryptDuplicateHash.
@@ -7,10 +7,11 @@ FIXME: Should we check for NULL pointers?
---
dlls/bcrypt/bcrypt.spec | 2 +-
dlls/bcrypt/bcrypt_main.c | 18 ++++++++++++++++++
2 files changed, 19 insertions(+), 1 deletion(-)
dlls/ncrypt/ncrypt.spec | 2 +-
3 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/dlls/bcrypt/bcrypt.spec b/dlls/bcrypt/bcrypt.spec
index 962953e..9ecd21d 100644
index 962953e509b..9ecd21d767c 100644
--- a/dlls/bcrypt/bcrypt.spec
+++ b/dlls/bcrypt/bcrypt.spec
@@ -11,7 +11,7 @@
@@ -23,7 +24,7 @@ index 962953e..9ecd21d 100644
@ stdcall BCryptEncrypt(ptr ptr long ptr ptr long ptr long ptr long)
@ stdcall BCryptEnumAlgorithms(long ptr ptr long)
diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c
index 3e2b22d..944a9ea 100644
index 4f09948096c..3eb0135b37c 100644
--- a/dlls/bcrypt/bcrypt_main.c
+++ b/dlls/bcrypt/bcrypt_main.c
@@ -672,6 +672,24 @@ end:
@@ -51,6 +52,19 @@ index 3e2b22d..944a9ea 100644
NTSTATUS WINAPI BCryptDestroyHash( BCRYPT_HASH_HANDLE handle )
{
struct hash *hash = handle;
diff --git a/dlls/ncrypt/ncrypt.spec b/dlls/ncrypt/ncrypt.spec
index 60b7eb37075..1a78853bf49 100644
--- a/dlls/ncrypt/ncrypt.spec
+++ b/dlls/ncrypt/ncrypt.spec
@@ -13,7 +13,7 @@
@ stdcall BCryptDestroyHash(ptr) bcrypt.BCryptDestroyHash
@ stdcall BCryptDestroyKey(ptr) bcrypt.BCryptDestroyKey
@ stub BCryptDestroySecret
-@ stub BCryptDuplicateHash
+@ stdcall BCryptDuplicateHash(ptr ptr ptr long long) bcrypt.BCryptDuplicateHash
@ stub BCryptDuplicateKey
@ stdcall BCryptEncrypt(ptr ptr long ptr ptr long ptr long ptr long) bcrypt.BCryptEncrypt
@ stdcall BCryptEnumAlgorithms(long ptr ptr long) bcrypt.BCryptEnumAlgorithms
--
2.9.0
2.11.0

View File

@@ -1,4 +1,4 @@
From e930551dfa4e0bb97db71d056a4ed59f9e459e01 Mon Sep 17 00:00:00 2001
From 6d590beb24ef04948fe8e05fff3a72c1d415a7c1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Mon, 26 Dec 2016 08:28:24 +0100
Subject: bcrypt: Implement BCryptDuplicateKey.
@@ -6,10 +6,11 @@ Subject: bcrypt: Implement BCryptDuplicateKey.
---
dlls/bcrypt/bcrypt.spec | 2 +-
dlls/bcrypt/bcrypt_main.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 50 insertions(+), 1 deletion(-)
dlls/ncrypt/ncrypt.spec | 2 +-
3 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/dlls/bcrypt/bcrypt.spec b/dlls/bcrypt/bcrypt.spec
index 9ecd21d..f5911d2 100644
index 9ecd21d767c..f5911d2cd40 100644
--- a/dlls/bcrypt/bcrypt.spec
+++ b/dlls/bcrypt/bcrypt.spec
@@ -12,7 +12,7 @@
@@ -22,7 +23,7 @@ index 9ecd21d..f5911d2 100644
@ stdcall BCryptEnumAlgorithms(long ptr ptr long)
@ stub BCryptEnumContextFunctionProviders
diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c
index 198b010..37d6909 100644
index 198b010b27e..37d69095f7a 100644
--- a/dlls/bcrypt/bcrypt_main.c
+++ b/dlls/bcrypt/bcrypt_main.c
@@ -915,6 +915,24 @@ static NTSTATUS key_init( struct key *key, struct algorithm *alg, UCHAR *secret,
@@ -95,6 +96,19 @@ index 198b010..37d6909 100644
NTSTATUS WINAPI BCryptDestroyKey( BCRYPT_KEY_HANDLE handle )
{
struct key *key = handle;
diff --git a/dlls/ncrypt/ncrypt.spec b/dlls/ncrypt/ncrypt.spec
index 1a78853bf49..b14a332e18f 100644
--- a/dlls/ncrypt/ncrypt.spec
+++ b/dlls/ncrypt/ncrypt.spec
@@ -14,7 +14,7 @@
@ stdcall BCryptDestroyKey(ptr) bcrypt.BCryptDestroyKey
@ stub BCryptDestroySecret
@ stdcall BCryptDuplicateHash(ptr ptr ptr long long) bcrypt.BCryptDuplicateHash
-@ stub BCryptDuplicateKey
+@ stdcall BCryptDuplicateKey(ptr ptr ptr long long) bcrypt.BCryptDuplicateKey
@ stdcall BCryptEncrypt(ptr ptr long ptr ptr long ptr long ptr long) bcrypt.BCryptEncrypt
@ stdcall BCryptEnumAlgorithms(long ptr ptr long) bcrypt.BCryptEnumAlgorithms
@ stub BCryptEnumContextFunctionProviders
--
2.9.0
2.11.0

View File

@@ -1,132 +0,0 @@
From 1b05fa6764dc8eb220ef9dd349801fa2e76914bd Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sat, 17 Oct 2015 15:38:13 +0200
Subject: comctl32/tests: Add tests for PROPSHEET_InsertPage.
---
dlls/comctl32/tests/propsheet.c | 97 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 96 insertions(+), 1 deletion(-)
diff --git a/dlls/comctl32/tests/propsheet.c b/dlls/comctl32/tests/propsheet.c
index 6594298..8fdbae8 100644
--- a/dlls/comctl32/tests/propsheet.c
+++ b/dlls/comctl32/tests/propsheet.c
@@ -806,7 +806,7 @@ static void test_PSM_ADDPAGE(void)
psp.pfnDlgProc = page_dlg_proc_messages;
psp.lParam = 0;
- /* two page with the same data */
+ /* multiple pages with the same data */
hpsp[0] = CreatePropertySheetPageA(&psp);
hpsp[1] = CreatePropertySheetPageA(&psp);
hpsp[2] = CreatePropertySheetPageA(&psp);
@@ -878,6 +878,100 @@ if (0)
DestroyWindow(hdlg);
}
+static void test_PSM_INSERTPAGE(void)
+{
+ HPROPSHEETPAGE hpsp[5];
+ PROPSHEETPAGEA psp;
+ PROPSHEETHEADERA psh;
+ HWND hdlg, tab;
+ BOOL ret;
+ DWORD r;
+
+ memset(&psp, 0, sizeof(psp));
+ psp.dwSize = sizeof(psp);
+ psp.dwFlags = 0;
+ psp.hInstance = GetModuleHandleA(NULL);
+ U(psp).pszTemplate = (LPCSTR)MAKEINTRESOURCE(IDD_PROP_PAGE_MESSAGE_TEST);
+ U2(psp).pszIcon = NULL;
+ psp.pfnDlgProc = page_dlg_proc_messages;
+ psp.lParam = 0;
+
+ /* multiple pages with the same data */
+ hpsp[0] = CreatePropertySheetPageA(&psp);
+ hpsp[1] = CreatePropertySheetPageA(&psp);
+ hpsp[2] = CreatePropertySheetPageA(&psp);
+
+ U(psp).pszTemplate = (LPCSTR)MAKEINTRESOURCE(IDD_PROP_PAGE_ERROR);
+ hpsp[3] = CreatePropertySheetPageA(&psp);
+
+ psp.dwFlags = PSP_PREMATURE;
+ hpsp[4] = CreatePropertySheetPageA(&psp);
+
+ memset(&psh, 0, sizeof(psh));
+ psh.dwSize = PROPSHEETHEADERA_V1_SIZE;
+ psh.dwFlags = PSH_MODELESS;
+ psh.pszCaption = "test caption";
+ psh.nPages = 1;
+ psh.hwndParent = GetDesktopWindow();
+ U3(psh).phpage = hpsp;
+
+ hdlg = (HWND)PropertySheetA(&psh);
+ ok(hdlg != INVALID_HANDLE_VALUE, "got invalid handle %p\n", hdlg);
+
+ /* add pages one by one */
+ ret = SendMessageA(hdlg, PSM_INSERTPAGE, 5, (LPARAM)hpsp[1]);
+ todo_wine ok(ret == TRUE, "got %d\n", ret);
+
+ /* try with invalid values */
+ ret = SendMessageA(hdlg, PSM_INSERTPAGE, 0, 0);
+ ok(ret == FALSE, "got %d\n", ret);
+
+if (0)
+{
+ /* crashes on native */
+ ret = SendMessageA(hdlg, PSM_INSERTPAGE, 0, (LPARAM)INVALID_HANDLE_VALUE);
+}
+
+ ret = SendMessageA(hdlg, PSM_INSERTPAGE, (WPARAM)INVALID_HANDLE_VALUE, (LPARAM)hpsp[2]);
+ ok(ret == FALSE, "got %d\n", ret);
+
+ /* check item count */
+ tab = (HWND)SendMessageA(hdlg, PSM_GETTABCONTROL, 0, 0);
+
+ r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0);
+ todo_wine ok(r == 2, "got %d\n", r);
+
+ ret = SendMessageA(hdlg, PSM_INSERTPAGE, (WPARAM)hpsp[1], (LPARAM)hpsp[2]);
+ todo_wine ok(ret == TRUE, "got %d\n", ret);
+
+ r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0);
+ todo_wine ok(r == 3, "got %d\n", r);
+
+ /* add property sheet page that can't be created */
+ ret = SendMessageA(hdlg, PSM_INSERTPAGE, 1, (LPARAM)hpsp[3]);
+ todo_wine ok(ret == TRUE, "got %d\n", ret);
+
+ r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0);
+ todo_wine ok(r == 4, "got %d\n", r);
+
+ /* select page that can't be created */
+ ret = SendMessageA(hdlg, PSM_SETCURSEL, 1, 0);
+ todo_wine ok(ret == TRUE, "got %d\n", ret);
+
+ r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0);
+ todo_wine ok(r == 3, "got %d\n", r);
+
+ /* test PSP_PREMATURE flag with incorrect property sheet page */
+ ret = SendMessageA(hdlg, PSM_INSERTPAGE, 0, (LPARAM)hpsp[4]);
+ ok(ret == FALSE, "got %d\n", ret);
+
+ r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0);
+ todo_wine ok(r == 3, "got %d\n", r);
+
+ DestroyPropertySheetPage(hpsp[4]);
+ DestroyWindow(hdlg);
+}
+
START_TEST(propsheet)
{
test_title();
@@ -888,4 +982,5 @@ START_TEST(propsheet)
test_custom_default_button();
test_messages();
test_PSM_ADDPAGE();
+ test_PSM_INSERTPAGE();
}
--
2.6.2

View File

@@ -0,0 +1,174 @@
From 06cf41da9e0aeb09d3753132262d1b0e1207cd7f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Thu, 19 Jan 2017 16:54:42 +0100
Subject: wined3d: Add wined3d_resource_map_info function.
---
dlls/wined3d/buffer.c | 19 +++++++++++++++++++
dlls/wined3d/resource.c | 8 ++++++++
dlls/wined3d/texture.c | 31 +++++++++++++++++++++++++++++++
dlls/wined3d/wined3d.spec | 1 +
dlls/wined3d/wined3d_private.h | 2 ++
include/wine/wined3d.h | 9 +++++++++
6 files changed, 70 insertions(+)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 6883b4010a0..1924752a421 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -1405,6 +1405,24 @@ static HRESULT buffer_resource_sub_resource_map(struct wined3d_resource *resourc
return wined3d_buffer_map(buffer, offset, size, (BYTE **)&map_desc->data, flags);
}
+static HRESULT buffer_resource_sub_resource_map_info(struct wined3d_resource *resource, unsigned int sub_resource_idx,
+ struct wined3d_map_info *info, DWORD flags)
+{
+ struct wined3d_buffer *buffer = buffer_from_resource(resource);
+
+ if (sub_resource_idx)
+ {
+ WARN("Invalid sub_resource_idx %u.\n", sub_resource_idx);
+ return E_INVALIDARG;
+ }
+
+ info->row_pitch = buffer->desc.byte_width;
+ info->slice_pitch = buffer->desc.byte_width;
+ info->size = buffer->resource.size;
+
+ return WINED3D_OK;
+}
+
static HRESULT buffer_resource_sub_resource_unmap(struct wined3d_resource *resource, unsigned int sub_resource_idx)
{
if (sub_resource_idx)
@@ -1424,6 +1442,7 @@ static const struct wined3d_resource_ops buffer_resource_ops =
buffer_resource_preload,
buffer_unload,
buffer_resource_sub_resource_map,
+ buffer_resource_sub_resource_map_info,
buffer_resource_sub_resource_unmap,
};
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index ab64de07f41..51da49077ed 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -359,6 +359,14 @@ HRESULT CDECL wined3d_resource_map(struct wined3d_resource *resource, unsigned i
return wined3d_cs_map(resource->device->cs, resource, sub_resource_idx, map_desc, box, flags);
}
+HRESULT CDECL wined3d_resource_map_info(struct wined3d_resource *resource, unsigned int sub_resource_idx,
+ struct wined3d_map_info *info, DWORD flags)
+{
+ TRACE("resource %p, sub_resource_idx %u.\n", resource, sub_resource_idx);
+
+ return resource->resource_ops->resource_map_info(resource, sub_resource_idx, info, flags);
+}
+
HRESULT CDECL wined3d_resource_unmap(struct wined3d_resource *resource, unsigned int sub_resource_idx)
{
TRACE("resource %p, sub_resource_idx %u.\n", resource, sub_resource_idx);
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 8d5e37a4949..be301420858 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -2194,6 +2194,36 @@ static HRESULT texture_resource_sub_resource_map(struct wined3d_resource *resour
return WINED3D_OK;
}
+static HRESULT texture_resource_sub_resource_map_info(struct wined3d_resource *resource, unsigned int sub_resource_idx,
+ struct wined3d_map_info *info, DWORD flags)
+{
+ const struct wined3d_format *format = resource->format;
+ struct wined3d_texture_sub_resource *sub_resource;
+ unsigned int fmt_flags = resource->format_flags;
+ struct wined3d_texture *texture;
+ unsigned int texture_level;
+
+ texture = texture_from_resource(resource);
+ if (!(sub_resource = wined3d_texture_get_sub_resource(texture, sub_resource_idx)))
+ return E_INVALIDARG;
+
+ texture_level = sub_resource_idx % texture->level_count;
+
+ if (fmt_flags & WINED3DFMT_FLAG_BROKEN_PITCH)
+ {
+ info->row_pitch = wined3d_texture_get_level_width(texture, texture_level) * format->byte_count;
+ info->slice_pitch = wined3d_texture_get_level_height(texture, texture_level) * info->row_pitch;
+ }
+ else
+ {
+ wined3d_texture_get_pitch(texture, texture_level, &info->row_pitch, &info->slice_pitch);
+ }
+
+ info->size = info->slice_pitch * wined3d_texture_get_level_depth(texture, texture_level);
+
+ return WINED3D_OK;
+}
+
static HRESULT texture_resource_sub_resource_unmap(struct wined3d_resource *resource, unsigned int sub_resource_idx)
{
struct wined3d_texture_sub_resource *sub_resource;
@@ -2253,6 +2283,7 @@ static const struct wined3d_resource_ops texture_resource_ops =
texture_resource_preload,
wined3d_texture_unload,
texture_resource_sub_resource_map,
+ texture_resource_sub_resource_map_info,
texture_resource_sub_resource_unmap,
};
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index 05df9f3db7e..e51380304b1 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -187,6 +187,7 @@
@ cdecl wined3d_resource_get_parent(ptr)
@ cdecl wined3d_resource_get_priority(ptr)
@ cdecl wined3d_resource_map(ptr long ptr ptr long)
+@ cdecl wined3d_resource_map_info(ptr long ptr long)
@ cdecl wined3d_resource_preload(ptr)
@ cdecl wined3d_resource_set_parent(ptr ptr)
@ cdecl wined3d_resource_set_priority(ptr long)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index ff61d9d872b..65f95004b44 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2639,6 +2639,8 @@ struct wined3d_resource_ops
void (*resource_unload)(struct wined3d_resource *resource);
HRESULT (*resource_sub_resource_map)(struct wined3d_resource *resource, unsigned int sub_resource_idx,
struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags);
+ HRESULT (*resource_map_info)(struct wined3d_resource *resource, unsigned int sub_resource_idx,
+ struct wined3d_map_info *info, DWORD flags);
HRESULT (*resource_sub_resource_unmap)(struct wined3d_resource *resource, unsigned int sub_resource_idx);
};
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 8c8fbcbe7e5..fff39e2fa0f 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -1746,6 +1746,13 @@ struct wined3d_map_desc
void *data;
};
+struct wined3d_map_info
+{
+ UINT row_pitch;
+ UINT slice_pitch;
+ UINT size;
+};
+
struct wined3d_sub_resource_data
{
const void *data;
@@ -2431,6 +2438,8 @@ void * __cdecl wined3d_resource_get_parent(const struct wined3d_resource *resour
DWORD __cdecl wined3d_resource_get_priority(const struct wined3d_resource *resource);
HRESULT __cdecl wined3d_resource_map(struct wined3d_resource *resource, unsigned int sub_resource_idx,
struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags);
+HRESULT __cdecl wined3d_resource_map_info(struct wined3d_resource *resource, unsigned int sub_resource_idx,
+ struct wined3d_map_info *info, DWORD flags);
void __cdecl wined3d_resource_preload(struct wined3d_resource *resource);
void __cdecl wined3d_resource_set_parent(struct wined3d_resource *resource, void *parent);
DWORD __cdecl wined3d_resource_set_priority(struct wined3d_resource *resource, DWORD priority);
--
2.11.0

View File

@@ -0,0 +1 @@
Fixes: Add semi-stub for D3D11 deferred context implementation

View File

@@ -0,0 +1,41 @@
From d16a0f5f4bde197dbdda7b61d8c6b69bbc9be128 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Sat, 21 Jan 2017 22:43:12 +0100
Subject: d3d11: Implement ResolveSubresource by copying sub resource (there is
no multisample texture support yet).
---
dlls/d3d11/device.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index 777146d717e..9ad2b2ecaa5 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -1120,10 +1120,22 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_ResolveSubresource(ID3D11D
ID3D11Resource *src_resource, UINT src_subresource_idx,
DXGI_FORMAT format)
{
- FIXME("iface %p, dst_resource %p, dst_subresource_idx %u, src_resource %p, src_subresource_idx %u, "
+ struct d3d_device *device = device_from_immediate_ID3D11DeviceContext(iface);
+ struct wined3d_resource *wined3d_dst_resource, *wined3d_src_resource;
+
+ TRACE("iface %p, dst_resource %p, dst_subresource_idx %u, src_resource %p, src_subresource_idx %u, "
"format %s stub!\n",
iface, dst_resource, dst_subresource_idx, src_resource, src_subresource_idx,
debug_dxgi_format(format));
+
+ wined3d_dst_resource = wined3d_resource_from_d3d11_resource(dst_resource);
+ wined3d_src_resource = wined3d_resource_from_d3d11_resource(src_resource);
+
+ /* Multisampled textures are not supported yet, so simply copy the sub resource */
+ wined3d_mutex_lock();
+ wined3d_device_copy_sub_resource_region(device->wined3d_device, wined3d_dst_resource, dst_subresource_idx,
+ 0, 0, 0, wined3d_src_resource, src_subresource_idx, NULL);
+ wined3d_mutex_unlock();
}
static void STDMETHODCALLTYPE d3d11_immediate_context_ExecuteCommandList(ID3D11DeviceContext *iface,
--
2.11.0

View File

@@ -0,0 +1 @@
Fixes: Implement semi-stub for d3d11 context ResolveSubresource method.

View File

@@ -0,0 +1,58 @@
From 5c5620766e4e3be85bdec4aab689b9f5b42b2f2b Mon Sep 17 00:00:00 2001
From: Matteo Bruni <mbruni@codeweavers.com>
Date: Wed, 18 Jan 2017 21:35:28 +0100
Subject: d3d9: Fix DrawIndexedPrimitiveUP with non-zero min_vertex_idx.
Signed-off-by: Matteo Bruni <mbruni@codeweavers.com>
---
dlls/d3d9/device.c | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index e0bc5859c61..e646cb76c76 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -2485,18 +2485,16 @@ static HRESULT WINAPI d3d9_device_DrawIndexedPrimitiveUP(IDirect3DDevice9Ex *ifa
UINT primitive_count, const void *index_data, D3DFORMAT index_format,
const void *vertex_data, UINT vertex_stride)
{
- struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface);
- HRESULT hr;
UINT idx_count = vertex_count_from_primitive_count(primitive_type, primitive_count);
+ struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface);
UINT idx_fmt_size = index_format == D3DFMT_INDEX16 ? 2 : 4;
+ UINT vtx_size = vertex_count * vertex_stride;
UINT idx_size = idx_count * idx_fmt_size;
struct wined3d_map_desc wined3d_map_desc;
struct wined3d_box wined3d_box = {0};
struct wined3d_resource *ib, *vb;
- UINT ib_pos;
-
- UINT vtx_size = vertex_count * vertex_stride;
- UINT vb_pos, align;
+ UINT vb_pos, ib_pos, align;
+ HRESULT hr;
TRACE("iface %p, primitive_type %#x, min_vertex_idx %u, vertex_count %u, primitive_count %u, "
"index_data %p, index_format %#x, vertex_data %p, vertex_stride %u.\n",
@@ -2536,7 +2534,7 @@ static HRESULT WINAPI d3d9_device_DrawIndexedPrimitiveUP(IDirect3DDevice9Ex *ifa
if (FAILED(hr = wined3d_resource_map(vb, 0, &wined3d_map_desc, &wined3d_box,
vb_pos ? WINED3D_MAP_NOOVERWRITE : WINED3D_MAP_DISCARD)))
goto done;
- memcpy(wined3d_map_desc.data, vertex_data, vtx_size);
+ memcpy(wined3d_map_desc.data, (char *)vertex_data + min_vertex_idx * vertex_stride, vtx_size);
wined3d_resource_unmap(vb, 0);
device->vertex_buffer_pos = vb_pos + vtx_size;
@@ -2568,7 +2566,7 @@ static HRESULT WINAPI d3d9_device_DrawIndexedPrimitiveUP(IDirect3DDevice9Ex *ifa
wined3d_device_set_index_buffer(device->wined3d_device, device->index_buffer,
wined3dformat_from_d3dformat(index_format), 0);
- wined3d_device_set_base_vertex_index(device->wined3d_device, vb_pos / vertex_stride);
+ wined3d_device_set_base_vertex_index(device->wined3d_device, vb_pos / vertex_stride - min_vertex_idx);
wined3d_device_set_primitive_type(device->wined3d_device, primitive_type);
hr = wined3d_device_draw_indexed_primitive(device->wined3d_device, ib_pos / idx_fmt_size, idx_count);
--
2.11.0

View File

@@ -0,0 +1,58 @@
From 6ab43f9745b48a8646b54c1a072a07ddd96e333b Mon Sep 17 00:00:00 2001
From: Matteo Bruni <mbruni@codeweavers.com>
Date: Wed, 18 Jan 2017 21:35:29 +0100
Subject: d3d8: Fix DrawIndexedPrimitiveUP with non-zero min_vertex_idx.
Signed-off-by: Matteo Bruni <mbruni@codeweavers.com>
---
dlls/d3d8/device.c | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index 43b8e2be4bb..805694b8536 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -2124,18 +2124,16 @@ static HRESULT WINAPI d3d8_device_DrawIndexedPrimitiveUP(IDirect3DDevice8 *iface
UINT primitive_count, const void *index_data, D3DFORMAT index_format,
const void *vertex_data, UINT vertex_stride)
{
- struct d3d8_device *device = impl_from_IDirect3DDevice8(iface);
- HRESULT hr;
UINT idx_count = vertex_count_from_primitive_count(primitive_type, primitive_count);
+ struct d3d8_device *device = impl_from_IDirect3DDevice8(iface);
UINT idx_fmt_size = index_format == D3DFMT_INDEX16 ? 2 : 4;
+ UINT vtx_size = vertex_count * vertex_stride;
UINT idx_size = idx_count * idx_fmt_size;
struct wined3d_map_desc wined3d_map_desc;
struct wined3d_box wined3d_box = {0};
struct wined3d_resource *ib, *vb;
- UINT ib_pos;
-
- UINT vtx_size = vertex_count * vertex_stride;
- UINT vb_pos, align;
+ UINT vb_pos, ib_pos, align;
+ HRESULT hr;
TRACE("iface %p, primitive_type %#x, min_vertex_idx %u, vertex_count %u, primitive_count %u, "
"index_data %p, index_format %#x, vertex_data %p, vertex_stride %u.\n",
@@ -2168,7 +2166,7 @@ static HRESULT WINAPI d3d8_device_DrawIndexedPrimitiveUP(IDirect3DDevice8 *iface
if (FAILED(hr = wined3d_resource_map(vb, 0, &wined3d_map_desc, &wined3d_box,
vb_pos ? WINED3D_MAP_NOOVERWRITE : WINED3D_MAP_DISCARD)))
goto done;
- memcpy(wined3d_map_desc.data, vertex_data, vtx_size);
+ memcpy(wined3d_map_desc.data, (char *)vertex_data + min_vertex_idx * vertex_stride, vtx_size);
wined3d_resource_unmap(vb, 0);
device->vertex_buffer_pos = vb_pos + vtx_size;
@@ -2200,7 +2198,7 @@ static HRESULT WINAPI d3d8_device_DrawIndexedPrimitiveUP(IDirect3DDevice8 *iface
wined3d_device_set_index_buffer(device->wined3d_device, device->index_buffer,
wined3dformat_from_d3dformat(index_format), 0);
- wined3d_device_set_base_vertex_index(device->wined3d_device, vb_pos / vertex_stride);
+ wined3d_device_set_base_vertex_index(device->wined3d_device, vb_pos / vertex_stride - min_vertex_idx);
wined3d_device_set_primitive_type(device->wined3d_device, primitive_type);
hr = wined3d_device_draw_indexed_primitive(device->wined3d_device, ib_pos / idx_fmt_size, idx_count);
--
2.11.0

View File

@@ -0,0 +1,123 @@
From c50f96ff6353cc65ed3e39b43fd7e46cf2678c69 Mon Sep 17 00:00:00 2001
From: Matteo Bruni <mbruni@codeweavers.com>
Date: Wed, 18 Jan 2017 21:35:30 +0100
Subject: d3d9/tests: Add a test for DrawIndexedPrimitiveUP().
Signed-off-by: Matteo Bruni <mbruni@codeweavers.com>
---
dlls/d3d9/tests/visual.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 94 insertions(+)
diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c
index a1064127d5a..be544f3b5c7 100644
--- a/dlls/d3d9/tests/visual.c
+++ b/dlls/d3d9/tests/visual.c
@@ -22244,6 +22244,99 @@ done:
DestroyWindow(window);
}
+static void test_drawindexedprimitiveup(void)
+{
+ static const struct vertex
+ {
+ struct vec3 position;
+ DWORD diffuse;
+ }
+ quad[] =
+ {
+ {{-1.0f, -1.0f, 0.1f}, 0xff00ff00},
+ {{-1.0f, 1.0f, 0.1f}, 0xff0000ff},
+ {{ 1.0f, -1.0f, 0.1f}, 0xffff0000},
+ {{ 1.0f, 1.0f, 0.1f}, 0xff0000ff},
+
+ {{-1.0f, -1.0f, 0.1f}, 0xff0000ff},
+ {{-1.0f, 1.0f, 0.1f}, 0xff00ff00},
+ {{ 1.0f, -1.0f, 0.1f}, 0xffff0000},
+ {{ 1.0f, 1.0f, 0.1f}, 0xff00ff00},
+ };
+ static const unsigned short indices[] = {0, 1, 2, 3, 4, 5, 6, 7};
+ IDirect3DDevice9 *device;
+ IDirect3D9 *d3d;
+ ULONG refcount;
+ D3DCOLOR color;
+ HWND window;
+ HRESULT hr;
+
+ window = create_window();
+ d3d = Direct3DCreate9(D3D_SDK_VERSION);
+ ok(!!d3d, "Failed to create a D3D object.\n");
+
+ if (!(device = create_device(d3d, window, window, TRUE)))
+ {
+ skip("Failed to create a D3D device.\n");
+ IDirect3D9_Release(d3d);
+ DestroyWindow(window);
+ return;
+ }
+
+ hr = IDirect3DDevice9_SetRenderState(device, D3DRS_CLIPPING, FALSE);
+ ok(SUCCEEDED(hr), "Failed to disable clipping, hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetRenderState(device, D3DRS_ZENABLE, FALSE);
+ ok(SUCCEEDED(hr), "Failed to disable Z test, hr %#x.\n", hr);
+ hr = IDirect3DDevice9_SetRenderState(device, D3DRS_LIGHTING, FALSE);
+ ok(SUCCEEDED(hr), "Failed to disable lighting, hr %#x.\n", hr);
+
+ hr = IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_DIFFUSE);
+ ok(SUCCEEDED(hr), "Failed to set FVF, hr %#x.\n", hr);
+
+ hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ hr = IDirect3DDevice9_BeginScene(device);
+ ok(SUCCEEDED(hr), "Failed to begin scene, hr %#x.\n", hr);
+ hr = IDirect3DDevice9_DrawIndexedPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 4, 4, 2, indices + 4, D3DFMT_INDEX16, quad, sizeof(*quad));
+ ok(SUCCEEDED(hr), "Failed to draw, hr %#x.\n", hr);
+ hr = IDirect3DDevice9_EndScene(device);
+ ok(SUCCEEDED(hr), "Failed to end scene, hr %#x.\n", hr);
+
+ color = getPixelColor(device, 160, 120);
+ ok(color_match(color, 0x0040bf00, 1), "Got unexpected color 0x%08x.\n", color);
+ color = getPixelColor(device, 480, 120);
+ ok(color_match(color, 0x0040bf00, 1), "Got unexpected color 0x%08x.\n", color);
+ color = getPixelColor(device, 160, 360);
+ ok(color_match(color, 0x00404080, 1), "Got unexpected color 0x%08x.\n", color);
+ color = getPixelColor(device, 480, 360);
+ ok(color_match(color, 0x00bf4000, 1), "Got unexpected color 0x%08x.\n", color);
+
+ hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ hr = IDirect3DDevice9_BeginScene(device);
+ ok(SUCCEEDED(hr), "Failed to begin scene, hr %#x.\n", hr);
+ hr = IDirect3DDevice9_DrawIndexedPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 0, 4, 2, indices, D3DFMT_INDEX16, quad, sizeof(*quad));
+ ok(SUCCEEDED(hr), "Failed to draw, hr %#x.\n", hr);
+ hr = IDirect3DDevice9_EndScene(device);
+ ok(SUCCEEDED(hr), "Failed to end scene, hr %#x.\n", hr);
+
+ color = getPixelColor(device, 160, 120);
+ ok(color_match(color, 0x004000bf, 1), "Got unexpected color 0x%08x.\n", color);
+ color = getPixelColor(device, 480, 120);
+ ok(color_match(color, 0x004000bf, 1), "Got unexpected color 0x%08x.\n", color);
+ color = getPixelColor(device, 160, 360);
+ ok(color_match(color, 0x00408040, 1), "Got unexpected color 0x%08x.\n", color);
+ color = getPixelColor(device, 480, 360);
+ ok(color_match(color, 0x00bf0040, 1), "Got unexpected color 0x%08x.\n", color);
+
+ refcount = IDirect3DDevice9_Release(device);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ IDirect3D9_Release(d3d);
+ DestroyWindow(window);
+}
+
START_TEST(visual)
{
D3DADAPTER_IDENTIFIER9 identifier;
@@ -22372,4 +22465,5 @@ START_TEST(visual)
test_evict_bound_resources();
test_max_index16();
test_backbuffer_resize();
+ test_drawindexedprimitiveup();
}
--
2.11.0

View File

@@ -0,0 +1,132 @@
From 38c67dd093a7b64dc3730cf6b919f4bcf31c65f0 Mon Sep 17 00:00:00 2001
From: Matteo Bruni <mbruni@codeweavers.com>
Date: Wed, 18 Jan 2017 21:35:31 +0100
Subject: d3d8/tests: Add a test for DrawIndexedPrimitiveUP().
Signed-off-by: Matteo Bruni <mbruni@codeweavers.com>
---
dlls/d3d8/tests/visual.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 103 insertions(+)
diff --git a/dlls/d3d8/tests/visual.c b/dlls/d3d8/tests/visual.c
index c0ecc6a6fa6..57c89171b7d 100644
--- a/dlls/d3d8/tests/visual.c
+++ b/dlls/d3d8/tests/visual.c
@@ -9700,6 +9700,108 @@ done:
DestroyWindow(window);
}
+static void test_drawindexedprimitiveup(void)
+{
+ static const struct vertex
+ {
+ struct vec3 position;
+ DWORD diffuse;
+ }
+ quad[] =
+ {
+ {{-1.0f, -1.0f, 0.1f}, 0xff00ff00},
+ {{-1.0f, 1.0f, 0.1f}, 0xff0000ff},
+ {{ 1.0f, -1.0f, 0.1f}, 0xffff0000},
+ {{ 1.0f, 1.0f, 0.1f}, 0xff0000ff},
+
+ {{-1.0f, -1.0f, 0.1f}, 0xff0000ff},
+ {{-1.0f, 1.0f, 0.1f}, 0xff00ff00},
+ {{ 1.0f, -1.0f, 0.1f}, 0xffff0000},
+ {{ 1.0f, 1.0f, 0.1f}, 0xff00ff00},
+ };
+ static const unsigned short indices[] = {0, 1, 2, 3, 4, 5, 6, 7};
+ IDirect3DDevice8 *device;
+ IDirect3D8 *d3d;
+ ULONG refcount;
+ D3DCOLOR color;
+ HWND window;
+ HRESULT hr;
+
+ window = create_window();
+ d3d = Direct3DCreate8(D3D_SDK_VERSION);
+ ok(!!d3d, "Failed to create a D3D object.\n");
+
+ if (!(device = create_device(d3d, window, window, TRUE)))
+ {
+ skip("Failed to create a D3D device.\n");
+ IDirect3D8_Release(d3d);
+ DestroyWindow(window);
+ return;
+ }
+
+ hr = IDirect3DDevice8_SetRenderState(device, D3DRS_CLIPPING, FALSE);
+ ok(SUCCEEDED(hr), "Failed to disable clipping, hr %#x.\n", hr);
+ hr = IDirect3DDevice8_SetRenderState(device, D3DRS_ZENABLE, FALSE);
+ ok(SUCCEEDED(hr), "Failed to disable Z test, hr %#x.\n", hr);
+ hr = IDirect3DDevice8_SetRenderState(device, D3DRS_LIGHTING, FALSE);
+ ok(SUCCEEDED(hr), "Failed to disable lighting, hr %#x.\n", hr);
+
+ hr = IDirect3DDevice8_SetTextureStageState(device, 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
+ ok(SUCCEEDED(hr), "Failed to set color op, hr %#x.\n", hr);
+ hr = IDirect3DDevice8_SetTextureStageState(device, 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
+ ok(SUCCEEDED(hr), "Failed to set color arg, hr %#x.\n", hr);
+ hr = IDirect3DDevice8_SetTextureStageState(device, 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
+ ok(SUCCEEDED(hr), "Failed to set alpha op, hr %#x.\n", hr);
+ hr = IDirect3DDevice8_SetTextureStageState(device, 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
+ ok(SUCCEEDED(hr), "Failed to set alpha arg, hr %#x.\n", hr);
+
+ hr = IDirect3DDevice8_SetVertexShader(device, D3DFVF_XYZ | D3DFVF_DIFFUSE);
+ ok(SUCCEEDED(hr), "Failed to set FVF, hr %#x.\n", hr);
+
+ hr = IDirect3DDevice8_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ hr = IDirect3DDevice8_BeginScene(device);
+ ok(SUCCEEDED(hr), "Failed to begin scene, hr %#x.\n", hr);
+ hr = IDirect3DDevice8_DrawIndexedPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 4, 4, 2, indices + 4, D3DFMT_INDEX16, quad, sizeof(*quad));
+ ok(SUCCEEDED(hr), "Failed to draw, hr %#x.\n", hr);
+ hr = IDirect3DDevice8_EndScene(device);
+ ok(SUCCEEDED(hr), "Failed to end scene, hr %#x.\n", hr);
+
+ color = getPixelColor(device, 160, 120);
+ ok(color_match(color, 0x0040bf00, 1), "Got unexpected color 0x%08x.\n", color);
+ color = getPixelColor(device, 480, 120);
+ ok(color_match(color, 0x0040bf00, 1), "Got unexpected color 0x%08x.\n", color);
+ color = getPixelColor(device, 160, 360);
+ ok(color_match(color, 0x00404080, 1), "Got unexpected color 0x%08x.\n", color);
+ color = getPixelColor(device, 480, 360);
+ ok(color_match(color, 0x00bf4000, 1), "Got unexpected color 0x%08x.\n", color);
+
+ hr = IDirect3DDevice8_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0f, 0);
+ ok(SUCCEEDED(hr), "Failed to clear, hr %#x.\n", hr);
+
+ hr = IDirect3DDevice8_BeginScene(device);
+ ok(SUCCEEDED(hr), "Failed to begin scene, hr %#x.\n", hr);
+ hr = IDirect3DDevice8_DrawIndexedPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 0, 4, 2, indices, D3DFMT_INDEX16, quad, sizeof(*quad));
+ ok(SUCCEEDED(hr), "Failed to draw, hr %#x.\n", hr);
+ hr = IDirect3DDevice8_EndScene(device);
+ ok(SUCCEEDED(hr), "Failed to end scene, hr %#x.\n", hr);
+
+ color = getPixelColor(device, 160, 120);
+ ok(color_match(color, 0x004000bf, 1), "Got unexpected color 0x%08x.\n", color);
+ color = getPixelColor(device, 480, 120);
+ ok(color_match(color, 0x004000bf, 1), "Got unexpected color 0x%08x.\n", color);
+ color = getPixelColor(device, 160, 360);
+ ok(color_match(color, 0x00408040, 1), "Got unexpected color 0x%08x.\n", color);
+ color = getPixelColor(device, 480, 360);
+ ok(color_match(color, 0x00bf0040, 1), "Got unexpected color 0x%08x.\n", color);
+
+ refcount = IDirect3DDevice8_Release(device);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ IDirect3D8_Release(d3d);
+ DestroyWindow(window);
+}
+
START_TEST(visual)
{
D3DADAPTER_IDENTIFIER8 identifier;
@@ -9770,4 +9872,5 @@ START_TEST(visual)
test_edge_antialiasing_blending();
test_max_index16();
test_backbuffer_resize();
+ test_drawindexedprimitiveup();
}
--
2.11.0

View File

@@ -0,0 +1 @@
Fixes: [35993] Fix DrawIndexedPrimitiveUP with non-zero min_vertex_idx

View File

@@ -1,4 +1,4 @@
From 746aa2c81af98e890e4db720783de7fce4bc84d3 Mon Sep 17 00:00:00 2001
From bbe000942fadd116e85bd64abd6633fa1d9df382 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Fri, 4 Mar 2016 22:22:42 +0100
Subject: ddraw: Set ddsOldCaps correctly in ddraw7_GetCaps.
@@ -12,10 +12,10 @@ Subject: ddraw: Set ddsOldCaps correctly in ddraw7_GetCaps.
5 files changed, 106 insertions(+)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 1fa88751efe..5c138a5d726 100644
index 8bf38ee930f..01a9a904ef5 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -1533,6 +1533,8 @@ static HRESULT WINAPI ddraw7_GetCaps(IDirectDraw7 *iface, DDCAPS *DriverCaps, DD
@@ -1536,6 +1536,8 @@ static HRESULT WINAPI ddraw7_GetCaps(IDirectDraw7 *iface, DDCAPS *DriverCaps, DD
caps.dwCaps |= DDCAPS_ALIGNSTRIDE;
caps.dwAlignStrideAlign = DDRAW_STRIDE_ALIGNMENT;
@@ -25,11 +25,11 @@ index 1fa88751efe..5c138a5d726 100644
if(DriverCaps)
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index 5b153a62a21..762c1074e79 100644
index 5acbee61e00..bb873da220f 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -9793,6 +9793,31 @@ static void test_display_mode_surface_pixel_format(void)
DestroyWindow(window);
@@ -9953,6 +9953,31 @@ static void test_surface_desc_size(void)
ok(!refcount, "DirectDraw has %u references left.\n", refcount);
}
+static void test_caps(void)
@@ -60,18 +60,18 @@ index 5b153a62a21..762c1074e79 100644
START_TEST(ddraw1)
{
IDirectDraw *ddraw;
@@ -9877,4 +9902,5 @@ START_TEST(ddraw1)
test_getdc();
@@ -10038,4 +10063,5 @@ START_TEST(ddraw1)
test_transform_vertices();
test_display_mode_surface_pixel_format();
test_surface_desc_size();
+ test_caps();
}
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index 422960012af..714d3f0e1a8 100644
index dc8801c3e12..9afd5e8e681 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -11247,6 +11247,31 @@ static void test_display_mode_surface_pixel_format(void)
DestroyWindow(window);
@@ -11444,6 +11444,31 @@ static void test_surface_desc_size(void)
ok(!refcount, "DirectDraw has %u references left.\n", refcount);
}
+static void test_caps(void)
@@ -102,18 +102,18 @@ index 422960012af..714d3f0e1a8 100644
START_TEST(ddraw2)
{
IDirectDraw2 *ddraw;
@@ -11340,4 +11365,5 @@ START_TEST(ddraw2)
test_edge_antialiasing_blending();
@@ -11538,4 +11563,5 @@ START_TEST(ddraw2)
test_transform_vertices();
test_display_mode_surface_pixel_format();
test_surface_desc_size();
+ test_caps();
}
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index e091a6dac5d..70dd79d7a13 100644
index f2b3e0cf63b..fbefe8425b3 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -12532,6 +12532,31 @@ static void test_display_mode_surface_pixel_format(void)
DestroyWindow(window);
@@ -12729,6 +12729,31 @@ static void test_surface_desc_size(void)
ok(!refcount, "DirectDraw has %u references left.\n", refcount);
}
+static void test_caps(void)
@@ -144,18 +144,18 @@ index e091a6dac5d..70dd79d7a13 100644
START_TEST(ddraw4)
{
IDirectDraw4 *ddraw;
@@ -12633,4 +12658,5 @@ START_TEST(ddraw4)
test_edge_antialiasing_blending();
@@ -12831,4 +12856,5 @@ START_TEST(ddraw4)
test_transform_vertices();
test_display_mode_surface_pixel_format();
test_surface_desc_size();
+ test_caps();
}
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 0b1bdaef6d2..536163e9a5e 100644
index 7b88824920e..7957f1733d5 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -12211,6 +12211,31 @@ static void test_display_mode_surface_pixel_format(void)
DestroyWindow(window);
@@ -12424,6 +12424,31 @@ static void test_surface_desc_size(void)
ok(!refcount, "DirectDraw has %u references left.\n", refcount);
}
+static void test_caps(void)
@@ -186,10 +186,10 @@ index 0b1bdaef6d2..536163e9a5e 100644
START_TEST(ddraw7)
{
HMODULE module = GetModuleHandleA("ddraw.dll");
@@ -12322,4 +12347,5 @@ START_TEST(ddraw7)
test_draw_primitive();
@@ -12536,4 +12561,5 @@ START_TEST(ddraw7)
test_edge_antialiasing_blending();
test_display_mode_surface_pixel_format();
test_surface_desc_size();
+ test_caps();
}
--

View File

@@ -1,19 +1,19 @@
From 8bd90811a6f9431ffc1a966d76c80fae0ba23171 Mon Sep 17 00:00:00 2001
From 269fa9451452446fb3c79cece46b61617f6eb480 Mon Sep 17 00:00:00 2001
From: Henri Verbeet <hverbeet@codeweavers.com>
Date: Sun, 8 Jan 2017 22:32:32 +0100
Subject: ddraw: Implement ddraw7_FlipToGDISurface.
Subject: ddraw: Implement ddraw7_FlipToGDISurface. (v2)
---
dlls/ddraw/ddraw.c | 7 ++++++-
dlls/ddraw/ddraw.c | 9 ++++++++-
dlls/ddraw/ddraw_private.h | 1 +
dlls/ddraw/surface.c | 5 +++--
3 files changed, 10 insertions(+), 3 deletions(-)
3 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 6afa6dddcb4..b883770c537 100644
index 3b4c628666b..7a313e384ac 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -2058,7 +2058,12 @@ static HRESULT WINAPI d3d1_Initialize(IDirect3D *iface, REFIID riid)
@@ -2061,7 +2061,14 @@ static HRESULT WINAPI d3d1_Initialize(IDirect3D *iface, REFIID riid)
*****************************************************************************/
static HRESULT WINAPI ddraw7_FlipToGDISurface(IDirectDraw7 *iface)
{
@@ -23,7 +23,9 @@ index 6afa6dddcb4..b883770c537 100644
+ TRACE("iface %p.\n", iface);
+
+ ddraw->flags |= DDRAW_GDI_FLIP;
+ ddraw_surface_update_frontbuffer(ddraw->primary, NULL, FALSE);
+
+ if (ddraw->primary)
+ ddraw_surface_update_frontbuffer(ddraw->primary, NULL, FALSE);
return DD_OK;
}

View File

@@ -0,0 +1,269 @@
From 0a0146b997a9c5d60fea6a4c6367e059241b942b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B3zef=20Kucia?= <jkucia@codeweavers.com>
Date: Tue, 17 Jan 2017 12:26:37 +0100
Subject: ddraw: Relax "dwSize" validation in ddraw_surface*_Lock().
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: JĂłzef Kucia <jkucia@codeweavers.com>
---
dlls/ddraw/ddraw_private.h | 6 +--
dlls/ddraw/surface.c | 91 ++++++++++++++++++++++++++--------------------
dlls/ddraw/tests/ddraw7.c | 4 --
3 files changed, 54 insertions(+), 47 deletions(-)
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 0dc915cfcb2..a8ac865887d 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -628,10 +628,10 @@ struct member_info
/* Structure copy */
#define ME(x,f,e) { x, #x, (void (*)(const void *))(f), offsetof(STRUCT, e) }
-#define DD_STRUCT_COPY_BYSIZE_(to,from,from_size) \
+#define DD_STRUCT_COPY_BYSIZE_(to,from,to_size,from_size) \
do { \
DWORD __size = (to)->dwSize; \
- DWORD __resetsize = min(__size, sizeof(*to)); \
+ DWORD __resetsize = min(to_size, sizeof(*to)); \
DWORD __copysize = min(__resetsize, from_size); \
assert(to != from); \
memcpy(to, from, __copysize); \
@@ -639,7 +639,7 @@ struct member_info
(to)->dwSize = __size; /* restore size */ \
} while (0)
-#define DD_STRUCT_COPY_BYSIZE(to,from) DD_STRUCT_COPY_BYSIZE_(to,from,(from)->dwSize)
+#define DD_STRUCT_COPY_BYSIZE(to,from) DD_STRUCT_COPY_BYSIZE_(to,from,(to)->dwSize,(from)->dwSize)
HRESULT hr_ddraw_from_wined3d(HRESULT hr) DECLSPEC_HIDDEN;
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index 7d1fc2edd34..cbe1eb7d98f 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -955,14 +955,15 @@ static HRESULT WINAPI ddraw_surface1_GetAttachedSurface(IDirectDrawSurface *ifac
*
*****************************************************************************/
static HRESULT surface_lock(struct ddraw_surface *surface,
- RECT *rect, DDSURFACEDESC2 *surface_desc, DWORD flags, HANDLE h)
+ RECT *rect, DDSURFACEDESC2 *surface_desc, unsigned int surface_desc_size,
+ DWORD flags, HANDLE h)
{
- struct wined3d_box box;
struct wined3d_map_desc map_desc;
+ struct wined3d_box box;
HRESULT hr = DD_OK;
- TRACE("surface %p, rect %s, surface_desc %p, flags %#x, h %p.\n",
- surface, wine_dbgstr_rect(rect), surface_desc, flags, h);
+ TRACE("surface %p, rect %s, surface_desc %p, surface_desc_size %u, flags %#x, h %p.\n",
+ surface, wine_dbgstr_rect(rect), surface_desc, surface_desc_size, flags, h);
/* surface->surface_desc.dwWidth and dwHeight are changeable, thus lock */
wined3d_mutex_lock();
@@ -1026,7 +1027,7 @@ static HRESULT surface_lock(struct ddraw_surface *surface,
}
/* Windows does not set DDSD_LPSURFACE on locked surfaces. */
- DD_STRUCT_COPY_BYSIZE(surface_desc, &surface->surface_desc);
+ DD_STRUCT_COPY_BYSIZE_(surface_desc, &surface->surface_desc, surface_desc_size, surface->surface_desc.dwSize);
surface_desc->lpSurface = map_desc.data;
TRACE("locked surface returning description :\n");
@@ -1038,63 +1039,80 @@ static HRESULT surface_lock(struct ddraw_surface *surface,
return DD_OK;
}
+static BOOL surface_validate_lock_desc(struct ddraw_surface *surface,
+ const DDSURFACEDESC *desc, unsigned int *size)
+{
+ if (!desc)
+ return FALSE;
+
+ if (desc->dwSize == sizeof(DDSURFACEDESC) || desc->dwSize == sizeof(DDSURFACEDESC2))
+ {
+ *size = desc->dwSize;
+ return TRUE;
+ }
+
+ if (surface->version == 7
+ && surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_TEXTURE
+ && !(surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY))
+ {
+ if (desc->dwSize >= sizeof(DDSURFACEDESC2))
+ *size = sizeof(DDSURFACEDESC2);
+ else
+ *size = sizeof(DDSURFACEDESC);
+ return TRUE;
+ }
+
+ WARN("Invalid structure size %u.\n", desc->dwSize);
+ return FALSE;
+}
+
static HRESULT WINAPI ddraw_surface7_Lock(IDirectDrawSurface7 *iface,
RECT *rect, DDSURFACEDESC2 *surface_desc, DWORD flags, HANDLE h)
{
struct ddraw_surface *surface = impl_from_IDirectDrawSurface7(iface);
+ unsigned int surface_desc_size;
TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n",
iface, wine_dbgstr_rect(rect), surface_desc, flags, h);
- if (!surface_desc) return DDERR_INVALIDPARAMS;
- if (surface_desc->dwSize != sizeof(DDSURFACEDESC) &&
- surface_desc->dwSize != sizeof(DDSURFACEDESC2))
- {
- WARN("Invalid structure size %d, returning DDERR_INVALIDPARAMS\n", surface_desc->dwSize);
+ if (!surface_validate_lock_desc(surface, (DDSURFACEDESC *)surface_desc, &surface_desc_size))
return DDERR_INVALIDPARAMS;
- }
- return surface_lock(surface, rect, surface_desc, flags, h);
+
+ return surface_lock(surface, rect, surface_desc, surface_desc_size, flags, h);
}
static HRESULT WINAPI ddraw_surface4_Lock(IDirectDrawSurface4 *iface, RECT *rect,
DDSURFACEDESC2 *surface_desc, DWORD flags, HANDLE h)
{
struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface);
+ unsigned int surface_desc_size;
TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n",
iface, wine_dbgstr_rect(rect), surface_desc, flags, h);
- if (!surface_desc) return DDERR_INVALIDPARAMS;
- if (surface_desc->dwSize != sizeof(DDSURFACEDESC) &&
- surface_desc->dwSize != sizeof(DDSURFACEDESC2))
- {
- WARN("Invalid structure size %d, returning DDERR_INVALIDPARAMS\n", surface_desc->dwSize);
+ if (!surface_validate_lock_desc(surface, (DDSURFACEDESC *)surface_desc, &surface_desc_size))
return DDERR_INVALIDPARAMS;
- }
- return surface_lock(surface, rect, surface_desc, flags, h);
+
+ return surface_lock(surface, rect, surface_desc, surface_desc_size, flags, h);
}
static HRESULT WINAPI ddraw_surface3_Lock(IDirectDrawSurface3 *iface, RECT *rect,
DDSURFACEDESC *surface_desc, DWORD flags, HANDLE h)
{
struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface);
+ unsigned int surface_desc_size;
DDSURFACEDESC2 surface_desc2;
HRESULT hr;
TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n",
iface, wine_dbgstr_rect(rect), surface_desc, flags, h);
- if (!surface_desc) return DDERR_INVALIDPARAMS;
- if (surface_desc->dwSize != sizeof(DDSURFACEDESC) &&
- surface_desc->dwSize != sizeof(DDSURFACEDESC2))
- {
- WARN("Invalid structure size %d, returning DDERR_INVALIDPARAMS\n", surface_desc->dwSize);
+ if (!surface_validate_lock_desc(surface, surface_desc, &surface_desc_size))
return DDERR_INVALIDPARAMS;
- }
surface_desc2.dwSize = surface_desc->dwSize;
surface_desc2.dwFlags = 0;
- hr = surface_lock(surface, rect, &surface_desc2, flags, h);
+ hr = surface_lock(surface, rect, &surface_desc2, surface_desc_size, flags, h);
DDSD2_to_DDSD(&surface_desc2, surface_desc);
surface_desc->dwSize = surface_desc2.dwSize;
return hr;
@@ -1104,23 +1122,19 @@ static HRESULT WINAPI ddraw_surface2_Lock(IDirectDrawSurface2 *iface, RECT *rect
DDSURFACEDESC *surface_desc, DWORD flags, HANDLE h)
{
struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface);
+ unsigned int surface_desc_size;
DDSURFACEDESC2 surface_desc2;
HRESULT hr;
TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n",
iface, wine_dbgstr_rect(rect), surface_desc, flags, h);
- if (!surface_desc) return DDERR_INVALIDPARAMS;
- if (surface_desc->dwSize != sizeof(DDSURFACEDESC) &&
- surface_desc->dwSize != sizeof(DDSURFACEDESC2))
- {
- WARN("Invalid structure size %d, returning DDERR_INVALIDPARAMS\n", surface_desc->dwSize);
+ if (!surface_validate_lock_desc(surface, surface_desc, &surface_desc_size))
return DDERR_INVALIDPARAMS;
- }
surface_desc2.dwSize = surface_desc->dwSize;
surface_desc2.dwFlags = 0;
- hr = surface_lock(surface, rect, &surface_desc2, flags, h);
+ hr = surface_lock(surface, rect, &surface_desc2, surface_desc_size, flags, h);
DDSD2_to_DDSD(&surface_desc2, surface_desc);
surface_desc->dwSize = surface_desc2.dwSize;
return hr;
@@ -1130,22 +1144,19 @@ static HRESULT WINAPI ddraw_surface1_Lock(IDirectDrawSurface *iface, RECT *rect,
DDSURFACEDESC *surface_desc, DWORD flags, HANDLE h)
{
struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface);
+ unsigned int surface_desc_size;
DDSURFACEDESC2 surface_desc2;
HRESULT hr;
+
TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n",
iface, wine_dbgstr_rect(rect), surface_desc, flags, h);
- if (!surface_desc) return DDERR_INVALIDPARAMS;
- if (surface_desc->dwSize != sizeof(DDSURFACEDESC) &&
- surface_desc->dwSize != sizeof(DDSURFACEDESC2))
- {
- WARN("Invalid structure size %d, returning DDERR_INVALIDPARAMS\n", surface_desc->dwSize);
+ if (!surface_validate_lock_desc(surface, surface_desc, &surface_desc_size))
return DDERR_INVALIDPARAMS;
- }
surface_desc2.dwSize = surface_desc->dwSize;
surface_desc2.dwFlags = 0;
- hr = surface_lock(surface, rect, &surface_desc2, flags, h);
+ hr = surface_lock(surface, rect, &surface_desc2, surface_desc_size, flags, h);
DDSD2_to_DDSD(&surface_desc2, surface_desc);
surface_desc->dwSize = surface_desc2.dwSize;
return hr;
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 7957f1733d5..bc35ae78199 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -5909,7 +5909,6 @@ static void test_surface_lock(void)
expected_hr = tests[i].caps & DDSCAPS_TEXTURE && !(tests[i].caps & DDSCAPS_VIDEOMEMORY)
? DD_OK : DDERR_INVALIDPARAMS;
hr = IDirectDrawSurface7_Lock(surface, NULL, &ddsd, DDLOCK_WAIT, NULL);
- todo_wine_if(expected_hr == D3D_OK)
ok(hr == expected_hr, "Got hr %#x, expected %#x, type %s.\n", hr, expected_hr, tests[i].name);
if (SUCCEEDED(hr))
{
@@ -12340,7 +12339,6 @@ static void test_surface_desc_size(void)
desc.blob[sizeof(DDSURFACEDESC2)] = 0xef;
hr = IDirectDrawSurface_Lock(surface, NULL, &desc.desc1, 0, 0);
expected_hr = ignore_size || valid_size ? DD_OK : DDERR_INVALIDPARAMS;
- todo_wine_if(ignore_size && !valid_size)
ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n",
hr, expected_hr, desc_sizes[j], surface_caps[i].name);
ok(desc.dwSize == desc_sizes[j], "dwSize was changed from %u to %u, type %s.\n",
@@ -12367,7 +12365,6 @@ static void test_surface_desc_size(void)
desc.blob[sizeof(DDSURFACEDESC2)] = 0xef;
hr = IDirectDrawSurface3_Lock(surface3, NULL, &desc.desc1, 0, 0);
expected_hr = ignore_size || valid_size ? DD_OK : DDERR_INVALIDPARAMS;
- todo_wine_if(ignore_size && !valid_size)
ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n",
hr, expected_hr, desc_sizes[j], surface_caps[i].name);
ok(desc.dwSize == desc_sizes[j], "dwSize was changed from %u to %u, type %s.\n",
@@ -12394,7 +12391,6 @@ static void test_surface_desc_size(void)
desc.blob[sizeof(DDSURFACEDESC2)] = 0xef;
hr = IDirectDrawSurface7_Lock(surface7, NULL, &desc.desc2, 0, 0);
expected_hr = ignore_size || valid_size ? DD_OK : DDERR_INVALIDPARAMS;
- todo_wine_if(ignore_size && !valid_size)
ok(hr == expected_hr, "Got hr %#x, expected %#x, dwSize %u, type %s.\n",
hr, expected_hr, desc_sizes[j], surface_caps[i].name);
ok(desc.dwSize == desc_sizes[j], "dwSize was changed from %u to %u, type %s.\n",
--
2.11.0

View File

@@ -0,0 +1 @@
Fixes: [14897] Relax dwSize validation ddraw_surface*_Lock

Some files were not shown because too many files have changed in this diff Show More