Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
885 serge 1
 
2
3
 
4
 
5
{
6
    VS_OUT_POS   = 0,
7
    VS_OUT_PSIZE,
8
    VS_OUT_COL0,
9
    VS_OUT_COL1,
10
    VS_OUT_COL2,
11
    VS_OUT_COL3,
12
    VS_OUT_TEX0,
13
    VS_OUT_TEX1,
14
    VS_OUT_TEX2,
15
    VS_OUT_TEX3,
16
    VS_OUT_TEX4,
17
    VS_OUT_TEX5,
18
    VS_OUT_TEX6,
19
    VS_OUT_TEX7,
20
    VS_OUT_FOG,
21
    VS_OUT_MAX = 0xFFFFFFFF
22
}v_out_t;
23
24
 
25
 
26
    vs_1_1
27
28
 
29
    dcl_color      v1
30
    dcl_color1     v2
31
    dcl_fog        v3
32
    dcl_psize      v4
33
    dcl_texcoord   v5
34
    dcl_texcoord1  v6
35
36
 
37
38
 
39
    mov oD1,     v2
40
41
 
42
    mov oPts,    v4.x
43
    mov oT0,     v5
44
    mov oT1,     v6
45
46
 
47
48
 
49
{
50
    0xfffe0101, 0x0000001f, 0x80000000, 0x900f0000, 0x0000001f, 0x8000000a,
51
    0x900f0001, 0x0000001f, 0x8001000a, 0x900f0002, 0x0000001f, 0x8000000b,
52
    0x900f0003, 0x0000001f, 0x80000004, 0x900f0004, 0x0000001f, 0x80000005,
53
    0x900f0005, 0x0000001f, 0x80010005, 0x900f0006, 0x00000001, 0xc00f0000,
54
    0x90e40000, 0x00000001, 0xd00f0000, 0x90e40001, 0x00000001, 0xd00f0001,
55
    0x90e40002, 0x00000001, 0xc00f0001, 0x90000003, 0x00000001, 0xc00f0002,
56
    0x90000004, 0x00000001, 0xe00f0000, 0x90e40005, 0x00000001, 0xe00f0001,
57
    0x90e40006, 0x0000ffff
58
};
59
60
 
61
{
62
    "nop",
63
    "mov",
64
    "add",
65
    "sub",
66
    "mad",
67
    "mul",
68
    "rcp",
69
    "rsq",
70
    "dp3",
71
    "dp4",
72
    "min",
73
    "max",
74
    "slt",
75
    "sge",
76
    "exp",
77
    "log",
78
    "lit",
79
    "dst",
80
    "lrp",
81
    "frc",
82
    "m4x4",
83
    "m4x3",
84
    "m3x4",
85
    "m3x3",
86
    "m3x2",
87
};
88
89
 
90
char *sz_ps_command[] =
91
{
92
    texcoord
93
    texkill
94
    tex
95
    texbem
96
    texbeml
97
    texreg2ar
98
    texreg2gb
99
    texm3x2pad
100
    texm3x3tex
101
    texm3x3pad
102
    texm3x3tex
103
    texm3x3diff
104
    texm3x3spec
105
    texm3x3vspec
106
    expp
107
    logp
108
    cnd
109
    def
110
    texreg2rgb
111
    texdp3tex
112
    texm3x2depth
113
    texdp3
114
    texm3x3
115
    texdepth
116
    cmp
117
    bem
118
}
119
*/
120
121
 
122
{
123
   "position",
124
   "blendweight",
125
   "blendindices",
126
   "normal",
127
   "psize",
128
   "texcoord",
129
   "tangent",
130
   "binormal",
131
   "tessfactor",
132
   "positiont",
133
   "color",
134
   "fog",
135
   "depth",
136
   "sample"
137
};
138
char *sztype[]=
139
{
140
    "r",
141
    "v",
142
    "c"
143
    "a",
144
    "t",
145
    "rasout",
146
    "attrout",
147
    "texcrdout",
148
    "output",
149
    "constint",
150
    "colorout",
151
    "depthout",
152
    "sampler",
153
    "const2",
154
    "const3",
155
    "const4",
156
    "constbool",
157
    "loop",
158
    "tempfloat16",
159
    "misctype",
160
    "label",
161
    "predicate"
162
};
163
164
 
165
 
166
{
167
  u32_t minor: 8;
168
  u32_t major: 8;
169
  u32_t type :16;
170
}version_t;
171
172
 
173
{
174
  u32_t type:5;
175
  u32_t rsv :11;
176
  u32_t ind :4;
177
  u32_t rsv2:11;
178
  u32_t sign:1;
179
}usage_t;
180
181
 
182
{
183
  u32_t ind   :11;
184
  u32_t typeh :2;
185
  u32_t rsv   :3;
186
  u32_t wr    :4;
187
  u32_t mod   :4;
188
  u32_t scale :4;
189
  u32_t typel :3;
190
  u32_t sign  :1;
191
}dst_t;
192
193
 
