Extend printMESA function to output also to shader's info log.

Fix float-to-int conversion for x86 back-end.
This commit is contained in:
Michal Krol 2006-05-16 10:04:24 +00:00
parent a67330d157
commit 21ef956e9a
3 changed files with 75 additions and 22 deletions

View 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);

View 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)

View 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);
}
/*