Wine-devel
Threads by month
- ----- 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
June 2021
- 82 participants
- 607 discussions
[PATCH 1/2] qedit/tests: Check the Sample Grabber's buffer during and after flushing.
by Gabriel Ivăncescu 04 Oct '22
by Gabriel Ivăncescu 04 Oct '22
04 Oct '22
Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com>
---
dlls/qedit/tests/samplegrabber.c | 234 +++++++++++++++++++++++++++++++
1 file changed, 234 insertions(+)
diff --git a/dlls/qedit/tests/samplegrabber.c b/dlls/qedit/tests/samplegrabber.c
index 8e68e3e..e66180f 100644
--- a/dlls/qedit/tests/samplegrabber.c
+++ b/dlls/qedit/tests/samplegrabber.c
@@ -1036,6 +1036,239 @@ static void test_connect_pin(void)
ok(!ref, "Got outstanding refcount %d.\n", ref);
}
+struct frame_thread_params
+{
+ IMemInputPin *sink;
+ IMediaSample *sample;
+ DWORD delay;
+};
+
+static DWORD WINAPI frame_thread(void *arg)
+{
+ struct frame_thread_params *params = arg;
+ HRESULT hr;
+
+ if (params->delay)
+ {
+ if (winetest_debug > 1) trace("%04x: Sleeping %u ms.\n", GetCurrentThreadId(), params->delay);
+ Sleep(params->delay);
+ }
+ if (winetest_debug > 1) trace("%04x: Sending frame.\n", GetCurrentThreadId());
+ hr = IMemInputPin_Receive(params->sink, params->sample);
+ if (winetest_debug > 1) trace("%04x: Returned %#x.\n", GetCurrentThreadId(), hr);
+ IMediaSample_Release(params->sample);
+ free(params);
+ return hr;
+}
+
+static HANDLE send_frame_time(IMemInputPin *sink, REFERENCE_TIME start_time, unsigned char color, DWORD delay)
+{
+ struct frame_thread_params *params = malloc(sizeof(*params));
+ IMemAllocator *allocator;
+ REFERENCE_TIME end_time;
+ IMediaSample *sample;
+ HANDLE thread;
+ HRESULT hr;
+ BYTE *data;
+
+ hr = IMemInputPin_GetAllocator(sink, &allocator);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0);
+ if (hr == VFW_E_NOT_COMMITTED)
+ {
+ IMemAllocator_Commit(allocator);
+ hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0);
+ }
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IMediaSample_GetPointer(sample, &data);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ memset(data, 0x55, 32 * 16 * 2);
+
+ hr = IMediaSample_SetActualDataLength(sample, 32 * 16 * 2);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ start_time *= 10000000;
+ end_time = start_time + 10000000;
+ hr = IMediaSample_SetTime(sample, &start_time, &end_time);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ params->sink = sink;
+ params->sample = sample;
+ params->delay = delay;
+ thread = CreateThread(NULL, 0, frame_thread, params, 0, NULL);
+
+ IMemAllocator_Release(allocator);
+ return thread;
+}
+
+static HANDLE send_frame(IMemInputPin *sink, DWORD delay)
+{
+ return send_frame_time(sink, 0, 0x55, delay); /* purple */
+}
+
+static HRESULT join_thread_(int line, HANDLE thread)
+{
+ DWORD ret;
+ ok_(__FILE__, line)(!WaitForSingleObject(thread, 1000), "Wait failed.\n");
+ GetExitCodeThread(thread, &ret);
+ CloseHandle(thread);
+ return ret;
+}
+#define join_thread(a) join_thread_(__LINE__, a)
+
+static void test_buffer_flush(void)
+{
+ AM_MEDIA_TYPE req_mt =
+ {
+ .majortype = MEDIATYPE_Video,
+ .subtype = MEDIASUBTYPE_RGB565,
+ .formattype = FORMAT_VideoInfo,
+ .bTemporalCompression = TRUE,
+ };
+ LONG buf[(32 * 16 * 2) / sizeof(LONG)], size = sizeof(buf);
+ IPin *sink, *source, *renderer_pin;
+ struct testfilter testsource;
+ ISampleGrabber *grabber;
+ IMediaControl *control;
+ IFilterGraph2 *graph;
+ IMemInputPin *input;
+ IBaseFilter *filter;
+ OAFilterState state;
+ IMediaFilter *mf;
+ HANDLE thread;
+ DWORD ticks;
+ unsigned i;
+ HRESULT hr;
+ ULONG ref;
+
+ testfilter_init(&testsource);
+ CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IFilterGraph2, (void **)&graph);
+ CoCreateInstance(&CLSID_NullRenderer, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IBaseFilter, (void **)&filter);
+ IFilterGraph2_AddFilter(graph, filter, L"sink");
+ IBaseFilter_FindPin(filter, L"In", &renderer_pin);
+ IBaseFilter_Release(filter);
+
+ filter = create_sample_grabber();
+ IFilterGraph2_AddFilter(graph, &testsource.filter.IBaseFilter_iface, L"source");
+ IFilterGraph2_AddFilter(graph, filter, L"sample grabber");
+ IBaseFilter_FindPin(filter, L"In", &sink);
+ IBaseFilter_FindPin(filter, L"Out", &source);
+ IBaseFilter_QueryInterface(filter, &IID_ISampleGrabber, (void **)&grabber);
+ IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control);
+ IPin_QueryInterface(sink, &IID_IMemInputPin, (void **)&input);
+
+ ISampleGrabber_SetMediaType(grabber, &req_mt);
+ ISampleGrabber_SetBufferSamples(grabber, TRUE);
+
+ testsource.sink_mt = &req_mt;
+ hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IFilterGraph2_ConnectDirect(graph, source, renderer_pin, &req_mt);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ IPin_Release(renderer_pin);
+
+ IFilterGraph2_QueryInterface(graph, &IID_IMediaFilter, (void **)&mf);
+ IMediaFilter_SetSyncSource(mf, NULL);
+ IMediaFilter_Release(mf);
+
+ hr = IMemInputPin_ReceiveCanBlock(input);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = ISampleGrabber_GetCurrentBuffer(grabber, &size, buf);
+ ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr);
+
+ hr = IMediaControl_Pause(control);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ hr = IMediaControl_GetState(control, 0, &state);
+ ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr);
+
+ thread = send_frame(input, 0);
+ hr = IMediaControl_GetState(control, 1000, &state);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n");
+
+ for (i = 0; i < 3; i++)
+ {
+ ticks = GetTickCount();
+ hr = ISampleGrabber_GetCurrentBuffer(grabber, &size, buf);
+ ticks = GetTickCount() - ticks;
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(ticks < 100, "Got %u ticks.\n", ticks);
+ ok(size == sizeof(buf), "Got size %d.\n", size);
+ }
+
+ hr = IMediaControl_Stop(control);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = join_thread(thread);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IMediaControl_GetState(control, 1000, &state);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(state == State_Stopped, "Got state %d.\n", state);
+ hr = ISampleGrabber_GetCurrentBuffer(grabber, &size, buf);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IMediaControl_Pause(control);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ hr = IMediaControl_GetState(control, 0, &state);
+ ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr);
+
+ thread = send_frame(input, 0);
+ hr = IMediaControl_GetState(control, 1000, &state);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n");
+
+ for (i = 0; i < 3; i++)
+ {
+ ticks = GetTickCount();
+ hr = ISampleGrabber_GetCurrentBuffer(grabber, &size, buf);
+ ticks = GetTickCount() - ticks;
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(ticks < 100, "Got %u ticks.\n", ticks);
+ ok(size == sizeof(buf), "Got size %d.\n", size);
+ }
+
+ IPin_BeginFlush(sink);
+ hr = join_thread(thread);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = ISampleGrabber_GetCurrentBuffer(grabber, &size, buf);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ IPin_EndFlush(sink);
+
+ hr = IMediaControl_GetState(control, 0, &state);
+ todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr);
+
+ ticks = GetTickCount();
+ thread = send_frame(input, 150);
+ hr = ISampleGrabber_GetCurrentBuffer(grabber, &size, buf);
+ ticks = GetTickCount() - ticks;
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ ok(ticks < 100, "Got %u ticks.\n", ticks);
+ ok(size == sizeof(buf), "Got size %d.\n", size);
+
+ hr = IMediaControl_GetState(control, 1000, &state);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IMediaControl_Stop(control);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = join_thread(thread);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ IPin_Release(sink);
+ IPin_Release(source);
+ IMemInputPin_Release(input);
+ IMediaControl_Release(control);
+ ref = IFilterGraph2_Release(graph);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ ISampleGrabber_Release(grabber);
+ ref = IBaseFilter_Release(filter);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+ ref = IBaseFilter_Release(&testsource.filter.IBaseFilter_iface);
+ ok(!ref, "Got outstanding refcount %d.\n", ref);
+}
+
START_TEST(samplegrabber)
{
IBaseFilter *filter;
@@ -1059,6 +1292,7 @@ START_TEST(samplegrabber)
test_aggregation();
test_media_types();
test_connect_pin();
+ test_buffer_flush();
CoUninitialize();
}
--
2.21.0
5
7
24 Jan '22
To help gdb reload symbol files from /proc/<pid>/maps, making it
possible to load debug info for ELF and PE modules for Wine processes.
When sourced (from ~/.gdbinit for instance), this adds a new
"load-symbol-files" command (with an "lsf" alias), which automatically
calls add-symbol-file on every mapped file that can be read as ELF or
PE, with the correct section offset.
The command has to be run manually, for instance after executing for
a while, to load new modules that may have been loaded, as there's no
way for gdb to be notified of such changes automatically.
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
This is some script I've been using for a while, and more or less broken
versions are also used by other people, so I figured maybe it would be
better to have a proper working version officially distributed with Wine
source instead, as it's pretty useful for debugging Wine under gdb.
It's still a bit manual to use, as gdb cannot easily be notified of
dynamic library loading [1], but I think it's much better than having
nothing.
[1] in theory there's ways to do it using systemtap probes, but it's
going to be hard to make it work, especially for PE modules.
tools/gdbinit.py | 108 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 108 insertions(+)
create mode 100644 tools/gdbinit.py
diff --git a/tools/gdbinit.py b/tools/gdbinit.py
new file mode 100644
index 00000000000..265d97722b7
--- /dev/null
+++ b/tools/gdbinit.py
@@ -0,0 +1,108 @@
+#!/bin/env python3
+
+# Copyright 2021 Rémi Bernon 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
+
+from __future__ import print_function
+
+import gdb
+import re
+import subprocess
+import sys
+
+class LoadSymbolFiles(gdb.Command):
+ 'Command to load symbol files directly from /proc/<pid>/maps.'
+
+ def __init__(self):
+ sup = super(LoadSymbolFiles, self)
+ sup.__init__('load-symbol-files', gdb.COMMAND_FILES, gdb.COMPLETE_NONE,
+ False)
+
+ self.libs = {}
+ gdb.execute('alias -a lsf = load-symbol-files', True)
+
+ def invoke(self, arg, from_tty):
+ pid = gdb.selected_inferior().pid
+ if not pid in self.libs: self.libs[pid] = {}
+
+ def command(cmd, confirm=from_tty):
+ to_string = not from_tty
+ gdb.execute(cmd, from_tty=confirm, to_string=to_string)
+
+ def execute(cmd):
+ return subprocess.check_output(cmd, stderr=subprocess.STDOUT) \
+ .decode('utf-8')
+
+ # load mappings addresses
+ libs = {}
+ with open('/proc/{}/maps'.format(pid), 'r') as maps:
+ for line in maps:
+ addr, _, _, _, node, path = re.split(r'\s+', line, 5)
+ path = path.strip()
+ if node == '0': continue
+ if path in libs: continue
+ libs[path] = int(addr.split('-')[0], 16)
+
+ # unload symbol file if address changed
+ for k in set(libs) & set(self.libs[pid]):
+ if libs[k] != self.libs[pid][k]:
+ command('remove-symbol-file "{}"'.format(k), confirm=False)
+ del self.libs[k]
+
+ # load symbol file for new mappings
+ for k in set(libs) - set(self.libs[pid]):
+ if arg is not None and re.search(arg, k) is None: continue
+ addr = self.libs[pid][k] = libs[k]
+ offs = None
+
+ try:
+ out = execute(['file', k])
+ except:
+ continue
+
+ # try loading mapping as ELF
+ try:
+ out = execute(['readelf', '-l', k])
+ for line in out.split('\n'):
+ if not 'LOAD' in line: continue
+ base = int(line.split()[2], 16)
+ break
+
+ out = execute(['objdump', '-h', k])
+ for line in out.split('\n'):
+ if not '.text' in line: continue
+ offs = int(line.split()[3], 16) - base
+ break
+ if offs is None: continue
+
+ # try again, assuming mapping is PE
+ except:
+ try:
+ out = execute(['objdump', '-h', k])
+ for line in out.split('\n'):
+ if not '.text' in line: continue
+ offs = int(line.split()[5], 16)
+ break
+ if offs is None: continue
+
+ except:
+ continue
+
+ command('add-symbol-file "{}" 0x{:x}'.format(k, addr + offs),
+ confirm=False)
+
+
+LoadSymbolFiles()
--
2.31.0
3
7
I'm sending this as an RFC for now as there's been some discussion
already about how to handle PE dependencies. I think the approach I'm
taking here, by including FAudio headers directly in the source and
loading it dynamically is the easiest way, and the least disruptive for
building and running Wine, if not the cleanest. All the other solutions
have higher friction, either on third party packages, or on the system
distribution.
Upstream FAudio now has a pure Win32 backend, which makes it much easier
to build as PE. This was never a requirement, and this series should
work too with the SDL2 backend, as it tries to load Wine Mono SDL2 and
FAudio as a fallback after trying from the prefix system libraries.
It could help the transition though, and is going to be required anyway
to support WMA decoding. Right now, with or without the Win32 backend,
this would also introduce a functional regression as although supported
by the new FAudio Win32 backend, it also depends on the WMA decoder MF
transform to be implemented, which isn't the case yet in Wine.
Cheers,
Rémi Bernon (5):
xactengine3_7: Move sources to xaudio2_7.
xaudio2_7: Load FAudio dynamically.
xaudio2_7: Import FAudio headers for private use.
xaudio2_7: Build with msvcrt.
xaudio2_7: Use msvcrt allocation functions.
configure.ac | 55 -
dlls/x3daudio1_0/Makefile.in | 4 +-
dlls/x3daudio1_1/Makefile.in | 4 +-
dlls/x3daudio1_2/Makefile.in | 4 +-
dlls/x3daudio1_3/Makefile.in | 4 +-
dlls/x3daudio1_4/Makefile.in | 4 +-
dlls/x3daudio1_5/Makefile.in | 4 +-
dlls/x3daudio1_6/Makefile.in | 4 +-
dlls/x3daudio1_7/Makefile.in | 4 +-
dlls/xactengine2_0/Makefile.in | 6 +-
dlls/xactengine2_4/Makefile.in | 6 +-
dlls/xactengine2_7/Makefile.in | 6 +-
dlls/xactengine2_9/Makefile.in | 6 +-
dlls/xactengine3_0/Makefile.in | 6 +-
dlls/xactengine3_1/Makefile.in | 6 +-
dlls/xactengine3_2/Makefile.in | 6 +-
dlls/xactengine3_3/Makefile.in | 6 +-
dlls/xactengine3_4/Makefile.in | 6 +-
dlls/xactengine3_5/Makefile.in | 6 +-
dlls/xactengine3_6/Makefile.in | 6 +-
dlls/xactengine3_7/Makefile.in | 5 +-
dlls/xapofx1_1/Makefile.in | 4 +-
dlls/xapofx1_2/Makefile.in | 4 +-
dlls/xapofx1_3/Makefile.in | 4 +-
dlls/xapofx1_4/Makefile.in | 4 +-
dlls/xapofx1_5/Makefile.in | 4 +-
dlls/xaudio2_0/Makefile.in | 4 +-
dlls/xaudio2_1/Makefile.in | 4 +-
dlls/xaudio2_2/Makefile.in | 4 +-
dlls/xaudio2_3/Makefile.in | 4 +-
dlls/xaudio2_4/Makefile.in | 4 +-
dlls/xaudio2_5/Makefile.in | 4 +-
dlls/xaudio2_6/Makefile.in | 4 +-
dlls/xaudio2_7/FAudio/F3DAudio.h | 262 ++++
dlls/xaudio2_7/FAudio/FACT.h | 814 ++++++++++
dlls/xaudio2_7/FAudio/FACT3D.h | 127 ++
dlls/xaudio2_7/FAudio/FAPO.h | 207 +++
dlls/xaudio2_7/FAudio/FAPOBase.h | 264 ++++
dlls/xaudio2_7/FAudio/FAPOFX.h | 178 +++
dlls/xaudio2_7/FAudio/FAudio.h | 1322 +++++++++++++++++
dlls/xaudio2_7/FAudio/FAudioFX.h | 308 ++++
dlls/xaudio2_7/Makefile.in | 4 +-
dlls/xaudio2_7/compat.c | 92 +-
dlls/xaudio2_7/faudio.c | 326 ++++
dlls/xaudio2_7/x3daudio.c | 35 +-
.../xact_classes.idl | 0
dlls/{xactengine3_7 => xaudio2_7}/xact_dll.c | 182 ++-
dlls/xaudio2_7/xapo.c | 29 +-
dlls/xaudio2_7/xapofx.c | 21 +-
dlls/xaudio2_7/xaudio_allocator.c | 2 -
dlls/xaudio2_7/xaudio_dll.c | 267 ++--
dlls/xaudio2_7/xaudio_private.h | 149 +-
dlls/xaudio2_8/Makefile.in | 4 +-
dlls/xaudio2_9/Makefile.in | 4 +-
54 files changed, 4298 insertions(+), 505 deletions(-)
create mode 100644 dlls/xaudio2_7/FAudio/F3DAudio.h
create mode 100644 dlls/xaudio2_7/FAudio/FACT.h
create mode 100644 dlls/xaudio2_7/FAudio/FACT3D.h
create mode 100644 dlls/xaudio2_7/FAudio/FAPO.h
create mode 100644 dlls/xaudio2_7/FAudio/FAPOBase.h
create mode 100644 dlls/xaudio2_7/FAudio/FAPOFX.h
create mode 100644 dlls/xaudio2_7/FAudio/FAudio.h
create mode 100644 dlls/xaudio2_7/FAudio/FAudioFX.h
create mode 100644 dlls/xaudio2_7/faudio.c
rename dlls/{xactengine3_7 => xaudio2_7}/xact_classes.idl (100%)
rename dlls/{xactengine3_7 => xaudio2_7}/xact_dll.c (87%)
--
2.31.0
16
85
Based on the DXVA AV1 specs
https://www.microsoft.com/en-us/download/details.aspx?id=101577
The structures and the associated define are available in Windows SDK
since at least 10.0.20231.0.
The GUIDs were present in previous SDKs as well.
---
include/dxva.h | 279 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 279 insertions(+)
diff --git a/include/dxva.h b/include/dxva.h
index 4f18f2e60da..b474bd87111 100644
--- a/include/dxva.h
+++ b/include/dxva.h
@@ -563,6 +563,285 @@ typedef struct _DXVA_Status_VPx
USHORT wNumMbsAffected;
} DXVA_Status_VPx, *LPDXVA_Status_VPx;
+
+#define _DIRECTX_AV1_VA_
+
+/* AV1 decoder GUIDs */
+DEFINE_GUID(DXVA_ModeAV1_VLD_Profile0, 0xb8be4ccb, 0xcf53, 0x46ba, 0x8d, 0x59, 0xd6, 0xb8, 0xa6, 0xda, 0x5d, 0x2a);
+DEFINE_GUID(DXVA_ModeAV1_VLD_Profile1, 0x6936ff0f, 0x45b1, 0x4163, 0x9c, 0xc1, 0x64, 0x6e, 0xf6, 0x94, 0x61, 0x08);
+DEFINE_GUID(DXVA_ModeAV1_VLD_Profile2, 0x0c5f2aa1, 0xe541, 0x4089, 0xbb, 0x7b, 0x98, 0x11, 0x0a, 0x19, 0xd7, 0xc8);
+DEFINE_GUID(DXVA_ModeAV1_VLD_12bit_Profile2, 0x17127009, 0xa00f, 0x4ce1, 0x99, 0x4e, 0xbf, 0x40, 0x81, 0xf6, 0xf3, 0xf0);
+DEFINE_GUID(DXVA_ModeAV1_VLD_12bit_Profile2_420, 0x2d80bed6, 0x9cac, 0x4835, 0x9e, 0x91, 0x32, 0x7b, 0xbc, 0x4f, 0x9e, 0xe8);
+
+/* AV1 picture entry data structure */
+typedef struct _DXVA_PicEntry_AV1 {
+ UINT width;
+ UINT height;
+
+ // Global motion parameters
+ INT wmmat[6];
+ union {
+ struct {
+ UCHAR wminvalid : 1;
+ UCHAR wmtype : 2;
+ UCHAR Reserved : 5;
+ };
+ UCHAR GlobalMotionFlags;
+ };
+ UCHAR Index;
+ USHORT Reserved16Bits;
+} DXVA_PicEntry_AV1, *LPDXVA_PicEntry_AV1;
+
+/* AV1 picture parameters data structure */
+typedef struct _DXVA_PicParams_AV1 {
+ UINT width;
+ UINT height;
+
+ UINT max_width;
+ UINT max_height;
+
+ UCHAR CurrPicTextureIndex;
+ UCHAR superres_denom;
+ UCHAR bitdepth;
+ UCHAR seq_profile;
+
+ // Tiles:
+ struct {
+ UCHAR cols;
+ UCHAR rows;
+ USHORT context_update_id;
+ USHORT widths[64];
+ USHORT heights[64];
+ } tiles;
+
+ // Coding Tools
+ union {
+ struct {
+ UINT use_128x128_superblock : 1;
+ UINT intra_edge_filter : 1;
+ UINT interintra_compound : 1;
+ UINT masked_compound : 1;
+ UINT warped_motion : 1;
+ UINT dual_filter : 1;
+ UINT jnt_comp : 1;
+ UINT screen_content_tools : 1;
+ UINT integer_mv : 1;
+ UINT cdef : 1;
+ UINT restoration : 1;
+ UINT film_grain : 1;
+ UINT intrabc : 1;
+ UINT high_precision_mv : 1;
+ UINT switchable_motion_mode : 1;
+ UINT filter_intra : 1;
+ UINT disable_frame_end_update_cdf : 1;
+ UINT disable_cdf_update : 1;
+ UINT reference_mode : 1;
+ UINT skip_mode : 1;
+ UINT reduced_tx_set : 1;
+ UINT superres : 1;
+ UINT tx_mode : 2;
+ UINT use_ref_frame_mvs : 1;
+ UINT enable_ref_frame_mvs : 1;
+ UINT reference_frame_update : 1;
+ UINT Reserved : 5;
+ };
+ UINT32 CodingParamToolFlags;
+ } coding;
+
+ // Format & Picture Info flags
+ union {
+ struct {
+ UCHAR frame_type : 2;
+ UCHAR show_frame : 1;
+ UCHAR showable_frame : 1;
+ UCHAR subsampling_x : 1;
+ UCHAR subsampling_y : 1;
+ UCHAR mono_chrome : 1;
+ UCHAR Reserved : 1;
+ };
+ UCHAR FormatAndPictureInfoFlags;
+ } format;
+
+ // References
+ UCHAR primary_ref_frame;
+ UCHAR order_hint;
+ UCHAR order_hint_bits;
+
+ DXVA_PicEntry_AV1 frame_refs[7];
+ UCHAR RefFrameMapTextureIndex[8];
+
+ // Loop filter parameters
+ struct {
+ UCHAR filter_level[2];
+ UCHAR filter_level_u;
+ UCHAR filter_level_v;
+
+ UCHAR sharpness_level;
+ union {
+ struct {
+ UCHAR mode_ref_delta_enabled : 1;
+ UCHAR mode_ref_delta_update : 1;
+ UCHAR delta_lf_multi : 1;
+ UCHAR delta_lf_present : 1;
+ UCHAR Reserved : 4;
+ };
+ UCHAR ControlFlags;
+ } DUMMYUNIONNAME;
+ CHAR ref_deltas[8];
+ CHAR mode_deltas[2];
+ UCHAR delta_lf_res;
+ UCHAR frame_restoration_type[3];
+ USHORT log2_restoration_unit_size[3];
+ UINT16 Reserved16Bits;
+ } loop_filter;
+
+ // Quantization
+ struct {
+ union {
+ struct {
+ UCHAR delta_q_present : 1;
+ UCHAR delta_q_res : 2;
+ UCHAR Reserved : 5;
+ };
+ UCHAR ControlFlags;
+ } DUMMYUNIONNAME;
+
+ UCHAR base_qindex;
+ CHAR y_dc_delta_q;
+ CHAR u_dc_delta_q;
+ CHAR v_dc_delta_q;
+ CHAR u_ac_delta_q;
+ CHAR v_ac_delta_q;
+ // using_qmatrix:
+ UCHAR qm_y;
+ UCHAR qm_u;
+ UCHAR qm_v;
+ UINT16 Reserved16Bits;
+ } quantization;
+
+ // Cdef parameters
+ struct {
+ union {
+ struct {
+ UCHAR damping : 2;
+ UCHAR bits : 2;
+ UCHAR Reserved : 4;
+ };
+ UCHAR ControlFlags;
+ } DUMMYUNIONNAME;
+
+ union {
+ struct {
+ UCHAR primary : 6;
+ UCHAR secondary : 2;
+ };
+ UCHAR combined;
+ } y_strengths[8];
+
+ union {
+ struct {
+ UCHAR primary : 6;
+ UCHAR secondary : 2;
+ };
+ UCHAR combined;
+ } uv_strengths[8];
+
+ } cdef;
+
+ UCHAR interp_filter;
+
+ // Segmentation
+ struct {
+ union {
+ struct {
+ UCHAR enabled : 1;
+ UCHAR update_map : 1;
+ UCHAR update_data : 1;
+ UCHAR temporal_update : 1;
+ UCHAR Reserved : 4;
+ };
+ UCHAR ControlFlags;
+ } DUMMYUNIONNAME;
+ UCHAR Reserved24Bits[3];
+
+ union {
+ struct {
+ UCHAR alt_q : 1;
+ UCHAR alt_lf_y_v : 1;
+ UCHAR alt_lf_y_h : 1;
+ UCHAR alt_lf_u : 1;
+ UCHAR alt_lf_v : 1;
+ UCHAR ref_frame : 1;
+ UCHAR skip : 1;
+ UCHAR globalmv : 1;
+ };
+ UCHAR mask;
+ } feature_mask[8];
+
+ SHORT feature_data[8][8];
+
+ } segmentation;
+
+ struct {
+ union {
+ struct {
+ USHORT apply_grain : 1;
+ USHORT scaling_shift_minus8 : 2;
+ USHORT chroma_scaling_from_luma : 1;
+ USHORT ar_coeff_lag : 2;
+ USHORT ar_coeff_shift_minus6 : 2;
+ USHORT grain_scale_shift : 2;
+ USHORT overlap_flag : 1;
+ USHORT clip_to_restricted_range : 1;
+ USHORT matrix_coeff_is_identity : 1;
+ USHORT Reserved : 3;
+ };
+ USHORT ControlFlags;
+ } DUMMYUNIONNAME;
+
+ USHORT grain_seed;
+ UCHAR scaling_points_y[14][2];
+ UCHAR num_y_points;
+ UCHAR scaling_points_cb[10][2];
+ UCHAR num_cb_points;
+ UCHAR scaling_points_cr[10][2];
+ UCHAR num_cr_points;
+ UCHAR ar_coeffs_y[24];
+ UCHAR ar_coeffs_cb[25];
+ UCHAR ar_coeffs_cr[25];
+ UCHAR cb_mult;
+ UCHAR cb_luma_mult;
+ UCHAR cr_mult;
+ UCHAR cr_luma_mult;
+ UCHAR Reserved8Bits;
+ SHORT cb_offset;
+ SHORT cr_offset;
+ } film_grain;
+
+ UINT Reserved32Bits;
+ UINT StatusReportFeedbackNumber;
+} DXVA_PicParams_AV1, *LPDXVA_PicParams_AV1;
+
+/* AV1 tile data structure */
+typedef struct _DXVA_Tile_AV1 {
+ UINT DataOffset;
+ UINT DataSize;
+ USHORT row;
+ USHORT column;
+ USHORT Reserved16Bits;
+ UCHAR anchor_frame;
+ UCHAR Reserved8Bits;
+} DXVA_Tile_AV1, *LPDXVA_Tile_AV1;
+
+typedef struct _DXVA_Status_AV1 {
+ UINT StatusReportFeedbackNumber;
+ DXVA_PicEntry_AV1 CurrPic;
+ UCHAR bBufType;
+ UCHAR bStatus;
+ UCHAR bReserved8Bits;
+ USHORT wNumMbsAffected;
+} DXVA_Status_AV1, *LPDXVA_Status_AV1;
+
#include <poppack.h>
typedef enum _DXVA_VideoChromaSubsampling
--
2.26.2
4
7
[PATCH 1/5] winegstreamer: Inline query_duration() into wg_parser_connect().
by Anton Baskanov 22 Jul '21
by Anton Baskanov 22 Jul '21
22 Jul '21
Signed-off-by: Anton Baskanov <baskanov(a)gmail.com>
---
dlls/winegstreamer/wg_parser.c | 44 ++++++++++++++++++----------------
1 file changed, 23 insertions(+), 21 deletions(-)
diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c
index 0d59297a026..acea68ad27d 100644
--- a/dlls/winegstreamer/wg_parser.c
+++ b/dlls/winegstreamer/wg_parser.c
@@ -1496,26 +1496,6 @@ static gboolean src_event_cb(GstPad *pad, GstObject *parent, GstEvent *event)
return ret;
}
-static LONGLONG query_duration(GstPad *pad)
-{
- gint64 duration, byte_length;
-
- if (gst_pad_query_duration(pad, GST_FORMAT_TIME, &duration))
- return duration / 100;
-
- WARN("Failed to query time duration; trying to convert from byte length.\n");
-
- /* To accurately get a duration for the stream, we want to only consider the
- * length of that stream. Hence, query for the pad duration, instead of
- * using the file duration. */
- if (gst_pad_query_duration(pad, GST_FORMAT_BYTES, &byte_length)
- && gst_pad_query_convert(pad, GST_FORMAT_BYTES, byte_length, GST_FORMAT_TIME, &duration))
- return duration / 100;
-
- ERR("Failed to query duration.\n");
- return 0;
-}
-
static HRESULT CDECL wg_parser_connect(struct wg_parser *parser, uint64_t file_size)
{
GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE("quartz_src",
@@ -1552,6 +1532,7 @@ static HRESULT CDECL wg_parser_connect(struct wg_parser *parser, uint64_t file_s
for (i = 0; i < parser->stream_count; ++i)
{
struct wg_parser_stream *stream = parser->streams[i];
+ gint64 duration, byte_length;
while (!stream->has_caps && !parser->error)
pthread_cond_wait(&parser->init_cond, &parser->mutex);
@@ -1565,7 +1546,28 @@ static HRESULT CDECL wg_parser_connect(struct wg_parser *parser, uint64_t file_s
* avidemux, wavparse, qtdemux) in practice record duration before
* fixing caps, so as a heuristic, wait until we get caps before trying
* to query for duration. */
- stream->duration = query_duration(stream->their_src);
+ if (gst_pad_query_duration(stream->their_src, GST_FORMAT_TIME, &duration))
+ {
+ stream->duration = duration / 100;
+ }
+ else
+ {
+ WARN("Failed to query time duration; trying to convert from byte length.\n");
+
+ /* To accurately get a duration for the stream, we want to only consider the
+ * length of that stream. Hence, query for the pad duration, instead of
+ * using the file duration. */
+ if (gst_pad_query_duration(stream->their_src, GST_FORMAT_BYTES, &byte_length)
+ && gst_pad_query_convert(stream->their_src, GST_FORMAT_BYTES, byte_length,
+ GST_FORMAT_TIME, &duration))
+ {
+ stream->duration = duration / 100;
+ }
+ else
+ {
+ ERR("Failed to query duration.\n");
+ }
+ }
}
pthread_mutex_unlock(&parser->mutex);
--
2.25.1
2
9
12 Jul '21
We tag far fewer symbols this way.
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
configure.ac | 1 +
include/private/vkd3d_common.h | 6 +
include/private/vkd3d_debug.h | 19 ++-
include/private/vkd3d_memory.h | 3 +-
include/private/vkd3d_utf8.h | 2 +-
libs/vkd3d-common/debug.c | 2 +-
libs/vkd3d-shader/dxbc.c | 6 +-
libs/vkd3d-shader/vkd3d_shader_main.c | 24 +--
libs/vkd3d-shader/vkd3d_shader_private.h | 48 +++---
libs/vkd3d-utils/vkd3d_utils_main.c | 22 +--
libs/vkd3d/command.c | 6 +-
libs/vkd3d/device.c | 16 +-
libs/vkd3d/resource.c | 6 +-
libs/vkd3d/utils.c | 4 +-
libs/vkd3d/vkd3d_main.c | 10 +-
libs/vkd3d/vkd3d_private.h | 188 +++++++++++------------
16 files changed, 184 insertions(+), 179 deletions(-)
diff --git a/configure.ac b/configure.ac
index d5f6588..e9c135a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -47,6 +47,7 @@ AC_SUBST([VKD3D_CFLAGS])
AS_IF([test "x${GCC}" = "xyes"],
[VKD3D_CFLAGS="-Wall -pipe"
VKD3D_CHECK_CFLAGS([-std=c99])
+ VKD3D_CHECK_CFLAGS([-fvisibility=hidden])
VKD3D_CHECK_CFLAGS([-Wdeclaration-after-statement])
VKD3D_CHECK_CFLAGS([-Wimplicit-fallthrough])
VKD3D_CHECK_CFLAGS([-Wmissing-prototypes])
diff --git a/include/private/vkd3d_common.h b/include/private/vkd3d_common.h
index ac217e9..fd62ae8 100644
--- a/include/private/vkd3d_common.h
+++ b/include/private/vkd3d_common.h
@@ -53,6 +53,12 @@ static inline size_t align(size_t addr, size_t alignment)
# define VKD3D_UNUSED
#endif /* __GNUC__ */
+#if defined(__GNUC__) && !defined(__MINGW32__)
+# define VKD3D_API __attribute__((visibility("default")))
+#else
+# define VKD3D_API
+#endif
+
static inline unsigned int vkd3d_popcount(unsigned int v)
{
#ifdef _MSC_VER
diff --git a/include/private/vkd3d_debug.h b/include/private/vkd3d_debug.h
index c37c841..a206a92 100644
--- a/include/private/vkd3d_debug.h
+++ b/include/private/vkd3d_debug.h
@@ -44,15 +44,14 @@ enum vkd3d_dbg_level
VKD3D_DBG_LEVEL_TRACE,
};
-enum vkd3d_dbg_level vkd3d_dbg_get_level(void) DECLSPEC_HIDDEN;
+enum vkd3d_dbg_level vkd3d_dbg_get_level(void);
-void vkd3d_dbg_printf(enum vkd3d_dbg_level level, const char *function,
- const char *fmt, ...) VKD3D_PRINTF_FUNC(3, 4) DECLSPEC_HIDDEN;
+void vkd3d_dbg_printf(enum vkd3d_dbg_level level, const char *function, const char *fmt, ...) VKD3D_PRINTF_FUNC(3, 4);
-const char *vkd3d_dbg_sprintf(const char *fmt, ...) VKD3D_PRINTF_FUNC(1, 2) DECLSPEC_HIDDEN;
-const char *vkd3d_dbg_vsprintf(const char *fmt, va_list args) DECLSPEC_HIDDEN;
-const char *debugstr_a(const char *str) DECLSPEC_HIDDEN;
-const char *debugstr_w(const WCHAR *wstr, size_t wchar_size) DECLSPEC_HIDDEN;
+const char *vkd3d_dbg_sprintf(const char *fmt, ...) VKD3D_PRINTF_FUNC(1, 2);
+const char *vkd3d_dbg_vsprintf(const char *fmt, va_list args);
+const char *debugstr_a(const char *str);
+const char *debugstr_w(const WCHAR *wstr, size_t wchar_size);
#define VKD3D_DBG_LOG(level) \
do { \
@@ -103,7 +102,7 @@ static inline const char *debugstr_guid(const GUID *guid)
guid->Data4[5], guid->Data4[6], guid->Data4[7]);
}
-unsigned int vkd3d_env_var_as_uint(const char *name, unsigned int default_value) DECLSPEC_HIDDEN;
+unsigned int vkd3d_env_var_as_uint(const char *name, unsigned int default_value);
struct vkd3d_debug_option
{
@@ -111,8 +110,8 @@ struct vkd3d_debug_option
uint64_t flag;
};
-bool vkd3d_debug_list_has_member(const char *string, const char *member) DECLSPEC_HIDDEN;
+bool vkd3d_debug_list_has_member(const char *string, const char *member);
uint64_t vkd3d_parse_debug_options(const char *string,
- const struct vkd3d_debug_option *options, unsigned int option_count) DECLSPEC_HIDDEN;
+ const struct vkd3d_debug_option *options, unsigned int option_count);
#endif /* __VKD3D_DEBUG_H */
diff --git a/include/private/vkd3d_memory.h b/include/private/vkd3d_memory.h
index df93abf..8bbc691 100644
--- a/include/private/vkd3d_memory.h
+++ b/include/private/vkd3d_memory.h
@@ -54,7 +54,6 @@ static inline void vkd3d_free(void *ptr)
free(ptr);
}
-bool vkd3d_array_reserve(void **elements, size_t *capacity,
- size_t element_count, size_t element_size) DECLSPEC_HIDDEN;
+bool vkd3d_array_reserve(void **elements, size_t *capacity, size_t element_count, size_t element_size);
#endif /* __VKD3D_MEMORY_H */
diff --git a/include/private/vkd3d_utf8.h b/include/private/vkd3d_utf8.h
index ab32884..ccb9e17 100644
--- a/include/private/vkd3d_utf8.h
+++ b/include/private/vkd3d_utf8.h
@@ -21,6 +21,6 @@
#include "vkd3d_common.h"
-char *vkd3d_strdup_w_utf8(const WCHAR *wstr, size_t wchar_size) DECLSPEC_HIDDEN;
+char *vkd3d_strdup_w_utf8(const WCHAR *wstr, size_t wchar_size);
#endif /* __VKD3D_UTF8_H */
diff --git a/libs/vkd3d-common/debug.c b/libs/vkd3d-common/debug.c
index 33deed6..a4d5a3d 100644
--- a/libs/vkd3d-common/debug.c
+++ b/libs/vkd3d-common/debug.c
@@ -31,7 +31,7 @@
#define VKD3D_DEBUG_BUFFER_COUNT 64
#define VKD3D_DEBUG_BUFFER_SIZE 512
-extern const char *vkd3d_dbg_env_name DECLSPEC_HIDDEN;
+extern const char *vkd3d_dbg_env_name;
static const char *debug_level_names[] =
{
diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c
index 973a80d..231c48b 100644
--- a/libs/vkd3d-shader/dxbc.c
+++ b/libs/vkd3d-shader/dxbc.c
@@ -2726,7 +2726,7 @@ static int rts0_handler(const char *data, DWORD data_size, DWORD tag, void *cont
return shader_parse_root_signature(data, data_size, desc);
}
-int vkd3d_shader_parse_root_signature(const struct vkd3d_shader_code *dxbc,
+VKD3D_API int vkd3d_shader_parse_root_signature(const struct vkd3d_shader_code *dxbc,
struct vkd3d_shader_versioned_root_signature_desc *root_signature, char **messages)
{
struct vkd3d_shader_message_context message_context;
@@ -3288,7 +3288,7 @@ static int validate_root_signature_desc(const struct vkd3d_shader_versioned_root
return ret;
}
-int vkd3d_shader_serialize_root_signature(const struct vkd3d_shader_versioned_root_signature_desc *root_signature,
+VKD3D_API int vkd3d_shader_serialize_root_signature(const struct vkd3d_shader_versioned_root_signature_desc *root_signature,
struct vkd3d_shader_code *dxbc, char **messages)
{
struct root_signature_writer_context context;
@@ -3592,7 +3592,7 @@ fail:
return ret;
}
-int vkd3d_shader_convert_root_signature(struct vkd3d_shader_versioned_root_signature_desc *dst,
+VKD3D_API int vkd3d_shader_convert_root_signature(struct vkd3d_shader_versioned_root_signature_desc *dst,
enum vkd3d_shader_root_signature_version version, const struct vkd3d_shader_versioned_root_signature_desc *src)
{
int ret;
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c
index 16d895f..4d49eef 100644
--- a/libs/vkd3d-shader/vkd3d_shader_main.c
+++ b/libs/vkd3d-shader/vkd3d_shader_main.c
@@ -292,14 +292,14 @@ static int vkd3d_shader_validate_compile_info(const struct vkd3d_shader_compile_
return VKD3D_OK;
}
-void vkd3d_shader_free_messages(char *messages)
+VKD3D_API void vkd3d_shader_free_messages(char *messages)
{
TRACE("messages %p.\n", messages);
vkd3d_free(messages);
}
-int vkd3d_shader_compile(const struct vkd3d_shader_compile_info *compile_info,
+VKD3D_API int vkd3d_shader_compile(const struct vkd3d_shader_compile_info *compile_info,
struct vkd3d_shader_code *out, char **messages)
{
struct vkd3d_shader_scan_descriptor_info scan_descriptor_info;
@@ -837,7 +837,7 @@ static int vkd3d_shader_scan_instruction(struct vkd3d_shader_scan_context *conte
return VKD3D_OK;
}
-int vkd3d_shader_scan(const struct vkd3d_shader_compile_info *compile_info, char **messages)
+VKD3D_API int vkd3d_shader_scan(const struct vkd3d_shader_compile_info *compile_info, char **messages)
{
struct vkd3d_shader_scan_descriptor_info *scan_descriptor_info;
struct vkd3d_shader_message_context *message_context;
@@ -912,14 +912,14 @@ done:
return ret;
}
-void vkd3d_shader_free_scan_descriptor_info(struct vkd3d_shader_scan_descriptor_info *scan_descriptor_info)
+VKD3D_API void vkd3d_shader_free_scan_descriptor_info(struct vkd3d_shader_scan_descriptor_info *scan_descriptor_info)
{
TRACE("scan_descriptor_info %p.\n", scan_descriptor_info);
vkd3d_free(scan_descriptor_info->descriptors);
}
-void vkd3d_shader_free_shader_code(struct vkd3d_shader_code *shader_code)
+VKD3D_API void vkd3d_shader_free_shader_code(struct vkd3d_shader_code *shader_code)
{
TRACE("shader_code %p.\n", shader_code);
@@ -960,7 +960,7 @@ static void vkd3d_shader_free_root_signature_v_1_1(struct vkd3d_shader_root_sign
memset(root_signature, 0, sizeof(*root_signature));
}
-void vkd3d_shader_free_root_signature(struct vkd3d_shader_versioned_root_signature_desc *desc)
+VKD3D_API void vkd3d_shader_free_root_signature(struct vkd3d_shader_versioned_root_signature_desc *desc)
{
TRACE("desc %p.\n", desc);
@@ -981,7 +981,7 @@ void vkd3d_shader_free_root_signature(struct vkd3d_shader_versioned_root_signatu
desc->version = 0;
}
-int vkd3d_shader_parse_input_signature(const struct vkd3d_shader_code *dxbc,
+VKD3D_API int vkd3d_shader_parse_input_signature(const struct vkd3d_shader_code *dxbc,
struct vkd3d_shader_signature *signature, char **messages)
{
struct vkd3d_shader_message_context message_context;
@@ -1004,7 +1004,7 @@ int vkd3d_shader_parse_input_signature(const struct vkd3d_shader_code *dxbc,
return ret;
}
-struct vkd3d_shader_signature_element *vkd3d_shader_find_signature_element(
+VKD3D_API struct vkd3d_shader_signature_element *vkd3d_shader_find_signature_element(
const struct vkd3d_shader_signature *signature, const char *semantic_name,
unsigned int semantic_index, unsigned int stream_index)
{
@@ -1026,7 +1026,7 @@ struct vkd3d_shader_signature_element *vkd3d_shader_find_signature_element(
return NULL;
}
-void vkd3d_shader_free_shader_signature(struct vkd3d_shader_signature *signature)
+VKD3D_API void vkd3d_shader_free_shader_signature(struct vkd3d_shader_signature *signature)
{
TRACE("signature %p.\n", signature);
@@ -1034,7 +1034,7 @@ void vkd3d_shader_free_shader_signature(struct vkd3d_shader_signature *signature
signature->elements = NULL;
}
-const char *vkd3d_shader_get_version(unsigned int *major, unsigned int *minor)
+VKD3D_API const char *vkd3d_shader_get_version(unsigned int *major, unsigned int *minor)
{
int x, y;
@@ -1052,7 +1052,7 @@ const char *vkd3d_shader_get_version(unsigned int *major, unsigned int *minor)
return "vkd3d-shader " PACKAGE_VERSION VKD3D_VCS_ID;
}
-const enum vkd3d_shader_source_type *vkd3d_shader_get_supported_source_types(unsigned int *count)
+VKD3D_API const enum vkd3d_shader_source_type *vkd3d_shader_get_supported_source_types(unsigned int *count)
{
static const enum vkd3d_shader_source_type types[] =
{
@@ -1065,7 +1065,7 @@ const enum vkd3d_shader_source_type *vkd3d_shader_get_supported_source_types(uns
return types;
}
-const enum vkd3d_shader_target_type *vkd3d_shader_get_supported_target_types(
+VKD3D_API const enum vkd3d_shader_target_type *vkd3d_shader_get_supported_target_types(
enum vkd3d_shader_source_type source_type, unsigned int *count)
{
static const enum vkd3d_shader_target_type dxbc_tpf_types[] =
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
index 1acb01f..1291148 100644
--- a/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -809,18 +809,18 @@ static inline bool vkd3d_shader_register_is_output(const struct vkd3d_shader_reg
return reg->type == VKD3DSPR_OUTPUT || reg->type == VKD3DSPR_COLOROUT;
}
-void vkd3d_shader_trace(void *data) DECLSPEC_HIDDEN;
+void vkd3d_shader_trace(void *data);
-const char *shader_get_type_prefix(enum vkd3d_shader_type type) DECLSPEC_HIDDEN;
+const char *shader_get_type_prefix(enum vkd3d_shader_type type);
void *shader_sm4_init(const DWORD *byte_code, size_t byte_code_size,
- const struct vkd3d_shader_signature *output_signature) DECLSPEC_HIDDEN;
-void shader_sm4_free(void *data) DECLSPEC_HIDDEN;
+ const struct vkd3d_shader_signature *output_signature);
+void shader_sm4_free(void *data);
void shader_sm4_read_header(void *data, const DWORD **ptr,
- struct vkd3d_shader_version *shader_version) DECLSPEC_HIDDEN;
+ struct vkd3d_shader_version *shader_version);
void shader_sm4_read_instruction(void *data, const DWORD **ptr,
- struct vkd3d_shader_instruction *ins) DECLSPEC_HIDDEN;
-bool shader_sm4_is_end(void *data, const DWORD **ptr) DECLSPEC_HIDDEN;
+ struct vkd3d_shader_instruction *ins);
+bool shader_sm4_is_end(void *data, const DWORD **ptr);
struct vkd3d_string_buffer
{
@@ -829,9 +829,9 @@ struct vkd3d_string_buffer
unsigned int content_size;
};
-void vkd3d_string_buffer_cleanup(struct vkd3d_string_buffer *buffer) DECLSPEC_HIDDEN;
-bool vkd3d_string_buffer_init(struct vkd3d_string_buffer *buffer) DECLSPEC_HIDDEN;
-int vkd3d_string_buffer_vprintf(struct vkd3d_string_buffer *buffer, const char *format, va_list args) DECLSPEC_HIDDEN;
+void vkd3d_string_buffer_cleanup(struct vkd3d_string_buffer *buffer);
+bool vkd3d_string_buffer_init(struct vkd3d_string_buffer *buffer);
+int vkd3d_string_buffer_vprintf(struct vkd3d_string_buffer *buffer, const char *format, va_list args);
struct vkd3d_shader_message_context
{
@@ -841,39 +841,39 @@ struct vkd3d_shader_message_context
struct vkd3d_string_buffer messages;
};
-void vkd3d_shader_message_context_cleanup(struct vkd3d_shader_message_context *context) DECLSPEC_HIDDEN;
-char *vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context) DECLSPEC_HIDDEN;
+void vkd3d_shader_message_context_cleanup(struct vkd3d_shader_message_context *context);
+char *vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context);
bool vkd3d_shader_message_context_init(struct vkd3d_shader_message_context *context,
- enum vkd3d_shader_log_level log_level, const char *source_name) DECLSPEC_HIDDEN;
+ enum vkd3d_shader_log_level log_level, const char *source_name);
void vkd3d_shader_message_context_trace_messages_(const struct vkd3d_shader_message_context *context,
- const char *function) DECLSPEC_HIDDEN;
+ const char *function);
#define vkd3d_shader_message_context_trace_messages(context) \
vkd3d_shader_message_context_trace_messages_(context, __FUNCTION__)
void vkd3d_shader_error(struct vkd3d_shader_message_context *context, enum vkd3d_shader_error error,
- const char *format, ...) VKD3D_PRINTF_FUNC(3, 4) DECLSPEC_HIDDEN;
+ const char *format, ...) VKD3D_PRINTF_FUNC(3, 4);
void vkd3d_shader_verror(struct vkd3d_shader_message_context *context,
- enum vkd3d_shader_error error, const char *format, va_list args) DECLSPEC_HIDDEN;
+ enum vkd3d_shader_error error, const char *format, va_list args);
int shader_extract_from_dxbc(const void *dxbc, size_t dxbc_length,
- struct vkd3d_shader_message_context *message_context, struct vkd3d_shader_desc *desc) DECLSPEC_HIDDEN;
-void free_shader_desc(struct vkd3d_shader_desc *desc) DECLSPEC_HIDDEN;
+ struct vkd3d_shader_message_context *message_context, struct vkd3d_shader_desc *desc);
+void free_shader_desc(struct vkd3d_shader_desc *desc);
int shader_parse_input_signature(const void *dxbc, size_t dxbc_length,
- struct vkd3d_shader_message_context *message_context, struct vkd3d_shader_signature *signature) DECLSPEC_HIDDEN;
+ struct vkd3d_shader_message_context *message_context, struct vkd3d_shader_signature *signature);
struct vkd3d_dxbc_compiler;
struct vkd3d_dxbc_compiler *vkd3d_dxbc_compiler_create(const struct vkd3d_shader_version *shader_version,
const struct vkd3d_shader_desc *shader_desc, const struct vkd3d_shader_compile_info *compile_info,
const struct vkd3d_shader_scan_descriptor_info *scan_descriptor_info,
- struct vkd3d_shader_message_context *message_context) DECLSPEC_HIDDEN;
+ struct vkd3d_shader_message_context *message_context);
int vkd3d_dxbc_compiler_handle_instruction(struct vkd3d_dxbc_compiler *compiler,
- const struct vkd3d_shader_instruction *instruction) DECLSPEC_HIDDEN;
+ const struct vkd3d_shader_instruction *instruction);
int vkd3d_dxbc_compiler_generate_spirv(struct vkd3d_dxbc_compiler *compiler,
- const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *spirv) DECLSPEC_HIDDEN;
-void vkd3d_dxbc_compiler_destroy(struct vkd3d_dxbc_compiler *compiler) DECLSPEC_HIDDEN;
+ const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *spirv);
+void vkd3d_dxbc_compiler_destroy(struct vkd3d_dxbc_compiler *compiler);
-void vkd3d_compute_dxbc_checksum(const void *dxbc, size_t size, uint32_t checksum[4]) DECLSPEC_HIDDEN;
+void vkd3d_compute_dxbc_checksum(const void *dxbc, size_t size, uint32_t checksum[4]);
static inline enum vkd3d_shader_component_type vkd3d_component_type_from_data_type(
enum vkd3d_data_type data_type)
diff --git a/libs/vkd3d-utils/vkd3d_utils_main.c b/libs/vkd3d-utils/vkd3d_utils_main.c
index c19fe7f..b64693e 100644
--- a/libs/vkd3d-utils/vkd3d_utils_main.c
+++ b/libs/vkd3d-utils/vkd3d_utils_main.c
@@ -21,14 +21,14 @@
VKD3D_DEBUG_ENV_NAME("VKD3D_DEBUG");
-HRESULT WINAPI D3D12GetDebugInterface(REFIID iid, void **debug)
+VKD3D_API HRESULT WINAPI D3D12GetDebugInterface(REFIID iid, void **debug)
{
FIXME("iid %s, debug %p stub!\n", debugstr_guid(iid), debug);
return E_NOTIMPL;
}
-HRESULT WINAPI D3D12CreateDeviceVKD3D(IUnknown *adapter, D3D_FEATURE_LEVEL minimum_feature_level,
+VKD3D_API HRESULT WINAPI D3D12CreateDeviceVKD3D(IUnknown *adapter, D3D_FEATURE_LEVEL minimum_feature_level,
REFIID iid, void **device, enum vkd3d_api_version api_version)
{
struct vkd3d_optional_instance_extensions_info optional_extensions_info;
@@ -85,13 +85,13 @@ HRESULT WINAPI D3D12CreateDeviceVKD3D(IUnknown *adapter, D3D_FEATURE_LEVEL minim
return vkd3d_create_device(&device_create_info, iid, device);
}
-HRESULT WINAPI D3D12CreateDevice(IUnknown *adapter,
+VKD3D_API HRESULT WINAPI D3D12CreateDevice(IUnknown *adapter,
D3D_FEATURE_LEVEL minimum_feature_level, REFIID iid, void **device)
{
return D3D12CreateDeviceVKD3D(adapter, minimum_feature_level, iid, device, VKD3D_API_VERSION_1_0);
}
-HRESULT WINAPI D3D12CreateRootSignatureDeserializer(const void *data, SIZE_T data_size,
+VKD3D_API HRESULT WINAPI D3D12CreateRootSignatureDeserializer(const void *data, SIZE_T data_size,
REFIID iid, void **deserializer)
{
TRACE("data %p, data_size %lu, iid %s, deserializer %p.\n",
@@ -100,7 +100,7 @@ HRESULT WINAPI D3D12CreateRootSignatureDeserializer(const void *data, SIZE_T dat
return vkd3d_create_root_signature_deserializer(data, data_size, iid, deserializer);
}
-HRESULT WINAPI D3D12CreateVersionedRootSignatureDeserializer(const void *data, SIZE_T data_size,
+VKD3D_API HRESULT WINAPI D3D12CreateVersionedRootSignatureDeserializer(const void *data, SIZE_T data_size,
REFIID iid,void **deserializer)
{
TRACE("data %p, data_size %lu, iid %s, deserializer %p.\n",
@@ -109,7 +109,7 @@ HRESULT WINAPI D3D12CreateVersionedRootSignatureDeserializer(const void *data, S
return vkd3d_create_versioned_root_signature_deserializer(data, data_size, iid, deserializer);
}
-HRESULT WINAPI D3D12SerializeRootSignature(const D3D12_ROOT_SIGNATURE_DESC *desc,
+VKD3D_API HRESULT WINAPI D3D12SerializeRootSignature(const D3D12_ROOT_SIGNATURE_DESC *desc,
D3D_ROOT_SIGNATURE_VERSION version, ID3DBlob **blob, ID3DBlob **error_blob)
{
TRACE("desc %p, version %#x, blob %p, error_blob %p.\n", desc, version, blob, error_blob);
@@ -117,7 +117,7 @@ HRESULT WINAPI D3D12SerializeRootSignature(const D3D12_ROOT_SIGNATURE_DESC *desc
return vkd3d_serialize_root_signature(desc, version, blob, error_blob);
}
-HRESULT WINAPI D3D12SerializeVersionedRootSignature(const D3D12_VERSIONED_ROOT_SIGNATURE_DESC *desc,
+VKD3D_API HRESULT WINAPI D3D12SerializeVersionedRootSignature(const D3D12_VERSIONED_ROOT_SIGNATURE_DESC *desc,
ID3DBlob **blob, ID3DBlob **error_blob)
{
TRACE("desc %p, blob %p, error_blob %p.\n", desc, blob, error_blob);
@@ -126,7 +126,7 @@ HRESULT WINAPI D3D12SerializeVersionedRootSignature(const D3D12_VERSIONED_ROOT_S
}
/* Events */
-HANDLE vkd3d_create_event(void)
+VKD3D_API HANDLE vkd3d_create_event(void)
{
struct vkd3d_event *event;
int rc;
@@ -157,7 +157,7 @@ HANDLE vkd3d_create_event(void)
return event;
}
-unsigned int vkd3d_wait_event(HANDLE event, unsigned int milliseconds)
+VKD3D_API unsigned int vkd3d_wait_event(HANDLE event, unsigned int milliseconds)
{
struct vkd3d_event *impl = event;
int rc;
@@ -200,7 +200,7 @@ unsigned int vkd3d_wait_event(HANDLE event, unsigned int milliseconds)
return VKD3D_WAIT_FAILED;
}
-HRESULT vkd3d_signal_event(HANDLE event)
+VKD3D_API HRESULT vkd3d_signal_event(HANDLE event)
{
struct vkd3d_event *impl = event;
int rc;
@@ -219,7 +219,7 @@ HRESULT vkd3d_signal_event(HANDLE event)
return S_OK;
}
-void vkd3d_destroy_event(HANDLE event)
+VKD3D_API void vkd3d_destroy_event(HANDLE event)
{
struct vkd3d_event *impl = event;
int rc;
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index e5c6791..4ff510a 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -6251,21 +6251,21 @@ HRESULT d3d12_command_queue_create(struct d3d12_device *device,
return S_OK;
}
-uint32_t vkd3d_get_vk_queue_family_index(ID3D12CommandQueue *queue)
+VKD3D_API uint32_t vkd3d_get_vk_queue_family_index(ID3D12CommandQueue *queue)
{
struct d3d12_command_queue *d3d12_queue = impl_from_ID3D12CommandQueue(queue);
return d3d12_queue->vkd3d_queue->vk_family_index;
}
-VkQueue vkd3d_acquire_vk_queue(ID3D12CommandQueue *queue)
+VKD3D_API VkQueue vkd3d_acquire_vk_queue(ID3D12CommandQueue *queue)
{
struct d3d12_command_queue *d3d12_queue = impl_from_ID3D12CommandQueue(queue);
return vkd3d_queue_acquire(d3d12_queue->vkd3d_queue);
}
-void vkd3d_release_vk_queue(ID3D12CommandQueue *queue)
+VKD3D_API void vkd3d_release_vk_queue(ID3D12CommandQueue *queue)
{
struct d3d12_command_queue *d3d12_queue = impl_from_ID3D12CommandQueue(queue);
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index bef6477..38d3d56 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -589,7 +589,7 @@ static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance,
return S_OK;
}
-HRESULT vkd3d_create_instance(const struct vkd3d_instance_create_info *create_info,
+VKD3D_API HRESULT vkd3d_create_instance(const struct vkd3d_instance_create_info *create_info,
struct vkd3d_instance **instance)
{
struct vkd3d_instance *object;
@@ -637,7 +637,7 @@ static void vkd3d_destroy_instance(struct vkd3d_instance *instance)
vkd3d_free(instance);
}
-ULONG vkd3d_instance_incref(struct vkd3d_instance *instance)
+VKD3D_API ULONG vkd3d_instance_incref(struct vkd3d_instance *instance)
{
ULONG refcount = InterlockedIncrement(&instance->refcount);
@@ -646,7 +646,7 @@ ULONG vkd3d_instance_incref(struct vkd3d_instance *instance)
return refcount;
}
-ULONG vkd3d_instance_decref(struct vkd3d_instance *instance)
+VKD3D_API ULONG vkd3d_instance_decref(struct vkd3d_instance *instance)
{
ULONG refcount = InterlockedDecrement(&instance->refcount);
@@ -658,7 +658,7 @@ ULONG vkd3d_instance_decref(struct vkd3d_instance *instance)
return refcount;
}
-VkInstance vkd3d_instance_get_vk_instance(struct vkd3d_instance *instance)
+VKD3D_API VkInstance vkd3d_instance_get_vk_instance(struct vkd3d_instance *instance)
{
return instance->vk_instance;
}
@@ -3828,28 +3828,28 @@ HRESULT vkd3d_join_thread(struct vkd3d_instance *instance, union vkd3d_thread_ha
return hr;
}
-IUnknown *vkd3d_get_device_parent(ID3D12Device *device)
+VKD3D_API IUnknown *vkd3d_get_device_parent(ID3D12Device *device)
{
struct d3d12_device *d3d12_device = impl_from_ID3D12Device(device);
return d3d12_device->parent;
}
-VkDevice vkd3d_get_vk_device(ID3D12Device *device)
+VKD3D_API VkDevice vkd3d_get_vk_device(ID3D12Device *device)
{
struct d3d12_device *d3d12_device = impl_from_ID3D12Device(device);
return d3d12_device->vk_device;
}
-VkPhysicalDevice vkd3d_get_vk_physical_device(ID3D12Device *device)
+VKD3D_API VkPhysicalDevice vkd3d_get_vk_physical_device(ID3D12Device *device)
{
struct d3d12_device *d3d12_device = impl_from_ID3D12Device(device);
return d3d12_device->vk_physical_device;
}
-struct vkd3d_instance *vkd3d_instance_from_device(ID3D12Device *device)
+VKD3D_API struct vkd3d_instance *vkd3d_instance_from_device(ID3D12Device *device)
{
struct d3d12_device *d3d12_device = impl_from_ID3D12Device(device);
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index a9d4d46..a432806 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -1983,7 +1983,7 @@ HRESULT d3d12_reserved_resource_create(struct d3d12_device *device,
return S_OK;
}
-HRESULT vkd3d_create_image_resource(ID3D12Device *device,
+VKD3D_API HRESULT vkd3d_create_image_resource(ID3D12Device *device,
const struct vkd3d_image_resource_create_info *create_info, ID3D12Resource **resource)
{
struct d3d12_device *d3d12_device = unsafe_impl_from_ID3D12Device(device);
@@ -2035,13 +2035,13 @@ HRESULT vkd3d_create_image_resource(ID3D12Device *device,
return S_OK;
}
-ULONG vkd3d_resource_incref(ID3D12Resource *resource)
+VKD3D_API ULONG vkd3d_resource_incref(ID3D12Resource *resource)
{
TRACE("resource %p.\n", resource);
return d3d12_resource_incref(impl_from_ID3D12Resource(resource));
}
-ULONG vkd3d_resource_decref(ID3D12Resource *resource)
+VKD3D_API ULONG vkd3d_resource_decref(ID3D12Resource *resource)
{
TRACE("resource %p.\n", resource);
return d3d12_resource_decref(impl_from_ID3D12Resource(resource));
diff --git a/libs/vkd3d/utils.c b/libs/vkd3d/utils.c
index 7abfd42..ea11f3a 100644
--- a/libs/vkd3d/utils.c
+++ b/libs/vkd3d/utils.c
@@ -506,7 +506,7 @@ void vkd3d_format_copy_data(const struct vkd3d_format *format, const uint8_t *sr
}
}
-VkFormat vkd3d_get_vk_format(DXGI_FORMAT format)
+VKD3D_API VkFormat vkd3d_get_vk_format(DXGI_FORMAT format)
{
const struct vkd3d_format *vkd3d_format;
@@ -516,7 +516,7 @@ VkFormat vkd3d_get_vk_format(DXGI_FORMAT format)
return vkd3d_format->vk_format;
}
-DXGI_FORMAT vkd3d_get_dxgi_format(VkFormat format)
+VKD3D_API DXGI_FORMAT vkd3d_get_dxgi_format(VkFormat format)
{
DXGI_FORMAT dxgi_format;
VkFormat vk_format;
diff --git a/libs/vkd3d/vkd3d_main.c b/libs/vkd3d/vkd3d_main.c
index 327cdf8..4c0d6c5 100644
--- a/libs/vkd3d/vkd3d_main.c
+++ b/libs/vkd3d/vkd3d_main.c
@@ -21,7 +21,7 @@
VKD3D_DEBUG_ENV_NAME("VKD3D_DEBUG");
-HRESULT vkd3d_create_device(const struct vkd3d_device_create_info *create_info,
+VKD3D_API HRESULT vkd3d_create_device(const struct vkd3d_device_create_info *create_info,
REFIID iid, void **device)
{
struct vkd3d_instance *instance;
@@ -216,7 +216,7 @@ static HRESULT d3d12_root_signature_deserializer_init(struct d3d12_root_signatur
return S_OK;
}
-HRESULT vkd3d_create_root_signature_deserializer(const void *data, SIZE_T data_size,
+VKD3D_API HRESULT vkd3d_create_root_signature_deserializer(const void *data, SIZE_T data_size,
REFIID iid, void **deserializer)
{
struct vkd3d_shader_code dxbc = {data, data_size};
@@ -400,7 +400,7 @@ static HRESULT d3d12_versioned_root_signature_deserializer_init(struct d3d12_ver
return S_OK;
}
-HRESULT vkd3d_create_versioned_root_signature_deserializer(const void *data, SIZE_T data_size,
+VKD3D_API HRESULT vkd3d_create_versioned_root_signature_deserializer(const void *data, SIZE_T data_size,
REFIID iid, void **deserializer)
{
struct d3d12_versioned_root_signature_deserializer *object;
@@ -537,7 +537,7 @@ static HRESULT d3d_blob_create(void *buffer, SIZE_T size, struct d3d_blob **blob
return S_OK;
}
-HRESULT vkd3d_serialize_root_signature(const D3D12_ROOT_SIGNATURE_DESC *desc,
+VKD3D_API HRESULT vkd3d_serialize_root_signature(const D3D12_ROOT_SIGNATURE_DESC *desc,
D3D_ROOT_SIGNATURE_VERSION version, ID3DBlob **blob, ID3DBlob **error_blob)
{
struct vkd3d_shader_versioned_root_signature_desc vkd3d_desc;
@@ -592,7 +592,7 @@ HRESULT vkd3d_serialize_root_signature(const D3D12_ROOT_SIGNATURE_DESC *desc,
return S_OK;
}
-HRESULT vkd3d_serialize_versioned_root_signature(const D3D12_VERSIONED_ROOT_SIGNATURE_DESC *desc,
+VKD3D_API HRESULT vkd3d_serialize_versioned_root_signature(const D3D12_VERSIONED_ROOT_SIGNATURE_DESC *desc,
ID3DBlob **blob, ID3DBlob **error_blob)
{
const struct vkd3d_shader_versioned_root_signature_desc *vkd3d_desc;
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 9f0982d..54077f9 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -82,9 +82,9 @@ struct vkd3d_vk_device_procs
};
#undef DECLARE_VK_PFN
-HRESULT hresult_from_errno(int rc) DECLSPEC_HIDDEN;
-HRESULT hresult_from_vk_result(VkResult vr) DECLSPEC_HIDDEN;
-HRESULT hresult_from_vkd3d_result(int vkd3d_result) DECLSPEC_HIDDEN;
+HRESULT hresult_from_errno(int rc);
+HRESULT hresult_from_vk_result(VkResult vr);
+HRESULT hresult_from_vkd3d_result(int vkd3d_result);
struct vkd3d_vulkan_info
{
@@ -161,8 +161,8 @@ union vkd3d_thread_handle
};
HRESULT vkd3d_create_thread(struct vkd3d_instance *instance,
- PFN_vkd3d_thread thread_main, void *data, union vkd3d_thread_handle *thread) DECLSPEC_HIDDEN;
-HRESULT vkd3d_join_thread(struct vkd3d_instance *instance, union vkd3d_thread_handle *thread) DECLSPEC_HIDDEN;
+ PFN_vkd3d_thread thread_main, void *data, union vkd3d_thread_handle *thread);
+HRESULT vkd3d_join_thread(struct vkd3d_instance *instance, union vkd3d_thread_handle *thread);
struct vkd3d_waiting_fence
{
@@ -199,9 +199,9 @@ struct vkd3d_fence_worker
};
HRESULT vkd3d_fence_worker_start(struct vkd3d_fence_worker *worker,
- struct d3d12_device *device) DECLSPEC_HIDDEN;
+ struct d3d12_device *device);
HRESULT vkd3d_fence_worker_stop(struct vkd3d_fence_worker *worker,
- struct d3d12_device *device) DECLSPEC_HIDDEN;
+ struct d3d12_device *device);
struct vkd3d_gpu_va_allocation
{
@@ -230,11 +230,11 @@ struct vkd3d_gpu_va_allocator
};
D3D12_GPU_VIRTUAL_ADDRESS vkd3d_gpu_va_allocator_allocate(struct vkd3d_gpu_va_allocator *allocator,
- size_t alignment, size_t size, void *ptr) DECLSPEC_HIDDEN;
+ size_t alignment, size_t size, void *ptr);
void *vkd3d_gpu_va_allocator_dereference(struct vkd3d_gpu_va_allocator *allocator,
- D3D12_GPU_VIRTUAL_ADDRESS address) DECLSPEC_HIDDEN;
+ D3D12_GPU_VIRTUAL_ADDRESS address);
void vkd3d_gpu_va_allocator_free(struct vkd3d_gpu_va_allocator *allocator,
- D3D12_GPU_VIRTUAL_ADDRESS address) DECLSPEC_HIDDEN;
+ D3D12_GPU_VIRTUAL_ADDRESS address);
struct vkd3d_render_pass_key
{
@@ -257,11 +257,11 @@ struct vkd3d_render_pass_cache
};
void vkd3d_render_pass_cache_cleanup(struct vkd3d_render_pass_cache *cache,
- struct d3d12_device *device) DECLSPEC_HIDDEN;
+ struct d3d12_device *device);
HRESULT vkd3d_render_pass_cache_find(struct vkd3d_render_pass_cache *cache,
struct d3d12_device *device, const struct vkd3d_render_pass_key *key,
- VkRenderPass *vk_render_pass) DECLSPEC_HIDDEN;
-void vkd3d_render_pass_cache_init(struct vkd3d_render_pass_cache *cache) DECLSPEC_HIDDEN;
+ VkRenderPass *vk_render_pass);
+void vkd3d_render_pass_cache_init(struct vkd3d_render_pass_cache *cache);
struct vkd3d_private_store
{
@@ -317,11 +317,11 @@ static inline void vkd3d_private_store_destroy(struct vkd3d_private_store *store
}
HRESULT vkd3d_get_private_data(struct vkd3d_private_store *store,
- const GUID *tag, unsigned int *out_size, void *out) DECLSPEC_HIDDEN;
+ const GUID *tag, unsigned int *out_size, void *out);
HRESULT vkd3d_set_private_data(struct vkd3d_private_store *store,
- const GUID *tag, unsigned int data_size, const void *data) DECLSPEC_HIDDEN;
+ const GUID *tag, unsigned int data_size, const void *data);
HRESULT vkd3d_set_private_data_interface(struct vkd3d_private_store *store,
- const GUID *tag, const IUnknown *object) DECLSPEC_HIDDEN;
+ const GUID *tag, const IUnknown *object);
struct vkd3d_signaled_semaphore
{
@@ -362,7 +362,7 @@ struct d3d12_fence
};
HRESULT d3d12_fence_create(struct d3d12_device *device,
- uint64_t initial_value, D3D12_FENCE_FLAGS flags, struct d3d12_fence **fence) DECLSPEC_HIDDEN;
+ uint64_t initial_value, D3D12_FENCE_FLAGS flags, struct d3d12_fence **fence);
/* ID3D12Heap */
struct d3d12_heap
@@ -386,8 +386,8 @@ struct d3d12_heap
};
HRESULT d3d12_heap_create(struct d3d12_device *device, const D3D12_HEAP_DESC *desc,
- const struct d3d12_resource *resource, struct d3d12_heap **heap) DECLSPEC_HIDDEN;
-struct d3d12_heap *unsafe_impl_from_ID3D12Heap(ID3D12Heap *iface) DECLSPEC_HIDDEN;
+ const struct d3d12_resource *resource, struct d3d12_heap **heap);
+struct d3d12_heap *unsafe_impl_from_ID3D12Heap(ID3D12Heap *iface);
#define VKD3D_RESOURCE_PUBLIC_FLAGS \
(VKD3D_RESOURCE_INITIAL_STATE_TRANSITION | VKD3D_RESOURCE_PRESENT_STATE_TRANSITION)
@@ -435,29 +435,29 @@ static inline bool d3d12_resource_is_texture(const struct d3d12_resource *resour
return resource->desc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER;
}
-bool d3d12_resource_is_cpu_accessible(const struct d3d12_resource *resource) DECLSPEC_HIDDEN;
-HRESULT d3d12_resource_validate_desc(const D3D12_RESOURCE_DESC *desc, struct d3d12_device *device) DECLSPEC_HIDDEN;
+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_committed_resource_create(struct d3d12_device *device,
const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_HEAP_FLAGS heap_flags,
const D3D12_RESOURCE_DESC *desc, D3D12_RESOURCE_STATES initial_state,
- const D3D12_CLEAR_VALUE *optimized_clear_value, struct d3d12_resource **resource) DECLSPEC_HIDDEN;
+ const D3D12_CLEAR_VALUE *optimized_clear_value, struct d3d12_resource **resource);
HRESULT d3d12_placed_resource_create(struct d3d12_device *device, struct d3d12_heap *heap, uint64_t heap_offset,
const D3D12_RESOURCE_DESC *desc, D3D12_RESOURCE_STATES initial_state,
- const D3D12_CLEAR_VALUE *optimized_clear_value, struct d3d12_resource **resource) DECLSPEC_HIDDEN;
+ const D3D12_CLEAR_VALUE *optimized_clear_value, struct d3d12_resource **resource);
HRESULT d3d12_reserved_resource_create(struct d3d12_device *device,
const D3D12_RESOURCE_DESC *desc, D3D12_RESOURCE_STATES initial_state,
- const D3D12_CLEAR_VALUE *optimized_clear_value, struct d3d12_resource **resource) DECLSPEC_HIDDEN;
-struct d3d12_resource *unsafe_impl_from_ID3D12Resource(ID3D12Resource *iface) DECLSPEC_HIDDEN;
+ const D3D12_CLEAR_VALUE *optimized_clear_value, struct d3d12_resource **resource);
+struct d3d12_resource *unsafe_impl_from_ID3D12Resource(ID3D12Resource *iface);
HRESULT vkd3d_allocate_buffer_memory(struct d3d12_device *device, VkBuffer vk_buffer,
const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_HEAP_FLAGS heap_flags,
- VkDeviceMemory *vk_memory, uint32_t *vk_memory_type, VkDeviceSize *vk_memory_size) DECLSPEC_HIDDEN;
+ VkDeviceMemory *vk_memory, uint32_t *vk_memory_type, VkDeviceSize *vk_memory_size);
HRESULT vkd3d_create_buffer(struct d3d12_device *device,
const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_HEAP_FLAGS heap_flags,
- const D3D12_RESOURCE_DESC *desc, VkBuffer *vk_buffer) DECLSPEC_HIDDEN;
+ const D3D12_RESOURCE_DESC *desc, VkBuffer *vk_buffer);
HRESULT vkd3d_get_image_allocation_info(struct d3d12_device *device,
- const D3D12_RESOURCE_DESC *desc, D3D12_RESOURCE_ALLOCATION_INFO *allocation_info) DECLSPEC_HIDDEN;
+ const D3D12_RESOURCE_DESC *desc, D3D12_RESOURCE_ALLOCATION_INFO *allocation_info);
enum vkd3d_view_type
{
@@ -495,8 +495,8 @@ struct vkd3d_view
} info;
};
-void vkd3d_view_decref(struct vkd3d_view *view, struct d3d12_device *device) DECLSPEC_HIDDEN;
-void vkd3d_view_incref(struct vkd3d_view *view) DECLSPEC_HIDDEN;
+void vkd3d_view_decref(struct vkd3d_view *view, struct d3d12_device *device);
+void vkd3d_view_incref(struct vkd3d_view *view);
struct vkd3d_texture_view_desc
{
@@ -511,9 +511,9 @@ struct vkd3d_texture_view_desc
};
bool vkd3d_create_buffer_view(struct d3d12_device *device, VkBuffer vk_buffer, const struct vkd3d_format *format,
- VkDeviceSize offset, VkDeviceSize size, struct vkd3d_view **view) DECLSPEC_HIDDEN;
+ VkDeviceSize offset, VkDeviceSize size, struct vkd3d_view **view);
bool vkd3d_create_texture_view(struct d3d12_device *device, VkImage vk_image,
- const struct vkd3d_texture_view_desc *desc, struct vkd3d_view **view) DECLSPEC_HIDDEN;
+ const struct vkd3d_texture_view_desc *desc, struct vkd3d_view **view);
struct d3d12_desc
{
@@ -537,24 +537,24 @@ static inline struct d3d12_desc *d3d12_desc_from_gpu_handle(D3D12_GPU_DESCRIPTOR
}
void d3d12_desc_copy(struct d3d12_desc *dst, const struct d3d12_desc *src,
- struct d3d12_device *device) DECLSPEC_HIDDEN;
+ struct d3d12_device *device);
void d3d12_desc_create_cbv(struct d3d12_desc *descriptor,
- struct d3d12_device *device, const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc) DECLSPEC_HIDDEN;
+ struct d3d12_device *device, const D3D12_CONSTANT_BUFFER_VIEW_DESC *desc);
void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
struct d3d12_device *device, struct d3d12_resource *resource,
- const D3D12_SHADER_RESOURCE_VIEW_DESC *desc) DECLSPEC_HIDDEN;
+ const D3D12_SHADER_RESOURCE_VIEW_DESC *desc);
void d3d12_desc_create_uav(struct d3d12_desc *descriptor, struct d3d12_device *device,
struct d3d12_resource *resource, struct d3d12_resource *counter_resource,
- const D3D12_UNORDERED_ACCESS_VIEW_DESC *desc) DECLSPEC_HIDDEN;
+ const D3D12_UNORDERED_ACCESS_VIEW_DESC *desc);
void d3d12_desc_create_sampler(struct d3d12_desc *sampler,
- struct d3d12_device *device, const D3D12_SAMPLER_DESC *desc) DECLSPEC_HIDDEN;
+ struct d3d12_device *device, const D3D12_SAMPLER_DESC *desc);
void d3d12_desc_write_atomic(struct d3d12_desc *dst, const struct d3d12_desc *src,
- struct d3d12_device *device) DECLSPEC_HIDDEN;
+ struct d3d12_device *device);
bool vkd3d_create_raw_buffer_view(struct d3d12_device *device,
- D3D12_GPU_VIRTUAL_ADDRESS gpu_address, VkBufferView *vk_buffer_view) DECLSPEC_HIDDEN;
+ D3D12_GPU_VIRTUAL_ADDRESS gpu_address, VkBufferView *vk_buffer_view);
HRESULT vkd3d_create_static_sampler(struct d3d12_device *device,
- const D3D12_STATIC_SAMPLER_DESC *desc, VkSampler *vk_sampler) DECLSPEC_HIDDEN;
+ const D3D12_STATIC_SAMPLER_DESC *desc, VkSampler *vk_sampler);
struct d3d12_rtv_desc
{
@@ -574,7 +574,7 @@ static inline struct d3d12_rtv_desc *d3d12_rtv_desc_from_cpu_handle(D3D12_CPU_DE
}
void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_device *device,
- struct d3d12_resource *resource, const D3D12_RENDER_TARGET_VIEW_DESC *desc) DECLSPEC_HIDDEN;
+ struct d3d12_resource *resource, const D3D12_RENDER_TARGET_VIEW_DESC *desc);
struct d3d12_dsv_desc
{
@@ -594,7 +594,7 @@ static inline struct d3d12_dsv_desc *d3d12_dsv_desc_from_cpu_handle(D3D12_CPU_DE
}
void d3d12_dsv_desc_create_dsv(struct d3d12_dsv_desc *dsv_desc, struct d3d12_device *device,
- struct d3d12_resource *resource, const D3D12_DEPTH_STENCIL_VIEW_DESC *desc) DECLSPEC_HIDDEN;
+ struct d3d12_resource *resource, const D3D12_DEPTH_STENCIL_VIEW_DESC *desc);
/* ID3D12DescriptorHeap */
struct d3d12_descriptor_heap
@@ -612,7 +612,7 @@ struct d3d12_descriptor_heap
};
HRESULT d3d12_descriptor_heap_create(struct d3d12_device *device,
- const D3D12_DESCRIPTOR_HEAP_DESC *desc, struct d3d12_descriptor_heap **descriptor_heap) DECLSPEC_HIDDEN;
+ const D3D12_DESCRIPTOR_HEAP_DESC *desc, struct d3d12_descriptor_heap **descriptor_heap);
/* ID3D12QueryHeap */
struct d3d12_query_heap
@@ -630,8 +630,8 @@ struct d3d12_query_heap
};
HRESULT d3d12_query_heap_create(struct d3d12_device *device, const D3D12_QUERY_HEAP_DESC *desc,
- struct d3d12_query_heap **heap) DECLSPEC_HIDDEN;
-struct d3d12_query_heap *unsafe_impl_from_ID3D12QueryHeap(ID3D12QueryHeap *iface) DECLSPEC_HIDDEN;
+ struct d3d12_query_heap **heap);
+struct d3d12_query_heap *unsafe_impl_from_ID3D12QueryHeap(ID3D12QueryHeap *iface);
/* A Vulkan query has to be issued at least one time before the result is
* available. In D3D12 it is legal to get query reults for not issued queries.
@@ -731,11 +731,11 @@ struct d3d12_root_signature
};
HRESULT d3d12_root_signature_create(struct d3d12_device *device, const void *bytecode,
- size_t bytecode_length, struct d3d12_root_signature **root_signature) DECLSPEC_HIDDEN;
-struct d3d12_root_signature *unsafe_impl_from_ID3D12RootSignature(ID3D12RootSignature *iface) DECLSPEC_HIDDEN;
+ size_t bytecode_length, struct d3d12_root_signature **root_signature);
+struct d3d12_root_signature *unsafe_impl_from_ID3D12RootSignature(ID3D12RootSignature *iface);
int vkd3d_parse_root_signature_v_1_0(const struct vkd3d_shader_code *dxbc,
- struct vkd3d_shader_versioned_root_signature_desc *desc) DECLSPEC_HIDDEN;
+ struct vkd3d_shader_versioned_root_signature_desc *desc);
struct d3d12_graphics_pipeline_state
{
@@ -829,13 +829,13 @@ static inline bool d3d12_pipeline_state_has_unknown_dsv_format(struct d3d12_pipe
}
HRESULT d3d12_pipeline_state_create_compute(struct d3d12_device *device,
- const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc, struct d3d12_pipeline_state **state) DECLSPEC_HIDDEN;
+ const D3D12_COMPUTE_PIPELINE_STATE_DESC *desc, struct d3d12_pipeline_state **state);
HRESULT d3d12_pipeline_state_create_graphics(struct d3d12_device *device,
- const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc, struct d3d12_pipeline_state **state) DECLSPEC_HIDDEN;
+ const D3D12_GRAPHICS_PIPELINE_STATE_DESC *desc, struct d3d12_pipeline_state **state);
VkPipeline d3d12_pipeline_state_get_or_create_pipeline(struct d3d12_pipeline_state *state,
D3D12_PRIMITIVE_TOPOLOGY topology, const uint32_t *strides, VkFormat dsv_format,
- VkRenderPass *vk_render_pass) DECLSPEC_HIDDEN;
-struct d3d12_pipeline_state *unsafe_impl_from_ID3D12PipelineState(ID3D12PipelineState *iface) DECLSPEC_HIDDEN;
+ VkRenderPass *vk_render_pass);
+struct d3d12_pipeline_state *unsafe_impl_from_ID3D12PipelineState(ID3D12PipelineState *iface);
struct vkd3d_buffer
{
@@ -895,7 +895,7 @@ struct d3d12_command_allocator
};
HRESULT d3d12_command_allocator_create(struct d3d12_device *device,
- D3D12_COMMAND_LIST_TYPE type, struct d3d12_command_allocator **allocator) DECLSPEC_HIDDEN;
+ D3D12_COMMAND_LIST_TYPE type, struct d3d12_command_allocator **allocator);
struct vkd3d_push_descriptor
{
@@ -987,7 +987,7 @@ struct d3d12_command_list
HRESULT d3d12_command_list_create(struct d3d12_device *device,
UINT node_mask, D3D12_COMMAND_LIST_TYPE type, ID3D12CommandAllocator *allocator_iface,
- ID3D12PipelineState *initial_pipeline_state, struct d3d12_command_list **list) DECLSPEC_HIDDEN;
+ ID3D12PipelineState *initial_pipeline_state, struct d3d12_command_list **list);
struct vkd3d_queue
{
@@ -1014,12 +1014,12 @@ struct vkd3d_queue
VkSemaphore old_vk_semaphores[VKD3D_MAX_VK_SYNC_OBJECTS];
};
-VkQueue vkd3d_queue_acquire(struct vkd3d_queue *queue) DECLSPEC_HIDDEN;
+VkQueue vkd3d_queue_acquire(struct vkd3d_queue *queue);
HRESULT vkd3d_queue_create(struct d3d12_device *device,
uint32_t family_index, const VkQueueFamilyProperties *properties,
- struct vkd3d_queue **queue) DECLSPEC_HIDDEN;
-void vkd3d_queue_destroy(struct vkd3d_queue *queue, struct d3d12_device *device) DECLSPEC_HIDDEN;
-void vkd3d_queue_release(struct vkd3d_queue *queue) DECLSPEC_HIDDEN;
+ struct vkd3d_queue **queue);
+void vkd3d_queue_destroy(struct vkd3d_queue *queue, struct d3d12_device *device);
+void vkd3d_queue_release(struct vkd3d_queue *queue);
/* ID3D12CommandQueue */
struct d3d12_command_queue
@@ -1040,7 +1040,7 @@ struct d3d12_command_queue
};
HRESULT d3d12_command_queue_create(struct d3d12_device *device,
- const D3D12_COMMAND_QUEUE_DESC *desc, struct d3d12_command_queue **queue) DECLSPEC_HIDDEN;
+ const D3D12_COMMAND_QUEUE_DESC *desc, struct d3d12_command_queue **queue);
/* ID3D12CommandSignature */
struct d3d12_command_signature
@@ -1056,8 +1056,8 @@ struct d3d12_command_signature
};
HRESULT d3d12_command_signature_create(struct d3d12_device *device, const D3D12_COMMAND_SIGNATURE_DESC *desc,
- struct d3d12_command_signature **signature) DECLSPEC_HIDDEN;
-struct d3d12_command_signature *unsafe_impl_from_ID3D12CommandSignature(ID3D12CommandSignature *iface) DECLSPEC_HIDDEN;
+ struct d3d12_command_signature **signature);
+struct d3d12_command_signature *unsafe_impl_from_ID3D12CommandSignature(ID3D12CommandSignature *iface);
/* NULL resources */
struct vkd3d_null_resources
@@ -1076,9 +1076,9 @@ struct vkd3d_null_resources
};
HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources,
- struct d3d12_device *device) DECLSPEC_HIDDEN;
+ struct d3d12_device *device);
void vkd3d_destroy_null_resources(struct vkd3d_null_resources *null_resources,
- struct d3d12_device *device) DECLSPEC_HIDDEN;
+ struct d3d12_device *device);
struct vkd3d_format_compatibility_list
{
@@ -1116,8 +1116,8 @@ struct vkd3d_uav_clear_state
struct vkd3d_uav_clear_pipelines pipelines_uint;
};
-HRESULT vkd3d_uav_clear_state_init(struct vkd3d_uav_clear_state *state, struct d3d12_device *device) DECLSPEC_HIDDEN;
-void vkd3d_uav_clear_state_cleanup(struct vkd3d_uav_clear_state *state, struct d3d12_device *device) DECLSPEC_HIDDEN;
+HRESULT vkd3d_uav_clear_state_init(struct vkd3d_uav_clear_state *state, struct d3d12_device *device);
+void vkd3d_uav_clear_state_cleanup(struct vkd3d_uav_clear_state *state, struct d3d12_device *device);
/* ID3D12Device */
struct d3d12_device
@@ -1173,13 +1173,13 @@ struct d3d12_device
};
HRESULT d3d12_device_create(struct vkd3d_instance *instance,
- const struct vkd3d_device_create_info *create_info, struct d3d12_device **device) DECLSPEC_HIDDEN;
+ const struct vkd3d_device_create_info *create_info, struct d3d12_device **device);
struct vkd3d_queue *d3d12_device_get_vkd3d_queue(struct d3d12_device *device,
- D3D12_COMMAND_LIST_TYPE type) DECLSPEC_HIDDEN;
-bool d3d12_device_is_uma(struct d3d12_device *device, bool *coherent) DECLSPEC_HIDDEN;
+ D3D12_COMMAND_LIST_TYPE type);
+bool d3d12_device_is_uma(struct d3d12_device *device, bool *coherent);
void d3d12_device_mark_as_removed(struct d3d12_device *device, HRESULT reason,
- const char *message, ...) VKD3D_PRINTF_FUNC(3, 4) DECLSPEC_HIDDEN;
-struct d3d12_device *unsafe_impl_from_ID3D12Device(ID3D12Device *iface) DECLSPEC_HIDDEN;
+ const char *message, ...) VKD3D_PRINTF_FUNC(3, 4);
+struct d3d12_device *unsafe_impl_from_ID3D12Device(ID3D12Device *iface);
static inline HRESULT d3d12_device_query_interface(struct d3d12_device *device, REFIID iid, void **object)
{
@@ -1254,15 +1254,15 @@ static inline bool vkd3d_format_is_compressed(const struct vkd3d_format *format)
void vkd3d_format_copy_data(const struct vkd3d_format *format, const uint8_t *src,
unsigned int src_row_pitch, unsigned int src_slice_pitch, uint8_t *dst, unsigned int dst_row_pitch,
- unsigned int dst_slice_pitch, unsigned int w, unsigned int h, unsigned int d) DECLSPEC_HIDDEN;
+ unsigned int dst_slice_pitch, unsigned int w, unsigned int h, unsigned int d);
const struct vkd3d_format *vkd3d_get_format(const struct d3d12_device *device,
- DXGI_FORMAT dxgi_format, bool depth_stencil) DECLSPEC_HIDDEN;
+ DXGI_FORMAT dxgi_format, bool depth_stencil);
const struct vkd3d_format *vkd3d_find_uint_format(const struct d3d12_device *device,
- DXGI_FORMAT dxgi_format) DECLSPEC_HIDDEN;
+ DXGI_FORMAT dxgi_format);
-HRESULT vkd3d_init_format_info(struct d3d12_device *device) DECLSPEC_HIDDEN;
-void vkd3d_cleanup_format_info(struct d3d12_device *device) DECLSPEC_HIDDEN;
+HRESULT vkd3d_init_format_info(struct d3d12_device *device);
+void vkd3d_cleanup_format_info(struct d3d12_device *device);
static inline const struct vkd3d_format *vkd3d_format_from_d3d12_resource_desc(
const struct d3d12_device *device, const D3D12_RESOURCE_DESC *desc, DXGI_FORMAT view_format)
@@ -1310,24 +1310,24 @@ static inline unsigned int vkd3d_compute_workgroup_count(unsigned int thread_cou
return (thread_count + workgroup_size - 1) / workgroup_size;
}
-VkCompareOp vk_compare_op_from_d3d12(D3D12_COMPARISON_FUNC op) DECLSPEC_HIDDEN;
-VkSampleCountFlagBits vk_samples_from_dxgi_sample_desc(const DXGI_SAMPLE_DESC *desc) DECLSPEC_HIDDEN;
-VkSampleCountFlagBits vk_samples_from_sample_count(unsigned int sample_count) DECLSPEC_HIDDEN;
+VkCompareOp vk_compare_op_from_d3d12(D3D12_COMPARISON_FUNC op);
+VkSampleCountFlagBits vk_samples_from_dxgi_sample_desc(const DXGI_SAMPLE_DESC *desc);
+VkSampleCountFlagBits vk_samples_from_sample_count(unsigned int sample_count);
-bool is_valid_feature_level(D3D_FEATURE_LEVEL feature_level) DECLSPEC_HIDDEN;
+bool is_valid_feature_level(D3D_FEATURE_LEVEL feature_level);
-bool is_valid_resource_state(D3D12_RESOURCE_STATES state) DECLSPEC_HIDDEN;
-bool is_write_resource_state(D3D12_RESOURCE_STATES state) DECLSPEC_HIDDEN;
+bool is_valid_resource_state(D3D12_RESOURCE_STATES state);
+bool is_write_resource_state(D3D12_RESOURCE_STATES state);
HRESULT return_interface(void *iface, REFIID iface_iid,
- REFIID requested_iid, void **object) DECLSPEC_HIDDEN;
+ REFIID requested_iid, void **object);
-const char *debug_d3d12_box(const D3D12_BOX *box) DECLSPEC_HIDDEN;
-const char *debug_d3d12_shader_component_mapping(unsigned int mapping) DECLSPEC_HIDDEN;
-const char *debug_vk_extent_3d(VkExtent3D extent) DECLSPEC_HIDDEN;
-const char *debug_vk_memory_heap_flags(VkMemoryHeapFlags flags) DECLSPEC_HIDDEN;
-const char *debug_vk_memory_property_flags(VkMemoryPropertyFlags flags) DECLSPEC_HIDDEN;
-const char *debug_vk_queue_flags(VkQueueFlags flags) DECLSPEC_HIDDEN;
+const char *debug_d3d12_box(const D3D12_BOX *box);
+const char *debug_d3d12_shader_component_mapping(unsigned int mapping);
+const char *debug_vk_extent_3d(VkExtent3D extent);
+const char *debug_vk_memory_heap_flags(VkMemoryHeapFlags flags);
+const char *debug_vk_memory_property_flags(VkMemoryPropertyFlags flags);
+const char *debug_vk_queue_flags(VkQueueFlags flags);
static inline void debug_ignored_node_mask(unsigned int mask)
{
@@ -1336,15 +1336,15 @@ static inline void debug_ignored_node_mask(unsigned int mask)
}
HRESULT vkd3d_load_vk_global_procs(struct vkd3d_vk_global_procs *procs,
- PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr) DECLSPEC_HIDDEN;
+ PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr);
HRESULT vkd3d_load_vk_instance_procs(struct vkd3d_vk_instance_procs *procs,
- const struct vkd3d_vk_global_procs *global_procs, VkInstance instance) DECLSPEC_HIDDEN;
+ const struct vkd3d_vk_global_procs *global_procs, VkInstance instance);
HRESULT vkd3d_load_vk_device_procs(struct vkd3d_vk_device_procs *procs,
- const struct vkd3d_vk_instance_procs *parent_procs, VkDevice device) DECLSPEC_HIDDEN;
+ const struct vkd3d_vk_instance_procs *parent_procs, VkDevice device);
extern const char vkd3d_build[];
-bool vkd3d_get_program_name(char program_name[PATH_MAX]) DECLSPEC_HIDDEN;
+bool vkd3d_get_program_name(char program_name[PATH_MAX]);
static inline void vkd3d_set_thread_name(const char *name)
{
@@ -1356,9 +1356,9 @@ static inline void vkd3d_set_thread_name(const char *name)
}
VkResult vkd3d_set_vk_object_name_utf8(struct d3d12_device *device, uint64_t vk_object,
- VkDebugReportObjectTypeEXT vk_object_type, const char *name) DECLSPEC_HIDDEN;
+ VkDebugReportObjectTypeEXT vk_object_type, const char *name);
HRESULT vkd3d_set_vk_object_name(struct d3d12_device *device, uint64_t vk_object,
- VkDebugReportObjectTypeEXT vk_object_type, const WCHAR *name) DECLSPEC_HIDDEN;
+ VkDebugReportObjectTypeEXT vk_object_type, const WCHAR *name);
static inline void vk_prepend_struct(void *header, void *structure)
{
--
2.28.0
5
6
[PATCH v10 [rebased] 1/4] winevulkan: Support use of extensions which mustn't be exposed.
by Derek Lesho 12 Jul '21
by Derek Lesho 12 Jul '21
12 Jul '21
Signed-off-by: Derek Lesho <dlesho(a)codeweavers.com>
---
dlls/winevulkan/make_vulkan | 35 ++++++++++++++++++++++++-----------
1 file changed, 24 insertions(+), 11 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
index e8534cbd5f5..c46ef02dcb9 100755
--- a/dlls/winevulkan/make_vulkan
+++ b/dlls/winevulkan/make_vulkan
@@ -124,6 +124,11 @@ UNSUPPORTED_EXTENSIONS = [
"VK_NV_external_memory_win32",
]
+# Either internal extensions which aren't present on the win32 platform which
+# winevulkan may nonetheless use, or extensions we want to generate headers for
+# but not expose to applications (useful for test commits)
+UNEXPOSED_EXTENSIONS = {}
+
# The Vulkan loader provides entry-points for core functionality and important
# extensions. Based on vulkan-1.def this amounts to WSI extensions on 1.0.51.
CORE_EXTENSIONS = [
@@ -513,8 +518,8 @@ class VkEnumValue(object):
class VkFunction(object):
- def __init__(self, _type=None, name=None, params=[], extensions=[], alias=None):
- self.extensions = []
+ def __init__(self, _type=None, name=None, params=[], alias=None):
+ self.extensions = set()
self.name = name
self.type = _type
self.params = params
@@ -657,6 +662,10 @@ class VkFunction(object):
def needs_private_thunk(self):
return self.thunk_type == ThunkType.PRIVATE
+ def needs_exposing(self):
+ # The function needs exposed if at-least one extension isn't both UNSUPPORTED and UNEXPOSED
+ return self.is_required() and (not self.extensions or not self.extensions.issubset(UNEXPOSED_EXTENSIONS))
+
def pfn(self, prefix="p", call_conv=None, conv=False):
""" Create function pointer. """
@@ -2682,7 +2691,7 @@ class VkGenerator(object):
# Create thunks for instance and device functions.
# Global functions don't go through the thunks.
for vk_func in self.registry.funcs.values():
- if not vk_func.is_required():
+ if not vk_func.needs_exposing():
continue
if vk_func.is_global_func():
@@ -2702,6 +2711,8 @@ class VkGenerator(object):
for ext in self.registry.extensions:
if ext["type"] != "device":
continue
+ if ext["name"] in UNEXPOSED_EXTENSIONS:
+ continue
f.write(" \"{0}\",\n".format(ext["name"]))
f.write("};\n\n")
@@ -2711,6 +2722,8 @@ class VkGenerator(object):
for ext in self.registry.extensions:
if ext["type"] != "instance":
continue
+ if ext["name"] in UNEXPOSED_EXTENSIONS:
+ continue
f.write(" \"{0}\",\n".format(ext["name"]))
f.write("};\n\n")
@@ -2770,7 +2783,7 @@ class VkGenerator(object):
f.write("const struct unix_funcs loader_funcs =\n")
f.write("{\n")
for vk_func in self.registry.funcs.values():
- if not vk_func.is_required():
+ if not vk_func.needs_exposing():
continue
if vk_func.loader_thunk_type == ThunkType.NONE:
continue
@@ -2789,7 +2802,7 @@ class VkGenerator(object):
# Generate prototypes for device and instance functions requiring a custom implementation.
f.write("/* Functions for which we have custom implementations outside of the thunks. */\n")
for vk_func in self.registry.funcs.values():
- if not vk_func.is_required():
+ if not vk_func.needs_exposing():
continue
if vk_func.needs_thunk() and not vk_func.needs_private_thunk():
continue
@@ -2888,7 +2901,7 @@ class VkGenerator(object):
f.write("WINE_DEFAULT_DEBUG_CHANNEL(vulkan);\n\n")
for vk_func in self.registry.funcs.values():
- if not vk_func.is_required():
+ if not vk_func.needs_exposing():
continue
if vk_func.loader_thunk_type != ThunkType.PUBLIC:
continue
@@ -2897,7 +2910,7 @@ class VkGenerator(object):
f.write("static const struct vulkan_func vk_device_dispatch_table[] =\n{\n")
for vk_func in self.registry.device_funcs:
- if not vk_func.is_required():
+ if not vk_func.needs_exposing():
continue
f.write(" {{\"{0}\", &{0}}},\n".format(vk_func.name))
@@ -2905,7 +2918,7 @@ class VkGenerator(object):
f.write("static const struct vulkan_func vk_phys_dev_dispatch_table[] =\n{\n")
for vk_func in self.registry.phys_dev_funcs:
- if not vk_func.is_required():
+ if not vk_func.needs_exposing():
continue
f.write(" {{\"{0}\", &{0}}},\n".format(vk_func.name))
@@ -2913,7 +2926,7 @@ class VkGenerator(object):
f.write("static const struct vulkan_func vk_instance_dispatch_table[] =\n{\n")
for vk_func in self.registry.instance_funcs:
- if not vk_func.is_required():
+ if not vk_func.needs_exposing():
continue
f.write(" {{\"{0}\", &{0}}},\n".format(vk_func.name))
@@ -2970,7 +2983,7 @@ class VkGenerator(object):
f.write("struct unix_funcs\n")
f.write("{\n")
for vk_func in self.registry.funcs.values():
- if not vk_func.is_required():
+ if not vk_func.needs_exposing():
continue
if vk_func.loader_thunk_type == ThunkType.NONE:
continue
@@ -3464,7 +3477,7 @@ class VkRegistry(object):
# the XML file to handle this, but because of the manner in which we parse the XML
# file we pre-populate from <commands> before we check if a command is enabled.
if cmd_name in self.funcs:
- self.funcs[cmd_name].extensions.append(ext_name)
+ self.funcs[cmd_name].extensions.add(ext_name)
# Some extensions are not ready or have numbers reserved as a place holder.
if ext.attrib["supported"] == "disabled":
--
2.32.0
5
20
[PATCH v6] mf/sar: Allow requesting more than a sample per period.
by Giovanni Mascellani 06 Jul '21
by Giovanni Mascellani 06 Jul '21
06 Jul '21
The IAudioClient implementation from both Windows and winepulse.drv
never sets the event more than once per period, which is usually
around 10 ms long. Some codecs produce audio samples shorter than
10 ms, so it is critical that the SAR is able to process more than
a sample per period.
This is not currently the case: a new sample is requested only in
audio_renderer_render, which is executed (at most) once per period.
This results in the SAR not being able to keep up with the audio
client, and eventually underrunning.
With this patch the SAR keeps a count of how many frames are
currently queued, and a new sample is immediately requested if
the internal queue has less than a buffer worth of frames.
This patch fixes audio stuttering problems in the logo videos
of Borderlands 3, Deep Rock Galactic and Mutant Year Zero.
Signed-off-by: Giovanni Mascellani <gmascellani(a)codeweavers.com>
---
v2: Remove some changes that didn't really help the solution and
update the description accordingly.
v3: Reimplement from scratches, using a different strategy and
avoiding manually setting the event.
v4: Resent with no changes, because it fails to apply without
the first patch.
v5:
* Zero the count when flushing the queue.
* Only request more sample when running.
v6: Store a buffer worth of frames in the queue, instead of
two periods.
dlls/mf/sar.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/dlls/mf/sar.c b/dlls/mf/sar.c
index eba822ae0fe..e35531acb71 100644
--- a/dlls/mf/sar.c
+++ b/dlls/mf/sar.c
@@ -101,6 +101,8 @@ struct audio_renderer
HANDLE buffer_ready_event;
MFWORKITEM_KEY buffer_ready_key;
unsigned int frame_size;
+ unsigned int queued_frames;
+ unsigned int max_frames;
struct list queue;
enum stream_state state;
unsigned int flags;
@@ -234,6 +236,7 @@ static void audio_renderer_release_audio_client(struct audio_renderer *renderer)
{
release_pending_object(obj);
}
+ renderer->queued_frames = 0;
renderer->buffer_ready_key = 0;
if (renderer->audio_client)
{
@@ -1330,6 +1333,13 @@ static HRESULT WINAPI audio_renderer_stream_GetMediaTypeHandler(IMFStreamSink *i
static HRESULT stream_queue_sample(struct audio_renderer *renderer, IMFSample *sample)
{
struct queued_object *object;
+ DWORD sample_len, sample_frames;
+ HRESULT hr;
+
+ if (FAILED(hr = IMFSample_GetTotalLength(sample, &sample_len)))
+ return hr;
+
+ sample_frames = sample_len / renderer->frame_size;
if (!(object = calloc(1, sizeof(*object))))
return E_OUTOFMEMORY;
@@ -1339,6 +1349,7 @@ static HRESULT stream_queue_sample(struct audio_renderer *renderer, IMFSample *s
IMFSample_AddRef(object->u.sample.sample);
list_add_tail(&renderer->queue, &object->entry);
+ renderer->queued_frames += sample_frames;
return S_OK;
}
@@ -1357,9 +1368,17 @@ static HRESULT WINAPI audio_renderer_stream_ProcessSample(IMFStreamSink *iface,
return MF_E_STREAMSINK_REMOVED;
EnterCriticalSection(&renderer->cs);
+
if (renderer->state == STREAM_STATE_RUNNING)
hr = stream_queue_sample(renderer, sample);
renderer->flags &= ~SAR_SAMPLE_REQUESTED;
+
+ if (renderer->queued_frames < renderer->max_frames && renderer->state == STREAM_STATE_RUNNING)
+ {
+ IMFMediaEventQueue_QueueEventParamVar(renderer->stream_event_queue, MEStreamSinkRequestSample, &GUID_NULL, S_OK, NULL);
+ renderer->flags |= SAR_SAMPLE_REQUESTED;
+ }
+
LeaveCriticalSection(&renderer->cs);
return hr;
@@ -1428,6 +1447,7 @@ static HRESULT WINAPI audio_renderer_stream_Flush(IMFStreamSink *iface)
release_pending_object(obj);
}
}
+ renderer->queued_frames = 0;
LeaveCriticalSection(&renderer->cs);
return hr;
@@ -1576,6 +1596,12 @@ static HRESULT audio_renderer_create_audio_client(struct audio_renderer *rendere
return hr;
}
+ if (FAILED(hr = IAudioClient_GetBufferSize(renderer->audio_client, &renderer->max_frames)))
+ {
+ WARN("Failed to get buffer size, hr %#x.\n", hr);
+ return hr;
+ }
+
if (SUCCEEDED(hr = MFCreateAsyncResult(NULL, &renderer->render_callback, NULL, &result)))
{
if (FAILED(hr = MFPutWaitingWorkItem(renderer->buffer_ready_event, 0, result, &renderer->buffer_ready_key)))
@@ -1789,6 +1815,7 @@ static void audio_renderer_render(struct audio_renderer *renderer, IMFAsyncResul
IAudioRenderClient_ReleaseBuffer(renderer->audio_render_client, dst_frames, 0);
obj->u.sample.frame_offset += dst_frames;
+ renderer->queued_frames -= dst_frames;
}
keep_sample = FAILED(hr) || src_frames > max_frames;
--
2.32.0
2
1
[PATCH 2/5] wininet: validate InternetGetLastResponseInfo() parameters
by Damjan Jovanovic 02 Jul '21
by Damjan Jovanovic 02 Jul '21
02 Jul '21
Signed-off-by: Damjan Jovanovic <damjan.jov(a)gmail.com>
---
dlls/wininet/internet.c | 10 ++++++++++
dlls/wininet/tests/ftp.c | 7 +++++++
2 files changed, 17 insertions(+)
2
1
02 Jul '21
Signed-off-by: Damjan Jovanovic <damjan.jov(a)gmail.com>
---
dlls/wininet/internet.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
2
1