Wine-Devel
Threads by month
- ----- 2026 -----
- 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
- 12 participants
- 84522 discussions
Signed-off-by: André Zwing <nerv(a)dawncrow.de>
---
dlls/ntdll/ntdll.spec | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index bd8e1f5efe6..0a710559efe 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -52,7 +52,7 @@
@ stdcall EtwEventSetInformation(int64 long ptr long)
@ stdcall EtwEventUnregister(int64)
@ stdcall EtwEventWrite(int64 ptr long ptr)
-@ stdcall EtwEventWriteString(int64 long int64 ptr)
+@ stdcall EtwEventWriteString(int64 long int64 wstr)
@ stdcall EtwEventWriteTransfer(int64 ptr ptr ptr long ptr)
@ stdcall EtwGetTraceEnableFlags(int64)
@ stdcall EtwGetTraceEnableLevel(int64)
@@ -594,7 +594,7 @@
@ stub RtlDeleteNoSplay
@ stub RtlDeleteOwnersRanges
@ stub RtlDeleteRange
-@ stdcall RtlDeleteRegistryValue(long ptr ptr)
+@ stdcall RtlDeleteRegistryValue(long wstr wstr)
@ stdcall RtlDeleteResource(ptr)
@ stdcall RtlDeleteSecurityObject(ptr)
@ stdcall RtlDeleteTimer(ptr ptr ptr)
@@ -913,8 +913,8 @@
@ stub RtlQueryProperties
@ stub RtlQueryPropertyNames
@ stub RtlQueryPropertySet
-@ stdcall RtlQueryRegistryValues(long ptr ptr ptr ptr)
-@ stdcall RtlQueryRegistryValuesEx(long ptr ptr ptr ptr) RtlQueryRegistryValues
+@ stdcall RtlQueryRegistryValues(long wstr ptr ptr ptr)
+@ stdcall RtlQueryRegistryValuesEx(long wstr ptr ptr ptr) RtlQueryRegistryValues
@ stub RtlQuerySecurityObject
@ stub RtlQueryTagHeap
@ stdcall RtlQueryTimeZoneInformation(ptr)
@@ -1089,7 +1089,7 @@
@ stdcall RtlWow64IsWowGuestMachineSupported(long ptr)
@ stdcall -arch=win64 RtlWow64SetThreadContext(long ptr)
@ stub RtlWriteMemoryStream
-@ stdcall RtlWriteRegistryValue(long ptr ptr long ptr long)
+@ stdcall RtlWriteRegistryValue(long wstr wstr long ptr long)
@ stub RtlZeroHeap
@ stdcall RtlZeroMemory(ptr long)
@ stdcall RtlZombifyActivationContext(ptr)
--
2.25.1
1
0
Signed-off-by: André Zwing <nerv(a)dawncrow.de>
---
dlls/advapi32/advapi32.spec | 18 +++++++++---------
.../api-ms-win-core-registry-l2-1-0.spec | 8 ++++----
.../api-ms-win-core-registry-l2-2-0.spec | 8 ++++----
.../api-ms-win-security-lsalookup-l2-1-0.spec | 4 ++--
.../api-ms-win-security-lsalookup-l2-1-1.spec | 4 ++--
5 files changed, 21 insertions(+), 21 deletions(-)
diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec
index 0391643aa6a..e9db778647f 100644
--- a/dlls/advapi32/advapi32.spec
+++ b/dlls/advapi32/advapi32.spec
@@ -129,7 +129,7 @@
# @ stub ConvertStringSDToSDRootDomainW
@ stdcall ConvertStringSecurityDescriptorToSecurityDescriptorA(str long ptr ptr)
@ stdcall -import ConvertStringSecurityDescriptorToSecurityDescriptorW(wstr long ptr ptr)
-@ stdcall ConvertStringSidToSidA(ptr ptr)
+@ stdcall ConvertStringSidToSidA(str ptr)
@ stdcall -import ConvertStringSidToSidW(ptr ptr)
@ stdcall -import ConvertToAutoInheritPrivateObjectSecurity(ptr ptr ptr ptr long ptr)
@ stdcall -import CopySid(long ptr ptr)
@@ -429,16 +429,16 @@
@ stdcall LogonUserW(wstr wstr wstr long long ptr)
@ stdcall LookupAccountNameA(str str ptr ptr ptr ptr ptr)
@ stdcall LookupAccountNameW(wstr wstr ptr ptr ptr ptr ptr)
-@ stdcall LookupAccountSidA(ptr ptr ptr ptr ptr ptr ptr)
+@ stdcall LookupAccountSidA(str ptr ptr ptr ptr ptr ptr)
@ stdcall LookupAccountSidLocalA(ptr ptr ptr ptr ptr ptr)
@ stdcall LookupAccountSidLocalW(ptr ptr ptr ptr ptr ptr)
-@ stdcall LookupAccountSidW(ptr ptr ptr ptr ptr ptr ptr)
+@ stdcall LookupAccountSidW(wstr ptr ptr ptr ptr ptr ptr)
@ stdcall LookupPrivilegeDisplayNameA(str str str ptr ptr)
@ stdcall LookupPrivilegeDisplayNameW(wstr wstr wstr ptr ptr)
@ stdcall LookupPrivilegeNameA(str ptr ptr ptr)
@ stdcall LookupPrivilegeNameW(wstr ptr ptr ptr)
-@ stdcall LookupPrivilegeValueA(ptr ptr ptr)
-@ stdcall LookupPrivilegeValueW(ptr ptr ptr)
+@ stdcall LookupPrivilegeValueA(str str ptr)
+@ stdcall LookupPrivilegeValueW(wstr wstr ptr)
@ stdcall LookupSecurityDescriptorPartsA(ptr ptr ptr ptr ptr ptr ptr)
@ stdcall LookupSecurityDescriptorPartsW(ptr ptr ptr ptr ptr ptr ptr)
@ stdcall LsaAddAccountRights(ptr ptr ptr long)
@@ -681,17 +681,17 @@
@ stdcall RegReplaceKeyW(long wstr wstr wstr)
@ stdcall -import RegRestoreKeyA(long str long)
@ stdcall -import RegRestoreKeyW(long wstr long)
-@ stdcall RegSaveKeyA(long ptr ptr)
+@ stdcall RegSaveKeyA(long str ptr)
@ stdcall -import RegSaveKeyExA(long str ptr long)
@ stdcall -import RegSaveKeyExW(long wstr ptr long)
-@ stdcall RegSaveKeyW(long ptr ptr)
+@ stdcall RegSaveKeyW(long wstr ptr)
@ stdcall -import RegSetKeySecurity(long long ptr)
@ stdcall -import RegSetKeyValueA(long str str long ptr long)
@ stdcall -import RegSetKeyValueW(long wstr wstr long ptr long)
-@ stdcall RegSetValueA(long str long ptr long)
+@ stdcall RegSetValueA(long str long str long)
@ stdcall -import RegSetValueExA(long str long long ptr long)
@ stdcall -import RegSetValueExW(long wstr long long ptr long)
-@ stdcall RegSetValueW(long wstr long ptr long)
+@ stdcall RegSetValueW(long wstr long wstr long)
@ stdcall -import RegUnLoadKeyA(long str)
@ stdcall -import RegUnLoadKeyW(long wstr)
@ stdcall RegisterEventSourceA(str str)
diff --git a/dlls/api-ms-win-core-registry-l2-1-0/api-ms-win-core-registry-l2-1-0.spec b/dlls/api-ms-win-core-registry-l2-1-0/api-ms-win-core-registry-l2-1-0.spec
index 6d63dd997ff..17cd6e79311 100644
--- a/dlls/api-ms-win-core-registry-l2-1-0/api-ms-win-core-registry-l2-1-0.spec
+++ b/dlls/api-ms-win-core-registry-l2-1-0/api-ms-win-core-registry-l2-1-0.spec
@@ -25,9 +25,9 @@
@ stdcall RegQueryValueW(long wstr ptr ptr) advapi32.RegQueryValueW
@ stdcall RegReplaceKeyA(long str str str) advapi32.RegReplaceKeyA
@ stdcall RegReplaceKeyW(long wstr wstr wstr) advapi32.RegReplaceKeyW
-@ stdcall RegSaveKeyA(long ptr ptr) advapi32.RegSaveKeyA
-@ stdcall RegSaveKeyW(long ptr ptr) advapi32.RegSaveKeyW
+@ stdcall RegSaveKeyA(long str ptr) advapi32.RegSaveKeyA
+@ stdcall RegSaveKeyW(long wstr ptr) advapi32.RegSaveKeyW
@ stdcall RegSetKeyValueA(long str str long ptr long) advapi32.RegSetKeyValueA
@ stdcall RegSetKeyValueW(long wstr wstr long ptr long) advapi32.RegSetKeyValueW
-@ stdcall RegSetValueA(long str long ptr long) advapi32.RegSetValueA
-@ stdcall RegSetValueW(long wstr long ptr long) advapi32.RegSetValueW
+@ stdcall RegSetValueA(long str long str long) advapi32.RegSetValueA
+@ stdcall RegSetValueW(long wstr long wstr long) advapi32.RegSetValueW
diff --git a/dlls/api-ms-win-core-registry-l2-2-0/api-ms-win-core-registry-l2-2-0.spec b/dlls/api-ms-win-core-registry-l2-2-0/api-ms-win-core-registry-l2-2-0.spec
index 6d9ae1f4048..7710da384c5 100644
--- a/dlls/api-ms-win-core-registry-l2-2-0/api-ms-win-core-registry-l2-2-0.spec
+++ b/dlls/api-ms-win-core-registry-l2-2-0/api-ms-win-core-registry-l2-2-0.spec
@@ -23,7 +23,7 @@
@ stdcall RegQueryValueW(long wstr ptr ptr) advapi32.RegQueryValueW
@ stdcall RegReplaceKeyA(long str str str) advapi32.RegReplaceKeyA
@ stdcall RegReplaceKeyW(long wstr wstr wstr) advapi32.RegReplaceKeyW
-@ stdcall RegSaveKeyA(long ptr ptr) advapi32.RegSaveKeyA
-@ stdcall RegSaveKeyW(long ptr ptr) advapi32.RegSaveKeyW
-@ stdcall RegSetValueA(long str long ptr long) advapi32.RegSetValueA
-@ stdcall RegSetValueW(long wstr long ptr long) advapi32.RegSetValueW
+@ stdcall RegSaveKeyA(long str ptr) advapi32.RegSaveKeyA
+@ stdcall RegSaveKeyW(long wstr ptr) advapi32.RegSaveKeyW
+@ stdcall RegSetValueA(long str long str long) advapi32.RegSetValueA
+@ stdcall RegSetValueW(long wstr long wstr long) advapi32.RegSetValueW
diff --git a/dlls/api-ms-win-security-lsalookup-l2-1-0/api-ms-win-security-lsalookup-l2-1-0.spec b/dlls/api-ms-win-security-lsalookup-l2-1-0/api-ms-win-security-lsalookup-l2-1-0.spec
index 25b293939df..c1c3cd8e2aa 100644
--- a/dlls/api-ms-win-security-lsalookup-l2-1-0/api-ms-win-security-lsalookup-l2-1-0.spec
+++ b/dlls/api-ms-win-security-lsalookup-l2-1-0/api-ms-win-security-lsalookup-l2-1-0.spec
@@ -1,6 +1,6 @@
@ stdcall LookupAccountNameW(wstr wstr ptr ptr ptr ptr ptr) advapi32.LookupAccountNameW
-@ stdcall LookupAccountSidW(ptr ptr ptr ptr ptr ptr ptr) advapi32.LookupAccountSidW
+@ stdcall LookupAccountSidW(wstr ptr ptr ptr ptr ptr ptr) advapi32.LookupAccountSidW
@ stdcall LookupPrivilegeDisplayNameW(wstr wstr wstr ptr ptr) advapi32.LookupPrivilegeDisplayNameW
@ stdcall LookupPrivilegeNameW(wstr ptr ptr ptr) advapi32.LookupPrivilegeNameW
-@ stdcall LookupPrivilegeValueW(ptr ptr ptr) advapi32.LookupPrivilegeValueW
+@ stdcall LookupPrivilegeValueW(wstr wstr ptr) advapi32.LookupPrivilegeValueW
@ stdcall LsaEnumerateTrustedDomains(ptr ptr ptr long ptr) advapi32.LsaEnumerateTrustedDomains
diff --git a/dlls/api-ms-win-security-lsalookup-l2-1-1/api-ms-win-security-lsalookup-l2-1-1.spec b/dlls/api-ms-win-security-lsalookup-l2-1-1/api-ms-win-security-lsalookup-l2-1-1.spec
index 1a0ed04ace4..c06b1435333 100644
--- a/dlls/api-ms-win-security-lsalookup-l2-1-1/api-ms-win-security-lsalookup-l2-1-1.spec
+++ b/dlls/api-ms-win-security-lsalookup-l2-1-1/api-ms-win-security-lsalookup-l2-1-1.spec
@@ -1,7 +1,7 @@
@ stdcall LookupAccountNameW(wstr wstr ptr ptr ptr ptr ptr) advapi32.LookupAccountNameW
-@ stdcall LookupAccountSidW(ptr ptr ptr ptr ptr ptr ptr) advapi32.LookupAccountSidW
+@ stdcall LookupAccountSidW(wstr ptr ptr ptr ptr ptr ptr) advapi32.LookupAccountSidW
@ stdcall LookupPrivilegeDisplayNameW(wstr wstr wstr ptr ptr) advapi32.LookupPrivilegeDisplayNameW
@ stdcall LookupPrivilegeNameW(wstr ptr ptr ptr) advapi32.LookupPrivilegeNameW
-@ stdcall LookupPrivilegeValueW(ptr ptr ptr) advapi32.LookupPrivilegeValueW
+@ stdcall LookupPrivilegeValueW(wstr wstr ptr) advapi32.LookupPrivilegeValueW
@ stdcall LsaEnumerateTrustedDomains(ptr ptr ptr long ptr) advapi32.LsaEnumerateTrustedDomains
@ stub LsaManageSidNameMapping
--
2.25.1
1
0
Binary packages for various distributions will be available from:
https://www.winehq.org/download
Summary since last release
* Rebased to current wine 7.0-rc6 (555 patches are applied to wine vanilla)
Upstreamed (Either directly from staging or fixed with a similar patch).
* None
Added:
* None
Updated:
* nvcuda-CUDA_Support
Where can you help
* Run Steam/Battle.net/GOG/UPlay/Epic
* Test your favorite game.
* Test your favorite applications.
* Improve staging patches and get them accepted upstream.
As always, if you find a bug, please report it via
https://bugs.winehq.org
Best Regards
Alistair.
1
0
[PATCH vkd3d 1/5] tests: Separate the compile_shader function from the shader_test parser.
by Zebediah Figura Jan. 14, 2022
by Zebediah Figura Jan. 14, 2022
Jan. 14, 2022
In essence, the goal is to separate the d3d12 backend. Just separate the
compiler first, though, to make the diff easier to read.
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
Members of this patch series conflict with other in-flight patches...
Makefile.am | 42 +-
include/private/vkd3d_test.h | 19 +-
...{shader_runner_d3d12.c => shader_runner.c} | 31 +-
tests/shader_runner.h | 29 +
tests/shader_runner_d3d12.c | 847 +-----------------
5 files changed, 98 insertions(+), 870 deletions(-)
copy tests/{shader_runner_d3d12.c => shader_runner.c} (97%)
create mode 100644 tests/shader_runner.h
diff --git a/Makefile.am b/Makefile.am
index 20fee06d0..e6d20e700 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -50,9 +50,6 @@ vkd3d_cross_tests = \
tests/d3d12_invalid_usage \
tests/hlsl_d3d12
-vkd3d_shader_runners = \
- tests/shader_runner_d3d12
-
vkd3d_shader_tests = \
tests/abs.shader_test \
tests/cast-to-float.shader_test \
@@ -113,7 +110,9 @@ vkd3d_shader_tests = \
vkd3d_test_headers = \
tests/d3d12_crosstest.h \
- tests/d3d12_test_utils.h
+ tests/d3d12_test_utils.h \
+ tests/shader_runner.h \
+ tests/utils.h
vkd3d_demos = \
demos/vkd3d-gears \
@@ -273,15 +272,18 @@ AM_DEFAULT_SOURCE_EXT = .c
TEST_EXTENSIONS = .shader_test
if BUILD_TESTS
-check_PROGRAMS = $(vkd3d_tests) $(vkd3d_cross_tests) $(vkd3d_shader_runners)
+check_PROGRAMS = $(vkd3d_tests) $(vkd3d_cross_tests) tests/shader_runner
TESTS = $(vkd3d_tests) $(vkd3d_cross_tests) $(vkd3d_shader_tests)
tests_d3d12_LDADD = $(LDADD) @PTHREAD_LIBS@ @VULKAN_LIBS@
tests_d3d12_invalid_usage_LDADD = $(LDADD) @VULKAN_LIBS@
tests_hlsl_d3d12_LDADD = $(LDADD) @VULKAN_LIBS@
-tests_shader_runner_d3d12_LDADD = $(LDADD) @VULKAN_LIBS@
+tests_shader_runner_LDADD = $(LDADD) @VULKAN_LIBS@
+tests_shader_runner_SOURCES = \
+ tests/shader_runner.c \
+ tests/shader_runner_d3d12.c
tests_vkd3d_api_LDADD = libvkd3d.la @VULKAN_LIBS@
tests_vkd3d_shader_api_LDADD = libvkd3d-shader.la
-SHADER_TEST_LOG_COMPILER = tests/shader_runner_d3d12
+SHADER_TEST_LOG_COMPILER = tests/shader_runner
XFAIL_TESTS = \
tests/cast-to-float.shader_test \
tests/cast-to-half.shader_test \
@@ -388,14 +390,17 @@ CROSS_CPPFLAGS = -I$(srcdir)/include -I$(srcdir)/include/private -I$(builddir)/i
CROSS_CFLAGS = -g -O2 -Wall -municode ${CROSS_CPPFLAGS}
EXTRA_DIST += $(cross_implibs:=.cross32.def) $(cross_implibs:=.cross64.def)
+shader_runner_cross_sources = \
+ $(srcdir)/tests/shader_runner.c \
+ $(srcdir)/tests/shader_runner_d3d12.c
+
if HAVE_CROSSTARGET32
CROSS32_CC = @CROSSCC32@
CROSS32_DLLTOOL = @CROSSTARGET32(a)-dlltool
CROSS32_IMPLIBS = $(cross_implibs:=.cross32.a)
CROSS32_EXEFILES = $(vkd3d_cross_tests:=.cross32.exe) \
- $(vkd3d_demos:demos/vkd3d-%=demos/%.cross32.exe) \
- $(vkd3d_shader_runners:=.cross32.exe)
-CROSS32_FILES = $(CROSS32_IMPLIBS) $(CROSS32_EXEFILES)
+ $(vkd3d_demos:demos/vkd3d-%=demos/%.cross32.exe)
+CROSS32_FILES = $(CROSS32_IMPLIBS) $(CROSS32_EXEFILES) tests/shader_runner.cross32.exe
CLEANFILES += $(CROSS32_FILES)
crosstest32: $(CROSS32_FILES)
@@ -411,6 +416,12 @@ $(CROSS32_EXEFILES): %.cross32.exe: %.c $(CROSS32_IMPLIBS) $(widl_headers)
$(AM_V_CCLD)depbase=`echo $@ | $(SED) 's![^/]*$$!$(DEPDIR)/&!;s!\.exe$$!!'`; \
$(CROSS32_CC) $(CROSS_CFLAGS) -MT $@ -MD -MP -MF $$depbase.Tpo -o $@ $< $(CROSS32_IMPLIBS) -ldxgi -lgdi32 -ld3dcompiler_47 && \
$(am__mv) $$depbase.Tpo $$depbase.Po
+
+tests/shader_runner.cross32.exe: $(shader_runner_cross_sources) $(CROSS32_IMPLIBS) $(widl_headers)
+ $(AM_V_CCLD)depbase=`echo $@ | sed 's![^/]*$$!$(DEPDIR)/&!;s!\.exe$$!!'`; \
+ $(CROSS32_CC) $(CROSS_CFLAGS) -MT $@ -MD -MP -MF $$depbase.Tpo -o $@ $(shader_runner_cross_sources) $(CROSS32_IMPLIBS) -ldxgi -lgdi32 -ld3dcompiler_47 && \
+ $(am__mv) $$depbase.Tpo $$depbase.Po
+
else
crosstest32:
endif
@@ -420,9 +431,8 @@ CROSS64_CC = @CROSSCC64@
CROSS64_DLLTOOL = @CROSSTARGET64(a)-dlltool
CROSS64_IMPLIBS = $(cross_implibs:=.cross64.a)
CROSS64_EXEFILES = $(vkd3d_cross_tests:=.cross64.exe) \
- $(vkd3d_demos:demos/vkd3d-%=demos/%.cross64.exe) \
- $(vkd3d_shader_runners:=.cross64.exe)
-CROSS64_FILES = $(CROSS64_IMPLIBS) $(CROSS64_EXEFILES)
+ $(vkd3d_demos:demos/vkd3d-%=demos/%.cross64.exe)
+CROSS64_FILES = $(CROSS64_IMPLIBS) $(CROSS64_EXEFILES) tests/shader_runner.cross64.exe
CLEANFILES += $(CROSS64_FILES)
crosstest64: $(CROSS64_FILES)
@@ -438,6 +448,12 @@ $(CROSS64_EXEFILES): %.cross64.exe: %.c $(CROSS64_IMPLIBS) $(widl_headers)
$(AM_V_CCLD)depbase=`echo $@ | sed 's![^/]*$$!$(DEPDIR)/&!;s!\.exe$$!!'`; \
$(CROSS64_CC) $(CROSS_CFLAGS) -MT $@ -MD -MP -MF $$depbase.Tpo -o $@ $< $(CROSS64_IMPLIBS) -ldxgi -lgdi32 -ld3dcompiler_47 && \
$(am__mv) $$depbase.Tpo $$depbase.Po
+
+tests/shader_runner.cross64.exe: $(shader_runner_cross_sources) $(CROSS64_IMPLIBS) $(widl_headers)
+ $(AM_V_CCLD)depbase=`echo $@ | sed 's![^/]*$$!$(DEPDIR)/&!;s!\.exe$$!!'`; \
+ $(CROSS64_CC) $(CROSS_CFLAGS) -MT $@ -MD -MP -MF $$depbase.Tpo -o $@ $(shader_runner_cross_sources) $(CROSS64_IMPLIBS) -ldxgi -lgdi32 -ld3dcompiler_47 && \
+ $(am__mv) $$depbase.Tpo $$depbase.Po
+
else
crosstest64:
endif
diff --git a/include/private/vkd3d_test.h b/include/private/vkd3d_test.h
index 6b8763dde..0cc7fe4f3 100644
--- a/include/private/vkd3d_test.h
+++ b/include/private/vkd3d_test.h
@@ -28,16 +28,15 @@
#include <stdlib.h>
#include <string.h>
-static void vkd3d_test_main(int argc, char **argv);
-static const char *vkd3d_test_name;
-static const char *vkd3d_test_platform = "other";
+extern const char *vkd3d_test_name;
+extern const char *vkd3d_test_platform;
static void vkd3d_test_start_todo(bool is_todo);
static int vkd3d_test_loop_todo(void);
static void vkd3d_test_end_todo(void);
#define START_TEST(name) \
- static const char *vkd3d_test_name = #name; \
+ const char *vkd3d_test_name = #name; \
static void vkd3d_test_main(int argc, char **argv)
/*
@@ -100,7 +99,7 @@ static void vkd3d_test_end_todo(void);
#define todo todo_if(true)
-static struct
+struct vkd3d_test_state
{
LONG success_count;
LONG failure_count;
@@ -120,7 +119,8 @@ static struct
const char *test_name_filter;
char context[1024];
-} vkd3d_test_state;
+};
+extern struct vkd3d_test_state vkd3d_test_state;
static bool
vkd3d_test_platform_is_windows(void)
@@ -253,6 +253,12 @@ vkd3d_test_debug(const char *fmt, ...)
printf("%s\n", buffer);
}
+#ifndef VKD3D_TEST_NO_DEFS
+const char *vkd3d_test_platform = "other";
+struct vkd3d_test_state vkd3d_test_state;
+
+static void vkd3d_test_main(int argc, char **argv);
+
int main(int argc, char **argv)
{
const char *test_filter = getenv("VKD3D_TEST_FILTER");
@@ -339,6 +345,7 @@ int wmain(int argc, WCHAR **wargv)
return ret;
}
#endif /* _WIN32 */
+#endif /* VKD3D_TEST_NO_DEFS */
typedef void (*vkd3d_test_pfn)(void);
diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner.c
similarity index 97%
copy from tests/shader_runner_d3d12.c
copy to tests/shader_runner.c
index 47f419b96..df4344881 100644
--- a/tests/shader_runner_d3d12.c
+++ b/tests/shader_runner.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 Zebediah Figura for CodeWeavers
+ * Copyright 2020-2021 Zebediah Figura for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -43,6 +43,7 @@
*/
#include "d3d12_crosstest.h"
+#include "shader_runner.h"
#include <errno.h>
static void VKD3D_NORETURN VKD3D_PRINTF_FUNC(1, 2) fatal_error(const char *format, ...)
@@ -117,6 +118,8 @@ struct texture
struct shader_context
{
+ const struct shader_runner_ops *ops;
+
struct test_context c;
ID3D10Blob *ps_code;
@@ -131,22 +134,6 @@ struct shader_context
size_t sampler_count;
};
-static ID3D10Blob *compile_shader(const char *source, const char *target)
-{
- ID3D10Blob *blob = NULL, *errors = NULL;
- HRESULT hr;
-
- hr = D3DCompile(source, strlen(source), NULL, NULL, NULL, "main", target, 0, 0, &blob, &errors);
- ok(hr == S_OK, "Failed to compile shader, hr %#x.\n", hr);
- if (errors)
- {
- if (vkd3d_test_state.debug_level)
- trace("%s\n", (char *)ID3D10Blob_GetBufferPointer(errors));
- ID3D10Blob_Release(errors);
- }
- return blob;
-}
-
static void free_texture(struct texture *texture)
{
ID3D12DescriptorHeap_Release(texture->heap);
@@ -603,7 +590,7 @@ static struct texture *get_texture(struct shader_context *context, unsigned int
return NULL;
}
-START_TEST(shader_runner_d3d12)
+void run_shader_tests(int argc, char **argv, const struct shader_runner_ops *ops)
{
static const struct test_context_desc desc =
{
@@ -649,6 +636,7 @@ START_TEST(shader_runner_d3d12)
}
memset(&context, 0, sizeof(context));
+ context.ops = ops;
init_test_context(&context.c, &desc);
for (;;)
@@ -668,7 +656,7 @@ START_TEST(shader_runner_d3d12)
break;
case STATE_SHADER_PIXEL:
- if (!(context.ps_code = compile_shader(shader_source, "ps_4_0")))
+ if (!(context.ps_code = context.ops->compile_shader(shader_source)))
return;
shader_source_len = 0;
break;
@@ -867,3 +855,8 @@ START_TEST(shader_runner_d3d12)
fclose(f);
}
+
+START_TEST(shader_runner)
+{
+ run_shader_tests_d3d12(argc, argv);
+}
diff --git a/tests/shader_runner.h b/tests/shader_runner.h
new file mode 100644
index 000000000..5178c6544
--- /dev/null
+++ b/tests/shader_runner.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2021 Zebediah Figura 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
+ */
+
+#include "vkd3d_windows.h"
+#include "vkd3d_d3dcommon.h"
+
+struct shader_runner_ops
+{
+ ID3D10Blob *(*compile_shader)(const char *source);
+};
+
+void run_shader_tests(int argc, char **argv, const struct shader_runner_ops *ops);
+
+void run_shader_tests_d3d12(int argc, char **argv);
diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner_d3d12.c
index 47f419b96..6246c8701 100644
--- a/tests/shader_runner_d3d12.c
+++ b/tests/shader_runner_d3d12.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 Zebediah Figura for CodeWeavers
+ * Copyright 2020-2021 Zebediah Figura for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -16,127 +16,21 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-/*
- * This application contains code derived from piglit, the license for which
- * follows:
- *
- * Copyright © 2010 Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#include "d3d12_crosstest.h"
-#include <errno.h>
-
-static void VKD3D_NORETURN VKD3D_PRINTF_FUNC(1, 2) fatal_error(const char *format, ...)
-{
- va_list args;
-
- va_start(args, format);
- vfprintf(stderr, format, args);
- va_end(args);
- exit(1);
-}
-
-static bool vkd3d_array_reserve(void **elements, size_t *capacity, size_t element_count, size_t element_size)
-{
- size_t new_capacity, max_capacity;
- void *new_elements;
-
- if (element_count <= *capacity)
- return true;
-
- max_capacity = ~(size_t)0 / element_size;
- if (max_capacity < element_count)
- return false;
-
- new_capacity = max(*capacity, 4);
- while (new_capacity < element_count && new_capacity <= max_capacity / 2)
- new_capacity *= 2;
-
- if (new_capacity < element_count)
- new_capacity = element_count;
-
- if (!(new_elements = realloc(*elements, new_capacity * element_size)))
- return false;
-
- *elements = new_elements;
- *capacity = new_capacity;
-
- return true;
-}
-
-enum texture_data_type
-{
- TEXTURE_DATA_FLOAT,
- TEXTURE_DATA_SINT,
- TEXTURE_DATA_UINT,
-};
+#define COBJMACROS
+#define CONST_VTABLE
+#define VKD3D_TEST_NO_DEFS
+#include "vkd3d_windows.h"
+#include "vkd3d_d3dcommon.h"
+#include "vkd3d_d3dcompiler.h"
+#include "vkd3d_test.h"
+#include "shader_runner.h"
-struct sampler
-{
- unsigned int slot;
-
- D3D12_FILTER filter;
- D3D12_TEXTURE_ADDRESS_MODE u_address, v_address, w_address;
-};
-
-struct texture
-{
- unsigned int slot;
-
- DXGI_FORMAT format;
- enum texture_data_type data_type;
- unsigned int texel_size;
- unsigned int width, height;
- uint8_t *data;
- size_t data_size, data_capacity;
-
- D3D12_DESCRIPTOR_RANGE descriptor_range;
- ID3D12DescriptorHeap *heap;
- ID3D12Resource *resource;
- unsigned int root_index;
-};
-
-struct shader_context
-{
- struct test_context c;
-
- ID3D10Blob *ps_code;
-
- uint32_t *uniforms;
- size_t uniform_count;
-
- struct texture *textures;
- size_t texture_count;
-
- struct sampler *samplers;
- size_t sampler_count;
-};
-
-static ID3D10Blob *compile_shader(const char *source, const char *target)
+static ID3D10Blob *d3d12_runner_compile_shader(const char *source)
{
ID3D10Blob *blob = NULL, *errors = NULL;
HRESULT hr;
- hr = D3DCompile(source, strlen(source), NULL, NULL, NULL, "main", target, 0, 0, &blob, &errors);
+ hr = D3DCompile(source, strlen(source), NULL, NULL, NULL, "main", "ps_4_0", 0, 0, &blob, &errors);
ok(hr == S_OK, "Failed to compile shader, hr %#x.\n", hr);
if (errors)
{
@@ -147,723 +41,12 @@ static ID3D10Blob *compile_shader(const char *source, const char *target)
return blob;
}
-static void free_texture(struct texture *texture)
+static const struct shader_runner_ops d3d12_runner_ops =
{
- ID3D12DescriptorHeap_Release(texture->heap);
- ID3D12Resource_Release(texture->resource);
- free(texture->data);
- memset(texture, 0, sizeof(*texture));
-}
-
-enum parse_state
-{
- STATE_NONE,
- STATE_PREPROC,
- STATE_PREPROC_INVALID,
- STATE_SAMPLER,
- STATE_SHADER_INVALID_PIXEL,
- STATE_SHADER_PIXEL,
- STATE_TEXTURE,
- STATE_TEST,
+ .compile_shader = d3d12_runner_compile_shader,
};
-static bool match_string(const char *line, const char *token, const char **const rest)
-{
- size_t len = strlen(token);
-
- if (strncmp(line, token, len) || !isspace(line[len]))
- return false;
- if (rest)
- {
- *rest = line + len;
- while (isspace(**rest))
- ++*rest;
- }
- return true;
-}
-
-static void parse_texture_format(struct texture *texture, const char *line)
-{
- static const struct
- {
- const char *string;
- enum texture_data_type data_type;
- unsigned int texel_size;
- DXGI_FORMAT format;
- }
- formats[] =
- {
- {"r32g32b32a32 float", TEXTURE_DATA_FLOAT, 16, DXGI_FORMAT_R32G32B32A32_FLOAT},
- {"r32g32 uint", TEXTURE_DATA_UINT, 8, DXGI_FORMAT_R32G32_UINT},
- {"r32 float", TEXTURE_DATA_FLOAT, 4, DXGI_FORMAT_R32_FLOAT},
- {"r32 sint", TEXTURE_DATA_SINT, 4, DXGI_FORMAT_R32_SINT},
- };
- unsigned int i;
-
- for (i = 0; i < ARRAY_SIZE(formats); ++i)
- {
- if (match_string(line, formats[i].string, &line))
- {
- texture->format = formats[i].format;
- texture->data_type = formats[i].data_type;
- texture->texel_size = formats[i].texel_size;
- return;
- }
- }
-
- fatal_error("Unknown format '%s'.\n", line);
-}
-
-static D3D12_TEXTURE_ADDRESS_MODE parse_sampler_address_mode(const char *line, const char **rest)
-{
- if (match_string(line, "border", rest))
- return D3D12_TEXTURE_ADDRESS_MODE_BORDER;
- if (match_string(line, "clamp", rest))
- return D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
- if (match_string(line, "mirror_once", rest))
- return D3D12_TEXTURE_ADDRESS_MODE_MIRROR_ONCE;
- if (match_string(line, "mirror", rest))
- return D3D12_TEXTURE_ADDRESS_MODE_MIRROR;
- if (match_string(line, "wrap", rest))
- return D3D12_TEXTURE_ADDRESS_MODE_WRAP;
-
- fatal_error("Unknown sampler address mode '%s'.\n", line);
-}
-
-static void parse_sampler_directive(struct sampler *sampler, const char *line)
-{
- if (match_string(line, "address", &line))
- {
- sampler->u_address = parse_sampler_address_mode(line, &line);
- sampler->v_address = parse_sampler_address_mode(line, &line);
- sampler->w_address = parse_sampler_address_mode(line, &line);
- }
- else if (match_string(line, "filter", &line))
- {
- static const struct
- {
- const char *string;
- D3D12_FILTER filter;
- }
- filters[] =
- {
- {"point point point", D3D12_FILTER_MIN_MAG_MIP_POINT},
- {"point point linear", D3D12_FILTER_MIN_MAG_POINT_MIP_LINEAR},
- {"point linear point", D3D12_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT},
- {"point linear linear", D3D12_FILTER_MIN_POINT_MAG_MIP_LINEAR},
- {"linear point point", D3D12_FILTER_MIN_LINEAR_MAG_MIP_POINT},
- {"linear point linear", D3D12_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR},
- {"linear linear point", D3D12_FILTER_MIN_MAG_LINEAR_MIP_POINT},
- {"linear linear linear", D3D12_FILTER_MIN_MAG_MIP_LINEAR},
- };
- unsigned int i;
-
- for (i = 0; i < ARRAY_SIZE(filters); ++i)
- {
- if (match_string(line, filters[i].string, &line))
- {
- sampler->filter = filters[i].filter;
- return;
- }
- }
-
- fatal_error("Unknown sampler filter '%s'.\n", line);
- }
- else
- {
- fatal_error("Unknown sampler directive '%s'.\n", line);
- }
-}
-
-static void parse_texture_directive(struct texture *texture, const char *line)
-{
- int ret;
-
- if (match_string(line, "format", &line))
- {
- parse_texture_format(texture, line);
- }
- else if (match_string(line, "size", &line))
- {
- ret = sscanf(line, "( %u , %u )", &texture->width, &texture->height);
- if (ret < 2)
- fatal_error("Malformed texture size '%s'.\n", line);
- }
- else
- {
- union
- {
- float f;
- int32_t i;
- uint32_t u;
- } u;
- char *rest;
-
- u.u = 0;
-
- for (;;)
- {
- switch (texture->data_type)
- {
- case TEXTURE_DATA_FLOAT:
- u.f = strtof(line, &rest);
- break;
-
- case TEXTURE_DATA_SINT:
- u.i = strtol(line, &rest, 10);
- break;
-
- case TEXTURE_DATA_UINT:
- u.u = strtoul(line, &rest, 10);
- break;
- }
-
- if (rest == line)
- break;
-
- vkd3d_array_reserve((void **)&texture->data, &texture->data_capacity, texture->data_size + sizeof(u), 1);
- memcpy(texture->data + texture->data_size, &u, sizeof(u));
- texture->data_size += sizeof(u);
- line = rest;
- }
- }
-}
-
-static void parse_test_directive(struct shader_context *context, const char *line)
-{
- if (match_string(line, "draw quad", &line))
- {
- D3D12_SHADER_BYTECODE ps
- = {ID3D10Blob_GetBufferPointer(context->ps_code), ID3D10Blob_GetBufferSize(context->ps_code)};
- ID3D12GraphicsCommandList *command_list = context->c.list;
- D3D12_ROOT_SIGNATURE_DESC root_signature_desc = {0};
- D3D12_ROOT_PARAMETER root_params[3], *root_param;
- D3D12_STATIC_SAMPLER_DESC static_samplers[1];
- static const float clear_color[4];
- unsigned int uniform_index;
- ID3D12PipelineState *pso;
- HRESULT hr;
- size_t i;
-
- root_signature_desc.NumParameters = 0;
- root_signature_desc.pParameters = root_params;
- root_signature_desc.NumStaticSamplers = 0;
- root_signature_desc.pStaticSamplers = static_samplers;
-
- if (context->uniform_count)
- {
- uniform_index = root_signature_desc.NumParameters++;
- root_param = &root_params[uniform_index];
- root_param->ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;
- root_param->Constants.ShaderRegister = 0;
- root_param->Constants.RegisterSpace = 0;
- root_param->Constants.Num32BitValues = context->uniform_count;
- root_param->ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
- }
-
- for (i = 0; i < context->texture_count; ++i)
- {
- struct texture *texture = &context->textures[i];
- D3D12_DESCRIPTOR_RANGE *range = &texture->descriptor_range;
- D3D12_SUBRESOURCE_DATA resource_data;
-
- texture->root_index = root_signature_desc.NumParameters++;
- root_param = &root_params[texture->root_index];
- root_param->ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
- root_param->DescriptorTable.NumDescriptorRanges = 1;
- root_param->DescriptorTable.pDescriptorRanges = range;
- root_param->ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
-
- range->RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
- range->NumDescriptors = 1;
- range->BaseShaderRegister = texture->slot;
- range->RegisterSpace = 0;
- range->OffsetInDescriptorsFromTableStart = 0;
-
- if (!texture->resource)
- {
- texture->heap = create_gpu_descriptor_heap(context->c.device,
- D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, 1);
- texture->resource = create_default_texture(context->c.device, texture->width, texture->height,
- texture->format, 0, D3D12_RESOURCE_STATE_COPY_DEST);
- resource_data.pData = texture->data;
- resource_data.SlicePitch = resource_data.RowPitch = texture->width * texture->texel_size;
- upload_texture_data(texture->resource, &resource_data, 1, context->c.queue, command_list);
- reset_command_list(command_list, context->c.allocator);
- transition_resource_state(command_list, texture->resource, D3D12_RESOURCE_STATE_COPY_DEST,
- D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE | D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
- ID3D12Device_CreateShaderResourceView(context->c.device, texture->resource,
- NULL, get_cpu_descriptor_handle(&context->c, texture->heap, 0));
- }
- }
-
- assert(root_signature_desc.NumParameters <= ARRAY_SIZE(root_params));
-
- for (i = 0; i < context->sampler_count; ++i)
- {
- D3D12_STATIC_SAMPLER_DESC *sampler_desc = &static_samplers[root_signature_desc.NumStaticSamplers++];
- const struct sampler *sampler = &context->samplers[i];
-
- memset(sampler_desc, 0, sizeof(*sampler_desc));
- sampler_desc->Filter = sampler->filter;
- sampler_desc->AddressU = sampler->u_address;
- sampler_desc->AddressV = sampler->v_address;
- sampler_desc->AddressW = sampler->w_address;
- sampler_desc->ShaderRegister = sampler->slot;
- sampler_desc->RegisterSpace = 0;
- sampler_desc->ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
- }
-
- if (context->c.root_signature)
- ID3D12RootSignature_Release(context->c.root_signature);
- hr = create_root_signature(context->c.device, &root_signature_desc, &context->c.root_signature);
- ok(hr == S_OK, "Failed to create root signature, hr %#x.\n", hr);
-
- pso = create_pipeline_state(context->c.device, context->c.root_signature, context->c.render_target_desc.Format,
- NULL, &ps, NULL);
- if (!pso)
- return;
- vkd3d_array_reserve((void **)&context->c.pso, &context->c.pso_capacity, context->c.pso_count + 1, sizeof(*context->c.pso));
- context->c.pso[context->c.pso_count++] = pso;
-
- ID3D12GraphicsCommandList_SetGraphicsRootSignature(command_list, context->c.root_signature);
- if (context->uniform_count)
- ID3D12GraphicsCommandList_SetGraphicsRoot32BitConstants(command_list, uniform_index,
- context->uniform_count, context->uniforms, 0);
- for (i = 0; i < context->texture_count; ++i)
- ID3D12GraphicsCommandList_SetGraphicsRootDescriptorTable(command_list, context->textures[i].root_index,
- get_gpu_descriptor_handle(&context->c, context->textures[i].heap, 0));
-
- ID3D12GraphicsCommandList_OMSetRenderTargets(command_list, 1, &context->c.rtv, false, NULL);
- ID3D12GraphicsCommandList_RSSetScissorRects(command_list, 1, &context->c.scissor_rect);
- ID3D12GraphicsCommandList_RSSetViewports(command_list, 1, &context->c.viewport);
- ID3D12GraphicsCommandList_IASetPrimitiveTopology(command_list, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
- ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context->c.rtv, clear_color, 0, NULL);
- ID3D12GraphicsCommandList_SetPipelineState(command_list, pso);
- ID3D12GraphicsCommandList_DrawInstanced(command_list, 3, 1, 0, 0);
- transition_resource_state(command_list, context->c.render_target,
- D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
- }
- else if (match_string(line, "probe all rgba", &line))
- {
- unsigned int ulps;
- struct vec4 v;
- int ret;
-
- ret = sscanf(line, "( %f , %f , %f , %f ) %u", &v.x, &v.y, &v.z, &v.w, &ulps);
- if (ret < 4)
- fatal_error("Malformed probe arguments '%s'.\n", line);
- if (ret < 5)
- ulps = 0;
- check_sub_resource_vec4(context->c.render_target, 0, context->c.queue, context->c.list, &v, ulps);
- reset_command_list(context->c.list, context->c.allocator);
- }
- else if (match_string(line, "probe rect rgba", &line))
- {
- unsigned int x, y, w, h, ulps;
- struct resource_readback rb;
- struct vec4 v;
- RECT rect;
- int ret;
-
- ret = sscanf(line, "( %u , %u , %u , %u ) ( %f , %f , %f , %f ) %u",
- &x, &y, &w, &h, &v.x, &v.y, &v.z, &v.w, &ulps);
- if (ret < 8)
- fatal_error("Malformed probe arguments '%s'.\n", line);
- if (ret < 9)
- ulps = 0;
-
- get_texture_readback_with_command_list(context->c.render_target, 0, &rb, context->c.queue, context->c.list);
- rect.left = x;
- rect.right = x + w;
- rect.top = y;
- rect.bottom = y + h;
- check_readback_data_vec4(&rb, &rect, &v, ulps);
- release_resource_readback(&rb);
- reset_command_list(context->c.list, context->c.allocator);
- }
- else if (match_string(line, "probe rgba", &line))
- {
- struct resource_readback rb;
- unsigned int x, y, ulps;
- struct vec4 v;
- RECT rect;
- int ret;
-
- ret = sscanf(line, "( %u , %u ) ( %f , %f , %f , %f ) %u", &x, &y, &v.x, &v.y, &v.z, &v.w, &ulps);
- if (ret < 6)
- fatal_error("Malformed probe arguments '%s'.\n", line);
- if (ret < 7)
- ulps = 0;
-
- get_texture_readback_with_command_list(context->c.render_target, 0, &rb, context->c.queue, context->c.list);
- rect.left = x;
- rect.right = x + 1;
- rect.top = y;
- rect.bottom = y + 1;
- check_readback_data_vec4(&rb, &rect, &v, ulps);
- release_resource_readback(&rb);
- reset_command_list(context->c.list, context->c.allocator);
- }
- else if (match_string(line, "uniform", &line))
- {
- unsigned int offset;
-
- if (!sscanf(line, "%u", &offset))
- fatal_error("Unknown uniform type '%s'.\n", line);
- line = strchr(line, ' ') + 1;
-
- if (match_string(line, "float4", &line))
- {
- struct vec4 v;
-
- if (sscanf(line, "%f %f %f %f", &v.x, &v.y, &v.z, &v.w) < 4)
- fatal_error("Malformed float4 constant '%s'.\n", line);
- if (offset + 4 > context->uniform_count)
- {
- context->uniform_count = offset + 4;
- context->uniforms = realloc(context->uniforms, context->uniform_count * sizeof(*context->uniforms));
- }
- memcpy(context->uniforms + offset, &v, sizeof(v));
- }
- else if (match_string(line, "float", &line))
- {
- float f;
-
- if (sscanf(line, "%f", &f) < 1)
- fatal_error("Malformed float constant '%s'.\n", line);
- if (offset + 1 > context->uniform_count)
- {
- context->uniform_count = offset + 1;
- context->uniforms = realloc(context->uniforms, context->uniform_count * sizeof(*context->uniforms));
- }
- memcpy(context->uniforms + offset, &f, sizeof(f));
- }
- else if (match_string(line, "int", &line))
- {
- int i;
-
- if (sscanf(line, "%i", &i) < 1)
- fatal_error("Malformed int constant '%s'.\n", line);
- if (offset + 1 > context->uniform_count)
- {
- context->uniform_count = offset + 1;
- context->uniforms = realloc(context->uniforms, context->uniform_count * sizeof(*context->uniforms));
- }
- memcpy(context->uniforms + offset, &i, sizeof(i));
- }
- else if (match_string(line, "uint", &line))
- {
- unsigned int u;
-
- if (sscanf(line, "%u", &u) < 1)
- fatal_error("Malformed uint constant '%s'.\n", line);
- if (offset + 1 > context->uniform_count)
- {
- context->uniform_count = offset + 1;
- context->uniforms = realloc(context->uniforms, context->uniform_count * sizeof(*context->uniforms));
- }
- memcpy(context->uniforms + offset, &u, sizeof(u));
- }
- }
- else
- {
- fatal_error("Unknown test directive '%s'.\n", line);
- }
-}
-
-static struct sampler *get_sampler(struct shader_context *context, unsigned int slot)
-{
- struct sampler *sampler;
- size_t i;
-
- for (i = 0; i < context->sampler_count; ++i)
- {
- sampler = &context->samplers[i];
-
- if (sampler->slot == slot)
- return sampler;
- }
-
- return NULL;
-}
-
-static struct texture *get_texture(struct shader_context *context, unsigned int slot)
-{
- struct texture *texture;
- size_t i;
-
- for (i = 0; i < context->texture_count; ++i)
- {
- texture = &context->textures[i];
- if (texture->slot == slot)
- return texture;
- }
-
- return NULL;
-}
-
-START_TEST(shader_runner_d3d12)
+void run_shader_tests_d3d12(int argc, char **argv)
{
- static const struct test_context_desc desc =
- {
- .rt_width = 640,
- .rt_height = 480,
- .no_root_signature = true,
- .rt_format = DXGI_FORMAT_R32G32B32A32_FLOAT,
- };
- size_t shader_source_size = 0, shader_source_len = 0;
- struct sampler *current_sampler = NULL;
- struct texture *current_texture = NULL;
- enum parse_state state = STATE_NONE;
- unsigned int i, line_number = 0;
- struct shader_context context;
- const char *filename = NULL;
- char *shader_source = NULL;
- char line[256];
- FILE *f;
-
- parse_args(argc, argv);
- enable_d3d12_debug_layer(argc, argv);
- init_adapter_info();
-
- for (i = 1; i < argc; ++i)
- {
- if (argv[i][0] != '-')
- {
- filename = argv[i];
- break;
- }
- }
-
- if (!filename)
- {
- fprintf(stderr, "Usage: %s [file]\n", argv[0]);
- return;
- }
-
- if (!(f = fopen(filename, "r")))
- {
- fatal_error("Unable to open '%s' for reading: %s\n", argv[1], strerror(errno));
- return;
- }
-
- memset(&context, 0, sizeof(context));
- init_test_context(&context.c, &desc);
-
- for (;;)
- {
- char *ret = fgets(line, sizeof(line), f);
-
- ++line_number;
-
- if (!ret || line[0] == '[')
- {
- switch (state)
- {
- case STATE_NONE:
- case STATE_SAMPLER:
- case STATE_TEST:
- case STATE_TEXTURE:
- break;
-
- case STATE_SHADER_PIXEL:
- if (!(context.ps_code = compile_shader(shader_source, "ps_4_0")))
- return;
- shader_source_len = 0;
- break;
-
- case STATE_SHADER_INVALID_PIXEL:
- {
- ID3D10Blob *blob = NULL, *errors = NULL;
- HRESULT hr;
-
- hr = D3DCompile(shader_source, strlen(shader_source), NULL,
- NULL, NULL, "main", "ps_4_0", 0, 0, &blob, &errors);
- ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
- ok(!blob, "Expected no compiled shader blob.\n");
- ok(!!errors, "Expected non-NULL error blob.\n");
- if (!errors)
- return;
-
- if (vkd3d_test_state.debug_level)
- trace("%s\n", (char *)ID3D10Blob_GetBufferPointer(errors));
- ID3D10Blob_Release(errors);
-
- shader_source_len = 0;
- break;
- }
-
- case STATE_PREPROC_INVALID:
- {
- ID3D10Blob *blob = NULL, *errors = NULL;
- HRESULT hr;
-
- hr = D3DPreprocess(shader_source, strlen(shader_source), NULL, NULL, NULL, &blob, &errors);
- ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
- ok(!blob, "Expected no compiled shader blob.\n");
- ok(!!errors, "Expected non-NULL error blob.\n");
-
- if (errors)
- {
- if (vkd3d_test_state.debug_level)
- trace("%s\n", (char *)ID3D10Blob_GetBufferPointer(errors));
- ID3D10Blob_Release(errors);
- }
-
- shader_source_len = 0;
- break;
- }
-
- case STATE_PREPROC:
- {
- ID3D10Blob *blob = NULL, *errors = NULL;
- SIZE_T size;
- HRESULT hr;
- char *text;
-
- hr = D3DPreprocess(shader_source, strlen(shader_source), NULL, NULL, NULL, &blob, &errors);
- ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
- if (hr == S_OK)
- {
- if (errors)
- {
- if (vkd3d_test_state.debug_level)
- trace("%s\n", (char *)ID3D10Blob_GetBufferPointer(errors));
- ID3D10Blob_Release(errors);
- }
-
- text = ID3D10Blob_GetBufferPointer(blob);
- size = ID3D10Blob_GetBufferSize(blob);
- ok(vkd3d_memmem(text, size, "pass", strlen("pass")),
- "'pass' not found in preprocessed shader.\n");
- ok(!vkd3d_memmem(text, size, "fail", strlen("fail")),
- "'fail' found in preprocessed shader.\n");
- ID3D10Blob_Release(blob);
- }
-
- shader_source_len = 0;
- break;
- }
- }
- }
-
- if (!ret)
- break;
-
- if (line[0] == '[')
- {
- unsigned int index;
-
- if (!strcmp(line, "[pixel shader]\n"))
- {
- state = STATE_SHADER_PIXEL;
-
- if (context.ps_code)
- ID3D10Blob_Release(context.ps_code);
- context.ps_code = NULL;
- }
- else if (!strcmp(line, "[pixel shader fail]\n"))
- {
- state = STATE_SHADER_INVALID_PIXEL;
- }
- else if (sscanf(line, "[sampler %u]\n", &index))
- {
- state = STATE_SAMPLER;
-
- if ((current_sampler = get_sampler(&context, index)))
- {
- memset(current_sampler, 0, sizeof(*current_sampler));
- }
- else
- {
- context.samplers = realloc(context.samplers,
- ++context.sampler_count * sizeof(*context.samplers));
- current_sampler = &context.samplers[context.sampler_count - 1];
- memset(current_sampler, 0, sizeof(*current_sampler));
- }
- current_sampler->slot = index;
- current_sampler->filter = D3D12_FILTER_MIN_MAG_MIP_POINT;
- current_sampler->u_address = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
- current_sampler->v_address = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
- current_sampler->w_address = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
- }
- else if (sscanf(line, "[texture %u]\n", &index))
- {
- state = STATE_TEXTURE;
-
- if ((current_texture = get_texture(&context, index)))
- {
- free_texture(current_texture);
- }
- else
- {
- context.textures = realloc(context.textures,
- ++context.texture_count * sizeof(*context.textures));
- current_texture = &context.textures[context.texture_count - 1];
- memset(current_texture, 0, sizeof(*current_texture));
- }
- current_texture->slot = index;
- current_texture->format = DXGI_FORMAT_R32G32B32A32_FLOAT;
- current_texture->data_type = TEXTURE_DATA_FLOAT;
- current_texture->texel_size = 16;
- }
- else if (!strcmp(line, "[test]\n"))
- {
- state = STATE_TEST;
- }
- else if (!strcmp(line, "[preproc]\n"))
- {
- state = STATE_PREPROC;
- }
- else if (!strcmp(line, "[preproc fail]\n"))
- {
- state = STATE_PREPROC_INVALID;
- }
-
- vkd3d_test_set_context("Section %.*s, line %u", strlen(line) - 1, line, line_number);
- }
- else if (line[0] != '%' && line[0] != '\n')
- {
- switch (state)
- {
- case STATE_NONE:
- fatal_error("Malformed line '%s'.\n", line);
- break;
-
- case STATE_PREPROC:
- case STATE_PREPROC_INVALID:
- case STATE_SHADER_INVALID_PIXEL:
- case STATE_SHADER_PIXEL:
- {
- size_t len = strlen(line);
-
- vkd3d_array_reserve((void **)&shader_source, &shader_source_size, shader_source_len + len + 1, 1);
- memcpy(shader_source + shader_source_len, line, len + 1);
- shader_source_len += len;
- break;
- }
-
- case STATE_SAMPLER:
- parse_sampler_directive(current_sampler, line);
- break;
-
- case STATE_TEXTURE:
- parse_texture_directive(current_texture, line);
- break;
-
- case STATE_TEST:
- parse_test_directive(&context, line);
- break;
- }
- }
- }
-
- if (context.ps_code)
- ID3D10Blob_Release(context.ps_code);
- for (i = 0; i < context.texture_count; ++i)
- free_texture(&context.textures[i]);
- destroy_test_context(&context.c);
-
- fclose(f);
+ run_shader_tests(argc, argv, &d3d12_runner_ops);
}
--
2.34.1
3
7
[PATCH vkd3d 1/2] vkd3d: Store the vkd3d format in resource objects.
by Conor McCarthy Jan. 14, 2022
by Conor McCarthy Jan. 14, 2022
Jan. 14, 2022
Resource formats are immutable and the format object is static data.
Storing it saves a function call and error check in many locations.
The current implementation for finding a format iterates over the
entire list of formats.
The format is checked for NULL during resource initialisation, so accessing
the format object is safe where buffers are excluded. In some cases the
format query effectively excluded buffers, so an explicit check is needed.
Signed-off-by: Conor McCarthy <cmccarthy(a)codeweavers.com>
---
libs/vkd3d/command.c | 72 ++++++++++----------------------------
libs/vkd3d/device.c | 4 +--
libs/vkd3d/resource.c | 35 +++++++++---------
libs/vkd3d/vkd3d_private.h | 4 ++-
4 files changed, 39 insertions(+), 76 deletions(-)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 3e252aee..5f107384 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -2116,17 +2116,10 @@ static void d3d12_command_list_transition_resource_to_initial_state(struct d3d12
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
const struct vkd3d_vulkan_info *vk_info = &list->device->vk_info;
VkPipelineStageFlags src_stage_mask, dst_stage_mask;
- const struct vkd3d_format *format;
VkImageMemoryBarrier barrier;
assert(d3d12_resource_is_texture(resource));
- if (!(format = vkd3d_format_from_d3d12_resource_desc(list->device, &resource->desc, 0)))
- {
- ERR("Resource %p has invalid format %#x.\n", resource, resource->desc.Format);
- return;
- }
-
barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
barrier.pNext = NULL;
@@ -2146,7 +2139,7 @@ static void d3d12_command_list_transition_resource_to_initial_state(struct d3d12
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
barrier.image = resource->u.vk_image;
- barrier.subresourceRange.aspectMask = format->vk_aspect_mask;
+ barrier.subresourceRange.aspectMask = resource->format->vk_aspect_mask;
barrier.subresourceRange.baseMipLevel = 0;
barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
barrier.subresourceRange.baseArrayLayer = 0;
@@ -3531,22 +3524,15 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyTextureRegion(ID3D12Graphic
else if (src->Type == D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX
&& dst->Type == D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX)
{
- assert(d3d12_resource_is_texture(dst_resource));
- assert(d3d12_resource_is_texture(src_resource));
-
- if (!(dst_format = vkd3d_format_from_d3d12_resource_desc(list->device,
- &dst_resource->desc, DXGI_FORMAT_UNKNOWN)))
- {
- WARN("Invalid format %#x.\n", dst_resource->desc.Format);
- return;
- }
- if (!(src_format = vkd3d_format_from_d3d12_resource_desc(list->device,
- &src_resource->desc, DXGI_FORMAT_UNKNOWN)))
+ if (!d3d12_resource_is_texture(dst_resource) || !d3d12_resource_is_texture(src_resource))
{
- WARN("Invalid format %#x.\n", src_resource->desc.Format);
+ WARN("Both dst and src must contain textures.\n");
return;
}
+ dst_format = dst_resource->format;
+ src_format = src_resource->format;
+
if ((dst_format->vk_aspect_mask & VK_IMAGE_ASPECT_DEPTH_BIT)
&& (dst_format->vk_aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT))
FIXME("Depth-stencil format %#x not fully supported yet.\n", dst_format->dxgi_format);
@@ -3580,7 +3566,6 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyResource(ID3D12GraphicsComm
{
struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList2(iface);
struct d3d12_resource *dst_resource, *src_resource;
- const struct vkd3d_format *src_format, *dst_format;
const struct vkd3d_vk_device_procs *vk_procs;
VkBufferCopy vk_buffer_copy;
VkImageCopy vk_image_copy;
@@ -3612,30 +3597,21 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyResource(ID3D12GraphicsComm
}
else
{
- if (!(dst_format = vkd3d_format_from_d3d12_resource_desc(list->device,
- &dst_resource->desc, DXGI_FORMAT_UNKNOWN)))
- {
- WARN("Invalid format %#x.\n", dst_resource->desc.Format);
- return;
- }
- if (!(src_format = vkd3d_format_from_d3d12_resource_desc(list->device,
- &src_resource->desc, DXGI_FORMAT_UNKNOWN)))
+ if (!d3d12_resource_is_texture(dst_resource) || !d3d12_resource_is_texture(src_resource))
{
- WARN("Invalid format %#x.\n", src_resource->desc.Format);
+ WARN("Both dst and src must be textures.\n");
return;
}
layer_count = d3d12_resource_desc_get_layer_count(&dst_resource->desc);
- assert(d3d12_resource_is_texture(dst_resource));
- assert(d3d12_resource_is_texture(src_resource));
assert(dst_resource->desc.MipLevels == src_resource->desc.MipLevels);
assert(layer_count == d3d12_resource_desc_get_layer_count(&src_resource->desc));
for (i = 0; i < dst_resource->desc.MipLevels; ++i)
{
- vk_image_copy_from_d3d12(&vk_image_copy, i, i,
- &src_resource->desc, &dst_resource->desc, src_format, dst_format, NULL, 0, 0, 0);
+ vk_image_copy_from_d3d12(&vk_image_copy, i, i, &src_resource->desc, &dst_resource->desc,
+ src_resource->format, dst_resource->format, NULL, 0, 0, 0);
vk_image_copy.dstSubresource.layerCount = layer_count;
vk_image_copy.srcSubresource.layerCount = layer_count;
VK_CALL(vkCmdCopyImage(list->vk_command_buffer, src_resource->u.vk_image,
@@ -3676,24 +3652,19 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResolveSubresource(ID3D12Graphi
dst_resource = unsafe_impl_from_ID3D12Resource(dst);
src_resource = unsafe_impl_from_ID3D12Resource(src);
- assert(d3d12_resource_is_texture(dst_resource));
- assert(d3d12_resource_is_texture(src_resource));
+ if (!d3d12_resource_is_texture(dst_resource) || !d3d12_resource_is_texture(src_resource))
+ {
+ WARN("Both dst and src must be textures.\n");
+ return;
+ }
d3d12_command_list_track_resource_usage(list, dst_resource);
d3d12_command_list_track_resource_usage(list, src_resource);
d3d12_command_list_end_current_render_pass(list);
- if (!(dst_format = vkd3d_format_from_d3d12_resource_desc(device, &dst_resource->desc, DXGI_FORMAT_UNKNOWN)))
- {
- WARN("Invalid format %#x.\n", dst_resource->desc.Format);
- return;
- }
- if (!(src_format = vkd3d_format_from_d3d12_resource_desc(device, &src_resource->desc, DXGI_FORMAT_UNKNOWN)))
- {
- WARN("Invalid format %#x.\n", src_resource->desc.Format);
- return;
- }
+ dst_format = dst_resource->format;
+ src_format = src_resource->format;
if (dst_format->type == VKD3D_FORMAT_TYPE_TYPELESS || src_format->type == VKD3D_FORMAT_TYPE_TYPELESS)
{
@@ -4064,15 +4035,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResourceBarrier(ID3D12GraphicsC
}
else
{
- const struct vkd3d_format *format;
VkImageMemoryBarrier vk_barrier;
- if (!(format = vkd3d_format_from_d3d12_resource_desc(list->device, &resource->desc, 0)))
- {
- ERR("Resource %p has invalid format %#x.\n", resource, resource->desc.Format);
- continue;
- }
-
vk_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
vk_barrier.pNext = NULL;
vk_barrier.srcAccessMask = src_access_mask;
@@ -4083,7 +4047,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResourceBarrier(ID3D12GraphicsC
vk_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
vk_barrier.image = resource->u.vk_image;
- vk_barrier.subresourceRange.aspectMask = format->vk_aspect_mask;
+ vk_barrier.subresourceRange.aspectMask = resource->format->vk_aspect_mask;
if (sub_resource_idx == D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES)
{
vk_barrier.subresourceRange.baseMipLevel = 0;
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index 4ce3ed81..5012c91c 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -3394,7 +3394,7 @@ static D3D12_RESOURCE_ALLOCATION_INFO * STDMETHODCALLTYPE d3d12_device_GetResour
desc = &resource_descs[0];
- if (FAILED(d3d12_resource_validate_desc(desc, device)))
+ if (FAILED(d3d12_resource_validate_desc(desc, NULL, device)))
{
WARN("Invalid resource desc.\n");
goto invalid;
@@ -3688,7 +3688,7 @@ static void STDMETHODCALLTYPE d3d12_device_GetCopyableFootprints(ID3D12Device *i
return;
}
- if (FAILED(d3d12_resource_validate_desc(desc, device)))
+ if (FAILED(d3d12_resource_validate_desc(desc, NULL, device)))
{
WARN("Invalid resource desc.\n");
return;
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index 78b32bde..2ac7ad95 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -855,7 +855,11 @@ static HRESULT vkd3d_create_image(struct d3d12_device *device,
VkImageCreateInfo image_info;
VkResult vr;
- if (!(format = vkd3d_format_from_d3d12_resource_desc(device, desc, 0)))
+ if (resource)
+ {
+ format = resource->format;
+ }
+ else if (!(format = vkd3d_format_from_d3d12_resource_desc(device, desc, 0)))
{
WARN("Invalid DXGI format %#x.\n", desc->Format);
return E_INVALIDARG;
@@ -1001,7 +1005,7 @@ HRESULT vkd3d_get_image_allocation_info(struct d3d12_device *device,
HRESULT hr;
assert(desc->Dimension != D3D12_RESOURCE_DIMENSION_BUFFER);
- assert(d3d12_resource_validate_desc(desc, device) == S_OK);
+ assert(d3d12_resource_validate_desc(desc, NULL, device) == S_OK);
if (!desc->MipLevels)
{
@@ -1076,7 +1080,6 @@ static bool d3d12_resource_validate_box(const struct d3d12_resource *resource,
unsigned int sub_resource_idx, const D3D12_BOX *box)
{
unsigned int mip_level = sub_resource_idx % resource->desc.MipLevels;
- struct d3d12_device *device = resource->device;
const struct vkd3d_format *vkd3d_format;
uint32_t width_mask, height_mask;
uint64_t width, height, depth;
@@ -1085,7 +1088,7 @@ static bool d3d12_resource_validate_box(const struct d3d12_resource *resource,
height = d3d12_resource_desc_get_height(&resource->desc, mip_level);
depth = d3d12_resource_desc_get_depth(&resource->desc, mip_level);
- vkd3d_format = vkd3d_format_from_d3d12_resource_desc(device, &resource->desc, 0);
+ vkd3d_format = resource->format;
assert(vkd3d_format);
width_mask = vkd3d_format->block_width - 1;
height_mask = vkd3d_format->block_height - 1;
@@ -1350,11 +1353,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_resource_WriteToSubresource(ID3D12Resourc
device = resource->device;
vk_procs = &device->vk_procs;
- if (!(format = vkd3d_format_from_d3d12_resource_desc(device, &resource->desc, 0)))
- {
- ERR("Invalid DXGI format %#x.\n", resource->desc.Format);
- return E_INVALIDARG;
- }
+ format = resource->format;
if (format->vk_aspect_mask != VK_IMAGE_ASPECT_COLOR_BIT)
{
FIXME("Not supported for format %#x.\n", format->dxgi_format);
@@ -1442,11 +1441,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_resource_ReadFromSubresource(ID3D12Resour
device = resource->device;
vk_procs = &device->vk_procs;
- if (!(format = vkd3d_format_from_d3d12_resource_desc(device, &resource->desc, 0)))
- {
- ERR("Invalid DXGI format %#x.\n", resource->desc.Format);
- return E_INVALIDARG;
- }
+ format = resource->format;
if (format->vk_aspect_mask != VK_IMAGE_ASPECT_COLOR_BIT)
{
FIXME("Not supported for format %#x.\n", format->dxgi_format);
@@ -1649,10 +1644,9 @@ static bool d3d12_resource_validate_texture_alignment(const D3D12_RESOURCE_DESC
return true;
}
-HRESULT d3d12_resource_validate_desc(const D3D12_RESOURCE_DESC *desc, struct d3d12_device *device)
+HRESULT d3d12_resource_validate_desc(const D3D12_RESOURCE_DESC *desc, const struct vkd3d_format *format,
+ struct d3d12_device *device)
{
- const struct vkd3d_format *format;
-
switch (desc->Dimension)
{
case D3D12_RESOURCE_DIMENSION_BUFFER:
@@ -1687,7 +1681,7 @@ HRESULT d3d12_resource_validate_desc(const D3D12_RESOURCE_DESC *desc, struct d3d
return E_INVALIDARG;
}
- if (!(format = vkd3d_format_from_d3d12_resource_desc(device, desc, 0)))
+ if (!format && !(format = vkd3d_format_from_d3d12_resource_desc(device, desc, 0)))
{
WARN("Invalid format %#x.\n", desc->Format);
return E_INVALIDARG;
@@ -1775,7 +1769,9 @@ static HRESULT d3d12_resource_init(struct d3d12_resource *resource, struct d3d12
resource->gpu_address = 0;
resource->flags = 0;
- if (FAILED(hr = d3d12_resource_validate_desc(&resource->desc, device)))
+ resource->format = (desc->Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) ? NULL
+ : vkd3d_format_from_d3d12_resource_desc(device, desc, 0);
+ if (FAILED(hr = d3d12_resource_validate_desc(&resource->desc, resource->format, device)))
return hr;
switch (desc->Dimension)
@@ -2030,6 +2026,7 @@ HRESULT vkd3d_create_image_resource(ID3D12Device *device,
object->refcount = 1;
object->internal_refcount = 1;
object->desc = create_info->desc;
+ object->format = vkd3d_format_from_d3d12_resource_desc(d3d12_device, &create_info->desc, 0);
object->u.vk_image = create_info->vk_image;
object->flags = VKD3D_RESOURCE_EXTERNAL;
object->flags |= create_info->flags & VKD3D_RESOURCE_PUBLIC_FLAGS;
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 047f4a29..b1291804 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -427,6 +427,7 @@ struct d3d12_resource
LONG internal_refcount;
D3D12_RESOURCE_DESC desc;
+ const struct vkd3d_format *format;
D3D12_GPU_VIRTUAL_ADDRESS gpu_address;
union
@@ -460,7 +461,8 @@ static inline bool d3d12_resource_is_texture(const struct d3d12_resource *resour
}
bool d3d12_resource_is_cpu_accessible(const struct d3d12_resource *resource);
-HRESULT d3d12_resource_validate_desc(const D3D12_RESOURCE_DESC *desc, struct d3d12_device *device);
+HRESULT d3d12_resource_validate_desc(const D3D12_RESOURCE_DESC *desc, const struct vkd3d_format *format,
+ struct d3d12_device *device);
HRESULT d3d12_committed_resource_create(struct d3d12_device *device,
const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_HEAP_FLAGS heap_flags,
--
2.34.1
2
3
[PATCH vkd3d v2 1/3] tests: Avoid -Wstringop-overread warnings from GCC 11.1+.
by Conor McCarthy Jan. 14, 2022
by Conor McCarthy Jan. 14, 2022
Jan. 14, 2022
It's technically correct in warning about overwriting the entire
vec4 from the address of .x, if a bit overzealous. It's probably a
good warning to keep enabled.
Signed-off-by: Conor McCarthy <cmccarthy(a)codeweavers.com>
---
tests/d3d12.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/tests/d3d12.c b/tests/d3d12.c
index 2507974f..b611448d 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -4737,7 +4737,7 @@ static void test_clear_render_target_view(void)
ID3D12Device_CreateRenderTargetView(device, resource, &rtv_desc, rtv_handle);
- ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, rtv_handle, &array_colors[i].x, 0, NULL);
+ ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, rtv_handle, (const float *)&array_colors[i], 0, NULL);
}
transition_resource_state(command_list, resource,
@@ -4768,7 +4768,7 @@ static void test_clear_render_target_view(void)
ID3D12Device_CreateRenderTargetView(device, resource, &rtv_desc, rtv_handle);
- ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, rtv_handle, &array_colors[i].x, 0, NULL);
+ ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, rtv_handle, (const float *)&array_colors[i], 0, NULL);
}
transition_resource_state(command_list, resource,
@@ -5703,7 +5703,7 @@ static void test_unknown_rtv_format(void)
create_render_target(&context, &desc, &render_targets[1], &rtvs[2]);
for (i = 0; i < ARRAY_SIZE(rtvs); ++i)
- ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, rtvs[i], &white.x, 0, NULL);
+ ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, rtvs[i], (const float *)&white, 0, NULL);
/* NULL RTV */
memset(&rtv_desc, 0, sizeof(rtv_desc));
@@ -14123,7 +14123,7 @@ static void test_gather(void)
context.pipeline_state = create_pipeline_state(context.device,
context.root_signature, desc.rt_format, NULL, &ps_gather4, NULL);
- ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, &white.x, 0, NULL);
+ ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, (const float *)&white, 0, NULL);
ID3D12GraphicsCommandList_OMSetRenderTargets(command_list, 1, &context.rtv, false, NULL);
ID3D12GraphicsCommandList_SetGraphicsRootSignature(command_list, context.root_signature);
@@ -14161,7 +14161,7 @@ static void test_gather(void)
context.pipeline_state = create_pipeline_state(context.device,
context.root_signature, desc.rt_format, NULL, &ps_gather4_offset, NULL);
- ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, &white.x, 0, NULL);
+ ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, (const float *)&white, 0, NULL);
ID3D12GraphicsCommandList_OMSetRenderTargets(command_list, 1, &context.rtv, false, NULL);
ID3D12GraphicsCommandList_SetGraphicsRootSignature(command_list, context.root_signature);
@@ -14199,7 +14199,7 @@ static void test_gather(void)
context.pipeline_state = create_pipeline_state(context.device,
context.root_signature, desc.rt_format, NULL, &ps_gather4_green, NULL);
- ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, &white.x, 0, NULL);
+ ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, (const float *)&white, 0, NULL);
ID3D12GraphicsCommandList_OMSetRenderTargets(command_list, 1, &context.rtv, false, NULL);
ID3D12GraphicsCommandList_SetGraphicsRootSignature(command_list, context.root_signature);
@@ -14237,7 +14237,7 @@ static void test_gather(void)
context.pipeline_state = create_pipeline_state(context.device,
context.root_signature, desc.rt_format, NULL, &ps_gather4_po, NULL);
- ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, &white.x, 0, NULL);
+ ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, (const float *)&white, 0, NULL);
ID3D12GraphicsCommandList_OMSetRenderTargets(command_list, 1, &context.rtv, false, NULL);
ID3D12GraphicsCommandList_SetGraphicsRootSignature(command_list, context.root_signature);
@@ -14273,7 +14273,7 @@ static void test_gather(void)
constants.offset_x = 0;
constants.offset_y = 0;
- ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, &white.x, 0, NULL);
+ ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, (const float *)&white, 0, NULL);
ID3D12GraphicsCommandList_OMSetRenderTargets(command_list, 1, &context.rtv, false, NULL);
ID3D12GraphicsCommandList_SetGraphicsRootSignature(command_list, context.root_signature);
@@ -14463,7 +14463,7 @@ static void test_gather_c(void)
context.pipeline_state = create_pipeline_state(context.device,
context.root_signature, desc.rt_format, NULL, &ps_gather4_c, NULL);
- ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, &white.x, 0, NULL);
+ ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, (const float *)&white, 0, NULL);
ID3D12GraphicsCommandList_OMSetRenderTargets(command_list, 1, &context.rtv, false, NULL);
ID3D12GraphicsCommandList_SetGraphicsRootSignature(command_list, context.root_signature);
@@ -14501,7 +14501,7 @@ static void test_gather_c(void)
context.pipeline_state = create_pipeline_state(context.device,
context.root_signature, desc.rt_format, NULL, &ps_gather4_po_c, NULL);
- ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, &white.x, 0, NULL);
+ ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, (const float *)&white, 0, NULL);
ID3D12GraphicsCommandList_OMSetRenderTargets(command_list, 1, &context.rtv, false, NULL);
ID3D12GraphicsCommandList_SetGraphicsRootSignature(command_list, context.root_signature);
@@ -14537,7 +14537,7 @@ static void test_gather_c(void)
constants.offset_x = 0;
constants.offset_y = 0;
- ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, &white.x, 0, NULL);
+ ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, (const float *)&white, 0, NULL);
ID3D12GraphicsCommandList_OMSetRenderTargets(command_list, 1, &context.rtv, false, NULL);
ID3D12GraphicsCommandList_SetGraphicsRootSignature(command_list, context.root_signature);
@@ -15388,7 +15388,7 @@ static void test_multisample_array_texture(void)
rtv_desc.Texture2DMSArray.ArraySize = 1;
ID3D12Device_CreateRenderTargetView(device, texture, &rtv_desc, cpu_handle);
- ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, cpu_handle, &colors[i].x, 0, NULL);
+ ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, cpu_handle, (const float *)&colors[i], 0, NULL);
}
transition_resource_state(command_list, texture,
--
2.34.1
3
5
Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com>
---
dlls/winepulse.drv/pulse.c | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c
index bd886e0d879..356f68e0db2 100644
--- a/dlls/winepulse.drv/pulse.c
+++ b/dlls/winepulse.drv/pulse.c
@@ -928,6 +928,7 @@ static NTSTATUS pulse_release_stream(void *args)
{
struct release_stream_params *params = args;
struct pulse_stream *stream = params->stream;
+ SIZE_T size;
if(params->timer) {
stream->please_quit = TRUE;
@@ -944,12 +945,16 @@ static NTSTATUS pulse_release_stream(void *args)
pa_stream_unref(stream->stream);
pulse_unlock();
- if (stream->tmp_buffer)
+ if (stream->tmp_buffer) {
+ size = 0;
NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer,
- &stream->tmp_buffer_bytes, MEM_RELEASE);
- if (stream->local_buffer)
+ &size, MEM_RELEASE);
+ }
+ if (stream->local_buffer) {
+ size = 0;
NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer,
- &stream->alloc_size, MEM_RELEASE);
+ &size, MEM_RELEASE);
+ }
free(stream->peek_buffer);
free(stream);
return STATUS_SUCCESS;
@@ -1514,13 +1519,16 @@ static NTSTATUS pulse_reset(void *args)
static BOOL alloc_tmp_buffer(struct pulse_stream *stream, SIZE_T bytes)
{
+ SIZE_T size;
+
if (stream->tmp_buffer_bytes >= bytes)
return TRUE;
if (stream->tmp_buffer)
{
+ size = 0;
NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer,
- &stream->tmp_buffer_bytes, MEM_RELEASE);
+ &size, MEM_RELEASE);
stream->tmp_buffer = NULL;
stream->tmp_buffer_bytes = 0;
}
--
2.34.1
1
0
Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com>
---
dlls/winecoreaudio.drv/coreaudio.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c
index 3f694b95a49..a2bbc3e45c9 100644
--- a/dlls/winecoreaudio.drv/coreaudio.c
+++ b/dlls/winecoreaudio.drv/coreaudio.c
@@ -709,6 +709,7 @@ static NTSTATUS release_stream( void *args )
{
struct release_stream_params *params = args;
struct coreaudio_stream *stream = params->stream;
+ SIZE_T size;
if(stream->unit){
AudioOutputUnitStop(stream->unit);
@@ -719,12 +720,16 @@ static NTSTATUS release_stream( void *args )
free(stream->resamp_buffer);
free(stream->wrap_buffer);
free(stream->cap_buffer);
- if(stream->local_buffer)
+ if(stream->local_buffer){
+ size = 0;
NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->local_buffer,
- &stream->local_buffer_size, MEM_RELEASE);
- if(stream->tmp_buffer)
+ &size, MEM_RELEASE);
+ }
+ if(stream->tmp_buffer){
+ size = 0;
NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer,
- &stream->tmp_buffer_size, MEM_RELEASE);
+ &size, MEM_RELEASE);
+ }
free(stream->fmt);
free(stream);
params->result = S_OK;
@@ -1354,8 +1359,9 @@ static NTSTATUS get_render_buffer(void *args)
if(stream->wri_offs_frames + params->frames > stream->bufsize_frames){
if(stream->tmp_buffer_frames < params->frames){
if(stream->tmp_buffer){
+ SIZE_T size = 0;
NtFreeVirtualMemory(GetCurrentProcess(), (void **)&stream->tmp_buffer,
- &stream->tmp_buffer_size, MEM_RELEASE);
+ &size, MEM_RELEASE);
stream->tmp_buffer = NULL;
}
stream->tmp_buffer_size = params->frames * stream->fmt->nBlockAlign;
--
2.34.1
1
0
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51850
Signed-off-by: Mohamad Al-Jaf <mohamadaljaf(a)gmail.com>
---
v2: -Add architecture-specific assembly (Credit: Zebediah Figura)
-Update copyright year
-Add basic unit test
-Explicitly declare function takes no parameters
Note: I compared the native wdscore to this one in both
Wine and Windows. The functions behaved identically.
---
configure.ac | 1 +
dlls/wdscore/Makefile.in | 3 ++
dlls/wdscore/main.c | 55 ++++++++++++++++++++++++++++++++++
dlls/wdscore/tests/Makefile.in | 5 ++++
dlls/wdscore/tests/main.c | 37 +++++++++++++++++++++++
dlls/wdscore/wdscore.spec | 2 +-
6 files changed, 102 insertions(+), 1 deletion(-)
create mode 100644 dlls/wdscore/main.c
create mode 100644 dlls/wdscore/tests/Makefile.in
create mode 100644 dlls/wdscore/tests/main.c
diff --git a/configure.ac b/configure.ac
index b42cb8a5346..a50881cc2fb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3347,6 +3347,7 @@ WINE_CONFIG_MAKEFILE(dlls/wbemdisp/tests)
WINE_CONFIG_MAKEFILE(dlls/wbemprox)
WINE_CONFIG_MAKEFILE(dlls/wbemprox/tests)
WINE_CONFIG_MAKEFILE(dlls/wdscore)
+WINE_CONFIG_MAKEFILE(dlls/wdscore/tests)
WINE_CONFIG_MAKEFILE(dlls/webservices)
WINE_CONFIG_MAKEFILE(dlls/webservices/tests)
WINE_CONFIG_MAKEFILE(dlls/websocket)
diff --git a/dlls/wdscore/Makefile.in b/dlls/wdscore/Makefile.in
index 20ba1d3b1c9..2020e72c7bb 100644
--- a/dlls/wdscore/Makefile.in
+++ b/dlls/wdscore/Makefile.in
@@ -1,3 +1,6 @@
MODULE = wdscore.dll
EXTRADLLFLAGS = -Wb,--prefer-native
+
+C_SRCS = \
+ main.c
diff --git a/dlls/wdscore/main.c b/dlls/wdscore/main.c
new file mode 100644
index 00000000000..1ed860e02ea
--- /dev/null
+++ b/dlls/wdscore/main.c
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2022 Mohamad Al-Jaf
+ *
+ * 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
+ */
+
+#include <stdarg.h>
+#include <stdint.h>
+
+#include "windef.h"
+#include "winbase.h"
+
+#include "wine/asm.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wdscore);
+
+/***********************************************************************
+ * CurrentIP (wdscore.@)
+ */
+#ifdef __i386__
+__ASM_STDCALL_FUNC(CurrentIP, 0,
+ "movl 0(%esp), %eax\n\t"
+ "ret" )
+#elif defined(__x86_64__)
+__ASM_STDCALL_FUNC(CurrentIP, 0,
+ "movq 0(%rsp), %rax\n\t"
+ "ret" )
+#elif defined(__arm__)
+__ASM_STDCALL_FUNC(CurrentIP, 0,
+ "mov lr, r0\n\t"
+ "bx lr" )
+#elif defined(__aarch64__)
+__ASM_STDCALL_FUNC(CurrentIP, 0,
+ "mov lr, x0\n\t"
+ "ret" )
+#else
+int WINAPI CurrentIP(void)
+{
+ FIXME( "not implemented\n" );
+ return 0;
+}
+#endif
diff --git a/dlls/wdscore/tests/Makefile.in b/dlls/wdscore/tests/Makefile.in
new file mode 100644
index 00000000000..f0606d902d5
--- /dev/null
+++ b/dlls/wdscore/tests/Makefile.in
@@ -0,0 +1,5 @@
+TESTDLL = wdscore.dll
+IMPORTS = wdscore
+
+C_SRCS = \
+ main.c
diff --git a/dlls/wdscore/tests/main.c b/dlls/wdscore/tests/main.c
new file mode 100644
index 00000000000..262c75641af
--- /dev/null
+++ b/dlls/wdscore/tests/main.c
@@ -0,0 +1,37 @@
+/*
+ * Unit test suite for wdscore
+ *
+ * Copyright 2022 Mohamad Al-Jaf
+ *
+ * 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
+ *
+ */
+
+#include "wine/test.h"
+#include "winbase.h"
+
+static void test_CurrentIP(void)
+{
+ int ret;
+
+ ret = CurrentIP();
+ trace("CurrentIP() = %d\n", ret);
+ ok(ret != 0, "Unsupported architecture\n");
+}
+
+START_TEST(main)
+{
+ test_CurrentIP();
+}
diff --git a/dlls/wdscore/wdscore.spec b/dlls/wdscore/wdscore.spec
index 15958b86aba..8b6febe6b3b 100644
--- a/dlls/wdscore/wdscore.spec
+++ b/dlls/wdscore/wdscore.spec
@@ -71,7 +71,7 @@
@ stub ConstructPartialMsgIfW
@ stub ConstructPartialMsgVA
@ stub ConstructPartialMsgVW
-@ stub CurrentIP
+@ stdcall CurrentIP()
@ stub EndMajorTask
@ stub EndMinorTask
@ stub GetMajorTask
--
2.34.1
3
2
[PATCH] wineboot: Don't use ai_canonname for ComputerName if it is "localhost".
by Jinoh Kang Jan. 14, 2022
by Jinoh Kang Jan. 14, 2022
Jan. 14, 2022
Signed-off-by: Jinoh Kang <jinoh.kang.kr(a)gmail.com>
---
programs/wineboot/wineboot.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c
index 4a18265c1de..e7a508beb12 100644
--- a/programs/wineboot/wineboot.c
+++ b/programs/wineboot/wineboot.c
@@ -826,7 +826,9 @@ static void create_computer_name_keys(void)
if (gethostname( buffer, sizeof(buffer) )) return;
hints.ai_flags = AI_CANONNAME;
- if (!getaddrinfo( buffer, NULL, &hints, &res )) name = res->ai_canonname;
+ if (!getaddrinfo( buffer, NULL, &hints, &res ) &&
+ res->ai_canonname && strcasecmp(res->ai_canonname, "localhost") != 0)
+ name = res->ai_canonname;
dot = strchr( name, '.' );
if (dot) *dot++ = 0;
else dot = name + strlen(name);
--
2.31.1
1
0