You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-12-15 08:03:15 -08:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
be758e634e | ||
|
|
c8cf8c5b8d | ||
|
|
b6ba963ad0 | ||
|
|
8ea0f4968f | ||
|
|
217f208541 |
@@ -1,214 +0,0 @@
|
||||
From 09318135fc87cd27e9df660958dcda6fe7d6f997 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@wine-staging.com>
|
||||
Date: Sat, 12 Dec 2020 17:28:31 -0700
|
||||
Subject: [PATCH] kernel32: Advertise reparse point support.
|
||||
|
||||
Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
|
||||
---
|
||||
dlls/mountmgr.sys/device.c | 33 ++++++++++++-
|
||||
dlls/mountmgr.sys/unixlib.c | 97 +++++++++++++++++++++++++++++++++++++
|
||||
dlls/mountmgr.sys/unixlib.h | 8 +++
|
||||
3 files changed, 137 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/mountmgr.sys/device.c b/dlls/mountmgr.sys/device.c
|
||||
index 6c62ac78c76..1ee82e92c97 100644
|
||||
--- a/dlls/mountmgr.sys/device.c
|
||||
+++ b/dlls/mountmgr.sys/device.c
|
||||
@@ -177,6 +177,36 @@ static void get_filesystem_serial( struct volume *volume )
|
||||
volume->serial = strtoul( buffer, NULL, 16 );
|
||||
}
|
||||
|
||||
+/* get the flags for the volume by looking at the type of underlying filesystem */
|
||||
+static DWORD get_filesystem_flags( struct volume *volume )
|
||||
+{
|
||||
+ char fstypename[256];
|
||||
+ ULONG size = sizeof(fstypename);
|
||||
+ struct get_volume_filesystem_params params = { volume->device->unix_mount, fstypename, &size };
|
||||
+
|
||||
+ if (!volume->device->unix_mount) return 0;
|
||||
+ if (MOUNTMGR_CALL( get_volume_filesystem, ¶ms )) return 0;
|
||||
+
|
||||
+ if (!strcmp("apfs", fstypename) ||
|
||||
+ !strcmp("nfs", fstypename) ||
|
||||
+ !strcmp("cifs", fstypename) ||
|
||||
+ !strcmp("ncpfs", fstypename) ||
|
||||
+ !strcmp("tmpfs", fstypename) ||
|
||||
+ !strcmp("cramfs", fstypename) ||
|
||||
+ !strcmp("devfs", fstypename) ||
|
||||
+ !strcmp("procfs", fstypename) ||
|
||||
+ !strcmp("ext2", fstypename) ||
|
||||
+ !strcmp("ext3", fstypename) ||
|
||||
+ !strcmp("ext4", fstypename) ||
|
||||
+ !strcmp("hfs", fstypename) ||
|
||||
+ !strcmp("hpfs", fstypename) ||
|
||||
+ !strcmp("ntfs", fstypename))
|
||||
+ {
|
||||
+ return FILE_SUPPORTS_REPARSE_POINTS;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
|
||||
/******************************************************************
|
||||
* VOLUME_FindCdRomDataBestVoldesc
|
||||
@@ -1704,7 +1734,8 @@ static NTSTATUS WINAPI harddisk_query_volume( DEVICE_OBJECT *device, IRP *irp )
|
||||
break;
|
||||
default:
|
||||
fsname = L"NTFS";
|
||||
- info->FileSystemAttributes = FILE_CASE_PRESERVED_NAMES | FILE_PERSISTENT_ACLS;
|
||||
+ info->FileSystemAttributes = FILE_CASE_PRESERVED_NAMES | FILE_PERSISTENT_ACLS
|
||||
+ | get_filesystem_flags( volume );
|
||||
info->MaximumComponentNameLength = 255;
|
||||
break;
|
||||
}
|
||||
diff --git a/dlls/mountmgr.sys/unixlib.c b/dlls/mountmgr.sys/unixlib.c
|
||||
index 80e7c850854..55489d9965b 100644
|
||||
--- a/dlls/mountmgr.sys/unixlib.c
|
||||
+++ b/dlls/mountmgr.sys/unixlib.c
|
||||
@@ -38,6 +38,21 @@
|
||||
#endif
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
+#ifdef HAVE_SYS_STATFS_H
|
||||
+# include <sys/statfs.h>
|
||||
+#endif
|
||||
+#ifdef HAVE_SYS_SYSCALL_H
|
||||
+# include <sys/syscall.h>
|
||||
+#endif
|
||||
+#ifdef HAVE_SYS_VFS_H
|
||||
+# include <sys/vfs.h>
|
||||
+#endif
|
||||
+#ifdef HAVE_SYS_PARAM_H
|
||||
+#include <sys/param.h>
|
||||
+#endif
|
||||
+#ifdef HAVE_SYS_MOUNT_H
|
||||
+#include <sys/mount.h>
|
||||
+#endif
|
||||
|
||||
#include "unixlib.h"
|
||||
#include "wine/debug.h"
|
||||
@@ -463,6 +478,87 @@ static NTSTATUS read_volume_file( void *args )
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
+static NTSTATUS get_volume_filesystem( void *args )
|
||||
+{
|
||||
+#if defined(__NR_renameat2) || defined(RENAME_SWAP)
|
||||
+ const struct get_volume_filesystem_params *params = args;
|
||||
+#if defined(HAVE_FSTATFS)
|
||||
+ struct statfs stfs;
|
||||
+#elif defined(HAVE_FSTATVFS)
|
||||
+ struct statvfs stfs;
|
||||
+#endif
|
||||
+ const char *fstypename = "unknown";
|
||||
+ int fd = -1;
|
||||
+
|
||||
+ if (params->volume[0] != '/')
|
||||
+ {
|
||||
+ char *path = get_dosdevices_path( params->volume );
|
||||
+ if (path) fd = open( path, O_RDONLY );
|
||||
+ free( path );
|
||||
+ }
|
||||
+ else fd = open( params->volume, O_RDONLY );
|
||||
+ if (fd == -1) return STATUS_NO_SUCH_FILE;
|
||||
+
|
||||
+#if defined(HAVE_FSTATFS)
|
||||
+ if (fstatfs(fd, &stfs))
|
||||
+ return STATUS_NO_SUCH_FILE;
|
||||
+#elif defined(HAVE_FSTATVFS)
|
||||
+ if (fstatvfs(fd, &stfs))
|
||||
+ return STATUS_NO_SUCH_FILE;
|
||||
+#endif
|
||||
+ close( fd );
|
||||
+#if defined(HAVE_FSTATFS) && defined(linux)
|
||||
+ switch (stfs.f_type)
|
||||
+ {
|
||||
+ case 0x6969: /* nfs */
|
||||
+ fstypename = "nfs";
|
||||
+ break;
|
||||
+ case 0xff534d42: /* cifs */
|
||||
+ fstypename = "cifs";
|
||||
+ break;
|
||||
+ case 0x564c: /* ncpfs */
|
||||
+ fstypename = "ncpfs";
|
||||
+ break;
|
||||
+ case 0x01021994: /* tmpfs */
|
||||
+ fstypename = "tmpfs";
|
||||
+ break;
|
||||
+ case 0x28cd3d45: /* cramfs */
|
||||
+ fstypename = "cramfs";
|
||||
+ break;
|
||||
+ case 0x1373: /* devfs */
|
||||
+ fstypename = "devfs";
|
||||
+ break;
|
||||
+ case 0x9fa0: /* procfs */
|
||||
+ fstypename = "procfs";
|
||||
+ break;
|
||||
+ case 0xef51: /* old ext2 */
|
||||
+ fstypename = "ext2";
|
||||
+ break;
|
||||
+ case 0xef53: /* ext2/3/4 */
|
||||
+ fstypename = "ext2";
|
||||
+ break;
|
||||
+ case 0x4244: /* hfs */
|
||||
+ fstypename = "hfs";
|
||||
+ break;
|
||||
+ case 0xf995e849: /* hpfs */
|
||||
+ fstypename = "hpfs";
|
||||
+ break;
|
||||
+ case 0x5346544e: /* ntfs */
|
||||
+ fstypename = "ntfs";
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__APPLE__) || defined(__NetBSD__)
|
||||
+ fstypename = stfs.f_fstypename;
|
||||
+#endif
|
||||
+ lstrcpynA( params->fstypename, fstypename, *params->size );
|
||||
+ return STATUS_SUCCESS;
|
||||
+#else
|
||||
+ return STATUS_NOT_IMPLEMENTED;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
static NTSTATUS match_unixdev( void *args )
|
||||
{
|
||||
const struct match_unixdev_params *params = args;
|
||||
@@ -607,6 +703,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] =
|
||||
write_credential,
|
||||
delete_credential,
|
||||
enumerate_credentials,
|
||||
+ get_volume_filesystem,
|
||||
};
|
||||
|
||||
C_ASSERT( ARRAYSIZE(__wine_unix_call_funcs) == unix_funcs_count );
|
||||
diff --git a/dlls/mountmgr.sys/unixlib.h b/dlls/mountmgr.sys/unixlib.h
|
||||
index 7a3d0038512..ac7e6a553c7 100644
|
||||
--- a/dlls/mountmgr.sys/unixlib.h
|
||||
+++ b/dlls/mountmgr.sys/unixlib.h
|
||||
@@ -107,6 +107,13 @@ struct read_volume_file_params
|
||||
ULONG *size;
|
||||
};
|
||||
|
||||
+struct get_volume_filesystem_params
|
||||
+{
|
||||
+ const char *volume;
|
||||
+ void *fstypename;
|
||||
+ ULONG *size;
|
||||
+};
|
||||
+
|
||||
struct match_unixdev_params
|
||||
{
|
||||
const char *device;
|
||||
@@ -173,6 +180,7 @@ enum mountmgr_funcs
|
||||
unix_write_credential,
|
||||
unix_delete_credential,
|
||||
unix_enumerate_credentials,
|
||||
+ unix_get_volume_filesystem,
|
||||
unix_funcs_count
|
||||
};
|
||||
|
||||
--
|
||||
2.40.1
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
From 8ceb056ccdf36bdf8a8692bd5882fc686aace5f6 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Wed, 29 May 2019 15:18:50 -0600
|
||||
Subject: wcmd: Display reparse point type in directory listings.
|
||||
|
||||
Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
|
||||
---
|
||||
programs/cmd/directory.c | 26 ++++++++++++++++++++++++++
|
||||
1 file changed, 26 insertions(+)
|
||||
|
||||
diff --git a/programs/cmd/directory.c b/programs/cmd/directory.c
|
||||
index 8417687939a..a849807c76e 100644
|
||||
--- a/programs/cmd/directory.c
|
||||
+++ b/programs/cmd/directory.c
|
||||
@@ -395,6 +395,32 @@ static DIRECTORY_STACK *WCMD_list_directory (DIRECTORY_STACK *inputparms, int le
|
||||
WCMD_output(L"%1!*s!", cur_width - tmp_width, L"");
|
||||
}
|
||||
|
||||
+ } else if (fd[i].dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {
|
||||
+ if (!bare) {
|
||||
+ const WCHAR *type;
|
||||
+
|
||||
+ switch(fd[i].dwReserved0) {
|
||||
+ case IO_REPARSE_TAG_MOUNT_POINT:
|
||||
+ type = L"<JUNCTION>";
|
||||
+ break;
|
||||
+ case IO_REPARSE_TAG_SYMLINK:
|
||||
+ default:
|
||||
+ type = (fd[i].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? L"<SYMLINKD>" : L"<SYMLINK>";
|
||||
+ break;
|
||||
+ }
|
||||
+ WCMD_output (L"%1!10s! %2!8s! %3!-14s!", datestring, timestring, type);
|
||||
+ if (shortname) WCMD_output (L"%1!-13s!", fd[i].cAlternateFileName);
|
||||
+ if (usernames) WCMD_output (L"%1!-23s!", username);
|
||||
+ WCMD_output(L"%1",fd[i].cFileName);
|
||||
+ } else {
|
||||
+ if (!((lstrcmpW(fd[i].cFileName, L".") == 0) ||
|
||||
+ (lstrcmpW(fd[i].cFileName, L"..") == 0))) {
|
||||
+ WCMD_output (L"%1%2", recurse?inputparms->dirName : L"", fd[i].cFileName);
|
||||
+ } else {
|
||||
+ addNewLine = FALSE;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
} else if (fd[i].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
||||
dir_count++;
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
||||
@@ -1,66 +0,0 @@
|
||||
From 563bc2fc3c48b2341a08a662e27e27a904702121 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Wed, 29 May 2019 15:38:30 -0600
|
||||
Subject: wcmd: Show reparse point target in directory listing.
|
||||
|
||||
Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
|
||||
---
|
||||
programs/cmd/directory.c | 35 +++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 35 insertions(+)
|
||||
|
||||
diff --git a/programs/cmd/directory.c b/programs/cmd/directory.c
|
||||
index a849807c76e..5b0a19b442d 100644
|
||||
--- a/programs/cmd/directory.c
|
||||
+++ b/programs/cmd/directory.c
|
||||
@@ -23,6 +23,8 @@
|
||||
|
||||
#include "wcmd.h"
|
||||
#include "wine/debug.h"
|
||||
+#include "winioctl.h"
|
||||
+#include "ddk/ntifs.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(cmd);
|
||||
|
||||
@@ -412,6 +414,39 @@ static DIRECTORY_STACK *WCMD_list_directory (DIRECTORY_STACK *inputparms, int le
|
||||
if (shortname) WCMD_output (L"%1!-13s!", fd[i].cAlternateFileName);
|
||||
if (usernames) WCMD_output (L"%1!-23s!", username);
|
||||
WCMD_output(L"%1",fd[i].cFileName);
|
||||
+ if (fd[i].dwReserved0) {
|
||||
+ REPARSE_DATA_BUFFER *buffer = NULL;
|
||||
+ WCHAR *target = NULL;
|
||||
+ INT buffer_len;
|
||||
+ HANDLE hlink;
|
||||
+ DWORD dwret;
|
||||
+ BOOL bret;
|
||||
+
|
||||
+ lstrcpyW(string, inputparms->dirName);
|
||||
+ lstrcatW(string, fd[i].cFileName);
|
||||
+ hlink = CreateFileW(string, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING,
|
||||
+ FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, 0);
|
||||
+ buffer_len = sizeof(*buffer) + 2*MAX_PATH*sizeof(WCHAR);
|
||||
+ buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, buffer_len);
|
||||
+ bret = DeviceIoControl(hlink, FSCTL_GET_REPARSE_POINT, NULL, 0, (LPVOID)buffer,
|
||||
+ buffer_len, &dwret, 0);
|
||||
+ if (bret) {
|
||||
+ INT offset;
|
||||
+ switch(buffer->ReparseTag) {
|
||||
+ case IO_REPARSE_TAG_MOUNT_POINT:
|
||||
+ offset = buffer->MountPointReparseBuffer.PrintNameOffset/sizeof(WCHAR);
|
||||
+ target = &buffer->MountPointReparseBuffer.PathBuffer[offset];
|
||||
+ break;
|
||||
+ case IO_REPARSE_TAG_SYMLINK:
|
||||
+ offset = buffer->SymbolicLinkReparseBuffer.PrintNameOffset/sizeof(WCHAR);
|
||||
+ target = &buffer->SymbolicLinkReparseBuffer.PathBuffer[offset];
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ CloseHandle(hlink);
|
||||
+ if (target) WCMD_output(L" [%1]", target);
|
||||
+ HeapFree(GetProcessHeap(), 0, buffer);
|
||||
+ }
|
||||
} else {
|
||||
if (!((lstrcmpW(fd[i].cFileName, L".") == 0) ||
|
||||
(lstrcmpW(fd[i].cFileName, L"..") == 0))) {
|
||||
--
|
||||
2.17.1
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
From be1665ad0d88598c409f6a1d699562c2dd0d525a Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Wed, 29 May 2019 16:01:45 -0600
|
||||
Subject: [PATCH] wcmd: Add junction point support to mklink.
|
||||
|
||||
Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
|
||||
---
|
||||
programs/cmd/builtins.c | 48 ++++++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 47 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c
|
||||
index 5b15c0f397a..6d7512275ce 100644
|
||||
--- a/programs/cmd/builtins.c
|
||||
+++ b/programs/cmd/builtins.c
|
||||
@@ -31,6 +31,9 @@
|
||||
#include "wcmd.h"
|
||||
#include <shellapi.h>
|
||||
#include "wine/debug.h"
|
||||
+#include "winternl.h"
|
||||
+#include "winioctl.h"
|
||||
+#include "ddk/ntifs.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(cmd);
|
||||
|
||||
@@ -4091,6 +4094,49 @@ RETURN_CODE WCMD_color(void)
|
||||
return errorlevel = return_code;
|
||||
}
|
||||
|
||||
+BOOL WCMD_create_junction(WCHAR *link, WCHAR *target) {
|
||||
+ static INT struct_size = offsetof(REPARSE_DATA_BUFFER, SymbolicLinkReparseBuffer.PathBuffer[0]);
|
||||
+ static INT header_size = offsetof(REPARSE_DATA_BUFFER, GenericReparseBuffer);
|
||||
+ INT buffer_size, data_size, string_len, prefix_len;
|
||||
+ WCHAR *subst_dest, *print_dest, *string;
|
||||
+ REPARSE_DATA_BUFFER *buffer;
|
||||
+ UNICODE_STRING nt_name;
|
||||
+ NTSTATUS status;
|
||||
+ HANDLE hlink;
|
||||
+ DWORD dwret;
|
||||
+ BOOL ret;
|
||||
+
|
||||
+ if (!CreateDirectoryW(link, NULL ))
|
||||
+ return FALSE;
|
||||
+ hlink = CreateFileW(link, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING,
|
||||
+ FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, 0);
|
||||
+ if (hlink == INVALID_HANDLE_VALUE)
|
||||
+ return FALSE;
|
||||
+ status = RtlDosPathNameToNtPathName_U_WithStatus(target, &nt_name, NULL, NULL);
|
||||
+ if (status)
|
||||
+ return FALSE;
|
||||
+ prefix_len = strlen("\\??\\");
|
||||
+ string = nt_name.Buffer;
|
||||
+ string_len = lstrlenW( &string[prefix_len] );
|
||||
+ data_size = (prefix_len + 2 * string_len + 2) * sizeof(WCHAR);
|
||||
+ buffer_size = struct_size + data_size;
|
||||
+ buffer = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, buffer_size );
|
||||
+ buffer->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
|
||||
+ buffer->ReparseDataLength = struct_size - header_size + data_size;
|
||||
+ buffer->MountPointReparseBuffer.SubstituteNameLength = (prefix_len + string_len) * sizeof(WCHAR);
|
||||
+ buffer->MountPointReparseBuffer.PrintNameOffset = (prefix_len + string_len + 1) * sizeof(WCHAR);
|
||||
+ buffer->MountPointReparseBuffer.PrintNameLength = string_len * sizeof(WCHAR);
|
||||
+ subst_dest = &buffer->MountPointReparseBuffer.PathBuffer[0];
|
||||
+ print_dest = &buffer->MountPointReparseBuffer.PathBuffer[prefix_len + string_len + 1];
|
||||
+ lstrcpyW(subst_dest, string);
|
||||
+ lstrcpyW(print_dest, &string[prefix_len]);
|
||||
+ RtlFreeUnicodeString(&nt_name );
|
||||
+ ret = DeviceIoControl(hlink, FSCTL_SET_REPARSE_POINT, (LPVOID)buffer, buffer_size, NULL, 0,
|
||||
+ &dwret, 0 );
|
||||
+ HeapFree(GetProcessHeap(), 0, buffer);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
/****************************************************************************
|
||||
* WCMD_mklink
|
||||
*/
|
||||
@@ -4141,7 +4187,7 @@ RETURN_CODE WCMD_mklink(WCHAR *args)
|
||||
else if(!junction)
|
||||
ret = CreateSymbolicLinkW(file1, file2, isdir);
|
||||
else
|
||||
- TRACE("Junction links currently not supported.\n");
|
||||
+ ret = WCMD_create_junction(file1, file2);
|
||||
}
|
||||
|
||||
if (ret) return errorlevel = NO_ERROR;
|
||||
--
|
||||
2.43.0
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,434 @@
|
||||
From 008de2881eae289c65ee8409f6bc2597d36a71a6 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Tue, 9 Dec 2025 07:21:23 +1100
|
||||
Subject: [PATCH] Updated vkd3d to d0318ca14bc58390847e29e5581dbe6165872770.
|
||||
|
||||
---
|
||||
libs/vkd3d/libs/vkd3d-shader/dxil.c | 101 +++++++++++++-------
|
||||
libs/vkd3d/libs/vkd3d-shader/hlsl.y | 30 +++++-
|
||||
libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c | 30 +++---
|
||||
libs/vkd3d/libs/vkd3d-shader/ir.c | 42 ++++++++
|
||||
4 files changed, 148 insertions(+), 55 deletions(-)
|
||||
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/dxil.c b/libs/vkd3d/libs/vkd3d-shader/dxil.c
|
||||
index 7a056775a16..f73106d79b2 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/dxil.c
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/dxil.c
|
||||
@@ -5021,7 +5021,7 @@ static bool sm6_parser_emit_reg_composite_construct(struct sm6_parser *sm6,
|
||||
const struct vkd3d_shader_register *operand_regs, unsigned int component_count,
|
||||
struct function_emission_state *state, struct vkd3d_shader_register *reg)
|
||||
{
|
||||
- struct vkd3d_shader_instruction *ins = state->ins;
|
||||
+ struct vkd3d_shader_instruction *ins;
|
||||
struct vsir_src_operand *src_params;
|
||||
struct vsir_dst_operand *dst_param;
|
||||
bool all_constant = true;
|
||||
@@ -5050,27 +5050,33 @@ static bool sm6_parser_emit_reg_composite_construct(struct sm6_parser *sm6,
|
||||
register_init_with_id(reg, VKD3DSPR_TEMP, operand_regs[0].data_type, state->temp_idx++);
|
||||
reg->dimension = VSIR_DIMENSION_VEC4;
|
||||
|
||||
- for (i = 0; i < component_count; ++i, ++ins)
|
||||
+ for (i = 0; i < component_count; ++i)
|
||||
{
|
||||
+ if (!(ins = sm6_parser_add_function_instruction(sm6, state)))
|
||||
+ return false;
|
||||
+
|
||||
+ state->ins = ins + 1;
|
||||
+
|
||||
vsir_instruction_init(ins, &sm6->p.location, VSIR_OP_MOV);
|
||||
|
||||
if (!(src_params = instruction_src_params_alloc(ins, 1, sm6)))
|
||||
- return false;
|
||||
+ goto error;
|
||||
|
||||
src_param_init(&src_params[0]);
|
||||
src_params[0].reg = operand_regs[i];
|
||||
|
||||
if (!(dst_param = instruction_dst_params_alloc(ins, 1, sm6)))
|
||||
- return false;
|
||||
+ goto error;
|
||||
|
||||
dst_param_init_scalar(dst_param, i);
|
||||
dst_param->reg = *reg;
|
||||
}
|
||||
|
||||
- state->ins = ins;
|
||||
- state->function->instructions.count += component_count;
|
||||
-
|
||||
return true;
|
||||
+
|
||||
+error:
|
||||
+ vkd3d_shader_instruction_make_nop(ins);
|
||||
+ return false;
|
||||
}
|
||||
|
||||
static bool sm6_parser_emit_composite_construct(struct sm6_parser *sm6, const struct sm6_value **operands,
|
||||
@@ -5417,7 +5423,7 @@ static void sm6_parser_emit_dx_barrier(struct sm6_parser *dxil, enum dx_intrinsi
|
||||
static void sm6_parser_emit_dx_buffer_update_counter(struct sm6_parser *sm6, enum dx_intrinsic_opcode op,
|
||||
const struct sm6_value **operands, struct function_emission_state *state)
|
||||
{
|
||||
- struct vkd3d_shader_instruction *ins = state->ins;
|
||||
+ struct vkd3d_shader_instruction *ins;
|
||||
struct vsir_src_operand *src_params;
|
||||
const struct sm6_value *resource;
|
||||
unsigned int i;
|
||||
@@ -5435,19 +5441,27 @@ static void sm6_parser_emit_dx_buffer_update_counter(struct sm6_parser *sm6, enu
|
||||
}
|
||||
i = sm6_value_get_constant_uint(operands[1], sm6);
|
||||
if (i != 1 && i != 255)
|
||||
- {
|
||||
- WARN("Unexpected update value %#x.\n", i);
|
||||
vkd3d_shader_parser_warning(&sm6->p, VKD3D_SHADER_WARNING_DXIL_IGNORING_OPERANDS,
|
||||
"Update value %#x for a UAV counter operation is not supported.", i);
|
||||
- }
|
||||
inc = i;
|
||||
|
||||
+ if (!(ins = sm6_parser_add_function_instruction(sm6, state)))
|
||||
+ return;
|
||||
+
|
||||
+ state->pushed_instruction = true;
|
||||
+
|
||||
vsir_instruction_init(ins, &sm6->p.location, (inc < 0) ? VSIR_OP_IMM_ATOMIC_CONSUME : VSIR_OP_IMM_ATOMIC_ALLOC);
|
||||
+
|
||||
if (!(src_params = instruction_src_params_alloc(ins, 1, sm6)))
|
||||
+ {
|
||||
+ vkd3d_shader_instruction_make_nop(ins);
|
||||
return;
|
||||
+ }
|
||||
+
|
||||
src_param_init_vector_from_handle(sm6, &src_params[0], &resource->u.handle);
|
||||
|
||||
- instruction_dst_param_init_ssa_scalar(ins, 0, sm6);
|
||||
+ if (!instruction_dst_param_init_ssa_scalar(ins, 0, sm6))
|
||||
+ vkd3d_shader_instruction_make_nop(ins);
|
||||
}
|
||||
|
||||
static void sm6_parser_emit_dx_calculate_lod(struct sm6_parser *sm6, enum dx_intrinsic_opcode op,
|
||||
@@ -5463,32 +5477,40 @@ static void sm6_parser_emit_dx_calculate_lod(struct sm6_parser *sm6, enum dx_int
|
||||
sampler = operands[1];
|
||||
if (!sm6_value_validate_is_texture_handle(resource, op, sm6)
|
||||
|| !sm6_value_validate_is_sampler_handle(sampler, op, sm6))
|
||||
- {
|
||||
return;
|
||||
- }
|
||||
|
||||
if (!sm6_parser_emit_coordinate_construct(sm6, &operands[2], 3, NULL, state, &coord))
|
||||
return;
|
||||
|
||||
clamp = sm6_value_get_constant_uint(operands[5], sm6);
|
||||
|
||||
- ins = state->ins;
|
||||
+ if (!(ins = sm6_parser_add_function_instruction(sm6, state)))
|
||||
+ return;
|
||||
+
|
||||
+ state->pushed_instruction = true;
|
||||
+
|
||||
vsir_instruction_init(ins, &sm6->p.location, VSIR_OP_LOD);
|
||||
+
|
||||
if (!(src_params = instruction_src_params_alloc(ins, 3, sm6)))
|
||||
+ {
|
||||
+ vkd3d_shader_instruction_make_nop(ins);
|
||||
return;
|
||||
+ }
|
||||
+
|
||||
src_param_init_vector_from_reg(&src_params[0], &coord);
|
||||
sm6_register_from_handle(sm6, &resource->u.handle, &src_params[1].reg);
|
||||
src_param_init_scalar(&src_params[1], !clamp);
|
||||
src_param_init_vector_from_handle(sm6, &src_params[2], &sampler->u.handle);
|
||||
|
||||
- instruction_dst_param_init_ssa_scalar(ins, 0, sm6);
|
||||
+ if (!instruction_dst_param_init_ssa_scalar(ins, 0, sm6))
|
||||
+ vkd3d_shader_instruction_make_nop(ins);
|
||||
}
|
||||
|
||||
static void sm6_parser_emit_dx_cbuffer_load(struct sm6_parser *sm6, enum dx_intrinsic_opcode op,
|
||||
const struct sm6_value **operands, struct function_emission_state *state)
|
||||
{
|
||||
struct sm6_value *dst = sm6_parser_get_current_value(sm6);
|
||||
- struct vkd3d_shader_instruction *ins = state->ins;
|
||||
+ struct vkd3d_shader_instruction *ins;
|
||||
struct vsir_src_operand *src_param;
|
||||
const struct sm6_value *buffer;
|
||||
const struct sm6_type *type;
|
||||
@@ -5497,10 +5519,19 @@ static void sm6_parser_emit_dx_cbuffer_load(struct sm6_parser *sm6, enum dx_intr
|
||||
if (!sm6_value_validate_is_handle(buffer, sm6))
|
||||
return;
|
||||
|
||||
+ if (!(ins = sm6_parser_add_function_instruction(sm6, state)))
|
||||
+ return;
|
||||
+
|
||||
+ state->pushed_instruction = true;
|
||||
+
|
||||
vsir_instruction_init(ins, &sm6->p.location, VSIR_OP_MOV);
|
||||
|
||||
if (!(src_param = instruction_src_params_alloc(ins, 1, sm6)))
|
||||
+ {
|
||||
+ vkd3d_shader_instruction_make_nop(ins);
|
||||
return;
|
||||
+ }
|
||||
+
|
||||
src_param_init_vector_from_handle(sm6, src_param, &buffer->u.handle);
|
||||
/* Differently from other descriptors, constant buffers require an
|
||||
* additional index, used to index within the constant buffer itself. */
|
||||
@@ -5515,7 +5546,8 @@ static void sm6_parser_emit_dx_cbuffer_load(struct sm6_parser *sm6, enum dx_intr
|
||||
else
|
||||
register_convert_to_minimum_precision(&src_param->reg);
|
||||
|
||||
- instruction_dst_param_init_ssa_vector(ins, sm6_type_max_vector_size(type), sm6);
|
||||
+ if (!instruction_dst_param_init_ssa_vector(ins, sm6_type_max_vector_size(type), sm6))
|
||||
+ vkd3d_shader_instruction_make_nop(ins);
|
||||
}
|
||||
|
||||
static void sm6_parser_dcl_register_builtin(struct sm6_parser *dxil, enum vkd3d_shader_opcode opcode,
|
||||
@@ -6289,29 +6321,23 @@ static void sm6_parser_emit_dx_buffer_store(struct sm6_parser *sm6, enum dx_intr
|
||||
|
||||
if (resource->u.handle.d->kind == RESOURCE_KIND_RAWBUFFER
|
||||
|| resource->u.handle.d->kind == RESOURCE_KIND_STRUCTUREDBUFFER)
|
||||
- {
|
||||
return sm6_parser_emit_dx_raw_buffer_store(sm6, op, operands, state);
|
||||
- }
|
||||
|
||||
if (resource->u.handle.d->kind != RESOURCE_KIND_TYPEDBUFFER)
|
||||
- {
|
||||
- WARN("Resource is not a typed buffer.\n");
|
||||
vkd3d_shader_parser_warning(&sm6->p, VKD3D_SHADER_WARNING_DXIL_INVALID_OPERATION,
|
||||
"Resource for a typed buffer store is not a typed buffer.");
|
||||
- }
|
||||
|
||||
write_mask = sm6_value_get_constant_uint(operands[7], sm6);
|
||||
if (!write_mask || write_mask > VKD3DSP_WRITEMASK_ALL)
|
||||
{
|
||||
- WARN("Invalid write mask %#x.\n", write_mask);
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
||||
"Write mask %#x for a typed buffer store operation is invalid.", write_mask);
|
||||
return;
|
||||
}
|
||||
else if (write_mask & (write_mask + 1))
|
||||
{
|
||||
- /* In this case, it is unclear which source operands will be defined unless we encounter it in a shader. */
|
||||
- FIXME("Unhandled write mask %#x.\n", write_mask);
|
||||
+ /* In this case, it is unclear which source operands will be defined
|
||||
+ * unless we encounter it in a shader. */
|
||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
||||
"Write mask %#x for a typed buffer store operation is unhandled.", write_mask);
|
||||
}
|
||||
@@ -6320,22 +6346,33 @@ static void sm6_parser_emit_dx_buffer_store(struct sm6_parser *sm6, enum dx_intr
|
||||
if (!sm6_parser_emit_composite_construct(sm6, &operands[3], component_count, state, &texel))
|
||||
return;
|
||||
|
||||
- ins = state->ins;
|
||||
+ if (!(ins = sm6_parser_add_function_instruction(sm6, state)))
|
||||
+ return;
|
||||
+
|
||||
+ state->pushed_instruction = true;
|
||||
+
|
||||
vsir_instruction_init(ins, &sm6->p.location, VSIR_OP_STORE_UAV_TYPED);
|
||||
|
||||
if (!(src_params = instruction_src_params_alloc(ins, 2, sm6)))
|
||||
+ {
|
||||
+ vkd3d_shader_instruction_make_nop(ins);
|
||||
return;
|
||||
+ }
|
||||
+
|
||||
src_param_init_from_value(&src_params[0], operands[1], 0, sm6);
|
||||
if (!sm6_value_is_undef(operands[2]))
|
||||
- {
|
||||
- /* Constant zero would have no effect, but is not worth checking for unless it shows up. */
|
||||
- WARN("Ignoring structure offset.\n");
|
||||
+ /* Constant zero would have no effect, but is not worth checking for
|
||||
+ * unless it shows up. */
|
||||
vkd3d_shader_parser_warning(&sm6->p, VKD3D_SHADER_WARNING_DXIL_IGNORING_OPERANDS,
|
||||
"Ignoring structure offset for a typed buffer store.");
|
||||
- }
|
||||
src_param_init_vector_from_reg(&src_params[1], &texel);
|
||||
|
||||
- dst_param = instruction_dst_params_alloc(ins, 1, sm6);
|
||||
+ if (!(dst_param = instruction_dst_params_alloc(ins, 1, sm6)))
|
||||
+ {
|
||||
+ vkd3d_shader_instruction_make_nop(ins);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
dst_param_init_with_mask(dst_param, write_mask);
|
||||
sm6_register_from_handle(sm6, &resource->u.handle, &dst_param->reg);
|
||||
}
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/hlsl.y b/libs/vkd3d/libs/vkd3d-shader/hlsl.y
|
||||
index 4efa1cd2873..d5dcc775a00 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/hlsl.y
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/hlsl.y
|
||||
@@ -2410,6 +2410,21 @@ static void check_invalid_object_fields(struct hlsl_ctx *ctx, const struct hlsl_
|
||||
"Target profile doesn't support objects as struct members in uniform variables.");
|
||||
}
|
||||
|
||||
+static void validate_groupshared_var(struct hlsl_ctx *ctx, const struct hlsl_ir_var *var)
|
||||
+{
|
||||
+ if (type_has_object_components(var->data_type))
|
||||
+ {
|
||||
+ struct vkd3d_string_buffer *string;
|
||||
+
|
||||
+ if ((string = hlsl_type_to_string(ctx, var->data_type)))
|
||||
+ {
|
||||
+ hlsl_error(ctx, &var->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
|
||||
+ "Groupshared type %s is not numeric.", string->buffer);
|
||||
+ hlsl_release_string_buffer(ctx, string);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void declare_var(struct hlsl_ctx *ctx, struct parse_variable_def *v)
|
||||
{
|
||||
uint32_t modifiers = v->modifiers | v->semantic.modifiers;
|
||||
@@ -2564,11 +2579,18 @@ static void declare_var(struct hlsl_ctx *ctx, struct parse_variable_def *v)
|
||||
hlsl_error(ctx, &var->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_MODIFIER,
|
||||
"Variable '%s' is declared as both \"uniform\" and \"static\".", var->name);
|
||||
|
||||
- if ((modifiers & HLSL_STORAGE_GROUPSHARED) && ctx->profile->type != VKD3D_SHADER_TYPE_COMPUTE)
|
||||
+ if ((modifiers & HLSL_STORAGE_GROUPSHARED))
|
||||
{
|
||||
- modifiers &= ~HLSL_STORAGE_GROUPSHARED;
|
||||
- hlsl_warning(ctx, &var->loc, VKD3D_SHADER_WARNING_HLSL_IGNORED_MODIFIER,
|
||||
- "Ignoring the 'groupshared' modifier in a non-compute shader.");
|
||||
+ /* d3dcompiler/fxc always validates global groupshared variables,
|
||||
+ * regardless of whether the groupshared modifier is ignored. */
|
||||
+ validate_groupshared_var(ctx, var);
|
||||
+
|
||||
+ if (ctx->profile->type != VKD3D_SHADER_TYPE_COMPUTE)
|
||||
+ {
|
||||
+ modifiers &= ~HLSL_STORAGE_GROUPSHARED;
|
||||
+ hlsl_warning(ctx, &var->loc, VKD3D_SHADER_WARNING_HLSL_IGNORED_MODIFIER,
|
||||
+ "Ignoring the 'groupshared' modifier in a non-compute shader.");
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Mark it as uniform. We need to do this here since synthetic
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c
|
||||
index 55d7f1f7c55..7adaeaa4c1e 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c
|
||||
@@ -3715,25 +3715,20 @@ static struct hlsl_ir_node *fold_redundant_casts(struct hlsl_ctx *ctx,
|
||||
* split_array_copies(), split_struct_copies() and
|
||||
* split_matrix_copies(). Inserts new instructions right before
|
||||
* "store". */
|
||||
-static bool split_copy(struct hlsl_ctx *ctx, struct hlsl_ir_store *store,
|
||||
+static void split_copy(struct hlsl_ctx *ctx, struct hlsl_ir_store *store,
|
||||
const struct hlsl_ir_load *load, const unsigned int idx, struct hlsl_type *type)
|
||||
{
|
||||
- struct hlsl_ir_node *split_store, *c;
|
||||
- struct hlsl_ir_load *split_load;
|
||||
+ struct hlsl_ir_node *c, *split_load;
|
||||
+ struct hlsl_block block;
|
||||
|
||||
- if (!(c = hlsl_new_uint_constant(ctx, idx, &store->node.loc)))
|
||||
- return false;
|
||||
- list_add_before(&store->node.entry, &c->entry);
|
||||
+ hlsl_block_init(&block);
|
||||
|
||||
- if (!(split_load = hlsl_new_load_index(ctx, &load->src, c, &store->node.loc)))
|
||||
- return false;
|
||||
- list_add_before(&store->node.entry, &split_load->node.entry);
|
||||
+ c = hlsl_block_add_uint_constant(ctx, &block, idx, &store->node.loc);
|
||||
+ split_load = hlsl_block_add_load_index(ctx, &block, &load->src, c, &store->node.loc);
|
||||
|
||||
- if (!(split_store = hlsl_new_store_index(ctx, &store->lhs, c, &split_load->node, 0, &store->node.loc)))
|
||||
- return false;
|
||||
- list_add_before(&store->node.entry, &split_store->entry);
|
||||
+ hlsl_block_add_store_index(ctx, &block, &store->lhs, c, split_load, 0, &store->node.loc);
|
||||
|
||||
- return true;
|
||||
+ list_move_before(&store->node.entry, &block.instrs);
|
||||
}
|
||||
|
||||
static bool split_array_copies(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, void *context)
|
||||
@@ -3762,8 +3757,7 @@ static bool split_array_copies(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr,
|
||||
|
||||
for (i = 0; i < type->e.array.elements_count; ++i)
|
||||
{
|
||||
- if (!split_copy(ctx, store, hlsl_ir_load(rhs), i, element_type))
|
||||
- return false;
|
||||
+ split_copy(ctx, store, hlsl_ir_load(rhs), i, element_type);
|
||||
}
|
||||
|
||||
/* Remove the store instruction, so that we can split structs which contain
|
||||
@@ -3800,8 +3794,7 @@ static bool split_struct_copies(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr
|
||||
{
|
||||
const struct hlsl_struct_field *field = &type->e.record.fields[i];
|
||||
|
||||
- if (!split_copy(ctx, store, hlsl_ir_load(rhs), i, field->type))
|
||||
- return false;
|
||||
+ split_copy(ctx, store, hlsl_ir_load(rhs), i, field->type);
|
||||
}
|
||||
|
||||
/* Remove the store instruction, so that we can split structs which contain
|
||||
@@ -3933,8 +3926,7 @@ static bool split_matrix_copies(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr
|
||||
{
|
||||
for (i = 0; i < hlsl_type_major_size(type); ++i)
|
||||
{
|
||||
- if (!split_copy(ctx, store, hlsl_ir_load(rhs), i, element_type))
|
||||
- return false;
|
||||
+ split_copy(ctx, store, hlsl_ir_load(rhs), i, element_type);
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/ir.c b/libs/vkd3d/libs/vkd3d-shader/ir.c
|
||||
index 0261ba88989..1be88479cee 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/ir.c
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/ir.c
|
||||
@@ -1270,6 +1270,44 @@ static enum vkd3d_result vsir_program_normalize_addr(struct vsir_program *progra
|
||||
return VKD3D_OK;
|
||||
}
|
||||
|
||||
+static enum vkd3d_result vsir_program_lower_dp2add(struct vsir_program *program, struct vsir_program_iterator *dp2add)
|
||||
+{
|
||||
+ struct vkd3d_shader_instruction *ins = vsir_program_iterator_current(dp2add);
|
||||
+ const struct vkd3d_shader_location location = ins->location;
|
||||
+ const struct vsir_src_operand *src = ins->src;
|
||||
+ const struct vsir_dst_operand *dst = ins->dst;
|
||||
+ struct vsir_program_iterator it;
|
||||
+ unsigned int dot_id;
|
||||
+
|
||||
+ /* dp2add DST, SRC0, SRC1, SRC2
|
||||
+ * ->
|
||||
+ * dp2 srDOT, SRC0, SRC1
|
||||
+ * add DST, srDOT, SRC2 */
|
||||
+
|
||||
+ if (!(ins = vsir_program_iterator_insert_before(dp2add, &it, 1)))
|
||||
+ return VKD3D_ERROR_OUT_OF_MEMORY;
|
||||
+ if (!vsir_instruction_init_with_params(program, ins, &location, VSIR_OP_DP2, 1, 2))
|
||||
+ goto fail;
|
||||
+ dot_id = program->ssa_count++;
|
||||
+ vsir_dst_operand_init_ssa(&ins->dst[0], dot_id, src[0].reg.data_type, VSIR_DIMENSION_SCALAR);
|
||||
+ ins->src[0] = src[0];
|
||||
+ ins->src[1] = src[1];
|
||||
+
|
||||
+ ins = vsir_program_iterator_next(&it);
|
||||
+ if (!vsir_instruction_init_with_params(program, ins, &location, VSIR_OP_ADD, 1, 2))
|
||||
+ goto fail;
|
||||
+ ins->dst[0] = dst[0];
|
||||
+ vsir_src_operand_init_ssa(&ins->src[0], dot_id, src[0].reg.data_type, VSIR_DIMENSION_SCALAR);
|
||||
+ ins->src[1] = src[2];
|
||||
+
|
||||
+ return VKD3D_OK;
|
||||
+
|
||||
+fail:
|
||||
+ vsir_program_iterator_nop_range(&it, dp2add, &location);
|
||||
+
|
||||
+ return VKD3D_ERROR_OUT_OF_MEMORY;
|
||||
+}
|
||||
+
|
||||
static enum vkd3d_result vsir_program_lower_ifc(struct vsir_program *program,
|
||||
struct vsir_program_iterator *it, unsigned int *tmp_idx,
|
||||
struct vkd3d_shader_message_context *message_context)
|
||||
@@ -2470,6 +2508,10 @@ static enum vkd3d_result vsir_program_lower_d3dbc_instructions(struct vsir_progr
|
||||
ret = vsir_program_lower_bem(program, &it);
|
||||
break;
|
||||
|
||||
+ case VSIR_OP_DP2ADD:
|
||||
+ ret = vsir_program_lower_dp2add(program, &it);
|
||||
+ break;
|
||||
+
|
||||
case VSIR_OP_IFC:
|
||||
ret = vsir_program_lower_ifc(program, &it, &tmp_idx, message_context);
|
||||
break;
|
||||
--
|
||||
2.51.0
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,120 +0,0 @@
|
||||
From cf607d9c2b6071769acdad862336e621b332ecb0 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Fri, 28 Nov 2025 08:54:08 +1100
|
||||
Subject: [PATCH] Updated vkd3d to fdfb74b20b08144e144299bc0b7b20b95421c6c8.
|
||||
|
||||
---
|
||||
libs/vkd3d/libs/vkd3d-shader/ir.c | 60 +++++++++++++++++++
|
||||
.../libs/vkd3d-shader/vkd3d_shader_private.h | 18 ++++++
|
||||
2 files changed, 78 insertions(+)
|
||||
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/ir.c b/libs/vkd3d/libs/vkd3d-shader/ir.c
|
||||
index 1a0c9d83306..3548e748c18 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/ir.c
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/ir.c
|
||||
@@ -1323,6 +1323,62 @@ static enum vkd3d_result vsir_program_lower_ifc(struct vsir_program *program,
|
||||
return VKD3D_OK;
|
||||
}
|
||||
|
||||
+static enum vkd3d_result vsir_program_lower_nrm(struct vsir_program *program, struct vsir_program_iterator *nrm)
|
||||
+{
|
||||
+ struct vkd3d_shader_instruction *ins = vsir_program_iterator_current(nrm);
|
||||
+ const struct vkd3d_shader_location location = ins->location;
|
||||
+ const struct vkd3d_shader_src_param *src = ins->src;
|
||||
+ const struct vkd3d_shader_dst_param *dst = ins->dst;
|
||||
+ unsigned int dot_id, rsq_id, mul_id;
|
||||
+ struct vsir_program_iterator it;
|
||||
+
|
||||
+ /* nrm DST, SRC
|
||||
+ * ->
|
||||
+ * dp3 srDOT, SRC, SRC
|
||||
+ * rsq srRSQ, srDOT
|
||||
+ * mul srMUL, srRSQ, SRC
|
||||
+ * movc DST, srDOT, srMUL, srDOT */
|
||||
+
|
||||
+ if (!(ins = vsir_program_iterator_insert_before(nrm, &it, 3)))
|
||||
+ return VKD3D_ERROR_OUT_OF_MEMORY;
|
||||
+ if (!vsir_instruction_init_with_params(program, ins, &location, VSIR_OP_DP3, 1, 2))
|
||||
+ goto fail;
|
||||
+ dot_id = program->ssa_count++;
|
||||
+ dst_param_init_ssa(&ins->dst[0], dot_id, src[0].reg.data_type, VSIR_DIMENSION_SCALAR);
|
||||
+ ins->src[0] = src[0];
|
||||
+ ins->src[1] = src[0];
|
||||
+
|
||||
+ ins = vsir_program_iterator_next(&it);
|
||||
+ if (!vsir_instruction_init_with_params(program, ins, &location, VSIR_OP_RSQ, 1, 1))
|
||||
+ goto fail;
|
||||
+ rsq_id = program->ssa_count++;
|
||||
+ dst_param_init_ssa(&ins->dst[0], rsq_id, src[0].reg.data_type, VSIR_DIMENSION_SCALAR);
|
||||
+ src_param_init_ssa(&ins->src[0], dot_id, src[0].reg.data_type, VSIR_DIMENSION_SCALAR);
|
||||
+
|
||||
+ ins = vsir_program_iterator_next(&it);
|
||||
+ if (!vsir_instruction_init_with_params(program, ins, &location, VSIR_OP_MUL, 1, 2))
|
||||
+ goto fail;
|
||||
+ mul_id = program->ssa_count++;
|
||||
+ dst_param_init_ssa(&ins->dst[0], mul_id, src[0].reg.data_type, dst[0].reg.dimension);
|
||||
+ src_param_init_ssa(&ins->src[0], rsq_id, src[0].reg.data_type, VSIR_DIMENSION_SCALAR);
|
||||
+ ins->src[1] = src[0];
|
||||
+
|
||||
+ ins = vsir_program_iterator_next(&it);
|
||||
+ if (!vsir_instruction_init_with_params(program, ins, &location, VSIR_OP_MOVC, 1, 3))
|
||||
+ goto fail;
|
||||
+ ins->dst[0] = dst[0];
|
||||
+ src_param_init_ssa(&ins->src[0], dot_id, VSIR_DATA_U32, VSIR_DIMENSION_SCALAR);
|
||||
+ src_param_init_ssa(&ins->src[1], mul_id, src[0].reg.data_type, dst[0].reg.dimension);
|
||||
+ src_param_init_ssa(&ins->src[2], dot_id, src[0].reg.data_type, VSIR_DIMENSION_SCALAR);
|
||||
+
|
||||
+ return VKD3D_OK;
|
||||
+
|
||||
+fail:
|
||||
+ vsir_program_iterator_nop_range(&it, nrm, &location);
|
||||
+
|
||||
+ return VKD3D_ERROR_OUT_OF_MEMORY;
|
||||
+}
|
||||
+
|
||||
static enum vkd3d_result vsir_program_lower_texkill(struct vsir_program *program,
|
||||
struct vsir_program_iterator *it, unsigned int *tmp_idx)
|
||||
{
|
||||
@@ -2364,6 +2420,10 @@ static enum vkd3d_result vsir_program_lower_d3dbc_instructions(struct vsir_progr
|
||||
ret = vsir_program_lower_ifc(program, &it, &tmp_idx, message_context);
|
||||
break;
|
||||
|
||||
+ case VSIR_OP_NRM:
|
||||
+ ret = vsir_program_lower_nrm(program, &it);
|
||||
+ break;
|
||||
+
|
||||
case VSIR_OP_SINCOS:
|
||||
ret = vsir_program_lower_sm1_sincos(program, &it);
|
||||
break;
|
||||
diff --git a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
|
||||
index 46f62a9e55c..33004dc62d9 100644
|
||||
--- a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
|
||||
+++ b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
|
||||
@@ -1572,6 +1572,24 @@ static inline struct vkd3d_shader_instruction *vsir_program_iterator_insert_befo
|
||||
return vsir_program_iterator_current(it);
|
||||
}
|
||||
|
||||
+static inline void vsir_program_iterator_nop_range(const struct vsir_program_iterator *first,
|
||||
+ const struct vsir_program_iterator *last, const struct vkd3d_shader_location *location)
|
||||
+{
|
||||
+ const struct vkd3d_shader_instruction_array *array = first->array;
|
||||
+ size_t first_idx = first->idx;
|
||||
+ size_t last_idx = last->idx;
|
||||
+ size_t idx;
|
||||
+
|
||||
+ VKD3D_ASSERT(last->array == array);
|
||||
+ VKD3D_ASSERT(last_idx < array->count);
|
||||
+ VKD3D_ASSERT(first_idx <= last_idx);
|
||||
+
|
||||
+ for (idx = first_idx; idx <= last_idx; ++idx)
|
||||
+ {
|
||||
+ vsir_instruction_init(&array->elements[idx], location, VSIR_OP_NOP);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
enum vkd3d_shader_config_flags
|
||||
{
|
||||
VKD3D_SHADER_CONFIG_FLAG_FORCE_VALIDATION = 0x00000001,
|
||||
--
|
||||
2.51.0
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
From 555187b5ebdae9e7aa8a3edf7a74997c86fe0016 Mon Sep 17 00:00:00 2001
|
||||
From 2e3dfb8b8a87cadeb95143b4b67387af283b04e6 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Thu, 8 Jun 2017 23:50:03 +0200
|
||||
Subject: [PATCH] programs/winedevice: Load some common drivers and fix ldr
|
||||
@@ -10,7 +10,7 @@ Subject: [PATCH] programs/winedevice: Load some common drivers and fix ldr
|
||||
2 files changed, 76 insertions(+)
|
||||
|
||||
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
|
||||
index 751f2acff96..1af19c6f9ba 100644
|
||||
index f30c340e9bd..3c5b07fd0f7 100644
|
||||
--- a/dlls/ntoskrnl.exe/tests/driver.c
|
||||
+++ b/dlls/ntoskrnl.exe/tests/driver.c
|
||||
@@ -57,6 +57,7 @@ static int kmemcmp( const void *ptr1, const void *ptr2, size_t n )
|
||||
@@ -19,9 +19,9 @@ index 751f2acff96..1af19c6f9ba 100644
|
||||
static DEVICE_OBJECT *lower_device, *upper_device;
|
||||
+static LDR_DATA_TABLE_ENTRY *ldr_module;
|
||||
|
||||
static POBJECT_TYPE *pExEventObjectType, *pIoFileObjectType, *pPsThreadType, *pIoDriverObjectType;
|
||||
static PEPROCESS *pPsInitialSystemProcess;
|
||||
@@ -1716,6 +1717,7 @@ static void test_resource(void)
|
||||
static IRP *queued_async_irps[2];
|
||||
static unsigned int queued_async_count;
|
||||
@@ -1734,6 +1735,7 @@ static void test_resource(void)
|
||||
ok(status == STATUS_SUCCESS, "got status %#lx\n", status);
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ index 751f2acff96..1af19c6f9ba 100644
|
||||
static void test_lookup_thread(void)
|
||||
{
|
||||
NTSTATUS status;
|
||||
@@ -2425,6 +2427,52 @@ static void test_default_security(void)
|
||||
@@ -2444,6 +2446,52 @@ static void test_default_security(void)
|
||||
FltFreeSecurityDescriptor(sd);
|
||||
}
|
||||
|
||||
@@ -82,7 +82,7 @@ index 751f2acff96..1af19c6f9ba 100644
|
||||
static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *stack)
|
||||
{
|
||||
void *buffer = irp->AssociatedIrp.SystemBuffer;
|
||||
@@ -2457,6 +2505,7 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st
|
||||
@@ -2476,6 +2524,7 @@ static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *st
|
||||
test_stack_callout();
|
||||
test_lookaside_list();
|
||||
test_ob_reference();
|
||||
@@ -90,7 +90,7 @@ index 751f2acff96..1af19c6f9ba 100644
|
||||
test_resource();
|
||||
test_lookup_thread();
|
||||
test_IoAttachDeviceToDeviceStack();
|
||||
@@ -2938,6 +2987,7 @@ NTSTATUS WINAPI DriverEntry(DRIVER_OBJECT *driver, PUNICODE_STRING registry)
|
||||
@@ -2987,6 +3036,7 @@ NTSTATUS WINAPI DriverEntry(DRIVER_OBJECT *driver, PUNICODE_STRING registry)
|
||||
DbgPrint("loading driver\n");
|
||||
|
||||
driver_obj = driver;
|
||||
@@ -99,10 +99,10 @@ index 751f2acff96..1af19c6f9ba 100644
|
||||
/* Allow unloading of the driver */
|
||||
driver->DriverUnload = driver_Unload;
|
||||
diff --git a/programs/winedevice/device.c b/programs/winedevice/device.c
|
||||
index bb585087230..9b4395ff098 100644
|
||||
index 8f816c2c0ec..6a7d0972a11 100644
|
||||
--- a/programs/winedevice/device.c
|
||||
+++ b/programs/winedevice/device.c
|
||||
@@ -122,8 +122,16 @@ static DWORD WINAPI service_handler( DWORD ctrl, DWORD event_type, LPVOID event_
|
||||
@@ -121,8 +121,16 @@ static DWORD WINAPI service_handler( DWORD ctrl, DWORD event_type, LPVOID event_
|
||||
|
||||
static void WINAPI ServiceMain( DWORD argc, LPWSTR *argv )
|
||||
{
|
||||
@@ -119,7 +119,7 @@ index bb585087230..9b4395ff098 100644
|
||||
|
||||
if (!(stop_event = CreateEventW( NULL, TRUE, FALSE, NULL )))
|
||||
return;
|
||||
@@ -136,6 +144,24 @@ static void WINAPI ServiceMain( DWORD argc, LPWSTR *argv )
|
||||
@@ -135,6 +143,24 @@ static void WINAPI ServiceMain( DWORD argc, LPWSTR *argv )
|
||||
wcscat( driver_dir, L"\\drivers" );
|
||||
AddDllDirectory( driver_dir );
|
||||
|
||||
@@ -145,5 +145,5 @@ index bb585087230..9b4395ff098 100644
|
||||
set_service_status( service_handle, SERVICE_RUNNING,
|
||||
SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN );
|
||||
--
|
||||
2.43.0
|
||||
2.51.0
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
Wine Staging 10.20
|
||||
Wine Staging 11.0-rc2
|
||||
|
||||
@@ -1 +1 @@
|
||||
4dfbf077cf708e4bbffa8e086d78d6652bbd69d8
|
||||
0f4bed55db21d5dd1e3c671ca3a2f33c9c383e4b
|
||||
|
||||
Reference in New Issue
Block a user