bool GLContextWGL::ResizeOffscreen(const gfxIntSize& aNewSize) { if (mPBuffer) { if (!IsValidSizeForFormat(gSharedWindowDC, mPixelFormat, aNewSize)) return false; int pbattrs[] = { LOCAL_WGL_TEXTURE_FORMAT_ARB, mCreationFormat.alpha > 0 ? LOCAL_WGL_TEXTURE_RGBA_ARB : LOCAL_WGL_TEXTURE_RGB_ARB, LOCAL_WGL_TEXTURE_TARGET_ARB, LOCAL_WGL_TEXTURE_2D_ARB, 0 }; HANDLE newbuf = sWGLLibrary.fCreatePbuffer(gSharedWindowDC, mPixelFormat, aNewSize.width, aNewSize.height, pbattrs); if (!newbuf) return false; bool isCurrent = false; if (sWGLLibrary.fGetCurrentContext() == mContext) { sWGLLibrary.fMakeCurrent(NULL, NULL); isCurrent = true; } sWGLLibrary.fDestroyPbuffer(mPBuffer); mPBuffer = newbuf; mDC = sWGLLibrary.fGetPbufferDC(mPBuffer); mOffscreenSize = aNewSize; mOffscreenActualSize = aNewSize; MakeCurrent(); ClearSafely(); return ResizeOffscreenFBOs(aNewSize, false); } return ResizeOffscreenFBOs(aNewSize, true); }
static already_AddRefed<GLContextWGL> CreatePBufferOffscreenContext(const gfxIntSize& aSize, LibType aLibToUse) { WGLLibrary& wgl = sWGLLib[aLibToUse]; #define A1(_a,_x) do { _a.AppendElement(_x); } while(0) #define A2(_a,_x,_y) do { _a.AppendElement(_x); _a.AppendElement(_y); } while(0) nsTArray<int> attrs; A2(attrs, LOCAL_WGL_SUPPORT_OPENGL_ARB, LOCAL_GL_TRUE); A2(attrs, LOCAL_WGL_DRAW_TO_PBUFFER_ARB, LOCAL_GL_TRUE); A2(attrs, LOCAL_WGL_DOUBLE_BUFFER_ARB, LOCAL_GL_FALSE); A2(attrs, LOCAL_WGL_ACCELERATION_ARB, LOCAL_WGL_FULL_ACCELERATION_ARB); A2(attrs, LOCAL_WGL_DOUBLE_BUFFER_ARB, LOCAL_GL_FALSE); A2(attrs, LOCAL_WGL_STEREO_ARB, LOCAL_GL_FALSE); A1(attrs, 0); nsTArray<int> pbattrs; A1(pbattrs, 0); #undef A1 #undef A2 // We only need one! UINT numFormats = 1; int formats[1]; HDC windowDC = wgl.GetWindowDC(); if (!wgl.fChoosePixelFormat(windowDC, attrs.Elements(), NULL, numFormats, formats, &numFormats) || numFormats == 0) { return nullptr; } // We don't care; just pick the first one. int chosenFormat = formats[0]; if (!IsValidSizeForFormat(windowDC, chosenFormat, aSize, aLibToUse)) return nullptr; HANDLE pbuffer = wgl.fCreatePbuffer(windowDC, chosenFormat, aSize.width, aSize.height, pbattrs.Elements()); if (!pbuffer) { return nullptr; } HDC pbdc = wgl.fGetPbufferDC(pbuffer); NS_ASSERTION(pbdc, "expected a dc"); HGLRC context; if (wgl.HasRobustness()) { int attribs[] = { LOCAL_WGL_CONTEXT_FLAGS_ARB, LOCAL_WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB, LOCAL_WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB, LOCAL_WGL_LOSE_CONTEXT_ON_RESET_ARB, 0 }; context = wgl.fCreateContextAttribs(pbdc, nullptr, attribs); } else { context = wgl.fCreateContext(pbdc); } if (!context) { wgl.fDestroyPbuffer(pbuffer); return nullptr; } SurfaceCaps dummyCaps = SurfaceCaps::Any(); nsRefPtr<GLContextWGL> glContext = new GLContextWGL(dummyCaps, nullptr, true, pbuffer, pbdc, context, chosenFormat, aLibToUse); return glContext.forget(); }
static already_AddRefed<GLContextWGL> CreatePBufferOffscreenContext(const gfxIntSize& aSize, const ContextFormat& aFormat) { #define A1(_a,_x) do { _a.AppendElement(_x); } while(0) #define A2(_a,_x,_y) do { _a.AppendElement(_x); _a.AppendElement(_y); } while(0) nsTArray<int> attrs; A2(attrs, LOCAL_WGL_SUPPORT_OPENGL_ARB, LOCAL_GL_TRUE); A2(attrs, LOCAL_WGL_DRAW_TO_PBUFFER_ARB, LOCAL_GL_TRUE); A2(attrs, LOCAL_WGL_DOUBLE_BUFFER_ARB, LOCAL_GL_FALSE); A2(attrs, LOCAL_WGL_ACCELERATION_ARB, LOCAL_WGL_FULL_ACCELERATION_ARB); A2(attrs, LOCAL_WGL_COLOR_BITS_ARB, aFormat.colorBits()); A2(attrs, LOCAL_WGL_RED_BITS_ARB, aFormat.red); A2(attrs, LOCAL_WGL_GREEN_BITS_ARB, aFormat.green); A2(attrs, LOCAL_WGL_BLUE_BITS_ARB, aFormat.blue); A2(attrs, LOCAL_WGL_ALPHA_BITS_ARB, aFormat.alpha); A2(attrs, LOCAL_WGL_DEPTH_BITS_ARB, aFormat.depth); A2(attrs, LOCAL_WGL_STENCIL_BITS_ARB, aFormat.stencil); if (aFormat.alpha > 0) { A2(attrs, LOCAL_WGL_BIND_TO_TEXTURE_RGBA_ARB, LOCAL_GL_TRUE); } else { A2(attrs, LOCAL_WGL_BIND_TO_TEXTURE_RGB_ARB, LOCAL_GL_TRUE); } A2(attrs, LOCAL_WGL_DOUBLE_BUFFER_ARB, LOCAL_GL_FALSE); A2(attrs, LOCAL_WGL_STEREO_ARB, LOCAL_GL_FALSE); A1(attrs, 0); nsTArray<int> pbattrs; A2(pbattrs, LOCAL_WGL_TEXTURE_TARGET_ARB, LOCAL_WGL_TEXTURE_2D_ARB); if (aFormat.alpha > 0) { A2(pbattrs, LOCAL_WGL_TEXTURE_FORMAT_ARB, LOCAL_WGL_TEXTURE_RGBA_ARB); } else { A2(pbattrs, LOCAL_WGL_TEXTURE_FORMAT_ARB, LOCAL_WGL_TEXTURE_RGB_ARB); } A1(pbattrs, 0); UINT numFormats = 256; int formats[256]; if (!sWGLLibrary.fChoosePixelFormat(gSharedWindowDC, attrs.Elements(), NULL, numFormats, formats, &numFormats) || numFormats == 0) { return nsnull; } // XXX add back the priority choosing code here int chosenFormat = formats[0]; if (!IsValidSizeForFormat(gSharedWindowDC, chosenFormat, aSize)) return nsnull; HANDLE pbuffer = sWGLLibrary.fCreatePbuffer(gSharedWindowDC, chosenFormat, aSize.width, aSize.height, pbattrs.Elements()); if (!pbuffer) { return nsnull; } HDC pbdc = sWGLLibrary.fGetPbufferDC(pbuffer); NS_ASSERTION(pbdc, "expected a dc"); HGLRC context; if (sWGLLibrary.HasRobustness()) { int attribs[] = { LOCAL_WGL_CONTEXT_FLAGS_ARB, LOCAL_WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB, LOCAL_WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB, LOCAL_WGL_LOSE_CONTEXT_ON_RESET_ARB, NULL }; context = sWGLLibrary.fCreateContextAttribs(pbdc, nsnull, attribs); } else { context = sWGLLibrary.fCreateContext(pbdc); } if (!context) { sWGLLibrary.fDestroyPbuffer(pbuffer); return false; } nsRefPtr<GLContextWGL> glContext = new GLContextWGL(aFormat, nsnull, pbuffer, pbdc, context, chosenFormat); return glContext.forget(); }