194
{
195
  u32_t ind   :11;
196
  u32_t rsv   :5;
197
  u32_t swzl  :8;
198
  u32_t mod   :4;
199
  u32_t typel :3;
200
  u32_t sign  :1;
201
}src_t;
202
203
 
204
int parse_mov();
205
int parse_dcl();
206
207
 
208
209
 
210
211
 
212
213
 
214
 
215
u32_t  inp_mask;
216
217
 
218
219
 
220
{
221
    version_t *ver;
222
223
 
224
225
 
226
    {
227
        printf("vs_%d_%d\n\n",ver->major,ver->minor);
228
        if( parse_vs(vs11+1) )
229
            translate_vs(vs11+1);
230
    };
231
232
 
233
};
234
235
 
236
static char *txt_mod[2] = { "","_sat"};
237
238
 
239
{
240
  dst_t  *dst;
241
  src_t  *src;
242
243
 
244
  u32_t  wr;
245
246
 
247
  char   szwm[5];
248
249
 
250
251
 
252
  {
253
    op_type_t instr = *stream++ & 0xFFFF;
254
255
 
256
    {
257
      case D3DSIO_MOV:
258
        dst = (dst_t*)stream++;
259
        src = (src_t*)stream++;
260
261
 
262
        wr = dst->wr;
263
264
 
265
        {
266
           szswzl[i] = txt_swzl[swzl&3];
267
           swzl>>=2;
268
           if(wr & (1<
269
           szwm[j++] = txt_swzl[i];
270
        };
271
        szswzl[4] = 0;
272
        szwm[j] = 0;
273
274
 
275
        {
276
           case 4:                   // Rasterizer Register File
277
              if(dst->ind == 0)
278
                 vs_out_written |= (1 << VS_OUT_POS);
279
              else if (dst->ind == 1)
280
                 vs_out_written |= (1 << VS_OUT_FOG);
281
              else if (dst->ind == 2)
282
                 vs_out_written |= (1 << VS_OUT_PSIZE);
283
              else
284
                 printf("invalid raster register %d",dst->ind);
285
              break;
286
287
 
288
              if(dst->ind == 0)
289
                 vs_out_written |= (1 << VS_OUT_COL0);
290
              else if (dst->ind == 1)
291
                 vs_out_written |= (1 << VS_OUT_COL1);
292
              else
293
                 printf("invalid attribute register %d",dst->ind);
294
              break;
295
296
 
297
              if(dst->ind < 8)
298
                 vs_out_written |= (1 << (VS_OUT_TEX0+dst->ind));
299
              else
300
                 printf("invalid texture register %d",dst->ind);
301
        };
302
        printf("%s%s %s%d.%s,\t %s%d.%s\n",sz_vs_command[instr],txt_mod[dst->mod],
303
               sztype[dst->typel],dst->ind,szwm,
304
               sztype[src->typel],src->ind,szswzl);
305
        break;
306
307
 
308
        parse_dcl(stream);
309
        stream+=2;
310
        break;
311
      case 0xFFFF:
312
        return 1;
313
314
 
315
        return 0;
316
    };
317
  };
318
};
319
320
 
321
 
322
{
323
  usage_t *usage;
324
  dst_t   *dst;
325
  int dsttype;
326
  char szwm[5];
327
  int i;
328
  u32_t wr;
329
330
 
331
  dst = (dst_t*)stream++;
332
  dsttype = (dst->typeh << 4) | dst->typel;
333
  wr = dst->wr;
334
335
 
336
  {
337
    if(wr & 1)
338
      szwm[i] = txt_swzl[i];
339
  };
340
  szwm[i] = 0;
341
342
 
343
         sztype[dsttype],dst->ind, szwm);
344
345
 
346
}
347
348
 
349
 
350
 
351
int translate_mov(const u32_t *stream);
352
353
 
354
{
355
  assign_outputs();
356
357
 
358
  {
359
    op_type_t instr = *stream++ & 0xFFFF;
360
361
 
362
    {
363
      case D3DSIO_MOV:
364
        translate_mov(stream);
365
        stream+=2;
366
        break;
367
      case D3DSIO_DCL:
368
        translate_dcl(stream);
369
        stream+=2;
370
        break;
371
      case 0xFFFF:
372
        return 1;
373
374
 
375
        return 0;
376
    };
377
  };
378
};
379
380
 
381
 
382
{
383
384
 
385
 
386
 
387
};
388
389
 
390
391
 
392
393
 
394
 * Swizzle indexes.
395
 * Do not change!
396
 */
397
/*@{*/
398
#define SWIZZLE_X    0
399
#define SWIZZLE_Y    1
400
#define SWIZZLE_Z    2
401
#define SWIZZLE_W    3
402
#define SWIZZLE_ZERO 4   /**< For SWZ instruction only */
403
#define SWIZZLE_ONE  5   /**< For SWZ instruction only */
404
#define SWIZZLE_NIL  7   /**< used during shader code gen (undefined value) */
405
/*@}*/
406
407
 
408
	(PVS_SRC_OPERAND(t_src_index(vp, &src[x]),	\
409
			   t_swizzle(y),	\
410
			   t_swizzle(y),	\
411
			   t_swizzle(y),	\
412
			   t_swizzle(y),	\
413
			   t_src_class(src[x].File), \
414
			   VSF_FLAG_NONE) | (src[x].RelAddr << 4))
415
416
 
417
{
418
/* this is in fact a NOP as the Mesa SWIZZLE_* are all identical to VSF_IN_COMPONENT_* */
419
	return swizzle;
420
}
421
422
 
423
{
424
	/* WRITEMASK_* is equivalent to VSF_FLAG_* */
425
	return mask & VSF_FLAG_ALL;
426
}
427
428
 
429
{
430
431
 
432
	case 0:                             //D3DSPR_TEMP
433
		return PVS_DST_REG_TEMPORARY;
434
	case 3:                             //D3DSPR_ADDR
435
		return PVS_DST_REG_A0;
436
	case 4:                             //D3DSPR_RASTOUT
437
	case 5:
438
	case 6:                             //D3DSPR_TEXCRDOUT
439
		return PVS_DST_REG_OUT;
440
441
 
442
		   case PROGRAM_INPUT:
443
		   case PROGRAM_LOCAL_PARAM:
444
		   case PROGRAM_ENV_PARAM:
445
		   case PROGRAM_NAMED_PARAM:
446
		   case PROGRAM_STATE_VAR:
447
		   case PROGRAM_WRITE_ONLY:
448
		   case PROGRAM_ADDRESS:
449
		 */
450
	default:
451
		printf("problem in %s", __FUNCTION__);
452
		return -1;
453
	}
454
}
455
456
 
