/** * Swap the buffers of the given framebuffer. */ boolean stw_st_swap_framebuffer_locked(HDC hdc, struct st_framebuffer_iface *stfb) { struct stw_st_framebuffer *stwfb = stw_st_framebuffer(stfb); unsigned front = ST_ATTACHMENT_FRONT_LEFT, back = ST_ATTACHMENT_BACK_LEFT; struct pipe_resource *ptex; unsigned mask; /* swap the textures */ ptex = stwfb->textures[front]; stwfb->textures[front] = stwfb->textures[back]; stwfb->textures[back] = ptex; /* convert to mask */ front = 1 << front; back = 1 << back; /* swap the bits in mask */ mask = stwfb->texture_mask & ~(front | back); if (stwfb->texture_mask & front) mask |= back; if (stwfb->texture_mask & back) mask |= front; stwfb->texture_mask = mask; front = ST_ATTACHMENT_FRONT_LEFT; return stw_st_framebuffer_present_locked(hdc, &stwfb->base, front); }
static boolean stw_st_framebuffer_flush_front(struct st_framebuffer_iface *stfb, enum st_attachment_type statt) { struct stw_st_framebuffer *stwfb = stw_st_framebuffer(stfb); pipe_mutex_lock(stwfb->fb->mutex); return stw_st_framebuffer_present_locked(&stwfb->base, statt); }
static boolean stw_st_framebuffer_flush_front(struct st_framebuffer_iface *stfb, enum st_attachment_type statt) { struct stw_st_framebuffer *stwfb = stw_st_framebuffer(stfb); boolean ret; HDC hDC; pipe_mutex_lock(stwfb->fb->mutex); /* We must not cache HDCs anywhere, as they can be invalidated by the * application, or screen resolution changes. */ hDC = GetDC(stwfb->fb->hWnd); ret = stw_st_framebuffer_present_locked(hDC, &stwfb->base, statt); ReleaseDC(stwfb->fb->hWnd, hDC); return ret; }