diff options
Diffstat (limited to 'src/mesa/main/texenvprogram.c')
-rw-r--r-- | src/mesa/main/texenvprogram.c | 49 |
1 files changed, 29 insertions, 20 deletions
diff --git a/src/mesa/main/texenvprogram.c b/src/mesa/main/texenvprogram.c index 18d704ce1b6..43dda28f263 100644 --- a/src/mesa/main/texenvprogram.c +++ b/src/mesa/main/texenvprogram.c @@ -1130,32 +1130,41 @@ void _mesa_UpdateTexEnvProgram( GLcontext *ctx ) { struct state_key *key; GLuint hash; + struct fragment_program *prev = ctx->FragmentProgram._Current; - if (ctx->FragmentProgram._Enabled) - return; - - key = make_state_key(ctx); - hash = hash_key(key); - - ctx->FragmentProgram._Current = ctx->_TexEnvProgram = - (struct fragment_program *) - search_cache(ctx->Texture.env_fp_cache, hash, key, sizeof(*key)); + if (!ctx->FragmentProgram._Enabled) { + key = make_state_key(ctx); + hash = hash_key(key); + + ctx->FragmentProgram._Current = ctx->_TexEnvProgram = + (struct fragment_program *) + search_cache(ctx->Texture.env_fp_cache, hash, key, sizeof(*key)); - if (!ctx->_TexEnvProgram) { - if (0) _mesa_printf("Building new texenv proggy for key %x\n", hash); + if (!ctx->_TexEnvProgram) { + if (1) _mesa_printf("Building new texenv proggy for key %x\n", hash); - ctx->FragmentProgram._Current = ctx->_TexEnvProgram = - (struct fragment_program *) - ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 0); + ctx->FragmentProgram._Current = ctx->_TexEnvProgram = + (struct fragment_program *) + ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 0); - create_new_program(key, ctx, ctx->_TexEnvProgram); + create_new_program(key, ctx, ctx->_TexEnvProgram); - cache_item(&ctx->Texture.env_fp_cache, hash, key, ctx->_TexEnvProgram); - } else { - FREE(key); - if (0) _mesa_printf("Found existing texenv program for key %x\n", hash); + cache_item(&ctx->Texture.env_fp_cache, hash, key, ctx->_TexEnvProgram); + } else { + FREE(key); + if (1) _mesa_printf("Found existing texenv program for key %x\n", hash); + } + } + else { + ctx->FragmentProgram._Current = ctx->FragmentProgram.Current; } - + + /* Tell the driver about the change. Could define a new target for + * this? + */ + if (ctx->FragmentProgram._Current != prev) + ctx->Driver.BindProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, (struct program *) + ctx->FragmentProgram._Current); } void _mesa_TexEnvProgramCacheDestroy( GLcontext *ctx ) |