hw/xwin/glx: Allocate fbconfigs correctly
4b0a3cba
fixed leaking of GLX fbconfigs, so now xwin needs to allocate them
correctly (individually, rather than all at once), so they can be freed
successfully.
Signed-off-by: Jon Turney <jon.turney@dronecode.org.uk>
Reviewed-by: Colin Harrison <colin.harrison@virgin.net>
This commit is contained in:
parent
e0a137ce5d
commit
b9764b8489
|
@ -1744,7 +1744,7 @@ fbConfigToPixelFormatIndex(HDC hdc, __GLXconfig * mode,
|
||||||
static void
|
static void
|
||||||
glxWinCreateConfigs(HDC hdc, glxWinScreen * screen)
|
glxWinCreateConfigs(HDC hdc, glxWinScreen * screen)
|
||||||
{
|
{
|
||||||
GLXWinConfig *c, *result, *prev = NULL;
|
GLXWinConfig *first = NULL, *prev = NULL;
|
||||||
int numConfigs = 0;
|
int numConfigs = 0;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
@ -1761,22 +1761,16 @@ glxWinCreateConfigs(HDC hdc, glxWinScreen * screen)
|
||||||
LogMessage(X_INFO, "%d pixel formats reported by DescribePixelFormat\n",
|
LogMessage(X_INFO, "%d pixel formats reported by DescribePixelFormat\n",
|
||||||
numConfigs);
|
numConfigs);
|
||||||
|
|
||||||
/* alloc */
|
|
||||||
result = malloc(sizeof(GLXWinConfig) * numConfigs);
|
|
||||||
|
|
||||||
if (NULL == result) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(result, 0, sizeof(GLXWinConfig) * numConfigs);
|
|
||||||
n = 0;
|
n = 0;
|
||||||
|
|
||||||
/* fill in configs */
|
/* fill in configs */
|
||||||
for (i = 0; i < numConfigs; i++) {
|
for (i = 0; i < numConfigs; i++) {
|
||||||
int rc;
|
int rc;
|
||||||
|
GLXWinConfig temp;
|
||||||
|
GLXWinConfig *c = &temp;
|
||||||
|
GLXWinConfig *work;
|
||||||
|
memset(c, 0, sizeof(GLXWinConfig));
|
||||||
|
|
||||||
c = &(result[i]);
|
|
||||||
c->base.next = NULL;
|
|
||||||
c->pixelFormatIndex = i + 1;
|
c->pixelFormatIndex = i + 1;
|
||||||
|
|
||||||
rc = DescribePixelFormat(hdc, i + 1, sizeof(PIXELFORMATDESCRIPTOR),
|
rc = DescribePixelFormat(hdc, i + 1, sizeof(PIXELFORMATDESCRIPTOR),
|
||||||
|
@ -1939,18 +1933,29 @@ glxWinCreateConfigs(HDC hdc, glxWinScreen * screen)
|
||||||
|
|
||||||
n++;
|
n++;
|
||||||
|
|
||||||
|
// allocate and save
|
||||||
|
work = malloc(sizeof(GLXWinConfig));
|
||||||
|
if (NULL == work) {
|
||||||
|
ErrorF("Failed to allocate GLXWinConfig\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*work = temp;
|
||||||
|
|
||||||
|
// note the first config
|
||||||
|
if (!first)
|
||||||
|
first = work;
|
||||||
|
|
||||||
// update previous config to point to this config
|
// update previous config to point to this config
|
||||||
if (prev)
|
if (prev)
|
||||||
prev->base.next = &(c->base);
|
prev->base.next = &(work->base);
|
||||||
|
prev = work;
|
||||||
prev = c;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GLWIN_DEBUG_MSG
|
GLWIN_DEBUG_MSG
|
||||||
("found %d pixelFormats suitable for conversion to fbConfigs", n);
|
("found %d pixelFormats suitable for conversion to fbConfigs", n);
|
||||||
|
|
||||||
screen->base.numFBConfigs = n;
|
screen->base.numFBConfigs = n;
|
||||||
screen->base.fbconfigs = &(result->base);
|
screen->base.fbconfigs = first ? &(first->base) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// helper function to access an attribute value from an attribute value array by attribute
|
// helper function to access an attribute value from an attribute value array by attribute
|
||||||
|
@ -1980,7 +1985,7 @@ getAttrValue(const int attrs[], int values[], unsigned int num, int attr,
|
||||||
static void
|
static void
|
||||||
glxWinCreateConfigsExt(HDC hdc, glxWinScreen * screen)
|
glxWinCreateConfigsExt(HDC hdc, glxWinScreen * screen)
|
||||||
{
|
{
|
||||||
GLXWinConfig *c, *result, *prev = NULL;
|
GLXWinConfig *first = NULL, *prev = NULL;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
|
||||||
|
@ -2006,14 +2011,6 @@ glxWinCreateConfigsExt(HDC hdc, glxWinScreen * screen)
|
||||||
"%d pixel formats reported by wglGetPixelFormatAttribivARB\n",
|
"%d pixel formats reported by wglGetPixelFormatAttribivARB\n",
|
||||||
numConfigs);
|
numConfigs);
|
||||||
|
|
||||||
/* alloc */
|
|
||||||
result = malloc(sizeof(GLXWinConfig) * numConfigs);
|
|
||||||
|
|
||||||
if (NULL == result) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(result, 0, sizeof(GLXWinConfig) * numConfigs);
|
|
||||||
n = 0;
|
n = 0;
|
||||||
|
|
||||||
#define ADD_ATTR(a) { attrs[num_attrs++] = a; assert(num_attrs < ARRAY_SIZE(attrs)); }
|
#define ADD_ATTR(a) { attrs[num_attrs++] = a; assert(num_attrs < ARRAY_SIZE(attrs)); }
|
||||||
|
@ -2074,9 +2071,11 @@ glxWinCreateConfigsExt(HDC hdc, glxWinScreen * screen)
|
||||||
/* fill in configs */
|
/* fill in configs */
|
||||||
for (i = 0; i < numConfigs; i++) {
|
for (i = 0; i < numConfigs; i++) {
|
||||||
int values[num_attrs];
|
int values[num_attrs];
|
||||||
|
GLXWinConfig temp;
|
||||||
|
GLXWinConfig *c = &temp;
|
||||||
|
GLXWinConfig *work;
|
||||||
|
memset(c, 0, sizeof(GLXWinConfig));
|
||||||
|
|
||||||
c = &(result[i]);
|
|
||||||
c->base.next = NULL;
|
|
||||||
c->pixelFormatIndex = i + 1;
|
c->pixelFormatIndex = i + 1;
|
||||||
|
|
||||||
if (!wglGetPixelFormatAttribivARBWrapper
|
if (!wglGetPixelFormatAttribivARBWrapper
|
||||||
|
@ -2329,13 +2328,24 @@ glxWinCreateConfigsExt(HDC hdc, glxWinScreen * screen)
|
||||||
|
|
||||||
n++;
|
n++;
|
||||||
|
|
||||||
|
// allocate and save
|
||||||
|
work = malloc(sizeof(GLXWinConfig));
|
||||||
|
if (NULL == work) {
|
||||||
|
ErrorF("Failed to allocate GLXWinConfig\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*work = temp;
|
||||||
|
|
||||||
|
// note the first config
|
||||||
|
if (!first)
|
||||||
|
first = work;
|
||||||
|
|
||||||
// update previous config to point to this config
|
// update previous config to point to this config
|
||||||
if (prev)
|
if (prev)
|
||||||
prev->base.next = &(c->base);
|
prev->base.next = &(work->base);
|
||||||
|
prev = work;
|
||||||
prev = c;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
screen->base.numFBConfigs = n;
|
screen->base.numFBConfigs = n;
|
||||||
screen->base.fbconfigs = &(result->base);
|
screen->base.fbconfigs = first ? &(first->base) : NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue