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

Krzysztof Smiechowicz deadwood at wp.pl
Mon Dec 21 01:57:13 PST 2009


Krzysztof Smiechowicz pisze:
> 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?
> 

A similar patch for nv40_fragprog:

Index: nv40_fragprog.c
===================================================================
--- nv40_fragprog.c	(wersja 32083)
+++ nv40_fragprog.c	(kopia robocza)
@@ -948,6 +948,12 @@
  nv40_fragprog_destroy(struct nv40_context *nv40,
  		      struct nv40_fragment_program *fp)
  {
+    if (fp->buffer)
+        pipe_buffer_reference(&fp->buffer, NULL);
+
+    if (fp->so)
+        so_ref(NULL, &fp->so);
+
  	if (fp->insn_len)
  		FREE(fp->insn);
  }

If this is the right direction, I can prepare a cumulative patch for 
nv30, nv40 and nv50.

Best regards,
Krzysztof


More information about the Nouveau mailing list