On Monday, 22 May 2017 at 16:56:10 UTC, Mike Parker wrote:
On Monday, 22 May 2017 at 16:37:51 UTC, Andrew Edwards wrote:
Specific context at the following links:
https://github.com/glfw/glfw/blob/66ff4aae89572419bb130c5613798e34d7521fc7/deps/glad/glad.h#L24-L48
Generally, any functions in the Windows-specific sections with
APIENTRY in their declarations need to be declared in D as
extern(Windows). APIENTRY itself can be left out of the D
binding.
There isn't any Windows specific section. Every function pointer
in the library is decorated in one of the following two forms
void (APIENTRY *NAME)(PARAMS)
or
void (APIENTRYP NAME)(PARAMS)
Both happen to be the exact same. So does mean that for every
function pointer in the file, I need to duplicate as such?
version (Windows)
{
extern(Windows)
{
alias NAME = void function(PARAMS);
}
}
else
{
extern(C)
{
alias NAME = void function(PARAMS);
}
}
https://github.com/glfw/glfw/blob/66ff4aae89572419bb130c5613798e34d7521fc7/deps/glad/glad.h#L57-L81
Again, GLAPI is a Windows-specific thing. [...]
You can safely ignore this one, unless you're planning to do a
pure D port (not binding) of the library and intend to compile
as a shared lib. It tells you which functions need to be
exported from the shared lib to match the C API.
So if I'm understanding correctly, on Windows platforms this:
typedef void (APIENTRYP PFNGLDISABLEPROC)(GLenum cap);
GLAPI PFNGLDISABLEPROC glad_glDisable;
#define glDisable glad_glDisable
is technically:
typedef void (__syscall* PFNGLDISABLEPROC)(GLenum cap);
extern "C" PFNGLDISABLEPROC glad_glDisable;
#define glDisable glad_glDisable
which in D is:
// extern (Windows) obviated by the fact that the following
line exports to the C API?
extern (C) alias glad_glDisable = void function(GLenum cap);
glad_glDisable glDisable;
https://github.com/glfw/glfw/blob/66ff4aae89572419bb130c5613798e34d7521fc7/deps/glad/glad.h#L88-L124
[...]
This one can also be ignored on the D side.
Got it.