37
37
#define DEBUG_SLANG 0
39
GLvoid slang_machine_ctr (slang_machine *self)
40
slang_machine_ctr(slang_machine * self)
41
slang_machine_init (self);
42
slang_machine_init(self);
42
43
self->infolog = NULL;
43
44
#if defined(USE_X86_ASM) || defined(SLANG_X86)
44
self->x86.compiled_func = NULL;
45
self->x86.compiled_func = NULL;
48
GLvoid slang_machine_dtr (slang_machine *self)
50
slang_machine_dtr(slang_machine * self)
50
52
if (self->infolog != NULL) {
51
slang_info_log_destruct (self->infolog);
52
slang_alloc_free (self->infolog);
53
slang_info_log_destruct(self->infolog);
54
slang_alloc_free(self->infolog);
54
56
#if defined(USE_X86_ASM) || defined(SLANG_X86)
55
if (self->x86.compiled_func != NULL)
56
_mesa_exec_free (self->x86.compiled_func);
57
if (self->x86.compiled_func != NULL)
58
_mesa_exec_free(self->x86.compiled_func);
60
void slang_machine_init (slang_machine *mach)
64
* Initialize the shader virtual machine.
65
* NOTE: stack grows downward in memory.
68
slang_machine_init(slang_machine * mach)
63
mach->sp = SLANG_MACHINE_STACK_SIZE;
71
mach->sp = SLANG_MACHINE_STACK_SIZE;
73
mach->kill = GL_FALSE;
74
mach->exit = GL_FALSE;
71
static void dump_instruction (FILE *f, slang_assembly *a, unsigned int i)
80
dump_instruction(FILE * f, slang_assembly * a, unsigned int i)
73
fprintf (f, "%.5u:\t", i);
81
case slang_asm_float_copy:
82
fprintf (f, "float_copy\t%d, %d", a->param[0], a->param[1]);
84
case slang_asm_float_move:
85
fprintf (f, "float_move\t%d, %d", a->param[0], a->param[1]);
87
case slang_asm_float_push:
88
fprintf (f, "float_push\t%f", a->literal);
90
case slang_asm_float_deref:
91
fprintf (f, "float_deref");
93
case slang_asm_float_add:
94
fprintf (f, "float_add");
96
case slang_asm_float_multiply:
97
fprintf (f, "float_multiply");
99
case slang_asm_float_divide:
100
fprintf (f, "float_divide");
102
case slang_asm_float_negate:
103
fprintf (f, "float_negate");
105
case slang_asm_float_less:
106
fprintf (f, "float_less");
108
case slang_asm_float_equal_exp:
109
fprintf (f, "float_equal");
111
case slang_asm_float_equal_int:
112
fprintf (f, "float_equal\t%d, %d", a->param[0], a->param[1]);
114
case slang_asm_float_to_int:
115
fprintf (f, "float_to_int");
117
case slang_asm_float_sine:
118
fprintf (f, "float_sine");
120
case slang_asm_float_arcsine:
121
fprintf (f, "float_arcsine");
123
case slang_asm_float_arctan:
124
fprintf (f, "float_arctan");
126
case slang_asm_float_power:
127
fprintf (f, "float_power");
129
case slang_asm_float_log2:
130
fprintf (f, "float_log2");
132
case slang_asm_float_floor:
133
fprintf (f, "float_floor");
135
case slang_asm_float_ceil:
136
fprintf (f, "float_ceil");
138
case slang_asm_float_noise1:
139
fprintf (f, "float_noise1");
141
case slang_asm_float_noise2:
142
fprintf (f, "float_noise2");
144
case slang_asm_float_noise3:
145
fprintf (f, "float_noise3");
147
case slang_asm_float_noise4:
148
fprintf (f, "float_noise4");
150
case slang_asm_int_copy:
151
fprintf (f, "int_copy\t%d, %d", a->param[0], a->param[1]);
153
case slang_asm_int_move:
154
fprintf (f, "int_move\t%d, %d", a->param[0], a->param[1]);
156
case slang_asm_int_push:
157
fprintf (f, "int_push\t%d", (GLint) a->literal);
159
case slang_asm_int_deref:
160
fprintf (f, "int_deref");
162
case slang_asm_int_to_float:
163
fprintf (f, "int_to_float");
165
case slang_asm_int_to_addr:
166
fprintf (f, "int_to_addr");
168
case slang_asm_bool_copy:
169
fprintf (f, "bool_copy\t%d, %d", a->param[0], a->param[1]);
171
case slang_asm_bool_move:
172
fprintf (f, "bool_move\t%d, %d", a->param[0], a->param[1]);
174
case slang_asm_bool_push:
175
fprintf (f, "bool_push\t%d", a->literal != 0.0f);
177
case slang_asm_bool_deref:
178
fprintf (f, "bool_deref");
180
case slang_asm_addr_copy:
181
fprintf (f, "addr_copy");
183
case slang_asm_addr_push:
184
fprintf (f, "addr_push\t%u", a->param[0]);
186
case slang_asm_addr_deref:
187
fprintf (f, "addr_deref");
189
case slang_asm_addr_add:
190
fprintf (f, "addr_add");
192
case slang_asm_addr_multiply:
193
fprintf (f, "addr_multiply");
195
case slang_asm_vec4_tex1d:
196
fprintf (f, "vec4_tex1d");
198
case slang_asm_vec4_tex2d:
199
fprintf (f, "vec4_tex2d");
201
case slang_asm_vec4_tex3d:
202
fprintf (f, "vec4_tex3d");
204
case slang_asm_vec4_texcube:
205
fprintf (f, "vec4_texcube");
207
case slang_asm_vec4_shad1d:
208
fprintf (f, "vec4_shad1d");
210
case slang_asm_vec4_shad2d:
211
fprintf (f, "vec4_shad2d");
214
fprintf (f, "jump\t%u", a->param[0]);
216
case slang_asm_jump_if_zero:
217
fprintf (f, "jump_if_zero\t%u", a->param[0]);
219
case slang_asm_enter:
220
fprintf (f, "enter\t%u", a->param[0]);
222
case slang_asm_leave:
223
fprintf (f, "leave");
225
case slang_asm_local_alloc:
226
fprintf (f, "local_alloc\t%u", a->param[0]);
228
case slang_asm_local_free:
229
fprintf (f, "local_free\t%u", a->param[0]);
231
case slang_asm_local_addr:
232
fprintf (f, "local_addr\t%u, %u", a->param[0], a->param[1]);
234
case slang_asm_global_addr:
235
fprintf (f, "global_addr\t%u", a->param[0]);
238
fprintf (f, "call\t%u", a->param[0]);
240
case slang_asm_return:
241
fprintf (f, "return");
243
case slang_asm_discard:
244
fprintf (f, "discard");
249
/* mesa-specific extensions */
250
case slang_asm_float_print:
251
fprintf (f, "float_print");
253
case slang_asm_int_print:
254
fprintf (f, "int_print");
256
case slang_asm_bool_print:
257
fprintf (f, "bool_print");
82
fprintf(f, "%.5u:\t", i);
89
case slang_asm_float_copy:
90
fprintf(f, "float_copy\t%d, %d", a->param[0], a->param[1]);
92
case slang_asm_float_move:
93
fprintf(f, "float_move\t%d, %d", a->param[0], a->param[1]);
95
case slang_asm_float_push:
96
fprintf(f, "float_push\t%f", a->literal);
98
case slang_asm_float_deref:
99
fprintf(f, "float_deref");
101
case slang_asm_float_add:
102
fprintf(f, "float_add");
104
case slang_asm_float_multiply:
105
fprintf(f, "float_multiply");
107
case slang_asm_float_divide:
108
fprintf(f, "float_divide");
110
case slang_asm_float_negate:
111
fprintf(f, "float_negate");
113
case slang_asm_float_less:
114
fprintf(f, "float_less");
116
case slang_asm_float_equal_exp:
117
fprintf(f, "float_equal");
119
case slang_asm_float_equal_int:
120
fprintf(f, "float_equal\t%d, %d", a->param[0], a->param[1]);
122
case slang_asm_float_to_int:
123
fprintf(f, "float_to_int");
125
case slang_asm_float_sine:
126
fprintf(f, "float_sine");
128
case slang_asm_float_arcsine:
129
fprintf(f, "float_arcsine");
131
case slang_asm_float_arctan:
132
fprintf(f, "float_arctan");
134
case slang_asm_float_power:
135
fprintf(f, "float_power");
137
case slang_asm_float_log2:
138
fprintf(f, "float_log2");
140
case slang_asm_float_floor:
141
fprintf(f, "float_floor");
143
case slang_asm_float_ceil:
144
fprintf(f, "float_ceil");
146
case slang_asm_float_noise1:
147
fprintf(f, "float_noise1");
149
case slang_asm_float_noise2:
150
fprintf(f, "float_noise2");
152
case slang_asm_float_noise3:
153
fprintf(f, "float_noise3");
155
case slang_asm_float_noise4:
156
fprintf(f, "float_noise4");
158
case slang_asm_int_copy:
159
fprintf(f, "int_copy\t%d, %d", a->param[0], a->param[1]);
161
case slang_asm_int_move:
162
fprintf(f, "int_move\t%d, %d", a->param[0], a->param[1]);
164
case slang_asm_int_push:
165
fprintf(f, "int_push\t%d", (GLint) a->literal);
167
case slang_asm_int_deref:
168
fprintf(f, "int_deref");
170
case slang_asm_int_to_float:
171
fprintf(f, "int_to_float");
173
case slang_asm_int_to_addr:
174
fprintf(f, "int_to_addr");
176
case slang_asm_bool_copy:
177
fprintf(f, "bool_copy\t%d, %d", a->param[0], a->param[1]);
179
case slang_asm_bool_move:
180
fprintf(f, "bool_move\t%d, %d", a->param[0], a->param[1]);
182
case slang_asm_bool_push:
183
fprintf(f, "bool_push\t%d", a->literal != 0.0f);
185
case slang_asm_bool_deref:
186
fprintf(f, "bool_deref");
188
case slang_asm_addr_copy:
189
fprintf(f, "addr_copy");
191
case slang_asm_addr_push:
192
fprintf(f, "addr_push\t%u", a->param[0]);
194
case slang_asm_addr_deref:
195
fprintf(f, "addr_deref");
197
case slang_asm_addr_add:
198
fprintf(f, "addr_add");
200
case slang_asm_addr_multiply:
201
fprintf(f, "addr_multiply");
203
case slang_asm_vec4_tex1d:
204
fprintf(f, "vec4_tex1d");
206
case slang_asm_vec4_tex2d:
207
fprintf(f, "vec4_tex2d");
209
case slang_asm_vec4_tex3d:
210
fprintf(f, "vec4_tex3d");
212
case slang_asm_vec4_texcube:
213
fprintf(f, "vec4_texcube");
215
case slang_asm_vec4_shad1d:
216
fprintf(f, "vec4_shad1d");
218
case slang_asm_vec4_shad2d:
219
fprintf(f, "vec4_shad2d");
222
fprintf(f, "jump\t%u", a->param[0]);
224
case slang_asm_jump_if_zero:
225
fprintf(f, "jump_if_zero\t%u", a->param[0]);
227
case slang_asm_enter:
228
fprintf(f, "enter\t%u", a->param[0]);
230
case slang_asm_leave:
233
case slang_asm_local_alloc:
234
fprintf(f, "local_alloc\t%u", a->param[0]);
236
case slang_asm_local_free:
237
fprintf(f, "local_free\t%u", a->param[0]);
239
case slang_asm_local_addr:
240
fprintf(f, "local_addr\t%u, %u", a->param[0], a->param[1]);
242
case slang_asm_global_addr:
243
fprintf(f, "global_addr\t%u", a->param[0]);
246
fprintf(f, "call\t%u", a->param[0]);
248
case slang_asm_return:
249
fprintf(f, "return");
251
case slang_asm_discard:
252
fprintf(f, "discard");
257
/* GL_MESA_shader_debug */
258
case slang_asm_float_print:
259
fprintf(f, "float_print");
261
case slang_asm_int_print:
262
fprintf(f, "int_print");
264
case slang_asm_bool_print:
265
fprintf(f, "bool_print");
268
case slang_asm_float_to_vec4:
269
fprintf(f, "float_to_vec4");
271
case slang_asm_vec4_add:
272
fprintf(f, "vec4_add");
274
case slang_asm_vec4_subtract:
275
fprintf(f, "vec4_subtract");
277
case slang_asm_vec4_multiply:
278
fprintf(f, "vec4_multiply");
280
case slang_asm_vec4_divide:
281
fprintf(f, "vec4_divide");
283
case slang_asm_vec4_negate:
284
fprintf(f, "vec4_negate");
286
case slang_asm_vec4_dot:
287
fprintf(f, "vec4_dot");
289
case slang_asm_vec4_copy:
290
fprintf(f, "vec4_copy");
292
case slang_asm_vec4_deref:
293
fprintf(f, "vec4_deref");
295
case slang_asm_vec4_equal_int:
296
fprintf(f, "vec4_equal");
266
static void dump (const slang_assembly_file *file)
306
dump(const slang_assembly_file * file)
269
static unsigned int counter = 0;
274
_mesa_sprintf (filename, "~mesa-slang-assembly-dump-(%u).txt", counter);
275
f = fopen (filename, "w");
279
for (i = 0; i < file->count; i++)
280
dump_instruction (f, file->code + i, i);
309
static unsigned int counter = 0;
314
_mesa_sprintf(filename, "~mesa-slang-assembly-dump-(%u).txt", counter);
315
f = fopen(filename, "w");
319
for (i = 0; i < file->count; i++)
320
dump_instruction(f, file->code + i, i);
288
ensure_infolog_created (slang_info_log **infolog)
328
ensure_infolog_created(slang_info_log ** infolog)
290
330
if (*infolog == NULL) {
291
*infolog = slang_alloc_malloc (sizeof (slang_info_log));
331
*infolog = slang_alloc_malloc(sizeof(slang_info_log));
292
332
if (*infolog == NULL)
294
slang_info_log_construct (*infolog);
334
slang_info_log_construct(*infolog);
298
int _slang_execute2 (const slang_assembly_file *file, slang_machine *mach)
339
_slang_execute2(const slang_assembly_file * file, slang_machine * mach)
300
slang_machine_slot *stack;
341
slang_machine_slot *stack;
303
static unsigned int counter = 0;
344
static unsigned int counter = 0;
308
/* assume 32-bit floats and uints; should work fine also on 64-bit platforms */
309
static_assert(sizeof (GLfloat) == 4);
310
static_assert(sizeof (GLuint) == 4);
349
/* assume 32-bit floats and uints; should work fine also on 64-bit platforms */
350
static_assert(sizeof(GLfloat) == 4);
351
static_assert(sizeof(GLuint) == 4);
315
_mesa_sprintf (filename, "~mesa-slang-assembly-exec-(%u).txt", counter);
316
f = fopen (filename, "w");
356
_mesa_sprintf(filename, "~mesa-slang-assembly-exec-(%u).txt", counter);
357
f = fopen(filename, "w");
319
360
#if defined(USE_X86_ASM) || defined(SLANG_X86)
320
if (mach->x86.compiled_func != NULL)
322
mach->x86.compiled_func (mach);
327
stack = mach->mem + SLANG_MACHINE_GLOBAL_SIZE;
331
slang_assembly *a = &file->code[mach->ip];
334
if (f != NULL && a->type != slang_asm_none)
338
dump_instruction (f, file->code + mach->ip, mach->ip);
339
fprintf (f, "\t\tsp=%u bp=%u\n", mach->sp, mach->bp);
340
for (i = mach->sp; i < SLANG_MACHINE_STACK_SIZE; i++)
341
fprintf (f, "\t%.5u\t%6f\t%u\n", i, stack[i]._float, stack[i]._addr);
353
case slang_asm_float_copy:
354
case slang_asm_int_copy:
355
case slang_asm_bool_copy:
356
mach->mem[(stack[mach->sp + a->param[0] / 4]._addr + a->param[1]) / 4]._float =
357
stack[mach->sp]._float;
360
case slang_asm_float_move:
361
case slang_asm_int_move:
362
case slang_asm_bool_move:
363
stack[mach->sp + a->param[0] / 4]._float =
364
stack[mach->sp + (stack[mach->sp]._addr + a->param[1]) / 4]._float;
366
case slang_asm_float_push:
367
case slang_asm_int_push:
368
case slang_asm_bool_push:
370
stack[mach->sp]._float = a->literal;
372
case slang_asm_float_deref:
373
case slang_asm_int_deref:
374
case slang_asm_bool_deref:
375
stack[mach->sp]._float = mach->mem[stack[mach->sp]._addr / 4]._float;
377
case slang_asm_float_add:
378
stack[mach->sp + 1]._float += stack[mach->sp]._float;
381
case slang_asm_float_multiply:
382
stack[mach->sp + 1]._float *= stack[mach->sp]._float;
385
case slang_asm_float_divide:
386
stack[mach->sp + 1]._float /= stack[mach->sp]._float;
389
case slang_asm_float_negate:
390
stack[mach->sp]._float = -stack[mach->sp]._float;
392
case slang_asm_float_less:
393
stack[mach->sp + 1]._float =
394
stack[mach->sp + 1]._float < stack[mach->sp]._float ? (GLfloat) 1 : (GLfloat) 0;
397
case slang_asm_float_equal_exp:
398
stack[mach->sp + 1]._float =
399
stack[mach->sp + 1]._float == stack[mach->sp]._float ? (GLfloat) 1 : (GLfloat) 0;
402
case slang_asm_float_equal_int:
404
stack[mach->sp]._float = stack[mach->sp + 1 + a->param[0] / 4]._float ==
405
stack[mach->sp + 1 + a->param[1] / 4]._float ? (GLfloat) 1 : (GLfloat) 0;
407
case slang_asm_float_to_int:
408
stack[mach->sp]._float = (GLfloat) (GLint) stack[mach->sp]._float;
410
case slang_asm_float_sine:
411
stack[mach->sp]._float = (GLfloat) _mesa_sin (stack[mach->sp]._float);
413
case slang_asm_float_arcsine:
414
stack[mach->sp]._float = _mesa_asinf (stack[mach->sp]._float);
416
case slang_asm_float_arctan:
417
stack[mach->sp]._float = _mesa_atanf (stack[mach->sp]._float);
419
case slang_asm_float_power:
420
stack[mach->sp + 1]._float =
421
(GLfloat) _mesa_pow (stack[mach->sp + 1]._float, stack[mach->sp]._float);
424
case slang_asm_float_log2:
425
stack[mach->sp]._float = LOG2 (stack[mach->sp]._float);
427
case slang_asm_float_floor:
428
stack[mach->sp]._float = FLOORF (stack[mach->sp]._float);
430
case slang_asm_float_ceil:
431
stack[mach->sp]._float = CEILF (stack[mach->sp]._float);
433
case slang_asm_float_noise1:
434
stack[mach->sp]._float = _slang_library_noise1 (stack[mach->sp]._float);
436
case slang_asm_float_noise2:
437
stack[mach->sp + 1]._float = _slang_library_noise2 (stack[mach->sp]._float,
438
stack[mach->sp + 1]._float);
441
case slang_asm_float_noise3:
442
stack[mach->sp + 2]._float = _slang_library_noise3 (stack[mach->sp]._float,
443
stack[mach->sp + 1]._float, stack[mach->sp + 2]._float);
446
case slang_asm_float_noise4:
447
stack[mach->sp + 3]._float = _slang_library_noise4 (stack[mach->sp]._float,
448
stack[mach->sp + 1]._float, stack[mach->sp + 2]._float, stack[mach->sp + 3]._float);
451
case slang_asm_int_to_float:
453
case slang_asm_int_to_addr:
454
stack[mach->sp]._addr = (GLuint) (GLint) stack[mach->sp]._float;
456
case slang_asm_addr_copy:
457
mach->mem[stack[mach->sp + 1]._addr / 4]._addr = stack[mach->sp]._addr;
460
case slang_asm_addr_push:
461
case slang_asm_global_addr:
463
stack[mach->sp]._addr = a->param[0];
465
case slang_asm_addr_deref:
466
stack[mach->sp]._addr = mach->mem[stack[mach->sp]._addr / 4]._addr;
468
case slang_asm_addr_add:
469
stack[mach->sp + 1]._addr += stack[mach->sp]._addr;
472
case slang_asm_addr_multiply:
473
stack[mach->sp + 1]._addr *= stack[mach->sp]._addr;
476
case slang_asm_vec4_tex1d:
477
_slang_library_tex1d (stack[mach->sp]._float, stack[mach->sp + 1]._float,
478
stack[mach->sp + 2]._float, &mach->mem[stack[mach->sp + 3]._addr / 4]._float);
481
case slang_asm_vec4_tex2d:
482
_slang_library_tex2d (stack[mach->sp]._float, stack[mach->sp + 1]._float,
483
stack[mach->sp + 2]._float, stack[mach->sp + 3]._float,
484
&mach->mem[stack[mach->sp + 4]._addr / 4]._float);
487
case slang_asm_vec4_tex3d:
488
_slang_library_tex3d (stack[mach->sp]._float, stack[mach->sp + 1]._float,
489
stack[mach->sp + 2]._float, stack[mach->sp + 3]._float, stack[mach->sp + 4]._float,
490
&mach->mem[stack[mach->sp + 5]._addr / 4]._float);
493
case slang_asm_vec4_texcube:
494
_slang_library_texcube (stack[mach->sp]._float, stack[mach->sp + 1]._float,
495
stack[mach->sp + 2]._float, stack[mach->sp + 3]._float, stack[mach->sp + 4]._float,
496
&mach->mem[stack[mach->sp + 5]._addr / 4]._float);
499
case slang_asm_vec4_shad1d:
500
_slang_library_shad1d (stack[mach->sp]._float, stack[mach->sp + 1]._float,
501
stack[mach->sp + 2]._float, stack[mach->sp + 3]._float, stack[mach->sp + 4]._float,
502
&mach->mem[stack[mach->sp + 5]._addr / 4]._float);
505
case slang_asm_vec4_shad2d:
506
_slang_library_shad2d (stack[mach->sp]._float, stack[mach->sp + 1]._float,
507
stack[mach->sp + 2]._float, stack[mach->sp + 3]._float, stack[mach->sp + 4]._float,
508
&mach->mem[stack[mach->sp + 5]._addr / 4]._float);
512
mach->ip = a->param[0];
514
case slang_asm_jump_if_zero:
515
if (stack[mach->sp]._float == 0.0f)
516
mach->ip = a->param[0];
519
case slang_asm_enter:
521
stack[mach->sp]._addr = mach->bp;
522
mach->bp = mach->sp + a->param[0] / 4;
524
case slang_asm_leave:
525
mach->bp = stack[mach->sp]._addr;
528
case slang_asm_local_alloc:
529
mach->sp -= a->param[0] / 4;
531
case slang_asm_local_free:
532
mach->sp += a->param[0] / 4;
534
case slang_asm_local_addr:
536
stack[mach->sp]._addr = SLANG_MACHINE_GLOBAL_SIZE * 4 + mach->bp * 4 -
537
(a->param[0] + a->param[1]) + 4;
541
stack[mach->sp]._addr = mach->ip;
542
mach->ip = a->param[0];
544
case slang_asm_return:
545
mach->ip = stack[mach->sp]._addr;
548
case slang_asm_discard:
554
/* mesa-specific extensions */
555
case slang_asm_float_print:
556
_mesa_printf ("slang print: %f\n", stack[mach->sp]._float);
557
ensure_infolog_created (&mach->infolog);
558
slang_info_log_print (mach->infolog, "%f", stack[mach->sp]._float);
560
case slang_asm_int_print:
561
_mesa_printf ("slang print: %d\n", (GLint) stack[mach->sp]._float);
562
ensure_infolog_created (&mach->infolog);
563
slang_info_log_print (mach->infolog, "%d", (GLint) (stack[mach->sp]._float));
565
case slang_asm_bool_print:
566
_mesa_printf ("slang print: %s\n", (GLint) stack[mach->sp]._float ? "true" : "false");
567
ensure_infolog_created (&mach->infolog);
568
slang_info_log_print (mach->infolog, "%s",
569
(GLint) (stack[mach->sp]._float) ? "true" : "false");
361
if (mach->x86.compiled_func != NULL) {
362
mach->x86.compiled_func(mach);
367
stack = mach->mem + SLANG_MACHINE_GLOBAL_SIZE;
369
while (!mach->exit) {
370
const slang_assembly *a = &file->code[mach->ip];
373
if (f != NULL && a->type != slang_asm_none) {
376
dump_instruction(f, file->code + mach->ip, mach->ip);
377
fprintf(f, "\t\tsp=%u bp=%u\n", mach->sp, mach->bp);
378
for (i = mach->sp; i < SLANG_MACHINE_STACK_SIZE; i++)
379
fprintf(f, "\t%.5u\t%6f\t%u\n", i, stack[i]._float,
391
case slang_asm_float_copy:
392
case slang_asm_int_copy:
393
case slang_asm_bool_copy:
394
/* store top value on stack to memory */
397
= (stack[mach->sp + a->param[0] / 4]._addr + a->param[1]) / 4;
398
GLfloat value = stack[mach->sp]._float;
399
mach->mem[address]._float = value;
403
case slang_asm_float_move:
404
case slang_asm_int_move:
405
case slang_asm_bool_move:
406
stack[mach->sp + a->param[0] / 4]._float =
408
(stack[mach->sp]._addr + a->param[1]) / 4]._float;
410
case slang_asm_float_push:
411
case slang_asm_int_push:
412
case slang_asm_bool_push:
413
/* push float/int/bool literal onto stop of stack */
415
stack[mach->sp]._float = a->literal;
417
case slang_asm_float_deref:
418
case slang_asm_int_deref:
419
case slang_asm_bool_deref:
420
/* load value from memory, replace stop of stack with it */
421
stack[mach->sp]._float = mach->mem[stack[mach->sp]._addr / 4]._float;
423
case slang_asm_float_add:
424
/* pop two top floats, push sum */
425
stack[mach->sp + 1]._float += stack[mach->sp]._float;
428
case slang_asm_float_multiply:
429
stack[mach->sp + 1]._float *= stack[mach->sp]._float;
432
case slang_asm_float_divide:
433
stack[mach->sp + 1]._float /= stack[mach->sp]._float;
436
case slang_asm_float_negate:
437
stack[mach->sp]._float = -stack[mach->sp]._float;
439
case slang_asm_float_less:
440
stack[mach->sp + 1]._float =
441
(stack[mach->sp + 1]._float < stack[mach->sp]._float)
442
? (GLfloat) 1 : (GLfloat) 0;
445
case slang_asm_float_equal_exp:
446
stack[mach->sp + 1]._float =
447
(stack[mach->sp + 1]._float == stack[mach->sp]._float)
448
? (GLfloat) 1 : (GLfloat) 0;
451
case slang_asm_float_equal_int:
452
/* pop top two values, compare, push 0 or 1 */
454
stack[mach->sp]._float =
455
(stack[mach->sp + 1 + a->param[0] / 4]._float ==
456
stack[mach->sp + 1 + a->param[1] / 4]._float)
457
? (GLfloat) 1 : (GLfloat) 0;
459
case slang_asm_float_to_int:
460
stack[mach->sp]._float = (GLfloat) (GLint) stack[mach->sp]._float;
462
case slang_asm_float_sine:
463
stack[mach->sp]._float = (GLfloat) _mesa_sin(stack[mach->sp]._float);
465
case slang_asm_float_arcsine:
466
stack[mach->sp]._float = _mesa_asinf(stack[mach->sp]._float);
468
case slang_asm_float_arctan:
469
stack[mach->sp]._float = _mesa_atanf(stack[mach->sp]._float);
471
case slang_asm_float_power:
472
stack[mach->sp + 1]._float = (GLfloat)
473
_mesa_pow(stack[mach->sp + 1]._float, stack[mach->sp]._float);
476
case slang_asm_float_log2:
477
stack[mach->sp]._float = LOG2(stack[mach->sp]._float);
479
case slang_asm_float_floor:
480
stack[mach->sp]._float = FLOORF(stack[mach->sp]._float);
482
case slang_asm_float_ceil:
483
stack[mach->sp]._float = CEILF(stack[mach->sp]._float);
485
case slang_asm_float_noise1:
486
stack[mach->sp]._float =
487
_slang_library_noise1(stack[mach->sp]._float);
489
case slang_asm_float_noise2:
490
stack[mach->sp + 1]._float =
491
_slang_library_noise2(stack[mach->sp]._float,
492
stack[mach->sp + 1]._float);
495
case slang_asm_float_noise3:
496
stack[mach->sp + 2]._float =
497
_slang_library_noise3(stack[mach->sp]._float,
498
stack[mach->sp + 1]._float,
499
stack[mach->sp + 2]._float);
502
case slang_asm_float_noise4:
503
stack[mach->sp + 3]._float =
504
_slang_library_noise4(stack[mach->sp]._float,
505
stack[mach->sp + 1]._float,
506
stack[mach->sp + 2]._float,
507
stack[mach->sp + 3]._float);
510
case slang_asm_int_to_float:
512
case slang_asm_int_to_addr:
513
stack[mach->sp]._addr = (GLuint) (GLint) stack[mach->sp]._float;
515
case slang_asm_addr_copy:
516
mach->mem[stack[mach->sp + 1]._addr / 4]._addr =
517
stack[mach->sp]._addr;
520
case slang_asm_addr_push:
521
case slang_asm_global_addr:
523
stack[mach->sp]._addr = a->param[0];
525
case slang_asm_addr_deref:
526
stack[mach->sp]._addr = mach->mem[stack[mach->sp]._addr / 4]._addr;
528
case slang_asm_addr_add:
529
stack[mach->sp + 1]._addr += stack[mach->sp]._addr;
532
case slang_asm_addr_multiply:
533
stack[mach->sp + 1]._addr *= stack[mach->sp]._addr;
536
case slang_asm_vec4_tex1d:
537
_slang_library_tex1d(stack[mach->sp]._float,
538
stack[mach->sp + 1]._float,
539
stack[mach->sp + 2]._float,
540
&mach->mem[stack[mach->sp + 3]._addr /
544
case slang_asm_vec4_tex2d:
545
_slang_library_tex2d(stack[mach->sp]._float,
546
stack[mach->sp + 1]._float,
547
stack[mach->sp + 2]._float,
548
stack[mach->sp + 3]._float,
549
&mach->mem[stack[mach->sp + 4]._addr /
553
case slang_asm_vec4_tex3d:
554
_slang_library_tex3d(stack[mach->sp]._float,
555
stack[mach->sp + 1]._float,
556
stack[mach->sp + 2]._float,
557
stack[mach->sp + 3]._float,
558
stack[mach->sp + 4]._float,
559
&mach->mem[stack[mach->sp + 5]._addr /
563
case slang_asm_vec4_texcube:
564
_slang_library_texcube(stack[mach->sp]._float,
565
stack[mach->sp + 1]._float,
566
stack[mach->sp + 2]._float,
567
stack[mach->sp + 3]._float,
568
stack[mach->sp + 4]._float,
569
&mach->mem[stack[mach->sp + 5]._addr /
573
case slang_asm_vec4_shad1d:
574
_slang_library_shad1d(stack[mach->sp]._float,
575
stack[mach->sp + 1]._float,
576
stack[mach->sp + 2]._float,
577
stack[mach->sp + 3]._float,
578
stack[mach->sp + 4]._float,
579
&mach->mem[stack[mach->sp + 5]._addr /
583
case slang_asm_vec4_shad2d:
584
_slang_library_shad2d(stack[mach->sp]._float,
585
stack[mach->sp + 1]._float,
586
stack[mach->sp + 2]._float,
587
stack[mach->sp + 3]._float,
588
stack[mach->sp + 4]._float,
589
&mach->mem[stack[mach->sp + 5]._addr /
594
mach->ip = a->param[0];
596
case slang_asm_jump_if_zero:
597
if (stack[mach->sp]._float == 0.0f)
598
mach->ip = a->param[0];
601
case slang_asm_enter:
603
stack[mach->sp]._addr = mach->bp;
604
mach->bp = mach->sp + a->param[0] / 4;
606
case slang_asm_leave:
607
mach->bp = stack[mach->sp]._addr;
610
case slang_asm_local_alloc:
611
mach->sp -= a->param[0] / 4;
613
case slang_asm_local_free:
614
mach->sp += a->param[0] / 4;
616
case slang_asm_local_addr:
618
stack[mach->sp]._addr =
619
SLANG_MACHINE_GLOBAL_SIZE * 4 + mach->bp * 4 - (a->param[0] +
624
stack[mach->sp]._addr = mach->ip;
625
mach->ip = a->param[0];
627
case slang_asm_return:
628
mach->ip = stack[mach->sp]._addr;
631
case slang_asm_discard:
632
mach->kill = GL_TRUE;
635
mach->exit = GL_TRUE;
637
/* GL_MESA_shader_debug */
638
case slang_asm_float_print:
639
_mesa_printf("slang print: %f\n", stack[mach->sp]._float);
640
ensure_infolog_created(&mach->infolog);
641
slang_info_log_print(mach->infolog, "%f", stack[mach->sp]._float);
643
case slang_asm_int_print:
644
_mesa_printf("slang print: %d\n", (GLint) stack[mach->sp]._float);
645
ensure_infolog_created(&mach->infolog);
646
slang_info_log_print(mach->infolog, "%d",
647
(GLint) (stack[mach->sp]._float));
649
case slang_asm_bool_print:
650
_mesa_printf("slang print: %s\n",
651
(GLint) stack[mach->sp]._float ? "true" : "false");
652
ensure_infolog_created(&mach->infolog);
653
slang_info_log_print(mach->infolog, "%s",
654
(GLint) (stack[mach->sp].
655
_float) ? "true" : "false");
658
case slang_asm_float_to_vec4:
659
/* [vec4] | float > [vec4] */
661
GLuint da = stack[mach->sp + 1]._addr;
662
mach->mem[da / 4]._float = stack[mach->sp]._float;
666
case slang_asm_vec4_add:
667
/* [vec4] | vec4 > [vec4] */
669
GLuint da = stack[mach->sp + 4]._addr;
670
mach->mem[da / 4]._float += stack[mach->sp]._float;
671
mach->mem[(da + 4) / 4]._float += stack[mach->sp + 1]._float;
672
mach->mem[(da + 8) / 4]._float += stack[mach->sp + 2]._float;
673
mach->mem[(da + 12) / 4]._float += stack[mach->sp + 3]._float;
677
case slang_asm_vec4_subtract:
678
/* [vec4] | vec4 > [vec4] */
680
GLuint da = stack[mach->sp + 4]._addr;
681
mach->mem[da / 4]._float -= stack[mach->sp]._float;
682
mach->mem[(da + 4) / 4]._float -= stack[mach->sp + 1]._float;
683
mach->mem[(da + 8) / 4]._float -= stack[mach->sp + 2]._float;
684
mach->mem[(da + 12) / 4]._float -= stack[mach->sp + 3]._float;
688
case slang_asm_vec4_multiply:
689
/* [vec4] | vec4 > [vec4] */
691
GLuint da = stack[mach->sp + 4]._addr;
692
mach->mem[da / 4]._float *= stack[mach->sp]._float;
693
mach->mem[(da + 4) / 4]._float *= stack[mach->sp + 1]._float;
694
mach->mem[(da + 8) / 4]._float *= stack[mach->sp + 2]._float;
695
mach->mem[(da + 12) / 4]._float *= stack[mach->sp + 3]._float;
699
case slang_asm_vec4_divide:
700
/* [vec4] | vec4 > [vec4] */
702
GLuint da = stack[mach->sp + 4]._addr;
703
mach->mem[da / 4]._float /= stack[mach->sp]._float;
704
mach->mem[(da + 4) / 4]._float /= stack[mach->sp + 1]._float;
705
mach->mem[(da + 8) / 4]._float /= stack[mach->sp + 2]._float;
706
mach->mem[(da + 12) / 4]._float /= stack[mach->sp + 3]._float;
710
case slang_asm_vec4_negate:
711
/* [vec4] > [vec4] */
713
GLuint da = stack[mach->sp]._addr;
714
mach->mem[da / 4]._float = -mach->mem[da / 4]._float;
715
mach->mem[(da + 4) / 4]._float = -mach->mem[(da + 4) / 4]._float;
716
mach->mem[(da + 8) / 4]._float = -mach->mem[(da + 8) / 4]._float;
717
mach->mem[(da + 12) / 4]._float =
718
-mach->mem[(da + 12) / 4]._float;
721
case slang_asm_vec4_dot:
722
/* [vec4] | vec4 > [float] */
724
GLuint da = stack[mach->sp + 4]._addr;
725
mach->mem[da / 4]._float =
726
mach->mem[da / 4]._float * stack[mach->sp]._float +
727
mach->mem[(da + 4) / 4]._float * stack[mach->sp + 1]._float +
728
mach->mem[(da + 8) / 4]._float * stack[mach->sp + 2]._float +
729
mach->mem[(da + 12) / 4]._float * stack[mach->sp + 3]._float;
733
case slang_asm_vec4_copy:
734
/* [vec4] | vec4 > [vec4] */
736
GLuint da = stack[mach->sp + a->param[0] / 4]._addr + a->param[1];
737
mach->mem[da / 4]._float = stack[mach->sp]._float;
738
mach->mem[(da + 4) / 4]._float = stack[mach->sp + 1]._float;
739
mach->mem[(da + 8) / 4]._float = stack[mach->sp + 2]._float;
740
mach->mem[(da + 12) / 4]._float = stack[mach->sp + 3]._float;
744
case slang_asm_vec4_deref:
747
GLuint sa = stack[mach->sp]._addr;
749
stack[mach->sp]._float = mach->mem[sa / 4]._float;
750
stack[mach->sp + 1]._float = mach->mem[(sa + 4) / 4]._float;
751
stack[mach->sp + 2]._float = mach->mem[(sa + 8) / 4]._float;
752
stack[mach->sp + 3]._float = mach->mem[(sa + 12) / 4]._float;
755
case slang_asm_vec4_equal_int:
757
GLuint sp0 = mach->sp + a->param[0] / 4;
758
GLuint sp1 = mach->sp + a->param[1] / 4;
760
if (stack[sp0]._float == stack[sp1]._float &&
761
stack[sp0 + 1]._float == stack[sp1 + 1]._float &&
762
stack[sp0 + 2]._float == stack[sp1 + 2]._float &&
763
stack[sp0 + 3]._float == stack[sp1 + 3]._float) {
764
stack[mach->sp]._float = 1.0f;
767
stack[mach->sp]._float = 0.0f;
772
_mesa_problem(NULL, "bad slang opcode 0x%x", a->type);