You are hereProducts / Direct2D ePSXe and PCSXr GPU Plugin

Direct2D ePSXe and PCSXr GPU Plugin

Download Now

This is an updated and accelerated version of Pete's original DirectDraw plugin with some optimizations here and there. It also fixes some of the bugs and limitations that were present, in particular, you can now save state without the theme being disabled on Win7. Also, viewing the framebuffer now works whatever scaling mode you select rather that just the first three.

Also added is the xBRZ scaling algorithm using a modification of the previous Pete + xBrz plugin code. 4x upscaling options are now included (mainly for experimental purposes) for both xBRZ and the HQx filter. These filters use multi-threading hence why the download includes OpenMP.


Since this is Direct2D based, you need to be running at least Windows Vista SP2 with the Platform Update. Past that, any version of Windows 7 and up is fine. A SSE2 enabled CPU isn't required. If you don't have one, the original routines are used so it will still work.


The download contains the plugin dll, and the C/C++ source code that's GPL v2 licensed. To install it, you simply have to copy the contents of the plugin folder to your emulators plugin directory.

Download now (451 KB)
MD5: ae90538a41073ce88a3aba4efd7c339f
SHA1: 8c939c7711c4686ccce4d81d83eb9f8bfeb7df12
CRC32: d0ee2c5f

Changelog / Notes

- Upgraded DirectDraw and GDI to Direct2D and DirectWrite, no more 15 or 16 bit colour modes
  as they are not supported
- Consolidated all the BlitScreen functions as there was really only need for two. Those
  basic one which just blits, and the one which calls the specified filter

- Updated Save State picture to use WIC, fixes the theme switching thing that was happening on Win7 when savestating

- Removed scaling limitations. The original version wouldn't do 2x scaling at PSX display widths
  greater than 512, or 3x scaling at greater than 340 due to fixed SaI buffer sizes. All blits at all
  resolutions are now scaled 

- Added xbrz upscaling filter, modified it to allow non width x 4 stides (required with the above change)
  and to remove std::vector so that MSVCP* wasn't brought in just for that.
  Also changed it to use OpenMP rather than TBB, since that comes with Windows / Visual Studio and
  TBB doesn't. Note that this now makes a C++ compiler required to completely build these sources

- Implemented SSE2 pixel format conversions. CPU capabilities are checked before use,
  if your's isn't capable or its disabled via the config window (Disable SSE2) the original ones are used
- You can now see the frame buffer solely by pressing F12 (or whatever you've rebinded the key as)
  The Debug Mode checkbox has been removed, in essence it's now always on
  (Letting you press F12 was all that it controlled anyway)

- Frame buffer display (F12) now works on all scaling modes, not just the first three

- Scanlines no longer kill Windows anymore

- FPS text (The 'del' key banner) now includes the PSX's rendering resolution

- F8 screenshotting is now WYSIWYG. You only get the framebuffer if you've actually turned it on.
  Also, screenshots are now native size (the resolution shown in the FPS text)
  Half height screenshots are not a bug! The real PSX GPU can display at double height

- Disabled building of hqx assembly codes because I couldn't be bothered to work out how it works
  so I could modify it to allow variable buffer strides and 32bpp input. 
  Replaced it with some equivalent C
- Added HQ4X and xbrz4x modes mainly just to test. They're both multithreaded so they might be
  workable but no promises.
- Added define UPSCALE_THREADS for number of threads to use in multithreaded upscaling
  algorithms (just HQX and xbrz right now). If not defined it defaults to number of logical processors.
  My release has been compiled for 4 threads. It's defined in the VCProj rather than in the source.

- Added some ifdef'd out rudiments for recording audio along with video during recording. The define is
  GPU_RECORD_AUDIO. If you want to work with it you'll need to define three functions (grep for AudRecord*)
  for input mix format, starting and stopping recording. You'll probably want to kill LoadAvCodecACM unless
  you have access to my harddrive. It's a basic LibAV ACM codec if you're wondering. Don't write one yourself
  ACM's model is incompatible with most of LibAV's codecs.

- Recording now does its writes on a separate thread. I noticed that some codecs caused 
  rendering to stutter every now and then, probably due to internal flushing.
- myd2d1.h must be used instead of the normal d2d1.h in the sdk. The real one is broken
  as far as its C API goes.
- Any required strecthing of the output is performed with linear interpolation since
  this comes for practically free with D2D. Search for _DrawBitmap if you want to change it.
Ridge Racer in ePSXe using the D2D plugin