Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
August 2018
- 62 participants
- 1399 messages
[PATCH] dmime: Remove unused impl_from_ helpers
by Michael Stefaniuc
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/dmime/audiopath.c | 5 -----
dlls/dmime/graph.c | 5 -----
2 files changed, 10 deletions(-)
diff --git a/dlls/dmime/audiopath.c b/dlls/dmime/audiopath.c
index bdd92013ea..21aaa4d412 100644
--- a/dlls/dmime/audiopath.c
+++ b/dlls/dmime/audiopath.c
@@ -39,11 +39,6 @@ static inline struct IDirectMusicAudioPathImpl *impl_from_IDirectMusicAudioPath(
return CONTAINING_RECORD(iface, struct IDirectMusicAudioPathImpl, IDirectMusicAudioPath_iface);
}
-static inline struct IDirectMusicAudioPathImpl *impl_from_IDirectMusicObject(IDirectMusicObject *iface)
-{
- return CONTAINING_RECORD(iface, struct IDirectMusicAudioPathImpl, dmobj.IDirectMusicObject_iface);
-}
-
static inline struct IDirectMusicAudioPathImpl *impl_from_IPersistStream(IPersistStream *iface)
{
return CONTAINING_RECORD(iface, struct IDirectMusicAudioPathImpl, dmobj.IPersistStream_iface);
diff --git a/dlls/dmime/graph.c b/dlls/dmime/graph.c
index fadd51efbf..fafd4ecfff 100644
--- a/dlls/dmime/graph.c
+++ b/dlls/dmime/graph.c
@@ -35,11 +35,6 @@ static inline IDirectMusicGraphImpl *impl_from_IDirectMusicGraph(IDirectMusicGra
return CONTAINING_RECORD(iface, IDirectMusicGraphImpl, IDirectMusicGraph_iface);
}
-static inline IDirectMusicGraphImpl *impl_from_IDirectMusicObject(IDirectMusicObject *iface)
-{
- return CONTAINING_RECORD(iface, IDirectMusicGraphImpl, dmobj.IDirectMusicObject_iface);
-}
-
static inline IDirectMusicGraphImpl *impl_from_IPersistStream(IPersistStream *iface)
{
return CONTAINING_RECORD(iface, IDirectMusicGraphImpl, dmobj.IPersistStream_iface);
--
2.14.4
Aug. 2, 2018
[PATCH] cmd: Handle quotes when parsing the folders in the PATH environment variable
by Fabian Maurer
Semicolons are also allowed inside a path,
as long as they are quoted.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45552
Signed-off-by: Fabian Maurer <dark.shadow4(a)web.de>
---
programs/cmd/tests/test_builtins.cmd | 17 +++++++++++++++
programs/cmd/tests/test_builtins.cmd.exp | 3 +++
programs/cmd/wcmdmain.c | 27 +++++++++++++++++++-----
3 files changed, 42 insertions(+), 5 deletions(-)
diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd
index b9e9b259a9..775f21bbdc 100644
--- a/programs/cmd/tests/test_builtins.cmd
+++ b/programs/cmd/tests/test_builtins.cmd
@@ -507,6 +507,23 @@ rem Only the final quote ends the string
set "WINE_FOO=apple"banana"grape"orange
echo '%WINE_FOO%'
set WINE_FOO=
+rem set PATH must work with quotes
+set PATH_BACKUP=%PATH%
+mkdir folder
+mkdir "fol;der"
+echo echo I'm here! > "fol;der\sub1.bat"
+echo echo I'm here! > folder\sub1.bat
+set PATH=nothing;"fol;der"
+call sub1
+set PATH="folder
+call sub1
+set PATH=folder"
+call sub1
+del "fol;der\sub1.bat"
+del folder\sub1.bat
+rmdir "fol;der"
+rmdir folder
+PATH=%PATH_BACKUP%
echo ------------ Testing variable expansion ------------
call :setError 0
diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp
index 3118359265..ea4157c09d 100644
--- a/programs/cmd/tests/test_builtins.cmd.exp
+++ b/programs/cmd/tests/test_builtins.cmd.exp
@@ -475,6 +475,9 @@ foo
'jim fred'
'jim'
'apple"banana"grape'
+I'm here!@space@
+I'm here!@space@
+I'm here!@space@
------------ Testing variable expansion ------------
~p0 should be path containing batch file
@path@
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c
index 8fe2d574e5..5135be4751 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -1099,24 +1099,41 @@ void WCMD_run_program (WCHAR *command, BOOL called)
wine_dbgstr_w(stemofsearch));
while (pathposn) {
WCHAR thisDir[MAX_PATH] = {'\0'};
+ int length = 0;
WCHAR *pos = NULL;
BOOL found = FALSE;
+ BOOL inside_quotes = FALSE;
/* Work on the first directory on the search path */
- pos = strchrW(pathposn, ';');
- if (pos) {
+ pos = pathposn;
+ while ((inside_quotes || *pos != ';') && *pos != 0)
+ {
+ if (*pos == '"')
+ inside_quotes = !inside_quotes;
+ pos++;
+ }
+
+ if (*pos) { /* Reached semicolon */
memcpy(thisDir, pathposn, (pos-pathposn) * sizeof(WCHAR));
thisDir[(pos-pathposn)] = 0x00;
pathposn = pos+1;
-
- } else {
+ } else { /* Reached string end */
strcpyW(thisDir, pathposn);
pathposn = NULL;
}
+ /* Remove quotes */
+ length = strlenW(thisDir);
+ if (thisDir[length - 1] == '"')
+ thisDir[length - 1] = 0;
+
+ if (*thisDir != '"')
+ strcpyW(temp, thisDir);
+ else
+ strcpyW(temp, thisDir + 1);
+
/* Since you can have eg. ..\.. on the path, need to expand
to full information */
- strcpyW(temp, thisDir);
GetFullPathNameW(temp, MAX_PATH, thisDir, NULL);
/* 1. If extension supplied, see if that file exists */
--
2.18.0
Aug. 2, 2018
Re: [PATCH vkd3d 3/3] Add support for MoltenVK on Mac OS.
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=40432
Your paranoid android.
=== debian9 (build) ===
error: patch failed: configure.ac:77
Task: Patch failed to apply
Aug. 2, 2018
[PATCH vkd3d 3/3] Add support for MoltenVK on Mac OS.
by Chip Davis
Both demo programs run flawlessly. Unfortunately, the d3d12 test is
broken, due to Metal getting an invalid pixel format. This needs
investigation and perhaps fixing on the MoltenVK side.
Signed-off-by: Chip Davis <cdavis(a)codeweavers.com>
---
Makefile.am | 6 +-
configure.ac | 21 +-
demos/demo.h | 4 +
demos/demo_mvk.h | 666 +++++++++++++++++++++++++
libs/vkd3d-utils/vkd3d_utils_main.c | 4 +
libs/vkd3d-utils/vkd3d_utils_private.h | 5 +
libs/vkd3d/device.c | 10 +-
tests/vkd3d_api.c | 16 +
8 files changed, 727 insertions(+), 5 deletions(-)
create mode 100644 demos/demo_mvk.h
diff --git a/Makefile.am b/Makefile.am
index 4e8f942..fe87f44 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -47,6 +47,7 @@ vkd3d_demos = \
vkd3d_demos_headers = \
demos/demo.h \
demos/demo_win32.h \
+ demos/demo_mvk.h \
demos/demo_xcb.h
BUILT_SOURCES = $(widl_headers)
@@ -131,15 +132,18 @@ TESTS = $(vkd3d_tests) $(vkd3d_cross_tests)
tests_d3d12_LDADD = $(LDADD) @PTHREAD_LIBS@
tests_vkd3d_api_LDADD = libvkd3d.la @VULKAN_LIBS@
-DEMOS_LDADD = $(LDADD) libvkd3d-shader.la @XCB_LIBS@ @VULKAN_LIBS@
+DEMOS_LDADD = $(LDADD) libvkd3d-shader.la @XCB_LIBS@ @METAL_LIBS@ @VULKAN_LIBS@
DEMOS_CFLAGS = $(AM_CFLAGS) @XCB_CFLAGS@
+DEMOS_CPPFLAGS = $(AM_CPPFLAGS) @METAL_CPPFLAGS@
noinst_PROGRAMS += $(vkd3d_demos)
EXTRA_DIST += $(vkd3d_test_headers) $(vkd3d_demos_headers)
demos_gears_CFLAGS = $(DEMOS_CFLAGS)
+demos_gears_CPPFLAGS = $(DEMOS_CPPFLAGS)
demos_gears_LDADD = $(DEMOS_LDADD) -lm
demos_triangle_CFLAGS = $(DEMOS_CFLAGS)
+demos_triangle_CPPFLAGS = $(DEMOS_CPPFLAGS)
demos_triangle_LDADD = $(DEMOS_LDADD)
VKD3D_V_WIDL = $(vkd3d_v_widl_(a)AM_V@)
diff --git a/configure.ac b/configure.ac
index 2773a15..c3f5a40 100644
--- a/configure.ac
+++ b/configure.ac
@@ -77,7 +77,9 @@ AC_CHECK_LIB([pthread], [pthread_create],
AC_SUBST([VULKAN_LIBS])
AC_CHECK_LIB([vulkan], [vkGetInstanceProcAddr],
[VULKAN_LIBS="-lvulkan"],
- [AC_MSG_ERROR([libvulkan not found.])])
+ [AC_CHECK_LIB([MoltenVK], [vkGetInstanceProcAddr],
+ [VULKAN_LIBS="-lMoltenVK"],
+ [AC_MSG_ERROR([libvulkan and libMoltenVK not found.])])])
HAVE_SPIRV_TOOLS=no
AS_IF([test "x$with_spirv_tools" = "xyes"],
@@ -85,7 +87,22 @@ AS_IF([test "x$with_spirv_tools" = "xyes"],
[AC_DEFINE([HAVE_SPIRV_TOOLS], [1], [Define to 1 if you have SPIRV-Tools.])
HAVE_SPIRV_TOOLS=yes])])
-PKG_CHECK_MODULES([XCB], [xcb xcb-keysyms])
+case $host_os in
+ darwin*|macosx*)
+ AC_LANG_PUSH([Objective C])
+ AC_CHECK_HEADERS(Metal/Metal.h MoltenVK/vk_mvk_moltenvk.h)
+ AC_LANG_POP([Objective C])
+ if test "x$ac_cv_header_Metal_Metal_h" = xno ||
+ test "x$ac_cv_header_MoltenVK_vk_mvk_moltenvk_h" = xno; then
+ AC_MSG_ERROR([Metal and MoltenVK required to use vkd3d on Mac OS.])
+ fi
+ AC_SUBST(METAL_LIBS, "-framework CoreFoundation -framework AppKit -framework QuartzCore -framework Metal")
+ AC_SUBST(METAL_CPPFLAGS, "-x objective-c")
+ ;;
+ *)
+ PKG_CHECK_MODULES([XCB], [xcb xcb-keysyms])
+ ;;
+esac
dnl Check for functions
VKD3D_CHECK_FUNC([HAVE_BUILTIN_CLZ], [__builtin_clz], [__builtin_clz(0)])
diff --git a/demos/demo.h b/demos/demo.h
index 2869ea7..de8eae0 100644
--- a/demos/demo.h
+++ b/demos/demo.h
@@ -143,5 +143,9 @@ static inline HRESULT demo_create_root_signature(ID3D12Device *device,
#else
#include <vkd3d_utils.h>
#define INFINITE VKD3D_INFINITE
+#ifdef __APPLE__
+#include "demo_mvk.h"
+#else
#include "demo_xcb.h"
#endif
+#endif
diff --git a/demos/demo_mvk.h b/demos/demo_mvk.h
new file mode 100644
index 0000000..bcf5a4a
--- /dev/null
+++ b/demos/demo_mvk.h
@@ -0,0 +1,666 @@
+/*
+ * Copyright 2016 Józef Kucia for CodeWeavers
+ * Copyright 2016 Henri Verbeet for CodeWeavers
+ * Copyright 2018 Chip Davis for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define VK_USE_PLATFORM_MACOS_MVK
+#include <vkd3d.h>
+#include <sys/stat.h>
+#include <limits.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdbool.h>
+
+#define BOOL OBJC_BOOL
+#undef interface
+#include <CoreFoundation/CFRunLoop.h>
+#import <Foundation/NSNotification.h>
+#import <Foundation/NSString.h>
+#import <AppKit/NSApplication.h>
+#import <AppKit/NSEvent.h>
+#import <AppKit/NSMenu.h>
+#import <AppKit/NSWindow.h>
+#import <AppKit/NSView.h>
+#import <QuartzCore/CAMetalLayer.h>
+#import <MoltenVK/vk_mvk_moltenvk.h>
+#undef BOOL
+
+#ifndef __MAC_OS_X_VERSION_10_12
+#define nonnull
+#endif
+
+(a)class DemoView;
+
+struct demo
+{
+ struct demo_window **windows;
+ size_t windows_size;
+ size_t window_count;
+
+ void *user_data;
+ void (*idle_func)(struct demo *demo, void *user_data);
+};
+
+struct demo_window
+{
+ NSWindow *window;
+ DemoView *view;
+ struct demo *demo;
+
+ void *user_data;
+ void (*expose_func)(struct demo_window *window, void *user_data);
+ void (*key_press_func)(struct demo_window *window, demo_key key, void *user_data);
+};
+
+struct demo_swapchain
+{
+ VkSurfaceKHR vk_surface;
+ VkSwapchainKHR vk_swapchain;
+ VkFence vk_fence;
+
+ VkInstance vk_instance;
+ VkDevice vk_device;
+ ID3D12CommandQueue *command_queue;
+
+ uint32_t current_buffer;
+ unsigned int buffer_count;
+ ID3D12Resource *buffers[1];
+};
+
+static inline bool demo_add_window(struct demo *demo, struct demo_window *window)
+{
+ if (demo->window_count == demo->windows_size)
+ {
+ size_t new_capacity;
+ void *new_elements;
+
+ new_capacity = max(demo->windows_size * 2, 4);
+ if (!(new_elements = realloc(demo->windows, new_capacity * sizeof(*demo->windows))))
+ return false;
+ demo->windows = new_elements;
+ demo->windows_size = new_capacity;
+ }
+
+ demo->windows[demo->window_count++] = window;
+
+ return true;
+}
+
+static inline void demo_remove_window(struct demo *demo, const struct demo_window *window)
+{
+ size_t i;
+
+ for (i = 0; i < demo->window_count; ++i)
+ {
+ if (demo->windows[i] != window)
+ continue;
+
+ --demo->window_count;
+ memmove(&demo->windows[i], &demo->windows[i + 1], (demo->window_count - i) * sizeof(*demo->windows));
+ break;
+ }
+
+ if (!demo->window_count)
+ /* Time to stop. */
+ [NSApp stop:NSApp];
+}
+
+static inline struct demo_window *demo_find_window(struct demo *demo, NSWindow *window)
+{
+ size_t i;
+
+ for (i = 0; i < demo->window_count; ++i)
+ {
+ if (demo->windows[i]->window == window)
+ return demo->windows[i];
+ }
+
+ return NULL;
+}
+
+static inline struct demo_window *demo_window_create(struct demo *demo, const char *title,
+ unsigned int width, unsigned int height, void *user_data)
+{
+ struct demo_window *window;
+ NSAutoreleasePool *pool;
+
+ if (!(window = malloc(sizeof(*window))))
+ return NULL;
+
+ if (!demo_add_window(demo, window))
+ {
+ free(window);
+ return NULL;
+ }
+
+ pool = [[NSAutoreleasePool alloc] init];
+ window->window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, width, height)
+ styleMask:NSTitledWindowMask|NSClosableWindowMask|
+ NSMiniaturizableWindowMask
+ backing:NSBackingStoreBuffered
+ defer:YES];
+ window->view = nil;
+ window->demo = demo;
+ window->user_data = user_data;
+ window->expose_func = NULL;
+ window->key_press_func = NULL;
+ window->window.title = [NSString stringWithCString:title encoding:NSUTF8StringEncoding];
+ window->window.opaque = YES;
+ window->window.releasedWhenClosed = NO;
+
+ [window->window center];
+ [window->window makeKeyAndOrderFront:nil];
+
+ [pool release];
+
+ return window;
+}
+
+static inline void demo_window_destroy(struct demo_window *window)
+{
+ if (window->view)
+ {
+ [window->view release];
+ [NSApp removeWindowsItem:window->window];
+ }
+ [window->window release];
+ demo_remove_window(window->demo, window);
+ free(window);
+}
+
+static inline void demo_window_set_key_press_func(struct demo_window *window,
+ void (*key_press_func)(struct demo_window *window, demo_key key, void *user_data))
+{
+ window->key_press_func = key_press_func;
+}
+
+static inline void demo_window_set_expose_func(struct demo_window *window,
+ void (*expose_func)(struct demo_window *window, void *user_data))
+{
+ window->expose_func = expose_func;
+}
+
+static inline demo_key demo_key_from_nskey(unsigned short code)
+{
+ static const struct
+ {
+ unsigned short code;
+ demo_key demo_key;
+ }
+ lookup[] =
+ {
+ {0x35 /*kVK_Escape*/, DEMO_KEY_ESCAPE},
+ {0x7B /*kVK_LeftArrow*/, DEMO_KEY_LEFT},
+ {0x7C /*kVK_RightArrow*/, DEMO_KEY_RIGHT},
+ {0x7E /*kVK_UpArrow*/, DEMO_KEY_UP},
+ {0x7D /*kVK_DownArrow*/, DEMO_KEY_DOWN},
+ };
+ unsigned int i;
+
+ if (code >= '0' && code <= '9')
+ return code;
+ if (code >= 'A' && code <= 'Z')
+ return code;
+
+ for (i = 0; i < ARRAY_SIZE(lookup); ++i)
+ {
+ if (lookup[i].code == code)
+ return lookup[i].demo_key;
+ }
+
+ return DEMO_KEY_UNKNOWN;
+}
+
+(a)interface DemoView : NSView <NSWindowDelegate>
+{
+ struct demo_window *_demo_window;
+ id<MTLDevice> _device;
+}
+
+- (instancetype)initWithWindow:(struct demo_window *)window device:(id<MTLDevice>)device;
+
+- (void)windowWillClose:(NSNotification *)notification;
+
+(a)end
+
+(a)implementation DemoView
+
+- (instancetype)initWithWindow:(struct demo_window *)window device:(id<MTLDevice>)device
+{
+ NSRect content_rect;
+
+ content_rect = [window->window contentRectForFrameRect:window->window.frame];
+ self = [super initWithFrame:content_rect];
+ if (self)
+ {
+ _demo_window = window;
+ _device = [device retain];
+ self.wantsLayer = YES;
+ self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawNever;
+ }
+ return self;
+}
+
+- (void)dealloc
+{
+ [_device release];
+ [super dealloc];
+}
+
+- (OBJC_BOOL)acceptsFirstResponder
+{
+ return YES;
+}
+
+- (void)keyDown:(NSEvent *)event
+{
+ demo_key sym;
+
+ [super keyDown:event];
+ if (!_demo_window->key_press_func)
+ return;
+ sym = demo_key_from_nskey(event.keyCode);
+ _demo_window->key_press_func(_demo_window, sym, _demo_window->user_data);
+}
+
+- (void)viewWillDraw
+{
+ if (_demo_window->expose_func)
+ _demo_window->expose_func(_demo_window, _demo_window->user_data);
+}
+
+- (CALayer *)makeBackingLayer
+{
+ CAMetalLayer *layer = [CAMetalLayer layer];
+ layer.device = _device;
+ layer.framebufferOnly = YES;
+ layer.magnificationFilter = kCAFilterNearest;
+ layer.backgroundColor = CGColorGetConstantColor(kCGColorBlack);
+ return layer;
+}
+
+- (OBJC_BOOL)isOpaque
+{
+ return YES;
+}
+
+- (void)windowWillClose:(NSNotification *)notification
+{
+ demo_window_destroy(_demo_window);
+}
+
+(a)end
+
+static inline void demo_process_events(struct demo *demo)
+{
+ NSAutoreleasePool *pool;
+
+ if (demo->idle_func)
+ {
+ /* Stick a timer on the main run loop that will call the
+ * idle function every 1 ms. */
+ CFRunLoopTimerRef timer = CFRunLoopTimerCreateWithHandler(NULL, 0.0, 0.001, 0, 0, ^(CFRunLoopTimerRef timer){
+ demo->idle_func(demo, demo->user_data);
+ });
+ CFRunLoopAddTimer(CFRunLoopGetMain(), timer, kCFRunLoopCommonModes);
+ }
+ pool = [[NSAutoreleasePool alloc] init];
+ [NSApp run];
+ [pool release];
+}
+
+static inline bool demo_init(struct demo *demo, void *user_data)
+{
+ NSMenu *mainMenu, *submenu;
+ NSMenuItem *item;
+
+ [NSApplication sharedApplication];
+ NSApp.activationPolicy = NSApplicationActivationPolicyRegular;
+
+ mainMenu = [[NSMenu alloc] init];
+ /* App menu */
+ submenu = [[NSMenu alloc] initWithTitle:@"VKD3D Demo"];
+ item = [submenu addItemWithTitle:@"Hide" action:@selector(hide:) keyEquivalent:@"h"];
+ item.keyEquivalentModifierMask = NSCommandKeyMask;
+ item = [submenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"];
+ item.keyEquivalentModifierMask = NSCommandKeyMask | NSAlternateKeyMask;
+ [submenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""];
+ [submenu addItem:[NSMenuItem separatorItem]];
+ item = [submenu addItemWithTitle:@"Quit" action:@selector(terminate:) keyEquivalent:@"q"];
+ item.keyEquivalentModifierMask = NSCommandKeyMask;
+
+ item = [[NSMenuItem alloc] init];
+ item.title = @"VKD3D Demo";
+ item.submenu = submenu;
+ [mainMenu addItem:item];
+ [submenu release];
+ [item release];
+
+ /* Window menu */
+ submenu = [[NSMenu alloc] initWithTitle:@"Window"];
+ item = [submenu addItemWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"];
+ item.keyEquivalentModifierMask = NSCommandKeyMask;
+ [submenu addItem:[NSMenuItem separatorItem]];
+ [submenu addItemWithTitle:@"Bring All to Front" action:@selector(arrangeInFront:) keyEquivalent:@""];
+
+ item = [[NSMenuItem alloc] init];
+ item.title = @"Window";
+ item.submenu = submenu;
+ [mainMenu addItem:item];
+ [item release];
+
+ NSApp.mainMenu = mainMenu;
+ NSApp.windowsMenu = submenu;
+ [submenu release];
+
+ demo->windows = NULL;
+ demo->windows_size = 0;
+ demo->window_count = 0;
+ demo->user_data = user_data;
+ demo->idle_func = NULL;
+
+ return true;
+}
+
+static inline void demo_cleanup(struct demo *demo)
+{
+ free(demo->windows);
+}
+
+static inline void demo_set_idle_func(struct demo *demo,
+ void (*idle_func)(struct demo *demo, void *user_data))
+{
+ demo->idle_func = idle_func;
+}
+
+static inline struct demo_swapchain *demo_swapchain_create(ID3D12CommandQueue *command_queue,
+ struct demo_window *window, const struct demo_swapchain_desc *desc)
+{
+ struct vkd3d_image_resource_create_info resource_create_info;
+ struct VkSwapchainCreateInfoKHR vk_swapchain_desc;
+ struct VkMacOSSurfaceCreateInfoMVK surface_desc;
+ VkSwapchainKHR vk_swapchain = VK_NULL_HANDLE;
+ uint32_t format_count, queue_family_index;
+ VkSurfaceCapabilitiesKHR surface_caps;
+ VkPhysicalDevice vk_physical_device;
+ VkFence vk_fence = VK_NULL_HANDLE;
+ struct demo_swapchain *swapchain;
+ unsigned int image_count, i, j;
+ VkFenceCreateInfo fence_desc;
+ VkSurfaceFormatKHR *formats;
+ ID3D12Device *d3d12_device;
+ VkSurfaceKHR vk_surface;
+ VkInstance vk_instance;
+ VkBool32 supported;
+ VkDevice vk_device;
+ VkImage *vk_images;
+ VkFormat format;
+ id<MTLDevice> mtl_device;
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ if ((format = vkd3d_get_vk_format(desc->format)) == VK_FORMAT_UNDEFINED)
+ {
+ [pool release];
+ return NULL;
+ }
+
+ if (FAILED(ID3D12CommandQueue_GetDevice(command_queue, &IID_ID3D12Device, (void **)&d3d12_device)))
+ {
+ [pool release];
+ return NULL;
+ }
+
+ vk_instance = vkd3d_instance_get_vk_instance(vkd3d_instance_from_device(d3d12_device));
+ vk_physical_device = vkd3d_get_vk_physical_device(d3d12_device);
+ vk_device = vkd3d_get_vk_device(d3d12_device);
+ vkGetMTLDeviceMVK(vk_physical_device, &mtl_device);
+
+ window->view = [[DemoView alloc] initWithWindow:window device:mtl_device];
+ window->window.initialFirstResponder = window->view;
+ window->window.contentView = window->view;
+ window->window.delegate = window->view;
+ [NSApp addWindowsItem:window->window title:window->window.title filename:NO];
+
+ surface_desc.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK;
+ surface_desc.pNext = NULL;
+ surface_desc.flags = 0;
+ surface_desc.pView = window->view;
+ if (vkCreateMacOSSurfaceMVK(vk_instance, &surface_desc, NULL, &vk_surface) < 0)
+ {
+ ID3D12Device_Release(d3d12_device);
+ [pool release];
+ return NULL;
+ }
+
+ queue_family_index = vkd3d_get_vk_queue_family_index(command_queue);
+ if (vkGetPhysicalDeviceSurfaceSupportKHR(vk_physical_device,
+ queue_family_index, vk_surface, &supported) < 0 || !supported)
+ goto fail;
+
+ if (vkGetPhysicalDeviceSurfaceCapabilitiesKHR(vk_physical_device, vk_surface, &surface_caps) < 0)
+ goto fail;
+
+ if ((surface_caps.maxImageCount && desc->buffer_count > surface_caps.maxImageCount)
+ || desc->buffer_count < surface_caps.minImageCount
+ || desc->width > surface_caps.maxImageExtent.width || desc->width < surface_caps.minImageExtent.width
+ || desc->height > surface_caps.maxImageExtent.height || desc->height < surface_caps.minImageExtent.height
+ || !(surface_caps.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR))
+ goto fail;
+
+ if (vkGetPhysicalDeviceSurfaceFormatsKHR(vk_physical_device, vk_surface, &format_count, NULL) < 0
+ || !format_count || !(formats = calloc(format_count, sizeof(*formats))))
+ goto fail;
+
+ if (vkGetPhysicalDeviceSurfaceFormatsKHR(vk_physical_device, vk_surface, &format_count, formats) < 0)
+ {
+ free(formats);
+ goto fail;
+ }
+
+ if (format_count != 1 || formats->format != VK_FORMAT_UNDEFINED
+ || formats->colorSpace != VK_COLOR_SPACE_SRGB_NONLINEAR_KHR)
+ {
+ for (i = 0; i < format_count; ++i)
+ {
+ if (formats[i].format == format && formats[i].colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR)
+ break;
+ }
+
+ if (i == format_count)
+ {
+ free(formats);
+ goto fail;
+ }
+ }
+
+ free(formats);
+ formats = NULL;
+
+ vk_swapchain_desc.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
+ vk_swapchain_desc.pNext = NULL;
+ vk_swapchain_desc.flags = 0;
+ vk_swapchain_desc.surface = vk_surface;
+ vk_swapchain_desc.minImageCount = desc->buffer_count;
+ vk_swapchain_desc.imageFormat = format;
+ vk_swapchain_desc.imageColorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
+ vk_swapchain_desc.imageExtent.width = desc->width;
+ vk_swapchain_desc.imageExtent.height = desc->height;
+ vk_swapchain_desc.imageArrayLayers = 1;
+ vk_swapchain_desc.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ vk_swapchain_desc.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ vk_swapchain_desc.queueFamilyIndexCount = 0;
+ vk_swapchain_desc.pQueueFamilyIndices = NULL;
+ vk_swapchain_desc.preTransform = surface_caps.currentTransform;
+ vk_swapchain_desc.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
+ vk_swapchain_desc.presentMode = VK_PRESENT_MODE_FIFO_KHR;
+ vk_swapchain_desc.clipped = VK_TRUE;
+ vk_swapchain_desc.oldSwapchain = VK_NULL_HANDLE;
+ if (vkCreateSwapchainKHR(vk_device, &vk_swapchain_desc, NULL, &vk_swapchain) < 0)
+ goto fail;
+
+ fence_desc.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
+ fence_desc.pNext = NULL;
+ fence_desc.flags = 0;
+ if (vkCreateFence(vk_device, &fence_desc, NULL, &vk_fence) < 0)
+ goto fail;
+
+ if (vkGetSwapchainImagesKHR(vk_device, vk_swapchain, &image_count, NULL) < 0
+ || !(vk_images = calloc(image_count, sizeof(*vk_images))))
+ goto fail;
+
+ if (vkGetSwapchainImagesKHR(vk_device, vk_swapchain, &image_count, vk_images) < 0)
+ {
+ free(vk_images);
+ goto fail;
+ }
+
+ if (!(swapchain = malloc(offsetof(struct demo_swapchain, buffers[image_count]))))
+ {
+ free(vk_images);
+ goto fail;
+ }
+ swapchain->vk_surface = vk_surface;
+ swapchain->vk_swapchain = vk_swapchain;
+ swapchain->vk_fence = vk_fence;
+ swapchain->vk_instance = vk_instance;
+ swapchain->vk_device = vk_device;
+
+ vkAcquireNextImageKHR(vk_device, vk_swapchain, UINT64_MAX,
+ VK_NULL_HANDLE, vk_fence, &swapchain->current_buffer);
+ vkWaitForFences(vk_device, 1, &vk_fence, VK_TRUE, UINT64_MAX);
+ vkResetFences(vk_device, 1, &vk_fence);
+
+ resource_create_info.type = VKD3D_STRUCTURE_TYPE_IMAGE_RESOURCE_CREATE_INFO;
+ resource_create_info.next = NULL;
+ resource_create_info.desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
+ resource_create_info.desc.Alignment = 0;
+ resource_create_info.desc.Width = desc->width;
+ resource_create_info.desc.Height = desc->height;
+ resource_create_info.desc.DepthOrArraySize = 1;
+ resource_create_info.desc.MipLevels = 1;
+ resource_create_info.desc.Format = desc->format;
+ resource_create_info.desc.SampleDesc.Count = 1;
+ resource_create_info.desc.SampleDesc.Quality = 0;
+ resource_create_info.desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
+ resource_create_info.desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
+ resource_create_info.flags = VKD3D_RESOURCE_INITIAL_STATE_TRANSITION | VKD3D_RESOURCE_PRESENT_STATE_TRANSITION;
+ resource_create_info.present_state = D3D12_RESOURCE_STATE_PRESENT;
+ for (i = 0; i < image_count; ++i)
+ {
+ resource_create_info.vk_image = vk_images[i];
+ if (FAILED(vkd3d_create_image_resource(d3d12_device, &resource_create_info, &swapchain->buffers[i])))
+ {
+ for (j = 0; j < i; ++j)
+ {
+ ID3D12Resource_Release(swapchain->buffers[j]);
+ }
+ free(swapchain);
+ free(vk_images);
+ goto fail;
+ }
+ }
+ swapchain->buffer_count = image_count;
+ free(vk_images);
+ ID3D12Device_Release(d3d12_device);
+
+ ID3D12CommandQueue_AddRef(swapchain->command_queue = command_queue);
+
+ [pool release];
+
+ return swapchain;
+
+fail:
+ if (vk_fence != VK_NULL_HANDLE)
+ vkDestroyFence(vk_device, vk_fence, NULL);
+ if (vk_swapchain != VK_NULL_HANDLE)
+ vkDestroySwapchainKHR(vk_device, vk_swapchain, NULL);
+ vkDestroySurfaceKHR(vk_instance, vk_surface, NULL);
+ ID3D12Device_Release(d3d12_device);
+ [pool release];
+ return NULL;
+}
+
+static inline unsigned int demo_swapchain_get_current_back_buffer_index(struct demo_swapchain *swapchain)
+{
+ return swapchain->current_buffer;
+}
+
+static inline ID3D12Resource *demo_swapchain_get_back_buffer(struct demo_swapchain *swapchain, unsigned int index)
+{
+ ID3D12Resource *resource = NULL;
+
+ if (index < swapchain->buffer_count && (resource = swapchain->buffers[index]))
+ ID3D12Resource_AddRef(resource);
+
+ return resource;
+}
+
+static inline void demo_swapchain_present(struct demo_swapchain *swapchain)
+{
+ VkPresentInfoKHR present_desc;
+ VkQueue vk_queue;
+
+ present_desc.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
+ present_desc.pNext = NULL;
+ present_desc.waitSemaphoreCount = 0;
+ present_desc.pWaitSemaphores = NULL;
+ present_desc.swapchainCount = 1;
+ present_desc.pSwapchains = &swapchain->vk_swapchain;
+ present_desc.pImageIndices = &swapchain->current_buffer;
+ present_desc.pResults = NULL;
+
+ vk_queue = vkd3d_acquire_vk_queue(swapchain->command_queue);
+ vkQueuePresentKHR(vk_queue, &present_desc);
+ vkd3d_release_vk_queue(swapchain->command_queue);
+
+ vkAcquireNextImageKHR(swapchain->vk_device, swapchain->vk_swapchain, UINT64_MAX,
+ VK_NULL_HANDLE, swapchain->vk_fence, &swapchain->current_buffer);
+ vkWaitForFences(swapchain->vk_device, 1, &swapchain->vk_fence, VK_TRUE, UINT64_MAX);
+ vkResetFences(swapchain->vk_device, 1, &swapchain->vk_fence);
+}
+
+static inline void demo_swapchain_destroy(struct demo_swapchain *swapchain)
+{
+ unsigned int i;
+
+ ID3D12CommandQueue_Release(swapchain->command_queue);
+ for (i = 0; i < swapchain->buffer_count; ++i)
+ {
+ ID3D12Resource_Release(swapchain->buffers[i]);
+ }
+ vkDestroyFence(swapchain->vk_device, swapchain->vk_fence, NULL);
+ vkDestroySwapchainKHR(swapchain->vk_device, swapchain->vk_swapchain, NULL);
+ vkDestroySurfaceKHR(swapchain->vk_instance, swapchain->vk_surface, NULL);
+ free(swapchain);
+}
+
+static inline HANDLE demo_create_event(void)
+{
+ return vkd3d_create_event();
+}
+
+static inline unsigned int demo_wait_event(HANDLE event, unsigned int ms)
+{
+ return vkd3d_wait_event(event, ms);
+}
+
+static inline void demo_destroy_event(HANDLE event)
+{
+ vkd3d_destroy_event(event);
+}
+
diff --git a/libs/vkd3d-utils/vkd3d_utils_main.c b/libs/vkd3d-utils/vkd3d_utils_main.c
index 2c4d89a..fce7cf7 100644
--- a/libs/vkd3d-utils/vkd3d_utils_main.c
+++ b/libs/vkd3d-utils/vkd3d_utils_main.c
@@ -34,7 +34,11 @@ HRESULT WINAPI D3D12CreateDevice(IUnknown *adapter,
static const char * const instance_extensions[] =
{
VK_KHR_SURFACE_EXTENSION_NAME,
+#ifdef __APPLE__
+ VK_MVK_MACOS_SURFACE_EXTENSION_NAME,
+#else
VK_KHR_XCB_SURFACE_EXTENSION_NAME,
+#endif
};
static const char * const device_extensions[] =
{
diff --git a/libs/vkd3d-utils/vkd3d_utils_private.h b/libs/vkd3d-utils/vkd3d_utils_private.h
index 6aa0df6..a59f471 100644
--- a/libs/vkd3d-utils/vkd3d_utils_private.h
+++ b/libs/vkd3d-utils/vkd3d_utils_private.h
@@ -20,7 +20,12 @@
#define __VKD3D_UTILS_PRIVATE_H
#define VK_NO_PROTOTYPES
+
+#ifdef __APPLE__
+#define VK_USE_PLATFORM_MACOS_MVK
+#else
#define VK_USE_PLATFORM_XCB_KHR
+#endif
#include <pthread.h>
#include <vkd3d.h>
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index 6fa0017..0052eba 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -205,6 +205,12 @@ static HRESULT vkd3d_init_instance_caps(struct vkd3d_instance *instance,
return S_OK;
}
+#ifdef HAVE_MOLTENVK_VK_MVK_MOLTENVK_H
+#define VULKAN_SO_NAME "libMoltenVK.dylib"
+#else
+#define VULKAN_SO_NAME "libvulkan.so.1"
+#endif
+
static HRESULT vkd3d_init_vk_global_procs(struct vkd3d_instance *instance,
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr)
{
@@ -212,9 +218,9 @@ static HRESULT vkd3d_init_vk_global_procs(struct vkd3d_instance *instance,
if (!vkGetInstanceProcAddr)
{
- if (!(instance->libvulkan = dlopen("libvulkan.so.1", RTLD_NOW)))
+ if (!(instance->libvulkan = dlopen(VULKAN_SO_NAME, RTLD_NOW)))
{
- ERR("Failed to load libvulkan.\n");
+ ERR("Failed to load libvulkan: %s\n", dlerror());
return E_FAIL;
}
diff --git a/tests/vkd3d_api.c b/tests/vkd3d_api.c
index e2d9d01..3980b4e 100644
--- a/tests/vkd3d_api.c
+++ b/tests/vkd3d_api.c
@@ -19,8 +19,12 @@
#define COBJMACROS
#define INITGUID
#define WIDL_C_INLINE_WRAPPERS
+#ifdef __APPLE__
+#define VK_USE_PLATFORM_MACOS_MVK
+#else
#define VK_USE_PLATFORM_XCB_KHR
#define VK_USE_PLATFORM_XLIB_KHR
+#endif
#include "vkd3d_test.h"
#include <vkd3d.h>
@@ -215,8 +219,12 @@ static void test_additional_instance_extensions(void)
struct vulkan_extension extensions[] =
{
{VK_KHR_SURFACE_EXTENSION_NAME},
+#ifdef __APPLE__
+ {VK_MVK_MACOS_SURFACE_EXTENSION_NAME},
+#else
{VK_KHR_XCB_SURFACE_EXTENSION_NAME},
{VK_KHR_XLIB_SURFACE_EXTENSION_NAME},
+#endif
};
const char *enabled_extensions[ARRAY_SIZE(extensions)];
@@ -249,6 +257,13 @@ static void test_additional_instance_extensions(void)
if (!extensions[i].is_supported)
continue;
+#ifdef __APPLE__
+ if (!strcmp(extensions[i].name, VK_MVK_MACOS_SURFACE_EXTENSION_NAME))
+ {
+ pfn = vkGetInstanceProcAddr(vk_instance, "vkCreateMacOSSurfaceMVK");
+ ok(pfn, "Failed to get proc addr for vkCreateMacOSSurfaceMVK.\n");
+ }
+#else
if (!strcmp(extensions[i].name, VK_KHR_XCB_SURFACE_EXTENSION_NAME))
{
pfn = vkGetInstanceProcAddr(vk_instance, "vkCreateXcbSurfaceKHR");
@@ -259,6 +274,7 @@ static void test_additional_instance_extensions(void)
pfn = vkGetInstanceProcAddr(vk_instance, "vkCreateXlibSurfaceKHR");
ok(pfn, "Failed to get proc addr for vkCreateXlibSurfaceKHR.\n");
}
+#endif
}
refcount = vkd3d_instance_decref(instance);
--
2.18.0
Aug. 2, 2018
[PATCH vkd3d 2/3] Makefiles: Make the sed(1) command more portable.
by Chip Davis
BSD sed(1) requires an argument after -i giving the suffix to put on the
backup it makes. Also, the regular expression given doesn't seem to work
for me. This command should work everywhere.
Also, make the output a little less verbose when V=0.
Signed-off-by: Chip Davis <cdavis(a)codeweavers.com>
---
Makefile.am | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 14f2d51..4e8f942 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -150,16 +150,17 @@ vkd3d_v_widl_1 =
EXTRA_DIST += $(widl_headers) $(widl_headers:.h=.idl)
$(widl_headers): %.h: %.idl
if HAVE_WIDL
- $(VKD3D_V_WIDL)$(WIDL) -o $@ $<
- sed -e '/#include <\(rpc.h\|rpcndr.h\)>/d' -i $@
+ $(VKD3D_V_WIDL)$(WIDL) -o $@.tmp $<
+ $(AM_V_at) sed -e '/#include <rpc.h>/d' -e '/#include <rpcndr.h>/d' <$@.tmp >$@
+ $(AM_V_at) rm -f $@.tmp
else
- echo "widl is required to generate $<"
+ @echo "widl is required to generate $<"
endif
EXTRA_DIST += $(vkd3d_demos_shaders)
libvkd3d-utils.pc: $(srcdir)/libs/vkd3d-utils/libvkd3d-utils.pc.in
- sed -e 's![@]prefix[@]!$(prefix)!g' \
+ $(AM_V_GEN) sed -e 's![@]prefix[@]!$(prefix)!g' \
-e 's![@]exec_prefix[@]!$(exec_prefix)!g' \
-e 's![@]includedir[@]!$(includedir)!g' \
-e 's![@]libdir[@]!$(libdir)!g' \
@@ -167,7 +168,7 @@ libvkd3d-utils.pc: $(srcdir)/libs/vkd3d-utils/libvkd3d-utils.pc.in
$< > $@
libvkd3d.pc: $(srcdir)/libs/vkd3d/libvkd3d.pc.in
- sed -e 's![@]prefix[@]!$(prefix)!g' \
+ $(AM_V_GEN) sed -e 's![@]prefix[@]!$(prefix)!g' \
-e 's![@]exec_prefix[@]!$(exec_prefix)!g' \
-e 's![@]includedir[@]!$(includedir)!g' \
-e 's![@]libdir[@]!$(libdir)!g' \
@@ -175,7 +176,7 @@ libvkd3d.pc: $(srcdir)/libs/vkd3d/libvkd3d.pc.in
$< > $@
libs/vkd3d_version.c: dummy-vkd3d-version
- version=`(GIT_DIR=$(top_srcdir)/.git git describe HEAD 2>/dev/null || echo "vkd3d-$(PACKAGE_VERSION)") | sed -n -e '$$s/\(.*\)/const char vkd3d_build[] = "\1";/p'` && (echo $$version | cmp -s - $@) || echo $$version >$@ || ($(RM) $@ && exit 1)
+ $(AM_V_GEN) version=`(GIT_DIR=$(top_srcdir)/.git git describe HEAD 2>/dev/null || echo "vkd3d-$(PACKAGE_VERSION)") | sed -n -e '$$s/\(.*\)/const char vkd3d_build[] = "\1";/p'` && (echo $$version | cmp -s - $@) || echo $$version >$@ || ($(RM) $@ && exit 1)
.SILENT: libs/vkd3d_version.c
CLEANFILES += libs/vkd3d_version.c
--
2.18.0
Aug. 2, 2018
[PATCH vkd3d 1/3] vkd3d: Fix pthread_setname_np(3) call on Mac OS.
by Chip Davis
That function exists on Mac, but it only takes a single argument, the
thread's new name. That's OK for our purposes, since we were calling it
on pthread_self anyhow.
Signed-off-by: Chip Davis <cdavis(a)codeweavers.com>
---
libs/vkd3d/command.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 4db9967..353f42c 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -200,7 +200,11 @@ static void *vkd3d_fence_worker_main(void *arg)
int rc;
#ifdef HAVE_PTHREAD_SETNAME_NP
+#ifdef __APPLE__
+ pthread_setname_np("vkd3d_worker");
+#else
pthread_setname_np(pthread_self(), "vkd3d_worker");
+#endif
#endif
for (;;)
--
2.18.0
Aug. 2, 2018
Re: C# DLLs for tests
by Nikolay Sivov
On Thu, 2 Aug 2018 at 18:38, Fabian Maurer <dark.shadow4(a)web.de> wrote:
> > No formal process, but I prefer a pull request.
>
>
>
> Will do.
>
>
>
> > I can't think of anything other than mscoree that would need this. If
>
> > there is, I think duplication will be fine.
>
>
>
> Well the test for SxsLookupClrGuid should probably be in sxs tests, so
> we'd need it there, too.
>
I think sxs one only needs appropriate context data, not the modules.
>
Aug. 2, 2018
[PATCH 13/13 v3] msvcp90: Add implementation of _Concurrent_vector_Internal_push_back.
by Hua Meng
Signed-off-by: Hua meng <161220092(a)smail.nju.edu.cn>
---
dlls/msvcp90/misc.c | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcp90/misc.c b/dlls/msvcp90/misc.c
index 8fe5294d06..58e546cdf3 100644
--- a/dlls/msvcp90/misc.c
+++ b/dlls/msvcp90/misc.c
@@ -2216,10 +2216,24 @@ MSVCP_size_t __thiscall _Concurrent_vector_base_v4__Internal_grow_to_at_least_wi
/* ?_Internal_push_back(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KAEA_K(a)Z */
DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_push_back, 12)
void * __thiscall _Concurrent_vector_base_v4__Internal_push_back(
- _Concurrent_vector_base_v4 *this, MSVCP_size_t len1, MSVCP_size_t *len2)
+ _Concurrent_vector_base_v4 *this, MSVCP_size_t element_size, MSVCP_size_t *idx)
{
- FIXME("(%p %ld %p) stub\n", this, len1, len2);
- return NULL;
+ MSVCP_size_t index, seg, segment_base;
+ void *data;
+
+ TRACE("(%p %ld %p)\n", this, element_size, idx);
+
+ do {
+ index = this->early_size;
+ _Concurrent_vector_base_v4__Internal_reserve(this, index + 1,
+ element_size, MSVCP_SIZE_T_MAX / element_size);
+ } while(InterlockedCompareExchangeSizeT(&this->early_size, index + 1, index) != index);
+ seg = _vector_base_v4__Segment_index_of(index);
+ segment_base = (seg == 0) ? 0 : (1 << seg);
+ data = (BYTE*)this->segment[seg] + element_size * (index - segment_base);
+ *idx = index;
+
+ return data;
}
/* ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXIIIP6AXPAXI(a)ZP6AX0PBXI@Z2(a)Z */
--
2.11.0
Aug. 2, 2018
[PATCH 12/13 v3] msvcp90: Add implementation of _Concurrent_vector_Internal_resize.
by Hua Meng
Signed-off-by: Hua meng <161220092(a)smail.nju.edu.cn>
---
dlls/msvcp90/misc.c | 32 +++++++++++++++++++++++++++++---
1 file changed, 29 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcp90/misc.c b/dlls/msvcp90/misc.c
index 6e79125640..8fe5294d06 100644
--- a/dlls/msvcp90/misc.c
+++ b/dlls/msvcp90/misc.c
@@ -2226,11 +2226,37 @@ void * __thiscall _Concurrent_vector_base_v4__Internal_push_back(
/* ?_Internal_resize(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAX_K00P6AXPEAX0(a)ZP6AX1PEBX0@Z3(a)Z */
DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_resize, 28)
void __thiscall _Concurrent_vector_base_v4__Internal_resize(
- _Concurrent_vector_base_v4 *this, MSVCP_size_t len1, MSVCP_size_t len2,
- MSVCP_size_t len3, void (__cdecl *clear)(void*, MSVCP_size_t),
+ _Concurrent_vector_base_v4 *this, MSVCP_size_t resize, MSVCP_size_t element_size,
+ MSVCP_size_t max_size, void (__cdecl *clear)(void*, MSVCP_size_t),
void (__cdecl *copy)(void*, const void*, MSVCP_size_t), const void *v)
{
- FIXME("(%p %ld %ld %ld %p %p %p) stub\n", this, len1, len2, len3, clear, copy, v);
+ MSVCP_size_t size, seg_no, end_seg_no, clear_element;
+
+ TRACE("(%p %ld %ld %ld %p %p %p)\n", this, resize, element_size, max_size, clear, copy, v);
+
+ if(resize > max_size) _vector_base_v4__Internal_throw_exception(this, 0);
+ size = this->early_size;
+ if(resize > size)
+ _Concurrent_vector_base_v4__Internal_grow_to_at_least_with_result(this,
+ resize, element_size, copy, v);
+ else if(resize == 0)
+ _Concurrent_vector_base_v4__Internal_clear(this, clear);
+ else if(resize < size)
+ {
+ seg_no = _vector_base_v4__Segment_index_of(size - 1);
+ end_seg_no = _vector_base_v4__Segment_index_of(resize - 1);
+ clear_element = size - (seg_no ? 1 << seg_no : 2);
+ if(clear_element > 0)
+ clear(this->segment[seg_no], clear_element);
+ if(seg_no) seg_no--;
+ for(; seg_no > end_seg_no; seg_no--)
+ clear(this->segment[seg_no], 1 << seg_no);
+ clear_element = (1 << (end_seg_no + 1)) - resize;
+ if(clear_element > 0)
+ clear((BYTE**)this->segment[end_seg_no] + element_size * (resize - ((1 << end_seg_no) & ~1)),
+ clear_element);
+ this->early_size = resize;
+ }
}
/* ?_Internal_swap(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXAAV123@@Z */
--
2.11.0
Aug. 2, 2018
[PATCH 11/13 v3] msvcp90: Add implementation of _Concurrent_vector_Internal_compact.
by Hua Meng
Signed-off-by: Hua meng <161220092(a)smail.nju.edu.cn>
---
dlls/msvcp90/misc.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 56 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcp90/misc.c b/dlls/msvcp90/misc.c
index 5907c0b88b..6e79125640 100644
--- a/dlls/msvcp90/misc.c
+++ b/dlls/msvcp90/misc.c
@@ -1784,6 +1784,13 @@ typedef struct __Concurrent_vector_base_v4
#define STORAGE_SIZE (sizeof(this->storage) / sizeof(this->storage[0]))
#define SEGMENT_SIZE (sizeof(void*) * 8)
+typedef struct compact_block
+{
+ MSVCP_size_t first_block;
+ void *blocks[SEGMENT_SIZE];
+ int size_check;
+}compact_block;
+
/* based on wined3d_log2i from wined3d.h */
/* Return the integer base-2 logarithm of (x|1). Result is 0 for x == 0. */
static inline unsigned int log2i(unsigned int x)
@@ -1997,12 +2004,58 @@ MSVCP_size_t __thiscall _Concurrent_vector_base_v4__Internal_clear(
/* ?_Internal_compact(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IEAAPEAX_KPEAXP6AX10(a)ZP6AX1PEBX0@Z(a)Z */
DEFINE_THISCALL_WRAPPER(_Concurrent_vector_base_v4__Internal_compact, 20)
void * __thiscall _Concurrent_vector_base_v4__Internal_compact(
- _Concurrent_vector_base_v4 *this, MSVCP_size_t len, void *v,
+ _Concurrent_vector_base_v4 *this, MSVCP_size_t element_size, void *v,
void (__cdecl *clear)(void*, MSVCP_size_t),
void (__cdecl *copy)(void*, const void*, MSVCP_size_t))
{
- FIXME("(%p %ld %p %p %p) stub\n", this, len, v, clear, copy);
- return NULL;
+ compact_block *b;
+ MSVCP_size_t size, alloc_size, seg_no, alloc_seg, copy_element, clear_element;
+ int i;
+
+ TRACE("(%p %ld %p %p %p)\n", this, element_size, v, clear, copy);
+
+ size = this->early_size;
+ alloc_size = _Concurrent_vector_base_v4__Internal_capacity(this);
+ if(alloc_size == 0) return NULL;
+ alloc_seg = _vector_base_v4__Segment_index_of(alloc_size - 1);
+ if(!size) {
+ this->first_block = 0;
+ b = v;
+ b->first_block = alloc_seg + 1;
+ memset(b->blocks, 0, sizeof(b->blocks));
+ memcpy(b->blocks, this->segment,
+ (alloc_seg + 1) * sizeof(this->segment[0]));
+ memset(this->segment, 0, sizeof(this->segment[0]) * (alloc_seg + 1));
+ return v;
+ }
+ seg_no = _vector_base_v4__Segment_index_of(size - 1);
+ if(this->first_block == (seg_no + 1) && seg_no == alloc_seg) return NULL;
+ b = v;
+ b->first_block = this->first_block;
+ memset(b->blocks, 0, sizeof(b->blocks));
+ memcpy(b->blocks, this->segment,
+ (alloc_seg + 1) * sizeof(this->segment[0]));
+ if(this->first_block == (seg_no + 1) && seg_no != alloc_seg) {
+ memset(b->blocks, 0, sizeof(b->blocks[0]) * (seg_no + 1));
+ memset(&this->segment[seg_no + 1], 0, sizeof(this->segment[0]) * (alloc_seg - seg_no));
+ return v;
+ }
+ memset(this->segment, 0,
+ (alloc_seg + 1) * sizeof(this->segment[0]));
+ this->first_block = 0;
+ _Concurrent_vector_base_v4__Internal_reserve(this, size, element_size,
+ MSVCP_SIZE_T_MAX / element_size);
+ for(i = 0; i < seg_no; i++)
+ copy(this->segment[i], b->blocks[i], i ? 1 << i : 2);
+ copy_element = size - ((1 << seg_no) & ~1);
+ if(copy_element > 0)
+ copy(this->segment[seg_no], b->blocks[seg_no], copy_element);
+ for(i = 0; i < seg_no; i++)
+ clear(b->blocks[i], i ? 1 << i : 2);
+ clear_element = size - ((1 << seg_no) & ~1);
+ if(clear_element > 0)
+ clear(b->blocks[seg_no], clear_element);
+ return v;
}
/* ?_Internal_copy(a)_Concurrent_vector_base_v4@details(a)Concurrency@@IAEXABV123(a)IP6AXPAXPBXI@Z(a)Z */
--
2.11.0
Aug. 2, 2018