diff --git a/gsk/gskslfunction.c b/gsk/gskslfunction.c index fc7d1c1ea5..c1c0d2b974 100644 --- a/gsk/gskslfunction.c +++ b/gsk/gskslfunction.c @@ -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; } diff --git a/gsk/gskslprogram.c b/gsk/gskslprogram.c index 1885a822e2..6027d84d54 100644 --- a/gsk/gskslprogram.c +++ b/gsk/gskslprogram.c @@ -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); diff --git a/gsk/gskspvwriter.c b/gsk/gskspvwriter.c index 156459f2ae..b698ef7896 100644 --- a/gsk/gskspvwriter.c +++ b/gsk/gskspvwriter.c @@ -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); diff --git a/gsk/gskspvwriterprivate.h b/gsk/gskspvwriterprivate.h index f411472150..b0c5faada9 100644 --- a/gsk/gskspvwriterprivate.h +++ b/gsk/gskspvwriterprivate.h @@ -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,