already_AddRefed<gfxXlibSurface> SurfaceDescriptorX11::OpenForeign() const { Display* display = DefaultXDisplay(); Screen* screen = DefaultScreenOfDisplay(display); RefPtr<gfxXlibSurface> surf; XRenderPictFormat* pictFormat = GetXRenderPictFormatFromId(display, mFormat); if (pictFormat) { surf = new gfxXlibSurface(screen, mId, pictFormat, mSize); } else { Visual* visual; int depth; FindVisualAndDepth(display, mFormat, &visual, &depth); if (!visual) return nullptr; surf = new gfxXlibSurface(display, mId, visual, mSize); } #ifdef GL_PROVIDER_GLX if (mGLXPixmap) surf->BindGLXPixmap(mGLXPixmap); #endif return surf->CairoStatus() ? nullptr : surf.forget(); }
X11TextureData* X11TextureData::Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, TextureFlags aFlags, LayersIPCChannel* aAllocator) { MOZ_ASSERT(aSize.width >= 0 && aSize.height >= 0); if (aSize.width <= 0 || aSize.height <= 0 || aSize.width > XLIB_IMAGE_SIDE_SIZE_LIMIT || aSize.height > XLIB_IMAGE_SIDE_SIZE_LIMIT) { gfxDebug() << "Asking for X11 surface of invalid size " << aSize.width << "x" << aSize.height; return nullptr; } gfxImageFormat imageFormat = SurfaceFormatToImageFormat(aFormat); RefPtr<gfxASurface> surface = gfxPlatform::GetPlatform()->CreateOffscreenSurface(aSize, imageFormat); if (!surface || surface->GetType() != gfxSurfaceType::Xlib) { NS_ERROR("creating Xlib surface failed!"); return nullptr; } gfxXlibSurface* xlibSurface = static_cast<gfxXlibSurface*>(surface.get()); bool crossProcess = !aAllocator->IsSameProcess(); X11TextureData* texture = new X11TextureData( aSize, aFormat, !!(aFlags & TextureFlags::DEALLOCATE_CLIENT), crossProcess, xlibSurface); if (crossProcess) { FinishX(DefaultXDisplay()); } return texture; }
already_AddRefed<GLContext> GLContextProviderGLX::CreateForNativePixmapSurface(gfxASurface *aSurface) { if (!sGLXLibrary.EnsureInitialized()) { return nsnull; } if (aSurface->GetType() != gfxASurface::SurfaceTypeXlib) { NS_WARNING("GLContextProviderGLX::CreateForNativePixmapSurface called with non-Xlib surface"); return nsnull; } nsAutoTArray<int, 20> attribs; #define A1_(_x) do { attribs.AppendElement(_x); } while(0) #define A2_(_x,_y) do { \ attribs.AppendElement(_x); \ attribs.AppendElement(_y); \ } while(0) A2_(GLX_DOUBLEBUFFER, False); A2_(GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT); A1_(0); int numFormats; Display *display = DefaultXDisplay(); int xscreen = DefaultScreen(display); ScopedXFree<GLXFBConfig> cfg(sGLXLibrary.xChooseFBConfig(display, xscreen, attribs.Elements(), &numFormats)); if (!cfg) { return nsnull; } NS_ASSERTION(numFormats > 0, "glXChooseFBConfig() failed to match our requested format and violated its spec (!)"); gfxXlibSurface *xs = static_cast<gfxXlibSurface*>(aSurface); GLXPixmap glxpixmap = sGLXLibrary.xCreatePixmap(display, cfg[0], xs->XDrawable(), NULL); nsRefPtr<GLContextGLX> glContext = GLContextGLX::CreateGLContext(ContextFormat(ContextFormat::BasicRGB24), display, glxpixmap, cfg[0], NULL, NULL, PR_FALSE, xs); if (!glContext->Init()) { return nsnull; } return glContext.forget(); }
void GLXLibrary::DestroyPixmap(GLXPixmap aPixmap) { if (!mUseTextureFromPixmap) { return; } Display *display = DefaultXDisplay(); xDestroyPixmap(display, aPixmap); }
void GLXLibrary::ReleaseTexImage(GLXPixmap aPixmap) { if (!mUseTextureFromPixmap) { return; } Display *display = DefaultXDisplay(); xReleaseTexImage(display, aPixmap, LOCAL_GLX_FRONT_LEFT_EXT); }
void GLXLibrary::AfterGLXCall() { if (mDebug) { FinishX(DefaultXDisplay()); if (sErrorEvent.mError.error_code) { char buffer[2048]; XGetErrorText(DefaultXDisplay(), sErrorEvent.mError.error_code, buffer, sizeof(buffer)); printf_stderr("X ERROR: %s (%i) - Request: %i.%i, Serial: %i", buffer, sErrorEvent.mError.error_code, sErrorEvent.mError.request_code, sErrorEvent.mError.minor_code, sErrorEvent.mError.serial); NS_ABORT(); } XSetErrorHandler(sOldErrorHandler); } }
bool X11DataTextureSourceBasic::Update(gfx::DataSourceSurface* aSurface, nsIntRegion* aDestRegion, gfx::IntPoint* aSrcOffset) { // Reallocate our internal X11 surface if we don't have a DrawTarget yet, // or if we changed surface size or format since last update. if (!mBufferDrawTarget || (aSurface->GetSize() != mBufferDrawTarget->GetSize()) || (aSurface->GetFormat() != mBufferDrawTarget->GetFormat())) { nsRefPtr<gfxASurface> surf; gfxImageFormat imageFormat = SurfaceFormatToImageFormat(aSurface->GetFormat()); Display *display = DefaultXDisplay(); Screen *screen = DefaultScreenOfDisplay(display); XRenderPictFormat *xrenderFormat = gfxXlibSurface::FindRenderFormat(display, imageFormat); if (xrenderFormat) { surf = gfxXlibSurface::Create(screen, xrenderFormat, ThebesIntSize(aSurface->GetSize())); } if (!surf) { NS_WARNING("Couldn't create native surface, fallback to image surface"); surf = new gfxImageSurface(ThebesIntSize(aSurface->GetSize()), imageFormat); } mBufferDrawTarget = gfxPlatform::GetPlatform()-> CreateDrawTargetForSurface(surf, aSurface->GetSize()); } // Image contents have changed, upload to our DrawTarget // If aDestRegion is null, means we're updating the whole surface // Note : Incremental update with a source offset is only used on Mac. NS_ASSERTION(!aSrcOffset, "SrcOffset should not be used with linux OMTC basic"); if (aDestRegion) { nsIntRegionRectIterator iter(*aDestRegion); while (const nsIntRect* iterRect = iter.Next()) { IntRect srcRect(iterRect->x, iterRect->y, iterRect->width, iterRect->height); IntPoint dstPoint(iterRect->x, iterRect->y); // We're uploading regions to our buffer, so let's just copy contents over mBufferDrawTarget->CopySurface(aSurface, srcRect, dstPoint); } } else { // We're uploading the whole buffer, so let's just copy the full surface IntSize size = aSurface->GetSize(); mBufferDrawTarget->CopySurface(aSurface, IntRect(0, 0, size.width, size.height), IntPoint(0, 0)); } return true; }
already_AddRefed<gfxXlibSurface> SurfaceDescriptorX11::OpenForeign() const { Display* display = DefaultXDisplay(); Screen* screen = DefaultScreenOfDisplay(display); XRenderPictFormat* format = GetXRenderPictFormatFromId(display, mFormat); nsRefPtr<gfxXlibSurface> surf = new gfxXlibSurface(screen, mId, format, mSize); return surf->CairoStatus() ? nsnull : surf.forget(); }
/*static*/ void ShadowLayerForwarder::PlatformSyncBeforeUpdate() { if (UsingXCompositing()) { // If we're using X surfaces, then we need to finish all pending // operations on the back buffers before handing them to the // parent, otherwise the surface might be used by the parent's // Display in between two operations queued by our Display. FinishX(DefaultXDisplay()); } }
/*static*/ void LayerManagerComposite::PlatformSyncBeforeReplyUpdate() { if (UsingXCompositing()) { // If we're using X surfaces, we need to finish all pending // operations on the *front buffers* before handing them back to // the child, even though they will be read operations. // Otherwise, the child might start scribbling on new back buffers // that are still participating in requests as old front buffers. FinishX(DefaultXDisplay()); } }
void GLXLibrary::BindTexImage(GLXPixmap aPixmap) { if (!mUseTextureFromPixmap) { return; } Display *display = DefaultXDisplay(); // Make sure all X drawing to the surface has finished before binding to a texture. if (mClientIsMesa) { // Using XSync instead of Mesa's glXWaitX, because its glxWaitX is a // noop when direct rendering unless the current drawable is a // single-buffer window. FinishX(display); } else { xWaitX(); } xBindTexImage(display, aPixmap, LOCAL_GLX_FRONT_LEFT_EXT, nullptr); }
/* static */ UniquePtr<SharedSurface_GLXDrawable> SharedSurface_GLXDrawable::Create(GLContext* prodGL, const SurfaceCaps& caps, const gfx::IntSize& size, bool deallocateClient, bool inSameProcess) { UniquePtr<SharedSurface_GLXDrawable> ret; Display* display = DefaultXDisplay(); Screen* screen = XDefaultScreenOfDisplay(display); Visual* visual = gfxXlibSurface::FindVisual(screen, gfxImageFormat::ARGB32); RefPtr<gfxXlibSurface> surf = gfxXlibSurface::Create(screen, visual, size); if (!deallocateClient) surf->ReleasePixmap(); ret.reset(new SharedSurface_GLXDrawable(prodGL, size, inSameProcess, surf)); return Move(ret); }
already_AddRefed<gfxXlibSurface> SurfaceDescriptorX11::OpenForeign() const { Display* display = DefaultXDisplay(); Screen* screen = DefaultScreenOfDisplay(display); nsRefPtr<gfxXlibSurface> surf; XRenderPictFormat* pictFormat = GetXRenderPictFormatFromId(display, mFormat); if (pictFormat) { surf = new gfxXlibSurface(screen, mId, pictFormat, mSize); } else { Visual* visual = NULL; unsigned int depth; XVisualIDToInfo(display, mFormat, &visual, &depth); if (!visual) return nsnull; surf = new gfxXlibSurface(display, mId, visual, mSize); } return surf->CairoStatus() ? nsnull : surf.forget(); }
already_AddRefed<gfxXlibSurface> SurfaceDescriptorX11::OpenForeign() const { Display* display = DefaultXDisplay(); Screen* screen = DefaultScreenOfDisplay(display); nsRefPtr<gfxXlibSurface> surf; XRenderPictFormat* pictFormat = GetXRenderPictFormatFromId(display, mFormat); if (pictFormat) { surf = new gfxXlibSurface(screen, mId, pictFormat, gfx::ThebesIntSize(mSize)); } else { Visual* visual; int depth; FindVisualAndDepth(display, mFormat, &visual, &depth); if (!visual) return nullptr; surf = new gfxXlibSurface(display, mId, visual, gfx::ThebesIntSize(mSize)); } return surf->CairoStatus() ? nullptr : surf.forget(); }
static already_AddRefed<GLContextGLX> CreateOffscreenPixmapContext(const gfxIntSize& size, LibType libToUse) { GLXLibrary& glx = sGLXLibrary[libToUse]; if (!glx.EnsureInitialized(libToUse)) { return nullptr; } Display *display = DefaultXDisplay(); int xscreen = DefaultScreen(display); int attribs[] = { LOCAL_GLX_DRAWABLE_TYPE, LOCAL_GLX_PIXMAP_BIT, LOCAL_GLX_X_RENDERABLE, True, 0 }; int numConfigs = 0; ScopedXFree<GLXFBConfig> cfgs; cfgs = glx.xChooseFBConfig(display, xscreen, attribs, &numConfigs); if (!cfgs) { return nullptr; } MOZ_ASSERT(numConfigs > 0, "glXChooseFBConfig() failed to match our requested format and violated its spec!"); int visid = None; int chosenIndex = 0; for (int i = 0; i < numConfigs; ++i) { int dtype; if (glx.xGetFBConfigAttrib(display, cfgs[i], LOCAL_GLX_DRAWABLE_TYPE, &dtype) != Success || !(dtype & LOCAL_GLX_PIXMAP_BIT)) { continue; } if (glx.xGetFBConfigAttrib(display, cfgs[i], LOCAL_GLX_VISUAL_ID, &visid) != Success || visid == 0) { continue; } chosenIndex = i; break; } if (!visid) { NS_WARNING("glXChooseFBConfig() didn't give us any configs with visuals!"); return nullptr; } Visual *visual; int depth; FindVisualAndDepth(display, visid, &visual, &depth); ScopedXErrorHandler xErrorHandler; GLXPixmap glxpixmap = 0; bool error = false; gfxIntSize dummySize(16, 16); nsRefPtr<gfxXlibSurface> xsurface = gfxXlibSurface::Create(DefaultScreenOfDisplay(display), visual, dummySize); if (xsurface->CairoStatus() != 0) { error = true; goto DONE_CREATING_PIXMAP; } // Handle slightly different signature between glXCreatePixmap and // its pre-GLX-1.3 extension equivalent (though given the ABI, we // might not need to). if (glx.GLXVersionCheck(1, 3)) { glxpixmap = glx.xCreatePixmap(display, cfgs[chosenIndex], xsurface->XDrawable(), nullptr); } else { glxpixmap = glx.xCreateGLXPixmapWithConfig(display, cfgs[chosenIndex], xsurface-> XDrawable()); } if (glxpixmap == 0) { error = true; } DONE_CREATING_PIXMAP: nsRefPtr<GLContextGLX> glContext; bool serverError = xErrorHandler.SyncAndGetError(display); if (!error && // earlier recorded error !serverError) { ContextFlags flag = libToUse == GLXLibrary::MESA_LLVMPIPE_LIB ? ContextFlagsMesaLLVMPipe : ContextFlagsNone; // We might have an alpha channel, but it doesn't matter. SurfaceCaps dummyCaps = SurfaceCaps::Any(); GLContextGLX* shareContext = GetGlobalContextGLX(flag); glContext = GLContextGLX::CreateGLContext(dummyCaps, shareContext, true, display, glxpixmap, cfgs[chosenIndex], true, libToUse, xsurface); } return glContext.forget(); }
static already_AddRefed<GLContextGLX> CreateOffscreenPixmapContext(const gfxIntSize& aSize, const ContextFormat& aFormat, PRBool aShare) { if (!sGLXLibrary.EnsureInitialized()) { return nsnull; } Display *display = DefaultXDisplay(); int xscreen = DefaultScreen(display); int attribs[] = { GLX_DOUBLEBUFFER, False, GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT, GLX_X_RENDERABLE, True, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_ALPHA_SIZE, 0, GLX_DEPTH_SIZE, 0, 0 }; int numConfigs = 0; ScopedXFree<GLXFBConfig> cfgs; cfgs = sGLXLibrary.xChooseFBConfig(display, xscreen, attribs, &numConfigs); if (!cfgs) { return nsnull; } NS_ASSERTION(numConfigs > 0, "glXChooseFBConfig() failed to match our requested format and violated its spec (!)"); ScopedXFree<XVisualInfo> vinfo; int chosenIndex; for (int i = 0; i < numConfigs; ++i) { int dtype, visid; if (sGLXLibrary.xGetFBConfigAttrib(display, cfgs[i], GLX_DRAWABLE_TYPE, &dtype) != Success || !(dtype & GLX_PIXMAP_BIT)) { continue; } if (sGLXLibrary.xGetFBConfigAttrib(display, cfgs[i], GLX_VISUAL_ID, &visid) != Success || visid == 0) { continue; } vinfo = sGLXLibrary.xGetVisualFromFBConfig(display, cfgs[i]); if (vinfo) { chosenIndex = i; break; } } if (!vinfo) { NS_WARNING("glXChooseFBConfig() didn't give us any configs with visuals!"); return nsnull; } nsRefPtr<gfxXlibSurface> xsurface = gfxXlibSurface::Create(DefaultScreenOfDisplay(display), vinfo->visual, gfxIntSize(16, 16)); if (xsurface->CairoStatus() != 0) { return nsnull; } GLXPixmap glxpixmap = sGLXLibrary.xCreatePixmap(display, cfgs[chosenIndex], xsurface->XDrawable(), NULL); if (glxpixmap == 0) { return nsnull; } GLContextGLX *shareContext = aShare ? GetGlobalContextGLX() : nsnull; nsRefPtr<GLContextGLX> glContext = GLContextGLX::CreateGLContext(aFormat, display, glxpixmap, cfgs[chosenIndex], vinfo, shareContext, PR_TRUE, xsurface); return glContext.forget(); }
PRBool GLXLibrary::EnsureInitialized() { if (mInitialized) { return PR_TRUE; } if (!mOGLLibrary) { mOGLLibrary = PR_LoadLibrary("libGL.so.1"); if (!mOGLLibrary) { NS_WARNING("Couldn't load OpenGL shared library."); return PR_FALSE; } } LibrarySymbolLoader::SymLoadStruct symbols[] = { { (PRFuncPtr*) &xDeleteContext, { "glXDestroyContext", NULL } }, { (PRFuncPtr*) &xMakeCurrent, { "glXMakeCurrent", NULL } }, { (PRFuncPtr*) &xGetProcAddress, { "glXGetProcAddress", NULL } }, { (PRFuncPtr*) &xChooseVisual, { "glXChooseVisual", NULL } }, { (PRFuncPtr*) &xChooseFBConfig, { "glXChooseFBConfig", NULL } }, { (PRFuncPtr*) &xGetFBConfigs, { "glXGetFBConfigs", NULL } }, { (PRFuncPtr*) &xCreatePbuffer, { "glXCreatePbuffer", NULL } }, { (PRFuncPtr*) &xCreateNewContext, { "glXCreateNewContext", NULL } }, { (PRFuncPtr*) &xDestroyPbuffer, { "glXDestroyPbuffer", NULL } }, { (PRFuncPtr*) &xGetVisualFromFBConfig, { "glXGetVisualFromFBConfig", NULL } }, { (PRFuncPtr*) &xGetFBConfigAttrib, { "glXGetFBConfigAttrib", NULL } }, { (PRFuncPtr*) &xSwapBuffers, { "glXSwapBuffers", NULL } }, { (PRFuncPtr*) &xQueryServerString, { "glXQueryServerString", NULL } }, { (PRFuncPtr*) &xCreatePixmap, { "glXCreatePixmap", NULL } }, { (PRFuncPtr*) &xDestroyPixmap, { "glXDestroyPixmap", NULL } }, { (PRFuncPtr*) &xGetClientString, { "glXGetClientString", NULL } }, { (PRFuncPtr*) &xCreateContext, { "glXCreateContext", NULL } }, { NULL, { NULL } } }; if (!LibrarySymbolLoader::LoadSymbols(mOGLLibrary, &symbols[0])) { NS_WARNING("Couldn't find required entry point in OpenGL shared library"); return PR_FALSE; } const char *vendor = xQueryServerString(DefaultXDisplay(), DefaultScreen(DefaultXDisplay()), GLX_VENDOR); const char *serverVersionStr = xQueryServerString(DefaultXDisplay(), DefaultScreen(DefaultXDisplay()), GLX_VERSION); const char *clientVersionStr = xGetClientString(DefaultXDisplay(), GLX_VERSION); int serverVersion = 0, clientVersion = 0; if (serverVersionStr && strlen(serverVersionStr) >= 3 && serverVersionStr[1] == '.') { serverVersion = (serverVersionStr[0] - '0') << 8 | (serverVersionStr[2] - '0'); } if (clientVersionStr && strlen(clientVersionStr) >= 3 && clientVersionStr[1] == '.') { clientVersion = (clientVersionStr[0] - '0') << 8 | (clientVersionStr[2] - '0'); } gGLXVersion = PR_MIN(clientVersion, serverVersion); if (gGLXVersion < 0x0103) return PR_FALSE; gIsATI = vendor && strstr(vendor, "ATI"); gIsChromium = (vendor && strstr(vendor, "Chromium")) || (serverVersion && strstr(serverVersionStr, "Chromium")); mInitialized = PR_TRUE; return PR_TRUE; }
bool GLXLibrary::EnsureInitialized(LibType libType) { if (mInitialized) { return true; } // Don't repeatedly try to initialize. if (mTriedInitializing) { return false; } mTriedInitializing = true; // Force enabling s3 texture compression. (Bug 774134) PR_SetEnv("force_s3tc_enable=true"); if (!mOGLLibrary) { const char* libGLfilename = nullptr; bool forceFeatureReport = false; switch (libType) { case MESA_LLVMPIPE_LIB: libGLfilename = "mesallvmpipe.so"; forceFeatureReport = true; break; case OPENGL_LIB: // see e.g. bug 608526: it is intrinsically interesting to know whether we have dynamically linked to libGL.so.1 // because at least the NVIDIA implementation requires an executable stack, which causes mprotect calls, // which trigger glibc bug http://sourceware.org/bugzilla/show_bug.cgi?id=12225 #ifdef __OpenBSD__ libGLfilename = "libGL.so"; #else libGLfilename = "libGL.so.1"; #endif break; default: MOZ_CRASH("Invalid GLX library type."); } ScopedGfxFeatureReporter reporter(libGLfilename, forceFeatureReport); mOGLLibrary = PR_LoadLibrary(libGLfilename); if (!mOGLLibrary) { NS_WARNING("Couldn't load OpenGL shared library."); return false; } reporter.SetSuccessful(); } if (PR_GetEnv("MOZ_GLX_DEBUG")) { mDebug = true; } GLLibraryLoader::SymLoadStruct symbols[] = { /* functions that were in GLX 1.0 */ { (PRFuncPtr*) &xDestroyContextInternal, { "glXDestroyContext", nullptr } }, { (PRFuncPtr*) &xMakeCurrentInternal, { "glXMakeCurrent", nullptr } }, { (PRFuncPtr*) &xSwapBuffersInternal, { "glXSwapBuffers", nullptr } }, { (PRFuncPtr*) &xQueryVersionInternal, { "glXQueryVersion", nullptr } }, { (PRFuncPtr*) &xGetCurrentContextInternal, { "glXGetCurrentContext", nullptr } }, { (PRFuncPtr*) &xWaitGLInternal, { "glXWaitGL", nullptr } }, { (PRFuncPtr*) &xWaitXInternal, { "glXWaitX", nullptr } }, /* functions introduced in GLX 1.1 */ { (PRFuncPtr*) &xQueryExtensionsStringInternal, { "glXQueryExtensionsString", nullptr } }, { (PRFuncPtr*) &xGetClientStringInternal, { "glXGetClientString", nullptr } }, { (PRFuncPtr*) &xQueryServerStringInternal, { "glXQueryServerString", nullptr } }, { nullptr, { nullptr } } }; GLLibraryLoader::SymLoadStruct symbols13[] = { /* functions introduced in GLX 1.3 */ { (PRFuncPtr*) &xChooseFBConfigInternal, { "glXChooseFBConfig", nullptr } }, { (PRFuncPtr*) &xGetFBConfigAttribInternal, { "glXGetFBConfigAttrib", nullptr } }, // WARNING: xGetFBConfigs not set in symbols13_ext { (PRFuncPtr*) &xGetFBConfigsInternal, { "glXGetFBConfigs", nullptr } }, // WARNING: symbols13_ext sets xCreateGLXPixmapWithConfig instead { (PRFuncPtr*) &xCreatePixmapInternal, { "glXCreatePixmap", nullptr } }, { (PRFuncPtr*) &xDestroyPixmapInternal, { "glXDestroyPixmap", nullptr } }, { (PRFuncPtr*) &xCreateNewContextInternal, { "glXCreateNewContext", nullptr } }, { nullptr, { nullptr } } }; GLLibraryLoader::SymLoadStruct symbols13_ext[] = { /* extension equivalents for functions introduced in GLX 1.3 */ // GLX_SGIX_fbconfig extension { (PRFuncPtr*) &xChooseFBConfigInternal, { "glXChooseFBConfigSGIX", nullptr } }, { (PRFuncPtr*) &xGetFBConfigAttribInternal, { "glXGetFBConfigAttribSGIX", nullptr } }, // WARNING: no xGetFBConfigs equivalent in extensions // WARNING: different from symbols13: { (PRFuncPtr*) &xCreateGLXPixmapWithConfigInternal, { "glXCreateGLXPixmapWithConfigSGIX", nullptr } }, { (PRFuncPtr*) &xDestroyPixmapInternal, { "glXDestroyGLXPixmap", nullptr } }, // not from ext { (PRFuncPtr*) &xCreateNewContextInternal, { "glXCreateContextWithConfigSGIX", nullptr } }, { nullptr, { nullptr } } }; GLLibraryLoader::SymLoadStruct symbols14[] = { /* functions introduced in GLX 1.4 */ { (PRFuncPtr*) &xGetProcAddressInternal, { "glXGetProcAddress", nullptr } }, { nullptr, { nullptr } } }; GLLibraryLoader::SymLoadStruct symbols14_ext[] = { /* extension equivalents for functions introduced in GLX 1.4 */ // GLX_ARB_get_proc_address extension { (PRFuncPtr*) &xGetProcAddressInternal, { "glXGetProcAddressARB", nullptr } }, { nullptr, { nullptr } } }; GLLibraryLoader::SymLoadStruct symbols_texturefrompixmap[] = { { (PRFuncPtr*) &xBindTexImageInternal, { "glXBindTexImageEXT", nullptr } }, { (PRFuncPtr*) &xReleaseTexImageInternal, { "glXReleaseTexImageEXT", nullptr } }, { nullptr, { nullptr } } }; GLLibraryLoader::SymLoadStruct symbols_robustness[] = { { (PRFuncPtr*) &xCreateContextAttribsInternal, { "glXCreateContextAttribsARB", nullptr } }, { nullptr, { nullptr } } }; if (!GLLibraryLoader::LoadSymbols(mOGLLibrary, &symbols[0])) { NS_WARNING("Couldn't find required entry point in OpenGL shared library"); return false; } Display *display = DefaultXDisplay(); int screen = DefaultScreen(display); if (!xQueryVersion(display, &mGLXMajorVersion, &mGLXMinorVersion)) { mGLXMajorVersion = 0; mGLXMinorVersion = 0; return false; } if (!GLXVersionCheck(1, 1)) // Not possible to query for extensions. return false; const char *clientVendor = xGetClientString(display, LOCAL_GLX_VENDOR); const char *serverVendor = xQueryServerString(display, screen, LOCAL_GLX_VENDOR); const char *extensionsStr = xQueryExtensionsString(display, screen); GLLibraryLoader::SymLoadStruct *sym13; if (!GLXVersionCheck(1, 3)) { // Even if we don't have 1.3, we might have equivalent extensions // (as on the Intel X server). if (!HasExtension(extensionsStr, "GLX_SGIX_fbconfig")) { return false; } sym13 = symbols13_ext; } else { sym13 = symbols13; } if (!GLLibraryLoader::LoadSymbols(mOGLLibrary, sym13)) { NS_WARNING("Couldn't find required entry point in OpenGL shared library"); return false; } GLLibraryLoader::SymLoadStruct *sym14; if (!GLXVersionCheck(1, 4)) { // Even if we don't have 1.4, we might have equivalent extensions // (as on the Intel X server). if (!HasExtension(extensionsStr, "GLX_ARB_get_proc_address")) { return false; } sym14 = symbols14_ext; } else { sym14 = symbols14; } if (!GLLibraryLoader::LoadSymbols(mOGLLibrary, sym14)) { NS_WARNING("Couldn't find required entry point in OpenGL shared library"); return false; } if (HasExtension(extensionsStr, "GLX_EXT_texture_from_pixmap") && GLLibraryLoader::LoadSymbols(mOGLLibrary, symbols_texturefrompixmap, (GLLibraryLoader::PlatformLookupFunction)&xGetProcAddress)) { #ifdef MOZ_WIDGET_GTK mUseTextureFromPixmap = gfxPlatformGtk::GetPlatform()->UseXRender(); #else mUseTextureFromPixmap = true; #endif } else { mUseTextureFromPixmap = false; NS_WARNING("Texture from pixmap disabled"); } if (HasExtension(extensionsStr, "GLX_ARB_create_context_robustness") && GLLibraryLoader::LoadSymbols(mOGLLibrary, symbols_robustness)) { mHasRobustness = true; } mIsATI = serverVendor && DoesStringMatch(serverVendor, "ATI"); mIsNVIDIA = serverVendor && DoesStringMatch(serverVendor, "NVIDIA Corporation"); mClientIsMesa = clientVendor && DoesStringMatch(clientVendor, "Mesa"); mInitialized = true; mLibType = libType; return true; }
void X11TextureData::Unlock() { if (mSurface && mIsCrossProcess) { FinishX(DefaultXDisplay()); } }
void X11BasicCompositor::EndFrame() { BasicCompositor::EndFrame(); XFlush(DefaultXDisplay()); }