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; }