First of all: NEVER COPY DDRAW.DLL AND D3D8.DLL INTO SYSTEM FOLDERS!!
ALWAYS USE A LOCAL INSTALLATION FOR A GAME!
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:
ddraw.dll | - Contains all DirectDraw implementations up to version 7 |
d3dim.dll | - Contains all Direct3D implementations up to version 6 |
d3dim700.dll | - Contains Direct3D 7 implementation |
d3d8.dll | - Contains Direct3D 8.1 implementation |
ddraw.dll | - Contains all DirectDraw implementations up to version 7 |
d3dimm.dll | - Contains all Direct3D implementations up to version 7 |
d3d8.dll | - Contains Direct3D 8.1 implementation |
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.
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 CPL 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. In spite of
that it is a good idea to copy DDraw.dll along with D3D8.dll because a lot of movie
playback system (e.g. DirectShow) rely on DDraw even in D3D8 games. dgVoodoo DDraw
and D3D8 has the ability and internal support to cooperate if the situation requires.
All the interfaces of old DirectX (that is, all DirectDraw interfaces and
Direct3D 3/5/6/7/8 interfaces) are almost fully supported, and existing implementation
is improved version by version by more and more reverse engineering and finetuning.
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. Four extra
video card types are added to utilize different chipset features and provide correct
vendorID/hardwareID.
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.
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 4 card types are not an exact emulation of the given chipsets with some real ATI/nVidia/Matrox driver version. They are just present to bias the available rendering capabilities and properties toward a real ATI, nVidia or Matrox card:
GeForce4 Ti 4800 capabilities:
ATI Radeon 8500 capabilities:
Matrox Parhelia-512 capabilities:
GeForce FX 5700 Ultra 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 CPL app 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.
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.
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 CPL app. 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.
As it says, if you want to disable DirectX without removing dgVoodoo's DLLs then use this option.
You can select between the internal virtual 2D (SVGA) and 3D accelerated cards.
Onboard videomemory of the selected videocard.
Various texture filtering modes can be forced here, starting from simple point sampled to high level anisotropic. Keep in mind however that forcing other than the application default can result in rendering glitches, or it can completely break some visual effects!
Disabling mipmappig (forcing largest mip texture level).
Here you can override the application resolution and refresh rate. See detailed explanation of static/dynamic resolutions in the general Readme.
For 3D rendered surfaces you can force MSAA. Option 'Application controlled' is meaningful only for DX8. For DDraw/DX it is equivalent to 'Off'.
Since choosing this state is part of DirectDraw, you must disable this option to control that via general settings.
To prevent conflicting with an application built-in Alt-Enter handler.
2D bitmap copying can involve stretching in DirectDraw.
However the applied stretching filter cannot be controlled
via the API and early hw used simple point sampling.
It can result pixelated appearance here and there but
you can force bilinear filtering which looks cooler for
most cases. But, it can also introduce various artifacts
especially when colorkeying is also applied during
blitting.
Try forcing bilinear texture filtering for achieving similar
effects for D3D8 games.
See technical info.
Forcing vertical retrace.
Provides an alternative method for accessing video memory of DX surfaces by the CPU. Try this one if an application renders at a low frame rate.
Similarly to 3Dfx watermark in Glide, you can use dgVoodoo's own one to see if something is driven through dgVoodoo's DirectX.
I got reports about cases with dgVoodoo DirectX emulation not starting up. The story is simple, one copies the DX dll files into the given application folder, next to the executable, makes sure that DX emulation is enabled on the CPL, and in spite of that, when starting the application dgVoodoo isn't utilized at all, dgVoodoo watermark doesn't show up in the corner if the app starts at all. Thanks to the Guys on Vogons, who are helping me a lot, they come out with 2 reasons:
I know that these details are technical like hell, and I don't at all expect an average user to tinker the operating system registry by hand. I just write this info here because I think it's useful for advanced users and experts to begin with. A dgVoodoo tool doing it all would be fine but currently doesn't exist one.