PRBool
nsGLPbufferGLX::Init(WebGLContext *priv)
{
    nsresult rv;
    const char *s;

    if (!gGLXWrap.OpenLibrary("libGL.so.1")) {
        LogMessage("Canvas 3D: Couldn't find libGL.so.1");
        return PR_FALSE;
    }

    if (!gGLXWrap.Init()) {
        LogMessage("Canvas 3D: gGLXWrap.Init() failed");
        return PR_FALSE;
    }

#if defined(MOZ_WIDGET_GTK2) && defined(MOZ_X11)
    mDisplay = gdk_x11_get_default_xdisplay();
#else
    mDisplay = XOpenDisplay(NULL);
#endif
    if (!mDisplay) {
        LogMessage("Canvas 3D: XOpenDisplay failed");
        return PR_FALSE;
    }

    // Make sure that everyone agrees that pbuffers are supported
    s = gGLXWrap.fQueryExtensionsString(mDisplay, DefaultScreen(mDisplay));
    if (strstr(s, "GLX_SGIX_pbuffer") == NULL) {
        LogMessage("Canvas 3D: GLX_SGIX_pbuffer not supported");
        return PR_FALSE;
    }

    s = gGLXWrap.fQueryServerString(mDisplay, DefaultScreen(mDisplay), GLX_EXTENSIONS);
    if (strstr(s, "GLX_SGIX_pbuffer") == NULL) {
        LogMessage("Canvas 3D: GLX_SGIX_pbuffer not supported by server");
        return PR_FALSE;
    }

    mPriv = priv;

    nsCOMPtr<nsIPrefService> prefService = do_GetService(NS_PREFSERVICE_CONTRACTID, &rv);
    NS_ENSURE_SUCCESS(rv, PR_FALSE);

    nsCOMPtr<nsIPrefBranch> prefBranch;
    rv = prefService->GetBranch("extensions.canvas3d.", getter_AddRefs(prefBranch));
    NS_ENSURE_SUCCESS(rv, PR_FALSE);

    PRInt32 prefAntialiasing;
    rv = prefBranch->GetIntPref("antialiasing", &prefAntialiasing);
    if (NS_FAILED(rv))
        prefAntialiasing = 0;
    
    int attrib[] = { GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT,
                     GLX_RENDER_TYPE,   GLX_RGBA_BIT,
                     GLX_RED_SIZE, 1,
                     GLX_GREEN_SIZE, 1,
                     GLX_BLUE_SIZE, 1,
                     GLX_ALPHA_SIZE, 1,
                     GLX_DEPTH_SIZE, 1,
                     GLX_SAMPLE_BUFFERS, 1,
                     GLX_SAMPLES, 1 << prefAntialiasing,
                     None };
    if (prefAntialiasing <= 0)
      attrib[16] = 0;
    int num;
    GLXFBConfig *configs = gGLXWrap.fChooseFBConfig(mDisplay, DefaultScreen(mDisplay),
                                                    attrib, &num);

    fprintf(stderr, "CANVAS3D FBCONFIG: %d %p\n", num, (void*) configs);
    if (!configs) {
        LogMessage("Canvas 3D: No GLXFBConfig found");
        return PR_FALSE;
    }

    // choose first matching config;
    mFBConfig = *configs;

    XFree(configs);

    mPbufferContext = gGLXWrap.fCreateNewContext(mDisplay, mFBConfig, GLX_RGBA_TYPE,
                                                 nsnull, True);

    PRInt64 t1 = PR_Now();

    Resize(2, 2);
    MakeContextCurrent();

    PRInt64 t2 = PR_Now();

    fprintf (stderr, "nsGLPbufferGLX::Init!\n");

    if (!mGLWrap.OpenLibrary("libGL.so.1")) {
        LogMessage("Canvas 3D: GLWrap init failed, couldn't find libGL.so.1");
        return PR_FALSE;
    }

    mGLWrap.SetLookupFunc((LibrarySymbolLoader::PlatformLookupFunction) gGLXWrap.fGetProcAddress);

    if (!mGLWrap.Init(GLES20Wrap::TRY_NATIVE_GL)) {
        LogMessage("Canvas 3D: GLWrap init failed");
        return PR_FALSE;
    }

    PRInt64 t3 = PR_Now();

    fprintf (stderr, "nsGLPbufferGLX:: Initialization took t2-t1: %f t3-t2: %f\n",
             ((double)(t2-t1))/1000.0, ((double)(t3-t2))/1000.0);
    fflush (stderr);

    return PR_TRUE;
}