diff --git a/0003-pending-mrs-and-backports/6722-win32u-Yet-more-arc-fixes/0001-win32u-Normalize-inverted-rectangles-in-dibdrv-RoundRect-.patch b/0003-pending-mrs-and-backports/6722-win32u-Yet-more-arc-fixes/0001-win32u-Normalize-inverted-rectangles-in-dibdrv-RoundRect-.patch deleted file mode 100644 index 6bf7a8e..0000000 --- a/0003-pending-mrs-and-backports/6722-win32u-Yet-more-arc-fixes/0001-win32u-Normalize-inverted-rectangles-in-dibdrv-RoundRect-.patch +++ /dev/null @@ -1,36 +0,0 @@ -From df0921903cee6871c32d81b4ff3ea96b6913ee96 Mon Sep 17 00:00:00 2001 -From: Elizabeth Figura -Date: Tue, 22 Oct 2024 13:23:16 -0500 -Subject: [PATCH] win32u: Normalize inverted rectangles in dibdrv_RoundRect(). - ---- - dlls/win32u/dibdrv/graphics.c | 13 +++++++++++++ - 1 file changed, 13 insertions(+) - -diff --git a/dlls/win32u/dibdrv/graphics.c b/dlls/win32u/dibdrv/graphics.c -index cc62d6a681b..e7648cb2596 100644 ---- a/dlls/win32u/dibdrv/graphics.c -+++ b/dlls/win32u/dibdrv/graphics.c -@@ -1556,6 +1556,19 @@ BOOL dibdrv_RoundRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom, - return FALSE; - } - -+ if (right < left) -+ { -+ int tmp = left; -+ left = right; -+ right = tmp; -+ } -+ if (bottom < top) -+ { -+ int tmp = top; -+ top = bottom; -+ bottom = tmp; -+ } -+ - SetRect( &rect, left, top, left + ellipse_width, top + ellipse_height ); - /* Points are relative to the arc center. - * We just need to specify any point on the vector. */ --- -GitLab - diff --git a/0003-pending-mrs-and-backports/6722-win32u-Yet-more-arc-fixes/0002-win32u-Correctly-handle-transforms-which-flip-in-get-arc-points-.patch b/0003-pending-mrs-and-backports/6722-win32u-Yet-more-arc-fixes/0002-win32u-Correctly-handle-transforms-which-flip-in-get-arc-points-.patch deleted file mode 100644 index 5e1ec35..0000000 --- a/0003-pending-mrs-and-backports/6722-win32u-Yet-more-arc-fixes/0002-win32u-Correctly-handle-transforms-which-flip-in-get-arc-points-.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 32cb2737c4ea8bfcaf41609fbd78849311d709ca Mon Sep 17 00:00:00 2001 -From: Elizabeth Figura -Date: Tue, 22 Oct 2024 13:24:13 -0500 -Subject: [PATCH] win32u: Correctly handle transforms which flip in - get_arc_points(). - ---- - dlls/win32u/dibdrv/graphics.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/dlls/win32u/dibdrv/graphics.c b/dlls/win32u/dibdrv/graphics.c -index e7648cb2596..64d58ac6ed7 100644 ---- a/dlls/win32u/dibdrv/graphics.c -+++ b/dlls/win32u/dibdrv/graphics.c -@@ -316,6 +316,12 @@ static int get_arc_points( DC *dc, int arc_dir, const RECT *rect, POINT start, P - - count = generate_ellipse_top_half( dc, width, height, points ); - -+ /* The ellipse is always generated counterclockwise from the origin. -+ * This means our points will essentially be backwards if the world -+ * transform includes a flip. Swap the arc direction to correct for this. */ -+ if (dc->xformWorld2Vport.eM11 * dc->xformWorld2Vport.eM22 < dc->xformWorld2Vport.eM12 * dc->xformWorld2Vport.eM21) -+ arc_dir = (arc_dir == AD_CLOCKWISE ? AD_COUNTERCLOCKWISE : AD_CLOCKWISE); -+ - /* Transform the start and end, but do not translate them, so that they - * remain relative to the ellipse center. */ - lp_to_dp_no_translate( dc, &start ); --- -GitLab - diff --git a/0003-pending-mrs-and-backports/6722-win32u-Yet-more-arc-fixes/0003-win32u-Do-not-convert-back-to-integer-before-finding-intersections.patch b/0003-pending-mrs-and-backports/6722-win32u-Yet-more-arc-fixes/0003-win32u-Do-not-convert-back-to-integer-before-finding-intersections.patch deleted file mode 100644 index 3faeb54..0000000 --- a/0003-pending-mrs-and-backports/6722-win32u-Yet-more-arc-fixes/0003-win32u-Do-not-convert-back-to-integer-before-finding-intersections.patch +++ /dev/null @@ -1,112 +0,0 @@ -From 40f4a0422b880f3cd6796f98c8eea0df00aa107e Mon Sep 17 00:00:00 2001 -From: Elizabeth Figura -Date: Tue, 22 Oct 2024 16:56:40 -0500 -Subject: [PATCH] win32u: Do not convert back to integer before finding - intersections. - -This unnecessarily loses precision, and if the point is very close to the origin -(as for the internal arcs generated by RoundRect(), but also for those specified -manually) this may generate an incorrect arc. - -This addresses the last artifacts from bug 35331. ---- - dlls/win32u/dibdrv/graphics.c | 41 +++++++++++++++-------------------- - 1 file changed, 17 insertions(+), 24 deletions(-) - -diff --git a/dlls/win32u/dibdrv/graphics.c b/dlls/win32u/dibdrv/graphics.c -index 64d58ac6ed7..7af658230a5 100644 ---- a/dlls/win32u/dibdrv/graphics.c -+++ b/dlls/win32u/dibdrv/graphics.c -@@ -267,7 +267,7 @@ static unsigned int generate_ellipse_top_half( const DC *dc, double width, doubl - return pos; - } - --static int find_intersection( const POINT *points, int x, int y, int count ) -+static int find_intersection( const POINT *points, double x, double y, int count ) - { - int i; - -@@ -299,15 +299,16 @@ static int find_intersection( const POINT *points, int x, int y, int count ) - } - } - --static void lp_to_dp_no_translate( DC *dc, POINT *point ) -+static void lp_to_dp_no_translate( DC *dc, double *x, double *y ) - { -- double x = point->x; -- double y = point->y; -- point->x = GDI_ROUND( x * dc->xformWorld2Vport.eM11 + y * dc->xformWorld2Vport.eM21 ); -- point->y = GDI_ROUND( x * dc->xformWorld2Vport.eM12 + y * dc->xformWorld2Vport.eM22 ); -+ double in_x = *x, in_y = *y; -+ -+ *x = in_x * dc->xformWorld2Vport.eM11 + in_y * dc->xformWorld2Vport.eM21; -+ *y = in_x * dc->xformWorld2Vport.eM12 + in_y * dc->xformWorld2Vport.eM22; - } - --static int get_arc_points( DC *dc, int arc_dir, const RECT *rect, POINT start, POINT end, POINT *points ) -+static int get_arc_points( DC *dc, int arc_dir, const RECT *rect, double start_x, double start_y, -+ double end_x, double end_y, POINT *points ) - { - int i, pos, count, start_pos, end_pos; - int width = rect->right - rect->left; -@@ -324,11 +325,11 @@ static int get_arc_points( DC *dc, int arc_dir, const RECT *rect, POINT start, P - - /* Transform the start and end, but do not translate them, so that they - * remain relative to the ellipse center. */ -- lp_to_dp_no_translate( dc, &start ); -- lp_to_dp_no_translate( dc, &end ); -+ lp_to_dp_no_translate( dc, &start_x, &start_y ); -+ lp_to_dp_no_translate( dc, &end_x, &end_y ); - -- start_pos = find_intersection( points, start.x, start.y, count ); -- end_pos = find_intersection( points, end.x, end.y, count ); -+ start_pos = find_intersection( points, start_x, start_y, count ); -+ end_pos = find_intersection( points, end_x, end_y, count ); - if (arc_dir == AD_CLOCKWISE) - { - int tmp = start_pos; -@@ -429,9 +430,9 @@ static BOOL draw_arc( PHYSDEV dev, INT left, INT top, INT right, INT bottom, - { - points[0] = dc->attr->cur_pos; - lp_to_dp( dc, points, 1 ); -- count = 1 + get_arc_points( dc, dc->attr->arc_direction, &rect, pt[0], pt[1], points + 1 ); -+ count = 1 + get_arc_points( dc, dc->attr->arc_direction, &rect, pt[0].x, pt[0].y, pt[1].x, pt[1].y, points + 1 ); - } -- else count = get_arc_points( dc, dc->attr->arc_direction, &rect, pt[0], pt[1], points ); -+ else count = get_arc_points( dc, dc->attr->arc_direction, &rect, pt[0].x, pt[0].y, pt[1].x, pt[1].y, points ); - - if (count > max_points) - ERR( "point count %u exceeds max points %u\n", count, max_points ); -@@ -1538,7 +1539,7 @@ BOOL dibdrv_RoundRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom, - dibdrv_physdev *pdev = get_dibdrv_pdev( dev ); - DC *dc = get_physdev_dc( dev ); - RECT rect; -- POINT start, end, rect_center, *points, *top_points; -+ POINT rect_center, *points, *top_points; - int count, max_points; - BOOL ret = TRUE; - HRGN outline = 0, interior = 0; -@@ -1578,18 +1579,10 @@ BOOL dibdrv_RoundRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom, - SetRect( &rect, left, top, left + ellipse_width, top + ellipse_height ); - /* Points are relative to the arc center. - * We just need to specify any point on the vector. */ -- start.x = -1; -- start.y = 0; -- end.x = 0; -- end.y = -1; -- count = get_arc_points( dc, AD_CLOCKWISE, &rect, start, end, top_points ); -+ count = get_arc_points( dc, AD_CLOCKWISE, &rect, -1.0, 0.0, 0.0, -1.0, top_points ); - - SetRect( &rect, right - ellipse_width, top, right, top + ellipse_height ); -- start.x = 0; -- start.y = -1; -- end.x = 1; -- end.y = 0; -- count += get_arc_points( dc, AD_CLOCKWISE, &rect, start, end, top_points + count ); -+ count += get_arc_points( dc, AD_CLOCKWISE, &rect, 0.0, -1.0, 1.0, 0.0, top_points + count ); - - if (count * 2 > max_points) - ERR( "point count %u * 2 exceeds max points %u\n", count, max_points ); --- -GitLab - diff --git a/0007-proton-esync-fsync/0170-fsync-Add-compatibility-macros-for-missing-compiler-.patch b/0007-proton-esync-fsync/0170-fsync-Add-compatibility-macros-for-missing-compiler-.patch deleted file mode 100644 index e3e6ac4..0000000 --- a/0007-proton-esync-fsync/0170-fsync-Add-compatibility-macros-for-missing-compiler-.patch +++ /dev/null @@ -1,155 +0,0 @@ -From 5375ae3fff6ea70249c236ef1c1d22a40e805f6d Mon Sep 17 00:00:00 2001 -From: William Horvath -Date: Mon, 28 Oct 2024 11:16:48 -0700 -Subject: [PATCH] fsync: Add compatibility macros for missing compiler builtins - on 32-bit clang. - ---- - dlls/ntdll/unix/fsync.c | 1 - - dlls/ntdll/unix/fsync.h | 171 ++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 171 insertions(+), 1 deletion(-) - -diff --git a/dlls/ntdll/unix/fsync.c b/dlls/ntdll/unix/fsync.c -index c3da44e4f26..835a6bd945b 100644 ---- a/dlls/ntdll/unix/fsync.c -+++ b/dlls/ntdll/unix/fsync.c -@@ -42,7 +42,6 @@ - # include - #endif - #include --#include - - #include "ntstatus.h" - #define WIN32_NO_STATUS -diff --git a/dlls/ntdll/unix/fsync.h b/dlls/ntdll/unix/fsync.h -index 6005c0fa322..861eadb5365 100644 ---- a/dlls/ntdll/unix/fsync.h -+++ b/dlls/ntdll/unix/fsync.h -@@ -52,3 +52,124 @@ extern NTSTATUS fsync_signal_and_wait( HANDLE signal, HANDLE wait, - * called from NtClose() doesn't race with get_fsync_idx(), add_to_list() sequence called - * from get_object(). */ - extern pthread_mutex_t fd_cache_mutex; -+ -+#include -+ -+#if defined(__i386__) && defined(__clang__) && defined(__linux__) -+ -+/* 32-bit atomics using x86 locked instructions */ -+#define __atomic_load_n_32bits(ptr) ({ \ -+ uint32_t _val; \ -+ __asm__ __volatile__( \ -+ "movl %1, %0" \ -+ : "=r" (_val) \ -+ : "m" (*(ptr)) \ -+ : "memory"); \ -+ _val; \ -+}) -+ -+#define __atomic_store_n_32bits(ptr, val) ({ \ -+ uint32_t _new = (val); \ -+ __asm__ __volatile__( \ -+ "movl %1, %0" \ -+ : "=m" (*(ptr)) \ -+ : "r" (_new) \ -+ : "memory"); \ -+}) -+ -+#define __atomic_exchange_32bits(ptr, val) ({ \ -+ uint32_t _new = (val); \ -+ __asm__ __volatile__( \ -+ "xchgl %0, %1" \ -+ : "+r" (_new), \ -+ "+m" (*(ptr)) \ -+ :: "memory"); \ -+ _new; \ -+}) -+ -+/* SSE2 64-bit atomics using cmpxchg8b */ -+#define __atomic_load_n_64bits(ptr) ({ \ -+ uint64_t _result; \ -+ __asm__ __volatile__( \ -+ "movq %1, %%mm0\n\t" \ -+ "movq %%mm0, %0\n\t" \ -+ "emms" \ -+ : "=m" (_result) \ -+ : "m" (*(ptr)) \ -+ : "memory"); \ -+ _result; \ -+}) -+ -+#define __atomic_store_n_64bits(ptr, val) ({ \ -+ uint64_t _val = (val); \ -+ uint64_t* _ptr = (ptr); \ -+ __asm__ __volatile__( \ -+ "movq %1, %%mm0\n\t" \ -+ "movd %%mm0, %%ebx\n\t" \ -+ "psrlq $32, %%mm0\n\t" \ -+ "movd %%mm0, %%ecx\n\t" \ -+ ".align 16\n\t" \ -+ "1:\n\t" \ -+ "movq (%2), %%mm1\n\t" \ -+ "movd %%mm1, %%eax\n\t" \ -+ "psrlq $32, %%mm1\n\t" \ -+ "movd %%mm1, %%edx\n\t" \ -+ "lock cmpxchg8b (%2)\n\t" \ -+ "jnz 1b\n\t" \ -+ "emms" \ -+ :: "m" (_val), \ -+ "m" (_val), \ -+ "r" (_ptr) \ -+ : "eax", "ebx", "ecx", "edx", "memory"); \ -+}) -+ -+#define __atomic_exchange_64bits(ptr, val) ({ \ -+ uint64_t _old; \ -+ uint64_t _val = (val); \ -+ uint64_t* _ptr = (ptr); \ -+ __asm__ __volatile__( \ -+ "movq %1, %%mm0\n\t" \ -+ "movd %%mm0, %%ebx\n\t" \ -+ "psrlq $32, %%mm0\n\t" \ -+ "movd %%mm0, %%ecx\n\t" \ -+ ".align 16\n\t" \ -+ "1:\n\t" \ -+ "movq (%2), %%mm1\n\t" \ -+ "movd %%mm1, %%eax\n\t" \ -+ "psrlq $32, %%mm1\n\t" \ -+ "movd %%mm1, %%edx\n\t" \ -+ "lock cmpxchg8b (%2)\n\t" \ -+ "jnz 1b\n\t" \ -+ "movd %%eax, %%mm0\n\t" \ -+ "movd %%edx, %%mm1\n\t" \ -+ "psllq $32, %%mm1\n\t" \ -+ "por %%mm1, %%mm0\n\t" \ -+ "movq %%mm0, %0\n\t" \ -+ "emms" \ -+ : "=m" (_old) \ -+ : "m" (_val), \ -+ "r" (_ptr) \ -+ : "eax", "ebx", "ecx", "edx", "memory"); \ -+ _old; \ -+}) -+ -+/* wrappers for the actual missing intrinsics */ -+#define __atomic_load_n(ptr, order) \ -+ __builtin_choose_expr(sizeof(*(ptr)) == 8, \ -+ __atomic_load_n_64bits((ptr)), \ -+ __atomic_load_n_32bits((ptr))) -+ -+#define __atomic_store_n(ptr, val, order) \ -+ __builtin_choose_expr(sizeof(*(ptr)) == 8, \ -+ __atomic_store_n_64bits((ptr), (val)), \ -+ __atomic_store_n_32bits((ptr), (val))) -+ -+#define __atomic_exchange_n(ptr, val, order) \ -+ __builtin_choose_expr(sizeof(*(ptr)) == 8, \ -+ __atomic_exchange_64bits((ptr), (val)), \ -+ __atomic_exchange_32bits((ptr), (val))) -+ -+#define __atomic_exchange(ptr, val, order) \ -+ __atomic_exchange_n((ptr), (val), (order)) -+ -+#endif --- -2.47.0 - diff --git a/0007-proton-esync-fsync/0170-fsync-make-it-great-again.patch b/0007-proton-esync-fsync/0170-fsync-make-it-great-again.patch new file mode 100644 index 0000000..b81e244 --- /dev/null +++ b/0007-proton-esync-fsync/0170-fsync-make-it-great-again.patch @@ -0,0 +1,77 @@ +From 7a9f25822e5148cf06ee7d203243efbfeca5142f Mon Sep 17 00:00:00 2001 +From: William Horvath +Date: Thu, 31 Oct 2024 19:20:08 -0700 +Subject: [PATCH] fsync: make it great again + +--- + dlls/ntdll/unix/fsync.c | 25 +++++++------------------ + 1 file changed, 7 insertions(+), 18 deletions(-) + +diff --git a/dlls/ntdll/unix/fsync.c b/dlls/ntdll/unix/fsync.c +index ae6d527ce7c..b4f3943ead2 100644 +--- a/dlls/ntdll/unix/fsync.c ++++ b/dlls/ntdll/unix/fsync.c +@@ -257,11 +257,11 @@ static void *get_shm( unsigned int idx ) + + struct fsync_cache + { +- enum fsync_type type; +- unsigned int shm_idx; ++ unsigned int type:3; ++ unsigned int shm_idx:29; + }; + +-C_ASSERT(sizeof(struct fsync_cache) == sizeof(uint64_t)); ++C_ASSERT(sizeof(struct fsync_cache) == sizeof(uint32_t)); + + static struct fsync_cache *fsync_list[FSYNC_LIST_ENTRIES]; + static struct fsync_cache fsync_list_initial_block[FSYNC_LIST_BLOCK_SIZE]; +@@ -299,7 +299,7 @@ static void add_to_list( HANDLE handle, enum fsync_type type, unsigned int shm_i + + cache.type = type; + cache.shm_idx = shm_idx; +- __atomic_store_n( (uint64_t *)&fsync_list[entry][idx], *(uint64_t *)&cache, __ATOMIC_SEQ_CST ); ++ __atomic_store_n( (uint32_t *)&fsync_list[entry][idx], *(uint32_t *)&cache, __ATOMIC_SEQ_CST ); + } + + static void grab_object( struct fsync *obj ) +@@ -361,24 +361,13 @@ static BOOL get_cached_object( HANDLE handle, struct fsync *obj ) + + if (entry >= FSYNC_LIST_ENTRIES || !fsync_list[entry]) return FALSE; + +-again: +- *(uint64_t *)&cache = __atomic_load_n( (uint64_t *)&fsync_list[entry][idx], __ATOMIC_SEQ_CST ); ++ *(uint32_t *)&cache = __atomic_load_n( (uint32_t *)&fsync_list[entry][idx], __ATOMIC_SEQ_CST ); + + if (!cache.type || !cache.shm_idx) return FALSE; + + obj->type = cache.type; + obj->shm = get_shm( cache.shm_idx ); + grab_object( obj ); +- if (((int *)obj->shm)[2] < 2 || +- *(uint64_t *)&cache != __atomic_load_n( (uint64_t *)&fsync_list[entry][idx], __ATOMIC_SEQ_CST )) +- { +- /* This check does not strictly guarantee that we avoid the potential race but is supposed to greatly +- * reduce the probability of that. */ +- FIXME( "Cache changed while getting object, handle %p, shm_idx %d, refcount %d.\n", +- handle, cache.shm_idx, ((int *)obj->shm)[2] ); +- put_object( obj ); +- goto again; +- } + return TRUE; + } + +@@ -469,8 +458,8 @@ NTSTATUS fsync_close( HANDLE handle ) + + cache.type = 0; + cache.shm_idx = 0; +- *(uint64_t *)&cache = __atomic_exchange_n( (uint64_t *)&fsync_list[entry][idx], +- *(uint64_t *)&cache, __ATOMIC_SEQ_CST ); ++ *(uint32_t *)&cache = __atomic_exchange_n( (uint32_t *)&fsync_list[entry][idx], ++ *(uint32_t *)&cache, __ATOMIC_SEQ_CST ); + if (cache.type) return STATUS_SUCCESS; + } + +-- +2.47.0 + diff --git a/0007-proton-esync-fsync/0171-fsync-spin-on-mutexes.patch b/0007-proton-esync-fsync/0171-fsync-spin-on-mutexes.patch new file mode 100644 index 0000000..1e96878 --- /dev/null +++ b/0007-proton-esync-fsync/0171-fsync-spin-on-mutexes.patch @@ -0,0 +1,47 @@ +From 71999aa6c4eb268ea8418d25042dda54a8117958 Mon Sep 17 00:00:00 2001 +From: William Horvath +Date: Thu, 31 Oct 2024 16:15:16 -0700 +Subject: [PATCH] fsync: spin on mutexes + +--- + dlls/ntdll/unix/fsync.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/dlls/ntdll/unix/fsync.c b/dlls/ntdll/unix/fsync.c +index ec31f8376fc..0cfcae2e8e4 100644 +--- a/dlls/ntdll/unix/fsync.c ++++ b/dlls/ntdll/unix/fsync.c +@@ -1057,6 +1057,7 @@ static NTSTATUS __fsync_wait_objects( DWORD count, const HANDLE *handles, + { + struct mutex *mutex = obj->shm; + int tid; ++ int spin = 0; + + if (mutex->tid == CURRENT_TID) + { +@@ -1069,7 +1070,7 @@ static NTSTATUS __fsync_wait_objects( DWORD count, const HANDLE *handles, + + if (!waited && !mutex->tid) + try_yield_to_waiters(prev_pids[i]); +- ++retry_acquire_mutex: + if (!(tid = __sync_val_compare_and_swap( &mutex->tid, 0, CURRENT_TID ))) + { + TRACE("Woken up by handle %p [%d].\n", handles[i], i); +@@ -1086,6 +1087,13 @@ static NTSTATUS __fsync_wait_objects( DWORD count, const HANDLE *handles, + return STATUS_ABANDONED_WAIT_0 + i; + } + ++ /* Try spinning a bit before falling back to futex wait */ ++ if (++spin < 50) ++ { ++ YieldProcessor(); ++ goto retry_acquire_mutex; ++ } ++ + futex_vector_set( &futexes[i], &mutex->tid, tid ); + break; + } +-- +2.47.0 + diff --git a/9000-misc-additions/combase-Perform-a-magic-trick-to-allow-osu-to-work-w.patch b/9000-misc-additions/combase-Perform-a-magic-trick-to-allow-osu-to-work-w.patch new file mode 100644 index 0000000..970c667 --- /dev/null +++ b/9000-misc-additions/combase-Perform-a-magic-trick-to-allow-osu-to-work-w.patch @@ -0,0 +1,27 @@ +From 6181fe1f1f9ec90cd3f3b716ba3e417c8e0ed44f Mon Sep 17 00:00:00 2001 +From: William Horvath +Date: Fri, 1 Nov 2024 01:29:47 -0700 +Subject: [PATCH] combase: Perform a magic trick to allow osu! to work with + wine_get_version blocked. + +Blind luck. +--- + dlls/combase/roapi.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/dlls/combase/roapi.c b/dlls/combase/roapi.c +index 02d9e0b536e..923729bdeb8 100644 +--- a/dlls/combase/roapi.c ++++ b/dlls/combase/roapi.c +@@ -210,7 +210,7 @@ HRESULT WINAPI RoGetParameterizedTypeInstanceIID(UINT32 name_element_count, cons + FIXME("stub: %d %p %p %p %p\n", name_element_count, name_elements, meta_data_locator, iid, hiid); + if (iid) *iid = GUID_NULL; + if (hiid) *hiid = INVALID_HANDLE_VALUE; +- return E_NOTIMPL; ++ return getenv("OSU_HACKS_ENABLED") ? S_OK : E_NOTIMPL; + } + + /*********************************************************************** +-- +2.47.0 + diff --git a/staging-commit b/staging-commit index 0c0cb62..3b5af14 100644 --- a/staging-commit +++ b/staging-commit @@ -1 +1 @@ -78bd3f0c6d0beb781b87dd9d54fd186e8f7628ef \ No newline at end of file +6ae3756a4f5023a07870bfcd9b38b148e8527797 \ No newline at end of file diff --git a/wine-commit b/wine-commit index cfc5f55..9f374f1 100644 --- a/wine-commit +++ b/wine-commit @@ -1 +1 @@ -3a736901cdd588ba7fbb4318e5f5069793268a01 \ No newline at end of file +ff2070b79006c74546c24106a02b814a691eba1b \ No newline at end of file