OpenCores
URL https://opencores.org/ocsvn/theia_gpu/theia_gpu/trunk

Subversion Repositories theia_gpu

[/] [theia_gpu/] [tags/] [Beta_0.2/] [rtl/] [MEM/] [Module_ROM.v] - Blame information for rev 74

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 21 diegovalve
 
2
 
3
`define ONE (32'h1 << `SCALE)
4
 
5
`timescale 1ns / 1ps
6
`include "aDefinitions.v"
7
/**********************************************************************************
8
Theia, Ray Cast Programable graphic Processing Unit.
9
Copyright (C) 2010  Diego Valverde (diego.valverde.g@gmail.com)
10
 
11
This program is free software; you can redistribute it and/or
12
modify it under the terms of the GNU General Public License
13
as published by the Free Software Foundation; either version 2
14
of the License, or (at your option) any later version.
15
 
16
This program is distributed in the hope that it will be useful,
17
but WITHOUT ANY WARRANTY; without even the implied warranty of
18
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
GNU General Public License for more details.
20
 
21
You should have received a copy of the GNU General Public License
22
along with this program; if not, write to the Free Software
23
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
24
 
25
***********************************************************************************/
26
 
27 60 diegovalve
/*
28
I can't synthesize roms, the rom needs to be adapted depending on the
29
final target silicon.
30
*/
31 21 diegovalve
 
32
 
33
//--------------------------------------------------------
34
module ROM
35
(
36
        input  wire[`ROM_ADDRESS_WIDTH-1:0]              Address,
37
        output reg [`INSTRUCTION_WIDTH-1:0]              I
38
);
39
 
40
 
41
always @( Address )
42
begin
43
                        case (Address)
44
 
45
//Hardcoded stuff :(
46
`define RAY_INSIDE_BOX                          `R3
47
`define CURRENT_LIGHT_POS `CREG_FIRST_LIGTH  //TODO: CAHNEG T 
48
`define CURRENT_LIGHT_DIFFUSE 16'h6
49
 
50
//-----------------------------------------------------------------
51
`define LABEL_DEBUG_PRINT_REGS 16'd221
52
`define TAG_DEBUG_LOG_REGISTERS 16'd221
53
`define TAG_PSU_UCODE_ADRESS2 16'd212
54
`define TAG_PSU_UCODE_ADRESS 16'd196
55
`define LABEL_TCC_EXIT 16'd195
56
`define TAG_TCC_UCODE_ADDRESS 16'd154
57
`define LABEL_BIU4 16'd153
58
`define LABEL_BIU3 16'd143
59
`define LABEL_BIU2 16'd140
60
`define LABEL_BIU1 16'd138
61
`define TAG_BIU_UCODE_ADDRESS 16'd121
62
`define LABEL_HIT 16'd119
63
`define LABEL15 16'd117
64
`define LABEL14 16'd115
65
`define LABEL13 16'd113
66
`define LABEL_TEST_XY_PLANE 16'd108
67
`define LABEL12 16'd106
68
`define LABEL11 16'd104
69
`define LABEL10 16'd102
70
`define LABEL_TEST_XZ_PLANE 16'd96
71
`define LABEL9 16'd94
72
`define LABEL8 16'd92
73
`define LABEL7 16'd90
74
`define LABEL_TEST_YZ_PLANE 16'd84
75
`define LABEL_RAY_INSIDE_BOX 16'd81
76
`define LABEL_ELSEZ 16'd80
77
`define LABEL6 16'd77
78
`define LABEL_ELESE_IFZ 16'd73
79
`define LABEL5 16'd70
80
`define LABEL_TEST_RAY_Z_ORIGEN 16'd66
81
`define LABEL_ELSEY 16'd65
82
`define LABEL4 16'd62
83
`define LABEL_ELESE_IFY 16'd58
84
`define LABEL3 16'd55
85
`define LABEL_TEST_RAY_Y_ORIGEN 16'd51
86
`define LABEL_ELSEX 16'd50
87
`define LABEL2 16'd47
88
`define LABEL_ELSE_IFX 16'd43
89
`define LABEL1 16'd40
90
`define LABEL_TEST_RAY_X_ORIGEN 16'd36
91
`define TAG_AABBIU_UCODE_ADDRESS 16'd33
92
`define LABEL_NPG_NEXT_ROW 16'd30
93
`define TAG_NPG_UCODE_ADDRESS 16'd24
94
`define TAG_RGU_UCODE_ADDRESS 16'd17
95
`define TAG_CPPU_UCODE_ADDRESS 16'd14
96
//This is the Code that loads in THEIAs ROM
97
 
98
//-------------------------------------------------------------------------
99
//Default values for some registers after reset
100
 
101
 
102
 
103 60 diegovalve
 0: I =  { `ZERO ,`CREG_LAST_t ,`VOID ,`VOID };
104 21 diegovalve
 //Set the last 't' to very positive value(500) 
