📄 slang_execute.c
字号:
}
#endif
int _slang_execute2 (const slang_assembly_file *file, slang_machine *mach)
{
slang_machine_slot *stack;
#if DEBUG_SLANG
static unsigned int counter = 0;
char filename[256];
FILE *f;
#endif
/* assume 32-bit floats and uints; should work fine also on 64-bit platforms */
static_assert(sizeof (GLfloat) == 4);
static_assert(sizeof (GLuint) == 4);
#if DEBUG_SLANG
dump (file);
counter++;
_mesa_sprintf (filename, "~mesa-slang-assembly-exec-(%u).txt", counter);
f = fopen (filename, "w");
#endif
#if defined(USE_X86_ASM) || defined(SLANG_X86)
if (mach->x86.compiled_func != NULL)
{
mach->x86.compiled_func (mach);
return 1;
}
#endif
stack = mach->mem + SLANG_MACHINE_GLOBAL_SIZE;
while (!mach->exit)
{
slang_assembly *a = &file->code[mach->ip];
#if DEBUG_SLANG
if (f != NULL && a->type != slang_asm_none)
{
unsigned int i;
dump_instruction (f, file->code + mach->ip, mach->ip);
fprintf (f, "\t\tsp=%u bp=%u\n", mach->sp, mach->bp);
for (i = mach->sp; i < SLANG_MACHINE_STACK_SIZE; i++)
fprintf (f, "\t%.5u\t%6f\t%u\n", i, stack[i]._float, stack[i]._addr);
fflush (f);
}
#endif
mach->ip++;
switch (a->type)
{
/* core */
case slang_asm_none:
break;
case slang_asm_float_copy:
case slang_asm_int_copy:
case slang_asm_bool_copy:
mach->mem[(stack[mach->sp + a->param[0] / 4]._addr + a->param[1]) / 4]._float =
stack[mach->sp]._float;
mach->sp++;
break;
case slang_asm_float_move:
case slang_asm_int_move:
case slang_asm_bool_move:
stack[mach->sp + a->param[0] / 4]._float =
stack[mach->sp + (stack[mach->sp]._addr + a->param[1]) / 4]._float;
break;
case slang_asm_float_push:
case slang_asm_int_push:
case slang_asm_bool_push:
mach->sp--;
stack[mach->sp]._float = a->literal;
break;
case slang_asm_float_deref:
case slang_asm_int_deref:
case slang_asm_bool_deref:
stack[mach->sp]._float = mach->mem[stack[mach->sp]._addr / 4]._float;
break;
case slang_asm_float_add:
stack[mach->sp + 1]._float += stack[mach->sp]._float;
mach->sp++;
break;
case slang_asm_float_multiply:
stack[mach->sp + 1]._float *= stack[mach->sp]._float;
mach->sp++;
break;
case slang_asm_float_divide:
stack[mach->sp + 1]._float /= stack[mach->sp]._float;
mach->sp++;
break;
case slang_asm_float_negate:
stack[mach->sp]._float = -stack[mach->sp]._float;
break;
case slang_asm_float_less:
stack[mach->sp + 1]._float =
stack[mach->sp + 1]._float < stack[mach->sp]._float ? (GLfloat) 1 : (GLfloat) 0;
mach->sp++;
break;
case slang_asm_float_equal_exp:
stack[mach->sp + 1]._float =
stack[mach->sp + 1]._float == stack[mach->sp]._float ? (GLfloat) 1 : (GLfloat) 0;
mach->sp++;
break;
case slang_asm_float_equal_int:
mach->sp--;
stack[mach->sp]._float = stack[mach->sp + 1 + a->param[0] / 4]._float ==
stack[mach->sp + 1 + a->param[1] / 4]._float ? (GLfloat) 1 : (GLfloat) 0;
break;
case slang_asm_float_to_int:
stack[mach->sp]._float = (GLfloat) (GLint) stack[mach->sp]._float;
break;
case slang_asm_float_sine:
stack[mach->sp]._float = (GLfloat) _mesa_sin (stack[mach->sp]._float);
break;
case slang_asm_float_arcsine:
stack[mach->sp]._float = _mesa_asinf (stack[mach->sp]._float);
break;
case slang_asm_float_arctan:
stack[mach->sp]._float = _mesa_atanf (stack[mach->sp]._float);
break;
case slang_asm_float_power:
stack[mach->sp + 1]._float =
(GLfloat) _mesa_pow (stack[mach->sp + 1]._float, stack[mach->sp]._float);
mach->sp++;
break;
case slang_asm_float_log2:
stack[mach->sp]._float = LOG2 (stack[mach->sp]._float);
break;
case slang_asm_float_floor:
stack[mach->sp]._float = FLOORF (stack[mach->sp]._float);
break;
case slang_asm_float_ceil:
stack[mach->sp]._float = CEILF (stack[mach->sp]._float);
break;
case slang_asm_float_noise1:
stack[mach->sp]._float = _slang_library_noise1 (stack[mach->sp]._float);
break;
case slang_asm_float_noise2:
stack[mach->sp + 1]._float = _slang_library_noise2 (stack[mach->sp]._float,
stack[mach->sp + 1]._float);
mach->sp++;
break;
case slang_asm_float_noise3:
stack[mach->sp + 2]._float = _slang_library_noise3 (stack[mach->sp]._float,
stack[mach->sp + 1]._float, stack[mach->sp + 2]._float);
mach->sp += 2;
break;
case slang_asm_float_noise4:
stack[mach->sp + 3]._float = _slang_library_noise4 (stack[mach->sp]._float,
stack[mach->sp + 1]._float, stack[mach->sp + 2]._float, stack[mach->sp + 3]._float);
mach->sp += 3;
break;
case slang_asm_int_to_float:
break;
case slang_asm_int_to_addr:
stack[mach->sp]._addr = (GLuint) (GLint) stack[mach->sp]._float;
break;
case slang_asm_addr_copy:
mach->mem[stack[mach->sp + 1]._addr / 4]._addr = stack[mach->sp]._addr;
mach->sp++;
break;
case slang_asm_addr_push:
case slang_asm_global_addr:
mach->sp--;
stack[mach->sp]._addr = a->param[0];
break;
case slang_asm_addr_deref:
stack[mach->sp]._addr = mach->mem[stack[mach->sp]._addr / 4]._addr;
break;
case slang_asm_addr_add:
stack[mach->sp + 1]._addr += stack[mach->sp]._addr;
mach->sp++;
break;
case slang_asm_addr_multiply:
stack[mach->sp + 1]._addr *= stack[mach->sp]._addr;
mach->sp++;
break;
case slang_asm_vec4_tex1d:
_slang_library_tex1d (stack[mach->sp]._float, stack[mach->sp + 1]._float,
stack[mach->sp + 2]._float, &mach->mem[stack[mach->sp + 3]._addr / 4]._float);
mach->sp += 3;
break;
case slang_asm_vec4_tex2d:
_slang_library_tex2d (stack[mach->sp]._float, stack[mach->sp + 1]._float,
stack[mach->sp + 2]._float, stack[mach->sp + 3]._float,
&mach->mem[stack[mach->sp + 4]._addr / 4]._float);
mach->sp += 4;
break;
case slang_asm_vec4_tex3d:
_slang_library_tex3d (stack[mach->sp]._float, stack[mach->sp + 1]._float,
stack[mach->sp + 2]._float, stack[mach->sp + 3]._float, stack[mach->sp + 4]._float,
&mach->mem[stack[mach->sp + 5]._addr / 4]._float);
mach->sp += 5;
break;
case slang_asm_vec4_texcube:
_slang_library_texcube (stack[mach->sp]._float, stack[mach->sp + 1]._float,
stack[mach->sp + 2]._float, stack[mach->sp + 3]._float, stack[mach->sp + 4]._float,
&mach->mem[stack[mach->sp + 5]._addr / 4]._float);
mach->sp += 5;
break;
case slang_asm_vec4_shad1d:
_slang_library_shad1d (stack[mach->sp]._float, stack[mach->sp + 1]._float,
stack[mach->sp + 2]._float, stack[mach->sp + 3]._float, stack[mach->sp + 4]._float,
&mach->mem[stack[mach->sp + 5]._addr / 4]._float);
mach->sp += 5;
break;
case slang_asm_vec4_shad2d:
_slang_library_shad2d (stack[mach->sp]._float, stack[mach->sp + 1]._float,
stack[mach->sp + 2]._float, stack[mach->sp + 3]._float, stack[mach->sp + 4]._float,
&mach->mem[stack[mach->sp + 5]._addr / 4]._float);
mach->sp += 5;
break;
case slang_asm_jump:
mach->ip = a->param[0];
break;
case slang_asm_jump_if_zero:
if (stack[mach->sp]._float == 0.0f)
mach->ip = a->param[0];
mach->sp++;
break;
case slang_asm_enter:
mach->sp--;
stack[mach->sp]._addr = mach->bp;
mach->bp = mach->sp + a->param[0] / 4;
break;
case slang_asm_leave:
mach->bp = stack[mach->sp]._addr;
mach->sp++;
break;
case slang_asm_local_alloc:
mach->sp -= a->param[0] / 4;
break;
case slang_asm_local_free:
mach->sp += a->param[0] / 4;
break;
case slang_asm_local_addr:
mach->sp--;
stack[mach->sp]._addr = SLANG_MACHINE_GLOBAL_SIZE * 4 + mach->bp * 4 -
(a->param[0] + a->param[1]) + 4;
break;
case slang_asm_call:
mach->sp--;
stack[mach->sp]._addr = mach->ip;
mach->ip = a->param[0];
break;
case slang_asm_return:
mach->ip = stack[mach->sp]._addr;
mach->sp++;
break;
case slang_asm_discard:
mach->kill = 1;
break;
case slang_asm_exit:
mach->exit = 1;
break;
/* mesa-specific extensions */
case slang_asm_float_print:
_mesa_printf ("slang print: %f\n", stack[mach->sp]._float);
break;
case slang_asm_int_print:
_mesa_printf ("slang print: %d\n", (GLint) stack[mach->sp]._float);
break;
case slang_asm_bool_print:
_mesa_printf ("slang print: %s\n", (GLint) stack[mach->sp]._float ? "true" : "false");
break;
default:
assert (0);
}
}
#if DEBUG_SLANG
if (f != NULL)
fclose (f);
#endif
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -