glx: don't leak driConfigs
For dri, dri2 and driswrast. 12,968 (584 direct, 12,384 indirect) bytes in 1 blocks are definitely lost in loss record 569 of 570 at 0x4C2779D: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x7821E3B: driConcatConfigs (utils.c:560) by 0x7827CF2: dri_fill_in_modes (dri_screen.c:224) by 0x782831E: dri_init_screen_helper (dri_screen.c:405) by 0x7826C03: drisw_init_screen (drisw.c:266) by 0x782225F: driCreateNewScreen (drisw_util.c:69) by 0x4826E2: __glXDRIscreenProbe (glxdriswrast.c:451) by 0x4812FA: GlxExtensionInit (glxext.c:327) by 0x41FB14: InitExtensions (miinitext.c:471) by 0x568622: main (main.c:208) Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
This commit is contained in:
parent
d26fae246d
commit
0ae087e131
15
glx/glxdri.c
15
glx/glxdri.c
|
@ -78,6 +78,7 @@ struct __GLXDRIscreen {
|
||||||
const __DRIlegacyExtension *legacy;
|
const __DRIlegacyExtension *legacy;
|
||||||
const __DRIcopySubBufferExtension *copySubBuffer;
|
const __DRIcopySubBufferExtension *copySubBuffer;
|
||||||
const __DRIswapControlExtension *swapControl;
|
const __DRIswapControlExtension *swapControl;
|
||||||
|
const __DRIconfig **driConfigs;
|
||||||
|
|
||||||
#ifdef __DRI_TEX_OFFSET
|
#ifdef __DRI_TEX_OFFSET
|
||||||
const __DRItexOffsetExtension *texOffset;
|
const __DRItexOffsetExtension *texOffset;
|
||||||
|
@ -585,6 +586,8 @@ static __GLXtextureFromPixmap __glXDRItextureFromPixmap = {
|
||||||
static void
|
static void
|
||||||
__glXDRIscreenDestroy(__GLXscreen *baseScreen)
|
__glXDRIscreenDestroy(__GLXscreen *baseScreen)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
__GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
|
__GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
|
||||||
|
|
||||||
screen->core->destroyScreen(screen->driScreen);
|
screen->core->destroyScreen(screen->driScreen);
|
||||||
|
@ -593,6 +596,12 @@ __glXDRIscreenDestroy(__GLXscreen *baseScreen)
|
||||||
|
|
||||||
__glXScreenDestroy(baseScreen);
|
__glXScreenDestroy(baseScreen);
|
||||||
|
|
||||||
|
if (screen->driConfigs) {
|
||||||
|
for (i = 0; screen->driConfigs[i] != NULL; i++)
|
||||||
|
free((__DRIconfig **)screen->driConfigs[i]);
|
||||||
|
free(screen->driConfigs);
|
||||||
|
}
|
||||||
|
|
||||||
free(screen);
|
free(screen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -967,7 +976,6 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
|
||||||
Bool isCapable;
|
Bool isCapable;
|
||||||
size_t buffer_size;
|
size_t buffer_size;
|
||||||
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
||||||
const __DRIconfig **driConfigs;
|
|
||||||
|
|
||||||
if (!xf86LoaderCheckSymbol("DRIQueryDirectRenderingCapable") ||
|
if (!xf86LoaderCheckSymbol("DRIQueryDirectRenderingCapable") ||
|
||||||
!DRIQueryDirectRenderingCapable(pScreen, &isCapable) ||
|
!DRIQueryDirectRenderingCapable(pScreen, &isCapable) ||
|
||||||
|
@ -1095,7 +1103,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
|
||||||
pSAREA,
|
pSAREA,
|
||||||
fd,
|
fd,
|
||||||
loader_extensions,
|
loader_extensions,
|
||||||
&driConfigs,
|
&screen->driConfigs,
|
||||||
screen);
|
screen);
|
||||||
|
|
||||||
if (screen->driScreen == NULL) {
|
if (screen->driScreen == NULL) {
|
||||||
|
@ -1105,7 +1113,8 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
|
||||||
}
|
}
|
||||||
|
|
||||||
screen->base.fbconfigs = glxConvertConfigs(screen->core,
|
screen->base.fbconfigs = glxConvertConfigs(screen->core,
|
||||||
driConfigs, GLX_WINDOW_BIT);
|
screen->driConfigs,
|
||||||
|
GLX_WINDOW_BIT);
|
||||||
|
|
||||||
initializeExtensions(screen);
|
initializeExtensions(screen);
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,7 @@ struct __GLXDRIscreen {
|
||||||
const __DRIcopySubBufferExtension *copySubBuffer;
|
const __DRIcopySubBufferExtension *copySubBuffer;
|
||||||
const __DRIswapControlExtension *swapControl;
|
const __DRIswapControlExtension *swapControl;
|
||||||
const __DRItexBufferExtension *texBuffer;
|
const __DRItexBufferExtension *texBuffer;
|
||||||
|
const __DRIconfig **driConfigs;
|
||||||
|
|
||||||
unsigned char glx_enable_bits[__GLX_EXT_BYTES];
|
unsigned char glx_enable_bits[__GLX_EXT_BYTES];
|
||||||
};
|
};
|
||||||
|
@ -363,6 +364,8 @@ static __GLXtextureFromPixmap __glXDRItextureFromPixmap = {
|
||||||
static void
|
static void
|
||||||
__glXDRIscreenDestroy(__GLXscreen *baseScreen)
|
__glXDRIscreenDestroy(__GLXscreen *baseScreen)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
__GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
|
__GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
|
||||||
|
|
||||||
(*screen->core->destroyScreen)(screen->driScreen);
|
(*screen->core->destroyScreen)(screen->driScreen);
|
||||||
|
@ -371,6 +374,12 @@ __glXDRIscreenDestroy(__GLXscreen *baseScreen)
|
||||||
|
|
||||||
__glXScreenDestroy(baseScreen);
|
__glXScreenDestroy(baseScreen);
|
||||||
|
|
||||||
|
if (screen->driConfigs) {
|
||||||
|
for (i = 0; screen->driConfigs[i] != NULL; i++)
|
||||||
|
free((__DRIconfig **)screen->driConfigs[i]);
|
||||||
|
free(screen->driConfigs);
|
||||||
|
}
|
||||||
|
|
||||||
free(screen);
|
free(screen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -688,7 +697,6 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
|
||||||
__GLXDRIscreen *screen;
|
__GLXDRIscreen *screen;
|
||||||
size_t buffer_size;
|
size_t buffer_size;
|
||||||
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
||||||
const __DRIconfig **driConfigs;
|
|
||||||
|
|
||||||
screen = calloc(1, sizeof *screen);
|
screen = calloc(1, sizeof *screen);
|
||||||
if (screen == NULL)
|
if (screen == NULL)
|
||||||
|
@ -720,7 +728,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
|
||||||
(*screen->dri2->createNewScreen)(pScreen->myNum,
|
(*screen->dri2->createNewScreen)(pScreen->myNum,
|
||||||
screen->fd,
|
screen->fd,
|
||||||
loader_extensions,
|
loader_extensions,
|
||||||
&driConfigs,
|
&screen->driConfigs,
|
||||||
screen);
|
screen);
|
||||||
|
|
||||||
if (screen->driScreen == NULL) {
|
if (screen->driScreen == NULL) {
|
||||||
|
@ -731,7 +739,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
|
||||||
|
|
||||||
initializeExtensions(screen);
|
initializeExtensions(screen);
|
||||||
|
|
||||||
screen->base.fbconfigs = glxConvertConfigs(screen->core, driConfigs,
|
screen->base.fbconfigs = glxConvertConfigs(screen->core, screen->driConfigs,
|
||||||
GLX_WINDOW_BIT |
|
GLX_WINDOW_BIT |
|
||||||
GLX_PIXMAP_BIT |
|
GLX_PIXMAP_BIT |
|
||||||
GLX_PBUFFER_BIT);
|
GLX_PBUFFER_BIT);
|
||||||
|
|
|
@ -74,6 +74,7 @@ struct __GLXDRIscreen {
|
||||||
const __DRIswrastExtension *swrast;
|
const __DRIswrastExtension *swrast;
|
||||||
const __DRIcopySubBufferExtension *copySubBuffer;
|
const __DRIcopySubBufferExtension *copySubBuffer;
|
||||||
const __DRItexBufferExtension *texBuffer;
|
const __DRItexBufferExtension *texBuffer;
|
||||||
|
const __DRIconfig **driConfigs;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct __GLXDRIcontext {
|
struct __GLXDRIcontext {
|
||||||
|
@ -240,6 +241,8 @@ static __GLXtextureFromPixmap __glXDRItextureFromPixmap = {
|
||||||
static void
|
static void
|
||||||
__glXDRIscreenDestroy(__GLXscreen *baseScreen)
|
__glXDRIscreenDestroy(__GLXscreen *baseScreen)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
__GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
|
__GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
|
||||||
|
|
||||||
(*screen->core->destroyScreen)(screen->driScreen);
|
(*screen->core->destroyScreen)(screen->driScreen);
|
||||||
|
@ -248,6 +251,12 @@ __glXDRIscreenDestroy(__GLXscreen *baseScreen)
|
||||||
|
|
||||||
__glXScreenDestroy(baseScreen);
|
__glXScreenDestroy(baseScreen);
|
||||||
|
|
||||||
|
if (screen->driConfigs) {
|
||||||
|
for (i = 0; screen->driConfigs[i] != NULL; i++)
|
||||||
|
free((__DRIconfig **)screen->driConfigs[i]);
|
||||||
|
free(screen->driConfigs);
|
||||||
|
}
|
||||||
|
|
||||||
free(screen);
|
free(screen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -426,7 +435,6 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
const char *driverName = "swrast";
|
const char *driverName = "swrast";
|
||||||
__GLXDRIscreen *screen;
|
__GLXDRIscreen *screen;
|
||||||
const __DRIconfig **driConfigs;
|
|
||||||
|
|
||||||
screen = calloc(1, sizeof *screen);
|
screen = calloc(1, sizeof *screen);
|
||||||
if (screen == NULL)
|
if (screen == NULL)
|
||||||
|
@ -450,7 +458,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
|
||||||
screen->driScreen =
|
screen->driScreen =
|
||||||
(*screen->swrast->createNewScreen)(pScreen->myNum,
|
(*screen->swrast->createNewScreen)(pScreen->myNum,
|
||||||
loader_extensions,
|
loader_extensions,
|
||||||
&driConfigs,
|
&screen->driConfigs,
|
||||||
screen);
|
screen);
|
||||||
|
|
||||||
if (screen->driScreen == NULL) {
|
if (screen->driScreen == NULL) {
|
||||||
|
@ -461,7 +469,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
|
||||||
|
|
||||||
initializeExtensions(screen);
|
initializeExtensions(screen);
|
||||||
|
|
||||||
screen->base.fbconfigs = glxConvertConfigs(screen->core, driConfigs,
|
screen->base.fbconfigs = glxConvertConfigs(screen->core, screen->driConfigs,
|
||||||
GLX_WINDOW_BIT |
|
GLX_WINDOW_BIT |
|
||||||
GLX_PIXMAP_BIT |
|
GLX_PIXMAP_BIT |
|
||||||
GLX_PBUFFER_BIT);
|
GLX_PBUFFER_BIT);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user