Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5564 | serge | 1 | Quickstart Guide |
2 | |||
3 | *** Configure and build mesa |
||
4 | CFLAGS="-m32" CXXFLAGS="-m32" ./autogen.sh --prefix=/usr \ |
||
5 | --with-gallium-drivers=nouveau,r600,swrast --enable-nine \ |
||
6 | --with-gallium-driver-dir="`pwd`/src/gallium/targets/pipe-loader/.libs" \ |
||
7 | --enable-debug --enable-texture-float --with-dri-drivers= --disable-dri \ |
||
8 | --disable-opengl --disable-egl --disable-vdpau --disable-xvmc --disable-gbm \ |
||
9 | --disable-gallium-llvm |
||
10 | make |
||
11 | |||
12 | *** Then we create some symlinks to mesa: |
||
13 | ln -s "`pwd`/lib/gallium/libd3dadapter9.so.0.0.0" /usr/lib/ |
||
14 | ln -s "`pwd`/lib/gallium/libd3dadapter9.so.0" /usr/lib/ |
||
15 | ln -s "`pwd`/lib/gallium/libd3dadapter9.so" /usr/lib/ |
||
16 | ln -s "`pwd`/include/d3dadapter" /usr/include/ |
||
17 | |||
18 | *** Clone and build a patched wine |
||
19 | git clone git@github.com:iXit/wine.git |
||
20 | ./configure |
||
21 | make |
||
22 | |||
23 | *** And finally we create some symlinks to our patched wine files: |
||
24 | for f in d3d9.dll gdi32.dll user32.dll wineps.drv winex11.drv; |
||
25 | do |
||
26 | mv /usr/lib/wine/$f.so /usr/lib/wine/$f.so.old |
||
27 | ln -s "`pwd`/dlls/`basename -s .dll $f`/$f.so" /usr/lib/wine/ |
||
28 | done |
||
29 | |||
30 | *** Activating it within wine |
||
31 | regedit |
||
32 | Navigate to HKCU\Software\Wine\Direct3D |
||
33 | If it's not there, create it |
||
34 | Create a new DWORD value called UseNative |
||
35 | Set its value to 1 |
||
36 | |||
37 | Every Direct3D9 program will now try using nine before wined3d |
||
38 | |||
39 | If you want to selectively enable it per-exe instead, use the key: |
||
40 | HKCU\Software\Wine\AppDefaults\app.exe\Direct3D\UseNative |
||
41 | where app.exe is the name of your .exe file |
||
42 | |||
43 | |||
44 | *** HOW IT WORKS *** |
||
45 | |||
46 | Nine implements the full IDirect3DDevice9 COM interface and a custom COM |
||
47 | interface called ID3DAdapter9 which is used to implement a final IDirect3D9Ex |
||
48 | COM interface. |
||
49 | ID3DAdapter9 is completely devoid of window system code, meaning this can be |
||
50 | provided by wine, Xlib, Wayland, etc. It's inadvisible to write a non-Windows |
||
51 | backend though, as we don't want to encourage linux developers to use this API. |
||
52 | |||
53 | The state tracker is compiled, along with pipe-loader, into a library called |
||
54 | libd3dadapter9.so. This library loads pipe_[driver].so drivers on demand and |
||
55 | exports a single symbol for getting a subsystem driver. Currently only DRM is |
||
56 | supported. |
||
57 | This library is then linked to the library implementing the IDirect3D9[Ex] |
||
58 | interface and the actual Direct3D9 entry points (Direct3DCreate9[Ex]) |
||
59 | |||
60 | The implementation of IDirect3D9[Ex] lies within wine and coexists with |
||
61 | wined3d. It's loaded on demand and so if it's not there, it doesn't have any |
||
62 | drivers or something else is wrong, d3d9.dll will automatically revert to using |
||
63 | wined3d. |
||
64 | Whether or not it's even tried is determined by 2 DWORD registry keys. |
||
65 | > HKCU\Software\Wine\Direct3D\UseNative |
||
66 | > HKCU\Software\Wine\AppDefaults\app.exe\Direct3D\UseNative |
||
67 | The former is the global on-switch. The latter is per-exe. |
||
68 | |||
69 | The driver search path can be set at configure time with |
||
70 | --with-gallium-driver-dir and overridden at runtime with D3D9_DRIVERS_PATH. |
||
71 | Debugging information can be gotten with the WINEDEBUG channels d3d9 and |
||
72 | d3dadapter, and state_tracker debug information can be gotten with NINE_DEBUG. |
||
73 | Help on NINE_DEBUG is shown through NINE_DEBUG=help |
||
74 | |||
75 | Finally, the ID3DPresent[Group] and ID3DAdapter9 interfaces are not set in |
||
76 | stone, so feel free to hack on those as well as st/nine. |
||
77 | |||
78 | Happy Hacking! |