Skip to content
Commits on Source (14)
......@@ -2,7 +2,7 @@ dnl configure.ac
dnl Process this file with autoconf to produce a configure script.
AC_PREREQ([2.63])
AC_INIT([libglvnd], [1.1.0], [kbrenneman@nvidia.com])
AC_INIT([libglvnd], [1.1.1], [kbrenneman@nvidia.com])
AC_CONFIG_SRCDIR([config.h.in])
AC_CONFIG_HEADERS([config.h])
......@@ -27,7 +27,15 @@ AC_PROG_LN_S
AC_PROG_MAKE_SET
AC_PROG_LIBTOOL
AC_PROG_MKDIR_P
AC_CHECK_PROGS([PYTHON2], [python2.7 python2 python])
# The tarball from "make dist" already contains all of the generated files. If
# we're building from that, then we won't need Python.
if test -e "$srcdir/src/GLdispatch/vnd-glapi/g_glapi_mapi_gl_tmp.h" ; then
AM_PATH_PYTHON([2.7],, [:])
else
AM_PATH_PYTHON([2.7])
fi
AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != :])
if test "x$ac_cv_prog_cc_c99" = xno; then
AC_MSG_ERROR([Building libglvnd requires a C99-enabled compiler])
......
......@@ -1736,9 +1736,6 @@ GLAPI void GLAPIENTRY glSeparableFilter2D( GLenum target,
GLAPI void GLAPIENTRY glGetSeparableFilter( GLenum target, GLenum format,
GLenum type, GLvoid *row, GLvoid *column, GLvoid *span );
typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
/*
......@@ -2189,22 +2186,6 @@ typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEATIPROC) (GLenum modeRGB, GLen
#endif /* GL_ATI_blend_equation_separate */
/* GL_OES_EGL_image */
#ifndef GL_OES_EGL_image
typedef void* GLeglImageOES;
#endif
#ifndef GL_OES_EGL_image
#define GL_OES_EGL_image 1
#ifdef GL_GLEXT_PROTOTYPES
GLAPI void APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image);
GLAPI void APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image);
#endif
typedef void (APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image);
typedef void (APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image);
#endif
/**
** NOTE!!!!! If you add new functions to this file, or update
** glext.h be sure to regenerate the gl_mangle.h file. See comments
......
......@@ -65,11 +65,6 @@ extern "C" {
typedef int GLclampx;
#ifndef GL_OES_EGL_image
typedef void *GLeglImageOES;
#endif
#ifndef GL_OES_EGL_image_external
#define GL_TEXTURE_EXTERNAL_OES 0x8D65
#define GL_SAMPLER_EXTERNAL_OES 0x8D66
......
......@@ -86,6 +86,7 @@ libEGL_dispatch_stubs_la_SOURCES = \
egldispatchstubs.c \
g_egldispatchstubs.c
if HAVE_PYTHON
BUILT_SOURCES = g_egldispatchstubs.c g_egldispatchstubs.h
CLEANFILES = $(BUILT_SOURCES)
......@@ -100,7 +101,8 @@ GENERATE_DEPS = \
$(GENERATE_LIST_FILES)
g_egldispatchstubs.c : $(GENERATE_DEPS)
$(VM_V_GEN)$(PYTHON2) $(GENERATE_DISPATCH_SCRIPT) source $(GENERATE_LIST_FILES) > $@
$(AM_V_GEN)$(PYTHON) $(GENERATE_DISPATCH_SCRIPT) source $(GENERATE_LIST_FILES) > $@
g_egldispatchstubs.h : $(GENERATE_DEPS)
$(VM_V_GEN)$(PYTHON2) $(GENERATE_DISPATCH_SCRIPT) header $(GENERATE_LIST_FILES) > $@
$(AM_V_GEN)$(PYTHON) $(GENERATE_DISPATCH_SCRIPT) header $(GENERATE_LIST_FILES) > $@
endif
......@@ -37,6 +37,7 @@ libGL_la_SOURCES = \
libgl.c \
g_libglglxwrapper.c
if HAVE_PYTHON
BUILT_SOURCES = g_libglglxwrapper.c
CLEANFILES = $(BUILT_SOURCES)
......@@ -50,8 +51,8 @@ glapi_gen_libglglxstubs_deps = \
$(glapi_gen_glx_xml)
g_libglglxwrapper.c : $(glapi_gen_libglglxstubs_deps)
$(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS) \
$(glapi_gen_libglglxstubs_script) $(glapi_gen_glx_xml) > $@
$(AM_V_GEN)$(PYTHON) $(PYTHON_FLAGS) $(glapi_gen_libglglxstubs_script) $(glapi_gen_glx_xml) > $@
endif
libGL_la_CFLAGS = \
-I$(top_srcdir)/include
......
......@@ -764,11 +764,11 @@ void __glDispatchCheckMultithreaded(void)
_glapi_set_multithread();
}
}
UnlockDispatch();
if (stubCurrentPatchCb != NULL && stubCurrentPatchCb->threadAttach != NULL) {
stubCurrentPatchCb->threadAttach();
}
UnlockDispatch();
}
}
......
......@@ -4,6 +4,7 @@ MAPI_PREFIX = src/GLdispatch/vnd-glapi
include $(top_srcdir)/src/GLdispatch/vnd-glapi/entry_files.mk
if HAVE_PYTHON
glapi_gen_gl_xml := \
$(top_srcdir)/src/generate/xml/gl.xml \
$(top_srcdir)/src/generate/xml/gl_other.xml
......@@ -12,7 +13,10 @@ glapi_gen_mapi_deps = \
$(glapi_gen_mapi_script) \
$(top_srcdir)/src/generate/genCommon.py \
$(glapi_gen_gl_xml)
glapi_gen_mapi = $(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS) $(glapi_gen_mapi_script)
glapi_gen_mapi = $(AM_V_GEN)$(PYTHON) $(PYTHON_FLAGS) $(glapi_gen_mapi_script)
endif
BUILT_SOURCES =
noinst_HEADERS = \
glapi.h \
......@@ -45,11 +49,12 @@ endif
libglapi_la_LDFLAGS = -no-undefined
libglapi_la_LIBADD = $(top_builddir)/src/util/libutils_misc.la
noinst_HEADERS += glapi_mapi_tmp.h
if HAVE_PYTHON
BUILT_SOURCES += glapi_mapi_tmp.h
glapi_mapi_tmp.h : $(glapi_gen_mapi_deps)
$(glapi_gen_mapi) gldispatch $(glapi_gen_gl_xml) > $@
BUILT_SOURCES = glapi_mapi_tmp.h
noinst_HEADERS += glapi_mapi_tmp.h
endif
COMMON_CPPFLAGS = \
$(DEFINES) \
......@@ -77,35 +82,43 @@ libglapi_gl_la_SOURCES = $(ENTRYPOINT_SOURCES)
libglapi_gl_la_CPPFLAGS = $(ENTRYPOINT_CPPFLAGS) \
-DMAPI_ABI_HEADER=\"$(builddir)/g_glapi_mapi_gl_tmp.h\"
noinst_HEADERS += g_glapi_mapi_gl_tmp.h
if HAVE_PYTHON
BUILT_SOURCES += g_glapi_mapi_gl_tmp.h
g_glapi_mapi_gl_tmp.h : $(glapi_gen_mapi_deps)
$(glapi_gen_mapi) gl $(glapi_gen_gl_xml) > $@
endif
noinst_LTLIBRARIES += libglapi_opengl.la
libglapi_opengl_la_SOURCES = $(ENTRYPOINT_SOURCES)
libglapi_opengl_la_CPPFLAGS = $(ENTRYPOINT_CPPFLAGS) \
-DMAPI_ABI_HEADER=\"$(builddir)/g_glapi_mapi_opengl_tmp.h\"
noinst_HEADERS += g_glapi_mapi_opengl_tmp.h
if HAVE_PYTHON
BUILT_SOURCES += g_glapi_mapi_opengl_tmp.h
g_glapi_mapi_opengl_tmp.h : $(glapi_gen_mapi_deps)
$(glapi_gen_mapi) opengl $(glapi_gen_gl_xml) > $@
endif
noinst_LTLIBRARIES += libglapi_glesv1.la
libglapi_glesv1_la_SOURCES = $(ENTRYPOINT_SOURCES)
libglapi_glesv1_la_CPPFLAGS = $(ENTRYPOINT_CPPFLAGS) \
-DMAPI_ABI_HEADER=\"$(builddir)/g_glapi_mapi_glesv1_tmp.h\"
noinst_HEADERS += g_glapi_mapi_glesv1_tmp.h
if HAVE_PYTHON
BUILT_SOURCES += g_glapi_mapi_glesv1_tmp.h
g_glapi_mapi_glesv1_tmp.h : $(glapi_gen_mapi_deps)
$(glapi_gen_mapi) glesv1 $(glapi_gen_gl_xml) > $@
endif
noinst_LTLIBRARIES += libglapi_glesv2.la
libglapi_glesv2_la_SOURCES = $(ENTRYPOINT_SOURCES)
libglapi_glesv2_la_CPPFLAGS = $(ENTRYPOINT_CPPFLAGS) \
-DMAPI_ABI_HEADER=\"$(builddir)/g_glapi_mapi_glesv2_tmp.h\"
noinst_HEADERS += g_glapi_mapi_glesv2_tmp.h
if HAVE_PYTHON
BUILT_SOURCES += g_glapi_mapi_glesv2_tmp.h
g_glapi_mapi_glesv2_tmp.h : $(glapi_gen_mapi_deps)
$(glapi_gen_mapi) glesv2 $(glapi_gen_gl_xml) > $@
endif
CLEANFILES = $(BUILT_SOURCES)
......@@ -62,7 +62,8 @@ __asm__(".balign " U_STRINGIFY(GLDISPATCH_PAGE_SIZE) "\n"
" ld 11, _glapi_tls_Current@got@tprel@l(11)\n\t" \
" add 11, 11,_glapi_tls_Current@tls\n\t" \
" ld 11, 0(11)\n\t" \
" ld 12, " slot "*8(11)\n\t" \
" addis 11, 11, (" slot "*8)@ha\n" \
" ld 12, (" slot "*8)@l (11)\n" \
" mtctr 12\n\t" \
" bctr\n" \
// Conceptually, this is:
......
......@@ -57,48 +57,42 @@ __asm__(".balign " U_STRINGIFY(GLDISPATCH_PAGE_SIZE) "\n"
" .localentry " func ", .-" func "\n\t"
#define STUB_ASM_CODE(slot) \
" addis 11, 2, _glapi_Current@got@ha\n\t" \
" ld 11, _glapi_Current@got@l(11)\n\t" \
" ld 11, 0(11)\n\t" \
" cmpldi 11, 0\n\t" \
" beq 2000f\n" \
"1050:\n\t" \
" ld 12, " slot "*8(11)\n\t" \
" mtctr 12\n\t" \
" addis 11, 2, _glapi_Current@got@ha\n" \
" ld 11, _glapi_Current@got@l(11)\n" \
" ld 11, 0(11)\n" \
" cmpldi 11, 0\n" \
" bne 1000f\n" \
" mflr 0\n" \
" std 0, 16(1)\n" \
" stdu 1, -120(1)\n" \
" std 3, 56(1)\n" \
" std 4, 64(1)\n" \
" std 5, 72(1)\n" \
" std 6, 80(1)\n" \
" std 7, 88(1)\n" \
" std 8, 96(1)\n" \
" std 9, 104(1)\n" \
" std 10, 112(1)\n" \
" bl _glapi_get_current\n" \
" nop\n" \
" mr 11, 3\n" \
" ld 3, 56(1)\n" \
" ld 4, 64(1)\n" \
" ld 5, 72(1)\n" \
" ld 6, 80(1)\n" \
" ld 7, 88(1)\n" \
" ld 8, 96(1)\n" \
" ld 9, 104(1)\n" \
" ld 10, 112(1)\n" \
" addi 1, 1, 120\n" \
" ld 0, 16(1)\n" \
" mtlr 0\n" \
"1000:\n" \
" addis 11, 11, (" slot "*8)@ha\n" \
" ld 12, (" slot "*8)@l (11)\n" \
" mtctr 12\n" \
" bctr\n" \
"2000:\n\t" \
" mflr 0\n\t" \
" std 0, 16(1)\n\t" \
" std 2, 40(1)\n\t" \
" stdu 1, -144(1)\n\t" \
" std 3, 56(1)\n\t" \
" std 4, 64(1)\n\t" \
" std 5, 72(1)\n\t" \
" std 6, 80(1)\n\t" \
" std 7, 88(1)\n\t" \
" std 8, 96(1)\n\t" \
" std 9, 104(1)\n\t" \
" std 10, 112(1)\n\t" \
" std 12, 128(1)\n\t" \
" addis 12, 2, _glapi_get_current@got@ha\n\t" \
" ld 12, _glapi_get_current@got@l(12)\n\t" \
" mtctr 12\n\t" \
" bctrl\n\t" \
" ld 2, 144+40(1)\n\t" \
" mr 11, 3\n\t" \
" ld 3, 56(1)\n\t" \
" ld 4, 64(1)\n\t" \
" ld 5, 72(1)\n\t" \
" ld 6, 80(1)\n\t" \
" ld 7, 88(1)\n\t" \
" ld 8, 96(1)\n\t" \
" ld 9, 104(1)\n\t" \
" ld 10, 112(1)\n\t" \
" ld 12, 128(1)\n\t" \
" addi 1, 1, 144\n\t" \
" ld 0, 16(1)\n\t" \
" mtlr 0\n\t" \
" b 1050b\n"
// Conceptually, this is:
// {
// void **dispatchTable = _glapi_Current[GLAPI_CURRENT_DISPATCH];
......@@ -136,51 +130,51 @@ static const uint32_t ENTRY_TEMPLATE[] =
// However, more work needs to be done for big-endian Linux because it
// adheres to an older, AIX-compatible ABI that uses function descriptors.
// 1000:
// 1000:
0x7C0802A6, // <ENTRY+000>: mflr 0
0xF8010010, // <ENTRY+004>: std 0, 16(1)
0xE96C0098, // <ENTRY+008>: ld 11, 9000f-1000b+0(12)
0xE96B0000, // <ENTRY+012>: ld 11, 0(11)
0x282B0000, // <ENTRY+016>: cmpldi 11, 0
0x7c0802a6, // <ENTRY+000>: mflr 0
0xf8010010, // <ENTRY+004>: std 0, 16(1)
0xe96c009c, // <ENTRY+008>: ld 11, 9000f-1000b+0(12)
0xe96b0000, // <ENTRY+012>: ld 11, 0(11)
0x282b0000, // <ENTRY+016>: cmpldi 11, 0
0x41820014, // <ENTRY+020>: beq 2000f
// 1050:
0xE80C00A8, // <ENTRY+024>: ld 0, 9000f-1000b+16(12)
0x7D8B002A, // <ENTRY+028>: ldx 12, 11, 0
0x7D8903A6, // <ENTRY+032>: mtctr 12
0x4E800420, // <ENTRY+036>: bctr
0xe80c00ac, // <ENTRY+024>: ld 0, 9000f-1000b+16(12)
0x7d8b002a, // <ENTRY+028>: ldx 12, 11, 0
0x7d8903a6, // <ENTRY+032>: mtctr 12
0x4e800420, // <ENTRY+036>: bctr
// 2000:
0xF8410028, // <ENTRY+040>: std 2, 40(1)
0xF821FF71, // <ENTRY+044>: stdu 1, -144(1)
0xF8610038, // <ENTRY+048>: std 3, 56(1)
0xF8810040, // <ENTRY+052>: std 4, 64(1)
0xF8A10048, // <ENTRY+056>: std 5, 72(1)
0xF8C10050, // <ENTRY+060>: std 6, 80(1)
0xF8E10058, // <ENTRY+064>: std 7, 88(1)
0xF9010060, // <ENTRY+068>: std 8, 96(1)
0xF9210068, // <ENTRY+072>: std 9, 104(1)
0xF9410070, // <ENTRY+076>: std 10, 112(1)
0xF9810080, // <ENTRY+080>: std 12, 128(1)
0xE98C00A0, // <ENTRY+084>: ld 12, 9000f-1000b+8(12)
0x7D8903A6, // <ENTRY+088>: mtctr 12
0x4E800421, // <ENTRY+092>: bctrl
0xE9410070, // <ENTRY+096>: ld 10, 112(1)
0x7C6B1B78, // <ENTRY+100>: mr 11, 3
0xE8610038, // <ENTRY+104>: ld 3, 56(1)
0xE8810040, // <ENTRY+108>: ld 4, 64(1)
0xE8A10048, // <ENTRY+112>: ld 5, 72(1)
0xE8C10050, // <ENTRY+116>: ld 6, 80(1)
0xE8E10058, // <ENTRY+120>: ld 7, 88(1)
0xE9010060, // <ENTRY+124>: ld 8, 96(1)
0xE9210068, // <ENTRY+128>: ld 9, 104(1)
0xE9810080, // <ENTRY+132>: ld 12, 128(1)
0x38210090, // <ENTRY+136>: addi 1, 1, 144
0xE8010010, // <ENTRY+140>: ld 0, 16(1)
0x7C0803A6, // <ENTRY+144>: mtlr 0
0x4BFFFF84, // <ENTRY+148>: b 1050b
0xf821ff71, // <ENTRY+040>: stdu 1, -144(1)
0xf8410018, // <ENTRY+044>: std 2, 24(1)
0xf8610038, // <ENTRY+048>: std 3, 56(1)
0xf8810040, // <ENTRY+052>: std 4, 64(1)
0xf8a10048, // <ENTRY+056>: std 5, 72(1)
0xf8c10050, // <ENTRY+060>: std 6, 80(1)
0xf8e10058, // <ENTRY+064>: std 7, 88(1)
0xf9010060, // <ENTRY+068>: std 8, 96(1)
0xf9210068, // <ENTRY+072>: std 9, 104(1)
0xf9410070, // <ENTRY+076>: std 10, 112(1)
0xf9810080, // <ENTRY+080>: std 12, 128(1)
0xe98c00a4, // <ENTRY+084>: ld 12, 9000f-1000b+8(12)
0x7d8903a6, // <ENTRY+088>: mtctr 12
0x4e800421, // <ENTRY+092>: bctrl
0xe8410018, // <ENTRY+096>: ld 2, 24(1)
0xe9410070, // <ENTRY+100>: ld 10, 112(1)
0x7c6b1b78, // <ENTRY+104>: mr 11, 3
0xe8610038, // <ENTRY+108>: ld 3, 56(1)
0xe8810040, // <ENTRY+112>: ld 4, 64(1)
0xe8a10048, // <ENTRY+116>: ld 5, 72(1)
0xe8c10050, // <ENTRY+120>: ld 6, 80(1)
0xe8e10058, // <ENTRY+124>: ld 7, 88(1)
0xe9010060, // <ENTRY+128>: ld 8, 96(1)
0xe9210068, // <ENTRY+132>: ld 9, 104(1)
0xe9810080, // <ENTRY+136>: ld 12, 128(1)
0x38210090, // <ENTRY+140>: addi 1, 1, 144
0xe8010010, // <ENTRY+144>: ld 0, 16(1)
0x7c0803a6, // <ENTRY+148>: mtlr 0
0x4bffff80, // <ENTRY+152>: b 1050b
// 9000:
0, 0, // <ENTRY+152>: .quad _glapi_Current
0, 0, // <ENTRY+160>: .quad _glapi_get_current
0, 0 // <ENTRY+168>: .quad <slot>*8
0, 0, // <ENTRY+156>: .quad _glapi_Current
0, 0, // <ENTRY+164>: .quad _glapi_get_current
0, 0, // <ENTRY+172>: .quad <slot>*8
};
// These are the offsets in ENTRY_TEMPLATE of the values that we have to patch.
......
......@@ -314,8 +314,8 @@ void SetDispatchFuncPointer(GLVNDGenEntrypoint *entry,
*((uintptr_t *)(code + DISPATCH_FUNC_OFFSET)) = (uintptr_t)dispatch;
// See http://community.arm.com/groups/processors/blog/2010/02/17/caches-and-self-modifying-code
__builtin___clear_cache((char *)entry->entrypointExec - 1,
(char *)entry->entrypointExec - 1 + sizeof(STUB_TEMPLATE));
__builtin___clear_cache((char *)entry->entrypointExec,
(char *)entry->entrypointExec + sizeof(STUB_TEMPLATE));
#elif defined(USE_PPC64LE_ASM)
......
......@@ -57,18 +57,23 @@ AM_CFLAGS = \
TESTS += testgldispatch_static.sh
TESTS += testgldispatch_static_thr.sh
TESTS += testgldispatch_generated.sh
TESTS += testgldispatch_generated_thr.sh
TESTS += testgldispatch_patched.sh
TESTS += testgldispatch_patched_thr.sh
check_PROGRAMS += testgldispatch
testgldispatch_SOURCES = \
testgldispatch.c
testgldispatch_CFLAGS = \
-I$(top_srcdir)/include \
-I$(top_srcdir)/src/GLdispatch
-I$(top_srcdir)/src/GLdispatch \
$(PTHREAD_CFLAGS)
testgldispatch_LDADD = $(top_builddir)/src/GLdispatch/libGLdispatch.la
testgldispatch_LDADD += $(top_builddir)/src/OpenGL/libOpenGL.la
testgldispatch_LDADD += dummy/libpatchentrypoints.la
testgldispatch_LDADD += $(top_builddir)/src/util/libutils_misc.la
testgldispatch_LDADD += $(PTHREAD_LIBS)
# Start of GLX-specific tests.
# Notes that the TESTS_GLX variable must be defined outside the conditional, so
......
......@@ -31,6 +31,7 @@
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <pthread.h>
#include <GL/gl.h>
#include <GLdispatch.h>
......@@ -68,6 +69,8 @@ typedef struct DummyVendorLibRec {
static void InitDummyVendors(void);
static void CleanupDummyVendors(void);
static void *ForceMultiThreadedProc(void *param);
static GLboolean TestDispatch(int vendorIndex,
GLboolean testStatic, GLboolean testGenerated);
......@@ -103,13 +106,14 @@ static pfn_glVertex3fv ptr_glDummyTestProc;
static GLboolean enableStaticTest = GL_FALSE;
static GLboolean enableGeneratedTest = GL_FALSE;
static GLboolean enablePatching = GL_FALSE;
static GLboolean forceMultiThreaded = GL_FALSE;
int main(int argc, char **argv)
{
int i;
while (1) {
int opt = getopt(argc, argv, "sgp");
int opt = getopt(argc, argv, "sgpt");
if (opt == -1) {
break;
}
......@@ -123,6 +127,9 @@ int main(int argc, char **argv)
case 'p':
enablePatching = GL_TRUE;
break;
case 't':
forceMultiThreaded = GL_TRUE;
break;
default:
return 1;
}
......@@ -131,6 +138,15 @@ int main(int argc, char **argv)
__glDispatchInit();
InitDummyVendors();
if (forceMultiThreaded) {
pthread_t thr;
printf("Forcing libGLdispatch into multi-threaded mode.\n");
__glDispatchCheckMultithreaded();
pthread_create(&thr, NULL, ForceMultiThreadedProc, NULL);
pthread_join(thr, NULL);
}
ptr_glVertex3fv = (pfn_glVertex3fv) __glDispatchGetProcAddress("glVertex3fv");
if (ptr_glVertex3fv == NULL) {
printf("Can't find dispatch function for glVertex3fv\n");
......@@ -154,6 +170,12 @@ int main(int argc, char **argv)
return 0;
}
static void *ForceMultiThreadedProc(void *param)
{
__glDispatchCheckMultithreaded();
return NULL;
}
static void InitDummyVendors(void)
{
int i;
......
#!/bin/sh
./testgldispatch -g -t
#!/bin/sh
./testgldispatch -s -g -p
#!/bin/sh
./testgldispatch -s -t