wgl: Fill the format table with offscreen pixelformats which are needed for pbuffers.
This commit is contained in:
parent
1f5a4a8046
commit
cfd81827ac
|
@ -131,6 +131,7 @@ typedef struct wine_glpixelformat {
|
||||||
int iPixelFormat;
|
int iPixelFormat;
|
||||||
int fbconfig;
|
int fbconfig;
|
||||||
int fmt_index;
|
int fmt_index;
|
||||||
|
BOOL offscreenOnly;
|
||||||
} WineGLPixelFormat;
|
} WineGLPixelFormat;
|
||||||
|
|
||||||
static Wine_GLContext *context_list;
|
static Wine_GLContext *context_list;
|
||||||
|
@ -143,8 +144,7 @@ static int swap_interval = 1;
|
||||||
static const WineGLExtension *WineGLExtensionList[MAX_EXTENSIONS];
|
static const WineGLExtension *WineGLExtensionList[MAX_EXTENSIONS];
|
||||||
static int WineGLExtensionListSize;
|
static int WineGLExtensionListSize;
|
||||||
|
|
||||||
#define MAX_GLPIXELFORMATS 32
|
static WineGLPixelFormat *WineGLPixelFormatList;
|
||||||
static WineGLPixelFormat WineGLPixelFormatList[MAX_GLPIXELFORMATS];
|
|
||||||
static int WineGLPixelFormatListSize = 0;
|
static int WineGLPixelFormatListSize = 0;
|
||||||
|
|
||||||
static void X11DRV_WineGL_LoadExtensions(void);
|
static void X11DRV_WineGL_LoadExtensions(void);
|
||||||
|
@ -863,6 +863,9 @@ static BOOL get_fbconfig_from_visualid(Display *display, Visual *visual, int *fm
|
||||||
static BOOL init_formats(Display *display, int screen, Visual *visual)
|
static BOOL init_formats(Display *display, int screen, Visual *visual)
|
||||||
{
|
{
|
||||||
int fmt_id, fmt_index;
|
int fmt_id, fmt_index;
|
||||||
|
int tmp_vis_id, tmp_fmt_id, nCfgs, i;
|
||||||
|
GLXFBConfig* cfgs = NULL;
|
||||||
|
int nOffscreenFormats = 0;
|
||||||
|
|
||||||
/* Locate the fbconfig correspondig to our main visual */
|
/* Locate the fbconfig correspondig to our main visual */
|
||||||
if(!get_fbconfig_from_visualid(display, visual, &fmt_id, &fmt_index)) {
|
if(!get_fbconfig_from_visualid(display, visual, &fmt_id, &fmt_index)) {
|
||||||
|
@ -870,13 +873,61 @@ static BOOL init_formats(Display *display, int screen, Visual *visual)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Put Wine's internal format at the first index */
|
/* As mentioned in various parts of the code only the format of the main visual can be used for onscreen rendering.
|
||||||
WineGLPixelFormatList[0].iPixelFormat = 1;
|
* Next to this format there are also so called offscreen rendering formats (used for pbuffers) which can be supported
|
||||||
WineGLPixelFormatList[0].fbconfig = fmt_id;
|
* because they don't need a visual. Below we use glXGetFBConfigs instead of glXChooseFBConfig to enumerate the fb configurations
|
||||||
WineGLPixelFormatList[0].fmt_index = fmt_index;
|
* because this call lists both types of formats instead of only onscreen ones. */
|
||||||
WineGLPixelFormatListSize = 1;
|
cfgs = pglXGetFBConfigs(display, DefaultScreen(display), &nCfgs);
|
||||||
|
if (NULL == cfgs || 0 == nCfgs) {
|
||||||
|
WARN("glXChooseFBConfig returns NULL\n");
|
||||||
|
if(cfgs != NULL) XFree(cfgs);
|
||||||
|
|
||||||
/* In the future test for compatible formats here */
|
/* We only have the single format of Wine's main visual */
|
||||||
|
WineGLPixelFormatList = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WineGLPixelFormat));
|
||||||
|
WineGLPixelFormatList[0].iPixelFormat = 1;
|
||||||
|
WineGLPixelFormatList[0].fbconfig = fmt_id;
|
||||||
|
WineGLPixelFormatList[0].fmt_index = fmt_index;
|
||||||
|
WineGLPixelFormatList[0].offscreenOnly = FALSE;
|
||||||
|
WineGLPixelFormatListSize = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Count the number of offscreen formats to determine the size for our pixelformat list */
|
||||||
|
for(i=0; i<nCfgs; i++) {
|
||||||
|
pglXGetFBConfigAttrib(display, cfgs[i], GLX_VISUAL_ID, &tmp_vis_id);
|
||||||
|
|
||||||
|
/* We have found an offscreen rendering format :) */
|
||||||
|
if(tmp_vis_id == 0) {
|
||||||
|
nOffscreenFormats++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TRACE("Number of offscreen formats: %d\n", nOffscreenFormats);
|
||||||
|
|
||||||
|
/* Allocate memory for all the offscreen pixelformats and the format of Wine's main visual */
|
||||||
|
WineGLPixelFormatList = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (1+nOffscreenFormats)*sizeof(WineGLPixelFormat));
|
||||||
|
WineGLPixelFormatList[0].iPixelFormat = 1;
|
||||||
|
WineGLPixelFormatList[0].fbconfig = fmt_id;
|
||||||
|
WineGLPixelFormatList[0].fmt_index = fmt_index;
|
||||||
|
WineGLPixelFormatList[0].offscreenOnly = FALSE;
|
||||||
|
WineGLPixelFormatListSize = 1;
|
||||||
|
|
||||||
|
/* Fill the list with offscreen formats */
|
||||||
|
for(i=0; i<nCfgs; i++) {
|
||||||
|
pglXGetFBConfigAttrib(display, cfgs[i], GLX_VISUAL_ID, &tmp_vis_id);
|
||||||
|
pglXGetFBConfigAttrib(display, cfgs[i], GLX_FBCONFIG_ID, &tmp_fmt_id);
|
||||||
|
|
||||||
|
/* We have found an offscreen rendering format :) */
|
||||||
|
if(tmp_vis_id == 0) {
|
||||||
|
TRACE("Found offscreen format FBCONFIG_ID 0x%x corresponding to iPixelFormat %d at GLX index %d\n", tmp_fmt_id, WineGLPixelFormatListSize, i);
|
||||||
|
WineGLPixelFormatList[WineGLPixelFormatListSize].iPixelFormat = WineGLPixelFormatListSize;
|
||||||
|
WineGLPixelFormatList[WineGLPixelFormatListSize].fbconfig = tmp_fmt_id;
|
||||||
|
WineGLPixelFormatList[WineGLPixelFormatListSize].fmt_index = i;
|
||||||
|
WineGLPixelFormatList[0].offscreenOnly = TRUE;
|
||||||
|
WineGLPixelFormatListSize++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cfgs != NULL) XFree(cfgs);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -887,9 +938,9 @@ static BOOL init_formats(Display *display, int screen, Visual *visual)
|
||||||
* This function converts a WGL format to its corresponding GLX one. It returns the index (zero-based)
|
* This function converts a WGL format to its corresponding GLX one. It returns the index (zero-based)
|
||||||
* into the GLX FB config table and it returns the number of supported WGL formats in fmt_count.
|
* into the GLX FB config table and it returns the number of supported WGL formats in fmt_count.
|
||||||
*/
|
*/
|
||||||
static BOOL ConvertPixelFormatWGLtoGLX(Display *display, int iPixelFormat, int *fmt_index, int *fmt_count)
|
static BOOL ConvertPixelFormatWGLtoGLX(Display *display, int iPixelFormat, BOOL AllowOffscreen, int *fmt_index, int *fmt_count)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret = FALSE;
|
||||||
|
|
||||||
/* Init the list of pixel formats when we need it */
|
/* Init the list of pixel formats when we need it */
|
||||||
if(!WineGLPixelFormatListSize)
|
if(!WineGLPixelFormatListSize)
|
||||||
|
@ -899,15 +950,25 @@ static BOOL ConvertPixelFormatWGLtoGLX(Display *display, int iPixelFormat, int *
|
||||||
ERR("invalid iPixelFormat %d\n", iPixelFormat);
|
ERR("invalid iPixelFormat %d\n", iPixelFormat);
|
||||||
ret = FALSE;
|
ret = FALSE;
|
||||||
*fmt_index = -1;
|
*fmt_index = -1;
|
||||||
|
|
||||||
|
if(AllowOffscreen)
|
||||||
|
*fmt_count = WineGLPixelFormatListSize;
|
||||||
|
else
|
||||||
|
*fmt_count = 1; /* Only show the format of our main visual */
|
||||||
}
|
}
|
||||||
else {
|
else if(iPixelFormat == 1) {
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
*fmt_index = WineGLPixelFormatList[iPixelFormat-1].fmt_index;
|
*fmt_index = WineGLPixelFormatList[0].fmt_index;
|
||||||
|
*fmt_count = 1; /* Only show the format of our main visual */
|
||||||
|
}
|
||||||
|
/* Limit the use of offscreen formats to WGL extension calls which pass AllowOffscreen = TRUE */
|
||||||
|
else if((WineGLPixelFormatList[iPixelFormat-1].offscreenOnly == TRUE) && AllowOffscreen) {
|
||||||
|
ret = TRUE;
|
||||||
|
*fmt_count = WineGLPixelFormatListSize;
|
||||||
|
TRACE("Returning FBConfig_ID=%x for iPixelFormat=%d\n", WineGLPixelFormatList[iPixelFormat-1].fbconfig, iPixelFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
*fmt_count = WineGLPixelFormatListSize;
|
TRACE("Number of returned pixelformats=%d\n", *fmt_count);
|
||||||
TRACE("Returning fmt_index=%d, fmt_count=%d for iPixelFormat=%d\n", *fmt_index, *fmt_count, iPixelFormat);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -968,7 +1029,7 @@ int X11DRV_ChoosePixelFormat(X11DRV_PDEVICE *physDev,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* In case an fbconfig was found, check if it matches to the requirements of the ppfd */
|
/* In case an fbconfig was found, check if it matches to the requirements of the ppfd */
|
||||||
if(!ConvertPixelFormatWGLtoGLX(gdi_display, 1 /* main visual */, &fmt_index, &value)) {
|
if(!ConvertPixelFormatWGLtoGLX(gdi_display, 1 /* main visual */, FALSE /* offscreen */, &fmt_index, &value)) {
|
||||||
ERR("Can't find a matching FBCONFIG_ID for VISUAL_ID 0x%lx!\n", visual->visualid);
|
ERR("Can't find a matching FBCONFIG_ID for VISUAL_ID 0x%lx!\n", visual->visualid);
|
||||||
} else {
|
} else {
|
||||||
int dwFlags = 0;
|
int dwFlags = 0;
|
||||||
|
@ -1085,7 +1146,7 @@ int X11DRV_DescribePixelFormat(X11DRV_PDEVICE *physDev,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Look for the iPixelFormat in our list of supported formats. If it is supported we get the index in the FBConfig table and the number of supported formats back */
|
/* Look for the iPixelFormat in our list of supported formats. If it is supported we get the index in the FBConfig table and the number of supported formats back */
|
||||||
res = ConvertPixelFormatWGLtoGLX(gdi_display, iPixelFormat, &fmt_index, &fmt_count);
|
res = ConvertPixelFormatWGLtoGLX(gdi_display, iPixelFormat, FALSE /* Offscreen */, &fmt_index, &fmt_count);
|
||||||
|
|
||||||
if (ppfd == NULL) {
|
if (ppfd == NULL) {
|
||||||
/* The application is only querying the number of visuals */
|
/* The application is only querying the number of visuals */
|
||||||
|
@ -1220,7 +1281,7 @@ BOOL X11DRV_SetPixelFormat(X11DRV_PDEVICE *physDev,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if iPixelFormat is in our list of supported formats to see if it is supported. */
|
/* Check if iPixelFormat is in our list of supported formats to see if it is supported. */
|
||||||
if(!ConvertPixelFormatWGLtoGLX(gdi_display, iPixelFormat, &fmt_index, &value)) {
|
if(!ConvertPixelFormatWGLtoGLX(gdi_display, iPixelFormat, FALSE /* Offscreen */, &fmt_index, &value)) {
|
||||||
ERR("Invalid iPixelFormat: %d\n", iPixelFormat);
|
ERR("Invalid iPixelFormat: %d\n", iPixelFormat);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1297,7 +1358,7 @@ HGLRC X11DRV_wglCreateContext(X11DRV_PDEVICE *physDev)
|
||||||
|
|
||||||
/* We can only render using the iPixelFormat (1) of Wine's Main visual, we need to get the corresponding GLX format.
|
/* We can only render using the iPixelFormat (1) of Wine's Main visual, we need to get the corresponding GLX format.
|
||||||
* If this fails something is very wrong on the system. */
|
* If this fails something is very wrong on the system. */
|
||||||
if(!ConvertPixelFormatWGLtoGLX(gdi_display, hdcPF, &fmt_index, &fmt_count)) {
|
if(!ConvertPixelFormatWGLtoGLX(gdi_display, hdcPF, FALSE /* Offscreen */, &fmt_index, &fmt_count)) {
|
||||||
ERR("Cannot get FB Config for main iPixelFormat 1, expect problems!\n");
|
ERR("Cannot get FB Config for main iPixelFormat 1, expect problems!\n");
|
||||||
SetLastError(ERROR_INVALID_PIXEL_FORMAT);
|
SetLastError(ERROR_INVALID_PIXEL_FORMAT);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1953,7 +2014,7 @@ static HPBUFFERARB WINAPI X11DRV_wglCreatePbufferARB(HDC hdc, int iPixelFormat,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert the WGL pixelformat to a GLX format, if it fails then the format is invalid */
|
/* Convert the WGL pixelformat to a GLX format, if it fails then the format is invalid */
|
||||||
if(!ConvertPixelFormatWGLtoGLX(gdi_display, iPixelFormat, &fmt_index, &nCfgs)) {
|
if(!ConvertPixelFormatWGLtoGLX(gdi_display, iPixelFormat, FALSE /* Offscreen */, &fmt_index, &nCfgs)) {
|
||||||
ERR("(%p): unexpected iPixelFormat(%d) > nFormats(%d), returns NULL\n", hdc, iPixelFormat, nCfgs);
|
ERR("(%p): unexpected iPixelFormat(%d) > nFormats(%d), returns NULL\n", hdc, iPixelFormat, nCfgs);
|
||||||
SetLastError(ERROR_INVALID_PIXEL_FORMAT);
|
SetLastError(ERROR_INVALID_PIXEL_FORMAT);
|
||||||
goto create_failed; /* unexpected error */
|
goto create_failed; /* unexpected error */
|
||||||
|
@ -2407,7 +2468,7 @@ static GLboolean WINAPI X11DRV_wglGetPixelFormatAttribivARB(HDC hdc, int iPixelF
|
||||||
/* Convert the WGL pixelformat to a GLX one, if this fails then most likely the iPixelFormat isn't supoprted.
|
/* Convert the WGL pixelformat to a GLX one, if this fails then most likely the iPixelFormat isn't supoprted.
|
||||||
* We don't have to fail yet as a program can specify an invaled iPixelFormat (lets say 0) if it wants to query
|
* We don't have to fail yet as a program can specify an invaled iPixelFormat (lets say 0) if it wants to query
|
||||||
* the number of supported WGL formats. Whether the iPixelFormat is valid is handled in the for-loop below. */
|
* the number of supported WGL formats. Whether the iPixelFormat is valid is handled in the for-loop below. */
|
||||||
if(!ConvertPixelFormatWGLtoGLX(gdi_display, iPixelFormat, &fmt_index, &nWGLFormats)) {
|
if(!ConvertPixelFormatWGLtoGLX(gdi_display, iPixelFormat, FALSE /* Offscreen */, &fmt_index, &nWGLFormats)) {
|
||||||
WARN("Unable to convert iPixelFormat %d to a GLX one!\n", iPixelFormat);
|
WARN("Unable to convert iPixelFormat %d to a GLX one!\n", iPixelFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue