comments
authorBrian Paul <brian.paul@tungstengraphics.com>
Sat, 18 Nov 2006 17:23:30 +0000 (17:23 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sat, 18 Nov 2006 17:23:30 +0000 (17:23 +0000)
src/mesa/shader/slang/slang_assemble.h
src/mesa/shader/slang/slang_execute.c

index 3f75e971bee4a1214196938656913d473c7a4844..d004e6650035b13e4a43e3d2ffc3bbba60eb34cd 100644 (file)
@@ -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 *);
 
index d6689bc8a46c8d6f52eda239bc6418e7d1275b0f..e469de02075c1531084a14c7ad126f4cc4697d01 100644 (file)
@@ -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 ==