Mesa (master): tgsi: fix tgsi_exec_machine_bind_shader() to handle NULL tokens, samplers

Brian Paul brianp at kemper.freedesktop.org
Thu May 6 21:19:40 UTC 2010


Module: Mesa
Branch: master
Commit: c8f0e805a9e4c26eadc45bb1fd172b6702f581ab
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c8f0e805a9e4c26eadc45bb1fd172b6702f581ab

Author: Brian Paul <brianp at vmware.com>
Date:   Thu May  6 14:38:55 2010 -0600

tgsi: fix tgsi_exec_machine_bind_shader() to handle NULL tokens, samplers

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 |   21 ++++++++++++++++++++-
 1 files changed, 20 insertions(+), 1 deletions(-)

diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
index 63f2b85..1218242 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
@@ -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);
    }
 




More information about the mesa-commit mailing list