dgVoodoo 2.53: DirectX emulation related stuffs


Table of contents

1. Important notes
2. General overview
3. Some technical info
4. Application resolutions and refresh rates
5. About fullscreen and windowed mode
6. DirectX setup options
7. Tips and known issues


1. Important notes

DirectDraw and D3D8 are still existing and widely used system components in Windows.

For clarifying, let's see what dlls MS and dgVoodoo use for DirectDraw and Direct3D:

So, dgVoodoo packs all of its pre-D3D8 implementation into one module, d3dimm.dll, which differs in name from the MS one (note the extra 'm' in the name).
Thus, copying it to the system folder by accident won't cause any harm. In spite of that, it is not recommended.

2. General overview

If you want to wrap an old DirectX stuff then just copy dgVoodoo's dlls to the application folder and launch that. DirectX rendering is configurable similarly to Glide. (See DirectX related setup options) DirectDraw is usable without Direct3D but there are no 3D rendering capabilities exposed to the applications in that case.
Direct3D8 is a standalone component, no need for DirectDraw to use it.

All the interfaces of old DirectX (that is, all DirectDraw interfaces and Direct3D 3/5/6/7/8 interfaces) are almost fully supported.

Since DirectX is not a pure hardware-only rendering API, basically two types of virtual video cards can be used, like back in the old days, hehe. Two extra video card types are added to utilize different chipset features. Available video card types:

For more detailed capabilities, see the technical info.

Software rendering devices does not use real software rendering in dgVoodoo. I think that a software rasterizer has no reason for existence nowadays and didn't want to write one just for fun so they use hw accelerated rendering in the background. The point is, towards the applications they logically appear as software devices.

DirectX renderer needs less GPU power (for general cases) than Glide renderer but it uses relatively complex precompiled shaders too (since whole of the fixed function vertex/pixel pipeline has to be mapped to pure shader functionality).

DX emulation has a method for fast CPU-access of locked surfaces. The current method is not the final version and going to be improved later. The reason of not using that one all the time but it is up to the user's choice is that this method is not 100% safe and can cause crashes under certain circumstances. It depends on the wrapped application.

Important to note that compatibility with MS DirectDraw is not completely guaranteed, especially with very old applications written in the win95/Win98 era. Those applications might utilize DirectDraw/GDI interaction which is not fully supported in dgVoodoo. I would like to improve that somehow, in later versions.

3. Some technical info

I say 'almost fully supported' when talking about DX support because there are some functions on certain interfaces of which functionality is somewhat unclear or totally unimportant, so they either not implemented at all or just partially because I did not have time and patience to figure out their exact behavior. Think about a total of 5-6 functions of all the DX interfaces, I hardly believe that anything used them.

For DX8.1, the following features are not implemented but planned to be in the future:


Internal virtual 3D card has the following 3D hardware capabilities:

* Additionally, if dynamic shader compiling IS NOT AVAILABLE then

* if dynamic shader compiling IS AVAILABLE then

The other 2 card types are not an exact emulation of the given chipsets with some real ATI/nVidia driver version. They are just present to bias the available rendering capabilities and properties toward a real ATI or nVidia card:

GeForce4 Ti 4800 capabilities:

ATI Radeon 8500 capabilities:


DirectDraw and Direct3D objects supports all types of rendering devices that are supported in original DirectX.
Direct3D8 support HAL and software device types.

In MS pre-Direct3D8 implementations Direct3D7 is the only one that can be used with hardware vertex transformation and lighting, through a Transform & Light (T&L) device (but I guess it casually falls back to software vertex processing if the device driver does not support the complete vertex operation pipeline that is currently set).

In all other cases software vertex processing is used. In dgVoodoo vertex processing is always routed to the hardware when possible.
However, it's not so simple: software vertex processing is unavoidable in Direct3D in some cases, for example when an application wants Direct3D to do only vertex processing without rendering or to calculate visibility, or, when the rendering extent must be updated when drawing primitives through a non-T&L device (this is not too important in practice but I included it because of full compatibility). Also, vertex processing for Direct3D3 can only be done in software because of the execution logic of execute buffers.
It all means that dgVoodoo has a software T&L vertex processing engine like MS Direct3D for such cases, duplicating the hw functionality. However for transforming, bending, lighting, fogging and texture coordinate transforming calculations dgVoodoo uses fast vectorized SSE2 code instead of scalar FPU.

