Cleanup code.
This commit is contained in:
@@ -52,120 +52,65 @@ static GLuint slang_var_pool_alloc (slang_var_pool *pool, unsigned int size)
|
||||
return addr;
|
||||
}
|
||||
|
||||
/* slang_translation_unit */
|
||||
/*
|
||||
* slang_code_unit
|
||||
*/
|
||||
|
||||
int slang_translation_unit_construct (slang_translation_unit *unit)
|
||||
GLvoid
|
||||
_slang_code_unit_ctr (slang_code_unit *self, struct slang_code_object_ *object)
|
||||
{
|
||||
unit->assembly = (slang_assembly_file *) slang_alloc_malloc (sizeof (slang_assembly_file));
|
||||
if (unit->assembly == NULL)
|
||||
return 0;
|
||||
if (!slang_assembly_file_construct (unit->assembly))
|
||||
{
|
||||
slang_alloc_free (unit->assembly);
|
||||
return 0;
|
||||
}
|
||||
unit->global_pool = (slang_var_pool *) slang_alloc_malloc (sizeof (slang_var_pool));
|
||||
if (unit->global_pool == NULL)
|
||||
{
|
||||
slang_assembly_file_destruct (unit->assembly);
|
||||
slang_alloc_free (unit->assembly);
|
||||
return 0;
|
||||
}
|
||||
unit->global_pool->next_addr = 0;
|
||||
unit->machine = (slang_machine *) slang_alloc_malloc (sizeof (slang_machine));
|
||||
if (unit->machine == NULL)
|
||||
{
|
||||
slang_alloc_free (unit->global_pool);
|
||||
slang_assembly_file_destruct (unit->assembly);
|
||||
slang_alloc_free (unit->assembly);
|
||||
return 0;
|
||||
}
|
||||
slang_machine_ctr (unit->machine);
|
||||
unit->atom_pool = (slang_atom_pool *) slang_alloc_malloc (sizeof (slang_atom_pool));
|
||||
if (unit->atom_pool == NULL)
|
||||
{
|
||||
slang_alloc_free (unit->machine);
|
||||
slang_alloc_free (unit->global_pool);
|
||||
slang_assembly_file_destruct (unit->assembly);
|
||||
slang_alloc_free (unit->assembly);
|
||||
return 0;
|
||||
}
|
||||
slang_atom_pool_construct (unit->atom_pool);
|
||||
if (!slang_translation_unit_construct2 (unit, unit->assembly, unit->global_pool, unit->machine,
|
||||
unit->atom_pool))
|
||||
{
|
||||
slang_alloc_free (unit->atom_pool);
|
||||
slang_alloc_free (unit->machine);
|
||||
slang_alloc_free (unit->global_pool);
|
||||
slang_assembly_file_destruct (unit->assembly);
|
||||
slang_alloc_free (unit->assembly);
|
||||
return 0;
|
||||
}
|
||||
unit->free_assembly = 1;
|
||||
unit->free_global_pool = 1;
|
||||
unit->free_machine = 1;
|
||||
unit->free_atom_pool = 1;
|
||||
return 1;
|
||||
_slang_variable_scope_ctr (&self->vars);
|
||||
_slang_function_scope_ctr (&self->funs);
|
||||
_slang_struct_scope_ctr (&self->structs);
|
||||
self->object = object;
|
||||
}
|
||||
|
||||
int slang_translation_unit_construct2 (slang_translation_unit *unit, slang_assembly_file *file,
|
||||
slang_var_pool *pool, struct slang_machine_ *mach, slang_atom_pool *atoms)
|
||||
GLvoid
|
||||
_slang_code_unit_dtr (slang_code_unit *self)
|
||||
{
|
||||
if (!slang_variable_scope_construct (&unit->globals))
|
||||
return 0;
|
||||
if (!slang_function_scope_construct (&unit->functions))
|
||||
{
|
||||
slang_variable_scope_destruct (&unit->globals);
|
||||
return 0;
|
||||
}
|
||||
if (!slang_struct_scope_construct (&unit->structs))
|
||||
{
|
||||
slang_variable_scope_destruct (&unit->globals);
|
||||
slang_function_scope_destruct (&unit->functions);
|
||||
return 0;
|
||||
}
|
||||
unit->assembly = file;
|
||||
unit->free_assembly = 0;
|
||||
unit->global_pool = pool;
|
||||
unit->free_global_pool = 0;
|
||||
unit->machine = mach;
|
||||
unit->free_machine = 0;
|
||||
unit->atom_pool = atoms;
|
||||
unit->free_atom_pool = 0;
|
||||
slang_export_data_table_ctr (&unit->exp_data);
|
||||
slang_export_code_table_ctr (&unit->exp_code);
|
||||
return 1;
|
||||
slang_variable_scope_destruct (&self->vars);
|
||||
slang_function_scope_destruct (&self->funs);
|
||||
slang_struct_scope_destruct (&self->structs);
|
||||
}
|
||||
|
||||
void slang_translation_unit_destruct (slang_translation_unit *unit)
|
||||
/*
|
||||
* slang_code_object
|
||||
*/
|
||||
|
||||
GLvoid
|
||||
_slang_code_object_ctr (slang_code_object *self)
|
||||
{
|
||||
slang_variable_scope_destruct (&unit->globals);
|
||||
slang_function_scope_destruct (&unit->functions);
|
||||
slang_struct_scope_destruct (&unit->structs);
|
||||
if (unit->free_assembly)
|
||||
{
|
||||
slang_assembly_file_destruct (unit->assembly);
|
||||
slang_alloc_free (unit->assembly);
|
||||
}
|
||||
if (unit->free_global_pool)
|
||||
slang_alloc_free (unit->global_pool);
|
||||
if (unit->free_machine)
|
||||
{
|
||||
slang_machine_dtr (unit->machine);
|
||||
slang_alloc_free (unit->machine);
|
||||
}
|
||||
if (unit->free_atom_pool)
|
||||
{
|
||||
slang_atom_pool_destruct (unit->atom_pool);
|
||||
slang_alloc_free (unit->atom_pool);
|
||||
}
|
||||
slang_export_data_table_dtr (&unit->exp_data);
|
||||
slang_export_code_table_ctr (&unit->exp_code);
|
||||
_slang_code_unit_ctr (&self->builtin[0], self);
|
||||
_slang_code_unit_ctr (&self->builtin[1], self);
|
||||
_slang_code_unit_ctr (&self->builtin[2], self);
|
||||
_slang_code_unit_ctr (&self->unit, self);
|
||||
_slang_assembly_file_ctr (&self->assembly);
|
||||
slang_machine_ctr (&self->machine);
|
||||
self->varpool.next_addr = 0;
|
||||
slang_atom_pool_construct (&self->atompool);
|
||||
slang_export_data_table_ctr (&self->expdata);
|
||||
self->expdata.atoms = &self->atompool;
|
||||
slang_export_code_table_ctr (&self->expcode);
|
||||
self->expcode.atoms = &self->atompool;
|
||||
}
|
||||
|
||||
GLvoid
|
||||
_slang_code_object_dtr (slang_code_object *self)
|
||||
{
|
||||
_slang_code_unit_dtr (&self->builtin[0]);
|
||||
_slang_code_unit_dtr (&self->builtin[1]);
|
||||
_slang_code_unit_dtr (&self->builtin[2]);
|
||||
_slang_code_unit_dtr (&self->unit);
|
||||
slang_assembly_file_destruct (&self->assembly);
|
||||
slang_machine_dtr (&self->machine);
|
||||
slang_atom_pool_destruct (&self->atompool);
|
||||
slang_export_data_table_dtr (&self->expdata);
|
||||
slang_export_code_table_ctr (&self->expcode);
|
||||
}
|
||||
|
||||
/* slang_info_log */
|
||||
|
||||
static char *out_of_memory = "error: out of memory\n";
|
||||
static char *out_of_memory = "Error: Out of memory.\n";
|
||||
|
||||
void slang_info_log_construct (slang_info_log *log)
|
||||
{
|
||||
@@ -181,32 +126,44 @@ void slang_info_log_destruct (slang_info_log *log)
|
||||
|
||||
static int slang_info_log_message (slang_info_log *log, const char *prefix, const char *msg)
|
||||
{
|
||||
unsigned int new_size;
|
||||
GLuint size;
|
||||
|
||||
if (log->dont_free_text)
|
||||
return 0;
|
||||
new_size = slang_string_length (prefix) + 3 + slang_string_length (msg);
|
||||
if (log->text != NULL)
|
||||
{
|
||||
unsigned int text_len = slang_string_length (log->text);
|
||||
|
||||
log->text = (char *) slang_alloc_realloc (log->text, text_len + 1, new_size + text_len + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
log->text = (char *) slang_alloc_malloc (new_size + 1);
|
||||
if (log->text != NULL)
|
||||
log->text[0] = '\0';
|
||||
}
|
||||
size = slang_string_length (msg) + 2;
|
||||
if (prefix != NULL)
|
||||
size += slang_string_length (prefix) + 2;
|
||||
if (log->text != NULL) {
|
||||
GLuint old_len = slang_string_length (log->text);
|
||||
log->text = (char *) (slang_alloc_realloc (log->text, old_len + 1, old_len + size));
|
||||
}
|
||||
else {
|
||||
log->text = (char *) (slang_alloc_malloc (size));
|
||||
if (log->text != NULL)
|
||||
log->text[0] = '\0';
|
||||
}
|
||||
if (log->text == NULL)
|
||||
return 0;
|
||||
slang_string_concat (log->text, prefix);
|
||||
slang_string_concat (log->text, ": ");
|
||||
if (prefix != NULL) {
|
||||
slang_string_concat (log->text, prefix);
|
||||
slang_string_concat (log->text, ": ");
|
||||
}
|
||||
slang_string_concat (log->text, msg);
|
||||
slang_string_concat (log->text, "\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
int slang_info_log_print (slang_info_log *log, const char *msg, ...)
|
||||
{
|
||||
va_list va;
|
||||
char buf[1024];
|
||||
|
||||
va_start (va, msg);
|
||||
_mesa_vsprintf (buf, msg, va);
|
||||
va_end (va);
|
||||
return slang_info_log_message (log, NULL, buf);
|
||||
}
|
||||
|
||||
int slang_info_log_error (slang_info_log *log, const char *msg, ...)
|
||||
{
|
||||
va_list va;
|
||||
@@ -214,10 +171,10 @@ int slang_info_log_error (slang_info_log *log, const char *msg, ...)
|
||||
|
||||
va_start (va, msg);
|
||||
_mesa_vsprintf (buf, msg, va);
|
||||
if (slang_info_log_message (log, "error", buf))
|
||||
va_end (va);
|
||||
if (slang_info_log_message (log, "Error", buf))
|
||||
return 1;
|
||||
slang_info_log_memory (log);
|
||||
va_end (va);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -228,16 +185,16 @@ int slang_info_log_warning (slang_info_log *log, const char *msg, ...)
|
||||
|
||||
va_start (va, msg);
|
||||
_mesa_vsprintf (buf, msg, va);
|
||||
if (slang_info_log_message (log, "warning", buf))
|
||||
va_end (va);
|
||||
if (slang_info_log_message (log, "Warning", buf))
|
||||
return 1;
|
||||
slang_info_log_memory (log);
|
||||
va_end (va);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void slang_info_log_memory (slang_info_log *log)
|
||||
{
|
||||
if (!slang_info_log_message (log, "error", "out of memory"))
|
||||
if (!slang_info_log_message (log, "Error", "Out of memory."))
|
||||
{
|
||||
log->dont_free_text = 1;
|
||||
log->text = out_of_memory;
|
||||
@@ -302,7 +259,7 @@ static int parse_number (slang_parse_ctx *C, int *number)
|
||||
}
|
||||
C->I++;
|
||||
if (*number > 65535)
|
||||
slang_info_log_warning (C->L, "%d: literal integer overflow", *number);
|
||||
slang_info_log_warning (C->L, "%d: literal integer overflow.", *number);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -344,7 +301,7 @@ static int check_revision (slang_parse_ctx *C)
|
||||
{
|
||||
if (*C->I != REVISION)
|
||||
{
|
||||
slang_info_log_error (C->L, "internal compiler error");
|
||||
slang_info_log_error (C->L, "Internal compiler error.");
|
||||
return 0;
|
||||
}
|
||||
C->I++;
|
||||
@@ -486,7 +443,7 @@ static int parse_struct (slang_parse_ctx *C, slang_output_ctx *O, slang_struct *
|
||||
name = slang_atom_pool_id (C->atoms, a_name);
|
||||
if (name[0] != '\0' && slang_struct_scope_find (O->structs, a_name, 0) != NULL)
|
||||
{
|
||||
slang_info_log_error (C->L, "%s: duplicate type name", name);
|
||||
slang_info_log_error (C->L, "%s: duplicate type name.", name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -700,7 +657,7 @@ static int parse_type_specifier (slang_parse_ctx *C, slang_output_ctx *O, slang_
|
||||
stru = slang_struct_scope_find (O->structs, a_name, 1);
|
||||
if (stru == NULL)
|
||||
{
|
||||
slang_info_log_error (C->L, "%s: undeclared type name",
|
||||
slang_info_log_error (C->L, "%s: undeclared type name.",
|
||||
slang_atom_pool_id (C->atoms, a_name));
|
||||
return 0;
|
||||
}
|
||||
@@ -1220,7 +1177,7 @@ static int parse_expression (slang_parse_ctx *C, slang_output_ctx *O, slang_oper
|
||||
id = slang_atom_pool_id (C->atoms, op->a_id);
|
||||
if (!is_constructor_name (id, op->a_id, O->structs))
|
||||
{
|
||||
slang_info_log_error (C->L, "%s: undeclared function name", id);
|
||||
slang_info_log_error (C->L, "%s: undeclared function name.", id);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -1275,7 +1232,7 @@ static int parse_parameter_declaration (slang_parse_ctx *C, slang_output_ctx *O,
|
||||
case PARAM_QUALIFIER_IN:
|
||||
if (param->type.qualifier != slang_qual_const && param->type.qualifier != slang_qual_none)
|
||||
{
|
||||
slang_info_log_error (C->L, "invalid type qualifier");
|
||||
slang_info_log_error (C->L, "Invalid type qualifier.");
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
@@ -1284,7 +1241,7 @@ static int parse_parameter_declaration (slang_parse_ctx *C, slang_output_ctx *O,
|
||||
param->type.qualifier = slang_qual_out;
|
||||
else
|
||||
{
|
||||
slang_info_log_error (C->L, "invalid type qualifier");
|
||||
slang_info_log_error (C->L, "Invalid type qualifier.");
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
@@ -1293,7 +1250,7 @@ static int parse_parameter_declaration (slang_parse_ctx *C, slang_output_ctx *O,
|
||||
param->type.qualifier = slang_qual_inout;
|
||||
else
|
||||
{
|
||||
slang_info_log_error (C->L, "invalid type qualifier");
|
||||
slang_info_log_error (C->L, "Invalid type qualifier.");
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
@@ -1815,7 +1772,7 @@ static int parse_function (slang_parse_ctx *C, slang_output_ctx *O, int definiti
|
||||
{
|
||||
if (found_func->body != NULL)
|
||||
{
|
||||
slang_info_log_error (C->L, "%s: function already has a body",
|
||||
slang_info_log_error (C->L, "%s: function already has a body.",
|
||||
slang_atom_pool_id (C->atoms, parsed_func.header.a_name));
|
||||
slang_function_destruct (&parsed_func);
|
||||
return 0;
|
||||
@@ -1885,17 +1842,18 @@ static int parse_declaration (slang_parse_ctx *C, slang_output_ctx *O)
|
||||
#define EXTERNAL_FUNCTION_DEFINITION 1
|
||||
#define EXTERNAL_DECLARATION 2
|
||||
|
||||
static int parse_translation_unit (slang_parse_ctx *C, slang_translation_unit *unit)
|
||||
static GLboolean
|
||||
parse_code_unit (slang_parse_ctx *C, slang_code_unit *unit)
|
||||
{
|
||||
slang_output_ctx o;
|
||||
|
||||
/* setup output context */
|
||||
o.funs = &unit->functions;
|
||||
o.structs = &unit->structs;
|
||||
o.vars = &unit->globals;
|
||||
o.assembly = unit->assembly;
|
||||
o.global_pool = unit->global_pool;
|
||||
o.machine = unit->machine;
|
||||
/* setup output context */
|
||||
o.funs = &unit->funs;
|
||||
o.structs = &unit->structs;
|
||||
o.vars = &unit->vars;
|
||||
o.assembly = &unit->object->assembly;
|
||||
o.global_pool = &unit->object->varpool;
|
||||
o.machine = &unit->object->machine;
|
||||
|
||||
/* parse individual functions and declarations */
|
||||
while (*C->I != EXTERNAL_NULL)
|
||||
@@ -1927,60 +1885,44 @@ static int parse_translation_unit (slang_parse_ctx *C, slang_translation_unit *u
|
||||
#define BUILTIN_TARGET 2
|
||||
#define BUILTIN_TOTAL 3
|
||||
|
||||
static int compile_binary (const byte *prod, slang_translation_unit *unit, slang_unit_type type,
|
||||
slang_info_log *log, slang_translation_unit *builtins, slang_assembly_file *file,
|
||||
slang_var_pool *pool, slang_machine *mach, slang_translation_unit *downlink,
|
||||
slang_atom_pool *atoms)
|
||||
static GLboolean
|
||||
compile_binary (const byte *prod, slang_code_unit *unit, slang_unit_type type,
|
||||
slang_info_log *infolog, slang_code_unit *builtin, slang_code_unit *downlink)
|
||||
{
|
||||
slang_parse_ctx C;
|
||||
slang_parse_ctx C;
|
||||
|
||||
/* create translation unit object */
|
||||
if (file != NULL)
|
||||
{
|
||||
if (!slang_translation_unit_construct2 (unit, file, pool, mach, atoms))
|
||||
return 0;
|
||||
unit->type = type;
|
||||
}
|
||||
unit->type = type;
|
||||
|
||||
/* set-up parse context */
|
||||
C.I = prod;
|
||||
C.L = log;
|
||||
C.parsing_builtin = builtins == NULL;
|
||||
C.global_scope = 1;
|
||||
C.atoms = unit->atom_pool;
|
||||
/* setup parse context */
|
||||
C.I = prod;
|
||||
C.L = infolog;
|
||||
C.parsing_builtin = (builtin == NULL);
|
||||
C.global_scope = GL_TRUE;
|
||||
C.atoms = &unit->object->atompool;
|
||||
|
||||
if (!check_revision (&C))
|
||||
{
|
||||
slang_translation_unit_destruct (unit);
|
||||
return 0;
|
||||
}
|
||||
if (!check_revision (&C))
|
||||
return GL_FALSE;
|
||||
|
||||
if (downlink != NULL)
|
||||
{
|
||||
unit->functions.outer_scope = &downlink->functions;
|
||||
unit->globals.outer_scope = &downlink->globals;
|
||||
unit->structs.outer_scope = &downlink->structs;
|
||||
}
|
||||
if (downlink != NULL) {
|
||||
unit->vars.outer_scope = &downlink->vars;
|
||||
unit->funs.outer_scope = &downlink->funs;
|
||||
unit->structs.outer_scope = &downlink->structs;
|
||||
}
|
||||
|
||||
/* parse translation unit */
|
||||
if (!parse_translation_unit (&C, unit))
|
||||
{
|
||||
slang_translation_unit_destruct (unit);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
/* parse translation unit */
|
||||
return parse_code_unit (&C, unit);
|
||||
}
|
||||
|
||||
static int compile_with_grammar (grammar id, const char *source, slang_translation_unit *unit,
|
||||
slang_unit_type type, slang_info_log *log, slang_translation_unit *builtins)
|
||||
static GLboolean
|
||||
compile_with_grammar (grammar id, const char *source, slang_code_unit *unit, slang_unit_type type,
|
||||
slang_info_log *infolog, slang_code_unit *builtin)
|
||||
{
|
||||
byte *prod;
|
||||
unsigned int size, start, version;
|
||||
GLuint size, start, version;
|
||||
|
||||
/* retrieve version */
|
||||
if (!_slang_preprocess_version (source, &version, &start, log))
|
||||
return 0;
|
||||
if (!_slang_preprocess_version (source, &version, &start, infolog))
|
||||
return GL_FALSE;
|
||||
|
||||
/* check the syntax and generate its binary representation */
|
||||
if (!grammar_fast_check (id, (const byte *) source + start, &prod, &size, 65536))
|
||||
@@ -1988,20 +1930,18 @@ static int compile_with_grammar (grammar id, const char *source, slang_translati
|
||||
char buf[1024];
|
||||
unsigned int pos;
|
||||
grammar_get_last_error ( (unsigned char*) buf, 1024, (int*) &pos);
|
||||
slang_info_log_error (log, buf);
|
||||
return 0;
|
||||
slang_info_log_error (infolog, buf);
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
/* syntax is okay - translate it to internal representation */
|
||||
if (!compile_binary (prod, unit, type, log, builtins, NULL, NULL, NULL,
|
||||
&builtins[BUILTIN_TARGET], NULL))
|
||||
{
|
||||
grammar_alloc_free (prod);
|
||||
return 0;
|
||||
}
|
||||
if (!compile_binary (prod, unit, type, infolog, builtin, &builtin[BUILTIN_TARGET])) {
|
||||
grammar_alloc_free (prod);
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
grammar_alloc_free (prod);
|
||||
return 1;
|
||||
grammar_alloc_free (prod);
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
static const char *slang_shader_syn =
|
||||
@@ -2024,12 +1964,13 @@ static const byte slang_vertex_builtin_gc[] = {
|
||||
#include "library/slang_vertex_builtin_gc.h"
|
||||
};
|
||||
|
||||
static int compile (grammar *id, slang_translation_unit *builtin_units, int *compiled,
|
||||
const char *source, slang_translation_unit *unit, slang_unit_type type, slang_info_log *log)
|
||||
static GLboolean
|
||||
compile_object (grammar *id, const char *source, slang_code_object *object, slang_unit_type type,
|
||||
slang_info_log *infolog)
|
||||
{
|
||||
slang_translation_unit *builtins = NULL;
|
||||
slang_code_unit *builtins = NULL;
|
||||
|
||||
/* load slang grammar */
|
||||
/* load GLSL grammar */
|
||||
*id = grammar_load_from_text ((const byte *) (slang_shader_syn));
|
||||
if (*id == 0)
|
||||
{
|
||||
@@ -2037,8 +1978,8 @@ static int compile (grammar *id, slang_translation_unit *builtin_units, int *com
|
||||
int pos;
|
||||
|
||||
grammar_get_last_error (buf, 1024, &pos);
|
||||
slang_info_log_error (log, (const char *) (buf));
|
||||
return 0;
|
||||
slang_info_log_error (infolog, (const char *) (buf));
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
/* set shader type - the syntax is slightly different for different shaders */
|
||||
@@ -2054,95 +1995,68 @@ static int compile (grammar *id, slang_translation_unit *builtin_units, int *com
|
||||
if (type == slang_unit_fragment_shader || type == slang_unit_vertex_shader)
|
||||
{
|
||||
/* compile core functionality first */
|
||||
if (!compile_binary (slang_core_gc, &builtin_units[BUILTIN_CORE],
|
||||
slang_unit_fragment_builtin, log, NULL, unit->assembly, unit->global_pool,
|
||||
unit->machine, NULL, unit->atom_pool))
|
||||
return 0;
|
||||
compiled[BUILTIN_CORE] = 1;
|
||||
if (!compile_binary (slang_core_gc, &object->builtin[BUILTIN_CORE],
|
||||
slang_unit_fragment_builtin, infolog, NULL, NULL))
|
||||
return GL_FALSE;
|
||||
|
||||
/* compile common functions and variables, link to core */
|
||||
if (!compile_binary (slang_common_builtin_gc, &builtin_units[BUILTIN_COMMON],
|
||||
slang_unit_fragment_builtin, log, NULL, unit->assembly, unit->global_pool,
|
||||
unit->machine, &builtin_units[BUILTIN_CORE], unit->atom_pool))
|
||||
return 0;
|
||||
compiled[BUILTIN_COMMON] = 1;
|
||||
if (!compile_binary (slang_common_builtin_gc, &object->builtin[BUILTIN_COMMON],
|
||||
slang_unit_fragment_builtin, infolog, NULL,
|
||||
&object->builtin[BUILTIN_CORE]))
|
||||
return GL_FALSE;
|
||||
|
||||
/* compile target-specific functions and variables, link to common */
|
||||
if (type == slang_unit_fragment_shader)
|
||||
{
|
||||
if (!compile_binary (slang_fragment_builtin_gc, &builtin_units[BUILTIN_TARGET],
|
||||
slang_unit_fragment_builtin, log, NULL, unit->assembly, unit->global_pool,
|
||||
unit->machine, &builtin_units[BUILTIN_COMMON], unit->atom_pool))
|
||||
return 0;
|
||||
if (!compile_binary (slang_fragment_builtin_gc, &object->builtin[BUILTIN_TARGET],
|
||||
slang_unit_fragment_builtin, infolog, NULL,
|
||||
&object->builtin[BUILTIN_COMMON]))
|
||||
return GL_FALSE;
|
||||
}
|
||||
else if (type == slang_unit_vertex_shader)
|
||||
{
|
||||
if (!compile_binary (slang_vertex_builtin_gc, &builtin_units[BUILTIN_TARGET],
|
||||
slang_unit_vertex_builtin, log, NULL, unit->assembly, unit->global_pool,
|
||||
unit->machine, &builtin_units[BUILTIN_COMMON], unit->atom_pool))
|
||||
return 0;
|
||||
if (!compile_binary (slang_vertex_builtin_gc, &object->builtin[BUILTIN_TARGET],
|
||||
slang_unit_vertex_builtin, infolog, NULL,
|
||||
&object->builtin[BUILTIN_COMMON]))
|
||||
return GL_FALSE;
|
||||
}
|
||||
compiled[BUILTIN_TARGET] = 1;
|
||||
|
||||
/* disable language extensions */
|
||||
grammar_set_reg8 (*id, (const byte *) "parsing_builtin", 0);
|
||||
builtins = builtin_units;
|
||||
builtins = object->builtin;
|
||||
}
|
||||
|
||||
/* compile the actual shader - pass-in built-in library for external shader */
|
||||
if (!compile_with_grammar (*id, source, unit, type, log, builtins))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
return compile_with_grammar (*id, source, &object->unit, type, infolog, builtins);
|
||||
}
|
||||
|
||||
int _slang_compile (const char *source, slang_translation_unit *unit, slang_unit_type type,
|
||||
slang_info_log *log)
|
||||
GLboolean
|
||||
_slang_compile (const char *source, slang_code_object *object, slang_unit_type type,
|
||||
slang_info_log *infolog)
|
||||
{
|
||||
int success;
|
||||
grammar id = 0;
|
||||
/* slang_translation_unit builtin_units[BUILTIN_TOTAL];*/
|
||||
slang_translation_unit *builtin_units;
|
||||
int compiled[BUILTIN_TOTAL] = { 0 };
|
||||
GLboolean success;
|
||||
grammar id = 0;
|
||||
|
||||
/* create the main unit first */
|
||||
if (!slang_translation_unit_construct (unit))
|
||||
return 0;
|
||||
unit->type = type;
|
||||
_slang_code_object_dtr (object);
|
||||
_slang_code_object_ctr (object);
|
||||
|
||||
builtin_units = (slang_translation_unit *) slang_alloc_malloc (BUILTIN_TOTAL * sizeof (slang_translation_unit));
|
||||
success = compile (&id, builtin_units, compiled, source, unit, type, log);
|
||||
success = compile_object (&id, source, object, type, infolog);
|
||||
if (id != 0)
|
||||
grammar_destroy (id);
|
||||
if (!success)
|
||||
return GL_FALSE;
|
||||
|
||||
/* destroy built-in library */
|
||||
/* XXX: free with the unit */
|
||||
/*if (type == slang_unit_fragment_shader || type == slang_unit_vertex_shader)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < BUILTIN_TOTAL; i++)
|
||||
if (compiled[i] != 0)
|
||||
slang_translation_unit_destruct (&builtin_units[i]);
|
||||
}*/
|
||||
if (id != 0)
|
||||
grammar_destroy (id);
|
||||
|
||||
if (!success)
|
||||
return 0;
|
||||
|
||||
unit->exp_data.atoms = unit->atom_pool;
|
||||
if (!_slang_build_export_data_table (&unit->exp_data, &unit->globals))
|
||||
return 0;
|
||||
|
||||
unit->exp_code.atoms = unit->atom_pool;
|
||||
if (!_slang_build_export_code_table (&unit->exp_code, &unit->functions, unit))
|
||||
return 0;
|
||||
if (!_slang_build_export_data_table (&object->expdata, &object->unit.vars))
|
||||
return GL_FALSE;
|
||||
if (!_slang_build_export_code_table (&object->expcode, &object->unit.funs, &object->unit))
|
||||
return GL_FALSE;
|
||||
|
||||
#if defined(USE_X86_ASM) || defined(SLANG_X86)
|
||||
/* XXX: lookup the @main label */
|
||||
if (!_slang_x86_codegen (unit->machine, unit->assembly, unit->exp_code.entries[0].address))
|
||||
return 0;
|
||||
/* XXX: lookup the @main label */
|
||||
if (!_slang_x86_codegen (&object->machine, &object->assembly, object->expcode.entries[0].address))
|
||||
return GL_FALSE;
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
@@ -49,28 +49,38 @@ typedef struct slang_var_pool_
|
||||
GLuint next_addr;
|
||||
} slang_var_pool;
|
||||
|
||||
typedef struct slang_translation_unit_
|
||||
typedef struct slang_code_unit_
|
||||
{
|
||||
slang_variable_scope globals;
|
||||
slang_function_scope functions;
|
||||
slang_struct_scope structs;
|
||||
slang_unit_type type;
|
||||
slang_assembly_file *assembly;
|
||||
int free_assembly;
|
||||
slang_var_pool *global_pool;
|
||||
int free_global_pool;
|
||||
slang_machine *machine;
|
||||
int free_machine;
|
||||
slang_atom_pool *atom_pool;
|
||||
int free_atom_pool;
|
||||
slang_export_data_table exp_data;
|
||||
slang_export_code_table exp_code;
|
||||
} slang_translation_unit;
|
||||
slang_variable_scope vars;
|
||||
slang_function_scope funs;
|
||||
slang_struct_scope structs;
|
||||
slang_unit_type type;
|
||||
struct slang_code_object_ *object;
|
||||
} slang_code_unit;
|
||||
|
||||
int slang_translation_unit_construct (slang_translation_unit *);
|
||||
int slang_translation_unit_construct2 (slang_translation_unit *, slang_assembly_file *,
|
||||
slang_var_pool *, slang_machine *, slang_atom_pool *);
|
||||
void slang_translation_unit_destruct (slang_translation_unit *);
|
||||
extern GLvoid
|
||||
_slang_code_unit_ctr (slang_code_unit *, struct slang_code_object_ *);
|
||||
|
||||
extern GLvoid
|
||||
_slang_code_unit_dtr (slang_code_unit *);
|
||||
|
||||
typedef struct slang_code_object_
|
||||
{
|
||||
slang_code_unit builtin[3];
|
||||
slang_code_unit unit;
|
||||
slang_assembly_file assembly;
|
||||
slang_machine machine;
|
||||
slang_var_pool varpool;
|
||||
slang_atom_pool atompool;
|
||||
slang_export_data_table expdata;
|
||||
slang_export_code_table expcode;
|
||||
} slang_code_object;
|
||||
|
||||
extern GLvoid
|
||||
_slang_code_object_ctr (slang_code_object *);
|
||||
|
||||
extern GLvoid
|
||||
_slang_code_object_dtr (slang_code_object *);
|
||||
|
||||
typedef struct slang_info_log_
|
||||
{
|
||||
@@ -80,11 +90,13 @@ typedef struct slang_info_log_
|
||||
|
||||
void slang_info_log_construct (slang_info_log *);
|
||||
void slang_info_log_destruct (slang_info_log *);
|
||||
int slang_info_log_print (slang_info_log *, const char *, ...);
|
||||
int slang_info_log_error (slang_info_log *, const char *, ...);
|
||||
int slang_info_log_warning (slang_info_log *, const char *, ...);
|
||||
void slang_info_log_memory (slang_info_log *);
|
||||
|
||||
int _slang_compile (const char *, slang_translation_unit *, slang_unit_type type, slang_info_log *);
|
||||
extern GLboolean
|
||||
_slang_compile (const char *, slang_code_object *, slang_unit_type, slang_info_log *);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user