There is no installer for dgVoodoo beacuse you can copy its dlls anywhere
you want (to use). If u like it and want to use as the only global Glide
wrapper on your machine then copy Glide dlls to the system folder. Glide dlls
are available in both 32bit (x86) and 64bit (x64) versions. x64 version is for 64 bit <fontcolor ="#FFFFFF">QEmu</font> (and maybe
64 bit <fontcolor ="#FFFFFF">DosBox</font>) builds.
<fontcolor ="#FFFFFF"><b>For native usage you always need the 32bit (x86) version dlls.</b></font>
<br>
For DirectX emulation only a local installation is possible since the
DirectX dlls CANNOT be copied to the system folder (see DirectX readme).
Also, D3D9 has both 32 and 64 bit versions. Always use the proper one, depending on the application type (not the OS type).
</p>
<p>
A Glide wrapped application can start up either in windowed or full screen
mode (it is controlled by the <fontcolor ="#FFFFFF">Control Panel</font>, see later). Also, you can switch between
them during the gameplay by Alt-Enter. See 'Known issues' for more.
</p>
<p>
The same is true for wrapped DirectX applications, but it is a more
complicated case, see DirectX readme.
</p>
<p>
Glide and DirectX dlls can co-work inside a process so the same versions
of them have to be used within a folder. If one of them detects the other
with different version then it refuses to initialize and work.
Co-work is useful for applications that use DirectDraw for some initial
in-game menu and Glide for 3D rendering.
</p>
<p>
If you use dgVoodoo on Windows 10 then dynamic shader compiling is automatically
available because D3DCompiler_47 is part of the operating system.<br>
For preceding Windows versions (Vista, 7, 8) you need to download it manually and
then, you can copy this dll into each game folder next to the wrapper dlls but the
best practice is to copy it into
</p>
<ul>
<li><fontcolor ="#FFFFFF">Windows\System32 folder for 32 bit operating systems</font></li>
<li><fontcolor ="#FFFFFF">Windows\SysWOW64 folder for 64 bit operating systems</font></li>
</ul>
<p>
if it is not already there by the result of the installation of some
other software.<br>
Note that dgVoodoo supports both D3DCompiler_43 and D3DCompiler_47.
_43 is supported only because of compatibility with users having it
downloaded and copied into their system folder previously.
</p>
<p>
Utilizing dynamic shader compiling is only recommended for Glide libraries (unlike with previous dgVoodoo versions).
DirectX implementations have their own internal DXBC generator which proved to be good enough
so support for the external compiler has been removed.
(I would like to completely ditch the external compiler once the internal code generator is implemented for Glide as well.)
</p>
<br>
<h2><fontcolor ="#FFFFFF"><u>
6. Configuring
</u></font></h2>
<p>
As different options might wanted to be used for particular applications,
I kept the concept of local/global configurations (might be familiar from old dgVoodoo).
Current configuration is stored in a file named 'dgVoodoo.conf'. Its format can either be
binary or a textual INI-file for manual editing.
</p>
<p>
When the Glide or DirectX wrapped application starts, dgVoodoo tries to read
config data. The search paths and the order for the config file are the following:
<ul>
<li>Folder of the wrapper DLL</li>
<li>Folder of the application (EXE)</li>
<li>User application data folder</li>
</ul>
If the config file can be found in none of them then the default config is used.
</p>
<p>
For modifying config files, you can either use <fontcolor ="#FFFFFF">dgVoodoo Control Panel (dgVoodooCpl)</font> or edit it manually with a text editor.
dgVoodooCPL provides convenient GUI interface for all options but only the most important sections are available by default. You have to enable the advanced
options through the context menu. This is because of emphasizing the sufficiency of the default sections for the everyday usage and leaving the advanced
sections for practiced users knowing what they are doing.<br>
In dgVoodooCpl you can choose a folder where you can load (from) and save the current
configuration. Once you chose a folder, it remains in the list permanently.
If the CPL application finds a valid config file in its own folder (where the app itself
is located) then it automatically places the folder into the list and selects the folder.
Otherwise the user's application data folder is selected, by default.
</p>
<p>
Note that
<ul>
<li>CPL always writes INI format config file (unlike previous versions) - and you can edit it manually, passing over the CPL</li>
<li>CPL doesn't expose all the sections of the configuration by default only the most important ones - you have to enable additional ones through the context menu</li>
</ul>
</p>
<p>
If an application tolerates losing focus without closing/minimizing itself,
you can configure it dynamically: when the CPL starts up it builds
a list of detected running Glide/DirectX wrapped applications and insert it
into the folder selector combobox. When you select such a running instance
then the current state of the application is read as config and most of the
options can also be changed. So, you can set resolution, msaa, brightness,
etc on the spot without restarting the application (configurable items depend
on emulation type). When an option changes, it takes effect at once. If the
dialog gets cancelled or an other config folder/instance is selected, all the
changes gets cancelled as well.
</p>
<p>
You can always use the <fontcolor ="#FFFFFF">'Apply' button</font> to save the current config to the
selected folder or running application without exiting the CPL application.
Important to note:
</p>
<ul>
<li><p>
If the wrapped app and the CPL runs on different privilege levels
(admin/nonadmin) then the app won't appear in the instance list or they
cannot communicate to each other. Sorry for the inconvenience.</p>
</li>
<li><p>
Switching resolution or MSAA can only be performed perfectly if the
application re-renders everything on each frame. If it uses or keeps
previously (once-)rendered things like cockpits or similars then they will
be missing as will not get re-rendered. (Glide only)</p>
</li>
</ul>
<p>A folder inserted formerly into the list can be removed. Also, list of the
running instances can be refreshed.</p>
<br>
<h2><fontcolor ="#FFFFFF"><u>
7. Resolution and refresh rate overriding
</u></font></h2>
<p>
You can override the application resolution and refresh rate both for
Glide and DirectX rendering.<br>
There are three types of resolution overriding, and, the 'Resolution'
comboboxes contain two types of elements in the enumerated list:
</p>
<ul>
<li>
<fontcolor ="#FFFFFF">Static resolutions</font>
<p>
Those are enumerated by your videocard for the selected display output.
Select any of them, and the wrapper will force that one (along with the selected refresh rate),
no matter what resolution the application wants to set.<br>
Resolution 'Unforced' means always using the current application resolution, so there is no overriding at all.
</p>
</li>
<br>
<li>
<fontcolor ="#FFFFFF">Dynamic resolutions</font>
<p>
First, a little explanation on what the practical problems are with static
resolutions (especially for DirectX applications).
</p>
<ul>
<li><p>
The application may use multiple resolutions for different parts like movies,
menus and ingame. The statically chosen resolution may not have the same
aspect ratio as those of them. For app-resolutions with different aspect
ratios like 4:3 vs 16:9 it's a problem because one of them will be displayed
hugely distorted.</p>
<li><p>
Even if the app uses only one resolution, and you can select or type another
one with the same aspect ratio, then selecting the proper resolution is still
not an easy task:<br>
a) you don't necessarily know what resolution the app uses<br>
b) you don't necessarily know what the max resolution your display is capable
of<br>
c) even if you know both of them, you may have to calculate manually the
desired resolution.</p>
</li>
</ul>
<p>
(My own problem was the following: I sat down in front of a new computer with
a 4K monitor and wanted to try out some stuffs through dgVoodoo. I faced the
fact that I didn't know the exact monitor resolution, I also didn't know what
res the stuffs to try were using. I just wanted the maximum available
resolution to be forced that keeps the aspect ratio.)
</p>
<p>
Dynamic resolution is the synonim of "let the wrapper choose the current
resolution for you". The maximum, and also the base used for calculating the
current resolution, is your desktop resolution. The base rule is that the
wrapper always calculates the maximum available resolution for the given
scaling mode, but
</p>
<ul>
<li><p>you can restrict the base maximum to <fontcolor ="#FFFFFF">FullHD (1920x1080) or QHD (2560x1440)</font>
for weaker GPUs (like low-end cards or maybe, integrated chips) with large-res display outputs, and</p></li>
<li><p>you can restrict the scale factor to integer numbers.<br>
<li><fontcolor ="#FFFFFF">Max:</font> Maximum resolution available</li>
<li><fontcolor ="#FFFFFF">Max ISF:</font> Maximum resolution with integer scale factor available</li>
<li><fontcolor ="#FFFFFF">Max FHD:</font> Maximum resolution available
(but restricted to 1920x1080)</li>
<li><fontcolor ="#FFFFFF">Max FHD ISF:</font> Maximum resolution with integer scale factor available
(but restricted to 1920x1080)</li>
<li><fontcolor ="#FFFFFF">Max QHD:</font> Maximum resolution available
(but restricted to 2560x1440)</li>
<li><fontcolor ="#FFFFFF">Max QHD ISF:</font> Maximum resolution with integer scale factor available
(but restricted to 2560x1440)</li>
</ul>
<p>
When working with a dynamic resolution, the concrete resolution is unknown (calculated at runtime) hence no refresh rates are enumerated along with them,
even if enumerating refresh rates is enabled.
You can still force one (see Custom resolutions below).<br>
See the API specific readmes to understand the logic of selecting a real refresh rate value for unforced cases.
</p>
<li>
<fontcolor ="#FFFFFF">Custom resolutions</font>
<p>
A custom resolution is either a static one that is not in the enumerated list, or one that is partially overridden.
Defining a custom resolution through the CPL is about typing the string -manually into the combo box- describing the resolution/refresh rate pair.<br>
Resolution and refresh rate can be overridden independently on each other. Here are some examples (don't type quotation marks):
<ul>
<li>"128x128, 60" - means static resolution 128x128 at forced rate of 60Hz</li>
<li>"128x128, 0" or just "128x128" - means static resolution 128x128 without overridden refresh rate</li>
<li>"0x0, 75" or "unforced, 75" - means unforced (static) resolution with forced 75Hz</li>
<li>"max isf, 83" - means Max ISF dynamic resolution with forced 83Hz</li>
</ul><br>
If your resolution and refresh rate is in the list then it is better to select it from there than typing it manually.
It is because e.g. 60Hz is not exactly 60Hz in practice but 60.01Hz or 59.95Hz or so, depending on your display hardware.
dgVoodoo always handles the refresh rates in their exact rational form but it cannot do that with manually typed ones.<br>
When displaying a refresh rate in the combo box, dgVoodoo truncates the value. So, for example, 59.95Hz will appear as 59Hz
in the list, while the display manufacturer probably claims that your display supports 60Hz. Don't let it mislead you. It is all
about truncating or rounding the values.
</p>
</li>
</ul>
If you are terribly interested in how the current dynamic resolution is calculated then
a little technical part comes here. Otherwise you can skip this section.
<p>dgVoodoo takes the current desktop resolution as a base to do its calculations for self-done output scaling and other things like automatic pixel multiplying factor value.
There some games however that pre-set the desktop resolution (typically to some low resolution) before dgVoodoo gets in action, spoiling the rendering.
You can define your native desktop resolution here for such cases. If defined then this resolution is used for all outputs of the desktop.
<p>You can define what screen bit depth should be reported through dgVoodoo. It can be 8, 16 or 32. Empty definition means the current system desktop bit depth.
<p>When resolution is forced to other than the app default then a black frame is drawn around the output image coming from a wrapped API to remove scaling artifacts -
frame thickness can be defined in pixels (max 16, 0 = disable) (default is 1).
<p>Display region of interest: you can define a subrectangle in forced resolution space (or application resolution if it is unforced) to be the input of the scaling and
image presenting process. It works only for scaling modes where the image processing is done by dgVoodoo itself. Subrectangle can either be
<ul>
<li>defined as a proportion in form of <b>%d_%d</b>, like 16_9 or 16_10, etc.</li>
<li>or defined as a pixel size in form of <b>%d|%d</b>, like 320|200 or 640|400, etc.</li>
</ul>
<br>
Pos subproperty defines the top-left position of the rectangle. It can be
<li><b>AlwaysOnTop:</b> forces the window into the topmost z-order band</li>
<li><b>FullscreenSize:</b> the window content is the same as in fullscreen mode including the potential side black bars, depending on the scaling mode</li>
</ul>
<BR>
You can more or less emulate fake fullscreen with defining Borderless and FullscreenSize together along with enabling centered window.
<p>Very experimental option - when enabled dgVoodoo hooks some GDI functions to achieve displaying game cutscene movies rendered
through GDI (relying typically on the old AVI player lib)
</p></li>
</ul>
<br>
<h2><fontcolor ="#FFFFFF"><u>
10. Direct3D 12
</u></font></h2>
Why D3D12? Because I wanted to code something using D3D12 and rotating cubes are boring.
However, it has some drawbacks in dgVoodoo compared to D3D11.<br>
Here are some facts and tips in regard of D3D12:
<ul>
<li>dgVoodoo D3D11 is broken with AMD GPU's (DirectX modules). I got a ton of reports complaining about
solid colored polygons instead of textured ones. This problem seems to affect all
GCN 2 and newer GPU's and I cannot do anything about fixing it. I don't have a clue what change in my code
broke it and AMD probably won't fix their drivers so I don't care about it all anymore.<br>
On the other hand, according to the feedback I got, D3D12 works as expected so this is your
best bet on AMD hardware.
</li>
<br>
<li>Windows (not the OS but GUI windows) backed by swapchains with FLIP_DISCARD presenting mode, which is
mandatory for D3D12, cannot transition back to "legacy" (GDI) presentation mode. Unfortunately it means
that D3D12 can be completely unusable for applications that render into their windows through multiple API's
like GDI, D3D9, etc. and D3D12 (dgVoodoo). Such an application is DosBox. I don't recommend dgVoodoo D3D12 for that,
unless you play a Glide game that has no VGA-rendered parts.
</li>
<br>
<li>Unlike D3D11 swapchains in dgVoodoo, D3D12 swapchains (FLIP_DISCARD) always render into a window,
even in fullscreen mode. Some games resize their window to match the resolution they think they rendering at.
No matter if you run the game in fullscreen mode, this causes a small window in the top-left corner of the
desktop if it happens. Try disabling option <fontcolor="#FFFFFF">'Disable Alt-Enter to toggle screen state'</font> (see DirectX options)
in such a case. It may help because dgVoodoo window hooking runs on a different path in that case and it forces
back the window size to cover the entire screen.
</li>
<br>
<li>Implied by the previous point, D3D12 swapchains do not support gamma ramps as well. dgVoodoo can apply gamma
as a postprocess effect but I didn't want it to be always forced to have effect (to get max fps's for games
that don't really need gamma calibration) so it only works if option <fontcolor="#FFFFFF">'Inherit Color Profile in full screen mode'</font>
is enabled (see General options).
</li>
<br>
<li><fontcolor ="#FFFFFF">MSI Afterburner</font> relies on D3D11on12 to render its own overlay when hooking D3D12.
I ran into multiple cases when D3D11on12 crashed or hung at startup, for unknown reasons.
First try a game with MSIA shut down if you have problem with launching it.
</li>
<br>
<li>If you have multiple displays attached to different GPU's (rare case) then you can run into an
unexplainable initialization fail with certain games. D3D12 swapchains suffer from more restrictions than
D3D11 ones which the current version of dgVoodoo cannot handle well. Enable only one of your video cards
(see General options) and it should fix the problem.
</li>
<br>
<li>Because of the problems listed above and other known D3D12 issues that I want to address in subsequent releases, <fontcolor="#FFFFFF">Output API option 'Best available'</font>
never chooses D3D12 automatically. If you want D3D12 then you must choose it explicitly in the config.
</li>
<br>
<li>A last one: unlike in D3D11, feature levels cannot be forced in D3D12. D3D12 takes the minimum feature level as
an input parameter but initializes itself at the highest available one (which is greater than or equal to the mininum).
So, if your GPU supports FL12.0 then it's all for the same which feature level you choose in the config.</li>
</ul>
<h2><fontcolor ="#FFFFFF"><u>
11. General tips and known issues
</u></font></h2>
<ul>
<li>Forcing things (like resolution, antialiasing, texture filtering, etc) is
not a healthy thing. If an application or game uses low resolution or point
sampled textures or anything dissonant to the eye then it has reasons for
that. It is not because the programmers were so lame but of avoiding artifacts
that would otherwise get brought in (typical example is a bilinear filtered
texture with colorkey based transparency). If you force anything then
potentially get one of those artifacts. If you can live with it then it is ok,
use the wrapper in forced mode. If not then disable all forcings and use the
particular game or application in the mode it was designed for, because no
general method exists to fix such type of artifacts.</li>
<br>
<li>Controlling antialiasing cannot be done on per-primitive basis in Direct3D 11
when feature set larger than 10.0 is used. That is why antialiased drawing
is not emulated in Glide automatically in this version in any way (per-primitive or
per-edge). It can only be forced globally in the CPL application.</li>
<br>
<li>Fullscreen gamma ramp may not be supported by your card. nVidia and ATI seem
to handle it as expected but (e.g.) Intel does not.</li>
<br>
<li>When an application is being run in compatibility mode (Win98/XP etc) then
<fontcolor ="#FFFFFF">the user's application data folder is different than the OS default.</font>
Therefore dgVoodoo cannot read the global config file and the default
config gets applied if no local config file is present. The preferred way
is creating a local config for such cases if other than the default needed.
(Perhaps using the user's appdata folder is not a too good idea after all,
I might change it later.)</li>
<br>
<li>If you have a multimonitor system then always try a game to run on the primary
one for the first time. Some games lock the mouse cursor to the screen area
where game window is assumed to be (the left-top corner of the desktop).
If such a game is being forced onto another monitor then clicking in the game
causes application focus loss because its window is not under the mouse cursor.</li>
<br>
<li>I don't know why but overriding refresh rates by arbitrary values (in the resolution selector combo box) does not
seem to work for DirectX emulation. It is still subject to investigation because the code
handling this is common for both Glide and DirectX. :(
</li>
</ul>
<br>
<h2><fontcolor ="#FFFFFF"><u>
12. Special release version with debug layer
</u></font></h2>
Special release version of dgVoodoo contains an additional validator and report layer. Its purpose is
<ul>
<li>1) giving feedback to the user about potential error conditions, what currently is happening, and, how dgVoodoo is driven by the application at all</li>
<li>2) helping debugging a given application/game by the (extensive) feedback and opening the possibility to break into the debugger</li>
</ul>
dgVoodoo currently has 2 main types for debug feedback
<ul>
<li><b>Simple messages with 3 subtypes which can be disabled or associated with a debugger break</b></li>
<ul>
<li><fontcolor="#FFFFFF">INFO</font>: harmless message about various events like creating/releasing an API object, reading a config file, loading a module, etc.</li>
<li><fontcolor="#FFFFFF">WARNING</font>: a message about a potential error condition</li>
<li><fontcolor="#FFFFFF">ERROR</font>: a message about an API driving error or an internal error of dgVoodoo. The latter is fatal, while the prior one may be normal.</li>
</ul>
<br>
<li><b>Tracing</b> - means the full logging of API calls made to dgVoodoo and some additional information of dgVoodoo internals.</li>
<li><fontcolor="#FFFFFF">Level 1</font>: Logging of API calls</li>
<li><fontcolor="#FFFFFF">Level 2</font>: Logging of API calls + some additional info</li>
</ul>
</ul>
<p>
Messages and tracing are independent on each other. Tracing is mainly for devs, for quick and average usage only the messages are recommended.<br>
All of them are written to the debug output, logging to file is not yet implemented.<br>
<br>
So, I recommend you to use <ahref="https://docs.microsoft.com/en-us/sysinternals/downloads/debugview">DebugView</a> or much more <ahref="https://github.com/CobaltFusion/DebugViewPP/releases">DebugView++</a>.
They are very cool applications for cases when no any debugger is available. Also, if you have more than one monitors then you can watch the log in realtime: put DebugView++ on one display and run the game on another.
</p>
<p>
Messages have a <fontcolor="#FFFFFF">'[dgVoodoo]'</font> prefix so the best way to check out a game with dgVoodoo's debug layer is enabling filtering to the 'dgVoodoo' substring (Crtl-L in DebugView and F5 in DebugView++).
Every single log output appear in new lines in DebugView/DebugView++ - this is nice, except for some tracing messages written to the output part by part, like D3D8 disassembled shaders.
Unfortunately they appear nastily because of that.
</p>
<p>
It's not really a big problem however because I cannot recommend you to enable tracing. It's much more intended for developers but if you want to use it after all then
do it with <fontcolor="#FFFFFF">DebugView++</font> or a debugger like <fontcolor="#FFFFFF">Visual Studio 2015</font> because feedback is so tremendous that only tools
with asynchronous debug output window are able to handle it. Tools with synchronous debug output like <fontcolor="#FFFFFF">DebugView</font> won't be able to keep up with
it and make your game/app crawl at speed near zero.
</p>
<p>I must emphasize:
<ul>
<li>Do not look for a miracle when using the debug layer! If some game doesn't work for you then it can give you some useful feedback
on what's going on, or you can see if dgVoodoo is utilized at all but won't necessarily tell you why the game crashes, for example.<br>
Also, if you see an ERROR entry in the log then it doesn't necessarily mean you did something wrong or there is a problem with your game.
Many games rely on error codes got back from an API. So, for example if you see such a log like the following snippet
<PREclass=code>
...
[15500] [dgVoodoo] INFO: Direct3DDevice (0D3967D8)::EnumTextureFormats: Format XRGB8888 is enumerated to the application.
[15500] [dgVoodoo] INFO: Direct3DDevice (0D3967D8)::EnumTextureFormats: Format ARGB8888 is enumerated to the application.
[15500] [dgVoodoo] INFO: Direct3DDevice (0D3967D8) is released.
Then the error entry about failed 'DeleteAttachedSurface' is not really an error. The application tried to delete a potential attached z-buffer, just to make sure, and doesn't care about the result.
dgVoodoo however treat it as an error because it caused an error in an API method. It's really impossible to make a decision about classifying some conditions as an error or just a plain warning.<br>
But let's look at another case: one of my game just crashes right at startup. What could be the reason? The debug output is:
<PREclass=code>
...
[21964] [dgVoodoo] INFO: Direct3D8 (077BCEC8) Virtual video card is 'dgVoodoo Virtual 3D Accelerated' with 64MB onboard memory.
Ah, OK. Previously I configured the game to run on a display at 72Hz but now I'm trying to run it on another that does not support this refresh rate at this resolution,
so D3D8 initialization failed in dgVoodoo and so the game crashed due to lack of error checking.
</li><br>
<li>
Use the spec release only for trying to solve an extant problem with an applicaiton. Spec release does some extra checking and validation compared to normal dgVoodoo releases and it can bite off from the speed or cause stuttering.
<li>Bug of config item <b>GeneralExt\EnumeratedResolutionBitdepths</b> is fixed</li>
</ul>
</li>
<BR>
<li>
<fontcolor="#FFFFFF">2.55.1 - Minor update to 2.55</font>
<ul>
<li>Forceable internal bit depth of D3D depth buffers</li>
<li>Bugs in D3D light handling, fixed (Soldiers of Anarchy, Cold Zero demo)</li>
<li>D3D alphablending fix (Mage Bros)</li>
<li>Workaround for D3D8 vertex buffer overwrite (BattleField 1942)</li>
<li>Some incomplete interface querying is fixed for aggregated D3D devices</li>
<li>New options (enumerated resolution bit depths, limited default enumerated resolution) for DirectX along with minor fixes in the config validator</li>
<li>Corrected tmuRev and fbiRev version number for some 3Dfx card types</li>
<li>Minor changes in the debug layer (corrected mistypings, some value types are replaced by strings, etc.)</li>
</ul>
</li>
<BR>
<li>
<fontcolor="#FFFFFF">2.55</font>
<ul>
<li>Special release of dgVoodoo with DebugLayer providing feedback information is now available</li>
<ul>
<li>INFO, WARNING and ERROR type messages with severity levels, including breaking into debugger</li>
<li>API call tracing with detailed information</li>
</ul>
<li>Migrating to INI format configuration files - also, adding rarely needed/used configuration options for advanced users and game hacking like</li>
<ul>
<li>Dithering for both Glide and DirectX</li>
<li>Deframer</li>
<li>Pixel multiplied output with arbitrary or automatic scale factor</li>
<li>Arbitrary extra DirectX resolutions</li>
</ul>
<li>New scaling mode for centered appearance, scaling is done by the wrapper</li>
<li>New dynamic resolution modes (2x, 3x, ...) are added</li>
<li>Fixes for scaled output done by the wrapper ('Stretched, * AR' and 'Centered, AR' modes with larger than max of display-supported output images)</li>
<li>Fix for 'Best available one' output type when only WARP is available</li>
<li>Improved shader handling:</li>
<ul>
<li>Resource cache for reuse of D3D8 compiled shaders</li>
<li>
Dynamic shader compiling is moved to a background thread to avoid/minimize lags<br>
Glide: for all compiled shaders<br>
DirectX: for all compiled shaders that can be substituted by precompiled ones; also, unneeded shader variants could be unnecessary compiled, fixed
</li>
</ul>
<li>
Control Panel App
<ul>
<li>Folder/location list handling code is rewritten</li>
<li>Appearance is now PerMonitorAwareV2 for DPI scaling</li>
<li>Cosmetics: missing logo bitmap when monitor scale is >150%, fixed</li>
</ul>
</li>
<li>
DirectX
<ul>
<li>DllMain detection along with warning messages through the debug layer</li>
<li>Surface/texture lock incompatibilites fixed (Zombie Shooter, The Mystery of the Druids)</li>
<li>DirectDraw surface-create, cooperative level, PageLock error and other incompatibility fix (Zero Comico, RC de Go, A Bug's Life, Wartorn, Message in a Haunted Mansion, Micro Machines v3)</li>
<li>24 bit surface creation issue in DirectDraw is fixed (Blade Of Darkness lava)</li>
<li>Support for partial Z-buffer copy in DirectDraw (The Revenant)</li>
<li>Option for disabling the default and classic resolutions</li>
<li>Possibility of extra resolutions enumerable to applications is added</li>
<li>Bugs causing crash and black screen are fixed (Empires Dawn of The Modern World, Honour & Freedom)</li>
<li>Some effort for avoiding app deadlocks in DirectDraw and QuartzHookLayer</li>
<li>D3D FVF and other parameter validation incompatibility, fixed (Praetorians, Earthworm Jim 3D)</li>
<li>D3D state block incompatibility, fixed (Soldiers of Anarchy)</li>
<li>D3D non-W-friendly matrix in ComputeSphereVisibility calcs, fixed (Pac-Man Adventures in Time)</li>
<li>Old D3D-lighting incompatibility, fixed (when revising code and docs)</li>
<li>D3D lighting issue is fixed (flashing lights in Tomb Raider 4 and hopefully King Of The Roads)</li>
<li>Fixing range based fog hw calculations (The Chosen: Well of Souls)</li>
<li>ATI and GeForce profiles are modified to force W-pixelfog (compatibility with old drivers)</li>
<li>Windows input issues caused by the wrapper are fixed (Outlaws, GTA1 DDraw mode, etc.)</li>
<li>Rendering transition between Glide/DDraw is fixed (Outlaws)</li>
<li>Concept of setup application is replaced with concept of Control Panel (CPL)</li>
<li>Control Panel App:</li>
<ul>
<li>Contrast as a new color adjustment option is added</li>
<li>Preserving predefined monitor color profile(s) for fullscreen mode as an option is added</li>
<li>A general option for centering the application/game window is added</li>
<li>DirectX texture filtering options are changed, possibility of forcing anisotropic filtering is introduced</li>
<li>New scaling mode with C64-like output (it's not a feature but more like an experimenting code)</li>
<li>Visual cosmetics</li>
</ul>
<li>DirectX:</li>
<ul>
<li>
Some of the DDraw code is guarded to avoid the unexpected worst-way DLL unloading<br>
Now LithTech engine games (Blood2, NOLF, Kiss Psycho Circus, ...) should tolerate Alt-Tab on Win10
</li>
<li>Some other extra guarding to prevent crashes, Virtua Cop2 now works in D3D mode</li>
<li>Blit bug and clipper incompatibility fixed in DDraw (D3DRM, Tokipazu, tech demo Final Reality)</li>
<li>Minor issue in DDraw and bad L6V5U5 format descriptor is fixed (Kyro tech demos)</li>
<li>Adding support for plain surface format A8L8 (DDraw) (Matrox G400 Tech Demo)</li>
<li>D3D3 fog fixed (Shadows of The Empire patched to 1.1)</li>
<li>Execute buffer bug fixed in D3D (D3DRM)</li>
<li>Some D3D5 incompatibilities are fixed (crash and texture handling with Space Bunnies Must Die)</li>
<li>Fixing D3D6 bugs and calculations of old software-only lighting and other incompatible things (DX6 SDK sample applications (Immediate/Retained) + Fog City/Tirtanium demos)</li>
<li>Unexpected way of texture compression is implemented (D3D7, Soulbringer)</li>
<li>Adding support for Q8W8V8U8 texture format (D3D8) (3DMark 2001 SE, Nature, Pixel shader and Advanced Pixel shader test)</li>
<li>D3D8 device handling bug is fixed (multimonitor environment)</li>
<li>
D3D8 compatibility fixings, now handling managed textures is compatible with Phantasy Star Online Blue Burst
(corrupt mipmapping)
</li>
<li>Issue with D3D8 device capabilities and SYSTEMMEM vertex buffers are fixed (LKCC demos)</li>
Lower resource usage is partly included in this version.
For the time being, only the usage of GPU accessible system memory.
</li>
<li>
General bugfixing, like unexpected forced windowed mode (Soulbringer movies), vertex shader (missing fog in Colin McRae Rally), non-perspective polygon drawing bug,
fixed (Zanzarah The Hidden Portal), and a lot other
</li>
<li>Handling depth buffers had some bugs at FL 10.0, fixed (D3D11)</li>
<li>Potential bad driving of D3D11 at FL10.1 when no resolution and MSAA is forced (D3D11) (Gorky17)</li>
<li>Some (regression and other) bugs in the D3D11 renderer are fixed</li>
<li>GeForce 4 profile is slightly modified to match a real GF4</li>
<ul>
<li>Now light beams in Splinter Cell 1 should be rendered correctly through the GF4 card type (unblurred lights with occlusion)</li>
</ul>
<li>2 new videocard types are added:</li>
<ul>
<li>GeForce FX 5700 Ultra (keeps the soft shadows for Splinter Cell 1 (because I like it :D) and will hopefully be feasible to provide place for new features later)</li>
<li>Matrox Parhelia-512 (for Matrox Coral Reef Demo 1.1 and other Matrox tech demos)</li>
</ul>
</ul>
<li>Glide:</li>
<ul>
<li>Glide fix (far background in front of the 3D world: Mig29, Uprising)</li>
<li>Texture memory report is modified to match that of a real 3Dfx driver (Slave Zero)</li>
</ul>
<li>Tons of code changing for new features that are not ready yet and so not included in this version</li>
</ul>
</li>
<br>
<li>
<fontcolor="#FFFFFF">2.53</font>
<ul>
<li>Support for 'dynamic resolutions' (see section 'Resolution overriding')</li>
<li>
Added support for 'd3dcompiler_47.dll', so Win10 users don't have to
download and mess with d3dcompiler dll, 47 is part of the Win10 OS.
</li>
<li>
Linear filtering was applied for upscaling the output-image even if the
scale ratio was 1.0, fixed
</li>
<li>
Some modifications on the CRT-like shader were done for correct CRT-like
appearance on high-res displays like a 4K monitor
</li>
<li>Glide mode 'Compare to bias' is fixed (Esoteria demo)</li>
<li>Some other Glide rendering issues are fixed (Hype - The Time Quest)</li>
<li>
DDraw system memory surface pitch is fixed to match that of DIBs
(Snow Wave Avalanche)
</li>
<li>
A DX8 bug is fixed, so Mafia now works, altough I experience z-buffer
glitches here and there (to be fixed)
</li>
<li>Lot of general D3D/D3D8 bugs are fixed, too</li>
<li>
GeForce4-style shadow buffering is reverse engineered and implemented in
the 'Geforce Ti4800' preset
</li>
<li>
Floating point arithmetic differences (incompatibilities) between vs1.x
and vs4.x are resolved, Splinter Cell 1 now works in shadow buffer mode
</li>
<li>
New dynamic vertex buffering algorhythm for removing rendering performance
bottleneck, better usage of GPU
</li>
<li>
The config application is now per-monitor DPI-aware, to have sharp
appearance
</li>
<li>MSAA option name 'Auto' is changed to 'App driven'</li>
<li>New option for DirectX emulation is added (No texture filtering)</li>
<li>Changes in the default config:</li>
<ul>
<li>Capture mouse is on</li>
<li>MSAA is app driven</li>
</ul>
<li>Doc format is changed from txt to html and content is revised</li>
</ul>
</li>
<br>
<li>
<fontcolor="#FFFFFF">2.52</font>
<ul>
<li>Support for new output APIs are added</li>
<ul>
<li>Direct3D11 at feature level 10.0 (there are some restrictions)</li>
<li>Direct3D11 Microsoft WARP renderer</li>
</ul>
<li>Support for rendering DirectShow movie playback</li>
<li>Resolution overriding for DirectX emulation is now available</li>
<li>
New scaling mode (forced 4:3 aspect ratio) with/without CRT-like
appearance is added
</li>
<li>MSAA support for DX8</li>
<li>Lot of DX8 bugfixings</li>
<li>A few DDraw/D3D bugfixings</li>
<li>
Making 'VertexLayout' functionality be compatible with a real 3Dfx
driver (Glide3)
</li>
</ul>
</li>
<br>
<li>
<fontcolor="#FFFFFF">2.51</font>
<ul>
<li>Point sprite support for DX8 is added</li>
<li>New texture formats (A8, L8, A8L8) for DX7/DX8 are added</li>
<li>Tons of DX8 bugfixings, more compatibility</li>
<li>More DirectDraw compatibility in object handling + bugfixing</li>
<li>Regression bugs in Glide fixed</li>
<li>
Capabilities of GeForce Ti 4800 and ATI Radeon 8500 are changed to be much
closer to the real ones (see the technical details in the DX readme)
</li>
<li>
AMD driver bug causing driver crash with Glide rendering is workarounded
now dgVoodoo should work on all AMD cards properly
</li>
<li>'Fast video memory access' is now compatible with Unreal engines</li>
<li>
Emulated method of stretching the display output with keeping aspect ratio
is added
</li>
</ul>
<br>
<li>
<fontcolor="#FFFFFF">2.5</font>
<ul>
<li>First version of D3D8 implementation is added</li>
<li>
Lot of bugs fixed during general DirectX code refactoring, I don't want
to detail them all here
</li>
<li>
Dynamic shader compiling for all API components for better performance
(see Usage and DirectX readme for details, you'll need D3DCompiler_43.dll
for this feature)
</li>
</ul>
</li>
</br>
<li>
<fontcolor="#FFFFFF">2.45</font>
<ul>
<li>Heavily refactored DirectX emulation code for certain planned features</li>
<li>Full cooperating between Glide and DirectX</li>
<br>
<li>
DirectDraw emulation:
<ul>
<li>True multidevice support, more robust DDraw emulation</li>
<li>OLE interface support for DirectDraw</li>
<li>
DXTC (S3TC) block compression encoder is added, full support for
possible alpha-format conversions
</li>
<li>
Two new video card types are added with slightly different properties
(GeForce4 Ti 4800, ATI Radeon 8500)
</li>
<li>DirectDraw emulation-only mode could fail, fixed</li>
<li>Various DirectDraw bugs/incompatibilities are fixed</li>
<li>Blitting bugs fixed + full support for blitting from primary surface</li>
</ul>
<br>
<li>Direct3D emulation:</li>
<ul>
<li>
New colorkeying method added and existing colorkeying related bugs
are fixed
</li>
<li>Bugs in rendering from execute buffers (points/lines), fixed</li>
<li>Bug in handling state blocks, fixed</li>
</ul>
<br>
<li>Glide rendering</li>
<ul>
<li>Resolution extension support (idea and technical concept by VEG and Zeus)</li>
</ul>
</ul>
</li>
</br>
<li>
<fontcolor="#FFFFFF">2.44</font>
<ul>
<li>DirectX emulation:</li>
<ul>
<li>Some surface/D3D device related bugs are fixed</li>
<li>Mirrored blitting was broken, fixed</li>
<li>24bit software surface support is added</li>
<li>
support for DXT1-5 compressed textures is added but an S3TC encoder is
still missing for the cases when a compressed texture is the blitting
target
</li>
<li>
Transforming normal vectors was incompatible with MS D3D, fixed
This fix includes enabling/disabling of normalizing them, default was
wrong for older than DX7 interfaces
</li>
<li>Colorkey blend capability is added</li>
<li>support is added for old mode-X display modes</li>
<li>Various other small bugs fixed that I can't remember of</li>
</ul>
</ul>
</li>
</br>
<li>
<fontcolor="#FFFFFF">2.43</font>
<ul>
<li>DirectX emulation:</li>
<ul>
<li>3D support for 8 bit surfaces is added (Colin McRae Rally)</li>
<li>
Improved surface blitting, more optimal resource consuming for 3D
surfaces
<li>First version of fast surface video memory CPU-access is added
<li>
Introducing 'lost' state into the default DX behavior, with additional
automatic self-restore mechanism for buggy DX applications