tgsi: fix tgsi_exec_machine_bind_shader() to handle NULL tokens, samplers
authorBrian Paul <brianp@vmware.com>
Thu, 6 May 2010 20:38:55 +0000 (14:38 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 6 May 2010 21:19:02 +0000 (15:19 -0600)
This lets us unbind a shader from the tgsi_exec_machine.  Since
shaders aren't ref counted we need this to properly clean up when
deleting shaders elsewhere.

src/gallium/auxiliary/tgsi/tgsi_exec.c

index 63f2b8578bb9de15d9fcf5d4b7f88d7e47c04674..1218242653faf3d95007f8cd38e3a60884e97de0 100644 (file)
@@ -635,6 +635,23 @@ tgsi_exec_machine_bind_shader(
    mach->Tokens = tokens;
    mach->Samplers = samplers;
 
+   if (!tokens) {
+      /* unbind and free all */
+      if (mach->Declarations) {
+         FREE( mach->Declarations );
+      }
+      mach->Declarations = NULL;
+      mach->NumDeclarations = 0;
+
+      if (mach->Instructions) {
+         FREE( mach->Instructions );
+      }
+      mach->Instructions = NULL;
+      mach->NumInstructions = 0;
+
+      return;
+   }
+
    k = tgsi_parse_init (&parse, mach->Tokens);
    if (k != TGSI_PARSE_OK) {
       debug_printf( "Problem parsing!\n" );
@@ -792,7 +809,9 @@ void
 tgsi_exec_machine_destroy(struct tgsi_exec_machine *mach)
 {
    if (mach) {
-      FREE(mach->Instructions);
+      if (mach->Instructions)
+         FREE(mach->Instructions);
+      if (mach->Declarations)
       FREE(mach->Declarations);
    }