mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 05:18:08 +02:00
wgl: Call st_swapbuffers instead of st_notify_swapbuffers.
This will get single buffer, double buffer, and joint single/double buffer (typical in CAD applications) done right, at least as far as the frambuffer is concerned. There are still problems with multiple contexts using the same framebuffer because st_framebuffer_* calls assume the framebuffer is bound to a single context.
This commit is contained in:
parent
e84dddde9b
commit
b2581dcab4
3 changed files with 10 additions and 38 deletions
|
|
@ -72,19 +72,7 @@ stw_flush_frontbuffer(struct pipe_screen *screen,
|
|||
return;
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
{
|
||||
/* ensure that a random surface was not passed to us */
|
||||
struct pipe_surface *surface2;
|
||||
|
||||
if(!st_get_framebuffer_surface( fb->stfb, ST_SURFACE_FRONT_LEFT, &surface2 ))
|
||||
assert(0);
|
||||
else
|
||||
assert(surface2 == surface);
|
||||
}
|
||||
#endif
|
||||
|
||||
stw_framebuffer_present_locked(hdc, fb, ST_SURFACE_FRONT_LEFT);
|
||||
stw_framebuffer_present_locked(hdc, fb, surface);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -475,8 +475,6 @@ DrvPresentBuffers(HDC hdc, PGLPRESENTBUFFERSDATA data)
|
|||
struct stw_framebuffer *fb;
|
||||
struct pipe_screen *screen;
|
||||
struct pipe_surface *surface;
|
||||
unsigned surface_index;
|
||||
BOOL ret = FALSE;
|
||||
|
||||
fb = stw_framebuffer_from_hdc( hdc );
|
||||
if (fb == NULL)
|
||||
|
|
@ -484,9 +482,7 @@ DrvPresentBuffers(HDC hdc, PGLPRESENTBUFFERSDATA data)
|
|||
|
||||
screen = stw_dev->screen;
|
||||
|
||||
surface_index = (unsigned)(uintptr_t)data->pPrivateData;
|
||||
if(!st_get_framebuffer_surface( fb->stfb, surface_index, &surface ))
|
||||
goto fail;
|
||||
surface = (struct pipe_surface *)data->pPrivateData;
|
||||
|
||||
#ifdef DEBUG
|
||||
if(stw_dev->trace_running) {
|
||||
|
|
@ -520,15 +516,11 @@ DrvPresentBuffers(HDC hdc, PGLPRESENTBUFFERSDATA data)
|
|||
stw_dev->stw_winsys->present( screen, surface, hdc );
|
||||
}
|
||||
|
||||
ret = TRUE;
|
||||
|
||||
fail:
|
||||
|
||||
stw_framebuffer_update(fb);
|
||||
|
||||
stw_framebuffer_release(fb);
|
||||
|
||||
return ret;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -540,7 +532,7 @@ fail:
|
|||
BOOL
|
||||
stw_framebuffer_present_locked(HDC hdc,
|
||||
struct stw_framebuffer *fb,
|
||||
unsigned surface_index)
|
||||
struct pipe_surface *surface)
|
||||
{
|
||||
if(stw_dev->callbacks.wglCbPresentBuffers &&
|
||||
stw_dev->stw_winsys->compose) {
|
||||
|
|
@ -551,7 +543,7 @@ stw_framebuffer_present_locked(HDC hdc,
|
|||
data.magic2 = 0;
|
||||
data.AdapterLuid = stw_dev->AdapterLuid;
|
||||
data.rect = fb->client_rect;
|
||||
data.pPrivateData = (void *)(uintptr_t)surface_index;
|
||||
data.pPrivateData = (void *)surface;
|
||||
|
||||
stw_framebuffer_release(fb);
|
||||
|
||||
|
|
@ -559,13 +551,6 @@ stw_framebuffer_present_locked(HDC hdc,
|
|||
}
|
||||
else {
|
||||
struct pipe_screen *screen = stw_dev->screen;
|
||||
struct pipe_surface *surface;
|
||||
|
||||
if(!st_get_framebuffer_surface( fb->stfb, surface_index, &surface )) {
|
||||
/* FIXME: this shouldn't happen, but does on glean */
|
||||
stw_framebuffer_release(fb);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
if(stw_dev->trace_running) {
|
||||
|
|
@ -590,6 +575,7 @@ DrvSwapBuffers(
|
|||
HDC hdc )
|
||||
{
|
||||
struct stw_framebuffer *fb;
|
||||
struct pipe_surface *surface = NULL;
|
||||
|
||||
fb = stw_framebuffer_from_hdc( hdc );
|
||||
if (fb == NULL)
|
||||
|
|
@ -600,12 +586,9 @@ DrvSwapBuffers(
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* If we're swapping the buffer associated with the current context
|
||||
* we have to flush any pending rendering commands first.
|
||||
*/
|
||||
st_notify_swapbuffers( fb->stfb );
|
||||
st_swapbuffers(fb->stfb, &surface, NULL);
|
||||
|
||||
return stw_framebuffer_present_locked(hdc, fb, ST_SURFACE_BACK_LEFT);
|
||||
return stw_framebuffer_present_locked(hdc, fb, surface);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
|
||||
#include "pipe/p_thread.h"
|
||||
|
||||
struct pipe_surface;
|
||||
struct stw_pixelformat_info;
|
||||
|
||||
/**
|
||||
|
|
@ -140,7 +141,7 @@ stw_framebuffer_allocate(
|
|||
BOOL
|
||||
stw_framebuffer_present_locked(HDC hdc,
|
||||
struct stw_framebuffer *fb,
|
||||
unsigned surface_index);
|
||||
struct pipe_surface *surface);
|
||||
|
||||
void
|
||||
stw_framebuffer_update(
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue