On Friday, 3 April 2015 at 04:55:42 UTC, Mike Parker wrote:
On Thursday, 2 April 2015 at 09:38:05 UTC, Namespace wrote:
Dgame is based on SDL 2.0.3 (as described in the installation
tutorial), but tries to "wrap" any function call which is
introduced after SDL 2.0.0:
----
static if (SDL_VERSION_ATLEAST(2, 0, 2))
----
so that Dgame should be usable with any SDL2.x version.
I will investigate which function is calling SDL_HasAVX.
None of that matters. This has nothing to do with what Dgame is
calling, but what Derelict is actually trying to load.
SDL_HasAVX was added to the API in 2.0.2 so does not exist in
previous versions of SDL, therefore an exception will be thrown
when Derelict tries to load older versions and that function is
missing.
Dgame will load DerelictSDL2 as usual and then it will check
if the supported version is below 2.0.2. If so, DerelictSDL2
will be reloaded with SharedLibVersion(MAX_SUPPORTED_VERSION)).
That should that work, right?
No, it won't. By default, Derelict attempts to load functions
from the 2.0.2 API (which includes 2.0.3, since the API did not
change). That means anything below 2.0.2 will *always* fail to
load because they are missing the functions added to the API in
2.0.2.
The right way to do this is to use the selective loading
mechanism to disable exceptions for certain functions. With the
1.9.x versions of DerelictSDL2, you no longer have to implement
that manually. As I wrote above, you can do this:
DerelictSDL2.load(SharedLibVersion(2,0,0));
With that, you can load any version of SDL2 available on the
system, from 2.0.0 on up. It uses selective loading internally.
For example, 2.0.0 will load even though it is missing
SDL_HasAVX and several other functions added in 2.0.1 and
2.0.2. But you should only do this if you are absolutely sure
that you are not calling any functions that were not present in
2.0.0. For example, the SDL_GetPrefPath/SDL_GetBasePath
functions were added in 2.0.1. If you require those and need
nothing from 2.0.2, then you should do this:
DerelictSDL2.load(SharedLibVersion(2,0,1));
Now, 2.0.0 will fail to load, but 2.0.1 and higher will
succeed. You can look at the functions allowSDL_2_0_0 and
allowSDL_2_0_1 in sdl.d [1] to see exactly which functions were
added in 2.0.1 and 2.0.2 so that you can determine if you
require any of them. I also encourage you to go and do a diff
of the SDL headers for each release to see things other than
functions, like new constants, that were added in each release
(and to protect against the possibility that I've made a
mistake somewhere). That won't affect whether or not Derleict
loads, but a new constant added in SDL 2.0.2 won't work with a
function that existed in 2.0.0, for example.
Yes, you're right. I'll undo my changes and I'll set SDL 2.0.2 as
a basis for Dgame. Thank you for the explanation. :)