mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-01-28 22:04:43 -08:00
Rebase against 797c037bff2f7621f5b3d632bd899349529d6b2b.
This commit is contained in:
parent
2393fd2c7e
commit
74f4d7b45e
@ -1,77 +0,0 @@
|
||||
From 7871b72dcbf44cd8bb63ace950aa69fcfa8adcbe Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sun, 26 Jul 2015 23:23:57 +0200
|
||||
Subject: ntdll/tests: Add basic tests for RtlQueueWorkItem.
|
||||
|
||||
---
|
||||
dlls/ntdll/tests/threadpool.c | 47 +++++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 47 insertions(+)
|
||||
|
||||
diff --git a/dlls/ntdll/tests/threadpool.c b/dlls/ntdll/tests/threadpool.c
|
||||
index c69902b..7be3f0d 100644
|
||||
--- a/dlls/ntdll/tests/threadpool.c
|
||||
+++ b/dlls/ntdll/tests/threadpool.c
|
||||
@@ -98,6 +98,51 @@ static BOOL init_threadpool(void)
|
||||
#undef NTDLL_GET_PROC
|
||||
|
||||
|
||||
+static DWORD CALLBACK rtl_work_cb(void *userdata)
|
||||
+{
|
||||
+ HANDLE semaphore = userdata;
|
||||
+ trace("Running rtl_work callback\n");
|
||||
+ ReleaseSemaphore(semaphore, 1, NULL);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void test_RtlQueueWorkItem(void)
|
||||
+{
|
||||
+ HANDLE semaphore;
|
||||
+ NTSTATUS status;
|
||||
+ DWORD result;
|
||||
+
|
||||
+ semaphore = CreateSemaphoreA(NULL, 0, 1, NULL);
|
||||
+ ok(semaphore != NULL, "CreateSemaphoreA failed %u\n", GetLastError());
|
||||
+
|
||||
+ status = RtlQueueWorkItem(rtl_work_cb, semaphore, WT_EXECUTEDEFAULT);
|
||||
+ ok(!status, "RtlQueueWorkItem failed with status %x\n", status);
|
||||
+ result = WaitForSingleObject(semaphore, 1000);
|
||||
+ ok(result == WAIT_OBJECT_0, "WaitForSingleObject returned %u\n", result);
|
||||
+
|
||||
+ status = RtlQueueWorkItem(rtl_work_cb, semaphore, WT_EXECUTEINIOTHREAD);
|
||||
+ ok(!status, "RtlQueueWorkItem failed with status %x\n", status);
|
||||
+ result = WaitForSingleObject(semaphore, 1000);
|
||||
+ ok(result == WAIT_OBJECT_0, "WaitForSingleObject returned %u\n", result);
|
||||
+
|
||||
+ status = RtlQueueWorkItem(rtl_work_cb, semaphore, WT_EXECUTEINPERSISTENTTHREAD);
|
||||
+ ok(!status, "RtlQueueWorkItem failed with status %x\n", status);
|
||||
+ result = WaitForSingleObject(semaphore, 1000);
|
||||
+ ok(result == WAIT_OBJECT_0, "WaitForSingleObject returned %u\n", result);
|
||||
+
|
||||
+ status = RtlQueueWorkItem(rtl_work_cb, semaphore, WT_EXECUTELONGFUNCTION);
|
||||
+ ok(!status, "RtlQueueWorkItem failed with status %x\n", status);
|
||||
+ result = WaitForSingleObject(semaphore, 1000);
|
||||
+ ok(result == WAIT_OBJECT_0, "WaitForSingleObject returned %u\n", result);
|
||||
+
|
||||
+ status = RtlQueueWorkItem(rtl_work_cb, semaphore, WT_TRANSFER_IMPERSONATION);
|
||||
+ ok(!status, "RtlQueueWorkItem failed with status %x\n", status);
|
||||
+ result = WaitForSingleObject(semaphore, 1000);
|
||||
+ ok(result == WAIT_OBJECT_0, "WaitForSingleObject returned %u\n", result);
|
||||
+
|
||||
+ CloseHandle(semaphore);
|
||||
+}
|
||||
+
|
||||
static void CALLBACK simple_cb(TP_CALLBACK_INSTANCE *instance, void *userdata)
|
||||
{
|
||||
HANDLE semaphore = userdata;
|
||||
@@ -1292,6 +1337,8 @@ static void test_tp_multi_wait(void)
|
||||
|
||||
START_TEST(threadpool)
|
||||
{
|
||||
+ test_RtlQueueWorkItem();
|
||||
+
|
||||
if (!init_threadpool())
|
||||
return;
|
||||
|
||||
--
|
||||
2.4.5
|
||||
|
@ -1,220 +0,0 @@
|
||||
From 9c243efb0149efa8d6b46555e36ab2c3d379769f Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sun, 26 Jul 2015 23:24:06 +0200
|
||||
Subject: ntdll: Reimplement RtlQueueWorkItem on top of new threadpool API.
|
||||
|
||||
---
|
||||
dlls/ntdll/threadpool.c | 143 +++++++++---------------------------------------
|
||||
1 file changed, 27 insertions(+), 116 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/threadpool.c b/dlls/ntdll/threadpool.c
|
||||
index 23091f3..ad4951f 100644
|
||||
--- a/dlls/ntdll/threadpool.c
|
||||
+++ b/dlls/ntdll/threadpool.c
|
||||
@@ -42,44 +42,28 @@ WINE_DEFAULT_DEBUG_CHANNEL(threadpool);
|
||||
* Old thread pooling API
|
||||
*/
|
||||
|
||||
-#define OLD_WORKER_TIMEOUT 30000 /* 30 seconds */
|
||||
+struct rtl_work_item
|
||||
+{
|
||||
+ PRTL_WORK_ITEM_ROUTINE function;
|
||||
+ PVOID context;
|
||||
+};
|
||||
+
|
||||
#define EXPIRE_NEVER (~(ULONGLONG)0)
|
||||
#define TIMER_QUEUE_MAGIC 0x516d6954 /* TimQ */
|
||||
|
||||
-static RTL_CRITICAL_SECTION_DEBUG critsect_debug;
|
||||
static RTL_CRITICAL_SECTION_DEBUG critsect_compl_debug;
|
||||
|
||||
static struct
|
||||
{
|
||||
- /* threadpool_cs must be held while modifying the following four elements */
|
||||
- struct list work_item_list;
|
||||
- LONG num_workers;
|
||||
- LONG num_busy_workers;
|
||||
- LONG num_items_processed;
|
||||
- RTL_CONDITION_VARIABLE threadpool_cond;
|
||||
- RTL_CRITICAL_SECTION threadpool_cs;
|
||||
HANDLE compl_port;
|
||||
RTL_CRITICAL_SECTION threadpool_compl_cs;
|
||||
}
|
||||
old_threadpool =
|
||||
{
|
||||
- LIST_INIT(old_threadpool.work_item_list), /* work_item_list */
|
||||
- 0, /* num_workers */
|
||||
- 0, /* num_busy_workers */
|
||||
- 0, /* num_items_processed */
|
||||
- RTL_CONDITION_VARIABLE_INIT, /* threadpool_cond */
|
||||
- { &critsect_debug, -1, 0, 0, 0, 0 }, /* threadpool_cs */
|
||||
NULL, /* compl_port */
|
||||
{ &critsect_compl_debug, -1, 0, 0, 0, 0 }, /* threadpool_compl_cs */
|
||||
};
|
||||
|
||||
-static RTL_CRITICAL_SECTION_DEBUG critsect_debug =
|
||||
-{
|
||||
- 0, 0, &old_threadpool.threadpool_cs,
|
||||
- { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
|
||||
- 0, 0, { (DWORD_PTR)(__FILE__ ": threadpool_cs") }
|
||||
-};
|
||||
-
|
||||
static RTL_CRITICAL_SECTION_DEBUG critsect_compl_debug =
|
||||
{
|
||||
0, 0, &old_threadpool.threadpool_compl_cs,
|
||||
@@ -87,13 +71,6 @@ static RTL_CRITICAL_SECTION_DEBUG critsect_compl_debug =
|
||||
0, 0, { (DWORD_PTR)(__FILE__ ": threadpool_compl_cs") }
|
||||
};
|
||||
|
||||
-struct work_item
|
||||
-{
|
||||
- struct list entry;
|
||||
- PRTL_WORK_ITEM_ROUTINE function;
|
||||
- PVOID context;
|
||||
-};
|
||||
-
|
||||
struct wait_work_item
|
||||
{
|
||||
HANDLE Object;
|
||||
@@ -364,47 +341,14 @@ static inline LONG interlocked_dec( PLONG dest )
|
||||
return interlocked_xchg_add( dest, -1 ) - 1;
|
||||
}
|
||||
|
||||
-static void WINAPI worker_thread_proc(void * param)
|
||||
+static void CALLBACK process_rtl_work_item( TP_CALLBACK_INSTANCE *instance, void *userdata )
|
||||
{
|
||||
- struct list *item;
|
||||
- struct work_item *work_item_ptr, work_item;
|
||||
- LARGE_INTEGER timeout;
|
||||
- timeout.QuadPart = -(OLD_WORKER_TIMEOUT * (ULONGLONG)10000);
|
||||
-
|
||||
- RtlEnterCriticalSection( &old_threadpool.threadpool_cs );
|
||||
- old_threadpool.num_workers++;
|
||||
-
|
||||
- for (;;)
|
||||
- {
|
||||
- if ((item = list_head( &old_threadpool.work_item_list )))
|
||||
- {
|
||||
- work_item_ptr = LIST_ENTRY( item, struct work_item, entry );
|
||||
- list_remove( &work_item_ptr->entry );
|
||||
- old_threadpool.num_busy_workers++;
|
||||
- old_threadpool.num_items_processed++;
|
||||
- RtlLeaveCriticalSection( &old_threadpool.threadpool_cs );
|
||||
-
|
||||
- /* copy item to stack and do the work */
|
||||
- work_item = *work_item_ptr;
|
||||
- RtlFreeHeap( GetProcessHeap(), 0, work_item_ptr );
|
||||
- TRACE("executing %p(%p)\n", work_item.function, work_item.context);
|
||||
- work_item.function( work_item.context );
|
||||
-
|
||||
- RtlEnterCriticalSection( &old_threadpool.threadpool_cs );
|
||||
- old_threadpool.num_busy_workers--;
|
||||
- }
|
||||
- else if (RtlSleepConditionVariableCS( &old_threadpool.threadpool_cond,
|
||||
- &old_threadpool.threadpool_cs, &timeout ) != STATUS_SUCCESS)
|
||||
- {
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
+ struct rtl_work_item *item = userdata;
|
||||
|
||||
- old_threadpool.num_workers--;
|
||||
- RtlLeaveCriticalSection( &old_threadpool.threadpool_cs );
|
||||
- RtlExitUserThread( 0 );
|
||||
+ TRACE("executing %p(%p)\n", item->function, item->context);
|
||||
+ item->function( item->context );
|
||||
|
||||
- /* never reached */
|
||||
+ RtlFreeHeap( GetProcessHeap(), 0, item );
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
@@ -413,9 +357,9 @@ static void WINAPI worker_thread_proc(void * param)
|
||||
* Queues a work item into a thread in the thread pool.
|
||||
*
|
||||
* PARAMS
|
||||
- * Function [I] Work function to execute.
|
||||
- * Context [I] Context to pass to the work function when it is executed.
|
||||
- * Flags [I] Flags. See notes.
|
||||
+ * function [I] Work function to execute.
|
||||
+ * context [I] Context to pass to the work function when it is executed.
|
||||
+ * flags [I] Flags. See notes.
|
||||
*
|
||||
* RETURNS
|
||||
* Success: STATUS_SUCCESS.
|
||||
@@ -429,59 +373,26 @@ static void WINAPI worker_thread_proc(void * param)
|
||||
*|WT_EXECUTELONGFUNCTION - Hints that the execution can take a long time.
|
||||
*|WT_TRANSFER_IMPERSONATION - Executes the function with the current access token.
|
||||
*/
|
||||
-NTSTATUS WINAPI RtlQueueWorkItem(PRTL_WORK_ITEM_ROUTINE Function, PVOID Context, ULONG Flags)
|
||||
+NTSTATUS WINAPI RtlQueueWorkItem( PRTL_WORK_ITEM_ROUTINE function, PVOID context, ULONG flags )
|
||||
{
|
||||
- HANDLE thread;
|
||||
+ TP_CALLBACK_ENVIRON environment;
|
||||
+ struct rtl_work_item *item;
|
||||
NTSTATUS status;
|
||||
- LONG items_processed;
|
||||
- struct work_item *work_item = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(struct work_item));
|
||||
|
||||
- if (!work_item)
|
||||
+ item = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(*item) );
|
||||
+ if (!item)
|
||||
return STATUS_NO_MEMORY;
|
||||
|
||||
- work_item->function = Function;
|
||||
- work_item->context = Context;
|
||||
-
|
||||
- if (Flags & ~WT_EXECUTELONGFUNCTION)
|
||||
- FIXME("Flags 0x%x not supported\n", Flags);
|
||||
-
|
||||
- RtlEnterCriticalSection( &old_threadpool.threadpool_cs );
|
||||
- list_add_tail( &old_threadpool.work_item_list, &work_item->entry );
|
||||
- status = (old_threadpool.num_workers > old_threadpool.num_busy_workers) ?
|
||||
- STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
|
||||
- items_processed = old_threadpool.num_items_processed;
|
||||
- RtlLeaveCriticalSection( &old_threadpool.threadpool_cs );
|
||||
-
|
||||
- /* FIXME: tune this algorithm to not be as aggressive with creating threads
|
||||
- * if WT_EXECUTELONGFUNCTION isn't specified */
|
||||
- if (status == STATUS_SUCCESS)
|
||||
- RtlWakeConditionVariable( &old_threadpool.threadpool_cond );
|
||||
- else
|
||||
- {
|
||||
- status = RtlCreateUserThread( GetCurrentProcess(), NULL, FALSE, NULL, 0, 0,
|
||||
- worker_thread_proc, NULL, &thread, NULL );
|
||||
+ memset( &environment, 0, sizeof(environment) );
|
||||
+ environment.Version = 1;
|
||||
+ environment.u.s.LongFunction = (flags & WT_EXECUTELONGFUNCTION) != 0;
|
||||
+ environment.u.s.Persistent = (flags & WT_EXECUTEINPERSISTENTTHREAD) != 0;
|
||||
|
||||
- /* NOTE: we don't care if we couldn't create the thread if there is at
|
||||
- * least one other available to process the request */
|
||||
- if (status == STATUS_SUCCESS)
|
||||
- NtClose( thread );
|
||||
- else
|
||||
- {
|
||||
- RtlEnterCriticalSection( &old_threadpool.threadpool_cs );
|
||||
- if (old_threadpool.num_workers > 0 ||
|
||||
- old_threadpool.num_items_processed != items_processed)
|
||||
- {
|
||||
- status = STATUS_SUCCESS;
|
||||
- }
|
||||
- else
|
||||
- list_remove( &work_item->entry );
|
||||
- RtlLeaveCriticalSection( &old_threadpool.threadpool_cs );
|
||||
-
|
||||
- if (status != STATUS_SUCCESS)
|
||||
- RtlFreeHeap( GetProcessHeap(), 0, work_item );
|
||||
- }
|
||||
- }
|
||||
+ item->function = function;
|
||||
+ item->context = context;
|
||||
|
||||
+ status = TpSimpleTryPost( process_rtl_work_item, item, &environment );
|
||||
+ if (status) RtlFreeHeap( GetProcessHeap(), 0, item );
|
||||
return status;
|
||||
}
|
||||
|
||||
--
|
||||
2.4.5
|
||||
|
@ -55,7 +55,7 @@ version()
|
||||
echo "Copyright (C) 2014-2015 the Wine Staging project authors."
|
||||
echo ""
|
||||
echo "Patchset to be applied on upstream Wine:"
|
||||
echo " commit 4e6e9a14852298fe8c17f2666a16d5484cbe50b3"
|
||||
echo " commit 797c037bff2f7621f5b3d632bd899349529d6b2b"
|
||||
echo ""
|
||||
}
|
||||
|
||||
@ -176,7 +176,6 @@ patch_enable_all ()
|
||||
enable_ntdll_ThreadQuerySetWin32StartAddress="$1"
|
||||
enable_ntdll_ThreadTime="$1"
|
||||
enable_ntdll_Threading="$1"
|
||||
enable_ntdll_Threadpool_Cleanup="$1"
|
||||
enable_ntdll_User_Shared_Data="$1"
|
||||
enable_ntdll_WRITECOPY="$1"
|
||||
enable_ntdll_WinSqm="$1"
|
||||
@ -605,9 +604,6 @@ patch_enable ()
|
||||
ntdll-Threading)
|
||||
enable_ntdll_Threading="$2"
|
||||
;;
|
||||
ntdll-Threadpool_Cleanup)
|
||||
enable_ntdll_Threadpool_Cleanup="$2"
|
||||
;;
|
||||
ntdll-User_Shared_Data)
|
||||
enable_ntdll_User_Shared_Data="$2"
|
||||
;;
|
||||
@ -2000,6 +1996,23 @@ if test "$enable_Staging" -eq 1; then
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset server-Misc_ACL
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#15980] GetSecurityInfo returns NULL DACL for process object
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/advapi32/tests/security.c, server/process.c, server/security.h, server/token.c
|
||||
# |
|
||||
if test "$enable_server_Misc_ACL" -eq 1; then
|
||||
patch_apply server-Misc_ACL/0001-server-Add-default-security-descriptor-ownership-for.patch
|
||||
patch_apply server-Misc_ACL/0002-server-Add-default-security-descriptor-DACL-for-proc.patch
|
||||
(
|
||||
echo '+ { "Erich E. Hoover", "server: Add default security descriptor ownership for processes.", 1 },';
|
||||
echo '+ { "Erich E. Hoover", "server: Add default security descriptor DACL for processes.", 1 },';
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset server-CreateProcess_ACLs
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
@ -2019,23 +2032,6 @@ if test "$enable_server_CreateProcess_ACLs" -eq 1; then
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset server-Misc_ACL
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#15980] GetSecurityInfo returns NULL DACL for process object
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/advapi32/tests/security.c, server/process.c, server/security.h, server/token.c
|
||||
# |
|
||||
if test "$enable_server_Misc_ACL" -eq 1; then
|
||||
patch_apply server-Misc_ACL/0001-server-Add-default-security-descriptor-ownership-for.patch
|
||||
patch_apply server-Misc_ACL/0002-server-Add-default-security-descriptor-DACL-for-proc.patch
|
||||
(
|
||||
echo '+ { "Erich E. Hoover", "server: Add default security descriptor ownership for processes.", 1 },';
|
||||
echo '+ { "Erich E. Hoover", "server: Add default security descriptor DACL for processes.", 1 },';
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset advapi32-LsaLookupSids
|
||||
# |
|
||||
# | Modified files:
|
||||
@ -3733,20 +3729,6 @@ if test "$enable_ntdll_Threading" -eq 1; then
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntdll-Threadpool_Cleanup
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/ntdll/tests/threadpool.c, dlls/ntdll/threadpool.c
|
||||
# |
|
||||
if test "$enable_ntdll_Threadpool_Cleanup" -eq 1; then
|
||||
patch_apply ntdll-Threadpool_Cleanup/0001-ntdll-tests-Add-basic-tests-for-RtlQueueWorkItem.patch
|
||||
patch_apply ntdll-Threadpool_Cleanup/0002-ntdll-Reimplement-RtlQueueWorkItem-on-top-of-new-thr.patch
|
||||
(
|
||||
echo '+ { "Sebastian Lackner", "ntdll/tests: Add basic tests for RtlQueueWorkItem.", 1 },';
|
||||
echo '+ { "Sebastian Lackner", "ntdll: Reimplement RtlQueueWorkItem on top of new threadpool API.", 1 },';
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntdll-User_Shared_Data
|
||||
# |
|
||||
# | Modified files:
|
||||
@ -4688,21 +4670,9 @@ fi
|
||||
# | dlls/vcomp90/vcomp90.spec
|
||||
# |
|
||||
if test "$enable_vcomp_Functions" -eq 1; then
|
||||
patch_apply vcomp-Functions/0001-vcomp-Implement-32-bit-atomic-integer-functions.patch
|
||||
patch_apply vcomp-Functions/0002-vcomp-tests-Add-tests-for-32-bit-atomic-integer-func.patch
|
||||
patch_apply vcomp-Functions/0003-vcomp-Implement-atomic-float-functions.patch
|
||||
patch_apply vcomp-Functions/0004-vcomp-tests-Add-tests-for-atomic-float-functions.patch
|
||||
patch_apply vcomp-Functions/0005-vcomp-Implement-atomic-double-functions.patch
|
||||
patch_apply vcomp-Functions/0006-vcomp-tests-Add-tests-for-atomic-double-functions.patch
|
||||
patch_apply vcomp-Functions/0007-vcomp-Implement-_vcomp_for_dynamic_init-and-_vcomp_f.patch
|
||||
patch_apply vcomp-Functions/0008-vcomp-tests-Add-tests-for-_vcomp_for_dynamic_init.patch
|
||||
patch_apply vcomp-Functions/0001-vcomp-Implement-_vcomp_for_dynamic_init-and-_vcomp_f.patch
|
||||
patch_apply vcomp-Functions/0002-vcomp-tests-Add-tests-for-_vcomp_for_dynamic_init.patch
|
||||
(
|
||||
echo '+ { "Sebastian Lackner", "vcomp: Implement 32-bit atomic integer functions.", 1 },';
|
||||
echo '+ { "Sebastian Lackner", "vcomp/tests: Add tests for 32-bit atomic integer functions.", 1 },';
|
||||
echo '+ { "Sebastian Lackner", "vcomp: Implement atomic float functions.", 1 },';
|
||||
echo '+ { "Sebastian Lackner", "vcomp/tests: Add tests for atomic float functions.", 1 },';
|
||||
echo '+ { "Sebastian Lackner", "vcomp: Implement atomic double functions.", 1 },';
|
||||
echo '+ { "Sebastian Lackner", "vcomp/tests: Add tests for atomic double functions.", 1 },';
|
||||
echo '+ { "Sebastian Lackner", "vcomp: Implement _vcomp_for_dynamic_init and _vcomp_for_dynamic_next.", 1 },';
|
||||
echo '+ { "Sebastian Lackner", "vcomp/tests: Add tests for _vcomp_for_dynamic_init.", 1 },';
|
||||
) >> "$patchlist"
|
||||
|
@ -1,166 +0,0 @@
|
||||
From 6f3f0538fc92bc42e942353a446df3afdb395a19 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sun, 26 Jul 2015 01:53:56 +0200
|
||||
Subject: vcomp: Implement 32-bit atomic integer functions.
|
||||
|
||||
---
|
||||
dlls/vcomp/main.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
dlls/vcomp/vcomp.spec | 22 ++++++++---------
|
||||
2 files changed, 76 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/dlls/vcomp/main.c b/dlls/vcomp/main.c
|
||||
index ae5623b..6f0caf6 100644
|
||||
--- a/dlls/vcomp/main.c
|
||||
+++ b/dlls/vcomp/main.c
|
||||
@@ -22,6 +22,7 @@
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
+#include "wine/port.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <assert.h>
|
||||
@@ -221,6 +222,70 @@ static void vcomp_free_thread_data(void)
|
||||
vcomp_set_thread_data(NULL);
|
||||
}
|
||||
|
||||
+void CDECL _vcomp_atomic_add_i4(int *dest, int val)
|
||||
+{
|
||||
+ interlocked_xchg_add(dest, val);
|
||||
+}
|
||||
+
|
||||
+void CDECL _vcomp_atomic_and_i4(int *dest, int val)
|
||||
+{
|
||||
+ int old;
|
||||
+ do old = *dest; while (interlocked_cmpxchg(dest, old & val, old) != old);
|
||||
+}
|
||||
+
|
||||
+void CDECL _vcomp_atomic_div_i4(int *dest, int val)
|
||||
+{
|
||||
+ int old;
|
||||
+ do old = *dest; while (interlocked_cmpxchg(dest, old / val, old) != old);
|
||||
+}
|
||||
+
|
||||
+void CDECL _vcomp_atomic_div_ui4(unsigned int *dest, unsigned int val)
|
||||
+{
|
||||
+ unsigned int old;
|
||||
+ do old = *dest; while (interlocked_cmpxchg((int *)dest, old / val, old) != old);
|
||||
+}
|
||||
+
|
||||
+void CDECL _vcomp_atomic_mul_i4(int *dest, int val)
|
||||
+{
|
||||
+ int old;
|
||||
+ do old = *dest; while (interlocked_cmpxchg(dest, old * val, old) != old);
|
||||
+}
|
||||
+
|
||||
+void CDECL _vcomp_atomic_or_i4(int *dest, int val)
|
||||
+{
|
||||
+ int old;
|
||||
+ do old = *dest; while (interlocked_cmpxchg(dest, old | val, old) != old);
|
||||
+}
|
||||
+
|
||||
+void CDECL _vcomp_atomic_shl_i4(int *dest, int val)
|
||||
+{
|
||||
+ int old;
|
||||
+ do old = *dest; while (interlocked_cmpxchg(dest, old << val, old) != old);
|
||||
+}
|
||||
+
|
||||
+void CDECL _vcomp_atomic_shr_i4(int *dest, int val)
|
||||
+{
|
||||
+ int old;
|
||||
+ do old = *dest; while (interlocked_cmpxchg(dest, old >> val, old) != old);
|
||||
+}
|
||||
+
|
||||
+void CDECL _vcomp_atomic_shr_ui4(unsigned int *dest, unsigned int val)
|
||||
+{
|
||||
+ unsigned int old;
|
||||
+ do old = *dest; while (interlocked_cmpxchg((int *)dest, old >> val, old) != old);
|
||||
+}
|
||||
+
|
||||
+void CDECL _vcomp_atomic_sub_i4(int *dest, int val)
|
||||
+{
|
||||
+ interlocked_xchg_add(dest, -val);
|
||||
+}
|
||||
+
|
||||
+void CDECL _vcomp_atomic_xor_i4(int *dest, int val)
|
||||
+{
|
||||
+ int old;
|
||||
+ do old = *dest; while (interlocked_cmpxchg(dest, old ^ val, old) != old);
|
||||
+}
|
||||
+
|
||||
int CDECL omp_get_dynamic(void)
|
||||
{
|
||||
TRACE("stub\n");
|
||||
diff --git a/dlls/vcomp/vcomp.spec b/dlls/vcomp/vcomp.spec
|
||||
index 7083ce4..768daef 100644
|
||||
--- a/dlls/vcomp/vcomp.spec
|
||||
+++ b/dlls/vcomp/vcomp.spec
|
||||
@@ -1,54 +1,54 @@
|
||||
@ stub _vcomp_atomic_add_i1
|
||||
@ stub _vcomp_atomic_add_i2
|
||||
-@ stub _vcomp_atomic_add_i4
|
||||
+@ cdecl _vcomp_atomic_add_i4(ptr long)
|
||||
@ stub _vcomp_atomic_add_i8
|
||||
@ stub _vcomp_atomic_add_r4
|
||||
@ stub _vcomp_atomic_add_r8
|
||||
@ stub _vcomp_atomic_and_i1
|
||||
@ stub _vcomp_atomic_and_i2
|
||||
-@ stub _vcomp_atomic_and_i4
|
||||
+@ cdecl _vcomp_atomic_and_i4(ptr long)
|
||||
@ stub _vcomp_atomic_and_i8
|
||||
@ stub _vcomp_atomic_div_i1
|
||||
@ stub _vcomp_atomic_div_i2
|
||||
-@ stub _vcomp_atomic_div_i4
|
||||
+@ cdecl _vcomp_atomic_div_i4(ptr long)
|
||||
@ stub _vcomp_atomic_div_i8
|
||||
@ stub _vcomp_atomic_div_r4
|
||||
@ stub _vcomp_atomic_div_r8
|
||||
@ stub _vcomp_atomic_div_ui1
|
||||
@ stub _vcomp_atomic_div_ui2
|
||||
-@ stub _vcomp_atomic_div_ui4
|
||||
+@ cdecl _vcomp_atomic_div_ui4(ptr long)
|
||||
@ stub _vcomp_atomic_div_ui8
|
||||
@ stub _vcomp_atomic_mul_i1
|
||||
@ stub _vcomp_atomic_mul_i2
|
||||
-@ stub _vcomp_atomic_mul_i4
|
||||
+@ cdecl _vcomp_atomic_mul_i4(ptr long)
|
||||
@ stub _vcomp_atomic_mul_i8
|
||||
@ stub _vcomp_atomic_mul_r4
|
||||
@ stub _vcomp_atomic_mul_r8
|
||||
@ stub _vcomp_atomic_or_i1
|
||||
@ stub _vcomp_atomic_or_i2
|
||||
-@ stub _vcomp_atomic_or_i4
|
||||
+@ cdecl _vcomp_atomic_or_i4(ptr long)
|
||||
@ stub _vcomp_atomic_or_i8
|
||||
@ stub _vcomp_atomic_shl_i1
|
||||
@ stub _vcomp_atomic_shl_i2
|
||||
-@ stub _vcomp_atomic_shl_i4
|
||||
+@ cdecl _vcomp_atomic_shl_i4(ptr long)
|
||||
@ stub _vcomp_atomic_shl_i8
|
||||
@ stub _vcomp_atomic_shr_i1
|
||||
@ stub _vcomp_atomic_shr_i2
|
||||
-@ stub _vcomp_atomic_shr_i4
|
||||
+@ cdecl _vcomp_atomic_shr_i4(ptr long)
|
||||
@ stub _vcomp_atomic_shr_i8
|
||||
@ stub _vcomp_atomic_shr_ui1
|
||||
@ stub _vcomp_atomic_shr_ui2
|
||||
-@ stub _vcomp_atomic_shr_ui4
|
||||
+@ cdecl _vcomp_atomic_shr_ui4(ptr long)
|
||||
@ stub _vcomp_atomic_shr_ui8
|
||||
@ stub _vcomp_atomic_sub_i1
|
||||
@ stub _vcomp_atomic_sub_i2
|
||||
-@ stub _vcomp_atomic_sub_i4
|
||||
+@ cdecl _vcomp_atomic_sub_i4(ptr long)
|
||||
@ stub _vcomp_atomic_sub_i8
|
||||
@ stub _vcomp_atomic_sub_r4
|
||||
@ stub _vcomp_atomic_sub_r8
|
||||
@ stub _vcomp_atomic_xor_i1
|
||||
@ stub _vcomp_atomic_xor_i2
|
||||
-@ stub _vcomp_atomic_xor_i4
|
||||
+@ cdecl _vcomp_atomic_xor_i4(ptr long)
|
||||
@ stub _vcomp_atomic_xor_i8
|
||||
@ cdecl _vcomp_barrier()
|
||||
@ stub _vcomp_copyprivate_broadcast
|
||||
--
|
||||
2.4.5
|
||||
|
@ -1,168 +0,0 @@
|
||||
From 48fc0019e5f426177b420c0115bf813f989fd1e8 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sun, 26 Jul 2015 01:56:05 +0200
|
||||
Subject: vcomp/tests: Add tests for 32-bit atomic integer functions.
|
||||
|
||||
---
|
||||
dlls/vcomp/tests/vcomp.c | 124 +++++++++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 124 insertions(+)
|
||||
|
||||
diff --git a/dlls/vcomp/tests/vcomp.c b/dlls/vcomp/tests/vcomp.c
|
||||
index 17b37f2..6405f1d 100644
|
||||
--- a/dlls/vcomp/tests/vcomp.c
|
||||
+++ b/dlls/vcomp/tests/vcomp.c
|
||||
@@ -31,6 +31,17 @@ static BOOL (WINAPI *pActivateActCtx)(HANDLE, ULONG_PTR*);
|
||||
static BOOL (WINAPI *pDeactivateActCtx)(DWORD, ULONG_PTR);
|
||||
static VOID (WINAPI *pReleaseActCtx)(HANDLE);
|
||||
|
||||
+static void (CDECL *p_vcomp_atomic_add_i4)(int *dest, int val);
|
||||
+static void (CDECL *p_vcomp_atomic_and_i4)(int *dest, int val);
|
||||
+static void (CDECL *p_vcomp_atomic_div_i4)(int *dest, int val);
|
||||
+static void (CDECL *p_vcomp_atomic_div_ui4)(unsigned int *dest, unsigned int val);
|
||||
+static void (CDECL *p_vcomp_atomic_mul_i4)(int *dest, int val);
|
||||
+static void (CDECL *p_vcomp_atomic_or_i4)(int *dest, int val);
|
||||
+static void (CDECL *p_vcomp_atomic_shl_i4)(int *dest, int val);
|
||||
+static void (CDECL *p_vcomp_atomic_shr_i4)(int *dest, int val);
|
||||
+static void (CDECL *p_vcomp_atomic_shr_ui4)(unsigned int *dest, unsigned int val);
|
||||
+static void (CDECL *p_vcomp_atomic_sub_i4)(int *dest, int val);
|
||||
+static void (CDECL *p_vcomp_atomic_xor_i4)(int *dest, int val);
|
||||
static void (CDECL *p_vcomp_barrier)(void);
|
||||
static void (CDECL *p_vcomp_for_static_end)(void);
|
||||
static void (CDECL *p_vcomp_for_static_init)(int first, int last, int step, int chunksize, unsigned int *loops,
|
||||
@@ -175,6 +186,17 @@ static BOOL init_vcomp(void)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_add_i4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_and_i4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_div_i4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_div_ui4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_mul_i4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_or_i4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_shl_i4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_shr_i4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_shr_ui4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_sub_i4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_xor_i4);
|
||||
VCOMP_GET_PROC(_vcomp_barrier);
|
||||
VCOMP_GET_PROC(_vcomp_for_static_end);
|
||||
VCOMP_GET_PROC(_vcomp_for_static_init);
|
||||
@@ -849,6 +871,106 @@ static void test_vcomp_for_static_init(void)
|
||||
pomp_set_num_threads(max_threads);
|
||||
}
|
||||
|
||||
+static void test_atomic_int32(void)
|
||||
+{
|
||||
+ int val;
|
||||
+
|
||||
+ val = 0x11223344;
|
||||
+ p_vcomp_atomic_add_i4(&val, 0x77665544);
|
||||
+ ok(val == -0x77777778, "expected val == -0x77777778, got %d\n", val);
|
||||
+
|
||||
+ val = 0x11223344;
|
||||
+ p_vcomp_atomic_and_i4(&val, 0x77665544);
|
||||
+ ok(val == 0x11221144, "expected val == 0x11221144, got %d\n", val);
|
||||
+
|
||||
+ val = 0x77665544;
|
||||
+ p_vcomp_atomic_div_i4(&val, 0x11223344);
|
||||
+ ok(val == 6, "expected val == 6, got %d\n", val);
|
||||
+
|
||||
+ val = 0x77665544;
|
||||
+ p_vcomp_atomic_div_i4(&val, -0x11223344);
|
||||
+ ok(val == -6, "expected val == -6, got %d\n", val);
|
||||
+
|
||||
+if (0)
|
||||
+{
|
||||
+ /* crashes on Windows */
|
||||
+ val = 0x11223344;
|
||||
+ p_vcomp_atomic_div_i4(&val, 0);
|
||||
+}
|
||||
+
|
||||
+ val = 0x11223344;
|
||||
+ p_vcomp_atomic_mul_i4(&val, 0x77665544);
|
||||
+ ok(val == -0xecccdf0, "expected val == -0xecccdf0, got %d\n", val);
|
||||
+
|
||||
+ val = 0x11223344;
|
||||
+ p_vcomp_atomic_mul_i4(&val, -0x77665544);
|
||||
+ ok(val == 0xecccdf0, "expected val == 0xecccdf0, got %d\n", val);
|
||||
+
|
||||
+ val = 0x11223344;
|
||||
+ p_vcomp_atomic_or_i4(&val, 0x77665544);
|
||||
+ ok(val == 0x77667744, "expected val == 0x77667744, got %d\n", val);
|
||||
+
|
||||
+ val = 0x11223344;
|
||||
+ p_vcomp_atomic_shl_i4(&val, 3);
|
||||
+ ok(val == -0x76ee65e0, "expected val == -0x76ee65e0, got %d\n", val);
|
||||
+
|
||||
+ val = 0x11223344;
|
||||
+ p_vcomp_atomic_shl_i4(&val, 35);
|
||||
+ ok(val == -0x76ee65e0, "expected val == -0x76ee65e0, got %d\n", val);
|
||||
+
|
||||
+ val = -0x11223344;
|
||||
+ p_vcomp_atomic_shl_i4(&val, 3);
|
||||
+ ok(val == 0x76ee65e0, "expected val == 0x76ee65e0, got %d\n", val);
|
||||
+
|
||||
+ val = 0x11223344;
|
||||
+ p_vcomp_atomic_shr_i4(&val, 3);
|
||||
+ ok(val == 0x2244668, "expected val == 0x2244668, got %d\n", val);
|
||||
+
|
||||
+ val = -0x11223344;
|
||||
+ p_vcomp_atomic_shr_i4(&val, 3);
|
||||
+ ok(val == -0x2244669, "expected val == -0x2244669, got %d\n", val);
|
||||
+
|
||||
+ val = 0x11223344;
|
||||
+ p_vcomp_atomic_sub_i4(&val, 0x77665544);
|
||||
+ ok(val == -0x66442200, "expected val == -0x66442200, got %d\n", val);
|
||||
+
|
||||
+ val = 0x11223344;
|
||||
+ p_vcomp_atomic_xor_i4(&val, 0x77665544);
|
||||
+ ok(val == 0x66446600, "expected val == 0x66446600, got %d\n", val);
|
||||
+}
|
||||
+
|
||||
+static void test_atomic_uint32(void)
|
||||
+{
|
||||
+ unsigned int val;
|
||||
+
|
||||
+ val = 0x77665544;
|
||||
+ p_vcomp_atomic_div_ui4(&val, 0x11223344);
|
||||
+ ok(val == 6, "expected val == 6, got %u\n", val);
|
||||
+
|
||||
+ val = 0x77665544;
|
||||
+ p_vcomp_atomic_div_ui4(&val, 0xeeddccbc);
|
||||
+ ok(val == 0, "expected val == 6, got %u\n", val);
|
||||
+
|
||||
+if (0)
|
||||
+{
|
||||
+ /* crashes on Windows */
|
||||
+ val = 0x11223344;
|
||||
+ p_vcomp_atomic_div_ui4(&val, 0);
|
||||
+}
|
||||
+
|
||||
+ val = 0x11223344;
|
||||
+ p_vcomp_atomic_shr_ui4(&val, 3);
|
||||
+ ok(val == 0x2244668, "expected val == 0x2244668, got %u\n", val);
|
||||
+
|
||||
+ val = 0x11223344;
|
||||
+ p_vcomp_atomic_shr_ui4(&val, 35);
|
||||
+ ok(val == 0x2244668, "expected val == 0x2244668, got %u\n", val);
|
||||
+
|
||||
+ val = -0x11223344;
|
||||
+ p_vcomp_atomic_shr_ui4(&val, 3);
|
||||
+ ok(val == 0x1ddbb997, "expected val == 0x1ddbb997, got %u\n", val);
|
||||
+}
|
||||
+
|
||||
START_TEST(vcomp)
|
||||
{
|
||||
if (!init_vcomp())
|
||||
@@ -860,6 +982,8 @@ START_TEST(vcomp)
|
||||
test_vcomp_sections_init();
|
||||
test_vcomp_for_static_simple_init();
|
||||
test_vcomp_for_static_init();
|
||||
+ test_atomic_int32();
|
||||
+ test_atomic_uint32();
|
||||
|
||||
release_vcomp();
|
||||
}
|
||||
--
|
||||
2.4.5
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 95b19ecbd1cc556939bc6bd8d0b7d2ce71669fb0 Mon Sep 17 00:00:00 2001
|
||||
From 6c4782b340f4cd6c9262cda2a4023f3d472e380e Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sun, 19 Jul 2015 01:05:02 +0200
|
||||
Subject: vcomp/tests: Add tests for _vcomp_for_dynamic_init.
|
||||
@ -8,7 +8,7 @@ Subject: vcomp/tests: Add tests for _vcomp_for_dynamic_init.
|
||||
1 file changed, 68 insertions(+)
|
||||
|
||||
diff --git a/dlls/vcomp/tests/vcomp.c b/dlls/vcomp/tests/vcomp.c
|
||||
index 0c7f8ba..8dab83a 100644
|
||||
index f021a72..faa7bd1 100644
|
||||
--- a/dlls/vcomp/tests/vcomp.c
|
||||
+++ b/dlls/vcomp/tests/vcomp.c
|
||||
@@ -51,6 +51,9 @@ static void (CDECL *p_vcomp_atomic_sub_r4)(float *dest, float val);
|
||||
@ -30,8 +30,8 @@ index 0c7f8ba..8dab83a 100644
|
||||
VCOMP_GET_PROC(_vcomp_for_static_end);
|
||||
VCOMP_GET_PROC(_vcomp_for_static_init);
|
||||
VCOMP_GET_PROC(_vcomp_for_static_simple_init);
|
||||
@@ -1029,6 +1034,68 @@ static void test_atomic_double(void)
|
||||
ok(24.9999 < val && val < 25.0001, "expected val == 25.0, got %f\n", val);
|
||||
@@ -991,6 +996,68 @@ static void test_atomic_double(void)
|
||||
}
|
||||
}
|
||||
|
||||
+static void CDECL for_dynamic_cb(LONG *a, LONG *b, LONG *c)
|
||||
@ -99,14 +99,14 @@ index 0c7f8ba..8dab83a 100644
|
||||
START_TEST(vcomp)
|
||||
{
|
||||
if (!init_vcomp())
|
||||
@@ -1040,6 +1107,7 @@ START_TEST(vcomp)
|
||||
@@ -1002,6 +1069,7 @@ START_TEST(vcomp)
|
||||
test_vcomp_sections_init();
|
||||
test_vcomp_for_static_simple_init();
|
||||
test_vcomp_for_static_init();
|
||||
+ test_vcomp_for_dynamic_init();
|
||||
test_atomic_int32();
|
||||
test_atomic_uint32();
|
||||
test_atomic_integer32();
|
||||
test_atomic_float();
|
||||
test_atomic_double();
|
||||
--
|
||||
2.4.5
|
||||
|
@ -1,108 +0,0 @@
|
||||
From 0fc6d292b2874ddfb7d11d0adfb1796e0ce1ad02 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sun, 26 Jul 2015 01:59:14 +0200
|
||||
Subject: vcomp: Implement atomic float functions.
|
||||
|
||||
---
|
||||
dlls/vcomp/main.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
dlls/vcomp/vcomp.spec | 8 ++++----
|
||||
2 files changed, 48 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/dlls/vcomp/main.c b/dlls/vcomp/main.c
|
||||
index 6f0caf6..92c8eaf 100644
|
||||
--- a/dlls/vcomp/main.c
|
||||
+++ b/dlls/vcomp/main.c
|
||||
@@ -286,6 +286,50 @@ void CDECL _vcomp_atomic_xor_i4(int *dest, int val)
|
||||
do old = *dest; while (interlocked_cmpxchg(dest, old ^ val, old) != old);
|
||||
}
|
||||
|
||||
+void CDECL _vcomp_atomic_add_r4(float *dest, float val)
|
||||
+{
|
||||
+ int old, new;
|
||||
+ do
|
||||
+ {
|
||||
+ old = *(int *)dest;
|
||||
+ *(float *)&new = *(float *)&old + val;
|
||||
+ }
|
||||
+ while (interlocked_cmpxchg((int *)dest, new, old) != old);
|
||||
+}
|
||||
+
|
||||
+void CDECL _vcomp_atomic_div_r4(float *dest, float val)
|
||||
+{
|
||||
+ int old, new;
|
||||
+ do
|
||||
+ {
|
||||
+ old = *(int *)dest;
|
||||
+ *(float *)&new = *(float *)&old / val;
|
||||
+ }
|
||||
+ while (interlocked_cmpxchg((int *)dest, new, old) != old);
|
||||
+}
|
||||
+
|
||||
+void CDECL _vcomp_atomic_mul_r4(float *dest, float val)
|
||||
+{
|
||||
+ int old, new;
|
||||
+ do
|
||||
+ {
|
||||
+ old = *(int *)dest;
|
||||
+ *(float *)&new = *(float *)&old * val;
|
||||
+ }
|
||||
+ while (interlocked_cmpxchg((int *)dest, new, old) != old);
|
||||
+}
|
||||
+
|
||||
+void CDECL _vcomp_atomic_sub_r4(float *dest, float val)
|
||||
+{
|
||||
+ int old, new;
|
||||
+ do
|
||||
+ {
|
||||
+ old = *(int *)dest;
|
||||
+ *(float *)&new = *(float *)&old - val;
|
||||
+ }
|
||||
+ while (interlocked_cmpxchg((int *)dest, new, old) != old);
|
||||
+}
|
||||
+
|
||||
int CDECL omp_get_dynamic(void)
|
||||
{
|
||||
TRACE("stub\n");
|
||||
diff --git a/dlls/vcomp/vcomp.spec b/dlls/vcomp/vcomp.spec
|
||||
index 768daef..bc963cb 100644
|
||||
--- a/dlls/vcomp/vcomp.spec
|
||||
+++ b/dlls/vcomp/vcomp.spec
|
||||
@@ -2,7 +2,7 @@
|
||||
@ stub _vcomp_atomic_add_i2
|
||||
@ cdecl _vcomp_atomic_add_i4(ptr long)
|
||||
@ stub _vcomp_atomic_add_i8
|
||||
-@ stub _vcomp_atomic_add_r4
|
||||
+@ cdecl _vcomp_atomic_add_r4(ptr float)
|
||||
@ stub _vcomp_atomic_add_r8
|
||||
@ stub _vcomp_atomic_and_i1
|
||||
@ stub _vcomp_atomic_and_i2
|
||||
@@ -12,7 +12,7 @@
|
||||
@ stub _vcomp_atomic_div_i2
|
||||
@ cdecl _vcomp_atomic_div_i4(ptr long)
|
||||
@ stub _vcomp_atomic_div_i8
|
||||
-@ stub _vcomp_atomic_div_r4
|
||||
+@ cdecl _vcomp_atomic_div_r4(ptr float)
|
||||
@ stub _vcomp_atomic_div_r8
|
||||
@ stub _vcomp_atomic_div_ui1
|
||||
@ stub _vcomp_atomic_div_ui2
|
||||
@@ -22,7 +22,7 @@
|
||||
@ stub _vcomp_atomic_mul_i2
|
||||
@ cdecl _vcomp_atomic_mul_i4(ptr long)
|
||||
@ stub _vcomp_atomic_mul_i8
|
||||
-@ stub _vcomp_atomic_mul_r4
|
||||
+@ cdecl _vcomp_atomic_mul_r4(ptr float)
|
||||
@ stub _vcomp_atomic_mul_r8
|
||||
@ stub _vcomp_atomic_or_i1
|
||||
@ stub _vcomp_atomic_or_i2
|
||||
@@ -44,7 +44,7 @@
|
||||
@ stub _vcomp_atomic_sub_i2
|
||||
@ cdecl _vcomp_atomic_sub_i4(ptr long)
|
||||
@ stub _vcomp_atomic_sub_i8
|
||||
-@ stub _vcomp_atomic_sub_r4
|
||||
+@ cdecl _vcomp_atomic_sub_r4(ptr float)
|
||||
@ stub _vcomp_atomic_sub_r8
|
||||
@ stub _vcomp_atomic_xor_i1
|
||||
@ stub _vcomp_atomic_xor_i2
|
||||
--
|
||||
2.4.5
|
||||
|
@ -1,92 +0,0 @@
|
||||
From 520f89435a4d23962fc9acf1438a41e0d8a6f350 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sun, 26 Jul 2015 02:00:04 +0200
|
||||
Subject: vcomp/tests: Add tests for atomic float functions.
|
||||
|
||||
---
|
||||
dlls/vcomp/tests/vcomp.c | 30 ++++++++++++++++++++++++++++++
|
||||
1 file changed, 30 insertions(+)
|
||||
|
||||
diff --git a/dlls/vcomp/tests/vcomp.c b/dlls/vcomp/tests/vcomp.c
|
||||
index 6405f1d..ddb691c 100644
|
||||
--- a/dlls/vcomp/tests/vcomp.c
|
||||
+++ b/dlls/vcomp/tests/vcomp.c
|
||||
@@ -32,15 +32,19 @@ static BOOL (WINAPI *pDeactivateActCtx)(DWORD, ULONG_PTR);
|
||||
static VOID (WINAPI *pReleaseActCtx)(HANDLE);
|
||||
|
||||
static void (CDECL *p_vcomp_atomic_add_i4)(int *dest, int val);
|
||||
+static void (CDECL *p_vcomp_atomic_add_r4)(float *dest, float val);
|
||||
static void (CDECL *p_vcomp_atomic_and_i4)(int *dest, int val);
|
||||
static void (CDECL *p_vcomp_atomic_div_i4)(int *dest, int val);
|
||||
+static void (CDECL *p_vcomp_atomic_div_r4)(float *dest, float val);
|
||||
static void (CDECL *p_vcomp_atomic_div_ui4)(unsigned int *dest, unsigned int val);
|
||||
static void (CDECL *p_vcomp_atomic_mul_i4)(int *dest, int val);
|
||||
+static void (CDECL *p_vcomp_atomic_mul_r4)(float *dest, float val);
|
||||
static void (CDECL *p_vcomp_atomic_or_i4)(int *dest, int val);
|
||||
static void (CDECL *p_vcomp_atomic_shl_i4)(int *dest, int val);
|
||||
static void (CDECL *p_vcomp_atomic_shr_i4)(int *dest, int val);
|
||||
static void (CDECL *p_vcomp_atomic_shr_ui4)(unsigned int *dest, unsigned int val);
|
||||
static void (CDECL *p_vcomp_atomic_sub_i4)(int *dest, int val);
|
||||
+static void (CDECL *p_vcomp_atomic_sub_r4)(float *dest, float val);
|
||||
static void (CDECL *p_vcomp_atomic_xor_i4)(int *dest, int val);
|
||||
static void (CDECL *p_vcomp_barrier)(void);
|
||||
static void (CDECL *p_vcomp_for_static_end)(void);
|
||||
@@ -187,15 +191,19 @@ static BOOL init_vcomp(void)
|
||||
}
|
||||
|
||||
VCOMP_GET_PROC(_vcomp_atomic_add_i4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_add_r4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_and_i4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_div_i4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_div_r4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_div_ui4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_mul_i4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_mul_r4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_or_i4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_shl_i4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_shr_i4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_shr_ui4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_sub_i4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_sub_r4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_xor_i4);
|
||||
VCOMP_GET_PROC(_vcomp_barrier);
|
||||
VCOMP_GET_PROC(_vcomp_for_static_end);
|
||||
@@ -971,6 +979,27 @@ if (0)
|
||||
ok(val == 0x1ddbb997, "expected val == 0x1ddbb997, got %u\n", val);
|
||||
}
|
||||
|
||||
+static void test_atomic_float(void)
|
||||
+{
|
||||
+ float val;
|
||||
+
|
||||
+ val = 42.0;
|
||||
+ p_vcomp_atomic_add_r4(&val, 17.0);
|
||||
+ ok(58.9999 < val && val < 59.0001, "expected val == 59.0, got %f\n", val);
|
||||
+
|
||||
+ val = 42.0;
|
||||
+ p_vcomp_atomic_div_r4(&val, 17.0);
|
||||
+ ok(2.4705 < val && val < 2.4707, "expected val == 2.4706, got %f\n", val);
|
||||
+
|
||||
+ val = 42.0;
|
||||
+ p_vcomp_atomic_mul_r4(&val, 17.0);
|
||||
+ ok(713.9999 < val && val < 714.0001, "expected val == 714.0, got %f\n", val);
|
||||
+
|
||||
+ val = 42.0;
|
||||
+ p_vcomp_atomic_sub_r4(&val, 17.0);
|
||||
+ ok(24.9999 < val && val < 25.0001, "expected val == 25.0, got %f\n", val);
|
||||
+}
|
||||
+
|
||||
START_TEST(vcomp)
|
||||
{
|
||||
if (!init_vcomp())
|
||||
@@ -984,6 +1013,7 @@ START_TEST(vcomp)
|
||||
test_vcomp_for_static_init();
|
||||
test_atomic_int32();
|
||||
test_atomic_uint32();
|
||||
+ test_atomic_float();
|
||||
|
||||
release_vcomp();
|
||||
}
|
||||
--
|
||||
2.4.5
|
||||
|
@ -1,108 +0,0 @@
|
||||
From 932eec0d4c46b47bace34f1bcee0483be0b450e0 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sun, 26 Jul 2015 02:01:17 +0200
|
||||
Subject: vcomp: Implement atomic double functions.
|
||||
|
||||
---
|
||||
dlls/vcomp/main.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
dlls/vcomp/vcomp.spec | 8 ++++----
|
||||
2 files changed, 48 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/dlls/vcomp/main.c b/dlls/vcomp/main.c
|
||||
index 92c8eaf..301370c 100644
|
||||
--- a/dlls/vcomp/main.c
|
||||
+++ b/dlls/vcomp/main.c
|
||||
@@ -330,6 +330,50 @@ void CDECL _vcomp_atomic_sub_r4(float *dest, float val)
|
||||
while (interlocked_cmpxchg((int *)dest, new, old) != old);
|
||||
}
|
||||
|
||||
+void CDECL _vcomp_atomic_add_r8(double *dest, double val)
|
||||
+{
|
||||
+ LONG64 old, new;
|
||||
+ do
|
||||
+ {
|
||||
+ old = *(LONG64 *)dest;
|
||||
+ *(double *)&new = *(double *)&old + val;
|
||||
+ }
|
||||
+ while (interlocked_cmpxchg64((LONG64 *)dest, new, old) != old);
|
||||
+}
|
||||
+
|
||||
+void CDECL _vcomp_atomic_div_r8(double *dest, double val)
|
||||
+{
|
||||
+ LONG64 old, new;
|
||||
+ do
|
||||
+ {
|
||||
+ old = *(LONG64 *)dest;
|
||||
+ *(double *)&new = *(double *)&old / val;
|
||||
+ }
|
||||
+ while (interlocked_cmpxchg64((LONG64 *)dest, new, old) != old);
|
||||
+}
|
||||
+
|
||||
+void CDECL _vcomp_atomic_mul_r8(double *dest, double val)
|
||||
+{
|
||||
+ LONG64 old, new;
|
||||
+ do
|
||||
+ {
|
||||
+ old = *(LONG64 *)dest;
|
||||
+ *(double *)&new = *(double *)&old * val;
|
||||
+ }
|
||||
+ while (interlocked_cmpxchg64((LONG64 *)dest, new, old) != old);
|
||||
+}
|
||||
+
|
||||
+void CDECL _vcomp_atomic_sub_r8(double *dest, double val)
|
||||
+{
|
||||
+ LONG64 old, new;
|
||||
+ do
|
||||
+ {
|
||||
+ old = *(LONG64 *)dest;
|
||||
+ *(double *)&new = *(double *)&old - val;
|
||||
+ }
|
||||
+ while (interlocked_cmpxchg64((LONG64 *)dest, new, old) != old);
|
||||
+}
|
||||
+
|
||||
int CDECL omp_get_dynamic(void)
|
||||
{
|
||||
TRACE("stub\n");
|
||||
diff --git a/dlls/vcomp/vcomp.spec b/dlls/vcomp/vcomp.spec
|
||||
index bc963cb..3a709df 100644
|
||||
--- a/dlls/vcomp/vcomp.spec
|
||||
+++ b/dlls/vcomp/vcomp.spec
|
||||
@@ -3,7 +3,7 @@
|
||||
@ cdecl _vcomp_atomic_add_i4(ptr long)
|
||||
@ stub _vcomp_atomic_add_i8
|
||||
@ cdecl _vcomp_atomic_add_r4(ptr float)
|
||||
-@ stub _vcomp_atomic_add_r8
|
||||
+@ cdecl _vcomp_atomic_add_r8(ptr double)
|
||||
@ stub _vcomp_atomic_and_i1
|
||||
@ stub _vcomp_atomic_and_i2
|
||||
@ cdecl _vcomp_atomic_and_i4(ptr long)
|
||||
@@ -13,7 +13,7 @@
|
||||
@ cdecl _vcomp_atomic_div_i4(ptr long)
|
||||
@ stub _vcomp_atomic_div_i8
|
||||
@ cdecl _vcomp_atomic_div_r4(ptr float)
|
||||
-@ stub _vcomp_atomic_div_r8
|
||||
+@ cdecl _vcomp_atomic_div_r8(ptr double)
|
||||
@ stub _vcomp_atomic_div_ui1
|
||||
@ stub _vcomp_atomic_div_ui2
|
||||
@ cdecl _vcomp_atomic_div_ui4(ptr long)
|
||||
@@ -23,7 +23,7 @@
|
||||
@ cdecl _vcomp_atomic_mul_i4(ptr long)
|
||||
@ stub _vcomp_atomic_mul_i8
|
||||
@ cdecl _vcomp_atomic_mul_r4(ptr float)
|
||||
-@ stub _vcomp_atomic_mul_r8
|
||||
+@ cdecl _vcomp_atomic_mul_r8(ptr double)
|
||||
@ stub _vcomp_atomic_or_i1
|
||||
@ stub _vcomp_atomic_or_i2
|
||||
@ cdecl _vcomp_atomic_or_i4(ptr long)
|
||||
@@ -45,7 +45,7 @@
|
||||
@ cdecl _vcomp_atomic_sub_i4(ptr long)
|
||||
@ stub _vcomp_atomic_sub_i8
|
||||
@ cdecl _vcomp_atomic_sub_r4(ptr float)
|
||||
-@ stub _vcomp_atomic_sub_r8
|
||||
+@ cdecl _vcomp_atomic_sub_r8(ptr double)
|
||||
@ stub _vcomp_atomic_xor_i1
|
||||
@ stub _vcomp_atomic_xor_i2
|
||||
@ cdecl _vcomp_atomic_xor_i4(ptr long)
|
||||
--
|
||||
2.4.5
|
||||
|
@ -1,98 +0,0 @@
|
||||
From 3858848a1e3057ad9c1edc8d92f8d6f4e614261e Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sun, 26 Jul 2015 02:02:23 +0200
|
||||
Subject: vcomp/tests: Add tests for atomic double functions.
|
||||
|
||||
---
|
||||
dlls/vcomp/tests/vcomp.c | 30 ++++++++++++++++++++++++++++++
|
||||
1 file changed, 30 insertions(+)
|
||||
|
||||
diff --git a/dlls/vcomp/tests/vcomp.c b/dlls/vcomp/tests/vcomp.c
|
||||
index ddb691c..0c7f8ba 100644
|
||||
--- a/dlls/vcomp/tests/vcomp.c
|
||||
+++ b/dlls/vcomp/tests/vcomp.c
|
||||
@@ -33,18 +33,22 @@ static VOID (WINAPI *pReleaseActCtx)(HANDLE);
|
||||
|
||||
static void (CDECL *p_vcomp_atomic_add_i4)(int *dest, int val);
|
||||
static void (CDECL *p_vcomp_atomic_add_r4)(float *dest, float val);
|
||||
+static void (CDECL *p_vcomp_atomic_add_r8)(double *dest, double val);
|
||||
static void (CDECL *p_vcomp_atomic_and_i4)(int *dest, int val);
|
||||
static void (CDECL *p_vcomp_atomic_div_i4)(int *dest, int val);
|
||||
static void (CDECL *p_vcomp_atomic_div_r4)(float *dest, float val);
|
||||
+static void (CDECL *p_vcomp_atomic_div_r8)(double *dest, double val);
|
||||
static void (CDECL *p_vcomp_atomic_div_ui4)(unsigned int *dest, unsigned int val);
|
||||
static void (CDECL *p_vcomp_atomic_mul_i4)(int *dest, int val);
|
||||
static void (CDECL *p_vcomp_atomic_mul_r4)(float *dest, float val);
|
||||
+static void (CDECL *p_vcomp_atomic_mul_r8)(double *dest, double val);
|
||||
static void (CDECL *p_vcomp_atomic_or_i4)(int *dest, int val);
|
||||
static void (CDECL *p_vcomp_atomic_shl_i4)(int *dest, int val);
|
||||
static void (CDECL *p_vcomp_atomic_shr_i4)(int *dest, int val);
|
||||
static void (CDECL *p_vcomp_atomic_shr_ui4)(unsigned int *dest, unsigned int val);
|
||||
static void (CDECL *p_vcomp_atomic_sub_i4)(int *dest, int val);
|
||||
static void (CDECL *p_vcomp_atomic_sub_r4)(float *dest, float val);
|
||||
+static void (CDECL *p_vcomp_atomic_sub_r8)(double *dest, double val);
|
||||
static void (CDECL *p_vcomp_atomic_xor_i4)(int *dest, int val);
|
||||
static void (CDECL *p_vcomp_barrier)(void);
|
||||
static void (CDECL *p_vcomp_for_static_end)(void);
|
||||
@@ -192,18 +196,22 @@ static BOOL init_vcomp(void)
|
||||
|
||||
VCOMP_GET_PROC(_vcomp_atomic_add_i4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_add_r4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_add_r8);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_and_i4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_div_i4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_div_r4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_div_r8);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_div_ui4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_mul_i4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_mul_r4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_mul_r8);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_or_i4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_shl_i4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_shr_i4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_shr_ui4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_sub_i4);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_sub_r4);
|
||||
+ VCOMP_GET_PROC(_vcomp_atomic_sub_r8);
|
||||
VCOMP_GET_PROC(_vcomp_atomic_xor_i4);
|
||||
VCOMP_GET_PROC(_vcomp_barrier);
|
||||
VCOMP_GET_PROC(_vcomp_for_static_end);
|
||||
@@ -1000,6 +1008,27 @@ static void test_atomic_float(void)
|
||||
ok(24.9999 < val && val < 25.0001, "expected val == 25.0, got %f\n", val);
|
||||
}
|
||||
|
||||
+static void test_atomic_double(void)
|
||||
+{
|
||||
+ double val;
|
||||
+
|
||||
+ val = 42.0;
|
||||
+ p_vcomp_atomic_add_r8(&val, 17.0);
|
||||
+ ok(58.9999 < val && val < 59.0001, "expected val == 59.0, got %f\n", val);
|
||||
+
|
||||
+ val = 42.0;
|
||||
+ p_vcomp_atomic_div_r8(&val, 17.0);
|
||||
+ ok(2.4705 < val && val < 2.4707, "expected val == 2.4706, got %f\n", val);
|
||||
+
|
||||
+ val = 42.0;
|
||||
+ p_vcomp_atomic_mul_r8(&val, 17.0);
|
||||
+ ok(713.9999 < val && val < 714.0001, "expected val == 714.0, got %f\n", val);
|
||||
+
|
||||
+ val = 42.0;
|
||||
+ p_vcomp_atomic_sub_r8(&val, 17.0);
|
||||
+ ok(24.9999 < val && val < 25.0001, "expected val == 25.0, got %f\n", val);
|
||||
+}
|
||||
+
|
||||
START_TEST(vcomp)
|
||||
{
|
||||
if (!init_vcomp())
|
||||
@@ -1014,6 +1043,7 @@ START_TEST(vcomp)
|
||||
test_atomic_int32();
|
||||
test_atomic_uint32();
|
||||
test_atomic_float();
|
||||
+ test_atomic_double();
|
||||
|
||||
release_vcomp();
|
||||
}
|
||||
--
|
||||
2.4.5
|
||||
|
@ -1,4 +1,4 @@
|
||||
From cac0838d345702dec114c18ff6d38222b8bf5747 Mon Sep 17 00:00:00 2001
|
||||
From 53a49004741dbe3d7cf1b9e79ed0a5b021bef51a Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Sat, 6 Jun 2015 06:53:34 +0200
|
||||
Subject: wined3d: Use real values for memory accounting on NVIDIA cards.
|
||||
@ -10,7 +10,7 @@ Subject: wined3d: Use real values for memory accounting on NVIDIA cards.
|
||||
3 files changed, 38 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
|
||||
index 56cf325..8f62570 100644
|
||||
index c746d18..f33b313 100644
|
||||
--- a/dlls/wined3d/device.c
|
||||
+++ b/dlls/wined3d/device.c
|
||||
@@ -1181,8 +1181,31 @@ void CDECL wined3d_device_set_multithreaded(struct wined3d_device *device)
|
||||
@ -46,7 +46,7 @@ index 56cf325..8f62570 100644
|
||||
wine_dbgstr_longlong(device->adapter->vram_bytes),
|
||||
wine_dbgstr_longlong(device->adapter->vram_bytes_used),
|
||||
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
|
||||
index 61c3059..97c7f36 100644
|
||||
index ce23c47..af7a63b 100644
|
||||
--- a/dlls/wined3d/directx.c
|
||||
+++ b/dlls/wined3d/directx.c
|
||||
@@ -220,6 +220,7 @@ static const struct wined3d_extension_map gl_extension_map[] =
|
||||
@ -57,7 +57,7 @@ index 61c3059..97c7f36 100644
|
||||
|
||||
/* SGI */
|
||||
{"GL_SGIS_generate_mipmap", SGIS_GENERATE_MIPMAP },
|
||||
@@ -1392,7 +1393,8 @@ static const struct gpu_description *get_gpu_description(enum wined3d_pci_vendor
|
||||
@@ -1395,7 +1396,8 @@ static const struct gpu_description *get_gpu_description(enum wined3d_pci_vendor
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -67,7 +67,7 @@ index 61c3059..97c7f36 100644
|
||||
enum wined3d_pci_vendor vendor, enum wined3d_pci_device device)
|
||||
{
|
||||
OSVERSIONINFOW os_version;
|
||||
@@ -1501,6 +1503,16 @@ static void init_driver_info(struct wined3d_driver_info *driver_info,
|
||||
@@ -1504,6 +1506,16 @@ static void init_driver_info(struct wined3d_driver_info *driver_info,
|
||||
driver = DRIVER_UNKNOWN;
|
||||
}
|
||||
|
||||
@ -84,15 +84,15 @@ index 61c3059..97c7f36 100644
|
||||
if (wined3d_settings.emulated_textureram)
|
||||
{
|
||||
TRACE("Overriding amount of video memory with 0x%s bytes.\n",
|
||||
@@ -3801,7 +3813,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter)
|
||||
@@ -3804,7 +3816,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter)
|
||||
}
|
||||
|
||||
fixup_extensions(gl_info, gl_renderer_str, gl_vendor, card_vendor, device);
|
||||
- init_driver_info(driver_info, card_vendor, device);
|
||||
+ init_driver_info(gl_info, driver_info, card_vendor, device);
|
||||
add_gl_compat_wrappers(gl_info);
|
||||
|
||||
return TRUE;
|
||||
gl_ext_emul_mask = adapter->vertex_pipe->vp_get_emul_mask(gl_info)
|
||||
| adapter->fragment_pipe->get_emul_mask(gl_info);
|
||||
if (gl_ext_emul_mask & GL_EXT_EMUL_ARB_MULTITEXTURE)
|
||||
diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h
|
||||
index 8c07ed1..3007516 100644
|
||||
--- a/dlls/wined3d/wined3d_gl.h
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user