radeon/r200/r300/r600: make bo mapping be explicit
[mesa.git] / src / mesa / drivers / dri / r300 / r300_shader.c
index 0133b8379664abb392ae02bb70ab4072f173a7ff..a4f9db13ecfd34c35b7d0d2614f9943d39020351 100644 (file)
 #include "r300_context.h"
 #include "r300_fragprog_common.h"
 
+static void freeFragProgCache(GLcontext *ctx, struct r300_fragment_program_cont *cache)
+{
+       struct r300_fragment_program *tmp, *fp = cache->progs;
+
+       while (fp) {
+               tmp = fp->next;
+               rc_constants_destroy(&fp->code.constants);
+               _mesa_free(fp);
+               fp = tmp;
+       }
+}
+
+static void freeVertProgCache(GLcontext *ctx, struct r300_vertex_program_cont *cache)
+{
+       struct r300_vertex_program *tmp, *vp = cache->progs;
+
+       while (vp) {
+               tmp = vp->next;
+               rc_constants_destroy(&vp->code.constants);
+               _mesa_reference_vertprog(ctx, &vp->Base, NULL);
+               _mesa_free(vp);
+               vp = tmp;
+       }
+}
+
 static struct gl_program *r300NewProgram(GLcontext * ctx, GLenum target,
                                         GLuint id)
 {
        struct r300_vertex_program_cont *vp;
-       struct r300_fragment_program *fp;
+       struct r300_fragment_program_cont *fp;
 
        switch (target) {
        case GL_VERTEX_STATE_PROGRAM_NV:
        case GL_VERTEX_PROGRAM_ARB:
                vp = CALLOC_STRUCT(r300_vertex_program_cont);
-               return _mesa_init_vertex_program(ctx, &vp->mesa_program,
-                                                target, id);
+               return _mesa_init_vertex_program(ctx, &vp->mesa_program, target, id);
 
        case GL_FRAGMENT_PROGRAM_NV:
        case GL_FRAGMENT_PROGRAM_ARB:
-               fp = CALLOC_STRUCT(r300_fragment_program);
+               fp = CALLOC_STRUCT(r300_fragment_program_cont);
                return _mesa_init_fragment_program(ctx, &fp->Base, target, id);
 
        default:
@@ -59,21 +83,35 @@ static struct gl_program *r300NewProgram(GLcontext * ctx, GLenum target,
 
 static void r300DeleteProgram(GLcontext * ctx, struct gl_program *prog)
 {
+       struct r300_vertex_program_cont *vp = (struct r300_vertex_program_cont *)prog;
+       struct r300_fragment_program_cont *fp = (struct r300_fragment_program_cont *)prog;
+
+       switch (prog->Target) {
+               case GL_VERTEX_PROGRAM_ARB:
+                       freeVertProgCache(ctx, vp);
+                       break;
+               case GL_FRAGMENT_PROGRAM_ARB:
+                       freeFragProgCache(ctx, fp);
+                       break;
+       }
+
        _mesa_delete_program(ctx, prog);
 }
 
 static void
 r300ProgramStringNotify(GLcontext * ctx, GLenum target, struct gl_program *prog)
 {
-       struct r300_vertex_program_cont *vp = (void *)prog;
-       struct r300_fragment_program *r300_fp = (struct r300_fragment_program *)prog;
+       struct r300_vertex_program_cont *vp = (struct r300_vertex_program_cont *)prog;
+       struct r300_fragment_program_cont *fp = (struct r300_fragment_program_cont *)prog;
 
        switch (target) {
        case GL_VERTEX_PROGRAM_ARB:
+               freeVertProgCache(ctx, vp);
                vp->progs = NULL;
                break;
        case GL_FRAGMENT_PROGRAM_ARB:
-               r300_fp->translated = GL_FALSE;
+               freeFragProgCache(ctx, fp);
+               fp->progs = NULL;
                break;
        }
 
@@ -85,13 +123,14 @@ static GLboolean
 r300IsProgramNative(GLcontext * ctx, GLenum target, struct gl_program *prog)
 {
        if (target == GL_FRAGMENT_PROGRAM_ARB) {
-               struct r300_fragment_program *fp = (struct r300_fragment_program *)prog;
-               if (!fp->translated)
-                       r300TranslateFragmentShader(ctx, &fp->Base);
+               struct r300_fragment_program *fp = r300SelectAndTranslateFragmentShader(ctx);
 
                return !fp->error;
-       } else
-               return GL_TRUE;
+       } else {
+               struct r300_vertex_program *vp = r300SelectAndTranslateVertexShader(ctx);
+
+               return !vp->error;
+       }
 }
 
 void r300InitShaderFuncs(struct dd_function_table *functions)