On 11/18/2013 01:38 PM, Ian Romanick wrote:
On 11/17/2013 12:01 AM, Keith Packard wrote:
Adding _X_HIDDEN doesn't actually maange to hide these functions as
the compiler refuses to change the visibility from what was declared
in gl.h

Signed-off-by: Keith Packard <kei...@keithp.com>
---
  glx/glxstubs.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/glx/glxstubs.c b/glx/glxstubs.c
index 69bc004..99f1cba 100644
--- a/glx/glxstubs.c
+++ b/glx/glxstubs.c
@@ -34,7 +34,7 @@
  #include "glxserver.h"

  #define thunk(name, type, call_args, ...) \
-    _X_HIDDEN void name(__VA_ARGS__) { \
+    GLAPI void APIENTRY name(__VA_ARGS__) { \
        static type proc; \
        if (!proc) proc = __glGetProcAddress(#name); \
        proc call_args; \


Yeah.... this can't work reliably and is generally yucky.  I'm curious
why Adam didn't just use the GLEW trick of having a #define glFoo that
calls through a function pointer _glewFoo.  I think Waffle does
something similar... but is much more clever than GLEW by avoiding the
need for a glewInit function.

On 11/18/2013 01:38 PM, Ian Romanick wrote:
> On 11/17/2013 12:01 AM, Keith Packard wrote:
>> Adding _X_HIDDEN doesn't actually maange to hide these functions as
>> the compiler refuses to change the visibility from what was declared
>> in gl.h
>>
>> Signed-off-by: Keith Packard <kei...@keithp.com>
>> ---
>>  glx/glxstubs.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/glx/glxstubs.c b/glx/glxstubs.c
>> index 69bc004..99f1cba 100644
>> --- a/glx/glxstubs.c
>> +++ b/glx/glxstubs.c
>> @@ -34,7 +34,7 @@
>>  #include "glxserver.h"
>>
>>  #define thunk(name, type, call_args, ...) \
>> -    _X_HIDDEN void name(__VA_ARGS__) { \
>> +    GLAPI void APIENTRY name(__VA_ARGS__) { \
>>        static type proc; \
>>        if (!proc) proc = __glGetProcAddress(#name); \
>>        proc call_args; \
>>
>
> Yeah.... this can't work reliably and is generally yucky.  I'm curious
> why Adam didn't just use the GLEW trick of having a #define glFoo that
> calls through a function pointer _glewFoo.  I think Waffle does
> something similar... but is m
> uch more clever than GLEW by avoiding the
> need for a glewInit function.


Ian's thinking of some code in Piglit. In Piglit, the thunk is hit only on the
first call to glFoo. All subsequent calls to glFoo go to the *real* glFoo and
have no thunk overhead.

Here's the Piglit code for glClear.

glClear is #defined to piglit_dispatch_glClear, which is a function pointer.
At process startup, that pointer points to a thunk that resets itself to point
to the *real* glClear returned by glXGetProcAddress("glFoo"). Therefore, the 
thunk
gets exercised only the first call to glClear.


// ----------------------------------------------
// file: generated_dispatch. h
// ----------------------------------------------

/* glClear (GL 1.0) */
/* glClear (GLES 2.0) */
extern PFNGLCLEARPROC piglit_dispatch_glClear;
#define glClear piglit_dispatch_glClear


// ----------------------------------------------
// file: generated_dispatch. c
// ----------------------------------------------

/* glClear (GL 1.0) */
/* glClear (GLES 2.0) */
static piglit_dispatch_function_ptr resolve_glClear()
{
        if (dispatch_api == PIGLIT_DISPATCH_GL)
                piglit_dispatch_glClear = (PFNGLCLEARPROC) 
get_core_proc("glClear", 10);
        else if (dispatch_api == PIGLIT_DISPATCH_ES2)
                piglit_dispatch_glClear = (PFNGLCLEARPROC) 
get_core_proc("glClear", 20);
        else
                unsupported("Clear");
        return (piglit_dispatch_function_ptr) piglit_dispatch_glClear;
}
static void APIENTRY stub_glClear(GLbitfield mask)
{
        check_initialized();
        resolve_glClear();
        piglit_dispatch_glClear(mask);
}
PFNGLCLEARPROC piglit_dispatch_glClear = stub_glClear;




_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to