summaryrefslogtreecommitdiff
path: root/content/posts/2018-08-01-dxvk-gentoo.es.md
blob: dea8bc9453fdaafff63e3bcbaa7cb17199b7f45f (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
125
126
127
128
129
130
131
132
133
134
135
---
layout: post
title: Compilando las DLLs de DXVK en Gentoo
tags:
  - wine
  - dxvk
  - gentoo

TocOpen: true
ShowToc: true
---

La forma mas sencilla de compilar DXVK en Gentoo es con una chroot de Debian,
pero... Donde está la diversión en eso? La primera vez que lo intenté me topé
con varios problemas y no encontré documentado el proceso en ningún sitio. Esta
entrada es un intento de resolver ese problema.

<hr>

# Dependencias

Según la documentación oficial necesitamos:

- 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

Todas menos MinGW las puedes instalar directamente:

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

## MinGW64

Se necesita MinGW con threads de POSIX. Por suerte existe `crossdev`, el
problema es que por defecto compila GCC con threads de Win32.

Se crea primero la toolchain, la tupla para x86 es `i686-w64-mingw32` y para x64
`x86_64-w64-mingw32`.

```
crossdev -t i686-w64-mingw32
crossdev -t x86_64-w64-mingw32
```

Para arreglar GCC se necesitan dos cosas, indicar que lo queremos con POSIX
threads y las librerías que hacen falta para compilarlo.

1. Habilita los POSIX threads:

   ```
   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
   ```

1. Añade la `USE` `libraries`:

   ```
   cross-i686-w64-mingw32/mingw64-runtime libraries
   cross-x86_64-w64-mingw32/mingw64-runtime libraries
   ```

Por último recompila `mingw64-runtime` y `gcc` por separado, en ese orden:

```
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
```

Dependiendo de la versión del runtime, puede que se instalen algunas librerias
en el lugar equivocado y esto impide compilar GCC, si es el caso basta con hacer
enlaces (Bug #653246):

```
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/
```

El resultado final debe ser este:

```
i686-w64-mingw32-gcc -v
x86_64-w64-mingw32-gcc -v
...
Thread model: posix
...
```

# Compilar las DLLs

```
# 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
```

```
$ ls /some/install/prefix/bin
d3d11.dll  dxgi.dll  setup_dxvk.sh
```

Estas son las toolchains que usé y que producen binarios que funcionan:

```
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

### Requiere symlinkear de ...lib64/ -> ...lib/
cross-x86_64-w64-mingw32/mingw64-runtime-5.0.4
```

---

**Fuentes**:

- [DXVK Github](https://github.com/doitsujin/dxvk)
- [Bug #631460](https://bugs.gentoo.org/631460)
- [Bug #653246](https://bugs.gentoo.org/653246)