nouveau: fix scratch buffer leak
authorMarcin Slusarz <marcin.slusarz@gmail.com>
Tue, 5 Jun 2012 21:26:05 +0000 (23:26 +0200)
committerMarcin Slusarz <marcin.slusarz@gmail.com>
Tue, 5 Jun 2012 21:58:43 +0000 (23:58 +0200)
...and create common function for destroying nouveau_context

src/gallium/drivers/nouveau/nouveau_context.h
src/gallium/drivers/nv30/nv30_context.c
src/gallium/drivers/nv50/nv50_context.c
src/gallium/drivers/nvc0/nvc0_context.c

index 531c6238b9f639fe2d2be4e8c684c7cc5e2d595e..b3fe05b1019f1f8df85a98c42d135e6352ba4b32 100644 (file)
@@ -2,6 +2,7 @@
 #define __NOUVEAU_CONTEXT_H__
 
 #include "pipe/p_context.h"
+#include <libdrm/nouveau.h>
 
 #define NOUVEAU_MAX_SCRATCH_BUFS 4
 
@@ -72,4 +73,15 @@ void *
 nouveau_scratch_get(struct nouveau_context *, unsigned size, uint64_t *gpu_addr,
                     struct nouveau_bo **);
 
+static INLINE void
+nouveau_context_destroy(struct nouveau_context *ctx)
+{
+   int i;
+
+   for (i = 0; i < NOUVEAU_MAX_SCRATCH_BUFS; ++i)
+      if (ctx->scratch.bo[i])
+         nouveau_bo_ref(NULL, &ctx->scratch.bo[i]);
+
+   FREE(ctx);
+}
 #endif
index b16cb2378730fc4a1cc4f6ebe10bb127e13a5347..42e844f141e9004fc83a442ae323bb3f6794f570 100644 (file)
@@ -92,7 +92,7 @@ nv30_context_destroy(struct pipe_context *pipe)
    if (nv30->screen->cur_ctx == nv30)
       nv30->screen->cur_ctx = NULL;
 
-   FREE(nv30);
+   nouveau_context_destroy(&nv30->base);
 }
 
 #define FAIL_CONTEXT_INIT(str, err)                   \
index 952dc03b1a3f0640a58f76346e411fc0fafd6aee..cb9dd413a2d4ad643d941407981564667147c6e6 100644 (file)
@@ -111,7 +111,7 @@ nv50_destroy(struct pipe_context *pipe)
    draw_destroy(nv50->draw);
 #endif
 
-   FREE(nv50);
+   nouveau_context_destroy(&nv50->base);
 }
 
 struct pipe_context *
index f93081465bdfbcad46dc4cff80939b0e33fa8978..b021f2e99dc43edad341d51b3edecfea4e73fdaf 100644 (file)
@@ -99,7 +99,7 @@ nvc0_destroy(struct pipe_context *pipe)
    draw_destroy(nvc0->draw);
 #endif
 
-   FREE(nvc0);
+   nouveau_context_destroy(&nvc0->base);
 }
 
 void