wgl: Store the fbconfig id with the window when a pixel format is set.

This commit is contained in:
Chris Robinson 2007-09-15 13:02:32 -07:00 committed by Alexandre Julliard
parent 09c76ffbdc
commit d9571c9e6f
7 changed files with 110 additions and 1 deletions

View File

@ -294,6 +294,29 @@ static void test_make_current_read(HDC hdc)
ok(hread == hdc, "wglGetCurrentReadDCARB failed for wglMakeContextCurrent\n");
}
static void test_dc(HWND hwnd, HDC hdc)
{
int pf1, pf2;
HDC hdc2;
/* Get another DC and make sure it has the same pixel format */
hdc2 = GetDC(hwnd);
if(hdc != hdc2)
{
pf1 = GetPixelFormat(hdc);
pf2 = GetPixelFormat(hdc2);
ok(pf1 == pf2, "Second DC does not have the same format (%d != %d)\n", pf1, pf2);
}
else
skip("Could not get a different DC for the window\n");
if(hdc2)
{
ReleaseDC(hwnd, hdc2);
hdc2 = NULL;
}
}
START_TEST(opengl)
{
HWND hwnd;
@ -336,6 +359,8 @@ START_TEST(opengl)
res = SetPixelFormat(hdc, iPixelFormat, &pfd);
ok(res, "SetPixelformat failed: %x\n", GetLastError());
test_dc(hwnd, hdc);
hglrc = wglCreateContext(hdc);
res = wglMakeCurrent(hdc, hglrc);
ok(res, "wglMakeCurrent failed!\n");

View File

@ -148,9 +148,15 @@ static void update_visible_region( struct dce *dce )
if (top == dce->hwnd && ((data = X11DRV_get_win_data( dce->hwnd )) != NULL) &&
IsIconic( dce->hwnd ) && data->icon_window)
{
escape.drawable = data->icon_window;
escape.fbconfig_id = 0;
}
else
{
escape.drawable = X11DRV_get_whole_window( top );
escape.fbconfig_id = X11DRV_get_fbconfig_id( dce->hwnd );
}
escape.code = X11DRV_SET_DRAWABLE;
escape.mode = IncludeInferiors;
@ -185,6 +191,7 @@ static void release_dce( struct dce *dce )
escape.drawable_rect = virtual_screen_rect;
SetRect( &escape.dc_rect, 0, 0, virtual_screen_rect.right - virtual_screen_rect.left,
virtual_screen_rect.bottom - virtual_screen_rect.top );
escape.fbconfig_id = 0;
ExtEscape( dce->hdc, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, 0, NULL );
}

View File

