nv all: Copy shader tokens on create, free on delete.
authorYounes Manton <younes.m@gmail.com>
Thu, 24 Jul 2008 03:35:23 +0000 (23:35 -0400)
committerYounes Manton <younes.m@gmail.com>
Thu, 24 Jul 2008 03:46:45 +0000 (23:46 -0400)
Must copy token stream on shader create, client is allowed to free
their copy after creating the state object.

src/gallium/drivers/nv04/nv04_state.c
src/gallium/drivers/nv04/nv04_state.h
src/gallium/drivers/nv10/nv10_state.c
src/gallium/drivers/nv10/nv10_state.h
src/gallium/drivers/nv30/nv30_state.c
src/gallium/drivers/nv40/nv40_state.c
src/gallium/drivers/nv50/nv50_state.c
src/gallium/state_trackers/g3dvl/vl_context.c

index d618465a2018a9198aa59d632a47c7fc59f4e3d3..7e71dee7b5d7b04b8bda5d85bb62b1d470e5abd1 100644 (file)
@@ -4,6 +4,7 @@
 #include "pipe/p_util.h"
 #include "pipe/p_shader_tokens.h"
 
+#include "tgsi/util/tgsi_parse.h"
 
 #include "nv04_context.h"
 #include "nv04_state.h"
@@ -291,7 +292,7 @@ nv04_fp_state_create(struct pipe_context *pipe,
        struct nv04_fragment_program *fp;
 
        fp = CALLOC(1, sizeof(struct nv04_fragment_program));
-       fp->pipe = cso;
+       fp->pipe.tokens = tgsi_dup_tokens(cso->tokens);
 
        return (void *)fp;
 }
@@ -313,6 +314,7 @@ nv04_fp_state_delete(struct pipe_context *pipe, void *hwcso)
        struct nv04_fragment_program *fp = hwcso;
 
        nv04_fragprog_destroy(nv04, fp);
+       free((void*)fp->pipe.tokens);
        free(fp);
 }
 
