示例#1
0
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());
}
示例#2
0
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());
}
示例#3
0
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;
}