Extend printMESA function to output also to shader's info log.
authorMichal Krol <mjkrol@gmail.org>
Tue, 16 May 2006 10:04:24 +0000 (10:04 +0000)
committerMichal Krol <mjkrol@gmail.org>
Tue, 16 May 2006 10:04:24 +0000 (10:04 +0000)
Fix float-to-int conversion for x86 back-end.

src/mesa/shader/slang/slang_execute.c
src/mesa/shader/slang/slang_execute.h
src/mesa/shader/slang/slang_execute_x86.c

index 5577909da068b99c7ca0f19d6edfe1489727b051..e5beb509f0b0c4c5e0ac47cfac6ea5abea3b2711 100644 (file)
@@ -29,6 +29,7 @@
  */
 
 #include "imports.h"
+#include "slang_compile.h"
 #include "slang_execute.h"
 #include "slang_library_noise.h"
 #include "slang_library_texsample.h"
@@ -38,6 +39,7 @@
 GLvoid slang_machine_ctr (slang_machine *self)
 {
        slang_machine_init (self);
+   self->infolog = NULL;
 #if defined(USE_X86_ASM) || defined(SLANG_X86)
        self->x86.compiled_func = NULL;
 #endif
@@ -45,6 +47,10 @@ GLvoid slang_machine_ctr (slang_machine *self)
 
 GLvoid slang_machine_dtr (slang_machine *self)
 {
+   if (self->infolog != NULL) {
+      slang_info_log_destruct (self->infolog);
+      slang_alloc_free (self->infolog);
+   }
 #if defined(USE_X86_ASM) || defined(SLANG_X86)
        if (self->x86.compiled_func != NULL)
                _mesa_exec_free (self->x86.compiled_func);
@@ -60,14 +66,6 @@ void slang_machine_init (slang_machine *mach)
        mach->exit = 0;
 }
 
-int _slang_execute (const slang_assembly_file *file)
-{
-       slang_machine mach;
-
-       slang_machine_ctr (&mach);
-       return _slang_execute2 (file, &mach);
-}
-
 #if DEBUG_SLANG
 
 static void dump_instruction (FILE *f, slang_assembly *a, unsigned int i)
@@ -286,6 +284,17 @@ static void dump (const slang_assembly_file *file)
 
 #endif
 
+static GLvoid
+ensure_infolog_created (slang_info_log **infolog)
+{
+   if (*infolog == NULL) {
+      *infolog = slang_alloc_malloc (sizeof (slang_info_log));
+      if (*infolog == NULL)
+         return;
+      slang_info_log_construct (*infolog);
+   }
+}
+
 int _slang_execute2 (const slang_assembly_file *file, slang_machine *mach)
 {
        slang_machine_slot *stack;
@@ -545,12 +554,19 @@ int _slang_execute2 (const slang_assembly_file *file, slang_machine *mach)
                /* mesa-specific extensions */
                case slang_asm_float_print:
                        _mesa_printf ("slang print: %f\n", stack[mach->sp]._float);
+         ensure_infolog_created (&mach->infolog);
+         slang_info_log_print (mach->infolog, "%f", stack[mach->sp]._float);
                        break;
                case slang_asm_int_print:
                        _mesa_printf ("slang print: %d\n", (GLint) stack[mach->sp]._float);
+         ensure_infolog_created (&mach->infolog);
+         slang_info_log_print (mach->infolog, "%d", (GLint) (stack[mach->sp]._float));
                        break;
                case slang_asm_bool_print:
                        _mesa_printf ("slang print: %s\n", (GLint) stack[mach->sp]._float ? "true" : "false");
+         ensure_infolog_created (&mach->infolog);
+         slang_info_log_print (mach->infolog, "%s",
+                               (GLint) (stack[mach->sp]._float) ? "true" : "false");
                        break;
                default:
                        assert (0);
index 4fca84c5506abb0223d3947e3945b7f7fadb8c06..4afad20a4dea2151f2e8fcb937b2eba2141373f6 100644 (file)
@@ -59,6 +59,7 @@ typedef struct slang_machine_
        GLuint kill;                            /* discard the fragment */
        GLuint exit;                            /* terminate the shader */
        slang_machine_slot mem[SLANG_MACHINE_MEMORY_SIZE];
+   struct slang_info_log_ *infolog;                /* printMESA() support */
 #if defined(USE_X86_ASM) || defined(SLANG_X86)
        slang_machine_x86 x86;
 #endif
@@ -69,7 +70,6 @@ GLvoid slang_machine_dtr (slang_machine *);
 
 void slang_machine_init (slang_machine *);
 
-int _slang_execute (const slang_assembly_file *);
 int _slang_execute2 (const slang_assembly_file *, slang_machine *);
 
 #if defined(USE_X86_ASM) || defined(SLANG_X86)
index ea140bd0b0d0ac9c4d8668d06ddb40fdcd3db378..9d2967f2b7395de97c7e6ddba21ce1bd44f13bf9 100644 (file)
@@ -29,6 +29,7 @@
  */
 
 #include "imports.h"
+#include "slang_compile.h"
 #include "slang_execute.h"
 #include "slang_library_noise.h"
 #include "slang_library_texsample.h"
@@ -133,30 +134,53 @@ static GLfloat do_floorf (GLfloat x)
        return FLOORF (x);
 }
 
+static GLfloat
+do_ftoi (GLfloat x)
+{
+   return (GLfloat) ((GLint) (x));
+}
+
 static GLfloat do_powf (GLfloat y, GLfloat x)
 {
        return (GLfloat) _mesa_pow ((GLdouble) x, (GLdouble) y);
 }
 
-static GLvoid do_print_float (GLfloat x)
+static GLvoid
+ensure_infolog_created (slang_info_log **infolog)
 {
-       _mesa_printf ("slang print: %f\n", x);
+   if (*infolog == NULL) {
+      *infolog = slang_alloc_malloc (sizeof (slang_info_log));
+      if (*infolog == NULL)
+         return;
+      slang_info_log_construct (*infolog);
+   }
 }
 
-static GLvoid do_print_int (GLfloat x)
+static GLvoid do_print_float (slang_info_log **infolog, GLfloat x)
 {
-       _mesa_printf ("slang print: %d\n", (GLint) x);
+   _mesa_printf ("slang print: %f\n", x);
+   ensure_infolog_created (infolog);
+   slang_info_log_print (*infolog, "%f", x);
 }
 
-static GLvoid do_print_bool (GLfloat x)
+static GLvoid do_print_int (slang_info_log **infolog, GLfloat x)
 {
-       _mesa_printf ("slang print: %s\n", (GLint) x ? "true" : "false");
+   _mesa_printf ("slang print: %d\n", (GLint) (x));
+   ensure_infolog_created (infolog);
+   slang_info_log_print (*infolog, "%d", (GLint) (x));
+}
+
+static GLvoid do_print_bool (slang_info_log **infolog, GLfloat x)
+{
+   _mesa_printf ("slang print: %s\n", (GLint) (x) ? "true" : "false");
+   ensure_infolog_created (infolog);
+   slang_info_log_print (*infolog, "%s", (GLint) (x) ? "true" : "false");
 }
 
 #define FLOAT_ONE 0x3f800000
 #define FLOAT_ZERO 0
 
-static GLvoid codegen_assem (codegen_ctx *G, slang_assembly *a)
+static GLvoid codegen_assem (codegen_ctx *G, slang_assembly *a, slang_info_log **infolog)
 {
        GLint disp;
 
@@ -287,8 +311,9 @@ static GLvoid codegen_assem (codegen_ctx *G, slang_assembly *a)
                }
                break;
        case slang_asm_float_to_int:
-               x87_fld (&G->f, x86_deref (G->r_esp));
-               x87_fistp (&G->f, x86_deref (G->r_esp));
+      /* TODO: use fistp without rounding */
+      x86_call (&G->f, (GLubyte *) (do_ftoi));
+      x87_fstp (&G->f, x86_deref (G->r_esp));
                break;
        case slang_asm_float_sine:
                /* TODO: use fsin */
@@ -457,14 +482,26 @@ static GLvoid codegen_assem (codegen_ctx *G, slang_assembly *a)
                x86_jmp (&G->f, G->l_exit);
                break;
        /* mesa-specific extensions */
-       case slang_asm_float_print:
-               x86_call (&G->f, (GLubyte *) do_print_float);
-               break;
+   case slang_asm_float_print:
+      /* TODO: use push imm32 */
+      x86_mov_reg_imm (&G->f, G->r_eax, (GLint) (infolog));
+      x86_push (&G->f, G->r_eax);
+      x86_call (&G->f, (GLubyte *) (do_print_float));
+      x86_lea (&G->f, G->r_esp, x86_make_disp (G->r_esp, 4));
+      break;
        case slang_asm_int_print:
+      /* TODO: use push imm32 */
+      x86_mov_reg_imm (&G->f, G->r_eax, (GLint) (infolog));
+      x86_push (&G->f, G->r_eax);
                x86_call (&G->f, (GLubyte *) do_print_int);
+      x86_lea (&G->f, G->r_esp, x86_make_disp (G->r_esp, 4));
                break;
        case slang_asm_bool_print:
+      /* TODO: use push imm32 */
+      x86_mov_reg_imm (&G->f, G->r_eax, (GLint) (infolog));
+      x86_push (&G->f, G->r_eax);
                x86_call (&G->f, (GLubyte *) do_print_bool);
+      x86_lea (&G->f, G->r_esp, x86_make_disp (G->r_esp, 4));
                break;
        default:
                assert (0);
@@ -523,7 +560,7 @@ GLboolean _slang_x86_codegen (slang_machine *mach, slang_assembly_file *file, GL
                G.labels[i] = x86_get_label (&G.f);
                if (i == start)
                        x86_fixup_fwd_jump (&G.f, j_body);
-               codegen_assem (&G, &file->code[i]);
+               codegen_assem (&G, &file->code[i], &mach->infolog);
        }
 
        /*