struct gl_fragment_program_state { unsigned char _Enabled; struct gl_fragment_program *_TexEnvProgram; }; struct gl_shader_state { struct gl_shader_program *CurrentProgram; }; struct gl_constants { unsigned int MaxTextureUnits; } GLvertexformat; typedef struct { struct gl_constants Const; struct gl_fragment_program_state FragmentProgram; struct gl_shader_state Shader; } GLcontext; struct mode_opt { }; struct state_key { unsigned int enabled_units; struct { unsigned int NumArgsRGB:2; unsigned int ModeRGB:4; struct mode_opt OptRGB[3]; unsigned int ModeA:4; } unit[8]; }; struct ureg { unsigned int file:4; unsigned int idx:8; }; struct texenv_fragment_program { struct ureg src_previous; }; static struct ureg emit_combine(struct texenv_fragment_program *p, struct ureg dest, unsigned int mask, unsigned char saturate, unsigned int unit, unsigned int nr, unsigned int mode, const struct mode_opt *opt) { struct ureg src[3]; switch (mode) { case 6:{ struct ureg tmp0; struct ureg neg1; struct ureg two; emit_arith(p, 0, tmp0, 0xf, 0, two, src[0], neg1); } } } static struct ureg emit_texenv(struct texenv_fragment_program *p, unsigned int unit) { struct state_key *key; unsigned char saturate; struct ureg out; struct ureg dest; if (key->unit[unit].ModeRGB == key->unit[unit].ModeA && args_match(key, unit)) out = emit_combine(p, dest, 0xf, saturate, unit, key->unit[unit].NumArgsRGB, key->unit[unit].ModeRGB, key->unit[unit].OptRGB); } static void create_new_program(GLcontext * ctx, struct state_key *key, struct gl_fragment_program *program) { struct texenv_fragment_program p; unsigned int unit; for (; unit < ctx->Const.MaxTextureUnits; ++unit) p.src_previous = emit_texenv(&p, unit); } _mesa_UpdateTexEnvProgram() { GLcontext *ctx; struct state_key key; if (!ctx->FragmentProgram._Enabled) if (!ctx->Shader.CurrentProgram) if (!ctx->FragmentProgram._TexEnvProgram) create_new_program(ctx, &key, ctx->FragmentProgram._TexEnvProgram); }