[Nouveau] Clean up of nv40_context->state.hw and nv40_screen->state

Krzysztof Smiechowicz deadwood at wp.pl
Sun Dec 20 23:34:51 PST 2009


Hi,

I'm trying to find a place where objects held in 
nv40_context->state.hw[] and nv40_screen->state[] are being unreferenced 
during pipe_context destruction.

Currently I'm observing that these objects are not unreferenced and 
since they hold reference to buffer objects, the buffer objects 
themselves are not unreferenced as well (for example color buffer or z 
buffer).

In order to clean those references I applied the following changes:

Index: nv40_screen.c
===================================================================
--- nv40_screen.c	(wersja 32083)
+++ nv40_screen.c	(kopia robocza)
@@ -140,7 +140,13 @@
  nv40_screen_destroy(struct pipe_screen *pscreen)
  {
  	struct nv40_screen *screen = nv40_screen(pscreen);
+    unsigned i;

+    for (i = 0; i < NV40_STATE_MAX; i++) {
+        if (screen->state[i])
+            so_ref(NULL, &screen->state[i]);
+    }
+
  	nouveau_resource_free(&screen->vp_exec_heap);
  	nouveau_resource_free(&screen->vp_data_heap);
  	nouveau_resource_free(&screen->query_heap);
Index: nv40_context.c
===================================================================
--- nv40_context.c	(wersja 32083)
+++ nv40_context.c	(kopia robocza)
@@ -25,7 +25,13 @@
  nv40_destroy(struct pipe_context *pipe)
  {
  	struct nv40_context *nv40 = nv40_context(pipe);
+    unsigned i;

+    for (i = 0; i < NV40_STATE_MAX; i++) {
+        if (nv40->state.hw[i])
+            so_ref(NULL, &nv40->state.hw[i]);
+    }
+
  	if (nv40->draw)
  		draw_destroy(nv40->draw);
  	FREE(nv40);


Is this the correct approach or did I miss where those objects are 
unreferenced?

Best regards,
Krzysztof


More information about the Nouveau mailing list