1a0ef8d3b534e4e65654ba18429d621c3629ca8f
[mw/milkymist.git] / software / demo / eval.h
1 /*
2  * Milkymist VJ SoC (Software)
3  * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq
4  * 
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, version 3 of the License.
8  * 
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  * 
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #ifndef __EVAL_H
19 #define __EVAL_H
20
21 #include <hw/pfpu.h>
22 #include <hw/tmu.h>
23
24 #include <hal/pfpu.h>
25
26 #include "ast.h"
27
28 /****************************************************************/
29 /* PER-FRAME VARIABLES                                          */
30 /****************************************************************/
31
32 enum {
33         pfv_cx = 0,
34         pfv_cy,
35         pfv_rot,
36         pfv_dx,
37         pfv_dy,
38         pfv_zoom,
39         pfv_decay,
40         pfv_wave_mode,
41         pfv_wave_scale,
42         pfv_wave_additive,
43         pfv_wave_usedots,
44         pfv_wave_maximize_color,
45         pfv_wave_thick,
46         pfv_wave_x,
47         pfv_wave_y,
48         pfv_wave_r,
49         pfv_wave_g,
50         pfv_wave_b,
51         pfv_wave_a,
52
53         pfv_ob_size,
54         pfv_ob_r,
55         pfv_ob_g,
56         pfv_ob_b,
57         pfv_ob_a,
58         pfv_ib_size,
59         pfv_ib_r,
60         pfv_ib_g,
61         pfv_ib_b,
62         pfv_ib_a,
63
64         pfv_mv_x,
65         pfv_mv_y,
66         pfv_mv_dx,
67         pfv_mv_dy,
68         pfv_mv_l,
69         pfv_mv_r,
70         pfv_mv_g,
71         pfv_mv_b,
72         pfv_mv_a,
73
74         pfv_tex_wrap,
75
76         pfv_time,
77         pfv_bass,
78         pfv_mid,
79         pfv_treb,
80         pfv_bass_att,
81         pfv_mid_att,
82         pfv_treb_att,
83         
84         EVAL_PFV_COUNT /* must be last */
85 };
86
87 struct eval_state;
88
89 /* fills in a task descriptor to evaluate per-frame equations */
90 void eval_pfv_fill_td(struct eval_state *sc, struct pfpu_td *td, pfpu_callback callback, void *user);
91
92 /* restores preset's initial conditions (and reset user variables) */
93 void eval_reset_pfv(struct eval_state *sc);
94
95 /* restore a variable's initial condition */
96 int eval_reinit_pfv(struct eval_state *sc, int pfv);
97
98 /* restore all variable's initial conditions (and keep user variables) */
99 void eval_reinit_all_pfv(struct eval_state *sc);
100
101 /* reads the value of a per-frame variable
102  * (from perframe_regs_current or initial conditions)
103  * always returns a correct value; if the variable is not
104  * in the preset, a default value is returned.
105  */
106 float eval_read_pfv(struct eval_state *sc, int pfv);
107
108 /* writes the value of a per-frame variable (to perframe_regs_current)
109  * does nothing if the variable is not handled by the PFPU.
110  * typically used for preset inputs (treb, bass, etc.)
111  */
112 void eval_write_pfv(struct eval_state *sc, int pfv, float x);
113
114 /****************************************************************/
115 /* PER-VERTEX VARIABLES                                         */
116 /****************************************************************/
117
118 /* TODO: use texsize */
119
120 enum {
121         /* System */
122         pvv_hmeshsize = 0,
123         pvv_vmeshsize,
124         pvv_hres,
125         pvv_vres,
126
127         /* MilkDrop */
128         pvv_cx,
129         pvv_cy,
130         pvv_rot,
131         pvv_dx,
132         pvv_dy,
133         pvv_zoom,
134         
135         EVAL_PVV_COUNT /* must be last */
136 };
137
138 /* transfer relevant per-frame variables to the per-vertex variable pool */
139 void eval_pfv_to_pvv(struct eval_state *sc);
140
141 /* fills in a task descriptor to evaluate per-vertex equations */
142 void eval_pvv_fill_td(struct eval_state *sc, struct pfpu_td *td, struct tmu_vertex *vertices, pfpu_callback callback, void *user);
143
144 /****************************************************************/
145 /* GENERAL                                                      */
146 /****************************************************************/
147
148 struct eval_state {
149         float pfv_initial[EVAL_PFV_COUNT];              /* < preset initial conditions */
150         int pfv_allocation[EVAL_PFV_COUNT];             /* < where per-frame variables are mapped in PFPU regf, -1 if unmapped */
151         int perframe_prog_length;                       /* < how many instructions in perframe_prog */
152         pfpu_instruction perframe_prog[PFPU_PROGSIZE];  /* < PFPU per-frame microcode */
153         float perframe_regs_init[PFPU_REG_COUNT];       /* < PFPU regf according to initial conditions and constants */
154         float perframe_regs_current[PFPU_REG_COUNT];    /* < PFPU regf local copy (keeps data when PFPU is reloaded) */
155
156         int pvv_allocation[EVAL_PVV_COUNT];             /* < where per-vertex variables are mapped in PFPU regf, -1 if unmapped */
157         int pervertex_prog_length;                      /* < how many instructions in pervertex_prog */
158         pfpu_instruction pervertex_prog[PFPU_PROGSIZE]; /* < PFPU per-vertex microcode */
159         float pervertex_regs[PFPU_REG_COUNT];           /* < PFPU regf according to per-frame variables, initial conditions and constants */
160         int hmeshlast;                                  /* < index of last mesh point, X direction */
161         int vmeshlast;                                  /* < index of last mesh point, Y direction */
162         int hres;                                       /* < horizontal screen resolution */
163         int vres;                                       /* < vertical screen resolution */
164 };
165
166 void eval_init(struct eval_state *sc,
167         unsigned int hmeshlast, unsigned int vmeshlast,
168         unsigned int hres, unsigned int vres);
169 int eval_load_preset(struct eval_state *sc, struct preset *ast);
170
171 #endif /* __EVAL_H */