index 7487819c3abf7489f959b530220fe00ba253ac29..39f7cd17b301e2fd04b831b8ed2d30e5e51f5688 100644 (file)
@@ -47,7 +47,7 @@ struct nv04_fragment_program_data {
 };
 
 struct nv04_fragment_program {
-       const struct pipe_shader_state *pipe;
+       struct pipe_shader_state pipe;
        struct tgsi_shader_info info;
 
        boolean translated;
index 9b8b7801cdf34d837fe43ff79d381990288b74fc..43b9c32f12df3beb214ef9d28b4bef2686c4c2ad 100644 (file)
@@ -4,6 +4,7 @@
 #include "pipe/p_util.h"
 #include "pipe/p_shader_tokens.h"
 
+#include "tgsi/util/tgsi_parse.h"
 
 #include "nv10_context.h"
 #include "nv10_state.h"
@@ -407,7 +408,7 @@ nv10_fp_state_create(struct pipe_context *pipe,
        struct nv10_fragment_program *fp;
 
        fp = CALLOC(1, sizeof(struct nv10_fragment_program));
-       fp->pipe = cso;
+       fp->pipe.tokens = tgsi_dup_tokens(cso->tokens);
        
        tgsi_scan_shader(cso->tokens, &fp->info);
 
@@ -431,6 +432,7 @@ nv10_fp_state_delete(struct pipe_context *pipe, void *hwcso)
        struct nv10_fragment_program *fp = hwcso;
 
        nv10_fragprog_destroy(nv10, fp);
+       FREE((void*)fp->pipe.tokens);
        FREE(fp);
 }
 
index 3ca501d135641e2c60e43d8850fdf927c6939c97..f1f9a12110ff3686762fe20f9ed80f7b6a8971cd 100644 (file)
@@ -79,7 +79,7 @@ struct nv10_fragment_program_data {
 };
 
 struct nv10_fragment_program {
-       const struct pipe_shader_state *pipe;
+       struct pipe_shader_state pipe;
        struct tgsi_shader_info info;
 
        boolean translated;
index 4d6303ebc28c9a2fc0a501c374a2bdbfbae039a1..ba02413de5c61042c34097cbf56a7c71db6b7fae 100644 (file)
@@ -3,6 +3,8 @@
 #include "pipe/p_util.h"
 #include "pipe/p_inlines.h"
 
+#include "tgsi/util/tgsi_parse.h"
+
 #include "nv30_context.h"
 #include "nv30_state.h"
 
@@ -503,7 +505,7 @@ nv30_vp_state_create(struct pipe_context *pipe,
        struct nv30_vertex_program *vp;
 
        vp = CALLOC(1, sizeof(struct nv30_vertex_program));
-       vp->pipe = *cso;
+       vp->pipe.tokens = tgsi_dup_tokens(cso->tokens);
        /*vp->draw = draw_create_vertex_shader(nv30->draw, &vp->pipe);*/
 
        return (void *)vp;
@@ -527,6 +529,7 @@ nv30_vp_state_delete(struct pipe_context *pipe, void *hwcso)
 
        /*draw_delete_vertex_shader(nv30->draw, vp->draw);*/
        nv30_vertprog_destroy(nv30, vp);
+       FREE((void*)vp->pipe.tokens);
        FREE(vp);
 }
 
@@ -537,7 +540,7 @@ nv30_fp_state_create(struct pipe_context *pipe,
        struct nv30_fragment_program *fp;
 
        fp = CALLOC(1, sizeof(struct nv30_fragment_program));
-       fp->pipe = *cso;
+       fp->pipe.tokens = tgsi_dup_tokens(cso->tokens);
 
        tgsi_scan_shader(fp->pipe.tokens, &fp->info);
 
@@ -560,6 +563,7 @@ nv30_fp_state_delete(struct pipe_context *pipe, void *hwcso)
        struct nv30_fragment_program *fp = hwcso;
 
        nv30_fragprog_destroy(nv30, fp);
+       FREE((void*)fp->pipe.tokens);
        FREE(fp);
 }
 
index afcf336a65b9cd819dcc28da2b0220fb7f8859b6..5d2c3ab8810c3c7971a14660ac40077e2a286fdd 100644 (file)
@@ -5,6 +5,8 @@
 
 #include "draw/draw_context.h"
 
+#include "tgsi/util/tgsi_parse.h"
+
 #include "nv40_context.h"
 #include "nv40_state.h"
 
@@ -516,7 +518,7 @@ nv40_vp_state_create(struct pipe_context *pipe,
        struct nv40_vertex_program *vp;
 
        vp = CALLOC(1, sizeof(struct nv40_vertex_program));
-       vp->pipe = *cso;
+       vp->pipe.tokens = tgsi_dup_tokens(cso->tokens);
        vp->draw = draw_create_vertex_shader(nv40->draw, &vp->pipe);
 
        return (void *)vp;
@@ -540,6 +542,7 @@ nv40_vp_state_delete(struct pipe_context *pipe, void *hwcso)
 
        draw_delete_vertex_shader(nv40->draw, vp->draw);
        nv40_vertprog_destroy(nv40, vp);
+       FREE((void*)vp->pipe.tokens);
        FREE(vp);
 }
 
@@ -550,7 +553,7 @@ nv40_fp_state_create(struct pipe_context *pipe,
        struct nv40_fragment_program *fp;
 
        fp = CALLOC(1, sizeof(struct nv40_fragment_program));
-       fp->pipe = *cso;
+       fp->pipe.tokens = tgsi_dup_tokens(cso->tokens);
 
        tgsi_scan_shader(fp->pipe.tokens, &fp->info);
 
@@ -573,6 +576,7 @@ nv40_fp_state_delete(struct pipe_context *pipe, void *hwcso)
        struct nv40_fragment_program *fp = hwcso;
 
        nv40_fragprog_destroy(nv40, fp);
+       FREE((void*)fp->pipe.tokens);
        FREE(fp);
 }
 
index c552a0b0aa08b218bc5b0a1f3210fada0e01aa3c..731409bed4e65a39038711ec52947fe760e7f6b6 100644 (file)
@@ -25,6 +25,8 @@
 #include "pipe/p_util.h"
 #include "pipe/p_inlines.h"
 
+#include "tgsi/util/tgsi_parse.h"
+
 #include "nv50_context.h"
 #include "nv50_texture.h"
 
@@ -438,7 +440,7 @@ nv50_vp_state_create(struct pipe_context *pipe,
 {
        struct nv50_program *p = CALLOC_STRUCT(nv50_program);
 
-       p->pipe = *cso;
+       p->pipe.tokens = tgsi_dup_tokens(cso->tokens);
        p->type = PIPE_SHADER_VERTEX;
        tgsi_scan_shader(p->pipe.tokens, &p->info);
        return (void *)p;
@@ -457,9 +459,11 @@ static void
 nv50_vp_state_delete(struct pipe_context *pipe, void *hwcso)
 {
        struct nv50_context *nv50 = nv50_context(pipe);
+       struct nv50_program *p = hwcso;
 
-       nv50_program_destroy(nv50, hwcso);
-       FREE(hwcso);
+       nv50_program_destroy(nv50, p);
+       FREE((void*)p->pipe.tokens);
+       FREE(p);
 }
 
 static void *
@@ -468,7 +472,7 @@ nv50_fp_state_create(struct pipe_context *pipe,
 {
        struct nv50_program *p = CALLOC_STRUCT(nv50_program);
 
-       p->pipe = *cso;
+       p->pipe.tokens = tgsi_dup_tokens(cso->tokens);
        p->type = PIPE_SHADER_FRAGMENT;
        tgsi_scan_shader(p->pipe.tokens, &p->info);
        return (void *)p;
@@ -487,9 +491,11 @@ static void
 nv50_fp_state_delete(struct pipe_context *pipe, void *hwcso)
 {
        struct nv50_context *nv50 = nv50_context(pipe);
+       struct nv50_program *p = hwcso;
 
-       nv50_program_destroy(nv50, hwcso);
-       FREE(hwcso);
+       nv50_program_destroy(nv50, p);
+       FREE((void*)p->pipe.tokens);
+       FREE(p);
 }
 
 static void
index 850a769376e716a7ce49b270efd787fbdbf405f2..638900b3f472ff94c7a957ed9f8c6335af8c0efb 100644 (file)
@@ -358,7 +358,7 @@ static int vlCreateVertexShaderIMC(struct VL_CONTEXT *context)
        
        vs.tokens = tokens;
        context->states.mc.i_vs = pipe->create_vs_state(pipe, &vs);
-       //free(tokens);
+       free(tokens);
        
        return 0;
 }
@@ -436,7 +436,7 @@ static int vlCreateFragmentShaderIMC(struct VL_CONTEXT *context)
 
        fs.tokens = tokens;
        context->states.mc.i_fs = pipe->create_fs_state(pipe, &fs);
-       //free(tokens);
+       free(tokens);
        
        return 0;
 }
@@ -535,7 +535,7 @@ static int vlCreateVertexShaderFramePMC(struct VL_CONTEXT *context)
        
        vs.tokens = tokens;
        context->states.mc.p_vs[0] = pipe->create_vs_state(pipe, &vs);
-       //free(tokens);
+       free(tokens);
        
        return 0;
 }
@@ -655,7 +655,7 @@ static int vlCreateVertexShaderFieldPMC(struct VL_CONTEXT *context)
        
        vs.tokens = tokens;
        context->states.mc.p_vs[1] = pipe->create_vs_state(pipe, &vs);
-       //free(tokens);
+       free(tokens);
        
        return 0;
 }
@@ -777,7 +777,7 @@ static int vlCreateFragmentShaderFramePMC(struct VL_CONTEXT *context)
 
        fs.tokens = tokens;
        context->states.mc.p_fs[0] = pipe->create_fs_state(pipe, &fs);
-       //free(tokens);
+       free(tokens);
        
        return 0;
 }
@@ -948,7 +948,7 @@ static int vlCreateFragmentShaderFieldPMC(struct VL_CONTEXT *context)
 
        fs.tokens = tokens;
        context->states.mc.p_fs[1] = pipe->create_fs_state(pipe, &fs);
-       //free(tokens);
+       free(tokens);
        
        return 0;
 }
