diff options
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/shader/slang/slang_assemble.h | 42 | ||||
-rw-r--r-- | src/mesa/shader/slang/slang_execute.c | 26 |
2 files changed, 50 insertions, 18 deletions
diff --git a/src/mesa/shader/slang/slang_assemble.h b/src/mesa/shader/slang/slang_assemble.h index 3f75e971bee..d004e665003 100644 --- a/src/mesa/shader/slang/slang_assemble.h +++ b/src/mesa/shader/slang/slang_assemble.h @@ -42,56 +42,65 @@ typedef enum slang_assembly_type_ slang_asm_float_move, slang_asm_float_push, slang_asm_float_deref, - slang_asm_float_add, + slang_asm_float_add, /* a = pop(); b = pop(); push(a + b); */ slang_asm_float_multiply, slang_asm_float_divide, - slang_asm_float_negate, - slang_asm_float_less, + slang_asm_float_negate, /* push(-pop()) */ + slang_asm_float_less, /* a = pop(); b = pop(); push(a < b); */ slang_asm_float_equal_exp, slang_asm_float_equal_int, - slang_asm_float_to_int, - slang_asm_float_sine, + slang_asm_float_to_int, /* push(floatToInt(pop())) */ + slang_asm_float_sine, /* push(sin(pop()) */ slang_asm_float_arcsine, slang_asm_float_arctan, - slang_asm_float_power, + slang_asm_float_power, /* push(pow(pop(), pop())) */ slang_asm_float_log2, slang_asm_float_floor, slang_asm_float_ceil, - slang_asm_float_noise1, - slang_asm_float_noise2, + slang_asm_float_noise1, /* push(noise1(pop()) */ + slang_asm_float_noise2, /* push(noise2(pop(), pop())) */ slang_asm_float_noise3, slang_asm_float_noise4, + slang_asm_int_copy, slang_asm_int_move, slang_asm_int_push, slang_asm_int_deref, slang_asm_int_to_float, slang_asm_int_to_addr, + slang_asm_bool_copy, slang_asm_bool_move, slang_asm_bool_push, slang_asm_bool_deref, + slang_asm_addr_copy, slang_asm_addr_push, slang_asm_addr_deref, slang_asm_addr_add, slang_asm_addr_multiply, + slang_asm_vec4_tex1d, slang_asm_vec4_tex2d, slang_asm_vec4_tex3d, slang_asm_vec4_texcube, slang_asm_vec4_shad1d, slang_asm_vec4_shad2d, + slang_asm_jump, slang_asm_jump_if_zero, + slang_asm_enter, slang_asm_leave, + slang_asm_local_alloc, slang_asm_local_free, slang_asm_local_addr, slang_asm_global_addr, - slang_asm_call, + + slang_asm_call, /* push(ip); jump(inst->param[0]); */ slang_asm_return, + slang_asm_discard, slang_asm_exit, /* GL_MESA_shader_debug */ @@ -113,13 +122,21 @@ typedef enum slang_assembly_type_ slang_asm__last } slang_assembly_type; + +/** + * An assembly-level shader instruction. + */ typedef struct slang_assembly_ { - slang_assembly_type type; - GLfloat literal; - GLuint param[2]; + slang_assembly_type type; /**< The instruction opcode */ + GLfloat literal; /**< float literal */ + GLuint param[2]; /**< Two integer/address parameters */ } slang_assembly; + +/** + * A list of slang_assembly instructions + */ typedef struct slang_assembly_file_ { slang_assembly *code; @@ -127,6 +144,7 @@ typedef struct slang_assembly_file_ GLuint capacity; } slang_assembly_file; + extern GLvoid _slang_assembly_file_ctr(slang_assembly_file *); diff --git a/src/mesa/shader/slang/slang_execute.c b/src/mesa/shader/slang/slang_execute.c index d6689bc8a46..e469de02075 100644 --- a/src/mesa/shader/slang/slang_execute.c +++ b/src/mesa/shader/slang/slang_execute.c @@ -59,6 +59,11 @@ slang_machine_dtr(slang_machine * self) #endif } + +/** + * Initialize the shader virtual machine. + * NOTE: stack grows downward in memory. + */ void slang_machine_init(slang_machine * mach) { @@ -71,7 +76,7 @@ slang_machine_init(slang_machine * mach) #if DEBUG_SLANG -foo static void +static void dump_instruction(FILE * f, slang_assembly * a, unsigned int i) { fprintf(f, "%.5u:\t", i); @@ -362,7 +367,7 @@ _slang_execute2(const slang_assembly_file * file, slang_machine * mach) stack = mach->mem + SLANG_MACHINE_GLOBAL_SIZE; while (!mach->exit) { - slang_assembly *a = &file->code[mach->ip]; + const slang_assembly *a = &file->code[mach->ip]; #if DEBUG_SLANG if (f != NULL && a->type != slang_asm_none) { @@ -386,8 +391,13 @@ _slang_execute2(const slang_assembly_file * file, slang_machine * mach) 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; + /* store top value on stack to memory */ + { + GLuint address + = (stack[mach->sp + a->param[0] / 4]._addr + a->param[1]) / 4; + GLfloat value = stack[mach->sp]._float; + mach->mem[address]._float = value; + } mach->sp++; break; case slang_asm_float_move: @@ -400,15 +410,18 @@ _slang_execute2(const slang_assembly_file * file, slang_machine * mach) case slang_asm_float_push: case slang_asm_int_push: case slang_asm_bool_push: + /* push float/int/bool literal onto stop of stack */ mach->sp--; stack[mach->sp]._float = a->literal; break; case slang_asm_float_deref: case slang_asm_int_deref: case slang_asm_bool_deref: + /* load value from memory, replace stop of stack with it */ stack[mach->sp]._float = mach->mem[stack[mach->sp]._addr / 4]._float; break; case slang_asm_float_add: + /* pop two top floats, push sum */ stack[mach->sp + 1]._float += stack[mach->sp]._float; mach->sp++; break; @@ -425,8 +438,8 @@ _slang_execute2(const slang_assembly_file * file, slang_machine * mach) break; case slang_asm_float_less: stack[mach->sp + 1]._float = - stack[mach->sp + 1]._float < - stack[mach->sp]._float ? (GLfloat) 1 : (GLfloat) 0; + (stack[mach->sp + 1]._float < stack[mach->sp]._float) + ? (GLfloat) 1 : (GLfloat) 0; mach->sp++; break; case slang_asm_float_equal_exp: @@ -436,6 +449,7 @@ _slang_execute2(const slang_assembly_file * file, slang_machine * mach) mach->sp++; break; case slang_asm_float_equal_int: + /* pop top two values, compare, push 0 or 1 */ mach->sp--; stack[mach->sp]._float = (stack[mach->sp + 1 + a->param[0] / 4]._float == |