Dgame RC #1

Namespace via Digitalmars-d-announce digitalmars-d-announce at puremagic.com
Fri Apr 3 02:32:24 PDT 2015


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. :)


More information about the Digitalmars-d-announce mailing list