r300: cache translated fragment programs
authorMaciej Cencora <m.cencora@gmail.com>
Sat, 4 Jul 2009 11:26:49 +0000 (13:26 +0200)
committerMaciej Cencora <m.cencora@gmail.com>
Mon, 13 Jul 2009 17:25:56 +0000 (19:25 +0200)
src/mesa/drivers/dri/r300/r300_context.h
src/mesa/drivers/dri/r300/r300_fragprog_common.c
src/mesa/drivers/dri/r300/r300_fragprog_common.h
src/mesa/drivers/dri/r300/r300_shader.c
src/mesa/drivers/dri/r300/r300_state.c
src/mesa/drivers/dri/r300/r300_swtcl.c

index 026c33c67cb209203d691e128982f55826409924..fc436e1100e1b3bba6052c557458f45913f1c503 100644 (file)
@@ -546,7 +546,7 @@ struct r500_fragment_program_code {
 * to render with that program.
 */
 struct r300_fragment_program {
-       struct gl_fragment_program Base;
+       struct gl_program *Base;
 
        GLboolean translated;
        GLboolean error;
@@ -559,6 +559,13 @@ struct r300_fragment_program {
 
        GLboolean writes_depth;
        GLuint optimization;
+
+       struct r300_fragment_program *next;
+};
+
+struct r300_fragment_program_cont {
+       struct gl_fragment_program Base;
+       struct r300_fragment_program *progs;
 };
 
 struct r300_fragment_program_compiler {
@@ -633,6 +640,7 @@ struct r300_context {
        struct r300_hw_state hw;
 
        struct r300_vertex_program *selected_vp;
+       struct r300_fragment_program *selected_fp;
 
        /* Vertex buffers
         */
index 1644e6f42afc3041ff6768af2e127ce15bdb3d65..b25cf24007a6b9479f4fc1148d36f22446475e78 100644 (file)
@@ -67,7 +67,7 @@ static void nqssadce_init(struct nqssadce_state* s)
  */
 static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler)
 {
-       GLuint InputsRead = compiler->fp->Base.Base.InputsRead;
+       GLuint InputsRead = compiler->fp->Base->InputsRead;
 
        if (!(InputsRead & FRAG_BIT_WPOS))
                return;
@@ -168,7 +168,7 @@ static GLuint build_func(GLuint comparefunc)
  */
 static void build_state(
        r300ContextPtr r300,
-       struct r300_fragment_program *fp,
+       struct gl_fragment_program *fp,
        struct r300_fragment_program_external_state *state)
 {
        int unit;
@@ -176,7 +176,7 @@ static void build_state(
        _mesa_bzero(state, sizeof(*state));
 
        for(unit = 0; unit < 16; ++unit) {
-               if (fp->Base.Base.ShadowSamplers & (1 << unit)) {
+               if (fp->Base.ShadowSamplers & (1 << unit)) {
                        struct gl_texture_object* tex = r300->radeon.glCtx->Texture.Unit[unit]._Current;
 
                        state->unit[unit].depth_texture_mode = build_dtm(tex->DepthMode);
@@ -185,96 +185,107 @@ static void build_state(
        }
 }
 
-void r300TranslateFragmentShader(GLcontext *ctx, struct gl_fragment_program *fp)
+void r300TranslateFragmentShader(GLcontext *ctx, struct r300_fragment_program *fp)
 {
        r300ContextPtr r300 = R300_CONTEXT(ctx);
-       struct r300_fragment_program *r300_fp = (struct r300_fragment_program *)fp;
-       struct r300_fragment_program_external_state state;
+       struct r300_fragment_program_compiler compiler;
+
+       compiler.r300 = r300;
+       compiler.fp = fp;
+       compiler.code = &fp->code;
+       compiler.program = fp->Base;
+
+       if (RADEON_DEBUG & DEBUG_PIXEL) {
+               fflush(stdout);
+               _mesa_printf("Fragment Program: Initial program:\n");
+               _mesa_print_program(compiler.program);
+               fflush(stdout);
+       }
 
-       build_state(r300, r300_fp, &state);
-       if (_mesa_memcmp(&r300_fp->state, &state, sizeof(state))) {
-               /* TODO: cache compiled programs */
-               r300_fp->translated = GL_FALSE;
-               _mesa_memcpy(&r300_fp->state, &state, sizeof(state));
+       insert_WPOS_trailer(&compiler);
+
+       if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
+               struct radeon_program_transformation transformations[] = {
+                       { &r500_transform_TEX, &compiler },
+                       { &radeonTransformALU, 0 },
+                       { &radeonTransformDeriv, 0 },
+                       { &radeonTransformTrigScale, 0 }
+               };
+               radeonLocalTransform(ctx, compiler.program, 4, transformations);
+       } else {
+               struct radeon_program_transformation transformations[] = {
+                       { &r300_transform_TEX, &compiler },
+                       { &radeonTransformALU, 0 },
+                       { &radeonTransformTrigSimple, 0 }
+               };
+               radeonLocalTransform(ctx, compiler.program, 3, transformations);
        }
 
-       if (!r300_fp->translated) {
-               struct r300_fragment_program_compiler compiler;
+       if (RADEON_DEBUG & DEBUG_PIXEL) {
+               _mesa_printf("Fragment Program: After native rewrite:\n");
+               _mesa_print_program(compiler.program);
+               fflush(stdout);
+       }
 
-               compiler.r300 = r300;
-               compiler.fp = r300_fp;
-               compiler.code = &r300_fp->code;
-               compiler.program = _mesa_clone_program(ctx, &fp->Base);
+       if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
+               struct radeon_nqssadce_descr nqssadce = {
+                       .Init = &nqssadce_init,
+                       .IsNativeSwizzle = &r500FPIsNativeSwizzle,
+                       .BuildSwizzle = &r500FPBuildSwizzle,
+                       .RewriteDepthOut = GL_TRUE
+               };
+               radeonNqssaDce(ctx, compiler.program, &nqssadce);
+       } else {
+               struct radeon_nqssadce_descr nqssadce = {
+                       .Init = &nqssadce_init,
+                       .IsNativeSwizzle = &r300FPIsNativeSwizzle,
+                       .BuildSwizzle = &r300FPBuildSwizzle,
+                       .RewriteDepthOut = GL_TRUE
+               };
+               radeonNqssaDce(ctx, compiler.program, &nqssadce);
+       }
 
-               if (RADEON_DEBUG & DEBUG_PIXEL) {
-                       fflush(stdout);
-                       _mesa_printf("Fragment Program: Initial program:\n");
-                       _mesa_print_program(compiler.program);
-                       fflush(stdout);
-               }
+       if (RADEON_DEBUG & DEBUG_PIXEL) {
+               _mesa_printf("Compiler: after NqSSA-DCE:\n");
+               _mesa_print_program(compiler.program);
+               fflush(stdout);
+       }
 
-               insert_WPOS_trailer(&compiler);
-
-               if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
-                       struct radeon_program_transformation transformations[] = {
-                               { &r500_transform_TEX, &compiler },
-                               { &radeonTransformALU, 0 },
-                               { &radeonTransformDeriv, 0 },
-                               { &radeonTransformTrigScale, 0 }
-                       };
-                       radeonLocalTransform(ctx, compiler.program, 4, transformations);
-               } else {
-                       struct radeon_program_transformation transformations[] = {
-                               { &r300_transform_TEX, &compiler },
-                               { &radeonTransformALU, 0 },
-                               { &radeonTransformTrigSimple, 0 }
-                       };
-                       radeonLocalTransform(ctx, compiler.program, 3, transformations);
-               }
+       if (!r300->vtbl.BuildFragmentProgramHwCode(&compiler))
+               fp->error = GL_TRUE;
 
-               if (RADEON_DEBUG & DEBUG_PIXEL) {
-                       _mesa_printf("Fragment Program: After native rewrite:\n");
-                       _mesa_print_program(compiler.program);
-                       fflush(stdout);
-               }
+       fp->translated = GL_TRUE;
 
-               if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
-                       struct radeon_nqssadce_descr nqssadce = {
-                               .Init = &nqssadce_init,
-                               .IsNativeSwizzle = &r500FPIsNativeSwizzle,
-                               .BuildSwizzle = &r500FPBuildSwizzle,
-                               .RewriteDepthOut = GL_TRUE
-                       };
-                       radeonNqssaDce(ctx, compiler.program, &nqssadce);
-               } else {
-                       struct radeon_nqssadce_descr nqssadce = {
-                               .Init = &nqssadce_init,
-                               .IsNativeSwizzle = &r300FPIsNativeSwizzle,
-                               .BuildSwizzle = &r300FPBuildSwizzle,
-                               .RewriteDepthOut = GL_TRUE
-                       };
-                       radeonNqssaDce(ctx, compiler.program, &nqssadce);
-               }
+       if (fp->error || (RADEON_DEBUG & DEBUG_PIXEL))
+               r300->vtbl.FragmentProgramDump(&fp->code);
+}
 
-               if (RADEON_DEBUG & DEBUG_PIXEL) {
-                       _mesa_printf("Compiler: after NqSSA-DCE:\n");
-                       _mesa_print_program(compiler.program);
-                       fflush(stdout);
-               }
+struct r300_fragment_program *r300SelectFragmentShader(GLcontext *ctx)
+{
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
+       struct r300_fragment_program_cont *fp_list;
+       struct r300_fragment_program *fp;
+       struct r300_fragment_program_external_state state;
+
+       fp_list = (struct r300_fragment_program_cont *)ctx->FragmentProgram._Current;
+       build_state(r300, ctx->FragmentProgram._Current, &state);
 
-               if (!r300->vtbl.BuildFragmentProgramHwCode(&compiler))
-                       r300_fp->error = GL_TRUE;
+       fp = fp_list->progs;
+       while (fp) {
+              if (_mesa_memcmp(&fp->state, &state, sizeof(state)) == 0) {
+                      return r300->selected_fp = fp;
+              }
+              fp = fp->next;
+       }
 
-               /* Subtle: Rescue any parameters that have been added during transformations */
-               _mesa_free_parameter_list(fp->Base.Parameters);
-               fp->Base.Parameters = compiler.program->Parameters;
-               compiler.program->Parameters = 0;
+       fp = _mesa_calloc(sizeof(struct r300_fragment_program));
 
-               _mesa_reference_program(ctx, &compiler.program, NULL);
+       fp->state = state;
+       fp->translated = GL_FALSE;
+       fp->Base = _mesa_clone_program(ctx, &ctx->FragmentProgram._Current->Base);
 
-               r300_fp->translated = GL_TRUE;
+       fp->next = fp_list->progs;
+       fp_list->progs = fp;
 
-               if (r300_fp->error || (RADEON_DEBUG & DEBUG_PIXEL))
-                       r300->vtbl.FragmentProgramDump(&r300_fp->code);
-       }
+       return r300->selected_fp = fp;
 }
index 85ea86fecb126da9a88234eb1e21407218049483..5e103ee4086d0edb9a085b8804cbcb65bb867fb4 100644 (file)
 
 #include "main/mtypes.h"
 
-extern void r300TranslateFragmentShader(GLcontext *ctx, struct gl_fragment_program *fp);
+#include "r300_context.h"
+
+extern void r300TranslateFragmentShader(GLcontext *ctx, struct r300_fragment_program *fp);
+
+struct r300_fragment_program *r300SelectFragmentShader(GLcontext *ctx);
 
 #endif
index 0133b8379664abb392ae02bb70ab4072f173a7ff..c9a429943ab28ac7508681daa4eaa10b96f9f2c0 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;
+               _mesa_reference_program(ctx, &fp->Base, NULL);
+               _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;
+               _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:
@@ -47,7 +70,7 @@ static struct gl_program *r300NewProgram(GLcontext * ctx, GLenum target,
 
        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 +82,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,9 +122,9 @@ 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;
+               struct r300_fragment_program *fp = r300SelectFragmentShader(ctx);
                if (!fp->translated)
-                       r300TranslateFragmentShader(ctx, &fp->Base);
+                       r300TranslateFragmentShader(ctx, fp);
 
                return !fp->error;
        } else
index 67bd6ec33bef06e9d6bf10c7416978ca21ec9afe..e0996383ebbe2ccb26e151aa239ff0f2f362b2a9 100644 (file)
@@ -452,9 +452,9 @@ static void r300SetPolygonOffsetState(GLcontext * ctx, GLboolean state)
 
 static GLboolean current_fragment_program_writes_depth(GLcontext* ctx)
 {
-       struct r300_fragment_program *fp = (struct r300_fragment_program *) ctx->FragmentProgram._Current;
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
 
-       return (fp && fp->writes_depth);
+       return ctx->FragmentProgram._Current && r300->selected_fp->writes_depth;
 }
 
 static void r300SetEarlyZState(GLcontext * ctx)
@@ -1095,18 +1095,17 @@ r300FetchStateParameter(GLcontext * ctx,
  */
 static void r300UpdateStateParameters(GLcontext * ctx, GLuint new_state)
 {
-       struct r300_fragment_program *fp;
+       r300ContextPtr rmesa = R300_CONTEXT(ctx);
        struct gl_program_parameter_list *paramList;
        GLuint i;
 
        if (!(new_state & (_NEW_BUFFERS | _NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS)))
                return;
 
-       fp = (struct r300_fragment_program *)ctx->FragmentProgram._Current;
-       if (!fp)
+       if (!ctx->FragmentProgram._Current || !rmesa->selected_fp)
                return;
 
-       paramList = fp->Base.Base.Parameters;
+       paramList = rmesa->selected_fp->Base->Parameters;
 
        if (!paramList)
                return;
@@ -1227,8 +1226,7 @@ static void r300SetupFragmentShaderTextures(GLcontext *ctx, int *tmu_mappings)
 {
        r300ContextPtr r300 = R300_CONTEXT(ctx);
        int i;
-       struct r300_fragment_program *fp = (struct r300_fragment_program *) ctx->FragmentProgram._Current;
-       struct r300_fragment_program_code *code = &fp->code.r300;
+       struct r300_fragment_program_code *code = &r300->selected_fp->code.r300;
 
        R300_STATECHANGE(r300, fpt);
 
@@ -1268,9 +1266,9 @@ static void r300SetupFragmentShaderTextures(GLcontext *ctx, int *tmu_mappings)
 
 static void r500SetupFragmentShaderTextures(GLcontext *ctx, int *tmu_mappings)
 {
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
        int i;
-       struct r300_fragment_program *fp = (struct r300_fragment_program *) ctx->FragmentProgram._Current;
-       struct r500_fragment_program_code *code = &fp->code.r500;
+       struct r500_fragment_program_code *code = &r300->selected_fp->code.r500;
 
        /* find all the texture instructions and relocate the texture units */
        for (i = 0; i < code->inst_end + 1; i++) {
@@ -1318,8 +1316,6 @@ static void r300SetupTextures(GLcontext * ctx)
        int hw_tmu = 0;
        int last_hw_tmu = -1;   /* -1 translates into no setup costs for fields */
        int tmu_mappings[R300_MAX_TEXTURE_UNITS] = { -1, };
-       struct r300_fragment_program *fp = (struct r300_fragment_program *)
-           (char *)ctx->FragmentProgram._Current;
 
        R300_STATECHANGE(r300, txe);
        R300_STATECHANGE(r300, tex.filter);
@@ -1422,7 +1418,7 @@ static void r300SetupTextures(GLcontext * ctx)
            cmdpacket0(r300->radeon.radeonScreen, R300_TX_BORDER_COLOR_0, last_hw_tmu + 1);
 
        if (r300->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV515) {
-               if (fp->Base.UsesKill && last_hw_tmu < 0) {
+               if (ctx->FragmentProgram._Current->UsesKill && last_hw_tmu < 0) {
                        // The KILL operation requires the first texture unit
                        // to be enabled.
                        r300->hw.txe.cmd[R300_TXE_ENABLE] |= 1;
@@ -1464,7 +1460,7 @@ static void r300SetupRSUnit(GLcontext * ctx)
        else
                RENDERINPUTS_COPY(OutputsWritten.index_bitset, r300->render_inputs_bitset);
 
-       InputsRead = ctx->FragmentProgram._Current->Base.InputsRead;
+       InputsRead = r300->selected_fp->Base->InputsRead;
 
        R300_STATECHANGE(r300, ri);
        R300_STATECHANGE(r300, rc);
@@ -1581,7 +1577,7 @@ static void r500SetupRSUnit(GLcontext * ctx)
        else
                RENDERINPUTS_COPY(OutputsWritten.index_bitset, r300->render_inputs_bitset);
 
-       InputsRead = ctx->FragmentProgram._Current->Base.InputsRead;
+       InputsRead = r300->selected_fp->Base->InputsRead;
 
        R300_STATECHANGE(r300, ri);
        R300_STATECHANGE(r300, rc);
@@ -2038,21 +2034,18 @@ static void r300ResetHwState(r300ContextPtr r300)
 
 void r300UpdateShaders(r300ContextPtr rmesa)
 {
-       GLcontext *ctx;
+       GLcontext *ctx = rmesa->radeon.glCtx;
        struct r300_fragment_program *fp;
-       int i;
-
-       ctx = rmesa->radeon.glCtx;
-       fp = (struct r300_fragment_program *) ctx->FragmentProgram._Current;
 
        /* should only happenen once, just after context is created */
        /* TODO: shouldn't we fallback to sw here? */
-       if (!fp) {
+       if (!ctx->FragmentProgram._Current) {
                _mesa_fprintf(stderr, "No ctx->FragmentProgram._Current!!\n");
                return;
        }
 
        if (rmesa->radeon.NewGLState && rmesa->options.hw_tcl_enabled) {
+               int i;
                for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) {
                        rmesa->temp_attrib[i] =
                            TNL_CONTEXT(ctx)->vb.AttribPtr[i];
@@ -2071,8 +2064,9 @@ void r300UpdateShaders(r300ContextPtr rmesa)
                r300SwitchFallback(ctx, R300_FALLBACK_VERTEX_PROGRAM, rmesa->selected_vp->error);
        }
 
-       if (!fp->translated || rmesa->radeon.NewGLState)
-               r300TranslateFragmentShader(ctx, ctx->FragmentProgram._Current);
+       fp = r300SelectFragmentShader(ctx);
+       if (!fp->translated)
+               r300TranslateFragmentShader(ctx, fp);
 
        r300SwitchFallback(ctx, R300_FALLBACK_FRAGMENT_PROGRAM, fp->error);
 
@@ -2104,7 +2098,7 @@ static const GLfloat *get_fragmentprogram_constant(GLcontext *ctx,
 static void r300SetupPixelShader(GLcontext *ctx)
 {
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
-       struct r300_fragment_program *fp = (struct r300_fragment_program *) ctx->FragmentProgram._Current;
+       struct r300_fragment_program *fp = rmesa->selected_fp;
        struct r300_fragment_program_code *code;
        int i, k;
 
@@ -2150,8 +2144,7 @@ static void r300SetupPixelShader(GLcontext *ctx)
        R300_STATECHANGE(rmesa, fpp);
        rmesa->hw.fpp.cmd[R300_FPP_CMD_0] = cmdpacket0(rmesa->radeon.radeonScreen, R300_PFS_PARAM_0_X, code->const_nr * 4);
        for (i = 0; i < code->const_nr; i++) {
-               const GLfloat *constant = get_fragmentprogram_constant(ctx,
-                       &fp->Base.Base, code->constant[i]);
+               const GLfloat *constant = get_fragmentprogram_constant(ctx, fp->Base, code->constant[i]);
                rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 0] = r300PackFloat24(constant[0]);
                rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 1] = r300PackFloat24(constant[1]);
                rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 2] = r300PackFloat24(constant[2]);
@@ -2176,7 +2169,7 @@ static void r300SetupPixelShader(GLcontext *ctx)
 static void r500SetupPixelShader(GLcontext *ctx)
 {
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
-       struct r300_fragment_program *fp = (struct r300_fragment_program *) ctx->FragmentProgram._Current;
+       struct r300_fragment_program *fp = rmesa->selected_fp;
        int i;
        struct r500_fragment_program_code *code;
 
@@ -2212,8 +2205,7 @@ static void r500SetupPixelShader(GLcontext *ctx)
 
        R300_STATECHANGE(rmesa, r500fp_const);
        for (i = 0; i < code->const_nr; i++) {
-               const GLfloat *constant = get_fragmentprogram_constant(ctx,
-                       &fp->Base.Base, code->constant[i]);
+               const GLfloat *constant = get_fragmentprogram_constant(ctx, fp->Base, code->constant[i]);
                rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 0] = r300PackFloat32(constant[0]);
                rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 1] = r300PackFloat32(constant[1]);
                rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 2] = r300PackFloat32(constant[2]);
@@ -2276,20 +2268,17 @@ void r300SetupVAP(GLcontext *ctx, GLuint InputsRead, GLuint OutputsWritten)
 
        rmesa->hw.vic.cmd[R300_VIC_CNTL_0] = r300VAPInputCntl0(ctx, InputsRead);
        rmesa->hw.vic.cmd[R300_VIC_CNTL_1] = r300VAPInputCntl1(ctx, InputsRead);
-       rmesa->hw.vof.cmd[R300_VOF_CNTL_0] = r300VAPOutputCntl0(ctx, OutputsWritten, ctx->FragmentProgram._Current->Base.InputsRead);
-       rmesa->hw.vof.cmd[R300_VOF_CNTL_1] = r300VAPOutputCntl1(ctx, OutputsWritten, ctx->FragmentProgram._Current->Base.InputsRead);
+       rmesa->hw.vof.cmd[R300_VOF_CNTL_0] = r300VAPOutputCntl0(ctx, OutputsWritten, rmesa->selected_fp->Base->InputsRead);
+       rmesa->hw.vof.cmd[R300_VOF_CNTL_1] = r300VAPOutputCntl1(ctx, OutputsWritten, rmesa->selected_fp->Base->InputsRead);
 }
 
 void r300UpdateShaderStates(r300ContextPtr rmesa)
 {
        GLcontext *ctx;
        ctx = rmesa->radeon.glCtx;
-       struct r300_fragment_program *r300_fp;
-
-       r300_fp = (struct r300_fragment_program *) ctx->FragmentProgram._Current;
 
        /* should only happenen once, just after context is created */
-       if (!r300_fp)
+       if (!ctx->FragmentProgram._Current)
                return;
 
        r300SetEarlyZState(ctx);
index ce4179208ebba26579c219b74147c76242a67fa0..db4ccce6f1f9317bfb5fbf6fef8c1c14897e63ea 100644 (file)
@@ -76,7 +76,7 @@ void r300ChooseSwtclVertexFormat(GLcontext *ctx, GLuint *_InputsRead,  GLuint *_
        GLuint InputsRead = 0;
        GLuint OutputsWritten = 0;
        int num_attrs = 0;
-       GLuint fp_reads = ctx->FragmentProgram._Current->Base.InputsRead;
+       GLuint fp_reads = rmesa->selected_fp->Base->InputsRead;
        struct vertex_attribute *attrs = rmesa->vbuf.attribs;
 
        rmesa->swtcl.coloroffset = rmesa->swtcl.specoffset = 0;