void glXSwapBuffers(Display *pDisplay, GLXDrawable drawable) { assert(gDrawableBuffers.find(drawable) != gDrawableBuffers.end()); OGL_TRACE(SwapBuffers, GetOGL()); FrameBuffer *fb = gDrawableBuffers[drawable]; fb->Flip(); OGL::GetDDProcTable().pfnSetRenderTarget(OGL::GetDDHandle(), fb->GetBackBuffer(), fb->GetDepthBuffer()); }
void _glXResize(GLuint width, GLuint height) { XID drawable = currentContext->second.drawable; FrameBuffer *fb = gDrawableBuffers[drawable]; fb->Resize(width, height); // reset render target in case swap chain was destroyed and recreated on resize OGL::GetDDProcTable().pfnSetRenderTarget(OGL::GetDDHandle(), fb->GetBackBuffer(), fb->GetDepthBuffer()); }
Bool glXMakeContextCurrent(Display *pDisplay, GLXDrawable draw, GLXDrawable read, GLXContext ctx) { // unbind current context if NULL ctx passed in if (ctx == NULL) { currentContext = contexts.end(); return 1; } auto *pState = reinterpret_cast<OGL::State *>(ctx); if (contexts.find(pState) == currentContext) { return 1; } auto &xCtxt = contexts[pState]; xCtxt.drawable = draw; SetOGL(pState); GLuint width, height; XWindowAttributes xWindowAttributes = { 0 }; SWRPBuffer *buf; bool isDisplay; switch (gDrawables[draw]) { case X: XGetWindowAttributes(pDisplay, draw, &xWindowAttributes); width = xWindowAttributes.width; height = xWindowAttributes.height; isDisplay = true; break; case PBUFFER: buf = (SWRPBuffer *)draw; width = buf->width; height = buf->height; isDisplay = false; break; default: assert(0 && "Invalid buffer type"); return 0; } // bind render target set to SWR pipeline FrameBuffer *fb; if (gDrawableBuffers.find(draw) == gDrawableBuffers.end()) { // we haven't seen this drawable yet, create a new frame buffer fb = new FrameBuffer(); fb->Initialize(width, height, draw, xCtxt.pDisplay, xCtxt.pVisInfo, isDisplay); gDrawableBuffers[draw] = fb; } else { fb = gDrawableBuffers[draw]; } OGL::GetDDProcTable().pfnSetRenderTarget(OGL::GetDDHandle(), fb->GetBackBuffer(), fb->GetDepthBuffer()); // according to spec, only set current viewport to draw buffer dimensions if the context hasn't // been initialized if (!xCtxt.initialized) { pState->mViewport.x = 0; pState->mViewport.y = 0; pState->mViewport.width = width; pState->mViewport.height = height; pState->mScissor.x = 0; pState->mScissor.y = 0; pState->mScissor.width = width; pState->mScissor.height = height; xCtxt.initialized = true; } currentContext = contexts.find(pState); return 1; }