(It should be noted that in newer DX version like DX7 MS uses SSE2 too. What is more, for software emulation of vertex shader code in DX8, MS seems to apply an internal compiler, that compiles from shader code to x86 bytecode. Wow, what a nice feature!! I should do the same, but probably it all is not too relevant on modern CPUs.)

Phong shading (per-pixel shading) is not supported by MS Direct3D, only Gouraud (per-vertex). However the internal virtual 3D card can externally be forced to Phong shading through the setup but keep in mind that it can cause heavy GPU usage because Direct3D lighting is quite complex, typical hardware implementations supports 8 active lights with a lot of properties and components. Also, Phong shading is only applicable when the application commits all its transforming and lighting calculations to the D3D runtime. Unfortunately it is very common that games do their own T&L calcs and use D3D as a lowlevel rasterizer for the rest. It is especially true when a game is written for multiple platforms or multiple 3D APIs like Glide, D3D, OpenGL, etc. Direct3D3 always uses software vertex processing so Phong shading cannot be applied there at all.

DX8 is a horse of another colour from the beginning of a new era. Applications written for that usually heavily utilize multiple vertex streams through real vertex and index buffers along with built-in hw T&L pipeline and/or shaders without any calculations done in software.

Phong shading is only applicable with full fixed function vertex/pixel pipeline usage. If an application is rendering through a vertex and/or pixel shader in DX8 then Phong cannot be utilized.

4. Application resolutions and refresh rates

An application using DirectX can only detect available resolutions and associated refresh rates by asking DirectDraw/DX8 to enumerate them. There are two slight problems with it in practice:

To workaround the first case, dgVoodoo keeps a list of 'classic' resolutions. These are the following:

If a resolution of that list is not amongst the ones that your modern adapter reports then dgVoodoo forces enumerating it to the application.

As for the refresh rates, if an application does not specifify one of the enumerated ones but specifies 0 (default) then dgVoodoo finds and applies the natively supported one that is most closest to 60Hz.

If you want to make sure or would like to use a custom refresh rate then you can override that through the resolution selector combo box (DirectX tab).
For details, see chapter 'Resolution and refresh rate overriding' in the general readme.

If the refresh rate is overridden then all resolutions are enumerated with the overidden value to the applications.

5. About fullscreen and windowed mode

Choosing fullscreen or windowed working mode is part of the DirectDraw API. Some games or demoscene stuffs run only in fullscreen so one could think what cool it would be to have them running in windowed mode. I thought the same so wanted to enable by default the same method to switch between them as used for Glide. There are some problems however: the ways handling fullscreen and windowed mode via DirectDraw are totally different in the aspect of the driving code. So, forcing an application into an unexpected situation may cause glitches or crashes. Also, a game may have its on mechanism for mode switching with which dgVoodoo could conflict. Due to those theoretic things, and because I experinced some problems with some games, I decided to emulate the original DirectDraw behavior by default: when a fullscreen application loses the focus then its window gets minimized and when it regains that its window is restored and enters fullscreen again and no manual switch is available. Also, there are no changes applied on the app window like style and overridden messages, etc.

If you make sure that a given game does not conflict with dgVoodoo's Alt-Enter thing then you can enable that in the setup. Also, you can force it to windowed mode if 'app controlled fullscreen/windowed' option is disabled at the game startup (and choose windowed mode in the general settings), without Alt-Enter. Forcing a windowed application to fullscreen can only be done by manual switch because there is no way to 1) detect when an application begins its rendering and 2) switch to fullscreen.

(But, think about it, windowed to fullscreen does not make any sense. The resolution used comes from the window size but the window may get resized or repositioned when switching mode, so..., it's confusing.)

What is more, since DirectDraw was a one-monitor-API in practice, integrating windowed applications in a multimonitor environment is already a problem even for MS, I think. If such an app is even forced to fullscreen mode then it may crash or misworks for reasons I do not want to word here.

Lost mode is emulated in default DX emulation mode, namely when switching between windowed/fullscreen mode by Alt-Enter is disabled. This is because some DX applications count on losing their surfaces when their window loses focus and their code paths can be mislead if they remain 'unlost'. (This is a result of bad programming technique as DX SDKs clearly state that an application shouldn't rely on window focus lost or any other circumstances.)

On the other hand, there are incomplete or buggy DX applications that can't restore when they get reactivated and just get stuck. So, introducing lostmode emulation is up to a potential feature loss, as such applications likely worked well with older dgVoodoo versions. In order to keep this feature dgVoodoo applies auto-restore for the needed elements when such a situation is detected.

6. DirectX setup options

7. Tips and known issues