@ -958,6 +958,8 @@ LRESULT X11DRV_WindowMessage( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
return X11DRV_AcquireClipboard( hwnd );
case WM_X11DRV_DELETE_WINDOW:
return SendMessageW( hwnd, WM_SYSCOMMAND, SC_CLOSE, 0 );
case WM_X11DRV_SET_WIN_FORMAT:
return X11DRV_set_win_format( hwnd, (XID)wp );
default:
FIXME( "got window msg %x hwnd %p wp %lx lp %lx\n", msg, hwnd, wp, lp );
return 0;

View File

@ -340,6 +340,7 @@ INT X11DRV_ExtEscape( X11DRV_PDEVICE *physDev, INT escape, INT in_count, LPCVOID
physDev->dc_rect = data->dc_rect;
physDev->drawable = data->drawable;
physDev->drawable_rect = data->drawable_rect;
physDev->current_pf = pixelformat_from_fbconfig_id( data->fbconfig_id );
wine_tsx11_lock();
XSetSubwindowMode( gdi_display, physDev->gc, data->mode );
wine_tsx11_unlock();

View File

@ -935,6 +935,20 @@ static WineGLPixelFormat* ConvertPixelFormatGLXtoWGL(Display *display, int fmt_i
return NULL;
}
int pixelformat_from_fbconfig_id(XID fbconfig_id)
{
WineGLPixelFormat *fmt;
if (!fbconfig_id) return 0;
fmt = ConvertPixelFormatGLXtoWGL(gdi_display, fbconfig_id);
if(fmt)
return fmt->iPixelFormat;
/* This will happen on hwnds without a pixel format set; it's ok */
return 0;
}
/**
* X11DRV_ChoosePixelFormat
*
@ -1349,6 +1363,7 @@ BOOL X11DRV_SetPixelFormat(X11DRV_PDEVICE *physDev,
const PIXELFORMATDESCRIPTOR *ppfd) {
WineGLPixelFormat *fmt;
int value;
HWND hwnd;
TRACE("(%p,%d,%p)\n", physDev, iPixelFormat, ppfd);
@ -1371,6 +1386,21 @@ BOOL X11DRV_SetPixelFormat(X11DRV_PDEVICE *physDev,
return 0;
}
pglXGetFBConfigAttrib(gdi_display, fmt->fbconfig, GLX_DRAWABLE_TYPE, &value);
hwnd = WindowFromDC(physDev->hdc);
if(hwnd) {
if(!(value&GLX_WINDOW_BIT)) {
WARN("Pixel format %d is not compatible for window rendering\n", iPixelFormat);
return 0;
}
if(!SendMessageW(hwnd, WM_X11DRV_SET_WIN_FORMAT, (WPARAM)fmt->fmt_id, 0)) {
ERR("Couldn't set format of the window, returning failure\n");
return 0;
}
}
physDev->current_pf = iPixelFormat;
if (TRACE_ON(opengl)) {
@ -3345,6 +3375,11 @@ XVisualInfo *X11DRV_setup_opengl_visual( Display *display )
#else /* no OpenGL includes */
int pixelformat_from_fbconfig_id(XID fbconfig_id)
{
return 0;
}
/***********************************************************************
* ChoosePixelFormat (X11DRV.@)
*/

View File

@ -55,6 +55,7 @@ static XContext win_data_context;
static const char whole_window_prop[] = "__wine_x11_whole_window";
static const char icon_window_prop[] = "__wine_x11_icon_window";
static const char fbconfig_id_prop[] = "__wine_x11_fbconfig_id";
static const char managed_prop[] = "__wine_x11_managed";
static const char visual_id_prop[] = "__wine_x11_visual_id";
@ -165,6 +166,21 @@ void X11DRV_sync_window_style( Display *display, struct x11drv_win_data *data )
}
/***********************************************************************
* X11DRV_set_win_format
*/
BOOL X11DRV_set_win_format( HWND hwnd, XID fbconfig_id )
{
struct x11drv_win_data *data;
if (!(data = X11DRV_get_win_data(hwnd))) return FALSE;
data->fbconfig_id = fbconfig_id;
SetPropA(hwnd, fbconfig_id_prop, (HANDLE)data->fbconfig_id);
return TRUE;
}
/***********************************************************************
* get_window_changes
*
@ -937,6 +953,7 @@ static struct x11drv_win_data *alloc_win_data( Display *display, HWND hwnd )
data->hwnd = hwnd;
data->whole_window = 0;
data->icon_window = 0;
data->fbconfig_id = 0;
data->xic = 0;
data->managed = FALSE;
data->dce = NULL;
@ -1228,6 +1245,21 @@ Window X11DRV_get_whole_window( HWND hwnd )
}
/***********************************************************************
* X11DRV_get_fbconfig_id
*
* Return the GLXFBConfig ID of the drawable used by the window for
* OpenGL rendering. This is 0 for windows without a pixel format set.
*/
XID X11DRV_get_fbconfig_id( HWND hwnd )
{
struct x11drv_win_data *data = X11DRV_get_win_data( hwnd );
if (!data) return (XID)GetPropA( hwnd, fbconfig_id_prop );
return data->fbconfig_id;
}
/***********************************************************************
* X11DRV_get_ic
*

View File

@ -485,6 +485,7 @@ struct x11drv_escape_set_drawable
int mode; /* ClipByChildren or IncludeInferiors */
RECT dc_rect; /* DC rectangle relative to drawable */
RECT drawable_rect;/* Drawable rectangle relative to screen */
XID fbconfig_id; /* fbconfig id used by the GL drawable */
};
struct x11drv_escape_set_dce
@ -633,7 +634,8 @@ extern DWORD EVENT_x11_time_to_win32_time(Time time);
enum x11drv_window_messages
{
WM_X11DRV_ACQUIRE_SELECTION = 0x80001000,
WM_X11DRV_DELETE_WINDOW
WM_X11DRV_DELETE_WINDOW,
WM_X11DRV_SET_WIN_FORMAT
};
/* x11drv private window data */
@ -642,6 +644,7 @@ struct x11drv_win_data
HWND hwnd; /* hwnd that this private data belongs to */
Window whole_window; /* X window for the complete window */
Window icon_window; /* X window for the icon */
XID fbconfig_id; /* fbconfig id for the GL drawable this hwnd uses */
RECT window_rect; /* USER window rectangle relative to parent */
RECT whole_rect; /* X window rectangle for the whole window relative to parent */
RECT client_rect; /* client area relative to whole window */
@ -656,8 +659,12 @@ struct x11drv_win_data
extern struct x11drv_win_data *X11DRV_get_win_data( HWND hwnd );
extern Window X11DRV_get_whole_window( HWND hwnd );
extern XID X11DRV_get_fbconfig_id( HWND hwnd );
extern BOOL X11DRV_is_window_rect_mapped( const RECT *rect );
extern XIC X11DRV_get_ic( HWND hwnd );
extern BOOL X11DRV_set_win_format( HWND hwnd, XID fbconfig );
extern int pixelformat_from_fbconfig_id( XID fbconfig_id );
extern void alloc_window_dce( struct x11drv_win_data *data );
extern void free_window_dce( struct x11drv_win_data *data );