457
{
458
  switch(dst->typel)
459
  {
460
    case 4:
461
        if(dst->ind == 0)
462
           return vs_outputs[VS_OUT_POS];
463
        else if (dst->ind == 1)
464
           return vs_outputs[VS_OUT_FOG];
465
        else if (dst->ind == 2)
466
           return vs_outputs[VS_OUT_PSIZE];
467
        break;
468
    case 5:
469
        if(dst->ind == 0)
470
           return vs_outputs[VS_OUT_COL0];
471
        else if (dst->ind == 1)
472
           return vs_outputs[VS_OUT_COL1];
473
474
 
475
        return vs_outputs[VS_OUT_TEX0+dst->ind];
476
477
 
478
      return dst->ind;
479
  }
480
}
481
482
 
483
 
484
{
485
	int i;
486
	int cur_reg = 0;
487
488
 
489
		vs_outputs[i] = -1;
490
491
 
492
493
 
494
		 vs_outputs[VS_OUT_POS] = cur_reg++;
495
	}
496
497
 
498
		 vs_outputs[VS_OUT_PSIZE] = cur_reg++;
499
	}
500
501
 
502
		 vs_outputs[VS_OUT_COL0] = cur_reg++;
503
	}
504
505
 
506
		 vs_outputs[VS_OUT_COL1] = vs_outputs[VS_OUT_COL0] + 1;           // ???
507
		 cur_reg = vs_outputs[VS_OUT_COL1] + 1;
508
	}
509
510
 
511
	if (vp->key.OutputsWritten & (1 << VERT_RESULT_FOGC)) {  //fog must be in
512
		vp->outputs[VERT_RESULT_FOGC] = cur_reg++;             //one of the color regs
513
	}
514
#endif
515
516
 
517
		if (vs_out_written & (1 << i)) {
518
			  vs_outputs[i] = cur_reg++;
519
		}
520
	}
521
}
522
523
 
524
 
525
{
526
527
 
528
   src_t *src = (src_t*)stream++;
529
530
 
531
   int wr = dst->wr;
532
533
 
534
 
535
				     0,
536
				     0,
537
				     t_dst_index(dst),
538
				     (dst->wr),
539
				     t_dst_class(dst->typel));
540
541
 
542
//	inst[2] = __CONST(0, SWIZZLE_ZERO);
543
	//inst[3] = __CONST(0, SWIZZLE_ZERO);
544
    printf("inst_0  %x\n", inst[0]);
545
	  return 1;
546
}
547
548
 
549
static GLuint *r300TranslateOpcodeMOV(struct r300_vertex_program *vp,
550
				      struct prog_instruction *vpi,
551
				      GLuint * inst,
552
				      struct prog_src_register src[3])
553
{
554
	//ADD RESULT 1.X Y Z W PARAM 0{} {X Y Z W} PARAM 0{} {ZERO ZERO ZERO ZERO}
555
556
 
557
				     GL_FALSE,
558
				     GL_FALSE,
559
				     t_dst_index(vp, &vpi->DstReg),
560
				     t_dst_mask(vpi->DstReg.WriteMask),
561
				     t_dst_class(vpi->DstReg.File));
562
	inst[1] = t_src(vp, &src[0]);
563
	inst[2] = __CONST(0, SWIZZLE_ZERO);
564
	inst[3] = __CONST(0, SWIZZLE_ZERO);
565
566
 
567
}
568
 */
569
>