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

Subversion Repositories theia_gpu

[/] [theia_gpu/] [branches/] [icarus_version/] [rtl/] [Module_ROM.v] - Blame information for rev 184

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

Line No. Rev Author Line
1 178 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
/*
28
I can't synthesize roms, the rom needs to be adapted depending on the
29
final target silicon.
30
*/
31
 
32
 
33
//--------------------------------------------------------
34
module ROM
35
(
36
        input  wire[`ROM_ADDRESS_WIDTH-1:0]              Address,
37
        `ifdef DEBUG
38
        input wire [`MAX_CORES-1:0]            iDebug_CoreID,
39
        `endif
40
        output reg [`INSTRUCTION_WIDTH-1:0]              I
41
);
42
 
43
 
44
always @( Address )
45
begin
46
                        case (Address)
47
 
48
//Hardcoded stuff :(
49
`define RAY_INSIDE_BOX                          `R3
50
`define CURRENT_LIGHT_POS `CREG_FIRST_LIGTH  //TODO: CAHNEG T 
51
`define CURRENT_LIGHT_DIFFUSE 16'h6
52
 
53
//-----------------------------------------------------------------
54 180 diegovalve
`define TAG_PIXELSHADER 16'd311
55
`define TAG_USERCONSTANTS 16'd309
56
`define TAG_PSU_UCODE_ADRESS2 16'd281
57
`define TAG_PSU_UCODE_ADRESS 16'd265
58
`define LABEL_TCC_EXIT 16'd264
59
`define TAG_TCC_UCODE_ADDRESS 16'd223
60
`define LABEL_BIU4 16'd222
61 178 diegovalve
`define LABEL_BIU3 16'd211
62
`define LABEL_BIU2 16'd207
63
`define LABEL_BIU1 16'd204
64
`define TAG_BIU_UCODE_ADDRESS 16'd186
65
`define LABEL_HIT 16'd184
66
`define LABEL15 16'd182
67
`define LABEL14 16'd180
68
`define LABEL13 16'd178
69
`define LABEL_TEST_XY_PLANE 16'd173
70
`define LABEL12 16'd171
71
`define LABEL11 16'd169
72
`define LABEL10 16'd167
73
`define LABEL_TEST_XZ_PLANE 16'd161
74
`define LABEL9 16'd159
75
`define LABEL8 16'd157
76
`define LABEL7 16'd155
77
`define LABEL_TEST_YZ_PLANE 16'd149
78
`define LABEL_RAY_INSIDE_BOX 16'd146
79
`define LABEL_ELSEZ 16'd145
80
`define LABEL6 16'd142
81
`define LABEL_ELESE_IFZ 16'd138
82
`define LABEL5 16'd135
83
`define LABEL_TEST_RAY_Z_ORIGEN 16'd131
84
`define LABEL_ELSEY 16'd130
85
`define LABEL4 16'd127
86
`define LABEL_ELESE_IFY 16'd123
87
`define LABEL3 16'd120
88
`define LABEL_TEST_RAY_Y_ORIGEN 16'd116
89
`define LABEL_ELSEX 16'd115
90
`define LABEL2 16'd112
91
`define LABEL_ELSE_IFX 16'd108
92
`define LABEL1 16'd105
93
`define LABEL_TEST_RAY_X_ORIGEN 16'd101
94
`define TAG_AABBIU_UCODE_ADDRESS 16'd98
95
`define LABEL_ALLDONE 16'd96
96
`define LABEL_NPG_NEXT_ROW 16'd91
97
`define TAG_NPG_UCODE_ADDRESS 16'd82
98
`define TAG_RGU_UCODE_ADDRESS 16'd74
99
`define TAG_CPPU_UCODE_ADDRESS 16'd70
100
`define LABEL_MAIN_RENDER_DONE 16'd69
101
`define LABEL_MAIN_IS_NO_HIT 16'd62
102
`define LABEL_MAIN_IS_HIT 16'd51
103
`define LABEL_MAIN_CHECK_HIT 16'd50
104
`define LABEL_DEC_PRIM_COUNT 16'd47
105
`define LABEL_MAIN_TEST_INTERSECTION 16'd42
106
`define TAG_ADRR_MAIN 16'd37
107
 
108
 
109
//-------------------------------------------------------------------------
110
//Default values for some registers after reset
111
//-------------------------------------------------------------------------
112
//This is the first code that gets executed after the machine is
113
//externally configured ie after the MST_I goes from 1 to zero.
114
//It sets initial values for some of the internal registers
115 183 diegovalve
 
116
 
117 178 diegovalve
 
118
0: I = { `ZERO ,`CREG_LAST_t ,`VOID ,`VOID };
119
//Set the last 't' to very positive value(500) 
120
1: I = { `SETX ,`CREG_LAST_t ,32'h1F40000  };
121
2: I = { `ZERO ,`OREG_PIXEL_COLOR ,`VOID ,`VOID };
122
3: I = { `COPY ,`CREG_PIXEL_2D_POSITION ,`CREG_PIXEL_2D_INITIAL_POSITION ,`VOID };
123
 
124
 
125
//Calculate the initial linear address for ADR_O
126
//this is: (X_initial + RESOLUTION_Y*Y_intial) * 3.
127
//Notice that we need to use 'unscaled' ie. integer
128
//values because the resuts of the multiplication by
129
//the resoluction is to large to fit a fixed point 
130
//representation.
131
 
132
4: I = { `COPY ,`R1 ,`CREG_RESOLUTION ,`VOID };
133
5: I = { `UNSCALE ,`R1 ,`R1 ,`VOID };
134
6: I = { `SETX ,`R1 ,32'h1  };
135
7: I = { `SETZ ,`R1 ,32'h0  };
136
8: I = { `COPY ,`R2 ,`CREG_PIXEL_2D_INITIAL_POSITION ,`VOID };
137
9: I = { `UNSCALE ,`R2 ,`R2 ,`VOID };
138
 
139
//Ok lets start by calculating RESOLUTION_Y*Y_intial
140
10: I = { `IMUL ,`R1 ,`R1 ,`R2 };
141
11: I = { `COPY ,`R2 ,`R1 ,`VOID };
142
12: I = { `SWIZZLE3D ,`R2 ,`SWIZZLE_YYY  };
143
 
144
//now X_initial + RESOLUTION_Y*Y_intial
145
13: I = { `ADD ,`R3 ,`R1 ,`R2 };
146
14: I = { `COPY ,`R2 ,`R1 ,`VOID };
147
15: I = { `SWIZZLE3D ,`R2 ,`SWIZZLE_ZZZ  };
148
16: I = { `ADD ,`R3 ,`R3 ,`R2 };
149
17: I = { `SWIZZLE3D ,`R3 ,`SWIZZLE_XXX  };
150
 
151
//finally multiply by 3 to get:
152
//(X_initial + RESOLUTION_Y*Y_intial) * 3 voila!
153
18: I = { `SETX ,`R2 ,32'h3  };
154
19: I = { `SWIZZLE3D ,`R2 ,`SWIZZLE_XXX  };
155
20: I = { `IMUL ,`CREG_PIXEL_PITCH ,`R3 ,`R2 };
156
 
157
//By this point you should be wondering why not
158
//just do DOT R1 [1 Resolution_Y 0] [X_intial Y_intial 0 ]?
159
//well because DOT uses fixed point and the result may not
160
//fit :(
161
 
162
//Transform from fixed point to integer
163
//UNSCALE CREG_PIXEL_PITCH CREG_PIXEL_PITCH VOID
164
21: I = { `COPY ,`OREG_ADDR_O ,`CREG_PIXEL_PITCH ,`VOID };
165
 
166
22: I = { `SETX ,`CREG_3 ,32'h3  };
167
23: I = { `SWIZZLE3D ,`CREG_3 ,`SWIZZLE_XXX  };
168
 
169
24: I = { `SETX ,`CREG_012 ,32'h0  };
170
25: I = { `SETY ,`CREG_012 ,32'h1  };
171
26: I = { `SETZ ,`CREG_012 ,32'h2  };
172
27: I = { `COPY ,`CREG_CURRENT_OUTPUT_PIXEL ,`CREG_012 ,`VOID };
173
28: I = { `ZERO ,`CREG_TEXTURE_COLOR ,`VOID ,`VOID };
174
29: I = { `ZERO ,`CREG_ZERO ,`VOID ,`VOID };
175
 
176
30: I = { `ZERO ,`R1 ,`VOID ,`VOID };
177
31: I = { `ZERO ,`R2 ,`VOID ,`VOID };
178
32: I = { `ZERO ,`R3 ,`VOID ,`VOID };
179
33: I = { `ZERO ,`R4 ,`VOID ,`VOID };
180
34: I = { `ZERO ,`R5 ,`VOID ,`VOID };
181
35: I = { `ZERO ,`R99 ,`VOID ,`VOID };
182
 
183
36: I = { `RETURN ,`RT_TRUE   };
184
 
185
//---------------------------------------------------------------------
186
//This is the main sub-routine
187
//TAG_ADRR_MAIN:
188 182 diegovalve
37: I =  { `NOP ,`RT_FALSE   };
189 178 diegovalve
        //Generate the ray, but this is wrong, it has to generate only once for all the triangles..
190
38: I = { `JNEX ,`LABEL_MAIN_TEST_INTERSECTION ,`CREG_PRIMITIVE_COUNT ,`CREG_MAX_PRIMITIVES };
191
39: I = { `CALL ,`ENTRYPOINT_ADRR_RGU ,`VOID ,`VOID };
192 182 diegovalve
40: I = { `ZERO ,`CREG_HIT ,`VOID ,`VOID };
193 178 diegovalve
41: I = { `RESCALE ,`CREG_PRIMITIVE_COUNT ,`CREG_MAX_PRIMITIVES ,`VOID };
194
 
195
//LABEL_MAIN_TEST_INTERSECTION:
196
        //Check ofr triangle intersection
197
42: I = { `NOP ,`RT_FALSE   };
198
43: I = { `CALL ,`ENTRYPOINT_ADRR_BIU ,`VOID ,`VOID };
199
44: I = { `NOP ,`RT_FALSE   };
200
 
201
45: I = { `JEQX ,`LABEL_DEC_PRIM_COUNT ,`R99 ,`CREG_ZERO };
202
46: I = { `COPY ,`CREG_HIT ,`R99 ,`VOID };
203
//LABEL_DEC_PRIM_COUNT:
204
47: I = { `DEC ,`CREG_PRIMITIVE_COUNT ,`CREG_PRIMITIVE_COUNT ,`VOID };
205
48: I = { `JEQX ,`LABEL_MAIN_CHECK_HIT ,`CREG_PRIMITIVE_COUNT ,`CREG_ZERO };
206
49: I = { `RETURN ,`RT_FALSE   };
207
 
208
//LABEL_MAIN_CHECK_HIT:
209
50: I = { `JEQX ,`LABEL_MAIN_IS_NO_HIT ,`CREG_HIT ,`CREG_ZERO };
210
 
211
 
212
 
213
//LABEL_MAIN_IS_HIT:
214
51: I = { `NOP ,`RT_FALSE   };
215
52: I = { `CALL ,`ENTRYPOINT_ADRR_TCC ,`VOID ,`VOID };
216
53: I = { `NOP ,`RT_FALSE   };
217
54: I = { `CALL ,`ENTRYPOINT_ADRR_PSU2 ,`VOID ,`VOID };
218
55: I = { `NOP ,`RT_FALSE   };
219
56: I = { `CALL ,`ENTRYPOINT_ADRR_PIXELSHADER ,`VOID ,`VOID };
220
57: I = { `NOP ,`RT_FALSE   };
221
58: I = { `CALL ,`ENTRYPOINT_ADRR_NPG ,`VOID ,`VOID };
222
59: I = { `NOP ,`RT_FALSE   };
223
60: I = { `JEQX ,`LABEL_MAIN_RENDER_DONE ,`R99 ,`CREG_ZERO };
224
61: I = { `RETURN ,`RT_TRUE   };
225
 
226
 
227
 
228
//LABEL_MAIN_IS_NO_HIT:
229
62: I = { `NOP ,`RT_FALSE   };
230
63: I = { `CALL ,`ENTRYPOINT_ADRR_PIXELSHADER ,`VOID ,`VOID };
231
64: I = { `NOP ,`RT_FALSE   };
232
65: I = { `CALL ,`ENTRYPOINT_ADRR_NPG ,`VOID ,`VOID };
233
66: I = { `NOP ,`RT_FALSE   };
234
67: I = { `JNEX ,`LABEL_MAIN_RENDER_DONE ,`R99 ,`CREG_ZERO };
235
68: I = { `RETURN ,`RT_TRUE   };
236
//LABEL_MAIN_RENDER_DONE:
237
69: I = { `RETURN ,`RT_TRUE   };
238
 
239
 
240
//----------------------------------------------------------------------          
241
//Micro code for CPPU
242
//TAG_CPPU_UCODE_ADDRESS:
243
 
244
 
245
70: I = { `SUB ,`R1 ,`CREG_PROJECTION_WINDOW_MAX ,`CREG_PROJECTION_WINDOW_MIN };
246
71: I = { `DIV ,`CREG_PROJECTION_WINDOW_SCALE ,`R1 ,`CREG_RESOLUTION };
247
72: I = { `COPY ,`CREG_PRIMITIVE_COUNT ,`CREG_MAX_PRIMITIVES ,`VOID };
248
73: I = { `RETURN ,`RT_FALSE   };
249
 
250
//----------------------------------------------------------------------          
251
//Micro code for RGU
252
//TAG_RGU_UCODE_ADDRESS:
253
 
254
 
255
74: I = { `MUL ,`R1 ,`CREG_PIXEL_2D_POSITION ,`CREG_PROJECTION_WINDOW_SCALE };
256
75: I = { `ADD ,`R1 ,`R1 ,`CREG_PROJECTION_WINDOW_MIN };
257
76: I = { `SUB ,`CREG_UNORMALIZED_DIRECTION ,`R1 ,`CREG_CAMERA_POSITION };
258
77: I = { `MAG ,`R2 ,`CREG_UNORMALIZED_DIRECTION ,`VOID };
259
78: I = { `DIV ,`CREG_RAY_DIRECTION ,`CREG_UNORMALIZED_DIRECTION ,`R2 };
260
79: I = { `DEC ,`CREG_LAST_COL ,`CREG_PIXEL_2D_FINAL_POSITION ,`VOID };
261
80: I = { `SETX ,`CREG_LAST_t ,32'h1F40000  };
262
 
263
81: I = { `RET ,`R99 ,`TRUE  };
264
//----------------------------------------------------------------------
265
//Next Pixel generation Code (NPG)
266
//TAG_NPG_UCODE_ADDRESS:
267
 
268
82: I = { `COPY ,`CREG_PRIMITIVE_COUNT ,`CREG_MAX_PRIMITIVES ,`VOID };
269
 
270
83: I = { `ZERO ,`CREG_TEXTURE_COLOR ,`VOID ,`VOID };
271
84: I = { `SETX ,`CREG_TEXTURE_COLOR ,32'h60000  };
272
85: I = { `ADD ,`CREG_CURRENT_OUTPUT_PIXEL ,`CREG_CURRENT_OUTPUT_PIXEL ,`CREG_3 };
273
 
274
86: I = { `ADD ,`CREG_PIXEL_PITCH ,`CREG_PIXEL_PITCH ,`CREG_3 };
275
87: I = { `COPY ,`OREG_ADDR_O ,`CREG_PIXEL_PITCH ,`VOID };
276
88: I = { `JGEX ,`LABEL_NPG_NEXT_ROW ,`CREG_PIXEL_2D_POSITION ,`CREG_LAST_COL };
277
89: I = { `INCX ,`CREG_PIXEL_2D_POSITION ,`CREG_PIXEL_2D_POSITION ,`VOID };
278
90: I = { `RET ,`R99 ,`FALSE  };
279
 
280
//LABEL_NPG_NEXT_ROW:
281
91: I = { `SETX ,`CREG_PIXEL_2D_POSITION ,32'h0  };
282
92: I = { `INCY ,`CREG_PIXEL_2D_POSITION ,`CREG_PIXEL_2D_POSITION ,`VOID };
283
93: I = { `JGEY ,`LABEL_ALLDONE ,`CREG_PIXEL_2D_POSITION ,`CREG_PIXEL_2D_FINAL_POSITION };
284
94: I = { `NOP ,`RT_FALSE   };
285
95: I = { `RET ,`R99 ,`FALSE  };
286
 
287
//LABEL_ALLDONE:
288
96: I = { `NOP ,`RT_FALSE   };
289
97: I = { `RET ,`R99 ,`TRUE  };
290
 
291
//----------------------------------------------------------------------
292
//Micro code for AABBIU
293
//TAG_AABBIU_UCODE_ADDRESS:
294
 
295
98: I = { `ZERO ,`R3 ,`VOID ,`VOID };
296
99: I = { `SETX ,`CREG_LAST_t ,32'h1F40000  };
297
100: I = { `RETURN ,`RT_TRUE   };
298
 
299
//LABEL_TEST_RAY_X_ORIGEN:
300
101: I = { `JGEX ,`LABEL_ELSE_IFX ,`CREG_CAMERA_POSITION ,`CREG_AABBMIN };
301
102: I = { `SUB ,`R1 ,`CREG_AABBMIN ,`CREG_CAMERA_POSITION };
302
103: I = { `JLEX ,`LABEL1 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
303
104: I = { `RETURN ,`RT_FALSE   };
304
 
305
//LABEL1:
306
105: I = { `SETX ,`RAY_INSIDE_BOX ,32'd0  };
307
106: I = { `DIV ,`R6 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
308
107: I = { `JMP ,`LABEL_TEST_RAY_Y_ORIGEN ,`VOID ,`VOID };
309
 
310
//LABEL_ELSE_IFX:
311
108: I = { `JLEX ,`LABEL_ELSEX ,`CREG_CAMERA_POSITION ,`CREG_AABBMAX };
312
109: I = { `SUB ,`R1 ,`CREG_AABBMAX ,`CREG_CAMERA_POSITION };
313
110: I = { `JGEX ,`LABEL2 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
314
111: I = { `RETURN ,`RT_FALSE   };
315
 
316
//LABEL2:
317
112: I = { `SETX ,`RAY_INSIDE_BOX ,32'd0  };
318
113: I = { `DIV ,`R6 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
319
114: I = { `JMP ,`LABEL_TEST_RAY_Y_ORIGEN ,`VOID ,`VOID };
320
//LABEL_ELSEX:
321
115: I = { `SETX ,`R5 ,32'b1  };
322
 
323
//LABEL_TEST_RAY_Y_ORIGEN:
324
116: I = { `JGEY ,`LABEL_ELESE_IFY ,`CREG_CAMERA_POSITION ,`CREG_AABBMIN };
325
117: I = { `SUB ,`R1 ,`CREG_AABBMIN ,`CREG_CAMERA_POSITION };
326
118: I = { `JLEY ,`LABEL3 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
327
119: I = { `RETURN ,`RT_FALSE   };
328
 
329
//LABEL3:
330
120: I = { `SETX ,`RAY_INSIDE_BOX ,32'd0  };
331
121: I = { `DIV ,`R6 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
332
122: I = { `JMP ,`LABEL_TEST_RAY_Z_ORIGEN ,`VOID ,`VOID };
333
 
334
//LABEL_ELESE_IFY:
335
123: I = { `JLEY ,`LABEL_ELSEY ,`CREG_CAMERA_POSITION ,`CREG_AABBMAX };
336
124: I = { `SUB ,`R1 ,`CREG_AABBMAX ,`CREG_CAMERA_POSITION };
337
125: I = { `JGEY ,`LABEL4 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
338
126: I = { `RETURN ,`RT_FALSE   };
339
 
340
//LABEL4:
341
127: I = { `SETX ,`RAY_INSIDE_BOX ,32'd0  };
342
128: I = { `DIV ,`R6 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
343
129: I = { `JMP ,`LABEL_TEST_RAY_Z_ORIGEN ,`VOID ,`VOID };
344
 
345
//LABEL_ELSEY:
346
130: I = { `SETY ,`R5 ,32'b1  };
347
 
348
//LABEL_TEST_RAY_Z_ORIGEN:
349
131: I = { `JGEZ ,`LABEL_ELESE_IFZ ,`CREG_CAMERA_POSITION ,`CREG_AABBMIN };
350
132: I = { `SUB ,`R1 ,`CREG_AABBMIN ,`CREG_CAMERA_POSITION };
351
133: I = { `JLEZ ,`LABEL5 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
352
134: I = { `RETURN ,`RT_FALSE   };
353
 
354
//LABEL5:
355
135: I = { `SETX ,`RAY_INSIDE_BOX ,32'd0  };
356
136: I = { `DIV ,`R6 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
357
137: I = { `JMP ,`LABEL_RAY_INSIDE_BOX ,`VOID ,`VOID };
358
 
359
//LABEL_ELESE_IFZ:
360
138: I = { `JLEZ ,`LABEL_ELSEZ ,`CREG_CAMERA_POSITION ,`CREG_AABBMAX };
361
139: I = { `SUB ,`R1 ,`CREG_AABBMAX ,`CREG_CAMERA_POSITION };
362
140: I = { `JGEZ ,`LABEL6 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
363
141: I = { `RETURN ,`RT_FALSE   };
364
 
365
//LABEL6:
366
142: I = { `SETX ,`RAY_INSIDE_BOX ,32'd0  };
367
143: I = { `DIV ,`R6 ,`R1 ,`CREG_UNORMALIZED_DIRECTION };
368
144: I = { `JMP ,`LABEL_RAY_INSIDE_BOX ,`VOID ,`VOID };
369
 
370
//LABEL_ELSEZ:
371
145: I = { `SETZ ,`R5 ,32'b1  };
372
 
373
//LABEL_RAY_INSIDE_BOX:
374
146: I = { `ZERO ,`R1 ,`VOID ,`VOID };
375
147: I = { `JEQX ,`LABEL_TEST_YZ_PLANE ,`R1 ,`RAY_INSIDE_BOX };
376
//BUG need a NOP here else pipeline gets confused
377
148: I = { `RETURN ,`RT_TRUE   };
378
 
379
//LABEL_TEST_YZ_PLANE:
380
149: I = { `JNEX ,`LABEL_TEST_XZ_PLANE ,`R5 ,`R1 };
381
150: I = { `SWIZZLE3D ,`R6 ,`SWIZZLE_XXX  };
382
151: I = { `MUL ,`R2 ,`CREG_UNORMALIZED_DIRECTION ,`R6 };
383
152: I = { `ADD ,`R2 ,`R2 ,`CREG_CAMERA_POSITION };
384
153: I = { `JGEY ,`LABEL7 ,`R2 ,`CREG_AABBMIN };
385
154: I = { `RETURN ,`RT_FALSE   };
386
 
387
//LABEL7:
388
155: I = { `JLEY ,`LABEL8 ,`R2 ,`CREG_AABBMAX };
389
156: I = { `RETURN ,`RT_FALSE   };
390
 
391
//LABEL8:
392
157: I = { `JGEZ ,`LABEL9 ,`R2 ,`CREG_AABBMIN };
393
158: I = { `RETURN ,`RT_FALSE   };
394
 
395
//LABEL9:
396
159: I = { `JLEZ ,`LABEL_TEST_XZ_PLANE ,`R2 ,`CREG_AABBMAX };
397
160: I = { `RETURN ,`RT_FALSE   };
398
 
399
//LABEL_TEST_XZ_PLANE:
400
161: I = { `JNEY ,`LABEL_TEST_XY_PLANE ,`R5 ,`R1 };
401
162: I = { `SWIZZLE3D ,`R6 ,`SWIZZLE_YYY  };
402
163: I = { `MUL ,`R2 ,`CREG_UNORMALIZED_DIRECTION ,`R6 };
403
164: I = { `ADD ,`R2 ,`R2 ,`CREG_CAMERA_POSITION };
404
165: I = { `JGEX ,`LABEL10 ,`R2 ,`CREG_AABBMIN };
405
166: I = { `RETURN ,`RT_FALSE   };
406
 
407
//LABEL10:
408
167: I = { `JLEX ,`LABEL11 ,`R2 ,`CREG_AABBMAX };
409
168: I = { `RETURN ,`RT_FALSE   };
410
 
411
//LABEL11:
412
169: I = { `JGEZ ,`LABEL12 ,`R2 ,`CREG_AABBMIN };
413
170: I = { `RETURN ,`RT_FALSE   };
414
 
415
//LABEL12:
416
171: I = { `JLEZ ,`LABEL_TEST_XY_PLANE ,`R2 ,`CREG_AABBMAX };
417
172: I = { `RETURN ,`RT_FALSE   };
418
 
419
//LABEL_TEST_XY_PLANE:
420
173: I = { `SWIZZLE3D ,`R6 ,`SWIZZLE_ZZZ  };
421
174: I = { `MUL ,`R2 ,`CREG_UNORMALIZED_DIRECTION ,`R6 };
422
175: I = { `ADD ,`R2 ,`R2 ,`CREG_CAMERA_POSITION };
423
176: I = { `JGEX ,`LABEL13 ,`R2 ,`CREG_AABBMIN };
424
177: I = { `RETURN ,`RT_FALSE   };
425
 
426
//LABEL13:
427
178: I = { `JLEX ,`LABEL14 ,`R2 ,`CREG_AABBMAX };
428
179: I = { `RETURN ,`RT_FALSE   };
429
 
430
//LABEL14:
431
180: I = { `JGEY ,`LABEL15 ,`R2 ,`CREG_AABBMIN };
432
181: I = { `RETURN ,`RT_FALSE   };
433
 
434
//LABEL15:
435
182: I = { `JLEY ,`LABEL_HIT ,`R2 ,`CREG_AABBMAX };
436
183: I = { `RETURN ,`RT_FALSE   };
437
 
438
//LABEL_HIT:
439
184: I = { `SETX ,`CREG_LAST_t ,32'h1F40000  };
440
185: I = { `RETURN ,`RT_TRUE   };
441
 
442
 //------------------------------------------------------------------------
443
 //BIU Micro code
444
//TAG_BIU_UCODE_ADDRESS:
445
 
446
186: I = { `ZERO ,`OREG_PIXEL_COLOR ,`VOID ,`VOID };
447
187: I = { `SETX ,`R3 ,`ONE  };
448
188: I = { `SETX ,`R1 ,32'h00000  };
449
189: I = { `SUB ,`CREG_E1 ,`CREG_V1 ,`CREG_V0 };
450
190: I = { `SUB ,`CREG_E2 ,`CREG_V2 ,`CREG_V0 };
451
191: I = { `SUB ,`CREG_T ,`CREG_CAMERA_POSITION ,`CREG_V0 };
452
192: I = { `CROSS ,`CREG_P ,`CREG_RAY_DIRECTION ,`CREG_E2 };
453
193: I = { `CROSS ,`CREG_Q ,`CREG_T ,`CREG_E1 };
454
194: I = { `DOT ,`CREG_H1 ,`CREG_Q ,`CREG_E2 };
455
195: I = { `DOT ,`CREG_H2 ,`CREG_P ,`CREG_T };
456
196: I = { `DOT ,`CREG_H3 ,`CREG_Q ,`CREG_RAY_DIRECTION };
457
197: I = { `DOT ,`CREG_DELTA ,`CREG_P ,`CREG_E1 };
458
198: I = { `DIV ,`CREG_t ,`CREG_H1 ,`CREG_DELTA };
459
199: I = { `DIV ,`CREG_u ,`CREG_H2 ,`CREG_DELTA };
460
200: I = { `DIV ,`CREG_v ,`CREG_H3 ,`CREG_DELTA };
461
201: I = { `JGEX ,`LABEL_BIU1 ,`CREG_u ,`R1 };
462
202: I = { `NOP ,`RT_FALSE   };
463
203: I = { `RET ,`R99 ,`FALSE  };
464
 
465
//LABEL_BIU1:
466
204: I = { `JGEX ,`LABEL_BIU2 ,`CREG_v ,`R1 };
467
205: I = { `NOP ,`RT_FALSE   };
468
206: I = { `RET ,`R99 ,`FALSE  };
469
 
470
//LABEL_BIU2:
471
207: I = { `ADD ,`R2 ,`CREG_u ,`CREG_v };
472
208: I = { `JLEX ,`LABEL_BIU3 ,`R2 ,`R3 };
473
209: I = { `NOP ,`RT_FALSE   };
474
210: I = { `RET ,`R99 ,`FALSE  };
475
 
476
//LABEL_BIU3:
477
211: I = { `JGEX ,`LABEL_BIU4 ,`CREG_t ,`CREG_LAST_t };
478
212: I = { `COPY ,`CREG_LAST_t ,`CREG_t ,`VOID };
479
213: I = { `COPY ,`CREG_LAST_u ,`CREG_u ,`VOID };
480
214: I = { `COPY ,`CREG_LAST_v ,`CREG_v ,`VOID };
481
215: I = { `COPY ,`CREG_E1_LAST ,`CREG_E1 ,`VOID };
482
216: I = { `COPY ,`CREG_E2_LAST ,`CREG_E2 ,`VOID };
483
217: I = { `COPY ,`CREG_UV0_LAST ,`CREG_UV0 ,`VOID };
484
218: I = { `COPY ,`CREG_UV1_LAST ,`CREG_UV1 ,`VOID };
485
219: I = { `COPY ,`CREG_UV2_LAST ,`CREG_UV2 ,`VOID };
486
220: I = { `COPY ,`CREG_TRI_DIFFUSE_LAST ,`CREG_TRI_DIFFUSE ,`VOID };
487 180 diegovalve
221: I = { `RET ,`R99 ,`TRUE  };
488 178 diegovalve
//LABEL_BIU4:
489 180 diegovalve
222: I = { `RET ,`R99 ,`FALSE  };
490 178 diegovalve
 
491
 
492
//-------------------------------------------------------------------------
493
//Calculate the adress of the texure coordiantes.
494
 
495
//TAG_TCC_UCODE_ADDRESS:
496
//Do this calculation only if this triangle is the one closest to the camera
497 180 diegovalve
223: I = { `JGX ,`LABEL_TCC_EXIT ,`CREG_t ,`CREG_LAST_t };
498 178 diegovalve
 
499
//First get the UV coodrinates and store in R1
500
//R1x: u_coordinate = U0 + last_u * (U1 - U0) + last_v * (U2 - U0)
501
//R1y: v_coordinate = V0 + last_u * (V1 - V0) + last_v * (V2 - V0)
502
//R1z: 0
503
 
504 180 diegovalve
224: I = { `SUB ,`R1 ,`CREG_UV1_LAST ,`CREG_UV0_LAST };
505
225: I = { `SUB ,`R2 ,`CREG_UV2_LAST ,`CREG_UV0_LAST };
506
226: I = { `MUL ,`R1 ,`CREG_LAST_u ,`R1 };
507
227: I = { `MUL ,`R2 ,`CREG_LAST_v ,`R2 };
508
228: I = { `ADD ,`R1 ,`R1 ,`R2 };
509
229: I = { `ADD ,`R1 ,`R1 ,`CREG_UV0_LAST };
510 178 diegovalve
 
511
//R7x : fu = (u_coordinate) * gTexture.mWidth
512
//R7y : fv = (v_coordinate) * gTexture.mWidth
513
//R7z : 0
514 180 diegovalve
230: I = { `MUL ,`R7 ,`R1 ,`CREG_TEXTURE_SIZE };
515 178 diegovalve
 
516
//R1x: u1 = ((int)fu) % gTexture.mWidth
517
//R1y: v1 = ((int)fv) % gTexture.mHeight
518
//R1z: 0
519
//R2x: u2 = (u1 + 1 ) % gTexture.mWidth
520
//R2y: v2 = (v2 + 1 ) % gTexture.mHeight
521
//R2z: 0
522
// Notice MOD2 only operates over
523
// numbers that are power of 2 also notice that the
524
// textures are assumed to be squares!
525
//x % 2^n == x & (2^n - 1).
526
 
527 180 diegovalve
231: I = { `MOD ,`R1 ,`R7 ,`CREG_TEXTURE_SIZE };
528
232: I = { `INC ,`R2 ,`R1 ,`VOID };
529
233: I = { `MOD ,`R2 ,`R2 ,`CREG_TEXTURE_SIZE };
530 178 diegovalve
 
531
//Cool now we should store the values in the appropiate registers
532
//OREG_TEX_COORD1.x = u1 + v1 * gTexture.mWidth
533
//OREG_TEX_COORD1.y = u2 + v1 * gTexture.mWidth
534
//OREG_TEX_COORD1.z = 0
535
//OREG_TEX_COORD2.x = u1 + v2 * gTexture.mWidth
536
//OREG_TEX_COORD2.y = u2 + v2 * gTexture.mWidth
537
//OREG_TEX_COORD1.z = 0
538
 
539
//R1= [u1 v1 0]
540
//R2= [u2 v2 0]
541
 
542
//R2 = [v2 u2 0]
543 180 diegovalve
234: I = { `SWIZZLE3D ,`R2 ,`SWIZZLE_YXZ  };
544 178 diegovalve
 
545
//R3 = [v2 v1 0]
546 180 diegovalve
235: I = { `XCHANGEX ,`R3 ,`R1 ,`R2 };
547 178 diegovalve
 
548
 
549
//R4 = [u1 u2 0]
550 180 diegovalve
236: I = { `XCHANGEX ,`R4 ,`R2 ,`R1 };
551 178 diegovalve
 
552
//R2 = [v2*H v1*H 0]
553 180 diegovalve
237: I = { `UNSCALE ,`R9 ,`R3 ,`VOID };
554
238: I = { `UNSCALE ,`R8 ,`CREG_TEXTURE_SIZE ,`VOID };
555
239: I = { `IMUL ,`R2 ,`R9 ,`R8 };
556 178 diegovalve
 
557
//OREG_TEX_COORD1 = [u1 + v2*H u2 + v1*H 0]
558
//R4 = FixedToIinteger(R4)
559 180 diegovalve
240: I = { `UNSCALE ,`R4 ,`R4 ,`VOID };
560
241: I = { `ADD ,`R12 ,`R2 ,`R4 };
561
242: I = { `SETX ,`R5 ,32'h3  };
562
243: I = { `SETY ,`R5 ,32'h3  };
563
244: I = { `SETZ ,`R5 ,32'h3  };
564 178 diegovalve
//Multiply by 3 (the pitch)
565
//IMUL OREG_TEX_COORD1 R12 R5  
566 180 diegovalve
245: I = { `IMUL ,`CREG_TEX_COORD1 ,`R12 ,`R5 };
567 178 diegovalve
 
568
//R4 = [u2 u1 0]
569 180 diegovalve
246: I = { `SWIZZLE3D ,`R4 ,`SWIZZLE_YXZ  };
570 178 diegovalve
 
571
 
572
//OREG_TEX_COORD2 [u2 + v2*H u1 + v1*H 0]
573 180 diegovalve
247: I = { `ADD ,`R12 ,`R2 ,`R4 };
574 178 diegovalve
//Multiply by 3 (the pitch)
575
//IMUL OREG_TEX_COORD2 R12 R5  
576 180 diegovalve
248: I = { `IMUL ,`CREG_TEX_COORD2 ,`R12 ,`R5 };
577 178 diegovalve
 
578
 
579
//Cool now get the weights
580
 
581
//w1 = (1 - fracu) * (1 - fracv)
582
//w2 = fracu * (1 - fracv)
583
//w3 = (1 - fracu) * fracv
584
//w4 = fracu *  fracv
585
 
586
//R4x: fracu 
587
//R4y: fracv 
588
//R4z: 0
589 180 diegovalve
249: I = { `FRAC ,`R4 ,`R7 ,`VOID };
590 178 diegovalve
 
591
//R5x: fracv 
592
//R5y: fracu 
593
//R5z: 0 
594 180 diegovalve
250: I = { `COPY ,`R5 ,`R4 ,`VOID };
595
251: I = { `SWIZZLE3D ,`R5 ,`SWIZZLE_YXZ  };
596 178 diegovalve
 
597
 
598
//R5x: 1 - fracv 
599
//R5y: 1 - fracu 
600
//R5y: 1
601 180 diegovalve
252: I = { `NEG ,`R5 ,`R5 ,`VOID };
602
253: I = { `INC ,`R5 ,`R5 ,`VOID };
603 178 diegovalve
 
604
//R5x: 1 - fracv 
605
//R5y: 1 - fracu 
606
//R5y: (1 - fracv)(1 - fracu) 
607 180 diegovalve
254: I = { `MULP ,`CREG_TEXWEIGHT1 ,`R5 ,`VOID };
608 178 diegovalve
 
609
//CREG_TEXWEIGHT1.x = (1 - fracv)(1 - fracu) 
610
//CREG_TEXWEIGHT1.y = (1 - fracv)(1 - fracu) 
611
//CREG_TEXWEIGHT1.z = (1 - fracv)(1 - fracu) 
612 180 diegovalve
255: I = { `SWIZZLE3D ,`CREG_TEXWEIGHT1 ,`SWIZZLE_ZZZ  };
613 178 diegovalve
 
614
 
615
//R6x: w2: fracu * (1 - fracv )
616
//R6y: w3: fracv * (1 - fracu )
617
//R6z: 0
618 180 diegovalve
256: I = { `MUL ,`R6 ,`R4 ,`R5 };
619 178 diegovalve
 
620
//CREG_TEXWEIGHT2.x = fracu * (1 - fracv )
621
//CREG_TEXWEIGHT2.y = fracu * (1 - fracv )
622
//CREG_TEXWEIGHT2.z = fracu * (1 - fracv )
623 180 diegovalve
257: I = { `COPY ,`CREG_TEXWEIGHT2 ,`R6 ,`VOID };
624
258: I = { `SWIZZLE3D ,`CREG_TEXWEIGHT2 ,`SWIZZLE_XXX  };
625 178 diegovalve
 
626
//CREG_TEXWEIGHT3.x = fracv * (1 - fracu )
627
//CREG_TEXWEIGHT3.y = fracv * (1 - fracu )
628
//CREG_TEXWEIGHT3.z = fracv * (1 - fracu )
629 180 diegovalve
259: I = { `COPY ,`CREG_TEXWEIGHT3 ,`R6 ,`VOID };
630
260: I = { `SWIZZLE3D ,`CREG_TEXWEIGHT3 ,`SWIZZLE_YYY  };
631 178 diegovalve
 
632
 
633
//R4x: fracu
634
//R4y: fracv
635
//R4z: fracu * fracv
636 180 diegovalve
261: I = { `MULP ,`R4 ,`R4 ,`VOID };
637 178 diegovalve
 
638
//CREG_TEXWEIGHT4.x = fracv * fracu 
639
//CREG_TEXWEIGHT4.y = fracv * fracu 
640
//CREG_TEXWEIGHT4.z = fracv * fracu 
641 180 diegovalve
262: I = { `COPY ,`CREG_TEXWEIGHT4 ,`R4 ,`VOID };
642
263: I = { `SWIZZLE3D ,`CREG_TEXWEIGHT4 ,`SWIZZLE_ZZZ  };
643 178 diegovalve
 
644
 
645
//LABEL_TCC_EXIT:
646 180 diegovalve
264: I = { `RET ,`R99 ,32'h0  };
647 178 diegovalve
 
648
 
649
//-------------------------------------------------------------------------
650
//TAG_PSU_UCODE_ADRESS:
651
//Pixel Shader #1
652
//This pixel shader has diffuse light but no textures
653
 
654
 
655 180 diegovalve
265: I = { `CROSS ,`R1 ,`CREG_E1_LAST ,`CREG_E2_LAST };
656
266: I = { `MAG ,`R2 ,`R1 ,`VOID };
657
267: I = { `DIV ,`R1 ,`R1 ,`R2 };
658
268: I = { `MUL ,`R2 ,`CREG_RAY_DIRECTION ,`CREG_LAST_t };
659
269: I = { `ADD ,`R2 ,`R2 ,`CREG_CAMERA_POSITION };
660
270: I = { `SUB ,`R2 ,`CURRENT_LIGHT_POS ,`R2 };
661
271: I = { `MAG ,`R3 ,`R2 ,`VOID };
662
272: I = { `DIV ,`R2 ,`R2 ,`R3 };
663
273: I = { `DOT ,`R3 ,`R2 ,`R1 };
664
274: I = { `MUL ,`CREG_COLOR_ACC ,`CREG_TRI_DIFFUSE_LAST ,`CURRENT_LIGHT_DIFFUSE };
665
275: I = { `MUL ,`CREG_COLOR_ACC ,`CREG_COLOR_ACC ,`R3 };
666
276: I = { `COPY ,`CREG_TEXTURE_COLOR ,`CREG_COLOR_ACC ,`VOID };
667 178 diegovalve
277: I = { `NOP ,`RT_FALSE   };
668
278: I = { `NOP ,`RT_FALSE   };
669 180 diegovalve
279: I = { `NOP ,`RT_FALSE   };
670
280: I = { `RET ,`R99 ,`TRUE  };
671 178 diegovalve
 
672
//-------------------------------------------------------------------------
673
//Pixel Shader #2
674
//TAG_PSU_UCODE_ADRESS2:
675
//This Pixel Shader has no light but it does texturinng 
676
//with bi-linear interpolation
677
 
678
 
679
 
680 180 diegovalve
281: I = { `COPY ,`R1 ,`CREG_TEX_COORD1 ,`VOID };
681
282: I = { `COPY ,`R2 ,`CREG_TEX_COORD1 ,`VOID };
682
283: I = { `COPY ,`R3 ,`CREG_TEX_COORD2 ,`VOID };
683
284: I = { `COPY ,`R4 ,`CREG_TEX_COORD2 ,`VOID };
684 178 diegovalve
 
685
 
686 180 diegovalve
285: I = { `SWIZZLE3D ,`R1 ,`SWIZZLE_XXX  };
687
286: I = { `SWIZZLE3D ,`R2 ,`SWIZZLE_YYY  };
688
287: I = { `SWIZZLE3D ,`R3 ,`SWIZZLE_XXX  };
689
288: I = { `SWIZZLE3D ,`R4 ,`SWIZZLE_YYY  };
690
289: I = { `ADD ,`R1 ,`R1 ,`CREG_012 };
691
290: I = { `ADD ,`R2 ,`R2 ,`CREG_012 };
692
291: I = { `ADD ,`R3 ,`R3 ,`CREG_012 };
693
292: I = { `ADD ,`R4 ,`R4 ,`CREG_012 };
694 178 diegovalve
 
695
 
696 180 diegovalve
293: I = { `TMREAD ,`CREG_TEX_COLOR1 ,`R1 ,`VOID };
697
294: I = { `NOP ,`RT_FALSE   };
698
295: I = { `TMREAD ,`CREG_TEX_COLOR2 ,`R2 ,`VOID };
699
296: I = { `NOP ,`RT_FALSE   };
700
297: I = { `TMREAD ,`CREG_TEX_COLOR3 ,`R3 ,`VOID };
701
298: I = { `NOP ,`RT_FALSE   };
702
299: I = { `TMREAD ,`CREG_TEX_COLOR4 ,`R4 ,`VOID };
703
300: I = { `NOP ,`RT_FALSE   };
704 178 diegovalve
 
705
 
706
 
707
 
708
//TextureColor.R = c1.R * w1 + c2.R * w2 + c3.R * w3 + c4.R * w4
709
//TextureColor.G = c1.G * w1 + c2.G * w2 + c3.G * w3 + c4.G * w4
710
//TextureColor.B = c1.B * w1 + c2.B * w2 + c3.B * w3 + c4.B * w4
711
 
712
 
713
//MUL R1 CREG_TEX_COLOR4 CREG_TEXWEIGHT1  
714
//MUL R2 CREG_TEX_COLOR2 CREG_TEXWEIGHT2  
715
//MUL R3 CREG_TEX_COLOR1 CREG_TEXWEIGHT3  
716
//MUL R4 CREG_TEX_COLOR3 CREG_TEXWEIGHT4  
717
 
718 180 diegovalve
301: I = { `MUL ,`R1 ,`CREG_TEX_COLOR3 ,`CREG_TEXWEIGHT1 };
719
302: I = { `MUL ,`R2 ,`CREG_TEX_COLOR2 ,`CREG_TEXWEIGHT2 };
720
303: I = { `MUL ,`R3 ,`CREG_TEX_COLOR1 ,`CREG_TEXWEIGHT3 };
721
304: I = { `MUL ,`R4 ,`CREG_TEX_COLOR4 ,`CREG_TEXWEIGHT4 };
722 178 diegovalve
 
723 180 diegovalve
305: I = { `ADD ,`CREG_TEXTURE_COLOR ,`R1 ,`R2 };
724
306: I = { `ADD ,`CREG_TEXTURE_COLOR ,`CREG_TEXTURE_COLOR ,`R3 };
725
307: I = { `ADD ,`CREG_TEXTURE_COLOR ,`CREG_TEXTURE_COLOR ,`R4 };
726
308: I = { `RET ,`R99 ,`TRUE  };
727 178 diegovalve
 
728
 
729
//-------------------------------------------------------------------------
730
//Default User constants
731
//TAG_USERCONSTANTS:
732
 
733 180 diegovalve
309: I = { `NOP ,`RT_FALSE   };
734
310: I = { `RETURN ,`RT_FALSE   };
735 178 diegovalve
 
736
//TAG_PIXELSHADER:
737
//Default Pixel Shader (just outputs texture)
738 180 diegovalve
311: I = { `OMWRITE ,`OREG_PIXEL_COLOR ,`CREG_CURRENT_OUTPUT_PIXEL ,`CREG_TEXTURE_COLOR };
739
312: I = { `NOP ,`RT_FALSE   };
740
313: I = { `RET ,`R99 ,`TRUE  };
741
314: I = { `NOP ,`RT_FALSE   };
742 178 diegovalve
 
743
 
744 180 diegovalve
 
745 178 diegovalve
//-------------------------------------------------------------------------             
746
 
747
 
748
                        default:
749
                        begin
750
 
751
                        `ifdef DEBUG
752
                        $display("%dns CORE %d Error: Reached undefined address in instruction Memory: %d!!!!",$time,iDebug_CoreID,Address);
753
                //      $stop();
754
                        `endif
755
                        I =  {`INSTRUCTION_OP_LENGTH'hFF,16'hFFFF,32'hFFFFFFFF};
756
                        end
757
                        endcase
758
        end
759
endmodule
760 158 diegovalve
//--------------------------------------------------------

powered by: WebSVN 2.1.0

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