@@ -1054,7 +1054,7 @@ static int vlCreateVertexShaderFrameBMC(struct VL_CONTEXT *context)
        
        vs.tokens = tokens;
        context->states.mc.b_vs[0] = pipe->create_vs_state(pipe, &vs);
-       //free(tokens);
+       free(tokens);
        
        return 0;
 }
@@ -1176,7 +1176,7 @@ static int vlCreateVertexShaderFieldBMC(struct VL_CONTEXT *context)
        
        vs.tokens = tokens;
        context->states.mc.b_vs[1] = pipe->create_vs_state(pipe, &vs);
-       //free(tokens);
+       free(tokens);
        
        return 0;
 }
@@ -1315,7 +1315,7 @@ static int vlCreateFragmentShaderFrameBMC(struct VL_CONTEXT *context)
 
        fs.tokens = tokens;
        context->states.mc.b_fs[0] = pipe->create_fs_state(pipe, &fs);
-       //free(tokens);
+       free(tokens);
        
        return 0;
 }
@@ -1515,7 +1515,7 @@ static int vlCreateFragmentShaderFieldBMC(struct VL_CONTEXT *context)
 
        fs.tokens = tokens;
        context->states.mc.b_fs[1] = pipe->create_fs_state(pipe, &fs);
-       //free(tokens);
+       free(tokens);
        
        return 0;
 }