105 60 diegovalve
 1: I =  { `SETX ,`CREG_LAST_t ,32'h1F40000  };
106
2: I =  { `ZERO ,`OREG_PIXEL_COLOR ,`VOID ,`VOID };
107 74 diegovalve
3: I =  { `COPY ,`CREG_PIXEL_2D_POSITION,`CREG_PIXEL_2D_INITIAL_POSITION, `VOID   };
108 60 diegovalve
4: I =  { `ZERO ,`OREG_PIXEL_PITCH ,`VOID,`VOID};
109
5: I =  { `ZERO ,`R1 ,`VOID ,`VOID };
110
6: I =  { `ZERO ,`R2 ,`VOID ,`VOID };
111
7: I =  { `ZERO ,`R3 ,`VOID ,`VOID };
112
8: I =  { `ZERO ,`R4 ,`VOID ,`VOID };
113
9: I =  { `ZERO ,`R5 ,`VOID ,`VOID };
114 21 diegovalve
 //Harode texture size for now ...
115 60 diegovalve
10: I =  { `NOP ,`RT_FALSE   };//{ `SETX ,`CREG_TEXTURE_SIZE ,32'h1FE0000  }; 
116
11: I =  { `NOP ,`RT_FALSE   };//{ `SETY ,`CREG_TEXTURE_SIZE ,32'h1FE0000  }; 
117 74 diegovalve
12: I =  { `RETURN ,`RT_TRUE   };
118
13: I =  { `NOP ,`RT_FALSE   };//{ `SETZ ,`CREG_TEXTURE_SIZE ,32'h1FE0000  }; 
119
 
120 21 diegovalve
 
121
 
122
//----------------------------------------------------------------------          
123
//Micro code for CPPU
124
//TAG_CPPU_UCODE_ADDRESS:
125
 
126
 
127 60 diegovalve
14: I =  { `SUB ,`R1 ,`CREG_PROJECTION_WINDOW_MAX ,`CREG_PROJECTION_WINDOW_MIN };
128
15: I =  { `DIV ,`CREG_PROJECTION_WINDOW_SCALE ,`R1 ,`CREG_RESOLUTION };
129
16: I =  { `RETURN ,`RT_FALSE   };
130 21 diegovalve
 
131
//----------------------------------------------------------------------          
132
//Micro code for RGU
133
//TAG_RGU_UCODE_ADDRESS:
134
 
135
 
136 60 diegovalve
17: I =  { `MUL ,`R1 ,`CREG_PIXEL_2D_POSITION ,`CREG_PROJECTION_WINDOW_SCALE };
137
18: I =  { `ADD ,`R1 ,`R1 ,`CREG_PROJECTION_WINDOW_MIN };
138
19: I =  { `SUB ,`CREG_UNORMALIZED_DIRECTION ,`R1 ,`CREG_CAMERA_POSITION };
139
20: I =  { `MAG ,`R2 ,`CREG_UNORMALIZED_DIRECTION ,`VOID };
140
21: I =  { `DIV ,`CREG_RAY_DIRECTION ,`CREG_UNORMALIZED_DIRECTION ,`R2 };
141
22: I =  { `DEC,`CREG_LAST_COL,`CREG_RESOLUTION,`VOID};//{ `ZERO ,`R3 ,`VOID ,`VOID }; 
142
23: I =  { `RETURN ,`RT_FALSE   };
143 21 diegovalve
//----------------------------------------------------------------------
144
//Next Pixel generation Code (NPG)
145
//TAG_NPG_UCODE_ADDRESS:
146
 
147 60 diegovalve
24: I =  { `ZERO ,`R1 ,`VOID ,`VOID };
148
25: I =  { `SETX ,`R1 ,32'h00003  };
149
26: I =  { `ADD ,`OREG_PIXEL_PITCH ,`OREG_PIXEL_PITCH ,`R1 };
150 21 diegovalve
 
151 60 diegovalve
27: I =  { `JEQX ,`LABEL_NPG_NEXT_ROW ,`CREG_PIXEL_2D_POSITION ,`CREG_LAST_COL }; //HERE WE ARE CALCULATING ELEMENT 200 :(
152
28: I =  { `INCX ,`CREG_PIXEL_2D_POSITION ,`CREG_PIXEL_2D_POSITION ,`VOID };
153
29: I =  { `RETURN ,`RT_TRUE   };
154 21 diegovalve
//LABEL_NPG_NEXT_ROW:
155 60 diegovalve
30: I =  { `SETX ,`CREG_PIXEL_2D_POSITION ,32'h0  };
156
31: I =  { `INCY ,`CREG_PIXEL_2D_POSITION ,`CREG_PIXEL_2D_POSITION,`VOID  };
157
32: I =  { `RETURN ,`RT_TRUE   };
158 21 diegovalve
 
159
//----------------------------------------------------------------------
160
//Micro code for AABBIU
161
//TAG_AABBIU_UCODE_ADDRESS:
162
 
163 60 diegovalve
33: I =  { `ZERO ,`R3 ,`VOID ,`VOID };
164 74 diegovalve
34: I =  { `SETX ,`CREG_LAST_t ,32'h1F40000  }; //{ `ZERO ,`R5 ,`VOID ,`VOID }; 
165
35: I =  { `RETURN ,`RT_TRUE };//{ `ZERO ,`R6, `VOID, `VOID }; 
166 21 diegovalve
 
167
//LABEL_TEST_RAY_X_ORIGEN:
168 60 diegovalve
36: I =  { `JGEX ,`LABEL_ELSE_IFX ,`CREG_CAMERA_POSITION ,`CREG_AABBMIN };
169
37: I =  { `SUB ,`R1 ,`CREG_AABBMIN ,`CREG_CAMERA_POSITION };
170
38: I =  { `JLEX ,`LABEL1 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
171
39: I =  { `RETURN ,`RT_FALSE   };
172 21 diegovalve
 
173
//LABEL1:
174 60 diegovalve
40: I =  { `SETX ,`RAY_INSIDE_BOX ,32'd0  };
175
41: I =  { `DIV ,`R6 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
176
42: I =  { `JMP ,`LABEL_TEST_RAY_Y_ORIGEN ,`VOID ,`VOID };
177 21 diegovalve
 
178
//LABEL_ELSE_IFX:
179 60 diegovalve
43: I =  { `JLEX ,`LABEL_ELSEX ,`CREG_CAMERA_POSITION ,`CREG_AABBMAX };
180
44: I =  { `SUB ,`R1 ,`CREG_AABBMAX ,`CREG_CAMERA_POSITION };
181
45: I =  { `JGEX ,`LABEL2 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
182
46: I =  { `RETURN ,`RT_FALSE   };
183 21 diegovalve
 
184
//LABEL2:
185 60 diegovalve
47: I =  { `SETX ,`RAY_INSIDE_BOX ,32'd0  };
186
48: I =  { `DIV ,`R6 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
187
49: I =  { `JMP ,`LABEL_TEST_RAY_Y_ORIGEN ,`VOID ,`VOID };
188 21 diegovalve
//LABEL_ELSEX:
189 60 diegovalve
50: I =  { `SETX ,`R5 ,32'b1  };
190 21 diegovalve
 
191
//LABEL_TEST_RAY_Y_ORIGEN:
192 60 diegovalve
51: I =  { `JGEY ,`LABEL_ELESE_IFY ,`CREG_CAMERA_POSITION ,`CREG_AABBMIN };
193
52: I =  { `SUB ,`R1 ,`CREG_AABBMIN ,`CREG_CAMERA_POSITION };
194
53: I =  { `JLEY ,`LABEL3 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
195
54: I =  { `RETURN ,`RT_FALSE   };
196 21 diegovalve
 
197
//LABEL3:
198 60 diegovalve
55: I =  { `SETX ,`RAY_INSIDE_BOX ,32'd0  };
199
56: I =  { `DIV ,`R6 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
200
57: I =  { `JMP ,`LABEL_TEST_RAY_Z_ORIGEN ,`VOID ,`VOID };
201 21 diegovalve
 
202
//LABEL_ELESE_IFY:
203 60 diegovalve
58: I =  { `JLEY ,`LABEL_ELSEY ,`CREG_CAMERA_POSITION ,`CREG_AABBMAX };
204
59: I =  { `SUB ,`R1 ,`CREG_AABBMAX ,`CREG_CAMERA_POSITION };
205
60: I =  { `JGEY ,`LABEL4 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
206
61: I =  { `RETURN ,`RT_FALSE   };
207 21 diegovalve
 
208
//LABEL4:
209 60 diegovalve
62: I =  { `SETX ,`RAY_INSIDE_BOX ,32'd0  };
210
63: I =  { `DIV ,`R6 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
211
64: I =  { `JMP ,`LABEL_TEST_RAY_Z_ORIGEN ,`VOID ,`VOID };
212 21 diegovalve
 
213
//LABEL_ELSEY:
214 60 diegovalve
65: I =  { `SETY ,`R5 ,32'b1  };
215 21 diegovalve
 
216
//LABEL_TEST_RAY_Z_ORIGEN:
217 60 diegovalve
66: I =  { `JGEZ ,`LABEL_ELESE_IFZ ,`CREG_CAMERA_POSITION ,`CREG_AABBMIN };
218
67: I =  { `SUB ,`R1 ,`CREG_AABBMIN ,`CREG_CAMERA_POSITION };
219
68: I =  { `JLEZ ,`LABEL5 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
220
69: I =  { `RETURN ,`RT_FALSE   };
221 21 diegovalve
 
222
//LABEL5:
223 60 diegovalve
70: I =  { `SETX ,`RAY_INSIDE_BOX ,32'd0  };
224
71: I =  { `DIV ,`R6 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
225
72: I =  { `JMP ,`LABEL_RAY_INSIDE_BOX ,`VOID ,`VOID };
226 21 diegovalve
 
227
//LABEL_ELESE_IFZ:
228 60 diegovalve
73: I =  { `JLEZ ,`LABEL_ELSEZ ,`CREG_CAMERA_POSITION ,`CREG_AABBMAX };
229
74: I =  { `SUB ,`R1 ,`CREG_AABBMAX ,`CREG_CAMERA_POSITION };
230
75: I =  { `JGEZ ,`LABEL6 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
231
76: I =  { `RETURN ,`RT_FALSE   };
232 21 diegovalve
 
233
//LABEL6:
234 60 diegovalve
77: I =  { `SETX ,`RAY_INSIDE_BOX ,32'd0  };
235
78: I =  { `DIV ,`R6 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
236
79: I =  { `JMP ,`LABEL_RAY_INSIDE_BOX ,`VOID ,`VOID };
237 21 diegovalve
 
238
//LABEL_ELSEZ:
239 60 diegovalve
80: I =  { `SETZ ,`R5 ,32'b1  };
240 21 diegovalve
 
241
//LABEL_RAY_INSIDE_BOX:
242 60 diegovalve
81: I =  { `ZERO ,`R1 ,`VOID ,`VOID };
243
82: I =  { `JEQX ,`LABEL_TEST_YZ_PLANE ,`R1 ,`RAY_INSIDE_BOX };
244 74 diegovalve
//BUG, need a NOP here, else pipeline gets confused
245 60 diegovalve
83: I =  { `RETURN ,`RT_TRUE   };
246 21 diegovalve
 
247
//LABEL_TEST_YZ_PLANE:
248 60 diegovalve
84: I =  { `JNEX ,`LABEL_TEST_XZ_PLANE ,`R5 ,`R1 };
249
85: I =  { `SWIZZLE3D ,`R6 ,`SWIZZLE_XXX  };
250
86: I =  { `MUL ,`R2 ,`CREG_UNORMALIZED_DIRECTION ,`R6 };
251
87: I =  { `ADD ,`R2 ,`R2 ,`CREG_CAMERA_POSITION };
252
88: I =  { `JGEY ,`LABEL7 ,`R2 ,`CREG_AABBMIN };
253
89: I =  { `RETURN ,`RT_FALSE   };
254 21 diegovalve
 
255
//LABEL7:
256 60 diegovalve
90: I =  { `JLEY ,`LABEL8 ,`R2 ,`CREG_AABBMAX };
257
91: I =  { `RETURN ,`RT_FALSE   };
258 21 diegovalve
 
259
//LABEL8:
260 60 diegovalve
92: I =  { `JGEZ ,`LABEL9 ,`R2 ,`CREG_AABBMIN };
261
93: I =  { `RETURN ,`RT_FALSE   };
262 21 diegovalve
 
263
//LABEL9:
264 60 diegovalve
94: I =  { `JLEZ ,`LABEL_TEST_XZ_PLANE ,`R2 ,`CREG_AABBMAX };
265
95: I =  { `RETURN ,`RT_FALSE   };
266 21 diegovalve
 
267
//LABEL_TEST_XZ_PLANE:
268 60 diegovalve
96: I =  { `JNEY ,`LABEL_TEST_XY_PLANE ,`R5 ,`R1 };
269
97: I =  { `SWIZZLE3D ,`R6 ,`SWIZZLE_YYY  };
270
98: I =  { `MUL ,`R2 ,`CREG_UNORMALIZED_DIRECTION ,`R6 };
271
99: I =  { `ADD ,`R2 ,`R2 ,`CREG_CAMERA_POSITION };
272
100: I =  { `JGEX ,`LABEL10 ,`R2 ,`CREG_AABBMIN };
273
101: I =  { `RETURN ,`RT_FALSE   };
274 21 diegovalve
 
275
//LABEL10:
276 60 diegovalve
102: I =  { `JLEX ,`LABEL11 ,`R2 ,`CREG_AABBMAX };
277
103: I =  { `RETURN ,`RT_FALSE   };
278 21 diegovalve
 
279
//LABEL11:
280 60 diegovalve
104: I =  { `JGEZ ,`LABEL12 ,`R2 ,`CREG_AABBMIN };
281
105: I =  { `RETURN ,`RT_FALSE   };
282 21 diegovalve
 
283
//LABEL12:
284 60 diegovalve
106: I =  { `JLEZ ,`LABEL_TEST_XY_PLANE ,`R2 ,`CREG_AABBMAX };
285
107: I =  { `RETURN ,`RT_FALSE   };
286 21 diegovalve
 
287
//LABEL_TEST_XY_PLANE:
288 60 diegovalve
108: I =  { `SWIZZLE3D ,`R6 ,`SWIZZLE_ZZZ  };
289
109: I =  { `MUL ,`R2 ,`CREG_UNORMALIZED_DIRECTION ,`R6 };
290
110: I =  { `ADD ,`R2 ,`R2 ,`CREG_CAMERA_POSITION };
291
111: I =  { `JGEX ,`LABEL13 ,`R2 ,`CREG_AABBMIN };
292
112: I =  { `RETURN ,`RT_FALSE   };
293 21 diegovalve
 
294
//LABEL13:
295 60 diegovalve
113: I =  { `JLEX ,`LABEL14 ,`R2 ,`CREG_AABBMAX };
296
114: I =  { `RETURN ,`RT_FALSE   };
297 21 diegovalve
 
298
//LABEL14:
299 60 diegovalve
115: I =  { `JGEY ,`LABEL15 ,`R2 ,`CREG_AABBMIN };
300
116: I =  { `RETURN ,`RT_FALSE   };
301 21 diegovalve
 
302
//LABEL15:
303 60 diegovalve
117: I =  { `JLEY ,`LABEL_HIT ,`R2 ,`CREG_AABBMAX };
304
118: I =  { `RETURN ,`RT_FALSE   };
305 21 diegovalve
 
306
//LABEL_HIT:
307 60 diegovalve
119: I =  { `SETX ,`CREG_LAST_t ,32'h1F40000  };
308
120: I =  { `RETURN ,`RT_TRUE   };
309 21 diegovalve
 
310
 //------------------------------------------------------------------------
311
 //BIU Micro code
312
//TAG_BIU_UCODE_ADDRESS:
313
 
314 60 diegovalve
121: I =  { `ZERO ,`OREG_PIXEL_COLOR ,`VOID ,`VOID };
315
122: I =  { `SETX ,`R3 ,`ONE  };
316
123: I =  { `SETX ,`R1 ,32'h00000  };
317
124: I =  { `SUB ,`CREG_E1 ,`CREG_V1 ,`CREG_V0 };
318
125: I =  { `SUB ,`CREG_E2 ,`CREG_V2 ,`CREG_V0 };
319
126: I =  { `SUB ,`CREG_T ,`CREG_CAMERA_POSITION ,`CREG_V0 };
320
127: I =  { `CROSS ,`CREG_P ,`CREG_RAY_DIRECTION ,`CREG_E2 };
321
128: I =  { `CROSS ,`CREG_Q ,`CREG_T ,`CREG_E1 };
322
129: I =  { `DOT ,`CREG_H1 ,`CREG_Q ,`CREG_E2 };
323
130: I =  { `DOT ,`CREG_H2 ,`CREG_P ,`CREG_T };
324
131: I =  { `DOT ,`CREG_H3 ,`CREG_Q ,`CREG_RAY_DIRECTION };
325
132: I =  { `DOT ,`CREG_DELTA ,`CREG_P ,`CREG_E1 };
326
133: I =  { `DIV ,`CREG_t ,`CREG_H1 ,`CREG_DELTA };
327
134: I =  { `DIV ,`CREG_u ,`CREG_H2 ,`CREG_DELTA };
328
135: I =  { `DIV ,`CREG_v ,`CREG_H3 ,`CREG_DELTA };
329
136: I =  { `JGEX ,`LABEL_BIU1 ,`CREG_u ,`R1 };
330
137: I =  { `RETURN ,`RT_FALSE   };
331 21 diegovalve
 
332
//LABEL_BIU1:
333 60 diegovalve
138: I =  { `JGEX ,`LABEL_BIU2 ,`CREG_v ,`R1 };
334
139: I =  { `RETURN ,`RT_FALSE   };
335 21 diegovalve
 
336
//LABEL_BIU2:
337 60 diegovalve
140: I =  { `ADD ,`R2 ,`CREG_u ,`CREG_v };
338
141: I =  { `JLEX ,`LABEL_BIU3 ,`R2 ,`R3 };
339
142: I =  { `RETURN ,`RT_FALSE   };
340 21 diegovalve
 
341
//LABEL_BIU3:
342 60 diegovalve
143: I =  { `JGEX ,`LABEL_BIU4 ,`CREG_t ,`CREG_LAST_t };
343
144: I =  { `COPY ,`CREG_LAST_t ,`CREG_t ,`VOID };
344
145: I =  { `COPY ,`CREG_LAST_u ,`CREG_u ,`VOID };
345
146: I =  { `COPY ,`CREG_LAST_v ,`CREG_v ,`VOID };
346
147: I =  { `COPY ,`CREG_E1_LAST ,`CREG_E1 ,`VOID };
347
148: I =  { `COPY ,`CREG_E2_LAST ,`CREG_E2 ,`VOID };
348
149: I =  { `COPY ,`CREG_UV0_LAST ,`CREG_UV0 ,`VOID };
349
150: I =  { `COPY ,`CREG_UV1_LAST ,`CREG_UV1 ,`VOID };
350
151: I =  { `COPY ,`CREG_UV2_LAST ,`CREG_UV2 ,`VOID };
351
152: I =  { `COPY ,`CREG_TRI_DIFFUSE_LAST ,`CREG_TRI_DIFFUSE ,`VOID };
352 21 diegovalve
//LABEL_BIU4:
353 60 diegovalve
153: I =  { `RETURN ,`RT_TRUE   };
354 21 diegovalve
 
355
 
356
//-------------------------------------------------------------------------
357
//Calculate the adress of the texure coordiantes.
358
 
359
//TAG_TCC_UCODE_ADDRESS:
360
//Do this calculation only if this triangle is the one closest to the camera
361 60 diegovalve
154: I =  { `JGX ,`LABEL_TCC_EXIT ,`CREG_t ,`CREG_LAST_t };
362 21 diegovalve
 
363
//First get the UV coodrinates and store in R1
364
//R1x: u_coordinate = U0 + last_u * (U1 - U0) + last_v * (U2 - U0);
365
//R1y: v_coordinate = V0 + last_u * (V1 - V0) + last_v * (V2 - V0);
366
//R1z: 0
367
 
368 60 diegovalve
155: I =  { `SUB ,`R1 ,`CREG_UV1_LAST ,`CREG_UV0_LAST };
369
156: I =  { `SUB ,`R2 ,`CREG_UV2_LAST ,`CREG_UV0_LAST };
370
157: I =  { `MUL ,`R1 ,`CREG_LAST_u ,`R1 };
371
158: I =  { `MUL ,`R2 ,`CREG_LAST_v ,`R2 };
372
159: I =  { `ADD ,`R1 ,`R1 ,`R2 };
373 74 diegovalve
160: I =  { `ADD ,`R1 ,`R1 ,`CREG_UV0_LAST };
374 21 diegovalve
 
375
//R7x : fu = (u_coordinate) * gTexture.mWidth;
376
//R7y : fv = (v_coordinate) * gTexture.mWidth;
377
//R7z : 0
378 60 diegovalve
161: I =  { `MUL ,`R7 ,`R1 ,`CREG_TEXTURE_SIZE };
379 21 diegovalve
 
380
//R1x: u1 = ((int)fu) % gTexture.mWidth;
381
//R1y: v1 = ((int)fv) % gTexture.mHeight;
382
//R1z: 0
383
//R2x: u2 = (u1 + 1 ) % gTexture.mWidth;
384
//R2y: v2 = (v2 + 1 ) % gTexture.mHeight;
385
//R2z: 0
386
// Notice MOD2 only operates over
387
// numbers that are power of 2, also notice that the
388
// textures are assumed to be squares!
389
//x % 2^n == x & (2^n - 1).
390
 
391 60 diegovalve
162: I =  { `MOD ,`R1 ,`R7 ,`CREG_TEXTURE_SIZE };
392
163: I =  { `INC ,`R2 ,`R1 ,`VOID };
393
164: I =  { `MOD ,`R2 ,`R2 ,`CREG_TEXTURE_SIZE };
394 21 diegovalve
 
395
//Cool, now we should store the values in the appropiate registers
396
//OREG_TEX_COORD1.x = u1 + v1 * gTexture.mWidth
397
//OREG_TEX_COORD1.y = u2 + v1 * gTexture.mWidth
398
//OREG_TEX_COORD1.z = 0
399
//OREG_TEX_COORD2.x = u1 + v2 * gTexture.mWidth
400
//OREG_TEX_COORD2.y = u2 + v2 * gTexture.mWidth
401
//OREG_TEX_COORD1.z = 0
402
 
403
//R1= [u1, v1, 0]
404
//R2= [u2, v2, 0]
405
 
406
//R2 = [v2, u2, 0]
407 60 diegovalve
165: I =  { `SWIZZLE3D ,`R2 ,`SWIZZLE_YXZ  };
408 21 diegovalve
 
409
//R3 = [v2 v1 0]
410 60 diegovalve
166: I =  { `XCHANGEX ,`R3 ,`R1 ,`R2 };
411 21 diegovalve
 
412
 
413
//R4 = [u1, u2 0]
414 60 diegovalve
167: I =  { `XCHANGEX ,`R4 ,`R2 ,`R1 };
415 21 diegovalve
 
416
//R2 = [v2*H, v1*H, 0]
417 60 diegovalve
168: I =  { `UNSCALE ,`R9 ,`R3 ,`VOID };
418
169: I =  { `UNSCALE ,`R8 ,`CREG_TEXTURE_SIZE ,`VOID };
419
170: I =  { `IMUL ,`R2 ,`R9 ,`R8 };
420 21 diegovalve
 
421
//OREG_TEX_COORD1 = [u1 + v2*H, u2 + v1*H, 0]
422
//R4 = FixedToIinteger(R4)
423 60 diegovalve
171: I =  { `UNSCALE ,`R4 ,`R4 ,`VOID };
424 74 diegovalve
172: I =   { `ADD ,`R12 ,`R2 ,`R4 };  // { `ADD ,`OREG_TEX_COORD1 ,`R2 ,`R4 }; 
425 60 diegovalve
173: I =  { `SETX ,`R5 ,32'h3  };
426
174: I =  { `SETY ,`R5 ,32'h3  };
427
175: I =  { `SETZ ,`R5 ,32'h3  };
428 21 diegovalve
//Multiply by 3 (the pitch)
429 74 diegovalve
176: I =  { `IMUL ,`OREG_TEX_COORD1 ,`R12 ,`R5 };
430 21 diegovalve
 
431
//R4 = [u2 u1 0]
432 60 diegovalve
177: I =  { `SWIZZLE3D ,`R4 ,`SWIZZLE_YXZ  };
433 21 diegovalve
 
434
 
435
//OREG_TEX_COORD2 [u2 + v2*H, u1 + v1*H, 0]
436 74 diegovalve
178: I =  { `ADD ,`R12 ,`R2 ,`R4 };
437 21 diegovalve
//Multiply by 3 (the pitch)
438 74 diegovalve
179: I =  { `IMUL ,`OREG_TEX_COORD2 ,`R12 ,`R5 };
439 21 diegovalve
 
440
 
441
//Cool now get the weights
442
 
443
//w1 = (1 - fracu) * (1 - fracv);
444
//w2 = fracu * (1 - fracv);
445
//w3 = (1 - fracu) * fracv;
446
//w4 = fracu *  fracv;
447
 
448
//R4x: fracu 
449
//R4y: fracv 
450
//R4z: 0
451 60 diegovalve
180: I =  { `FRAC ,`R4 ,`R7 ,`VOID };
452 21 diegovalve
 
453
//R5x: fracv 
454
//R5y: fracu 
455
//R5z: 0 
456 60 diegovalve
181: I =  { `COPY ,`R5 ,`R4 ,`VOID };
457
182: I =  { `SWIZZLE3D ,`R5 ,`SWIZZLE_YXZ  };
458 21 diegovalve
 
459
 
460
//R5x: 1 - fracv 
461
//R5y: 1 - fracu 
462
//R5y: 1
463 60 diegovalve
183: I =  { `NEG ,`R5 ,`R5 ,`VOID };
464
184: I =  { `INC ,`R5 ,`R5 ,`VOID };
465 21 diegovalve
 
466
//R5x: 1 - fracv 
467
//R5y: 1 - fracu 
468
//R5y: (1 - fracv)(1 - fracu) 
469 74 diegovalve
185: I =  { `MULP ,`CREG_TEXWEIGHT1 ,`R5 ,`VOID };
470 21 diegovalve
 
471 74 diegovalve
//CREG_TEXWEIGHT1.x = (1 - fracv)(1 - fracu) 
472
//CREG_TEXWEIGHT1.y = (1 - fracv)(1 - fracu) 
473
//CREG_TEXWEIGHT1.z = (1 - fracv)(1 - fracu) 
474
186: I =  { `SWIZZLE3D ,`CREG_TEXWEIGHT1 ,`SWIZZLE_ZZZ  };
475 21 diegovalve
 
476
 
477
//R6x: w2: fracu * (1 - fracv )
478
//R6y: w3: fracv * (1 - fracu )
479
//R6z: 0
480 60 diegovalve
187: I =  { `MUL ,`R6 ,`R4 ,`R5 };
481 21 diegovalve
 
482 74 diegovalve
//CREG_TEXWEIGHT2.x = fracu * (1 - fracv )
483
//CREG_TEXWEIGHT2.y = fracu * (1 - fracv )
484
//CREG_TEXWEIGHT2.z = fracu * (1 - fracv )
485
188: I =  { `COPY ,`CREG_TEXWEIGHT2 ,`R6 ,`VOID };
486
189: I =  { `SWIZZLE3D ,`CREG_TEXWEIGHT2 ,`SWIZZLE_XXX  };
487 21 diegovalve
 
488 74 diegovalve
//CREG_TEXWEIGHT3.x = fracv * (1 - fracu )
489
//CREG_TEXWEIGHT3.y = fracv * (1 - fracu )
490
//CREG_TEXWEIGHT3.z = fracv * (1 - fracu )
491
190: I =  { `COPY ,`CREG_TEXWEIGHT3 ,`R6 ,`VOID };
492
191: I =  { `SWIZZLE3D ,`CREG_TEXWEIGHT3 ,`SWIZZLE_YYY  };
493 21 diegovalve
 
494
 
495
//R4x: fracu
496
//R4y: fracv
497
//R4z: fracu * fracv
498 60 diegovalve
192: I =  { `MULP ,`R4 ,`R4 ,`VOID };
499 21 diegovalve
 
500 74 diegovalve
//CREG_TEXWEIGHT4.x = fracv * fracu 
501
//CREG_TEXWEIGHT4.y = fracv * fracu 
502
//CREG_TEXWEIGHT4.z = fracv * fracu 
503
193: I =  { `COPY ,`CREG_TEXWEIGHT4 ,`R4 ,`VOID };
504
194: I =  { `SWIZZLE3D ,`CREG_TEXWEIGHT4 ,`SWIZZLE_ZZZ  };
505 21 diegovalve
 
506
 
507
//LABEL_TCC_EXIT:
508 60 diegovalve
195: I =  { `RETURN ,`RT_TRUE   };
509 21 diegovalve
 
510
 
511
//-------------------------------------------------------------------------
512
//TAG_PSU_UCODE_ADRESS:
513
//Pixel Shader #1
514
//This pixel shader has diffuse light but no textures
515
 
516
 
517 60 diegovalve
196: I =  { `CROSS ,`R1 ,`CREG_E1_LAST ,`CREG_E2_LAST };
518
197: I =  { `MAG ,`R2 ,`R1 ,`VOID };
519
198: I =  { `DIV ,`R1 ,`R1 ,`R2 };
520
199: I =  { `MUL ,`R2 ,`CREG_RAY_DIRECTION ,`CREG_LAST_t };
521
200: I =  { `ADD ,`R2 ,`R2 ,`CREG_CAMERA_POSITION };
522
201: I =  { `SUB ,`R2 ,`CURRENT_LIGHT_POS ,`R2 };
523
202: I =  { `MAG ,`R3 ,`R2 ,`VOID };
524
203: I =  { `DIV ,`R2 ,`R2 ,`R3 };
525
204: I =  { `DOT ,`R3 ,`R2 ,`R1 };
526
205: I =  { `MUL ,`CREG_COLOR_ACC ,`CREG_TRI_DIFFUSE_LAST ,`CURRENT_LIGHT_DIFFUSE };
527
206: I =  { `MUL ,`CREG_COLOR_ACC ,`CREG_COLOR_ACC ,`R3 };
528 63 diegovalve
207: I =  { `COPY ,`CREG_TEXTURE_COLOR ,`CREG_COLOR_ACC ,`VOID };
529 60 diegovalve
208: I =  { `JLEX ,`LABEL_DEBUG_PRINT_REGS ,`CREG_COLOR_ACC ,`R3 };
530
209: I =  { `JMP ,`LABEL_DEBUG_PRINT_REGS ,`VOID ,`VOID };
531
210: I =  { `NOP ,`RT_FALSE   };//{ `INC ,`OREG_PIXEL_PITCH ,`VOID  }; 
532
211: I =  { `RETURN ,`RT_TRUE   };
533 21 diegovalve
 
534
//-------------------------------------------------------------------------
535
//Pixel Shader #2
536
//TAG_PSU_UCODE_ADRESS2:
537
 
538
 
539
//This Pixel Shader has no light but it does texturinng 
540
//with bi-linear interpolation
541
 
542
//CColor TextureColor;
543
//TextureColor.R = c1.R * w1 + c2.R * w2 + c3.R * w3 + c4.R * w4;
544
//TextureColor.G = c1.G * w1 + c2.G * w2 + c3.G * w3 + c4.G * w4;
545
//TextureColor.B = c1.B * w1 + c2.B * w2 + c3.B * w3 + c4.B * w4;
546
 
547 74 diegovalve
212: I =  { `MUL ,`R1 ,`CREG_TEX_COLOR5 ,`CREG_TEXWEIGHT1 };
548
213: I =  { `MUL ,`R2 ,`CREG_TEX_COLOR2 ,`CREG_TEXWEIGHT2 };
549
214: I =  { `MUL ,`R3 ,`CREG_TEX_COLOR1 ,`CREG_TEXWEIGHT3 };
550
215: I =  { `MUL ,`R4 ,`CREG_TEX_COLOR4 ,`CREG_TEXWEIGHT4 };
551 63 diegovalve
216: I =  { `ADD ,`CREG_TEXTURE_COLOR ,`R1 ,`R2 };
552
217: I =  { `ADD ,`CREG_TEXTURE_COLOR ,`CREG_TEXTURE_COLOR ,`R3 };
553
218: I =  { `ADD ,`CREG_TEXTURE_COLOR ,`CREG_TEXTURE_COLOR ,`R4 };
554
219: I =  { `RETURN ,`RT_TRUE   };
555 21 diegovalve
 
556
 
557 60 diegovalve
220: I =  { `RETURN ,`RT_TRUE   };
558 21 diegovalve
 
559 63 diegovalve
//-------------------------------------------------------------------------
560
//Default User constants
561
221: I =  { `NOP ,`RT_FALSE   };
562
222: I = { `RETURN ,`RT_TRUE   };
563
//Default Pixel Shader (just outputs texture)
564
223: I = {`COPY ,`OREG_PIXEL_COLOR,`CREG_TEXTURE_COLOR,`VOID};
565
224: I = { `RETURN ,`RT_TRUE   };
566 21 diegovalve
//-------------------------------------------------------------------------             
567
 
568
 
569
                        default:
570
                        begin
571
 
572
                        `ifdef DEBUG
573
                        $display("Error: Reached undefined address in instruction Memory: %d!!!!",Address);
574 60 diegovalve
                //      $stop();
575 21 diegovalve
                        `endif
576 60 diegovalve
                        I =  {`INSTRUCTION_OP_LENGTH'hFF,16'hFFFF,32'hFFFFFFFF};
577 21 diegovalve
                        end
578
                        endcase
579
        end
580
endmodule
581
//--------------------------------------------------------

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.