Ok, you're right about the @eval include - I forgot that include doesn't remember its module like eval.
But again, check the llvm output or run a benchmark. The lowered code doesn't tell you all that much, because the ccall hasn't been compiled at that point. On 2 April 2014 13:51, Simon Danisch <[email protected]> wrote: > But without the eval, the include will be evaluated in the module, from > where you call "load". > Which means, the functions don't get exported by the OpenGL module. > So I need one @eval to evaluate things inside the OpenGL module, and the > other is for inlining the function ptr. > (As far as I understand the code... At least with the code I posted > everything seems fine) > Isaiah solution emits this code, which should be slower: > > > > > > > > 123 > > > $(Expr(:lambda, {:name}, {{},{{:name,Uint16,0}},{}}, :(begin #penGL.jl, line > 6: > > > return top(ccall)($(Expr(:call1, :getFuncPointer, > "glGetString"))::Ptr{None},Ptr{Int8},(Ptr{Int8},),top(box)(Ptr{Int8},top(box)(Uint64,top(zext_int)(Uint64,name::Uint16))::Uint64)::Ptr{Int8},name::Uint16)::Ptr{Int8} > > > end::Ptr{Int8}))) > > > > 2014-04-02 14:38 GMT+02:00 Mike Innes <[email protected]>: > > Ok, if you're using an include then you don't need those @evals. Your @eval >> include("gl4_3.jl") is definitely redundant, since include happens at >> run time anyway. >> >> You should benchmark it yourself to be sure (or perhaps check the llvm >> output) but I'm pretty sure Isaiah is right here - you can also get rid of >> the @eval in gl4_3.jl without any performance penalty, and that >> definitely cleans things up. >> >> In which case you end up with: >> >> #OpenGL.jl: >> >> >> function load(getProc::Function) >> >> >> global const getProcAddress = getProc >> >> >> include("gl4_3.jl") >> end >> >> #gl4_3.jl >> >> >> glGetString(name::Uint16) = ccall(getProcAddress("glGetString"), Ptr{Cchar}, >> (Uint16,), name) >> >> >> export glGetString >> >> >> On Wednesday, 2 April 2014 13:15:45 UTC+1, Simon Danisch wrote: >>> >>> Hm... just the pointer to getProcAddress will be inlined, but not the >>> pointer to glGetString, right? >>> >>> with Mike's solution the lowered code looks like I want to have it: >>> >>> $(Expr(:lambda, {:name}, {{},{{:name,Uint16,0}},{}}, :(begin # >>> /home/s/load.jl, line 2: >>> >>> >>> return top(ccall)(Ptr{Void} >>> @0x00007f402e6dadc0,Ptr{Int8},(Uint16,),name::Uint16,0)::Ptr{Int8} >>> >>> >>> end::Ptr{Int8}))) >>> >>> >>> >>> >>> >>> >>> I've one more question, though! >>> >>> >>> I use this code to include the definitions from another file, but this >>> doesn't look very elegant... >>> >>> >>> Are there better options? >>> >>> >>> >>> >>> #OpenGL.jl: >>> function load(getProc::Function) >>> >>> >>> global const getProcAddress = getProc >>> >>> >>> @eval include("gl4_3.jl") >>> >>> >>> >>> end >>> >>> #gl4_3.jl >>> @eval begin >>> >>> >>> glGetString(name::Uint16) = ccall($(getProcAddress("glGetString")), >>> Ptr{Cchar}, (Uint16,), name) >>> >>> >>> export glGetString >>> end >>> >>> >>> >>> Thank you very much! >>> >>> Am Dienstag, 1. April 2014 14:30:12 UTC+2 schrieb Simon Danisch: >>>> >>>> Hi, >>>> I'm working on the OpenGL package and I want to make it finally usable >>>> in a nice and clean way on all platforms. >>>> The problem is, that one needs pointer for the GL functions, which you >>>> can only get, after initialization of the OpenGL context. >>>> But initializing the context and creating a window shouldn't be part of >>>> the OpenGL package. >>>> >>>> So I tried two different approaches, which both seem to have their >>>> downsides: >>>> >>>> 1. >>>> Initialize OpenGL context when including the OpenGL package >>>> This is bad, because this makes the OpenGL package dependent on some >>>> third party OpenGL context creation library. >>>> >>>> 2. >>>> Load the functions later with a loading Function. >>>> Bad, because the function definitions are not visible for any other >>>> module, that relies on the OpenGL package. >>>> >>>> My ideal solution would be, to evaluate a macro when the function is >>>> called and not when the module is included. >>>> Like this, I can define all the OpenGL functions already in the OpenGL >>>> module, and when you call them the first time, >>>> the right function ptr gets inserted into the ccall, or an error is >>>> raised, when OpenGL context is not initialized. >>>> >>>> this could look like this: >>>> >>>> >>>> module OpenGL >>>> >>>> macro getFuncPointer(name::ASCIIString) >>>> return getProcAddress(name) >>>> end >>>> >>>> glGetString(name::GLenum) = ccall(@getFuncPointer("glGetString"), ...., >>>> ...., name) >>>> export glGetString >>>> end >>>> >>>> >>>> using OpenGL >>>> ...create OpenGL context >>>> #define getProcAddress >>>> global const getProcAddress = glutGetProcAddress # If using GLUT for GL >>>> context creation >>>> #call gl Functions >>>> glGetString(GL_VERSION) >>>> >>>> Any ideas how to do this in a clean way? >>>> >>>> >>>> Cheers, >>>> >>>> Simon >>>> >>> >
