It's basically SE 2.8 then. I wonder, upgrading it to DX9 was really that hard? That's true, I didn't do it yet, but my aim is to rewrite a code to allow support for various rendering libraries, both DirectX and OpenGL. Other thing is, that despite trying of various ways to achieve that, I didn't succeeded yet.
Besides the deprecated methods, and some parameter changes, sampler states changes to be separated into sampler/texture stage states with different enumerations/methods, etc., there are a number of things going from DX 8 to 9 that break and have to be redone a different way. From what I remember:
Shadows for characters (not buildings) gets broken, creating artifacts, and there is a 'trick' to get the complete shadow to display on the ground surface.
Screenshots to render both a file and the texture image used for save games gets broken and has to be rewritten.
Videos for DX 8 are rendered using ddraw, and I found that still worked for WinXP in DX9, but breaks for Win7, and presumably later OS as well. This had to be completely rewritten. While Windows Media Foundation is the latest, not knowing enough about that stuff and not finding a readily available example to translate how the existing game code did things to Media Foundation, I opted to use DirectShow, which is still dated, but I was able to adopt a quick way to convert how things were done to use that instead. That required making a DirectShow project, compiling all the Direct Show libraries in the SDK so I could reference them. Then it turned out that set of libraries has to be compiled with all the exact same compile options as the project you intend to use them with, else you get linker errors galore due to method signature differences.
Techniques requires some work as all the shaders need to be declared in a different manner, as the STREAM method used in Techniques is no longer supported in DX 9. This required some changes to .sha files in some cases (which was trial/error for me as I don't really know much about it). Then the shader declarations need to be coded into a special array on the back end, to match the registers from the shader that will be used.
Also noticed that DX9 was more particular about resource release and during exit/shutdown of the game, the process would sometimes 'hang' unresponsive or crash because resources have to be released in reverse order of how/when they were created (textures, surfaces, vertex/index buffers, etc.). If not done in proper order, the ->release call on the dx9 object in question would not actually do anything and it stayed in memory. So, in the render deconstruction, I had to reorder all the preserved resource releases until nothing was left. I used PIX to figure out what wasn't being released even if a release was called and reordered until it was all figured out. Fun times.
I suppose I'm just saying it wasn't as trivial as hoped. Though I am curious about what BMS hangup turned out to be. They released, then dropped it? Wonder what they missed to cause issue? So far mine seems to be doing OK compared to how DX8 worked.
BMS should try 64-bit conversion, if they think DX9 was bad. That was brutal! Have to get rid of all the ASM usage just to even compile it, which means rewriting the asm as C++, find all the data types that were intended to store pointers as ints, then later derefenced, but ints are too short for 64 bit pointers, so crash no good...etc., that was fun! LOL But someone's been testing that for me and 64 bit appears to be stable so far.
Anyway, I've always like that idea you proposed about supporting various renderers, and while I can picture in my head how to maybe tackle it, that would still be a beast of a task to abstract out all the direct type/method references in the various parts of the source, in order to pass through to a 'black box' that can then pass off the necessary commands to the rendering device selected. Cool idea, but I'm not anxious to jump on that in the near future, LOL.