diff -Nru primus-20131127/debian/bash-completion primus-20150328/debian/bash-completion --- primus-20131127/debian/bash-completion 2014-01-13 19:31:50.000000000 +0000 +++ primus-20150328/debian/bash-completion 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -primus.bash-completion primus diff -Nru primus-20131127/debian/changelog primus-20150328/debian/changelog --- primus-20131127/debian/changelog 2014-01-13 19:31:50.000000000 +0000 +++ primus-20150328/debian/changelog 2015-07-26 06:11:03.000000000 +0000 @@ -1,3 +1,14 @@ +primus (20150328-1~trustyppa1) trusty; urgency=medium + + * Backport changes made to primus' packaging in the main archive up to + primus/0~20150328-1. Full changelog can be found at: + http://metadata.ftp-master.debian.org/changelogs/main/p/primus/unstable_changelog + * User-visible changes: + - New upstream git snapshot, rebase on d1afbf6fce. + - Add dependency on libgl1-mesa-glx to primus-libs. (LP: #1383909) + + -- Vincent Cheng Sat, 25 Jul 2015 23:06:41 -0700 + primus (20131127-1~trustyppa1) trusty; urgency=low * Initial release for Trusty diff -Nru primus-20131127/debian/control primus-20150328/debian/control --- primus-20131127/debian/control 2014-01-13 19:31:50.000000000 +0000 +++ primus-20150328/debian/control 2015-07-26 05:39:38.000000000 +0000 @@ -4,7 +4,7 @@ Maintainer: The Bumblebee Project Uploaders: Bruno Pagani , Dmitry Zhurikhin -Build-Depends: debhelper (>= 9), bash-completion, mesa-common-dev +Build-Depends: debhelper (>= 9), mesa-common-dev Standards-Version: 3.9.5 Homepage: https://github.com/amonakov/primus Vcs-Browser: https://github.com/amonakov/primus @@ -30,7 +30,7 @@ Package: primus-libs Architecture: i386 amd64 -Depends: ${shlibs:Depends}, ${misc:Depends} +Depends: ${shlibs:Depends}, ${misc:Depends}, libgl1-mesa-glx Multi-Arch: same Description: Shared libraries for primus This package contains the libraries for primus which are loaded when running diff -Nru primus-20131127/debian/patches/hardening.patch primus-20150328/debian/patches/hardening.patch --- primus-20131127/debian/patches/hardening.patch 1970-01-01 00:00:00.000000000 +0000 +++ primus-20150328/debian/patches/hardening.patch 2015-07-26 04:16:01.000000000 +0000 @@ -0,0 +1,13 @@ +Description: use all variables containing hardening flags +Forwarded: https://github.com/amonakov/primus/pull/174 +Author: Andreas Beckmann +Last-Update: 2015-07-25 + +--- a/Makefile ++++ b/Makefile +@@ -30,4 +30,4 @@ CXXFLAGS += -DPRIMUS_libGLd='"$(PRIMUS_libGLd)"' + + $(LIBDIR)/libGL.so.1: libglfork.cpp + mkdir -p $(LIBDIR) +- $(CXX) $(CPPFLAGS) $(CXXFLAGS) -fvisibility=hidden -fPIC -shared -Wl,-Bsymbolic -o $@ $< -lX11 -lpthread -lrt ++ $(CXX) $(CPPFLAGS) $(CXXFLAGS) -fvisibility=hidden -fPIC -shared -Wl,-Bsymbolic -o $@ $< $(LDFLAGS) -lX11 -lpthread -lrt diff -Nru primus-20131127/debian/patches/series primus-20150328/debian/patches/series --- primus-20131127/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 +++ primus-20150328/debian/patches/series 2014-10-24 08:15:14.000000000 +0000 @@ -0,0 +1 @@ +hardening.patch diff -Nru primus-20131127/debian/primus.maintscript primus-20150328/debian/primus.maintscript --- primus-20131127/debian/primus.maintscript 1970-01-01 00:00:00.000000000 +0000 +++ primus-20150328/debian/primus.maintscript 2015-07-26 06:12:07.000000000 +0000 @@ -0,0 +1 @@ +rm_conffile /etc/bash_completion.d/primus 20150328-1~ diff -Nru primus-20131127/debian/rules primus-20150328/debian/rules --- primus-20131127/debian/rules 2014-01-13 19:31:50.000000000 +0000 +++ primus-20150328/debian/rules 2015-07-26 05:41:35.000000000 +0000 @@ -14,16 +14,15 @@ else PRIMUS_libGLa=/usr/lib/$(DEB_HOST_MULTIARCH)/libGL.so.1 PRIMUS_libGLd=/usr/lib/$(DEB_HOST_MULTIARCH)/libGL.so.1 - # PRIMUS_UPLOAD=1 set until Debian's xserver-xorg-video-intel - # defaults to SNA acceleration in unstable - PRIMUS_UPLOAD=1 + # =1 on 8/jessie and earlier, 0 (default) on 9/stretch and later + PRIMUS_UPLOAD=0 endif # Where to put the resulting library during build BUILD_LIBDIR ?= lib %: - dh $@ --with bash-completion + dh $@ override_dh_clean: rm -rf $(BUILD_LIBDIR) @@ -40,6 +39,10 @@ mkdir -p debian/primus/usr/bin/ debian/primus-libs/usr/lib/$(DEB_HOST_MULTIARCH)/primus/ install -m 755 debian/scripts/primusrun debian/primus/usr/bin/ cp -r $(BUILD_LIBDIR)/* debian/primus-libs/usr/lib/$(DEB_HOST_MULTIARCH)/primus/ + # Install bash-completion file + mkdir -p debian/primus/usr/share/bash-completion/completions/ + mv primus.bash-completion debian/primus/usr/share/bash-completion/completions/primus + dh_install override_dh_strip: diff -Nru primus-20131127/.gitignore primus-20150328/.gitignore --- primus-20131127/.gitignore 2013-11-27 22:16:34.000000000 +0000 +++ primus-20150328/.gitignore 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -lib -lib32 -lib64 diff -Nru primus-20131127/libglfork.cpp primus-20150328/libglfork.cpp --- primus-20131127/libglfork.cpp 2013-11-27 22:16:34.000000000 +0000 +++ primus-20150328/libglfork.cpp 2015-07-26 03:32:46.000000000 +0000 @@ -167,13 +167,12 @@ { #ifdef BUMBLEBEE_SOCKET // Signal the Bumblebee daemon to bring up secondary X - errno = 0; int sock = socket(PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0); struct sockaddr_un addr; addr.sun_family = AF_UNIX; strncpy(addr.sun_path, getconf(BUMBLEBEE_SOCKET), sizeof(addr.sun_path)); - connect(sock, (struct sockaddr *)&addr, sizeof(addr)); - die_if(errno, "failed to connect to Bumblebee daemon: %s\n", strerror(errno)); + die_if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0, + "failed to connect to Bumblebee daemon: %s\n", strerror(errno)); static char c[256]; if (!getenv("PRIMUS_DISPLAY")) { @@ -239,7 +238,6 @@ // FIXME: there are race conditions in accesses to these DrawablesInfo drawables; ContextsInfo contexts; - GLXFBConfig *dconfigs; PrimusInfo(): adpy_str(getconf(PRIMUS_DISPLAY)), @@ -258,9 +256,6 @@ die_if(!adpy, "failed to open secondary X display\n"); die_if(!ddpy, "failed to open main X display\n"); die_if(!needed_global, "failed to load PRIMUS_LOAD_GLOBAL\n"); - int ncfg, attrs[] = {GLX_DOUBLEBUFFER, GL_TRUE, None}; - dconfigs = dfns.glXChooseFBConfig(ddpy, 0, attrs, &ncfg); - die_if(!ncfg, "broken GLX on main X display\n"); } } primus; @@ -339,11 +334,20 @@ XGetGeometry(dpy, draw, &root, &x, &y, (unsigned *)width, (unsigned *)height, &bw, &d); } -static bool test_drawpixels_fast(Display *dpy, GLXContext ctx) +static GLXFBConfig* get_dconfigs(Display *dpy) +{ + static const int attrs[] = {GLX_DOUBLEBUFFER, GL_TRUE, None}; + int ncfg; + GLXFBConfig *dconfigs = primus.dfns.glXChooseFBConfig(dpy, 0, attrs, &ncfg); + die_if(!dconfigs, "broken GLX on main X display\n"); + return dconfigs; +} + +static bool test_drawpixels_fast(Display *dpy, GLXContext ctx, GLXFBConfig dconfig) { int width = 1920, height = 1080; int pbattrs[] = {GLX_PBUFFER_WIDTH, width, GLX_PBUFFER_HEIGHT, height, GLX_PRESERVED_CONTENTS, True, None}; - GLXPbuffer pbuffer = primus.dfns.glXCreatePbuffer(dpy, primus.dconfigs[0], pbattrs); + GLXPbuffer pbuffer = primus.dfns.glXCreatePbuffer(dpy, dconfig, pbattrs); primus.dfns.glXMakeCurrent(dpy, pbuffer, ctx); GLuint pbo; primus.dfns.glGenBuffers(1, &pbo); @@ -381,15 +385,22 @@ static const char *state_names[] = {"wait", "upload", "draw+swap", NULL}; Profiler profiler("display", state_names); Display *ddpy = XOpenDisplay(NULL); + if (!ddpy) // Chromium sandbox prevents opening new connections + { + ddpy = primus.ddpy; + primus_warn("reusing initial X connection for display thread\n"); + } assert(di.kind == di.XWindow || di.kind == di.Window); XSelectInput(ddpy, di.window, StructureNotifyMask); note_geometry(ddpy, di.window, &width, &height); di.update_geometry(width, height); - GLXContext context = primus.dfns.glXCreateNewContext(ddpy, primus.dconfigs[0], GLX_RGBA_TYPE, NULL, True); + GLXFBConfig *dconfigs = get_dconfigs(ddpy); + GLXContext context = primus.dfns.glXCreateNewContext(ddpy, *dconfigs, GLX_RGBA_TYPE, NULL, True); die_if(!primus.dfns.glXIsDirect(ddpy, context), "failed to acquire direct rendering context for display thread\n"); if (!primus.dispmethod) - primus.dispmethod = test_drawpixels_fast(ddpy, context) ? 2 : 1; + primus.dispmethod = test_drawpixels_fast(ddpy, context, *dconfigs) ? 2 : 1; + XFree(dconfigs); primus.dfns.glXMakeCurrent(ddpy, di.window, context); bool use_textures = (primus.dispmethod == 1); if (use_textures) @@ -417,7 +428,8 @@ primus.dfns.glDeleteBuffers(2, pbos); primus.dfns.glXMakeCurrent(ddpy, 0, NULL); primus.dfns.glXDestroyContext(ddpy, context); - XCloseDisplay(ddpy); + if (ddpy != primus.ddpy) + XCloseDisplay(ddpy); sem_post(&di.d.relsem); return NULL; } @@ -571,7 +583,7 @@ } // Find appropriate FBConfigs on adpy for a given Visual on ddpy -static GLXFBConfig* match_fbconfig(XVisualInfo *vis) +static GLXFBConfig* match_fbconfig(Display *dpy, XVisualInfo *vis) { int ncfg, attrs[] = { GLX_DOUBLEBUFFER, 0, GLX_STEREO, 0, GLX_AUX_BUFFERS, 0, @@ -581,13 +593,13 @@ GLX_SAMPLE_BUFFERS, 0, GLX_SAMPLES, 0, None }; for (int i = 0; attrs[i] != None; i += 2) - primus.dfns.glXGetConfig(primus.ddpy, vis, attrs[i], &attrs[i+1]); + primus.dfns.glXGetConfig(dpy, vis, attrs[i], &attrs[i+1]); return primus.afns.glXChooseFBConfig(primus.adpy, 0, attrs, &ncfg); } GLXContext glXCreateContext(Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct) { - GLXFBConfig *acfgs = match_fbconfig(vis); + GLXFBConfig *acfgs = match_fbconfig(dpy, vis); GLXContext actx = primus.afns.glXCreateNewContext(primus.adpy, *acfgs, GLX_RGBA_TYPE, shareList, direct); primus.contexts.record(actx, *acfgs, shareList); return actx; @@ -644,7 +656,7 @@ XVisualInfo tmpl = {0}, *vis; tmpl.visualid = XVisualIDFromVisual(attrs.visual); die_if(!(vis = XGetVisualInfo(dpy, VisualIDMask, &tmpl, &nvis)), "no visuals"); - di.fbconfig = *match_fbconfig(vis); + di.fbconfig = *match_fbconfig(dpy, vis); XFree(vis); } di.kind = di.XWindow; @@ -728,7 +740,9 @@ GLXWindow glXCreateWindow(Display *dpy, GLXFBConfig config, Window win, const int *attribList) { - GLXWindow glxwin = primus.dfns.glXCreateWindow(dpy, primus.dconfigs[0], win, attribList); + GLXFBConfig *dconfigs = get_dconfigs(dpy); + GLXWindow glxwin = primus.dfns.glXCreateWindow(dpy, *dconfigs, win, attribList); + XFree(dconfigs); DrawableInfo &di = primus.drawables[glxwin]; di.kind = di.Window; di.fbconfig = config; @@ -753,7 +767,9 @@ GLXPbuffer glXCreatePbuffer(Display *dpy, GLXFBConfig config, const int *attribList) { - GLXPbuffer pbuffer = primus.dfns.glXCreatePbuffer(dpy, primus.dconfigs[0], attribList); + GLXFBConfig *dconfigs = get_dconfigs(dpy); + GLXPbuffer pbuffer = primus.dfns.glXCreatePbuffer(dpy, *dconfigs, attribList); + XFree(dconfigs); DrawableInfo &di = primus.drawables[pbuffer]; di.kind = di.Pbuffer; di.fbconfig = config; @@ -774,7 +790,9 @@ GLXPixmap glXCreatePixmap(Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attribList) { - GLXPixmap glxpix = primus.dfns.glXCreatePixmap(dpy, primus.dconfigs[0], pixmap, attribList); + GLXFBConfig *dconfigs = get_dconfigs(dpy); + GLXPixmap glxpix = primus.dfns.glXCreatePixmap(dpy, *dconfigs, pixmap, attribList); + XFree(dconfigs); DrawableInfo &di = primus.drawables[glxpix]; di.kind = di.Pixmap; di.fbconfig = config; @@ -795,7 +813,7 @@ DrawableInfo &di = primus.drawables[glxpix]; di.kind = di.Pixmap; note_geometry(dpy, pixmap, &di.width, &di.height); - GLXFBConfig *acfgs = match_fbconfig(visual); + GLXFBConfig *acfgs = match_fbconfig(dpy, visual); di.fbconfig = *acfgs; return glxpix; } @@ -805,13 +823,13 @@ glXDestroyPixmap(dpy, pixmap); } -static XVisualInfo *match_visual(int attrs[]) +static XVisualInfo *match_visual(Display *dpy, int attrs[]) { - XVisualInfo *vis = glXChooseVisual(primus.ddpy, 0, attrs); + XVisualInfo *vis = glXChooseVisual(dpy, 0, attrs); for (int i = 2; attrs[i] != None && vis; i += 2) { int tmp = attrs[i+1]; - primus.dfns.glXGetConfig(primus.ddpy, vis, attrs[i], &attrs[i+1]); + primus.dfns.glXGetConfig(dpy, vis, attrs[i], &attrs[i+1]); if (tmp != attrs[i+1]) vis = NULL; } @@ -833,7 +851,7 @@ XVisualInfo *vis = NULL; for (i -= 2; i >= 0 && !vis; i -= 2) { - vis = match_visual(attrs); + vis = match_visual(dpy, attrs); attrs[i] = None; } return vis; @@ -843,7 +861,7 @@ { int r = primus.afns.glXGetFBConfigAttrib(primus.adpy, config, attribute, value); if (attribute == GLX_VISUAL_ID && *value) - return primus.dfns.glXGetConfig(primus.ddpy, glXGetVisualFromFBConfig(dpy, config), attribute, value); + return primus.dfns.glXGetConfig(dpy, glXGetVisualFromFBConfig(dpy, config), attribute, value); return r; } @@ -855,9 +873,10 @@ void glXUseXFont(Font font, int first, int count, int list) { unsigned long prop; - XFontStruct *fs = XQueryFont(primus.ddpy, font); + Display *dpy = glXGetCurrentDisplay(); + XFontStruct *fs = XQueryFont(dpy, font); XGetFontProperty(fs, XA_FONT, &prop); - char *xlfd = XGetAtomName(primus.ddpy, prop); + char *xlfd = XGetAtomName(dpy, prop); Font afont = XLoadFont(primus.adpy, xlfd); primus.afns.glXUseXFont(afont, first, count, list); XUnloadFont(primus.adpy, afont); @@ -913,12 +932,12 @@ // OpenGL forwarders #define DEF_GLX_PROTO(ret, name, par, ...) \ +void ifunc_##name(void) asm(#name) __attribute__((visibility("default"),ifunc("i" #name))); \ +extern "C" { \ static ret l##name par \ { return primus.afns.name(__VA_ARGS__); } \ -asm(".type " #name ", @gnu_indirect_function"); \ -void *ifunc_##name(void) asm(#name) __attribute__((visibility("default"))); \ -void *ifunc_##name(void) \ -{ return primus.afns.handle ? real_dlsym(primus.afns.handle, #name) : (void*)l##name; } +static void *i##name(void) \ +{ return primus.afns.handle ? real_dlsym(primus.afns.handle, #name) : (void*)l##name; } } #include "gl-passthru.def" #undef DEF_GLX_PROTO @@ -994,7 +1013,7 @@ static std::string exts (std::string(glxext_clientside) + intersect_exts(glxext_adpy, primus.afns.glXQueryExtensionsString(primus.adpy, 0)) - + intersect_exts(glxext_ddpy, primus.dfns.glXQueryExtensionsString(primus.ddpy, 0))); + + intersect_exts(glxext_ddpy, primus.dfns.glXQueryExtensionsString(dpy, 0))); return exts.c_str(); } @@ -1006,10 +1025,9 @@ // OpenGL extension forwarders #define P(name) \ -asm(".type " #name ", @gnu_indirect_function"); \ -void *ifunc_##name(void) asm(#name) __attribute__((visibility("default"))); \ -void *ifunc_##name(void) \ -{ return primus.afns.handle ? real_dlsym(primus.afns.handle, #name) : NULL; } +void ifunc_##name(void) asm(#name) __attribute__((visibility("default"),ifunc("i" #name))); \ +extern "C" { static void *i##name(void) \ +{ return primus.afns.handle ? real_dlsym(primus.afns.handle, #name) : NULL; } } #include "glext-passthru.def" #undef P #endif diff -Nru primus-20131127/Makefile primus-20150328/Makefile --- primus-20131127/Makefile 2013-11-27 22:16:34.000000000 +0000 +++ primus-20150328/Makefile 2015-07-26 03:32:46.000000000 +0000 @@ -30,4 +30,4 @@ $(LIBDIR)/libGL.so.1: libglfork.cpp mkdir -p $(LIBDIR) - $(CXX) $(CXXFLAGS) -fvisibility=hidden -fPIC -shared -Wl,-Bsymbolic -o $@ $< -lX11 -lpthread -lrt + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -fvisibility=hidden -fPIC -shared -Wl,-Bsymbolic -o $@ $< -lX11 -lpthread -lrt