gskslfunction: Actually write arguments to SPV
This includes code in the variable path to write parameter variables out as parameters instead of regular global/local variables.
This commit is contained in:
@@ -357,6 +357,7 @@ gsk_sl_function_declared_write_spv (const GskSlFunction *function,
|
||||
{
|
||||
GskSlFunctionDeclared *declared = (GskSlFunctionDeclared *) function;
|
||||
guint32 return_type_id, function_type_id, function_id, label_id;
|
||||
gsize i;
|
||||
|
||||
if (declared->statement == NULL)
|
||||
return 0;
|
||||
@@ -373,7 +374,6 @@ gsk_sl_function_declared_write_spv (const GskSlFunction *function,
|
||||
/* add debug info */
|
||||
/* FIXME */
|
||||
|
||||
/* add function body */
|
||||
function_id = gsk_spv_writer_next_id (writer);
|
||||
gsk_spv_writer_add (writer,
|
||||
GSK_SPV_WRITER_SECTION_CODE,
|
||||
@@ -382,6 +382,13 @@ gsk_sl_function_declared_write_spv (const GskSlFunction *function,
|
||||
function_id,
|
||||
0,
|
||||
function_type_id });
|
||||
/* add function header */
|
||||
for (i = 0; i < declared->n_arguments; i++)
|
||||
{
|
||||
gsk_spv_writer_get_id_for_variable (writer, declared->arguments[i]);
|
||||
}
|
||||
|
||||
/* add function body */
|
||||
label_id = gsk_spv_writer_next_id (writer);
|
||||
gsk_spv_writer_add (writer,
|
||||
GSK_SPV_WRITER_SECTION_CODE,
|
||||
|
||||
@@ -512,6 +512,35 @@ gsk_sl_qualifier_is_constant (const GskSlQualifier *qualifier)
|
||||
}
|
||||
}
|
||||
|
||||
GskSlQualifierLocation
|
||||
gsk_sl_qualifier_get_location (const GskSlQualifier *qualifier)
|
||||
{
|
||||
switch (qualifier->storage)
|
||||
{
|
||||
case GSK_SL_STORAGE_DEFAULT:
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
return GSK_SL_QUALIFIER_GLOBAL;
|
||||
|
||||
case GSK_SL_STORAGE_GLOBAL_UNIFORM:
|
||||
case GSK_SL_STORAGE_GLOBAL:
|
||||
case GSK_SL_STORAGE_GLOBAL_IN:
|
||||
case GSK_SL_STORAGE_GLOBAL_OUT:
|
||||
case GSK_SL_STORAGE_GLOBAL_CONST:
|
||||
return GSK_SL_QUALIFIER_GLOBAL;
|
||||
|
||||
case GSK_SL_STORAGE_LOCAL:
|
||||
case GSK_SL_STORAGE_LOCAL_CONST:
|
||||
return GSK_SL_QUALIFIER_LOCAL;
|
||||
|
||||
case GSK_SL_STORAGE_PARAMETER_IN:
|
||||
case GSK_SL_STORAGE_PARAMETER_OUT:
|
||||
case GSK_SL_STORAGE_PARAMETER_INOUT:
|
||||
case GSK_SL_STORAGE_PARAMETER_CONST:
|
||||
return GSK_SL_QUALIFIER_PARAMETER;
|
||||
}
|
||||
}
|
||||
|
||||
GskSpvStorageClass
|
||||
gsk_sl_qualifier_get_storage_class (const GskSlQualifier *qualifier)
|
||||
{
|
||||
|
||||
@@ -81,6 +81,7 @@ gboolean gsk_sl_qualifier_print (const G
|
||||
GskSlPrinter *printer);
|
||||
|
||||
gboolean gsk_sl_qualifier_is_constant (const GskSlQualifier *qualifier);
|
||||
GskSlQualifierLocation gsk_sl_qualifier_get_location (const GskSlQualifier *qualifier);
|
||||
GskSpvStorageClass gsk_sl_qualifier_get_storage_class (const GskSlQualifier *qualifier);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
@@ -145,21 +145,38 @@ guint32
|
||||
gsk_sl_variable_write_spv (const GskSlVariable *variable,
|
||||
GskSpvWriter *writer)
|
||||
{
|
||||
guint32 pointer_type_id, variable_id, value_id;
|
||||
if (gsk_sl_qualifier_get_location (gsk_sl_pointer_type_get_qualifier (variable->type)) == GSK_SL_QUALIFIER_PARAMETER)
|
||||
{
|
||||
guint32 type_id, variable_id;
|
||||
|
||||
pointer_type_id = gsk_spv_writer_get_id_for_pointer_type (writer, variable->type);
|
||||
variable_id = gsk_spv_writer_next_id (writer);
|
||||
if (variable->initial_value)
|
||||
value_id = gsk_spv_writer_get_id_for_value (writer, variable->initial_value);
|
||||
type_id = gsk_spv_writer_get_id_for_type (writer, gsk_sl_pointer_type_get_type (variable->type));
|
||||
variable_id = gsk_spv_writer_next_id (writer);
|
||||
gsk_spv_writer_add (writer,
|
||||
GSK_SPV_WRITER_SECTION_CODE,
|
||||
3, GSK_SPV_OP_FUNCTION_PARAMETER,
|
||||
(guint32[2]) { type_id,
|
||||
variable_id });
|
||||
|
||||
return variable_id;
|
||||
}
|
||||
else
|
||||
value_id = 0;
|
||||
gsk_spv_writer_add (writer,
|
||||
GSK_SPV_WRITER_SECTION_CODE,
|
||||
variable->initial_value ? 5 : 4, GSK_SPV_OP_VARIABLE,
|
||||
(guint32[4]) { pointer_type_id,
|
||||
variable_id,
|
||||
gsk_sl_qualifier_get_storage_class (gsk_sl_pointer_type_get_qualifier (variable->type)),
|
||||
value_id });
|
||||
{
|
||||
guint32 pointer_type_id, variable_id, value_id;
|
||||
|
||||
return variable_id;
|
||||
pointer_type_id = gsk_spv_writer_get_id_for_pointer_type (writer, variable->type);
|
||||
variable_id = gsk_spv_writer_next_id (writer);
|
||||
if (variable->initial_value)
|
||||
value_id = gsk_spv_writer_get_id_for_value (writer, variable->initial_value);
|
||||
else
|
||||
value_id = 0;
|
||||
gsk_spv_writer_add (writer,
|
||||
GSK_SPV_WRITER_SECTION_CODE,
|
||||
variable->initial_value ? 5 : 4, GSK_SPV_OP_VARIABLE,
|
||||
(guint32[4]) { pointer_type_id,
|
||||
variable_id,
|
||||
gsk_sl_qualifier_get_storage_class (gsk_sl_pointer_type_get_qualifier (variable->type)),
|
||||
value_id });
|
||||
|
||||
return variable_id;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user