r500: fixup the program allocations to be the correct sizes
authorDave Airlie <airlied@redhat.com>
Thu, 15 May 2008 03:48:31 +0000 (13:48 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 15 May 2008 08:40:07 +0000 (18:40 +1000)
src/mesa/drivers/dri/r300/r300_shader.c

index 77abf86..5c8fd8a 100644 (file)
@@ -9,8 +9,10 @@
 static struct gl_program *r300NewProgram(GLcontext * ctx, GLenum target,
                                         GLuint id)
 {
+       r300ContextPtr rmesa = R300_CONTEXT(ctx);
        struct r300_vertex_program_cont *vp;
-       struct r300_fragment_program *fp;
+       struct r300_fragment_program *r300_fp;
+       struct r500_fragment_program *r500_fp;
 
        switch (target) {
        case GL_VERTEX_STATE_PROGRAM_NV:
@@ -19,14 +21,28 @@ static struct gl_program *r300NewProgram(GLcontext * ctx, GLenum target,
                return _mesa_init_vertex_program(ctx, &vp->mesa_program,
                                                 target, id);
        case GL_FRAGMENT_PROGRAM_ARB:
-               fp = CALLOC_STRUCT(r300_fragment_program);
-               fp->ctx = ctx;
-               return _mesa_init_fragment_program(ctx, &fp->mesa_program,
-                                                  target, id);
+               if (rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
+                       r500_fp = CALLOC_STRUCT(r500_fragment_program);
+                       r500_fp->ctx = ctx;
+                       return _mesa_init_fragment_program(ctx, &r500_fp->mesa_program,
+                                                          target, id);
+               } else {
+                       r300_fp = CALLOC_STRUCT(r300_fragment_program);
+                       r300_fp->ctx = ctx;
+                       return _mesa_init_fragment_program(ctx, &r300_fp->mesa_program,
+                                                          target, id);
+               }
+
        case GL_FRAGMENT_PROGRAM_NV:
-               fp = CALLOC_STRUCT(r300_fragment_program);
-               return _mesa_init_fragment_program(ctx, &fp->mesa_program,
-                                                  target, id);
+               if (rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
+                       r500_fp = CALLOC_STRUCT(r500_fragment_program);
+                       return _mesa_init_fragment_program(ctx, &r500_fp->mesa_program,
+                                                          target, id);
+               } else {
+                       r300_fp = CALLOC_STRUCT(r300_fragment_program);
+                       return _mesa_init_fragment_program(ctx, &r300_fp->mesa_program,
+                                                          target, id);
+               }
        default:
                _mesa_problem(ctx, "Bad target in r300NewProgram");
        }
@@ -42,15 +58,20 @@ static void r300DeleteProgram(GLcontext * ctx, struct gl_program *prog)
 static void
 r300ProgramStringNotify(GLcontext * ctx, GLenum target, struct gl_program *prog)
 {
+       r300ContextPtr rmesa = R300_CONTEXT(ctx);
        struct r300_vertex_program_cont *vp = (void *)prog;
-       struct r300_fragment_program *fp = (struct r300_fragment_program *)prog;
+       struct r300_fragment_program *r300_fp = (struct r300_fragment_program *)prog;
+       struct r500_fragment_program *r500_fp = (struct r500_fragment_program *)prog;
 
        switch (target) {
        case GL_VERTEX_PROGRAM_ARB:
                vp->progs = NULL;
                break;
        case GL_FRAGMENT_PROGRAM_ARB:
-               fp->translated = GL_FALSE;
+               if (rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515)
+                       r500_fp->translated = GL_FALSE;
+               else
+                       r300_fp->translated = GL_FALSE;
                break;
        }