xf86-video-intel: 2 commits - src/i830_driver.c src/i965_render.c
Kristian Høgsberg
krh at kemper.freedesktop.org
Wed Mar 4 14:35:57 PST 2009
src/i830_driver.c | 16 ++++++++++++++++
src/i965_render.c | 17 ++++++++++++++---
2 files changed, 30 insertions(+), 3 deletions(-)
New commits:
commit d4c64f01b9429a8fb314e43f40d1f02bb8aab30f
Author: Lukas Hejtmanek <xhejtman at ics.muni.cz>
Date: Wed Mar 4 17:33:27 2009 -0500
Fix serious memory leak at Enter/LeaveVT
This fixes huge memory leak at each VT switch (about 600 BOs + 6MB
of RSS of Xserver).
diff --git a/src/i965_render.c b/src/i965_render.c
index de1c8b3..ab7f7d2 100644
--- a/src/i965_render.c
+++ b/src/i965_render.c
@@ -1715,7 +1715,7 @@ gen4_render_state_cleanup(ScrnInfoPtr pScrn)
{
I830Ptr pI830 = I830PTR(pScrn);
struct gen4_render_state *render_state= pI830->gen4_render_state;
- int i;
+ int i, j, k, l, m;
if (render_state->vertex_buffer_bo) {
dri_bo_unreference (render_state->vertex_buffer_bo);
@@ -1728,12 +1728,23 @@ gen4_render_state_cleanup(ScrnInfoPtr pScrn)
render_state->sf_state_bo = NULL;
drm_intel_bo_unreference(render_state->sf_mask_state_bo);
render_state->sf_mask_state_bo = NULL;
- drm_intel_bo_unreference(render_state->cc_state_bo);
- render_state->cc_state_bo = NULL;
+
for (i = 0; i < WM_KERNEL_COUNT; i++) {
drm_intel_bo_unreference(render_state->wm_kernel_bo[i]);
render_state->wm_kernel_bo[i] = NULL;
}
+
+ for (i = 0; i < SAMPLER_STATE_FILTER_COUNT; i++)
+ for (j = 0; j < SAMPLER_STATE_EXTEND_COUNT; j++)
+ for (k = 0; k < SAMPLER_STATE_FILTER_COUNT; k++)
+ for (l = 0; l < SAMPLER_STATE_EXTEND_COUNT; l++)
+ for (m = 0; m < WM_KERNEL_COUNT; m++) {
+ drm_intel_bo_unreference(render_state->wm_state_bo[m][i][j][k][l]);
+ render_state->wm_state_bo[m][i][j][k][l] = NULL;
+ }
+
+ drm_intel_bo_unreference(render_state->cc_state_bo);
+ render_state->cc_state_bo = NULL;
drm_intel_bo_unreference(render_state->sip_kernel_bo);
render_state->sip_kernel_bo = NULL;
}
commit 095a001f755201d3c19335b67a84c57b1d080a83
Author: Kristian Høgsberg <krh at redhat.com>
Date: Wed Mar 4 17:10:24 2009 -0500
Use drmSetMaster() and drmDropMaster() in enter/leave VT
This allows multiple X server to use DRI and makes it possible to run
multiple X servers under KMS. This requires a 2.6.29 kernel to work.
On older kernels it will just log a warning and DRI will fail to
initialize for the second X server.
diff --git a/src/i830_driver.c b/src/i830_driver.c
index 342a059..f80ca69 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -3536,6 +3536,7 @@ I830LeaveVT(int scrnIndex, int flags)
{
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
I830Ptr pI830 = I830PTR(pScrn);
+ int ret;
#ifndef HAVE_FREE_SHADOW
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
int o;
@@ -3629,6 +3630,13 @@ I830LeaveVT(int scrnIndex, int flags)
if (pI830->AccelInfoRec)
pI830->AccelInfoRec->NeedToSync = FALSE;
+
+#ifdef XF86DRI
+ ret = drmDropMaster(pI830->drmSubFD);
+ if (ret)
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "drmDropMaster failed: %s\n", strerror(ret));
+#endif
}
/*
@@ -3639,9 +3647,17 @@ I830EnterVT(int scrnIndex, int flags)
{
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
I830Ptr pI830 = I830PTR(pScrn);
+ int ret;
DPRINTF(PFX, "Enter VT\n");
+#ifdef XF86DRI
+ ret = drmSetMaster(pI830->drmSubFD);
+ if (ret)
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "drmDropMaster failed: %s\n", strerror(ret));
+#endif
+
/*
* Only save state once per server generation since that's what most
* drivers do. Could change this to save state at each VT enter.
More information about the xorg-commit
mailing list