summaryrefslogtreecommitdiff
path: root/content/posts/2018-08-01-dxvk-gentoo.md
blob: e71cac34320d9e68318c0141c3ff9b7c9e8f5427 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
---
layout: post
draft: true
title: Building DXVK's DLLs on Gentoo

TocOpen: true
ShowToc: true
---

By far the easiest way to do it is on a Debian chroot, but that ain't as fun as
building your own toolchains and do it on Gentoo.

<hr>

# Dependencies

According to the official documentation:

- wine 3.10 or newer
- Meson build system (at least version 0.43)
- MinGW64 compiler and headers (requires threading support)
- glslang front end and validator

{% highlight code %}

# emerge virtual/wine dev-util/meson dev-util/glslang

{% endhighlight %}

## MinGW64

MinGW with POSIX threads is needed, problem is by default crossdev will compile
GCC with Win32 threads.

Start by creating your toolchains, tuple for x86 is `i686-w64-mingw32` and
`x86_64-w64-mingw32` for x64.

{% highlight code %}

# crossdev -t i686-w64-mingw32

# crossdev -t x86_64-w64-mingw32

{% endhighlight %}

Fix GCC by enabling POSIX threads and adding the `libraries` USE to
`mingw64-runtime`.

{% highlight code %}

# mkdir /etc/portage/{env,package.env}

# echo 'EXTRA_ECONF="--enable-threads=posix"' > /etc/portage/env/mingw32_posix_threads

# echo -e 'cross-i686-w64-mingw32/gcc mingw32_posix_threads\ncross-x86_64-w64-mingw32/gcc mingw32_posix_threads' > /etc/portage/package.env/mingw32_posix_threads

{% endhighlight %}

{% highlight code %} cross-i686-w64-mingw32/mingw64-runtime libraries
cross-x86_64-w64-mingw32/mingw64-runtime libraries {% endhighlight %}

Rebuild `mingw64-runtime` and `gcc`. Order matters, `mingw64-runtime` with
`libraries` provides `pthreads.h` and other stuff that is needed to compile GCC
with POSIX thread model.

{% highlight code %}

# emerge -1 cross-i686-w64-mingw32/mingw64-runtime cross-x86_64-w64-mingw32/mingw64-runtime

# emerge -1 cross-i686-w64-mingw32/gcc cross-x86_64-w64-mingw32/gcc

{% endhighlight %}

_Depending on the runtime version, libraries may end up in the wrong place (see
bug #653246), if that is the case sysmlink those and then rebuild GCC._ _eg_
{% highlight code %}

# ln -s /usr/x86_64-w64-mingw32/usr/lib64/{libmangle.a,libpthread.a,libpthread.dll.a,libwinpthread.a,libwinpthread.dll.a,libwinpthread.la} /usr/x86_64-w64-mingw32/usr/lib/

{% endhighlight %}

Final result should be:

{% highlight code %}

# i686-w64-mingw32-gcc -v

# x86_64-w64-mingw32-gcc -v

... Thread model: posix ... {% endhighlight %}

# Crosscompiling DLLs

{% highlight code %}

# su user

$ cd $ git clone https://github.com/doitsujin/dxvk.git $ cd dxvk

### 32-bit build. For 64-bit builds, replace

### build-win32.txt with build-win64.txt

### build.w32 with build.w64

$ meson --cross-file build-win32.txt --prefix /some/install/prefix build.w32 $
cd build.w32/ $ meson configure -Dbuildtype=release $ ninja $ ninja install
{% endhighlight %} {% highlight code %} $ ls /some/install/prefix/bin d3d11.dll
dxgi.dll setup_dxvk.sh {% endhighlight %}

These are the toolchains I used.

{% highlight code %} cross-i686-w64-mingw32/binutils-2.30-r3
cross-i686-w64-mingw32/gcc-7.3.0-r3 cross-i686-w64-mingw32/mingw64-runtime-5.0.4

cross-x86_64-w64-mingw32/binutils-2.30-r3 cross-x86_64-w64-mingw32/gcc-7.3.0-r3

### symlinks from ...lib64/ -> ...lib/ required! see bug #653246

cross-x86_64-w64-mingw32/mingw64-runtime-5.0.4 {% endhighlight %}

---

#### [Original in spanish](/gnu/linux/2018/08/01/dxvk-gentoo/)