nv40: destroy programs
authorBen Skeggs <skeggsb@gmail.com>
Sun, 16 Dec 2007 05:01:25 +0000 (16:01 +1100)
committerBen Skeggs <skeggsb@gmail.com>
Sun, 16 Dec 2007 05:01:25 +0000 (16:01 +1100)
src/mesa/pipe/nv40/nv40_context.h
src/mesa/pipe/nv40/nv40_fragprog.c
src/mesa/pipe/nv40/nv40_state.c
src/mesa/pipe/nv40/nv40_vertprog.c

index bf1534b..9a93ed3 100644 (file)
@@ -79,12 +79,16 @@ extern void nv40_vertprog_translate(struct nv40_context *,
                                    struct nv40_vertex_program *);
 extern void nv40_vertprog_bind(struct nv40_context *,
                               struct nv40_vertex_program *);
+extern void nv40_vertprog_destroy(struct nv40_context *,
+                                 struct nv40_vertex_program *);
 
 /* nv40_fragprog.c */
 extern void nv40_fragprog_translate(struct nv40_context *,
                                    struct nv40_fragment_program *);
 extern void nv40_fragprog_bind(struct nv40_context *,
                               struct nv40_fragment_program *);
+extern void nv40_fragprog_destroy(struct nv40_context *,
+                                 struct nv40_fragment_program *);
 
 /* nv40_state.c and friends */
 extern void nv40_emit_hw_state(struct nv40_context *nv40);
index a0d98ae..e801dae 100644 (file)
 #define abs(s) nv40_sr_abs((s))
 #define scale(s,v) nv40_sr_scale((s), NV40_FP_OP_DST_SCALE_##v)
 
-static uint32_t
-passthrough_fp_data[] = {
-       0x01403e81, 0x1c9dc801, 0x0001c800, 0x3fe1c800
-};
-
-static struct nv40_fragment_program
-passthrough_fp = {
-       .pipe = NULL,
-       .translated = TRUE,
-       .insn = passthrough_fp_data,
-       .insn_len = sizeof(passthrough_fp_data) / sizeof(uint32_t),
-       .buffer = NULL,
-       .uses_kil = 0,
-       .num_regs = 2,
-};
-
 struct nv40_fpc {
        struct nv40_fragment_program *fp;
 
@@ -705,10 +689,8 @@ nv40_fragprog_bind(struct nv40_context *nv40, struct nv40_fragment_program *fp)
 
        if (!fp->translated) {
                nv40_fragprog_translate(nv40, fp);
-               if (!fp->translated) {
-                       NOUVEAU_ERR("invalid, using passthrough shader\n");
-                       fp = &passthrough_fp;
-               }
+               if (!fp->translated)
+                       assert(0);
        }
 
        if (fp->num_consts) {
@@ -763,3 +745,11 @@ nv40_fragprog_bind(struct nv40_context *nv40, struct nv40_fragment_program *fp)
        nv40->fragprog.active = fp;
 }
 
+void
+nv40_fragprog_destroy(struct nv40_context *nv40,
+                     struct nv40_fragment_program *fp)
+{
+       if (fp->insn_len)
+               free(fp->insn);
+}
+
index 5aeba68..5b070a2 100644 (file)
@@ -505,7 +505,11 @@ nv40_vp_state_bind(struct pipe_context *pipe, void *hwcso)
 static void
 nv40_vp_state_delete(struct pipe_context *pipe, void *hwcso)
 {
-       free(hwcso);
+       struct nv40_context *nv40 = (struct nv40_context *)pipe;
+       struct nv40_vertex_program *vp = hwcso;
+
+       nv40_vertprog_destroy(nv40, vp);
+       free(vp);
 }
 
 static void *
@@ -533,7 +537,11 @@ nv40_fp_state_bind(struct pipe_context *pipe, void *hwcso)
 static void
 nv40_fp_state_delete(struct pipe_context *pipe, void *hwcso)
 {
-       free(hwcso);
+       struct nv40_context *nv40 = (struct nv40_context *)pipe;
+       struct nv40_fragment_program *fp = hwcso;
+
+       nv40_fragprog_destroy(nv40, fp);
+       free(fp);
 }
 
 static void
index c9e1f25..981d70e 100644 (file)
@@ -721,3 +721,12 @@ nv40_vertprog_bind(struct nv40_context *nv40, struct nv40_vertex_program *vp)
        nv40->vertprog.active = vp;
 }
 
+void
+nv40_vertprog_destroy(struct nv40_context *nv40, struct nv40_vertex_program *vp)
+{
+       if (vp->nr_consts)
+               free(vp->consts);
+       if (vp->nr_insns)
+               free(vp->insns);
+}
+