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 { unsigned int Source:4; unsigned int Operand:3; }; 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; }; static const struct ureg undef = { 0, ~0, 0, 0, 0, 0, 0 }; struct texenv_fragment_program { struct state_key *state; struct ureg src_texture[8]; struct ureg src_previous; unsigned int last_tex_stage; }; static struct ureg get_temp(struct texenv_fragment_program *p) { } static struct ureg register_const4f(struct texenv_fragment_program *p, float s0, float s1, float s2, float s3) { } static struct ureg emit_combine_source(struct texenv_fragment_program *p, unsigned int mask, unsigned int unit, unsigned int source, unsigned int operand) { } 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]; unsigned int i; for (i = 0; i < nr; i++) src[i] = emit_combine_source(p, mask, unit, opt[i].Source, opt[i].Operand); switch (mode) { case 6:{ struct ureg tmp0; struct ureg neg1; struct ureg two; neg1 = register_const4f(p, -1, -1, -1, -1); two = register_const4f(p, 2, 2, 2, 2); 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 shift; struct ureg dest; key = p->state; saturate = (unit < p->last_tex_stage); 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 = 0; unit < 8; unit++) p.src_texture[unit] = undef; if (key->enabled_units) for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) if (key->enabled_units & (1 << unit)) p.src_previous = emit_texenv(&p, unit); } void _mesa_UpdateTexEnvProgram(GLcontext * ctx) { struct state_key key; if (!ctx->FragmentProgram._Enabled && !ctx->Shader.CurrentProgram) if (!ctx->FragmentProgram._TexEnvProgram) create_new_program(ctx, &key, ctx->FragmentProgram._TexEnvProgram); }