gskspv: Reorganize code more
Now we create IDs in the same way glslang does and we write out code in
the same order - at least for "void main() { }"
This commit is contained in:
@@ -408,9 +408,6 @@ gsk_sl_function_declared_write_spv (const GskSlFunction *function,
|
||||
}
|
||||
function_type_id = gsk_spv_writer_type_function (writer, return_type_id, argument_types, declared->n_arguments);
|
||||
|
||||
/* add debug info */
|
||||
/* FIXME */
|
||||
|
||||
function_id = gsk_spv_writer_function (writer, declared->return_type, 0, function_type_id);
|
||||
/* add function header */
|
||||
for (i = 0; i < declared->n_arguments; i++)
|
||||
@@ -418,7 +415,12 @@ gsk_sl_function_declared_write_spv (const GskSlFunction *function,
|
||||
gsk_spv_writer_get_id_for_variable (writer, declared->arguments[i]);
|
||||
}
|
||||
|
||||
/* add debug info */
|
||||
gsk_spv_writer_name (writer, function_id, declared->name);
|
||||
|
||||
/* add function body */
|
||||
gsk_spv_writer_push_new_code_block (writer);
|
||||
|
||||
if (initializer)
|
||||
initializer (writer, initializer_data);
|
||||
|
||||
@@ -430,6 +432,8 @@ gsk_sl_function_declared_write_spv (const GskSlFunction *function,
|
||||
|
||||
gsk_spv_writer_function_end (writer);
|
||||
|
||||
gsk_spv_writer_commit_code_block (writer);
|
||||
|
||||
return function_id;
|
||||
}
|
||||
|
||||
@@ -447,8 +451,6 @@ gsk_sl_function_declared_write_call_spv (GskSlFunction *function,
|
||||
arguments,
|
||||
declared->n_arguments);
|
||||
|
||||
gsk_spv_writer_name (writer, result, declared->name);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -266,23 +266,18 @@ gsk_sl_program_write_spv_initializer (GskSpvWriter *writer,
|
||||
gsk_spv_writer_get_id_for_variable (writer, l->data);
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_sl_program_write_spv (GskSlProgram *program,
|
||||
GskSpvWriter *writer)
|
||||
static GskSlFunction *
|
||||
gsk_sl_program_get_entry_point (GskSlProgram *program)
|
||||
{
|
||||
GSList *l;
|
||||
|
||||
for (l = program->functions; l; l = l->next)
|
||||
{
|
||||
if (g_str_equal (gsk_sl_function_get_name (l->data), "main"))
|
||||
{
|
||||
gsk_spv_writer_write_function (writer,
|
||||
l->data,
|
||||
gsk_sl_program_write_spv_initializer,
|
||||
program);
|
||||
gsk_spv_writer_set_entry_point (writer, l->data);
|
||||
}
|
||||
return l->data;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
GBytes *
|
||||
@@ -295,8 +290,10 @@ gsk_sl_program_to_spirv (GskSlProgram *program)
|
||||
|
||||
writer = gsk_spv_writer_new ();
|
||||
|
||||
gsk_sl_program_write_spv (program, writer);
|
||||
bytes = gsk_spv_writer_write (writer);
|
||||
bytes = gsk_spv_writer_write (writer,
|
||||
gsk_sl_program_get_entry_point (program),
|
||||
gsk_sl_program_write_spv_initializer,
|
||||
program);
|
||||
|
||||
gsk_spv_writer_unref (writer);
|
||||
|
||||
|
||||
@@ -42,8 +42,6 @@ struct _GskSpvWriter
|
||||
GSList *blocks;
|
||||
GSList *pending_blocks;
|
||||
|
||||
GskSlFunction *entry_point;
|
||||
|
||||
GHashTable *types;
|
||||
GHashTable *pointer_types;
|
||||
GHashTable *values;
|
||||
@@ -51,6 +49,21 @@ struct _GskSpvWriter
|
||||
GHashTable *functions;
|
||||
};
|
||||
|
||||
static GskSpvCodeBlock *
|
||||
gsk_spv_code_block_new (void)
|
||||
{
|
||||
GskSpvCodeBlock *block;
|
||||
guint i;
|
||||
|
||||
block = g_slice_new0 (GskSpvCodeBlock);
|
||||
for (i = 0; i < GSK_SPV_WRITER_N_BLOCK_SECTIONS; i++)
|
||||
{
|
||||
block->code[i] = g_array_new (FALSE, TRUE, sizeof (guint32));
|
||||
}
|
||||
|
||||
return block;
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_spv_code_block_free (GskSpvCodeBlock *block)
|
||||
{
|
||||
@@ -86,8 +99,6 @@ gsk_spv_writer_new (void)
|
||||
(GDestroyNotify) gsk_sl_variable_unref, NULL);
|
||||
writer->functions = g_hash_table_new_full (g_direct_hash, g_direct_equal,
|
||||
(GDestroyNotify) gsk_sl_function_unref, NULL);
|
||||
/* the ID 1 is reserved for the GLSL instruction set (for now) */
|
||||
writer->last_id = 1;
|
||||
|
||||
return writer;
|
||||
}
|
||||
@@ -130,50 +141,96 @@ gsk_spv_writer_unref (GskSpvWriter *writer)
|
||||
g_slice_free (GskSpvWriter, writer);
|
||||
}
|
||||
|
||||
#define STRING(s, offset) ((guint32) ((s)[offset + 0] | ((s)[offset + 1] << 8) | ((s)[offset + 2] << 16) | ((s)[offset + 3] << 24)))
|
||||
static void
|
||||
gsk_spv_writer_write_header (GskSpvWriter *writer)
|
||||
static guint32
|
||||
gsk_spv_writer_write_function (GskSpvWriter *writer,
|
||||
GskSlFunction *function,
|
||||
GskSpvWriterFunc initializer,
|
||||
gpointer initializer_data)
|
||||
{
|
||||
guint32 entry_point;
|
||||
GskSpvCodeBlock *block;
|
||||
guint32 result;
|
||||
|
||||
g_assert (g_hash_table_lookup (writer->functions, function) == NULL);
|
||||
|
||||
block = gsk_spv_code_block_new ();
|
||||
gsk_spv_writer_push_code_block (writer, block);
|
||||
result = gsk_sl_function_write_spv (function, writer, initializer, initializer_data);
|
||||
g_hash_table_insert (writer->functions, gsk_sl_function_ref (function), GUINT_TO_POINTER (result));
|
||||
if (block != gsk_spv_writer_pop_code_block (writer))
|
||||
{
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
writer->pending_blocks = g_slist_prepend (writer->pending_blocks, block);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_spv_writer_do_write (GskSpvWriter *writer,
|
||||
GskSlFunction *entry_point,
|
||||
GskSpvWriterFunc initializer,
|
||||
gpointer initializer_data)
|
||||
{
|
||||
guint32 entry_point_id;
|
||||
|
||||
gsk_spv_writer_capability (writer, GSK_SPV_CAPABILITY_SHADER);
|
||||
gsk_spv_writer_ext_inst_import (writer,
|
||||
"GLSL.std.450");
|
||||
gsk_spv_writer_memory_model (writer,
|
||||
GSK_SPV_ADDRESSING_MODEL_LOGICAL,
|
||||
GSK_SPV_MEMORY_MODEL_GLSL450);
|
||||
entry_point = gsk_spv_writer_get_id_for_function (writer, writer->entry_point);
|
||||
gsk_spv_writer_entry_point (writer,
|
||||
GSK_SPV_EXECUTION_MODEL_FRAGMENT,
|
||||
entry_point,
|
||||
"main",
|
||||
NULL,
|
||||
0);
|
||||
gsk_spv_writer_execution_mode (writer,
|
||||
entry_point,
|
||||
GSK_SPV_EXECUTION_MODE_ORIGIN_UPPER_LEFT);
|
||||
gsk_spv_writer_source (writer,
|
||||
GSK_SPV_SOURCE_LANGUAGE_GLSL,
|
||||
440,
|
||||
0,
|
||||
NULL);
|
||||
gsk_spv_writer_memory_model (writer,
|
||||
GSK_SPV_ADDRESSING_MODEL_LOGICAL,
|
||||
GSK_SPV_MEMORY_MODEL_GLSL450);
|
||||
|
||||
entry_point_id = gsk_spv_writer_write_function (writer, entry_point, initializer, initializer_data);
|
||||
|
||||
gsk_spv_writer_entry_point (writer,
|
||||
GSK_SPV_EXECUTION_MODEL_FRAGMENT,
|
||||
entry_point_id,
|
||||
"main",
|
||||
NULL,
|
||||
0);
|
||||
gsk_spv_writer_execution_mode (writer,
|
||||
entry_point_id,
|
||||
GSK_SPV_EXECUTION_MODE_ORIGIN_UPPER_LEFT);
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_spv_writer_clear_header (GskSpvWriter *writer)
|
||||
gsk_spv_writer_clear (GskSpvWriter *writer)
|
||||
{
|
||||
g_array_set_size (writer->code[GSK_SPV_WRITER_SECTION_HEADER], 0);
|
||||
guint i;
|
||||
|
||||
g_slist_free_full (writer->pending_blocks, (GDestroyNotify) gsk_spv_code_block_free);
|
||||
writer->pending_blocks = NULL;
|
||||
|
||||
for (i = 0; i < GSK_SPV_WRITER_N_GLOBAL_SECTIONS; i++)
|
||||
{
|
||||
g_array_set_size (writer->code[i], 0);
|
||||
}
|
||||
|
||||
g_hash_table_remove_all (writer->pointer_types);
|
||||
g_hash_table_remove_all (writer->types);
|
||||
g_hash_table_remove_all (writer->values);
|
||||
g_hash_table_remove_all (writer->variables);
|
||||
g_hash_table_remove_all (writer->functions);
|
||||
|
||||
}
|
||||
|
||||
GBytes *
|
||||
gsk_spv_writer_write (GskSpvWriter *writer)
|
||||
gsk_spv_writer_write (GskSpvWriter *writer,
|
||||
GskSlFunction *entry_point,
|
||||
GskSpvWriterFunc initializer,
|
||||
gpointer initializer_data)
|
||||
{
|
||||
GArray *array;
|
||||
gsize size;
|
||||
GSList *l;
|
||||
guint i;
|
||||
|
||||
gsk_spv_writer_write_header (writer);
|
||||
gsk_spv_writer_do_write (writer, entry_point, initializer, initializer_data);
|
||||
|
||||
array = g_array_new (FALSE, FALSE, sizeof (guint32));
|
||||
|
||||
@@ -198,7 +255,7 @@ gsk_spv_writer_write (GskSpvWriter *writer)
|
||||
}
|
||||
}
|
||||
|
||||
gsk_spv_writer_clear_header (writer);
|
||||
gsk_spv_writer_clear (writer);
|
||||
|
||||
size = array->len * sizeof (guint32);
|
||||
return g_bytes_new_take (g_array_free (array, FALSE), size);
|
||||
@@ -334,26 +391,6 @@ gsk_spv_writer_get_id_for_function (GskSpvWriter *writer,
|
||||
return gsk_spv_writer_write_function (writer, function, NULL, NULL);
|
||||
}
|
||||
|
||||
guint32
|
||||
gsk_spv_writer_write_function (GskSpvWriter *writer,
|
||||
GskSlFunction *function,
|
||||
GskSpvWriterFunc initializer,
|
||||
gpointer initializer_data)
|
||||
{
|
||||
GskSpvCodeBlock *block;
|
||||
guint32 result;
|
||||
|
||||
g_assert (g_hash_table_lookup (writer->functions, function) == NULL);
|
||||
|
||||
gsk_spv_writer_push_new_code_block (writer);
|
||||
result = gsk_sl_function_write_spv (function, writer, initializer, initializer_data);
|
||||
g_hash_table_insert (writer->functions, gsk_sl_function_ref (function), GUINT_TO_POINTER (result));
|
||||
block = gsk_spv_writer_pop_code_block (writer);
|
||||
writer->pending_blocks = g_slist_prepend (writer->pending_blocks, block);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
guint32
|
||||
gsk_spv_writer_make_id (GskSpvWriter *writer)
|
||||
{
|
||||
@@ -362,13 +399,6 @@ gsk_spv_writer_make_id (GskSpvWriter *writer)
|
||||
return writer->last_id;
|
||||
}
|
||||
|
||||
void
|
||||
gsk_spv_writer_set_entry_point (GskSpvWriter *writer,
|
||||
GskSlFunction *function)
|
||||
{
|
||||
writer->entry_point = gsk_sl_function_ref (function);
|
||||
}
|
||||
|
||||
GArray *
|
||||
gsk_spv_writer_get_bytes (GskSpvWriter *writer,
|
||||
GskSpvWriterSection section)
|
||||
@@ -383,13 +413,8 @@ guint32
|
||||
gsk_spv_writer_push_new_code_block (GskSpvWriter *writer)
|
||||
{
|
||||
GskSpvCodeBlock *block;
|
||||
guint i;
|
||||
|
||||
block = g_slice_new0 (GskSpvCodeBlock);
|
||||
for (i = 0; i < GSK_SPV_WRITER_N_BLOCK_SECTIONS; i++)
|
||||
{
|
||||
block->code[i] = g_array_new (FALSE, TRUE, sizeof (guint32));
|
||||
}
|
||||
block = gsk_spv_code_block_new ();
|
||||
|
||||
gsk_spv_writer_push_code_block (writer, block);
|
||||
|
||||
|
||||
@@ -53,9 +53,10 @@ GskSpvWriter * gsk_spv_writer_new (void);
|
||||
GskSpvWriter * gsk_spv_writer_ref (GskSpvWriter *writer);
|
||||
void gsk_spv_writer_unref (GskSpvWriter *writer);
|
||||
|
||||
GBytes * gsk_spv_writer_write (GskSpvWriter *writer);
|
||||
void gsk_spv_writer_set_entry_point (GskSpvWriter *writer,
|
||||
GskSlFunction *function);
|
||||
GBytes * gsk_spv_writer_write (GskSpvWriter *writer,
|
||||
GskSlFunction *entry_point,
|
||||
GskSpvWriterFunc initializer,
|
||||
gpointer initializer_data);
|
||||
|
||||
guint32 gsk_spv_writer_get_id_for_type (GskSpvWriter *writer,
|
||||
GskSlType *type);
|
||||
@@ -71,10 +72,6 @@ guint32 gsk_spv_writer_get_id_for_variable (GskSpvWriter
|
||||
GskSlVariable *variable);
|
||||
guint32 gsk_spv_writer_get_id_for_function (GskSpvWriter *writer,
|
||||
GskSlFunction *function);
|
||||
guint32 gsk_spv_writer_write_function (GskSpvWriter *writer,
|
||||
GskSlFunction *function,
|
||||
GskSpvWriterFunc initializer,
|
||||
gpointer intializer_data);
|
||||
|
||||
guint32 gsk_spv_writer_make_id (GskSpvWriter *writer);
|
||||
GArray * gsk_spv_writer_get_bytes (GskSpvWriter *writer,
|
||||
|
||||
Reference in New Issue
Block a user