gl_context_t makeSharedGLContext(gl_context_t shareWith, char const **outError) { CGLContextObj shareContext = (CGLContextObj)shareWith; CGLPixelFormatObj pixelFormat = CGLGetPixelFormat(shareContext); CGLContextObj newContext; CGLError code = CGLCreateContext(pixelFormat, shareContext, &newContext); if (code != kCGLNoError) { *outError = CGLErrorString(code); return 0; } else return (gl_context_t)newContext; }
bool nglContext::MakeCurrent(WindowRef win) const { bool res = true; #ifndef __NOGLCONTEXT__ if (mCtx) res = aglSetCurrentContext(mCtx) != 0; if (win) aglSetDrawable(mCtx, GetWindowPort(win)); CGLContextObj ctx = CGLGetCurrentContext(); CGLPixelFormatObj pixelFormat = CGLGetPixelFormat(ctx); //printf("cglcontext : 0x%x / 0x%x\n", ctx, pixelFormat); #endif return res; }
GraphicsSurfacePrivate(const PlatformGraphicsContext3D shareContext, const IntSize& size, GraphicsSurface::Flags flags) : m_context(0) , m_size(size) , m_frontBufferTexture(0) , m_frontBufferReadTexture(0) , m_backBufferTexture(0) , m_backBufferReadTexture(0) , m_readFbo(0) , m_drawFbo(0) { #if PLATFORM(QT) QPlatformNativeInterface* nativeInterface = QGuiApplication::platformNativeInterface(); CGLContextObj shareContextObject = static_cast<CGLContextObj>(nativeInterface->nativeResourceForContext(QByteArrayLiteral("cglContextObj"), shareContext)); if (!shareContextObject) return; CGLPixelFormatObj pixelFormatObject = CGLGetPixelFormat(shareContextObject); if (kCGLNoError != CGLCreateContext(pixelFormatObject, shareContextObject, &m_context)) return; CGLRetainContext(m_context); #endif unsigned pixelFormat = 'BGRA'; unsigned bytesPerElement = 4; int width = m_size.width(); int height = m_size.height(); unsigned long bytesPerRow = IOSurfaceAlignProperty(kIOSurfaceBytesPerRow, width * bytesPerElement); if (!bytesPerRow) return; unsigned long allocSize = IOSurfaceAlignProperty(kIOSurfaceAllocSize, height * bytesPerRow); if (!allocSize) return; const void *keys[6]; const void *values[6]; keys[0] = kIOSurfaceWidth; values[0] = CFNumberCreate(0, kCFNumberIntType, &width); keys[1] = kIOSurfaceHeight; values[1] = CFNumberCreate(0, kCFNumberIntType, &height); keys[2] = kIOSurfacePixelFormat; values[2] = CFNumberCreate(0, kCFNumberIntType, &pixelFormat); keys[3] = kIOSurfaceBytesPerElement; values[3] = CFNumberCreate(0, kCFNumberIntType, &bytesPerElement); keys[4] = kIOSurfaceBytesPerRow; values[4] = CFNumberCreate(0, kCFNumberLongType, &bytesPerRow); keys[5] = kIOSurfaceAllocSize; values[5] = CFNumberCreate(0, kCFNumberLongType, &allocSize); CFDictionaryRef dict = CFDictionaryCreate(0, keys, values, 6, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); for (unsigned i = 0; i < 6; i++) CFRelease(values[i]); m_frontBuffer = IOSurfaceCreate(dict); m_backBuffer = IOSurfaceCreate(dict); if (!(flags & GraphicsSurface::SupportsSharing)) return; m_token = GraphicsSurfaceToken(IOSurfaceCreateMachPort(m_frontBuffer), IOSurfaceCreateMachPort(m_backBuffer)); }