gskpsv: Completely redo SPV writing

Autogenerate the headers for SPIR-V from the JSON file provided by the
spec (and now included here).
This provides a way more readable and on top of that type-safe way to
emit bytecodes when generating code.

As a result of this, the whole bytecode emission was rewritten, so there
are probably lots of different bugs in it now.

Note: If statement SPV generation was disabled. Code generation needs
some more support for control flow before I can reenable if statements.
This commit is contained in:
Benjamin Otte
2017-10-06 03:48:45 +02:00
parent bfdc7ad4ab
commit 918ff3d58e
14 changed files with 13918 additions and 1145 deletions

View File

@@ -509,9 +509,10 @@ gsk_sl_expression_multiplication_write_spv (const GskSlExpression *expression,
GskSpvWriter *writer)
{
const GskSlExpressionMultiplication *multiplication = (const GskSlExpressionMultiplication *) expression;
GskSlType *ltype, *rtype;
guint32 left_id, right_id, result_id, result_type_id;
GskSlType *ltype, *rtype, *type;
guint32 left_id, right_id;
type = multiplication->type;
ltype = gsk_sl_expression_get_return_type (multiplication->left);
rtype = gsk_sl_expression_get_return_type (multiplication->right);
@@ -519,72 +520,37 @@ gsk_sl_expression_multiplication_write_spv (const GskSlExpression *expression,
if (gsk_sl_type_get_scalar_type (ltype) != gsk_sl_type_get_scalar_type (multiplication->type))
{
GskSlType *new_type = gsk_sl_type_get_matching (ltype, gsk_sl_type_get_scalar_type (multiplication->type));
left_id = gsk_spv_writer_add_conversion (writer, left_id, ltype, new_type);
left_id = gsk_spv_writer_convert (writer, left_id, ltype, new_type);
ltype = new_type;
}
right_id = gsk_sl_expression_write_spv (multiplication->right, writer);
if (gsk_sl_type_get_scalar_type (rtype) != gsk_sl_type_get_scalar_type (multiplication->type))
{
GskSlType *new_type = gsk_sl_type_get_matching (rtype, gsk_sl_type_get_scalar_type (multiplication->type));
right_id = gsk_spv_writer_add_conversion (writer, right_id, rtype, new_type);
right_id = gsk_spv_writer_convert (writer, right_id, rtype, new_type);
rtype = new_type;
}
result_type_id = gsk_spv_writer_get_id_for_type (writer, multiplication->type);
result_id = gsk_spv_writer_next_id (writer);
if (gsk_sl_type_is_matrix (ltype))
{
if (gsk_sl_type_is_matrix (rtype))
{
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_MATRIX_TIMES_MATRIX,
(guint32[4]) { result_type_id,
result_id,
left_id,
right_id });
return result_id;
return gsk_spv_writer_matrix_times_matrix (writer, type, left_id, right_id);
}
else if (gsk_sl_type_is_vector (rtype))
{
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_VECTOR_TIMES_MATRIX,
(guint32[4]) { result_type_id,
result_id,
right_id,
left_id });
return result_id;
return gsk_spv_writer_vector_times_matrix (writer, type, right_id, left_id);
}
else if (gsk_sl_type_is_scalar (rtype))
{
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_MATRIX_TIMES_SCALAR,
(guint32[4]) { result_type_id,
result_id,
left_id,
right_id });
return result_id;
return gsk_spv_writer_matrix_times_scalar (writer, type, left_id, right_id);
}
}
else if (gsk_sl_type_is_vector (ltype))
{
if (gsk_sl_type_is_matrix (rtype))
{
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_MATRIX_TIMES_VECTOR,
(guint32[4]) { result_type_id,
result_id,
right_id,
left_id });
return result_id;
return gsk_spv_writer_matrix_times_vector (writer, type, right_id, left_id);
}
else if (gsk_sl_type_is_vector (rtype))
{
@@ -592,71 +558,31 @@ gsk_sl_expression_multiplication_write_spv (const GskSlExpression *expression,
{
case GSK_SL_FLOAT:
case GSK_SL_DOUBLE:
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_F_MUL,
(guint32[4]) { result_type_id,
result_id,
left_id,
right_id });
break;
return gsk_spv_writer_f_mul (writer, type, left_id, right_id);
case GSK_SL_INT:
case GSK_SL_UINT:
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_I_MUL,
(guint32[4]) { result_type_id,
result_id,
left_id,
right_id });
break;
return gsk_spv_writer_i_mul (writer, type, left_id, right_id);
case GSK_SL_VOID:
case GSK_SL_BOOL:
default:
g_assert_not_reached ();
break;
}
return result_id;
}
else if (gsk_sl_type_is_scalar (rtype))
{
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_VECTOR_TIMES_SCALAR,
(guint32[4]) { result_type_id,
result_id,
left_id,
right_id });
return result_id;
return gsk_spv_writer_vector_times_scalar (writer, type, left_id, right_id);
}
}
else if (gsk_sl_type_is_scalar (ltype))
{
if (gsk_sl_type_is_matrix (rtype))
{
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_MATRIX_TIMES_SCALAR,
(guint32[4]) { result_type_id,
result_id,
right_id,
left_id });
return result_id;
return gsk_spv_writer_matrix_times_scalar (writer, type, right_id, left_id);
}
else if (gsk_sl_type_is_vector (rtype))
{
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_VECTOR_TIMES_SCALAR,
(guint32[4]) { result_type_id,
result_id,
right_id,
left_id });
return result_id;
return gsk_spv_writer_vector_times_scalar (writer, type, right_id, left_id);
}
else if (gsk_sl_type_is_scalar (rtype))
{
@@ -664,32 +590,18 @@ gsk_sl_expression_multiplication_write_spv (const GskSlExpression *expression,
{
case GSK_SL_FLOAT:
case GSK_SL_DOUBLE:
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_F_MUL,
(guint32[4]) { result_type_id,
result_id,
left_id,
right_id });
break;
return gsk_spv_writer_f_mul (writer, type, left_id, right_id);
case GSK_SL_INT:
case GSK_SL_UINT:
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_I_MUL,
(guint32[4]) { result_type_id,
result_id,
left_id,
right_id });
break;
return gsk_spv_writer_i_mul (writer, type, left_id, right_id);
case GSK_SL_VOID:
case GSK_SL_BOOL:
default:
g_assert_not_reached ();
break;
}
return result_id;
}
}
@@ -954,7 +866,7 @@ gsk_sl_expression_division_write_spv (const GskSlExpression *expression,
{
const GskSlExpressionArithmetic *arithmetic = (const GskSlExpressionArithmetic *) expression;
GskSlType *ltype, *rtype;
guint32 left_id, right_id, result_id, result_type_id;
guint32 left_id, right_id;
ltype = gsk_sl_expression_get_return_type (arithmetic->left);
rtype = gsk_sl_expression_get_return_type (arithmetic->right);
@@ -963,90 +875,60 @@ gsk_sl_expression_division_write_spv (const GskSlExpression *expression,
if (gsk_sl_type_get_scalar_type (ltype) != gsk_sl_type_get_scalar_type (arithmetic->type))
{
GskSlType *new_type = gsk_sl_type_get_matching (ltype, gsk_sl_type_get_scalar_type (arithmetic->type));
left_id = gsk_spv_writer_add_conversion (writer, left_id, ltype, new_type);
left_id = gsk_spv_writer_convert (writer, left_id, ltype, new_type);
ltype = new_type;
}
right_id = gsk_sl_expression_write_spv (arithmetic->right, writer);
if (gsk_sl_type_get_scalar_type (rtype) != gsk_sl_type_get_scalar_type (arithmetic->type))
{
GskSlType *new_type = gsk_sl_type_get_matching (rtype, gsk_sl_type_get_scalar_type (arithmetic->type));
right_id = gsk_spv_writer_add_conversion (writer, right_id, rtype, new_type);
right_id = gsk_spv_writer_convert (writer, right_id, rtype, new_type);
rtype = new_type;
}
result_type_id = gsk_spv_writer_get_id_for_type (writer, arithmetic->type);
if (gsk_sl_type_is_matrix (ltype))
{
if (gsk_sl_type_is_matrix (rtype))
{
GskSlType *col_type = gsk_sl_type_get_index_type (ltype);
gsize cols = gsk_sl_type_get_length (ltype);
gsize c;
guint32 col_type_id, left_part_id, right_part_id, ids[cols + 2];
guint32 left_part_id, right_part_id, ids[cols];
col_type_id = gsk_spv_writer_get_id_for_type (writer, gsk_sl_type_get_index_type (ltype));
for (c = 0; c < cols; c++)
{
left_part_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_COMPOSITE_EXTRACT,
(guint32[4]) { col_type_id,
left_part_id,
left_id,
c });
right_part_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_COMPOSITE_EXTRACT,
(guint32[4]) { col_type_id,
right_part_id,
right_id,
c });
ids[2 + c] = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_F_DIV,
(guint32[4]) { col_type_id,
ids[2 + c],
left_part_id,
right_part_id });
left_part_id = gsk_spv_writer_composite_extract (writer,
col_type,
left_id,
(guint32[1]) { 1 }, c);
right_part_id = gsk_spv_writer_composite_extract (writer,
col_type,
right_id,
(guint32[1]) { 1 }, c);
ids[c] = gsk_spv_writer_f_div (writer,
col_type,
left_part_id,
right_part_id);
}
ids[0] = result_type_id;
ids[1] = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
3 + cols, GSK_SPV_OP_COMPOSITE_CONSTRUCT,
ids);
return ids[1];
return gsk_spv_writer_composite_construct (writer,
arithmetic->type,
ids,
cols);
}
else if (gsk_sl_type_is_scalar (rtype))
{
guint32 tmp_id, one_id, rtype_id;
guint32 tmp_id;
rtype_id = gsk_spv_writer_get_id_for_type (writer, rtype);
one_id = gsk_spv_writer_get_id_for_one (writer, gsk_sl_type_get_scalar_type (arithmetic->type));
tmp_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_F_DIV,
(guint32[4]) { rtype_id,
tmp_id,
one_id,
right_id });
tmp_id = gsk_spv_writer_f_div (writer,
rtype,
gsk_spv_writer_get_id_for_one (writer, gsk_sl_type_get_scalar_type (arithmetic->type)),
right_id);
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_MATRIX_TIMES_SCALAR,
(guint32[4]) { result_type_id,
result_id,
left_id,
tmp_id });
return result_id;
return gsk_spv_writer_matrix_times_scalar (writer,
arithmetic->type,
left_id,
tmp_id);
}
else
{
@@ -1056,98 +938,58 @@ gsk_sl_expression_division_write_spv (const GskSlExpression *expression,
}
else if (gsk_sl_type_is_matrix (rtype))
{
guint32 tmp_id, one_id, ltype_id;
guint32 tmp_id;
ltype_id = gsk_spv_writer_get_id_for_type (writer, ltype);
one_id = gsk_spv_writer_get_id_for_one (writer, gsk_sl_type_get_scalar_type (arithmetic->type));
tmp_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_F_DIV,
(guint32[4]) { ltype_id,
tmp_id,
one_id,
left_id });
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_MATRIX_TIMES_SCALAR,
(guint32[4]) { result_type_id,
result_id,
right_id,
tmp_id });
return result_id;
tmp_id = gsk_spv_writer_f_div (writer,
ltype,
gsk_spv_writer_get_id_for_one (writer, gsk_sl_type_get_scalar_type (arithmetic->type)),
left_id);
return gsk_spv_writer_matrix_times_scalar (writer,
arithmetic->type,
right_id,
tmp_id);
}
else
{
/* ltype and rtype are not matices */
/* ltype and rtype are not matrices */
if (gsk_sl_type_is_scalar (ltype) && gsk_sl_type_is_vector (rtype))
{
guint32 tmp_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
3 + gsk_sl_type_get_length (rtype), GSK_SPV_OP_COMPOSITE_CONSTRUCT,
(guint32[6]) { result_type_id,
tmp_id,
left_id, left_id, left_id, left_id });
guint32 tmp_id = gsk_spv_writer_composite_construct (writer,
arithmetic->type,
(guint32[4]) { left_id, left_id, left_id, left_id },
gsk_sl_type_get_length (rtype));
left_id = tmp_id;
}
else if (gsk_sl_type_is_scalar (rtype) && gsk_sl_type_is_vector (ltype))
{
guint32 tmp_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
3 + gsk_sl_type_get_length (ltype), GSK_SPV_OP_COMPOSITE_CONSTRUCT,
(guint32[6]) { result_type_id,
tmp_id,
right_id, right_id, right_id, right_id });
guint32 tmp_id = gsk_spv_writer_composite_construct (writer,
arithmetic->type,
(guint32[4]) { right_id, right_id, right_id, right_id },
gsk_sl_type_get_length (ltype));
right_id = tmp_id;
}
/* ltype and rtype have the same number of components now */
result_id = gsk_spv_writer_next_id (writer);
switch (gsk_sl_type_get_scalar_type (arithmetic->type))
{
case GSK_SL_FLOAT:
case GSK_SL_DOUBLE:
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_F_DIV,
(guint32[4]) { result_type_id,
result_id,
left_id,
right_id });
break;
return gsk_spv_writer_f_div (writer, arithmetic->type, left_id, right_id);
case GSK_SL_INT:
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_S_DIV,
(guint32[4]) { result_type_id,
result_id,
left_id,
right_id });
break;
return gsk_spv_writer_s_div (writer, arithmetic->type, left_id, right_id);
case GSK_SL_UINT:
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_U_DIV,
(guint32[4]) { result_type_id,
result_id,
left_id,
right_id });
break;
return gsk_spv_writer_u_div (writer, arithmetic->type, left_id, right_id);
case GSK_SL_VOID:
case GSK_SL_BOOL:
default:
g_assert_not_reached ();
break;
return 0;
}
return result_id;
}
}
@@ -1491,7 +1333,7 @@ gsk_sl_expression_reference_get_return_type (const GskSlExpression *expression)
{
const GskSlExpressionReference *reference = (const GskSlExpressionReference *) expression;
return gsk_sl_pointer_type_get_type (gsk_sl_variable_get_type (reference->variable));
return gsk_sl_variable_get_type (reference->variable);
}
static GskSlValue *
@@ -1515,19 +1357,11 @@ gsk_sl_expression_reference_write_spv (const GskSlExpression *expression,
GskSpvWriter *writer)
{
GskSlExpressionReference *reference = (GskSlExpressionReference *) expression;
guint32 declaration_id, result_id, type_id;
type_id = gsk_spv_writer_get_id_for_type (writer, gsk_sl_pointer_type_get_type (gsk_sl_variable_get_type (reference->variable)));
declaration_id = gsk_spv_writer_get_id_for_variable (writer, reference->variable);
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
4, GSK_SPV_OP_LOAD,
(guint32[3]) { type_id,
result_id,
declaration_id });
return result_id;
return gsk_spv_writer_load (writer,
gsk_sl_variable_get_type (reference->variable),
gsk_spv_writer_get_id_for_variable (writer, reference->variable),
0);
}
static const GskSlExpressionClass GSK_SL_EXPRESSION_REFERENCE = {
@@ -1717,25 +1551,19 @@ gsk_sl_expression_constructor_write_spv (const GskSlExpression *expression,
if (gsk_sl_type_is_scalar (type))
{
return gsk_spv_writer_add_conversion (writer, value_id, value_type, type);
return gsk_spv_writer_convert (writer, value_id, value_type, type);
}
else if (gsk_sl_type_is_vector (type))
{
GskSlType *scalar_type = gsk_sl_type_get_scalar (gsk_sl_type_get_scalar_type (type));
guint32 scalar_id, result_type_id, result_id;
guint32 scalar_id;
scalar_id = gsk_spv_writer_add_conversion (writer, value_id, value_type, scalar_type);
result_type_id = gsk_spv_writer_get_id_for_type (writer, type);
result_id = gsk_spv_writer_next_id (writer);
scalar_id = gsk_spv_writer_convert (writer, value_id, value_type, scalar_type);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
3 + gsk_sl_type_get_n_components (type), GSK_SPV_OP_COMPOSITE_CONSTRUCT,
(guint32[6]) { result_type_id,
result_id,
scalar_id, scalar_id, scalar_id, scalar_id });
return result_id;
return gsk_spv_writer_composite_construct (writer,
type,
(guint[4]) { scalar_id, scalar_id, scalar_id, scalar_id },
gsk_sl_type_get_n_components (type));
}
else if (gsk_sl_type_is_matrix (type))
{
@@ -1743,34 +1571,26 @@ gsk_sl_expression_constructor_write_spv (const GskSlExpression *expression,
GskSlType *col_type = gsk_sl_type_get_index_type (type);
gsize cols = gsk_sl_type_get_length (type);
gsize rows = gsk_sl_type_get_length (col_type);
guint32 ids[2 + gsk_sl_type_get_length (type)];
guint32 scalar_id, zero_id, col_type_id;
guint32 ids[gsk_sl_type_get_length (type)];
guint32 scalar_id, zero_id;
gsize c;
scalar_id = gsk_spv_writer_add_conversion (writer, value_id, value_type, scalar_type);
scalar_id = gsk_spv_writer_convert (writer, value_id, value_type, scalar_type);
zero_id = gsk_spv_writer_get_id_for_zero (writer, gsk_sl_type_get_scalar_type (scalar_type));
col_type_id = gsk_spv_writer_get_id_for_type (writer, col_type);
for (c = 0; c < cols; c++)
{
ids[2 + c] = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
3 + rows, GSK_SPV_OP_COMPOSITE_CONSTRUCT,
(guint32[6]) { col_type_id,
ids[2 + c],
c == 0 ? scalar_id : zero_id,
c == 1 ? scalar_id : zero_id,
c == 2 ? scalar_id : zero_id,
c == 3 ? scalar_id : zero_id });
ids[c] = gsk_spv_writer_composite_construct (writer,
type,
(guint32[4]) {
c == 0 ? scalar_id : zero_id,
c == 1 ? scalar_id : zero_id,
c == 2 ? scalar_id : zero_id,
c == 3 ? scalar_id : zero_id
},
rows);
}
ids[0] = gsk_spv_writer_get_id_for_type (writer, type);
ids[1] = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
3 + cols, GSK_SPV_OP_COMPOSITE_CONSTRUCT,
ids);
return ids[1];
return gsk_spv_writer_composite_construct (writer, type, ids, cols);
}
else
{
@@ -1788,14 +1608,15 @@ gsk_sl_expression_constructor_write_spv (const GskSlExpression *expression,
gsize value_cols = gsk_sl_type_get_length (type);
gsize value_rows = gsk_sl_type_get_length (value_col_type);
gsize c, r;
guint32 col_ids[6], ids[6], one_id, zero_id, scalar_type_id;
guint32 col_ids[4], ids[4], one_id, zero_id;
GskSlValue *value;
value_id = gsk_sl_expression_write_spv (constructor->arguments[0], writer);
if (gsk_sl_type_get_scalar_type (value_type) != gsk_sl_type_get_scalar_type (type))
{
GskSlType *new_value_type = gsk_sl_type_get_matching (value_type, gsk_sl_type_get_scalar_type (type));
value_id = gsk_spv_writer_add_conversion (writer, value_id, value_type, new_value_type);
value_id = gsk_spv_writer_convert (writer, value_id, value_type, new_value_type);
value_type = new_value_type;
}
@@ -1804,79 +1625,64 @@ gsk_sl_expression_constructor_write_spv (const GskSlExpression *expression,
one_id = gsk_spv_writer_get_id_for_one (writer, gsk_sl_type_get_scalar_type (scalar_type));
gsk_sl_value_free (value);
scalar_type_id = gsk_spv_writer_get_id_for_type (writer, scalar_type);
col_ids[0] = gsk_spv_writer_get_id_for_type (writer, col_type);
for (c = 0; c < cols; c++)
{
for (r = 0; r < rows; r++)
{
if (c < value_cols && r < value_rows)
{
col_ids[2 + r] = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
6, GSK_SPV_OP_COMPOSITE_EXTRACT,
(guint32[5]) { scalar_type_id,
col_ids[2 + r],
value_id,
c,
r });
col_ids[r] = gsk_spv_writer_composite_extract (writer,
scalar_type,
value_id,
(guint32[2]) { c, r },
2);
}
else if (c == r)
col_ids[2 + r] = one_id;
col_ids[r] = one_id;
else
col_ids[2 + r] = zero_id;
col_ids[r] = zero_id;
}
col_ids[1] = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
3 + rows, GSK_SPV_OP_COMPOSITE_CONSTRUCT,
col_ids);
ids[c + 2] = col_ids[1];
ids[c] = gsk_spv_writer_composite_construct (writer, col_type, col_ids, rows);
}
ids[0] = gsk_spv_writer_get_id_for_type (writer, type);
ids[1] = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
3 + cols, GSK_SPV_OP_COMPOSITE_CONSTRUCT,
ids);
return ids[1];
return gsk_spv_writer_composite_construct (writer, type, ids, cols);
}
else
{
gsize n_components = gsk_sl_type_get_n_components (type);
GskSlScalarType scalar = gsk_sl_type_get_scalar_type (type);
guint32 component_ids[16], component_type_id;
GskSlType *component_type;
guint32 component_ids[16];
gsize component = 0, arg, i;
component_type_id = gsk_spv_writer_get_id_for_type (writer, gsk_sl_type_get_scalar (scalar));
component_type = gsk_sl_type_get_scalar (scalar);
for (arg = 0; arg < constructor->n_arguments; arg++)
{
value_type = gsk_sl_expression_get_return_type (constructor->arguments[arg]);
value_id = gsk_sl_expression_write_spv (constructor->arguments[arg], writer);
if (gsk_sl_type_get_scalar_type (value_type) != scalar)
{
GskSlType *new_type = gsk_sl_type_get_matching (value_type, scalar);
value_id = gsk_spv_writer_convert (writer,
value_id,
value_type,
new_type);
value_type = new_type;
}
if (gsk_sl_type_is_scalar (value_type))
{
component_ids[component] = gsk_spv_writer_add_conversion (writer,
value_id,
value_type,
gsk_sl_type_get_scalar (scalar));
component_ids[component] = value_id;
component++;
}
else if (gsk_sl_type_is_vector (value_type))
{
GskSlType *converted_type = gsk_sl_type_get_vector (scalar, gsk_sl_type_get_length (value_type));
value_id = gsk_spv_writer_add_conversion (writer, value_id, value_type, converted_type);
for (i = 0; component < n_components && i < gsk_sl_type_get_length (value_type); i++)
{
component_ids[component] = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_COMPOSITE_EXTRACT,
(guint32[4]) { component_type_id,
component_ids[component],
value_id,
i });
component_ids[component] = gsk_spv_writer_composite_extract (writer,
component_type,
value_id,
(guint32[1]) { i },
1);
component++;
}
}
@@ -1890,19 +1696,11 @@ gsk_sl_expression_constructor_write_spv (const GskSlExpression *expression,
{
for (r = 0; r < rows && component < n_components; r++)
{
component_ids[component] = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
6, GSK_SPV_OP_COMPOSITE_EXTRACT,
(guint32[5]) { component_type_id,
component_ids[component],
value_id,
c,
r });
component_ids[component] = gsk_spv_writer_add_conversion (writer,
component_ids[component],
gsk_sl_type_get_scalar (gsk_sl_type_get_scalar_type (value_type)),
gsk_sl_type_get_scalar (scalar));
component_ids[component] = gsk_spv_writer_composite_extract (writer,
component_type,
value_id,
(guint32[2]) { c, r },
2);
component++;
}
}
@@ -1919,47 +1717,20 @@ gsk_sl_expression_constructor_write_spv (const GskSlExpression *expression,
}
else if (gsk_sl_type_is_vector (type))
{
guint32 ids[2 + gsk_sl_type_get_length (type)];
guint i;
ids[0] = gsk_spv_writer_get_id_for_type (writer, type);
ids[1] = gsk_spv_writer_next_id (writer);
for (i = 0; i < gsk_sl_type_get_length (type); i++)
ids[2 + i] = component_ids[i];
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
2 + gsk_sl_type_get_length (type), GSK_SPV_OP_COMPOSITE_CONSTRUCT,
ids);
return ids[1];
return gsk_spv_writer_composite_construct (writer, type, component_ids, gsk_sl_type_get_length (type));
}
else if (gsk_sl_type_is_matrix (type))
{
GskSlType *col_type = gsk_sl_type_get_index_type (type);
gsize c, cols = gsk_sl_type_get_length (type);
gsize r, rows = gsk_sl_type_get_length (col_type);
guint32 ids[cols + 2], col_ids[rows + 2];
gsize rows = gsk_sl_type_get_length (col_type);
guint32 ids[cols];
col_ids[1] = gsk_spv_writer_get_id_for_type (writer, col_type);
for (c = 0; c < cols; c++)
{
for (r = 0; r < rows; r++)
{
}
col_ids[1] = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
3 + rows, GSK_SPV_OP_COMPOSITE_CONSTRUCT,
col_ids);
ids[c + 2] = col_ids[1];
ids[c] = gsk_spv_writer_composite_construct (writer, col_type, &component_ids[c * rows], rows);
}
ids[0] = gsk_spv_writer_get_id_for_type (writer, type);
ids[1] = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
3 + cols, GSK_SPV_OP_COMPOSITE_CONSTRUCT,
ids);
return ids[1];
return gsk_spv_writer_composite_construct (writer, type, ids, cols);
}
else
{
@@ -2145,22 +1916,14 @@ gsk_sl_expression_member_write_spv (const GskSlExpression *expression,
{
const GskSlExpressionMember *member = (const GskSlExpressionMember *) expression;
GskSlType *type;
guint32 expr_id, type_id, result_id;
type = gsk_sl_expression_get_return_type (member->expr);
type_id = gsk_spv_writer_get_id_for_type (writer, gsk_sl_type_get_member_type (type, member->id));
expr_id = gsk_sl_expression_write_spv (member->expr, writer);
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_ACCESS_CHAIN,
(guint32[4]) { type_id,
result_id,
expr_id,
member->id });
return result_id;
return gsk_spv_writer_composite_extract (writer,
gsk_sl_type_get_member_type (type, member->id),
gsk_sl_expression_write_spv (member->expr, writer),
(guint32[1]) { member->id },
1);
}
static const GskSlExpressionClass GSK_SL_EXPRESSION_MEMBER = {
@@ -2271,7 +2034,7 @@ gsk_sl_expression_swizzle_write_spv (const GskSlExpression *expression,
{
const GskSlExpressionSwizzle *swizzle = (const GskSlExpressionSwizzle *) expression;
GskSlType *type;
guint32 expr_id, type_id, result_id;
guint32 expr_id;
type = gsk_sl_expression_get_return_type (swizzle->expr);
expr_id = gsk_sl_expression_write_spv (swizzle->expr, writer);
@@ -2281,51 +2044,35 @@ gsk_sl_expression_swizzle_write_spv (const GskSlExpression *expression,
if (swizzle->length == 1)
return expr_id;
type_id = gsk_spv_writer_get_id_for_type (writer, gsk_sl_expression_get_return_type (expression));
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
3 + swizzle->length, GSK_SPV_OP_COMPOSITE_CONSTRUCT,
(guint32[6]) { type_id,
result_id,
expr_id,
expr_id,
expr_id,
expr_id });
return result_id;
return gsk_spv_writer_composite_construct (writer,
gsk_sl_expression_get_return_type (expression),
(guint32[4]) { expr_id, expr_id, expr_id, expr_id },
swizzle->length);
}
else if (gsk_sl_type_is_vector (type))
{
type_id = gsk_spv_writer_get_id_for_type (writer, gsk_sl_expression_get_return_type (expression));
result_id = gsk_spv_writer_next_id (writer);
if (swizzle->length == 1)
{
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
4, GSK_SPV_OP_COMPOSITE_EXTRACT,
(guint32[6]) { type_id,
result_id,
swizzle->indexes[0] });
return gsk_spv_writer_composite_extract (writer,
type,
expr_id,
(guint32[1]) { swizzle->indexes[0] },
1);
}
else
{
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5 + swizzle->length, GSK_SPV_OP_COMPOSITE_CONSTRUCT,
(guint32[8]) { type_id,
result_id,
expr_id,
expr_id,
swizzle->indexes[0],
swizzle->indexes[1],
swizzle->indexes[2],
swizzle->indexes[3] });
return gsk_spv_writer_vector_shuffle (writer,
type,
expr_id,
expr_id,
(guint32[4]) {
swizzle->indexes[0],
swizzle->indexes[1],
swizzle->indexes[2],
swizzle->indexes[3]
},
swizzle->length);
}
return result_id;
}
else
{
@@ -2432,42 +2179,28 @@ gsk_sl_expression_negation_write_spv (const GskSlExpression *expression,
GskSpvWriter *writer)
{
const GskSlExpressionNegation *negation = (const GskSlExpressionNegation *) expression;
guint type_id, expr_id, result_id;
GskSlType *type;
type = gsk_sl_expression_get_return_type (negation->expr);
type_id = gsk_spv_writer_get_id_for_type (writer, type);
expr_id = gsk_sl_expression_write_spv (negation->expr, writer);
result_id = gsk_spv_writer_next_id (writer);
GskSlType *type = gsk_sl_expression_get_return_type (negation->expr);
switch (gsk_sl_type_get_scalar_type (type))
{
case GSK_SL_INT:
case GSK_SL_UINT:
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
4, GSK_SPV_OP_S_NEGATE,
(guint32[3]) { type_id,
result_id,
expr_id });
break;
return gsk_spv_writer_s_negate (writer,
type,
gsk_sl_expression_write_spv (negation->expr, writer));
case GSK_SL_FLOAT:
case GSK_SL_DOUBLE:
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
4, GSK_SPV_OP_F_NEGATE,
(guint32[3]) { type_id,
result_id,
expr_id });
break;
return gsk_spv_writer_f_negate (writer,
type,
gsk_sl_expression_write_spv (negation->expr, writer));
case GSK_SL_VOID:
case GSK_SL_BOOL:
default:
g_assert_not_reached ();
break;
return 0;
}
return result_id;
}
static const GskSlExpressionClass GSK_SL_EXPRESSION_NEGATION = {

View File

@@ -307,7 +307,7 @@ gsk_sl_function_declared_get_argument_type (const GskSlFunction *function,
{
const GskSlFunctionDeclared *declared = (const GskSlFunctionDeclared *) function;
return gsk_sl_pointer_type_get_type (gsk_sl_variable_get_type (declared->arguments[i]));
return gsk_sl_variable_get_type (declared->arguments[i]);
}
static GskSlValue *
@@ -356,7 +356,8 @@ gsk_sl_function_declared_write_spv (const GskSlFunction *function,
GskSpvWriter *writer)
{
GskSlFunctionDeclared *declared = (GskSlFunctionDeclared *) function;
guint32 return_type_id, function_type_id, function_id, label_id;
guint32 return_type_id, function_type_id, function_id;
guint32 argument_types[declared->n_arguments];
gsize i;
if (declared->statement == NULL)
@@ -364,24 +365,16 @@ gsk_sl_function_declared_write_spv (const GskSlFunction *function,
/* declare type of function */
return_type_id = gsk_spv_writer_get_id_for_type (writer, declared->return_type);
function_type_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
3, GSK_SPV_OP_TYPE_FUNCTION,
(guint32[2]) { function_type_id,
return_type_id });
for (i = 0; i < declared->n_arguments; i++)
{
argument_types[i] = gsk_spv_writer_get_id_for_type (writer, gsk_sl_variable_get_type (declared->arguments[i]));
}
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_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_FUNCTION,
(guint32[4]) { return_type_id,
function_id,
0,
function_type_id });
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++)
{
@@ -389,26 +382,15 @@ gsk_sl_function_declared_write_spv (const GskSlFunction *function,
}
/* add function body */
label_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
2, GSK_SPV_OP_LABEL,
(guint32[1]) { label_id });
gsk_spv_writer_label (writer);
gsk_sl_statement_write_spv (declared->statement, writer);
if (gsk_sl_type_is_void (declared->return_type) &&
gsk_sl_statement_get_jump (declared->statement) < GSK_SL_JUMP_RETURN)
{
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
1, GSK_SPV_OP_RETURN,
NULL);
}
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
1, GSK_SPV_OP_FUNCTION_END,
NULL);
gsk_spv_writer_return (writer);
gsk_spv_writer_function_end (writer);
return function_id;
}

View File

@@ -115,17 +115,7 @@ guint32
gsk_sl_pointer_type_write_spv (const GskSlPointerType *type,
GskSpvWriter *writer)
{
guint32 type_id, result_id;
type_id = gsk_spv_writer_get_id_for_type (writer, type->type);
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
4, GSK_SPV_OP_TYPE_POINTER,
(guint32[3]) { result_id,
gsk_sl_qualifier_get_storage_class (&type->qualifier),
type_id });
return result_id;
return gsk_spv_writer_type_pointer (writer,
gsk_sl_qualifier_get_storage_class (&type->qualifier),
gsk_spv_writer_get_id_for_type (writer, type->type));
}

View File

@@ -234,17 +234,16 @@ gsk_sl_statement_declaration_write_spv (const GskSlStatement *statement,
GskSpvWriter *writer)
{
GskSlStatementDeclaration *declaration = (GskSlStatementDeclaration *) statement;
guint32 variable_id;
variable_id = gsk_spv_writer_get_id_for_variable (writer, declaration->variable);
/* make sure it's written */
gsk_spv_writer_get_id_for_variable (writer, declaration->variable);
if (declaration->initial && ! gsk_sl_variable_get_initial_value (declaration->variable))
{
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
3, GSK_SPV_OP_STORE,
(guint32[2]) { variable_id,
gsk_sl_expression_write_spv (declaration->initial, writer)});
gsk_spv_writer_store (writer,
gsk_spv_writer_get_id_for_variable (writer, declaration->variable),
gsk_sl_expression_write_spv (declaration->initial, writer),
0);
}
}
@@ -305,20 +304,12 @@ gsk_sl_statement_return_write_spv (const GskSlStatement *statement,
if (return_statement->value)
{
guint32 value_id;
value_id = gsk_sl_expression_write_spv (return_statement->value, writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
2, GSK_SPV_OP_RETURN_VALUE,
(guint32[1]) { value_id });
gsk_spv_writer_return_value (writer,
gsk_sl_expression_write_spv (return_statement->value, writer));
}
else
{
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
1, GSK_SPV_OP_RETURN,
NULL);
gsk_spv_writer_return (writer);
}
}
@@ -401,6 +392,7 @@ static void
gsk_sl_statement_if_write_spv (const GskSlStatement *statement,
GskSpvWriter *writer)
{
#if 0
GskSlStatementIf *if_stmt = (GskSlStatementIf *) statement;
guint32 label_id, if_id, else_id, condition_id;
@@ -451,6 +443,8 @@ gsk_sl_statement_if_write_spv (const GskSlStatement *statement,
GSK_SPV_WRITER_SECTION_CODE,
2, GSK_SPV_OP_LABEL,
(guint32[1]) { label_id });
#endif
g_assert_not_reached ();
}
static const GskSlStatementClass GSK_SL_STATEMENT_IF = {

View File

@@ -102,18 +102,10 @@ static guint32
write_float_spv (GskSpvWriter *writer,
gconstpointer value)
{
guint32 type_id, result_id;
type_id = gsk_spv_writer_get_id_for_type (writer, gsk_sl_type_get_scalar (GSK_SL_FLOAT));
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
4, GSK_SPV_OP_CONSTANT,
(guint32[3]) { type_id,
result_id,
*(const guint32 *) value });
return result_id;
return gsk_spv_writer_constant (writer,
gsk_sl_type_get_scalar (GSK_SL_FLOAT),
(guint32 *) value,
1);
}
static void
@@ -129,19 +121,10 @@ static guint32
write_double_spv (GskSpvWriter *writer,
gconstpointer value)
{
guint32 type_id, result_id;
type_id = gsk_spv_writer_get_id_for_type (writer, gsk_sl_type_get_scalar (GSK_SL_DOUBLE));
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
5, GSK_SPV_OP_CONSTANT,
(guint32[4]) { type_id,
result_id,
*(const guint32 *) value,
*(((const guint32 *) value) + 1) });
return result_id;
return gsk_spv_writer_constant (writer,
gsk_sl_type_get_scalar (GSK_SL_DOUBLE),
(guint32 *) value,
2);
}
static void
@@ -157,18 +140,10 @@ static guint32
write_int_spv (GskSpvWriter *writer,
gconstpointer value)
{
guint32 type_id, result_id;
type_id = gsk_spv_writer_get_id_for_type (writer, gsk_sl_type_get_scalar (GSK_SL_INT));
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
4, GSK_SPV_OP_CONSTANT,
(guint32[3]) { type_id,
result_id,
*(const guint32 *) value });
return result_id;
return gsk_spv_writer_constant (writer,
gsk_sl_type_get_scalar (GSK_SL_INT),
(guint32 *) value,
1);
}
static void
@@ -185,18 +160,10 @@ static guint32
write_uint_spv (GskSpvWriter *writer,
gconstpointer value)
{
guint32 type_id, result_id;
type_id = gsk_spv_writer_get_id_for_type (writer, gsk_sl_type_get_scalar (GSK_SL_UINT));
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
4, GSK_SPV_OP_CONSTANT,
(guint32[3]) { type_id,
result_id,
*(const guint32 *) value });
return result_id;
return gsk_spv_writer_constant (writer,
gsk_sl_type_get_scalar (GSK_SL_UINT),
(guint32 *) value,
1);
}
static void
@@ -212,17 +179,12 @@ static guint32
write_bool_spv (GskSpvWriter *writer,
gconstpointer value)
{
guint32 type_id, result_id;
type_id = gsk_spv_writer_get_id_for_type (writer, gsk_sl_type_get_scalar (GSK_SL_BOOL));
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
3, *(const guint32 *) value ? GSK_SPV_OP_CONSTANT_TRUE : GSK_SPV_OP_CONSTANT_FALSE,
(guint32[2]) { type_id,
result_id });
return result_id;
if (*(const guint32 *) value)
return gsk_spv_writer_constant_true (writer,
gsk_sl_type_get_scalar (GSK_SL_BOOL));
else
return gsk_spv_writer_constant_false (writer,
gsk_sl_type_get_scalar (GSK_SL_BOOL));
}
#define SIMPLE_CONVERSION(source_name, target_name, source_type, target_type) \
@@ -452,15 +414,7 @@ static guint32
gsk_sl_type_void_write_spv (GskSlType *type,
GskSpvWriter *writer)
{
guint32 result;
result = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
2, GSK_SPV_OP_TYPE_VOID,
(guint32[1]) { result });
return result;
return gsk_spv_writer_type_void (writer);
}
static void
@@ -602,70 +556,29 @@ gsk_sl_type_scalar_write_spv (GskSlType *type,
GskSpvWriter *writer)
{
GskSlTypeScalar *scalar = (GskSlTypeScalar *) type;
guint32 result;
switch (scalar->scalar)
{
case GSK_SL_VOID:
result = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
2, GSK_SPV_OP_TYPE_VOID,
(guint32[1]) { result });
break;
case GSK_SL_FLOAT:
result = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
3, GSK_SPV_OP_TYPE_FLOAT,
(guint32[2]) { result,
32 });
break;
return gsk_spv_writer_type_float (writer, 32);
case GSK_SL_DOUBLE:
result = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
3, GSK_SPV_OP_TYPE_FLOAT,
(guint32[2]) { result,
64 });
break;
return gsk_spv_writer_type_float (writer, 64);
case GSK_SL_INT:
result = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
4, GSK_SPV_OP_TYPE_INT,
(guint32[3]) { result,
32,
1 });
break;
return gsk_spv_writer_type_int (writer, 32, 1);
case GSK_SL_UINT:
result = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
4, GSK_SPV_OP_TYPE_INT,
(guint32[3]) { result,
32,
0 });
break;
return gsk_spv_writer_type_int (writer, 32, 0);
case GSK_SL_BOOL:
result = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
2, GSK_SPV_OP_TYPE_BOOL,
(guint32[1]) { result });
break;
return gsk_spv_writer_type_bool (writer);
case GSK_SL_VOID:
default:
g_assert_not_reached ();
break;
return 0;
}
return result;
}
static void
@@ -824,18 +737,10 @@ gsk_sl_type_vector_write_spv (GskSlType *type,
GskSpvWriter *writer)
{
GskSlTypeVector *vector = (GskSlTypeVector *) type;
guint32 result_id, scalar_id;
scalar_id = gsk_spv_writer_get_id_for_type (writer, gsk_sl_type_get_scalar (vector->scalar));
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
4, GSK_SPV_OP_TYPE_VECTOR,
(guint32[3]) { result_id,
scalar_id,
vector->length });
return result_id;
return gsk_spv_writer_type_vector (writer,
gsk_spv_writer_get_id_for_type (writer, gsk_sl_type_get_scalar (vector->scalar)),
vector->length);
}
static void
@@ -891,7 +796,7 @@ gsk_sl_type_vector_write_value_spv (GskSlType *type,
gconstpointer value)
{
GskSlTypeVector *vector = (GskSlTypeVector *) type;
guint32 ids[vector->length + 2];
guint32 ids[vector->length];
GskSlType *scalar_type;
GskSlValue *v;
const guchar *data;
@@ -900,23 +805,18 @@ gsk_sl_type_vector_write_value_spv (GskSlType *type,
data = value;
scalar_type = gsk_sl_type_get_scalar (vector->scalar);
ids[0] = gsk_spv_writer_get_id_for_type (writer, type);
for (i = 0; i < vector->length; i++)
{
v = gsk_sl_value_new_for_data (scalar_type, (gpointer) data, NULL, NULL);
ids[2 + i] = gsk_spv_writer_get_id_for_value (writer, v);
ids[i] = gsk_spv_writer_get_id_for_value (writer, v);
gsk_sl_value_free (v);
data += scalar_infos[vector->scalar].size;
}
ids[1] = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
3 + vector->length,
GSK_SPV_OP_CONSTANT_COMPOSITE,
ids);
return ids[1];
return gsk_spv_writer_constant_composite (writer,
type,
ids,
vector->length);
}
static const GskSlTypeClass GSK_SL_TYPE_VECTOR = {
@@ -1047,18 +947,10 @@ gsk_sl_type_matrix_write_spv (GskSlType *type,
GskSpvWriter *writer)
{
GskSlTypeMatrix *matrix = (GskSlTypeMatrix *) type;
guint32 result_id, vector_id;
vector_id = gsk_spv_writer_get_id_for_type (writer, gsk_sl_type_get_index_type (type));
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
4, GSK_SPV_OP_TYPE_MATRIX,
(guint32[3]) { result_id,
vector_id,
matrix->columns });
return result_id;
return gsk_spv_writer_type_matrix (writer,
gsk_spv_writer_get_id_for_type (writer, gsk_sl_type_get_index_type (type)),
matrix->columns);
}
static void
@@ -1114,7 +1006,7 @@ gsk_sl_type_matrix_write_value_spv (GskSlType *type,
gconstpointer value)
{
GskSlTypeMatrix *matrix = (GskSlTypeMatrix *) type;
guint32 ids[matrix->rows + 2];
guint32 ids[matrix->rows];
GskSlType *vector_type;
GskSlValue *v;
const guchar *data;
@@ -1123,23 +1015,18 @@ gsk_sl_type_matrix_write_value_spv (GskSlType *type,
data = value;
vector_type = gsk_sl_type_get_index_type (type);
ids[0] = gsk_spv_writer_get_id_for_type (writer, type);
for (i = 0; i < matrix->columns; i++)
{
v = gsk_sl_value_new_for_data (vector_type, (gpointer) data, NULL, NULL);
ids[2 + i] = gsk_spv_writer_get_id_for_value (writer, v);
ids[i] = gsk_spv_writer_get_id_for_value (writer, v);
gsk_sl_value_free (v);
data += gsk_sl_type_get_size (vector_type);
}
ids[1] = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
3 + matrix->columns,
GSK_SPV_OP_CONSTANT_COMPOSITE,
ids);
return ids[1];
return gsk_spv_writer_constant_composite (writer,
type,
ids,
matrix->columns);
}
static const GskSlTypeClass GSK_SL_TYPE_MATRIX = {
@@ -1267,22 +1154,17 @@ gsk_sl_type_struct_write_spv (GskSlType *type,
GskSpvWriter *writer)
{
GskSlTypeStruct *struc = (GskSlTypeStruct *) type;
guint32 ids[struc->n_members + 1];
guint32 ids[struc->n_members];
guint i;
ids[0] = gsk_spv_writer_next_id (writer);
for (i = 0; i < struc->n_members; i++)
{
ids[i + 1] = gsk_spv_writer_get_id_for_type (writer, struc->members[i].type);
ids[i] = gsk_spv_writer_get_id_for_type (writer, struc->members[i].type);
}
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
2 + struc->n_members, GSK_SPV_OP_TYPE_STRUCT,
ids);
return ids[0];
return gsk_spv_writer_type_struct (writer,
ids,
struc->n_members);
}
static void
@@ -1337,29 +1219,23 @@ gsk_sl_type_struct_write_value_spv (GskSlType *type,
gconstpointer value)
{
GskSlTypeStruct *struc = (GskSlTypeStruct *) type;
guint32 ids[struc->n_members + 2];
guint32 ids[struc->n_members];
GskSlValue *v;
guint i;
ids[0] = gsk_spv_writer_get_id_for_type (writer, type);
for (i = 0; i < struc->n_members; i++)
{
v = gsk_sl_value_new_for_data (struc->members[i].type,
(guchar *) value + struc->members[i].offset,
NULL, NULL);
ids[2 + i] = gsk_spv_writer_get_id_for_value (writer, v);
ids[i] = gsk_spv_writer_get_id_for_value (writer, v);
gsk_sl_value_free (v);
}
ids[1] = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
3 + struc->n_members,
GSK_SPV_OP_CONSTANT_COMPOSITE,
ids);
return ids[1];
return gsk_spv_writer_constant_composite (writer,
type,
ids,
struc->n_members);
}
static const GskSlTypeClass GSK_SL_TYPE_STRUCT = {
@@ -1487,28 +1363,21 @@ gsk_sl_type_block_write_spv (GskSlType *type,
GskSpvWriter *writer)
{
GskSlTypeBlock *block = (GskSlTypeBlock *) type;
guint32 ids[block->n_members + 1];
guint32 ids[block->n_members], result_id;
guint i;
ids[0] = gsk_spv_writer_next_id (writer);
for (i = 0; i < block->n_members; i++)
{
ids[i + 1] = gsk_spv_writer_get_id_for_type (writer, block->members[i].type);
ids[i] = gsk_spv_writer_get_id_for_type (writer, block->members[i].type);
}
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DEBUG,
3, GSK_SPV_OP_DECORATE,
(guint32[2]) { ids[0],
GSK_SPV_DECORATION_BLOCK });
result_id = gsk_spv_writer_type_struct (writer,
ids,
block->n_members);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
2 + block->n_members, GSK_SPV_OP_TYPE_STRUCT,
ids);
return ids[0];
gsk_spv_writer_decorate (writer, result_id, GSK_SPV_DECORATION_BLOCK);
return result_id;
}
static void
@@ -1563,29 +1432,23 @@ gsk_sl_type_block_write_value_spv (GskSlType *type,
gconstpointer value)
{
GskSlTypeBlock *block = (GskSlTypeBlock *) type;
guint32 ids[block->n_members + 2];
guint32 ids[block->n_members];
GskSlValue *v;
guint i;
ids[0] = gsk_spv_writer_get_id_for_type (writer, type);
for (i = 0; i < block->n_members; i++)
{
v = gsk_sl_value_new_for_data (block->members[i].type,
(guchar *) value + block->members[i].offset,
NULL, NULL);
ids[2 + i] = gsk_spv_writer_get_id_for_value (writer, v);
ids[i] = gsk_spv_writer_get_id_for_value (writer, v);
gsk_sl_value_free (v);
}
ids[1] = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_DECLARE,
3 + block->n_members,
GSK_SPV_OP_CONSTANT_COMPOSITE,
ids);
return ids[1];
return gsk_spv_writer_constant_composite (writer,
type,
ids,
block->n_members);
}
static const GskSlTypeClass GSK_SL_TYPE_BLOCK = {

View File

@@ -117,8 +117,14 @@ gsk_sl_variable_print (const GskSlVariable *variable,
}
}
GskSlPointerType *
GskSlType *
gsk_sl_variable_get_type (const GskSlVariable *variable)
{
return gsk_sl_pointer_type_get_type (variable->type);
}
GskSlPointerType *
gsk_sl_variable_get_pointer_type (const GskSlVariable *variable)
{
return variable->type;
}
@@ -147,36 +153,21 @@ gsk_sl_variable_write_spv (const GskSlVariable *variable,
{
if (gsk_sl_qualifier_get_location (gsk_sl_pointer_type_get_qualifier (variable->type)) == GSK_SL_QUALIFIER_PARAMETER)
{
guint32 type_id, variable_id;
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;
return gsk_spv_writer_function_parameter (writer,
gsk_sl_pointer_type_get_type (variable->type));
}
else
{
guint32 pointer_type_id, variable_id, value_id;
guint32 value_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;
return gsk_spv_writer_variable (writer,
variable->type,
gsk_sl_qualifier_get_storage_class (gsk_sl_pointer_type_get_qualifier (variable->type)),
value_id);
}
}

View File

@@ -35,7 +35,8 @@ void gsk_sl_variable_unref (GskSlVariable
void gsk_sl_variable_print (const GskSlVariable *variable,
GskSlPrinter *printer);
GskSlPointerType * gsk_sl_variable_get_type (const GskSlVariable *variable);
GskSlType * gsk_sl_variable_get_type (const GskSlVariable *variable);
GskSlPointerType * gsk_sl_variable_get_pointer_type (const GskSlVariable *variable);
const char * gsk_sl_variable_get_name (const GskSlVariable *variable);
const GskSlValue * gsk_sl_variable_get_initial_value (const GskSlVariable *variable);
gboolean gsk_sl_variable_is_constant (const GskSlVariable *variable);

855
gsk/gskspvenumsprivate.h Normal file
View File

@@ -0,0 +1,855 @@
/* GTK - The GIMP Toolkit
*
* Copyright © 2017 Benjamin Otte <otte@gnome.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* !!! THIS FILE WAS AUTOGENERATED !!!
*
* This file was created using the command
* gjs spirv.js enums spirv.core.grammar.json
* Apply any changes to those files and then regenerate using above command.
*/
#ifndef __GSK_SPV_ENUMS_H__
#define __GSK_SPV_ENUMS_H__
typedef enum {
GSK_SPV_IMAGE_OPERANDS_NONE = 0x0000,
GSK_SPV_IMAGE_OPERANDS_BIAS = 0x0001,
GSK_SPV_IMAGE_OPERANDS_LOD = 0x0002,
GSK_SPV_IMAGE_OPERANDS_GRAD = 0x0004,
GSK_SPV_IMAGE_OPERANDS_CONST_OFFSET = 0x0008,
GSK_SPV_IMAGE_OPERANDS_OFFSET = 0x0010,
GSK_SPV_IMAGE_OPERANDS_CONST_OFFSETS = 0x0020,
GSK_SPV_IMAGE_OPERANDS_SAMPLE = 0x0040,
GSK_SPV_IMAGE_OPERANDS_MIN_LOD = 0x0080
} GskSpvImageOperands;
typedef enum {
GSK_SPV_FP_FAST_MATH_MODE_NONE = 0x0000,
GSK_SPV_FP_FAST_MATH_MODE_NOT_NA_N = 0x0001,
GSK_SPV_FP_FAST_MATH_MODE_NOT_INF = 0x0002,
GSK_SPV_FP_FAST_MATH_MODE_NSZ = 0x0004,
GSK_SPV_FP_FAST_MATH_MODE_ALLOW_RECIP = 0x0008,
GSK_SPV_FP_FAST_MATH_MODE_FAST = 0x0010
} GskSpvFPFastMathMode;
typedef enum {
GSK_SPV_SELECTION_CONTROL_NONE = 0x0000,
GSK_SPV_SELECTION_CONTROL_FLATTEN = 0x0001,
GSK_SPV_SELECTION_CONTROL_DONT_FLATTEN = 0x0002
} GskSpvSelectionControl;
typedef enum {
GSK_SPV_LOOP_CONTROL_NONE = 0x0000,
GSK_SPV_LOOP_CONTROL_UNROLL = 0x0001,
GSK_SPV_LOOP_CONTROL_DONT_UNROLL = 0x0002
} GskSpvLoopControl;
typedef enum {
GSK_SPV_FUNCTION_CONTROL_NONE = 0x0000,
GSK_SPV_FUNCTION_CONTROL_INLINE = 0x0001,
GSK_SPV_FUNCTION_CONTROL_DONT_INLINE = 0x0002,
GSK_SPV_FUNCTION_CONTROL_PURE = 0x0004,
GSK_SPV_FUNCTION_CONTROL_CONST = 0x0008
} GskSpvFunctionControl;
typedef enum {
GSK_SPV_MEMORY_SEMANTICS_RELAXED = 0x0000,
GSK_SPV_MEMORY_SEMANTICS_NONE = 0x0000,
GSK_SPV_MEMORY_SEMANTICS_ACQUIRE = 0x0002,
GSK_SPV_MEMORY_SEMANTICS_RELEASE = 0x0004,
GSK_SPV_MEMORY_SEMANTICS_ACQUIRE_RELEASE = 0x0008,
GSK_SPV_MEMORY_SEMANTICS_SEQUENTIALLY_CONSISTENT = 0x0010,
GSK_SPV_MEMORY_SEMANTICS_UNIFORM_MEMORY = 0x0040,
GSK_SPV_MEMORY_SEMANTICS_SUBGROUP_MEMORY = 0x0080,
GSK_SPV_MEMORY_SEMANTICS_WORKGROUP_MEMORY = 0x0100,
GSK_SPV_MEMORY_SEMANTICS_CROSS_WORKGROUP_MEMORY = 0x0200,
GSK_SPV_MEMORY_SEMANTICS_ATOMIC_COUNTER_MEMORY = 0x0400,
GSK_SPV_MEMORY_SEMANTICS_IMAGE_MEMORY = 0x0800
} GskSpvMemorySemantics;
typedef enum {
GSK_SPV_MEMORY_ACCESS_NONE = 0x0000,
GSK_SPV_MEMORY_ACCESS_VOLATILE = 0x0001,
GSK_SPV_MEMORY_ACCESS_ALIGNED = 0x0002,
GSK_SPV_MEMORY_ACCESS_NONTEMPORAL = 0x0004
} GskSpvMemoryAccess;
typedef enum {
GSK_SPV_KERNEL_PROFILING_INFO_NONE = 0x0000,
GSK_SPV_KERNEL_PROFILING_INFO_CMD_EXEC_TIME = 0x0001
} GskSpvKernelProfilingInfo;
typedef enum {
GSK_SPV_SOURCE_LANGUAGE_UNKNOWN = 0,
GSK_SPV_SOURCE_LANGUAGE_ESSL = 1,
GSK_SPV_SOURCE_LANGUAGE_GLSL = 2,
GSK_SPV_SOURCE_LANGUAGE_OPEN_CL_C = 3,
GSK_SPV_SOURCE_LANGUAGE_OPEN_CL_CPP = 4,
GSK_SPV_SOURCE_LANGUAGE_HLSL = 5
} GskSpvSourceLanguage;
typedef enum {
GSK_SPV_EXECUTION_MODEL_VERTEX = 0,
GSK_SPV_EXECUTION_MODEL_TESSELLATION_CONTROL = 1,
GSK_SPV_EXECUTION_MODEL_TESSELLATION_EVALUATION = 2,
GSK_SPV_EXECUTION_MODEL_GEOMETRY = 3,
GSK_SPV_EXECUTION_MODEL_FRAGMENT = 4,
GSK_SPV_EXECUTION_MODEL_GL_COMPUTE = 5,
GSK_SPV_EXECUTION_MODEL_KERNEL = 6
} GskSpvExecutionModel;
typedef enum {
GSK_SPV_ADDRESSING_MODEL_LOGICAL = 0,
GSK_SPV_ADDRESSING_MODEL_PHYSICAL32 = 1,
GSK_SPV_ADDRESSING_MODEL_PHYSICAL64 = 2
} GskSpvAddressingModel;
typedef enum {
GSK_SPV_MEMORY_MODEL_SIMPLE = 0,
GSK_SPV_MEMORY_MODEL_GLSL450 = 1,
GSK_SPV_MEMORY_MODEL_OPEN_CL = 2
} GskSpvMemoryModel;
typedef enum {
GSK_SPV_EXECUTION_MODE_INVOCATIONS = 0,
GSK_SPV_EXECUTION_MODE_SPACING_EQUAL = 1,
GSK_SPV_EXECUTION_MODE_SPACING_FRACTIONAL_EVEN = 2,
GSK_SPV_EXECUTION_MODE_SPACING_FRACTIONAL_ODD = 3,
GSK_SPV_EXECUTION_MODE_VERTEX_ORDER_CW = 4,
GSK_SPV_EXECUTION_MODE_VERTEX_ORDER_CCW = 5,
GSK_SPV_EXECUTION_MODE_PIXEL_CENTER_INTEGER = 6,
GSK_SPV_EXECUTION_MODE_ORIGIN_UPPER_LEFT = 7,
GSK_SPV_EXECUTION_MODE_ORIGIN_LOWER_LEFT = 8,
GSK_SPV_EXECUTION_MODE_EARLY_FRAGMENT_TESTS = 9,
GSK_SPV_EXECUTION_MODE_POINT_MODE = 10,
GSK_SPV_EXECUTION_MODE_XFB = 11,
GSK_SPV_EXECUTION_MODE_DEPTH_REPLACING = 12,
GSK_SPV_EXECUTION_MODE_DEPTH_GREATER = 14,
GSK_SPV_EXECUTION_MODE_DEPTH_LESS = 15,
GSK_SPV_EXECUTION_MODE_DEPTH_UNCHANGED = 16,
GSK_SPV_EXECUTION_MODE_LOCAL_SIZE = 17,
GSK_SPV_EXECUTION_MODE_LOCAL_SIZE_HINT = 18,
GSK_SPV_EXECUTION_MODE_INPUT_POINTS = 19,
GSK_SPV_EXECUTION_MODE_INPUT_LINES = 20,
GSK_SPV_EXECUTION_MODE_INPUT_LINES_ADJACENCY = 21,
GSK_SPV_EXECUTION_MODE_TRIANGLES = 22,
GSK_SPV_EXECUTION_MODE_INPUT_TRIANGLES_ADJACENCY = 23,
GSK_SPV_EXECUTION_MODE_QUADS = 24,
GSK_SPV_EXECUTION_MODE_ISOLINES = 25,
GSK_SPV_EXECUTION_MODE_OUTPUT_VERTICES = 26,
GSK_SPV_EXECUTION_MODE_OUTPUT_POINTS = 27,
GSK_SPV_EXECUTION_MODE_OUTPUT_LINE_STRIP = 28,
GSK_SPV_EXECUTION_MODE_OUTPUT_TRIANGLE_STRIP = 29,
GSK_SPV_EXECUTION_MODE_VEC_TYPE_HINT = 30,
GSK_SPV_EXECUTION_MODE_CONTRACTION_OFF = 31,
GSK_SPV_EXECUTION_MODE_POST_DEPTH_COVERAGE = 4446,
GSK_SPV_EXECUTION_MODE_STENCIL_REF_REPLACING_EXT = 5027
} GskSpvExecutionMode;
typedef enum {
GSK_SPV_STORAGE_CLASS_UNIFORM_CONSTANT = 0,
GSK_SPV_STORAGE_CLASS_INPUT = 1,
GSK_SPV_STORAGE_CLASS_UNIFORM = 2,
GSK_SPV_STORAGE_CLASS_OUTPUT = 3,
GSK_SPV_STORAGE_CLASS_WORKGROUP = 4,
GSK_SPV_STORAGE_CLASS_CROSS_WORKGROUP = 5,
GSK_SPV_STORAGE_CLASS_PRIVATE = 6,
GSK_SPV_STORAGE_CLASS_FUNCTION = 7,
GSK_SPV_STORAGE_CLASS_GENERIC = 8,
GSK_SPV_STORAGE_CLASS_PUSH_CONSTANT = 9,
GSK_SPV_STORAGE_CLASS_ATOMIC_COUNTER = 10,
GSK_SPV_STORAGE_CLASS_IMAGE = 11,
GSK_SPV_STORAGE_CLASS_STORAGE_BUFFER = 12
} GskSpvStorageClass;
typedef enum {
GSK_SPV_DIM_1_D = 0,
GSK_SPV_DIM_2_D = 1,
GSK_SPV_DIM_3_D = 2,
GSK_SPV_DIM_CUBE = 3,
GSK_SPV_DIM_RECT = 4,
GSK_SPV_DIM_BUFFER = 5,
GSK_SPV_DIM_SUBPASS_DATA = 6
} GskSpvDim;
typedef enum {
GSK_SPV_SAMPLER_ADDRESSING_MODE_NONE = 0,
GSK_SPV_SAMPLER_ADDRESSING_MODE_CLAMP_TO_EDGE = 1,
GSK_SPV_SAMPLER_ADDRESSING_MODE_CLAMP = 2,
GSK_SPV_SAMPLER_ADDRESSING_MODE_REPEAT = 3,
GSK_SPV_SAMPLER_ADDRESSING_MODE_REPEAT_MIRRORED = 4
} GskSpvSamplerAddressingMode;
typedef enum {
GSK_SPV_SAMPLER_FILTER_MODE_NEAREST = 0,
GSK_SPV_SAMPLER_FILTER_MODE_LINEAR = 1
} GskSpvSamplerFilterMode;
typedef enum {
GSK_SPV_IMAGE_FORMAT_UNKNOWN = 0,
GSK_SPV_IMAGE_FORMAT_RGBA32F = 1,
GSK_SPV_IMAGE_FORMAT_RGBA16F = 2,
GSK_SPV_IMAGE_FORMAT_R32F = 3,
GSK_SPV_IMAGE_FORMAT_RGBA8 = 4,
GSK_SPV_IMAGE_FORMAT_RGBA8_SNORM = 5,
GSK_SPV_IMAGE_FORMAT_RG32F = 6,
GSK_SPV_IMAGE_FORMAT_RG16F = 7,
GSK_SPV_IMAGE_FORMAT_R11F_G11F_B10F = 8,
GSK_SPV_IMAGE_FORMAT_R16F = 9,
GSK_SPV_IMAGE_FORMAT_RGBA16 = 10,
GSK_SPV_IMAGE_FORMAT_RGB10_A2 = 11,
GSK_SPV_IMAGE_FORMAT_RG16 = 12,
GSK_SPV_IMAGE_FORMAT_RG8 = 13,
GSK_SPV_IMAGE_FORMAT_R16 = 14,
GSK_SPV_IMAGE_FORMAT_R8 = 15,
GSK_SPV_IMAGE_FORMAT_RGBA16_SNORM = 16,
GSK_SPV_IMAGE_FORMAT_RG16_SNORM = 17,
GSK_SPV_IMAGE_FORMAT_RG8_SNORM = 18,
GSK_SPV_IMAGE_FORMAT_R16_SNORM = 19,
GSK_SPV_IMAGE_FORMAT_R8_SNORM = 20,
GSK_SPV_IMAGE_FORMAT_RGBA32I = 21,
GSK_SPV_IMAGE_FORMAT_RGBA16I = 22,
GSK_SPV_IMAGE_FORMAT_RGBA8I = 23,
GSK_SPV_IMAGE_FORMAT_R32I = 24,
GSK_SPV_IMAGE_FORMAT_RG32I = 25,
GSK_SPV_IMAGE_FORMAT_RG16I = 26,
GSK_SPV_IMAGE_FORMAT_RG8I = 27,
GSK_SPV_IMAGE_FORMAT_R16I = 28,
GSK_SPV_IMAGE_FORMAT_R8I = 29,
GSK_SPV_IMAGE_FORMAT_RGBA32UI = 30,
GSK_SPV_IMAGE_FORMAT_RGBA16UI = 31,
GSK_SPV_IMAGE_FORMAT_RGBA8UI = 32,
GSK_SPV_IMAGE_FORMAT_R32UI = 33,
GSK_SPV_IMAGE_FORMAT_RGB10A2UI = 34,
GSK_SPV_IMAGE_FORMAT_RG32UI = 35,
GSK_SPV_IMAGE_FORMAT_RG16UI = 36,
GSK_SPV_IMAGE_FORMAT_RG8UI = 37,
GSK_SPV_IMAGE_FORMAT_R16UI = 38,
GSK_SPV_IMAGE_FORMAT_R8UI = 39
} GskSpvImageFormat;
typedef enum {
GSK_SPV_IMAGE_CHANNEL_ORDER_R = 0,
GSK_SPV_IMAGE_CHANNEL_ORDER_A = 1,
GSK_SPV_IMAGE_CHANNEL_ORDER_RG = 2,
GSK_SPV_IMAGE_CHANNEL_ORDER_RA = 3,
GSK_SPV_IMAGE_CHANNEL_ORDER_RGB = 4,
GSK_SPV_IMAGE_CHANNEL_ORDER_RGBA = 5,
GSK_SPV_IMAGE_CHANNEL_ORDER_BGRA = 6,
GSK_SPV_IMAGE_CHANNEL_ORDER_ARGB = 7,
GSK_SPV_IMAGE_CHANNEL_ORDER_INTENSITY = 8,
GSK_SPV_IMAGE_CHANNEL_ORDER_LUMINANCE = 9,
GSK_SPV_IMAGE_CHANNEL_ORDER_RX = 10,
GSK_SPV_IMAGE_CHANNEL_ORDER_R_GX = 11,
GSK_SPV_IMAGE_CHANNEL_ORDER_RG_BX = 12,
GSK_SPV_IMAGE_CHANNEL_ORDER_DEPTH = 13,
GSK_SPV_IMAGE_CHANNEL_ORDER_DEPTH_STENCIL = 14,
GSK_SPV_IMAGE_CHANNEL_ORDER_S_RGB = 15,
GSK_SPV_IMAGE_CHANNEL_ORDER_S_RG_BX = 16,
GSK_SPV_IMAGE_CHANNEL_ORDER_S_RGBA = 17,
GSK_SPV_IMAGE_CHANNEL_ORDER_S_BGRA = 18,
GSK_SPV_IMAGE_CHANNEL_ORDER_ABGR = 19
} GskSpvImageChannelOrder;
typedef enum {
GSK_SPV_IMAGE_CHANNEL_DATA_TYPE_SNORM_INT8 = 0,
GSK_SPV_IMAGE_CHANNEL_DATA_TYPE_SNORM_INT16 = 1,
GSK_SPV_IMAGE_CHANNEL_DATA_TYPE_UNORM_INT8 = 2,
GSK_SPV_IMAGE_CHANNEL_DATA_TYPE_UNORM_INT16 = 3,
GSK_SPV_IMAGE_CHANNEL_DATA_TYPE_UNORM_SHORT565 = 4,
GSK_SPV_IMAGE_CHANNEL_DATA_TYPE_UNORM_SHORT555 = 5,
GSK_SPV_IMAGE_CHANNEL_DATA_TYPE_UNORM_INT101010 = 6,
GSK_SPV_IMAGE_CHANNEL_DATA_TYPE_SIGNED_INT8 = 7,
GSK_SPV_IMAGE_CHANNEL_DATA_TYPE_SIGNED_INT16 = 8,
GSK_SPV_IMAGE_CHANNEL_DATA_TYPE_SIGNED_INT32 = 9,
GSK_SPV_IMAGE_CHANNEL_DATA_TYPE_UNSIGNED_INT8 = 10,
GSK_SPV_IMAGE_CHANNEL_DATA_TYPE_UNSIGNED_INT16 = 11,
GSK_SPV_IMAGE_CHANNEL_DATA_TYPE_UNSIGNED_INT32 = 12,
GSK_SPV_IMAGE_CHANNEL_DATA_TYPE_HALF_FLOAT = 13,
GSK_SPV_IMAGE_CHANNEL_DATA_TYPE_FLOAT = 14,
GSK_SPV_IMAGE_CHANNEL_DATA_TYPE_UNORM_INT24 = 15,
GSK_SPV_IMAGE_CHANNEL_DATA_TYPE_UNORM_INT101010_2 = 16
} GskSpvImageChannelDataType;
typedef enum {
GSK_SPV_FP_ROUNDING_MODE_RTE = 0,
GSK_SPV_FP_ROUNDING_MODE_RTZ = 1,
GSK_SPV_FP_ROUNDING_MODE_RTP = 2,
GSK_SPV_FP_ROUNDING_MODE_RTN = 3
} GskSpvFPRoundingMode;
typedef enum {
GSK_SPV_LINKAGE_TYPE_EXPORT = 0,
GSK_SPV_LINKAGE_TYPE_IMPORT = 1
} GskSpvLinkageType;
typedef enum {
GSK_SPV_ACCESS_QUALIFIER_READ_ONLY = 0,
GSK_SPV_ACCESS_QUALIFIER_WRITE_ONLY = 1,
GSK_SPV_ACCESS_QUALIFIER_READ_WRITE = 2
} GskSpvAccessQualifier;
typedef enum {
GSK_SPV_FUNCTION_PARAMETER_ATTRIBUTE_ZEXT = 0,
GSK_SPV_FUNCTION_PARAMETER_ATTRIBUTE_SEXT = 1,
GSK_SPV_FUNCTION_PARAMETER_ATTRIBUTE_BY_VAL = 2,
GSK_SPV_FUNCTION_PARAMETER_ATTRIBUTE_SRET = 3,
GSK_SPV_FUNCTION_PARAMETER_ATTRIBUTE_NO_ALIAS = 4,
GSK_SPV_FUNCTION_PARAMETER_ATTRIBUTE_NO_CAPTURE = 5,
GSK_SPV_FUNCTION_PARAMETER_ATTRIBUTE_NO_WRITE = 6,
GSK_SPV_FUNCTION_PARAMETER_ATTRIBUTE_NO_READ_WRITE = 7
} GskSpvFunctionParameterAttribute;
typedef enum {
GSK_SPV_DECORATION_RELAXED_PRECISION = 0,
GSK_SPV_DECORATION_SPEC_ID = 1,
GSK_SPV_DECORATION_BLOCK = 2,
GSK_SPV_DECORATION_BUFFER_BLOCK = 3,
GSK_SPV_DECORATION_ROW_MAJOR = 4,
GSK_SPV_DECORATION_COL_MAJOR = 5,
GSK_SPV_DECORATION_ARRAY_STRIDE = 6,
GSK_SPV_DECORATION_MATRIX_STRIDE = 7,
GSK_SPV_DECORATION_GLSL_SHARED = 8,
GSK_SPV_DECORATION_GLSL_PACKED = 9,
GSK_SPV_DECORATION_C_PACKED = 10,
GSK_SPV_DECORATION_BUILT_IN = 11,
GSK_SPV_DECORATION_NO_PERSPECTIVE = 13,
GSK_SPV_DECORATION_FLAT = 14,
GSK_SPV_DECORATION_PATCH = 15,
GSK_SPV_DECORATION_CENTROID = 16,
GSK_SPV_DECORATION_SAMPLE = 17,
GSK_SPV_DECORATION_INVARIANT = 18,
GSK_SPV_DECORATION_RESTRICT = 19,
GSK_SPV_DECORATION_ALIASED = 20,
GSK_SPV_DECORATION_VOLATILE = 21,
GSK_SPV_DECORATION_CONSTANT = 22,
GSK_SPV_DECORATION_COHERENT = 23,
GSK_SPV_DECORATION_NON_WRITABLE = 24,
GSK_SPV_DECORATION_NON_READABLE = 25,
GSK_SPV_DECORATION_UNIFORM = 26,
GSK_SPV_DECORATION_SATURATED_CONVERSION = 28,
GSK_SPV_DECORATION_STREAM = 29,
GSK_SPV_DECORATION_LOCATION = 30,
GSK_SPV_DECORATION_COMPONENT = 31,
GSK_SPV_DECORATION_INDEX = 32,
GSK_SPV_DECORATION_BINDING = 33,
GSK_SPV_DECORATION_DESCRIPTOR_SET = 34,
GSK_SPV_DECORATION_OFFSET = 35,
GSK_SPV_DECORATION_XFB_BUFFER = 36,
GSK_SPV_DECORATION_XFB_STRIDE = 37,
GSK_SPV_DECORATION_FUNC_PARAM_ATTR = 38,
GSK_SPV_DECORATION_FP_ROUNDING_MODE = 39,
GSK_SPV_DECORATION_FP_FAST_MATH_MODE = 40,
GSK_SPV_DECORATION_LINKAGE_ATTRIBUTES = 41,
GSK_SPV_DECORATION_NO_CONTRACTION = 42,
GSK_SPV_DECORATION_INPUT_ATTACHMENT_INDEX = 43,
GSK_SPV_DECORATION_ALIGNMENT = 44,
GSK_SPV_DECORATION_EXPLICIT_INTERP_AMD = 4999,
GSK_SPV_DECORATION_OVERRIDE_COVERAGE_NV = 5248,
GSK_SPV_DECORATION_PASSTHROUGH_NV = 5250,
GSK_SPV_DECORATION_VIEWPORT_RELATIVE_NV = 5252,
GSK_SPV_DECORATION_SECONDARY_VIEWPORT_RELATIVE_NV = 5256
} GskSpvDecoration;
typedef enum {
GSK_SPV_BUILT_IN_POSITION = 0,
GSK_SPV_BUILT_IN_POINT_SIZE = 1,
GSK_SPV_BUILT_IN_CLIP_DISTANCE = 3,
GSK_SPV_BUILT_IN_CULL_DISTANCE = 4,
GSK_SPV_BUILT_IN_VERTEX_ID = 5,
GSK_SPV_BUILT_IN_INSTANCE_ID = 6,
GSK_SPV_BUILT_IN_PRIMITIVE_ID = 7,
GSK_SPV_BUILT_IN_INVOCATION_ID = 8,
GSK_SPV_BUILT_IN_LAYER = 9,
GSK_SPV_BUILT_IN_VIEWPORT_INDEX = 10,
GSK_SPV_BUILT_IN_TESS_LEVEL_OUTER = 11,
GSK_SPV_BUILT_IN_TESS_LEVEL_INNER = 12,
GSK_SPV_BUILT_IN_TESS_COORD = 13,
GSK_SPV_BUILT_IN_PATCH_VERTICES = 14,
GSK_SPV_BUILT_IN_FRAG_COORD = 15,
GSK_SPV_BUILT_IN_POINT_COORD = 16,
GSK_SPV_BUILT_IN_FRONT_FACING = 17,
GSK_SPV_BUILT_IN_SAMPLE_ID = 18,
GSK_SPV_BUILT_IN_SAMPLE_POSITION = 19,
GSK_SPV_BUILT_IN_SAMPLE_MASK = 20,
GSK_SPV_BUILT_IN_FRAG_DEPTH = 22,
GSK_SPV_BUILT_IN_HELPER_INVOCATION = 23,
GSK_SPV_BUILT_IN_NUM_WORKGROUPS = 24,
GSK_SPV_BUILT_IN_WORKGROUP_SIZE = 25,
GSK_SPV_BUILT_IN_WORKGROUP_ID = 26,
GSK_SPV_BUILT_IN_LOCAL_INVOCATION_ID = 27,
GSK_SPV_BUILT_IN_GLOBAL_INVOCATION_ID = 28,
GSK_SPV_BUILT_IN_LOCAL_INVOCATION_INDEX = 29,
GSK_SPV_BUILT_IN_WORK_DIM = 30,
GSK_SPV_BUILT_IN_GLOBAL_SIZE = 31,
GSK_SPV_BUILT_IN_ENQUEUED_WORKGROUP_SIZE = 32,
GSK_SPV_BUILT_IN_GLOBAL_OFFSET = 33,
GSK_SPV_BUILT_IN_GLOBAL_LINEAR_ID = 34,
GSK_SPV_BUILT_IN_SUBGROUP_SIZE = 36,
GSK_SPV_BUILT_IN_SUBGROUP_MAX_SIZE = 37,
GSK_SPV_BUILT_IN_NUM_SUBGROUPS = 38,
GSK_SPV_BUILT_IN_NUM_ENQUEUED_SUBGROUPS = 39,
GSK_SPV_BUILT_IN_SUBGROUP_ID = 40,
GSK_SPV_BUILT_IN_SUBGROUP_LOCAL_INVOCATION_ID = 41,
GSK_SPV_BUILT_IN_VERTEX_INDEX = 42,
GSK_SPV_BUILT_IN_INSTANCE_INDEX = 43,
GSK_SPV_BUILT_IN_SUBGROUP_EQ_MASK_KHR = 4416,
GSK_SPV_BUILT_IN_SUBGROUP_GE_MASK_KHR = 4417,
GSK_SPV_BUILT_IN_SUBGROUP_GT_MASK_KHR = 4418,
GSK_SPV_BUILT_IN_SUBGROUP_LE_MASK_KHR = 4419,
GSK_SPV_BUILT_IN_SUBGROUP_LT_MASK_KHR = 4420,
GSK_SPV_BUILT_IN_BASE_VERTEX = 4424,
GSK_SPV_BUILT_IN_BASE_INSTANCE = 4425,
GSK_SPV_BUILT_IN_DRAW_INDEX = 4426,
GSK_SPV_BUILT_IN_DEVICE_INDEX = 4438,
GSK_SPV_BUILT_IN_VIEW_INDEX = 4440,
GSK_SPV_BUILT_IN_BARY_COORD_NO_PERSP_AMD = 4992,
GSK_SPV_BUILT_IN_BARY_COORD_NO_PERSP_CENTROID_AMD = 4993,
GSK_SPV_BUILT_IN_BARY_COORD_NO_PERSP_SAMPLE_AMD = 4994,
GSK_SPV_BUILT_IN_BARY_COORD_SMOOTH_AMD = 4995,
GSK_SPV_BUILT_IN_BARY_COORD_SMOOTH_CENTROID_AMD = 4996,
GSK_SPV_BUILT_IN_BARY_COORD_SMOOTH_SAMPLE_AMD = 4997,
GSK_SPV_BUILT_IN_BARY_COORD_PULL_MODEL_AMD = 4998,
GSK_SPV_BUILT_IN_FRAG_STENCIL_REF_EXT = 5014,
GSK_SPV_BUILT_IN_VIEWPORT_MASK_NV = 5253,
GSK_SPV_BUILT_IN_SECONDARY_POSITION_NV = 5257,
GSK_SPV_BUILT_IN_SECONDARY_VIEWPORT_MASK_NV = 5258,
GSK_SPV_BUILT_IN_POSITION_PER_VIEW_NV = 5261,
GSK_SPV_BUILT_IN_VIEWPORT_MASK_PER_VIEW_NV = 5262
} GskSpvBuiltIn;
typedef enum {
GSK_SPV_SCOPE_CROSS_DEVICE = 0,
GSK_SPV_SCOPE_DEVICE = 1,
GSK_SPV_SCOPE_WORKGROUP = 2,
GSK_SPV_SCOPE_SUBGROUP = 3,
GSK_SPV_SCOPE_INVOCATION = 4
} GskSpvScope;
typedef enum {
GSK_SPV_GROUP_OPERATION_REDUCE = 0,
GSK_SPV_GROUP_OPERATION_INCLUSIVE_SCAN = 1,
GSK_SPV_GROUP_OPERATION_EXCLUSIVE_SCAN = 2
} GskSpvGroupOperation;
typedef enum {
GSK_SPV_KERNEL_ENQUEUE_FLAGS_NO_WAIT = 0,
GSK_SPV_KERNEL_ENQUEUE_FLAGS_WAIT_KERNEL = 1,
GSK_SPV_KERNEL_ENQUEUE_FLAGS_WAIT_WORK_GROUP = 2
} GskSpvKernelEnqueueFlags;
typedef enum {
GSK_SPV_CAPABILITY_MATRIX = 0,
GSK_SPV_CAPABILITY_SHADER = 1,
GSK_SPV_CAPABILITY_GEOMETRY = 2,
GSK_SPV_CAPABILITY_TESSELLATION = 3,
GSK_SPV_CAPABILITY_ADDRESSES = 4,
GSK_SPV_CAPABILITY_LINKAGE = 5,
GSK_SPV_CAPABILITY_KERNEL = 6,
GSK_SPV_CAPABILITY_VECTOR16 = 7,
GSK_SPV_CAPABILITY_FLOAT16_BUFFER = 8,
GSK_SPV_CAPABILITY_FLOAT16 = 9,
GSK_SPV_CAPABILITY_FLOAT64 = 10,
GSK_SPV_CAPABILITY_INT64 = 11,
GSK_SPV_CAPABILITY_INT64_ATOMICS = 12,
GSK_SPV_CAPABILITY_IMAGE_BASIC = 13,
GSK_SPV_CAPABILITY_IMAGE_READ_WRITE = 14,
GSK_SPV_CAPABILITY_IMAGE_MIPMAP = 15,
GSK_SPV_CAPABILITY_PIPES = 17,
GSK_SPV_CAPABILITY_GROUPS = 18,
GSK_SPV_CAPABILITY_DEVICE_ENQUEUE = 19,
GSK_SPV_CAPABILITY_LITERAL_SAMPLER = 20,
GSK_SPV_CAPABILITY_ATOMIC_STORAGE = 21,
GSK_SPV_CAPABILITY_INT16 = 22,
GSK_SPV_CAPABILITY_TESSELLATION_POINT_SIZE = 23,
GSK_SPV_CAPABILITY_GEOMETRY_POINT_SIZE = 24,
GSK_SPV_CAPABILITY_IMAGE_GATHER_EXTENDED = 25,
GSK_SPV_CAPABILITY_STORAGE_IMAGE_MULTISAMPLE = 27,
GSK_SPV_CAPABILITY_UNIFORM_BUFFER_ARRAY_DYNAMIC_INDEXING = 28,
GSK_SPV_CAPABILITY_SAMPLED_IMAGE_ARRAY_DYNAMIC_INDEXING = 29,
GSK_SPV_CAPABILITY_STORAGE_BUFFER_ARRAY_DYNAMIC_INDEXING = 30,
GSK_SPV_CAPABILITY_STORAGE_IMAGE_ARRAY_DYNAMIC_INDEXING = 31,
GSK_SPV_CAPABILITY_CLIP_DISTANCE = 32,
GSK_SPV_CAPABILITY_CULL_DISTANCE = 33,
GSK_SPV_CAPABILITY_IMAGE_CUBE_ARRAY = 34,
GSK_SPV_CAPABILITY_SAMPLE_RATE_SHADING = 35,
GSK_SPV_CAPABILITY_IMAGE_RECT = 36,
GSK_SPV_CAPABILITY_SAMPLED_RECT = 37,
GSK_SPV_CAPABILITY_GENERIC_POINTER = 38,
GSK_SPV_CAPABILITY_INT8 = 39,
GSK_SPV_CAPABILITY_INPUT_ATTACHMENT = 40,
GSK_SPV_CAPABILITY_SPARSE_RESIDENCY = 41,
GSK_SPV_CAPABILITY_MIN_LOD = 42,
GSK_SPV_CAPABILITY_SAMPLED1_D = 43,
GSK_SPV_CAPABILITY_IMAGE1_D = 44,
GSK_SPV_CAPABILITY_SAMPLED_CUBE_ARRAY = 45,
GSK_SPV_CAPABILITY_SAMPLED_BUFFER = 46,
GSK_SPV_CAPABILITY_IMAGE_BUFFER = 47,
GSK_SPV_CAPABILITY_IMAGE_MS_ARRAY = 48,
GSK_SPV_CAPABILITY_STORAGE_IMAGE_EXTENDED_FORMATS = 49,
GSK_SPV_CAPABILITY_IMAGE_QUERY = 50,
GSK_SPV_CAPABILITY_DERIVATIVE_CONTROL = 51,
GSK_SPV_CAPABILITY_INTERPOLATION_FUNCTION = 52,
GSK_SPV_CAPABILITY_TRANSFORM_FEEDBACK = 53,
GSK_SPV_CAPABILITY_GEOMETRY_STREAMS = 54,
GSK_SPV_CAPABILITY_STORAGE_IMAGE_READ_WITHOUT_FORMAT = 55,
GSK_SPV_CAPABILITY_STORAGE_IMAGE_WRITE_WITHOUT_FORMAT = 56,
GSK_SPV_CAPABILITY_MULTI_VIEWPORT = 57,
GSK_SPV_CAPABILITY_SUBGROUP_BALLOT_KHR = 4423,
GSK_SPV_CAPABILITY_DRAW_PARAMETERS = 4427,
GSK_SPV_CAPABILITY_SUBGROUP_VOTE_KHR = 4431,
GSK_SPV_CAPABILITY_STORAGE_BUFFER16_BIT_ACCESS = 4433,
GSK_SPV_CAPABILITY_STORAGE_UNIFORM_BUFFER_BLOCK16 = 4433,
GSK_SPV_CAPABILITY_UNIFORM_AND_STORAGE_BUFFER16_BIT_ACCESS = 4434,
GSK_SPV_CAPABILITY_STORAGE_UNIFORM16 = 4434,
GSK_SPV_CAPABILITY_STORAGE_PUSH_CONSTANT16 = 4435,
GSK_SPV_CAPABILITY_STORAGE_INPUT_OUTPUT16 = 4436,
GSK_SPV_CAPABILITY_DEVICE_GROUP = 4437,
GSK_SPV_CAPABILITY_MULTI_VIEW = 4439,
GSK_SPV_CAPABILITY_VARIABLE_POINTERS_STORAGE_BUFFER = 4441,
GSK_SPV_CAPABILITY_VARIABLE_POINTERS = 4442,
GSK_SPV_CAPABILITY_ATOMIC_STORAGE_OPS = 4445,
GSK_SPV_CAPABILITY_SAMPLE_MASK_POST_DEPTH_COVERAGE = 4447,
GSK_SPV_CAPABILITY_IMAGE_GATHER_BIAS_LOD_AMD = 5009,
GSK_SPV_CAPABILITY_FRAGMENT_MASK_AMD = 5010,
GSK_SPV_CAPABILITY_STENCIL_EXPORT_EXT = 5013,
GSK_SPV_CAPABILITY_IMAGE_READ_WRITE_LOD_AMD = 5015,
GSK_SPV_CAPABILITY_SAMPLE_MASK_OVERRIDE_COVERAGE_NV = 5249,
GSK_SPV_CAPABILITY_GEOMETRY_SHADER_PASSTHROUGH_NV = 5251,
GSK_SPV_CAPABILITY_SHADER_VIEWPORT_INDEX_LAYER_EXT = 5254,
GSK_SPV_CAPABILITY_SHADER_VIEWPORT_INDEX_LAYER_NV = 5254,
GSK_SPV_CAPABILITY_SHADER_VIEWPORT_MASK_NV = 5255,
GSK_SPV_CAPABILITY_SHADER_STEREO_VIEW_NV = 5259,
GSK_SPV_CAPABILITY_PER_VIEW_ATTRIBUTES_NV = 5260
} GskSpvCapability;
typedef enum {
GSK_SPV_OP_NOP = 0,
GSK_SPV_OP_UNDEF = 1,
GSK_SPV_OP_SOURCE_CONTINUED = 2,
GSK_SPV_OP_SOURCE = 3,
GSK_SPV_OP_SOURCE_EXTENSION = 4,
GSK_SPV_OP_NAME = 5,
GSK_SPV_OP_MEMBER_NAME = 6,
GSK_SPV_OP_STRING = 7,
GSK_SPV_OP_LINE = 8,
GSK_SPV_OP_EXTENSION = 10,
GSK_SPV_OP_EXT_INST_IMPORT = 11,
GSK_SPV_OP_EXT_INST = 12,
GSK_SPV_OP_MEMORY_MODEL = 14,
GSK_SPV_OP_ENTRY_POINT = 15,
GSK_SPV_OP_EXECUTION_MODE = 16,
GSK_SPV_OP_CAPABILITY = 17,
GSK_SPV_OP_TYPE_VOID = 19,
GSK_SPV_OP_TYPE_BOOL = 20,
GSK_SPV_OP_TYPE_INT = 21,
GSK_SPV_OP_TYPE_FLOAT = 22,
GSK_SPV_OP_TYPE_VECTOR = 23,
GSK_SPV_OP_TYPE_MATRIX = 24,
GSK_SPV_OP_TYPE_IMAGE = 25,
GSK_SPV_OP_TYPE_SAMPLER = 26,
GSK_SPV_OP_TYPE_SAMPLED_IMAGE = 27,
GSK_SPV_OP_TYPE_ARRAY = 28,
GSK_SPV_OP_TYPE_RUNTIME_ARRAY = 29,
GSK_SPV_OP_TYPE_STRUCT = 30,
GSK_SPV_OP_TYPE_OPAQUE = 31,
GSK_SPV_OP_TYPE_POINTER = 32,
GSK_SPV_OP_TYPE_FUNCTION = 33,
GSK_SPV_OP_TYPE_EVENT = 34,
GSK_SPV_OP_TYPE_DEVICE_EVENT = 35,
GSK_SPV_OP_TYPE_RESERVE_ID = 36,
GSK_SPV_OP_TYPE_QUEUE = 37,
GSK_SPV_OP_TYPE_PIPE = 38,
GSK_SPV_OP_TYPE_FORWARD_POINTER = 39,
GSK_SPV_OP_CONSTANT_TRUE = 41,
GSK_SPV_OP_CONSTANT_FALSE = 42,
GSK_SPV_OP_CONSTANT = 43,
GSK_SPV_OP_CONSTANT_COMPOSITE = 44,
GSK_SPV_OP_CONSTANT_SAMPLER = 45,
GSK_SPV_OP_CONSTANT_NULL = 46,
GSK_SPV_OP_SPEC_CONSTANT_TRUE = 48,
GSK_SPV_OP_SPEC_CONSTANT_FALSE = 49,
GSK_SPV_OP_SPEC_CONSTANT = 50,
GSK_SPV_OP_SPEC_CONSTANT_COMPOSITE = 51,
GSK_SPV_OP_SPEC_CONSTANT_OP = 52,
GSK_SPV_OP_FUNCTION = 54,
GSK_SPV_OP_FUNCTION_PARAMETER = 55,
GSK_SPV_OP_FUNCTION_END = 56,
GSK_SPV_OP_FUNCTION_CALL = 57,
GSK_SPV_OP_VARIABLE = 59,
GSK_SPV_OP_IMAGE_TEXEL_POINTER = 60,
GSK_SPV_OP_LOAD = 61,
GSK_SPV_OP_STORE = 62,
GSK_SPV_OP_COPY_MEMORY = 63,
GSK_SPV_OP_COPY_MEMORY_SIZED = 64,
GSK_SPV_OP_ACCESS_CHAIN = 65,
GSK_SPV_OP_IN_BOUNDS_ACCESS_CHAIN = 66,
GSK_SPV_OP_PTR_ACCESS_CHAIN = 67,
GSK_SPV_OP_ARRAY_LENGTH = 68,
GSK_SPV_OP_GENERIC_PTR_MEM_SEMANTICS = 69,
GSK_SPV_OP_IN_BOUNDS_PTR_ACCESS_CHAIN = 70,
GSK_SPV_OP_DECORATE = 71,
GSK_SPV_OP_MEMBER_DECORATE = 72,
GSK_SPV_OP_DECORATION_GROUP = 73,
GSK_SPV_OP_GROUP_DECORATE = 74,
GSK_SPV_OP_GROUP_MEMBER_DECORATE = 75,
GSK_SPV_OP_VECTOR_EXTRACT_DYNAMIC = 77,
GSK_SPV_OP_VECTOR_INSERT_DYNAMIC = 78,
GSK_SPV_OP_VECTOR_SHUFFLE = 79,
GSK_SPV_OP_COMPOSITE_CONSTRUCT = 80,
GSK_SPV_OP_COMPOSITE_EXTRACT = 81,
GSK_SPV_OP_COMPOSITE_INSERT = 82,
GSK_SPV_OP_COPY_OBJECT = 83,
GSK_SPV_OP_TRANSPOSE = 84,
GSK_SPV_OP_SAMPLED_IMAGE = 86,
GSK_SPV_OP_IMAGE_SAMPLE_IMPLICIT_LOD = 87,
GSK_SPV_OP_IMAGE_SAMPLE_EXPLICIT_LOD = 88,
GSK_SPV_OP_IMAGE_SAMPLE_DREF_IMPLICIT_LOD = 89,
GSK_SPV_OP_IMAGE_SAMPLE_DREF_EXPLICIT_LOD = 90,
GSK_SPV_OP_IMAGE_SAMPLE_PROJ_IMPLICIT_LOD = 91,
GSK_SPV_OP_IMAGE_SAMPLE_PROJ_EXPLICIT_LOD = 92,
GSK_SPV_OP_IMAGE_SAMPLE_PROJ_DREF_IMPLICIT_LOD = 93,
GSK_SPV_OP_IMAGE_SAMPLE_PROJ_DREF_EXPLICIT_LOD = 94,
GSK_SPV_OP_IMAGE_FETCH = 95,
GSK_SPV_OP_IMAGE_GATHER = 96,
GSK_SPV_OP_IMAGE_DREF_GATHER = 97,
GSK_SPV_OP_IMAGE_READ = 98,
GSK_SPV_OP_IMAGE_WRITE = 99,
GSK_SPV_OP_IMAGE = 100,
GSK_SPV_OP_IMAGE_QUERY_FORMAT = 101,
GSK_SPV_OP_IMAGE_QUERY_ORDER = 102,
GSK_SPV_OP_IMAGE_QUERY_SIZE_LOD = 103,
GSK_SPV_OP_IMAGE_QUERY_SIZE = 104,
GSK_SPV_OP_IMAGE_QUERY_LOD = 105,
GSK_SPV_OP_IMAGE_QUERY_LEVELS = 106,
GSK_SPV_OP_IMAGE_QUERY_SAMPLES = 107,
GSK_SPV_OP_CONVERT_F_TO_U = 109,
GSK_SPV_OP_CONVERT_F_TO_S = 110,
GSK_SPV_OP_CONVERT_S_TO_F = 111,
GSK_SPV_OP_CONVERT_U_TO_F = 112,
GSK_SPV_OP_U_CONVERT = 113,
GSK_SPV_OP_S_CONVERT = 114,
GSK_SPV_OP_F_CONVERT = 115,
GSK_SPV_OP_QUANTIZE_TO_F16 = 116,
GSK_SPV_OP_CONVERT_PTR_TO_U = 117,
GSK_SPV_OP_SAT_CONVERT_S_TO_U = 118,
GSK_SPV_OP_SAT_CONVERT_U_TO_S = 119,
GSK_SPV_OP_CONVERT_U_TO_PTR = 120,
GSK_SPV_OP_PTR_CAST_TO_GENERIC = 121,
GSK_SPV_OP_GENERIC_CAST_TO_PTR = 122,
GSK_SPV_OP_GENERIC_CAST_TO_PTR_EXPLICIT = 123,
GSK_SPV_OP_BITCAST = 124,
GSK_SPV_OP_S_NEGATE = 126,
GSK_SPV_OP_F_NEGATE = 127,
GSK_SPV_OP_I_ADD = 128,
GSK_SPV_OP_F_ADD = 129,
GSK_SPV_OP_I_SUB = 130,
GSK_SPV_OP_F_SUB = 131,
GSK_SPV_OP_I_MUL = 132,
GSK_SPV_OP_F_MUL = 133,
GSK_SPV_OP_U_DIV = 134,
GSK_SPV_OP_S_DIV = 135,
GSK_SPV_OP_F_DIV = 136,
GSK_SPV_OP_U_MOD = 137,
GSK_SPV_OP_S_REM = 138,
GSK_SPV_OP_S_MOD = 139,
GSK_SPV_OP_F_REM = 140,
GSK_SPV_OP_F_MOD = 141,
GSK_SPV_OP_VECTOR_TIMES_SCALAR = 142,
GSK_SPV_OP_MATRIX_TIMES_SCALAR = 143,
GSK_SPV_OP_VECTOR_TIMES_MATRIX = 144,
GSK_SPV_OP_MATRIX_TIMES_VECTOR = 145,
GSK_SPV_OP_MATRIX_TIMES_MATRIX = 146,
GSK_SPV_OP_OUTER_PRODUCT = 147,
GSK_SPV_OP_DOT = 148,
GSK_SPV_OP_I_ADD_CARRY = 149,
GSK_SPV_OP_I_SUB_BORROW = 150,
GSK_SPV_OP_U_MUL_EXTENDED = 151,
GSK_SPV_OP_S_MUL_EXTENDED = 152,
GSK_SPV_OP_ANY = 154,
GSK_SPV_OP_ALL = 155,
GSK_SPV_OP_IS_NAN = 156,
GSK_SPV_OP_IS_INF = 157,
GSK_SPV_OP_IS_FINITE = 158,
GSK_SPV_OP_IS_NORMAL = 159,
GSK_SPV_OP_SIGN_BIT_SET = 160,
GSK_SPV_OP_LESS_OR_GREATER = 161,
GSK_SPV_OP_ORDERED = 162,
GSK_SPV_OP_UNORDERED = 163,
GSK_SPV_OP_LOGICAL_EQUAL = 164,
GSK_SPV_OP_LOGICAL_NOT_EQUAL = 165,
GSK_SPV_OP_LOGICAL_OR = 166,
GSK_SPV_OP_LOGICAL_AND = 167,
GSK_SPV_OP_LOGICAL_NOT = 168,
GSK_SPV_OP_SELECT = 169,
GSK_SPV_OP_I_EQUAL = 170,
GSK_SPV_OP_I_NOT_EQUAL = 171,
GSK_SPV_OP_U_GREATER_THAN = 172,
GSK_SPV_OP_S_GREATER_THAN = 173,
GSK_SPV_OP_U_GREATER_THAN_EQUAL = 174,
GSK_SPV_OP_S_GREATER_THAN_EQUAL = 175,
GSK_SPV_OP_U_LESS_THAN = 176,
GSK_SPV_OP_S_LESS_THAN = 177,
GSK_SPV_OP_U_LESS_THAN_EQUAL = 178,
GSK_SPV_OP_S_LESS_THAN_EQUAL = 179,
GSK_SPV_OP_F_ORD_EQUAL = 180,
GSK_SPV_OP_F_UNORD_EQUAL = 181,
GSK_SPV_OP_F_ORD_NOT_EQUAL = 182,
GSK_SPV_OP_F_UNORD_NOT_EQUAL = 183,
GSK_SPV_OP_F_ORD_LESS_THAN = 184,
GSK_SPV_OP_F_UNORD_LESS_THAN = 185,
GSK_SPV_OP_F_ORD_GREATER_THAN = 186,
GSK_SPV_OP_F_UNORD_GREATER_THAN = 187,
GSK_SPV_OP_F_ORD_LESS_THAN_EQUAL = 188,
GSK_SPV_OP_F_UNORD_LESS_THAN_EQUAL = 189,
GSK_SPV_OP_F_ORD_GREATER_THAN_EQUAL = 190,
GSK_SPV_OP_F_UNORD_GREATER_THAN_EQUAL = 191,
GSK_SPV_OP_SHIFT_RIGHT_LOGICAL = 194,
GSK_SPV_OP_SHIFT_RIGHT_ARITHMETIC = 195,
GSK_SPV_OP_SHIFT_LEFT_LOGICAL = 196,
GSK_SPV_OP_BITWISE_OR = 197,
GSK_SPV_OP_BITWISE_XOR = 198,
GSK_SPV_OP_BITWISE_AND = 199,
GSK_SPV_OP_NOT = 200,
GSK_SPV_OP_BIT_FIELD_INSERT = 201,
GSK_SPV_OP_BIT_FIELD_S_EXTRACT = 202,
GSK_SPV_OP_BIT_FIELD_U_EXTRACT = 203,
GSK_SPV_OP_BIT_REVERSE = 204,
GSK_SPV_OP_BIT_COUNT = 205,
GSK_SPV_OP_D_PDX = 207,
GSK_SPV_OP_D_PDY = 208,
GSK_SPV_OP_FWIDTH = 209,
GSK_SPV_OP_D_PDX_FINE = 210,
GSK_SPV_OP_D_PDY_FINE = 211,
GSK_SPV_OP_FWIDTH_FINE = 212,
GSK_SPV_OP_D_PDX_COARSE = 213,
GSK_SPV_OP_D_PDY_COARSE = 214,
GSK_SPV_OP_FWIDTH_COARSE = 215,
GSK_SPV_OP_EMIT_VERTEX = 218,
GSK_SPV_OP_END_PRIMITIVE = 219,
GSK_SPV_OP_EMIT_STREAM_VERTEX = 220,
GSK_SPV_OP_END_STREAM_PRIMITIVE = 221,
GSK_SPV_OP_CONTROL_BARRIER = 224,
GSK_SPV_OP_MEMORY_BARRIER = 225,
GSK_SPV_OP_ATOMIC_LOAD = 227,
GSK_SPV_OP_ATOMIC_STORE = 228,
GSK_SPV_OP_ATOMIC_EXCHANGE = 229,
GSK_SPV_OP_ATOMIC_COMPARE_EXCHANGE = 230,
GSK_SPV_OP_ATOMIC_COMPARE_EXCHANGE_WEAK = 231,
GSK_SPV_OP_ATOMIC_I_INCREMENT = 232,
GSK_SPV_OP_ATOMIC_I_DECREMENT = 233,
GSK_SPV_OP_ATOMIC_I_ADD = 234,
GSK_SPV_OP_ATOMIC_I_SUB = 235,
GSK_SPV_OP_ATOMIC_S_MIN = 236,
GSK_SPV_OP_ATOMIC_U_MIN = 237,
GSK_SPV_OP_ATOMIC_S_MAX = 238,
GSK_SPV_OP_ATOMIC_U_MAX = 239,
GSK_SPV_OP_ATOMIC_AND = 240,
GSK_SPV_OP_ATOMIC_OR = 241,
GSK_SPV_OP_ATOMIC_XOR = 242,
GSK_SPV_OP_PHI = 245,
GSK_SPV_OP_LOOP_MERGE = 246,
GSK_SPV_OP_SELECTION_MERGE = 247,
GSK_SPV_OP_LABEL = 248,
GSK_SPV_OP_BRANCH = 249,
GSK_SPV_OP_BRANCH_CONDITIONAL = 250,
GSK_SPV_OP_SWITCH = 251,
GSK_SPV_OP_KILL = 252,
GSK_SPV_OP_RETURN = 253,
GSK_SPV_OP_RETURN_VALUE = 254,
GSK_SPV_OP_UNREACHABLE = 255,
GSK_SPV_OP_LIFETIME_START = 256,
GSK_SPV_OP_LIFETIME_STOP = 257,
GSK_SPV_OP_GROUP_ASYNC_COPY = 259,
GSK_SPV_OP_GROUP_WAIT_EVENTS = 260,
GSK_SPV_OP_GROUP_ALL = 261,
GSK_SPV_OP_GROUP_ANY = 262,
GSK_SPV_OP_GROUP_BROADCAST = 263,
GSK_SPV_OP_GROUP_I_ADD = 264,
GSK_SPV_OP_GROUP_F_ADD = 265,
GSK_SPV_OP_GROUP_F_MIN = 266,
GSK_SPV_OP_GROUP_U_MIN = 267,
GSK_SPV_OP_GROUP_S_MIN = 268,
GSK_SPV_OP_GROUP_F_MAX = 269,
GSK_SPV_OP_GROUP_U_MAX = 270,
GSK_SPV_OP_GROUP_S_MAX = 271,
GSK_SPV_OP_READ_PIPE = 274,
GSK_SPV_OP_WRITE_PIPE = 275,
GSK_SPV_OP_RESERVED_READ_PIPE = 276,
GSK_SPV_OP_RESERVED_WRITE_PIPE = 277,
GSK_SPV_OP_RESERVE_READ_PIPE_PACKETS = 278,
GSK_SPV_OP_RESERVE_WRITE_PIPE_PACKETS = 279,
GSK_SPV_OP_COMMIT_READ_PIPE = 280,
GSK_SPV_OP_COMMIT_WRITE_PIPE = 281,
GSK_SPV_OP_IS_VALID_RESERVE_ID = 282,
GSK_SPV_OP_GET_NUM_PIPE_PACKETS = 283,
GSK_SPV_OP_GET_MAX_PIPE_PACKETS = 284,
GSK_SPV_OP_GROUP_RESERVE_READ_PIPE_PACKETS = 285,
GSK_SPV_OP_GROUP_RESERVE_WRITE_PIPE_PACKETS = 286,
GSK_SPV_OP_GROUP_COMMIT_READ_PIPE = 287,
GSK_SPV_OP_GROUP_COMMIT_WRITE_PIPE = 288,
GSK_SPV_OP_ENQUEUE_MARKER = 291,
GSK_SPV_OP_ENQUEUE_KERNEL = 292,
GSK_SPV_OP_GET_KERNEL_N_DRANGE_SUB_GROUP_COUNT = 293,
GSK_SPV_OP_GET_KERNEL_N_DRANGE_MAX_SUB_GROUP_SIZE = 294,
GSK_SPV_OP_GET_KERNEL_WORK_GROUP_SIZE = 295,
GSK_SPV_OP_GET_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE = 296,
GSK_SPV_OP_RETAIN_EVENT = 297,
GSK_SPV_OP_RELEASE_EVENT = 298,
GSK_SPV_OP_CREATE_USER_EVENT = 299,
GSK_SPV_OP_IS_VALID_EVENT = 300,
GSK_SPV_OP_SET_USER_EVENT_STATUS = 301,
GSK_SPV_OP_CAPTURE_EVENT_PROFILING_INFO = 302,
GSK_SPV_OP_GET_DEFAULT_QUEUE = 303,
GSK_SPV_OP_BUILD_ND_RANGE = 304,
GSK_SPV_OP_IMAGE_SPARSE_SAMPLE_IMPLICIT_LOD = 305,
GSK_SPV_OP_IMAGE_SPARSE_SAMPLE_EXPLICIT_LOD = 306,
GSK_SPV_OP_IMAGE_SPARSE_SAMPLE_DREF_IMPLICIT_LOD = 307,
GSK_SPV_OP_IMAGE_SPARSE_SAMPLE_DREF_EXPLICIT_LOD = 308,
GSK_SPV_OP_IMAGE_SPARSE_SAMPLE_PROJ_IMPLICIT_LOD = 309,
GSK_SPV_OP_IMAGE_SPARSE_SAMPLE_PROJ_EXPLICIT_LOD = 310,
GSK_SPV_OP_IMAGE_SPARSE_SAMPLE_PROJ_DREF_IMPLICIT_LOD = 311,
GSK_SPV_OP_IMAGE_SPARSE_SAMPLE_PROJ_DREF_EXPLICIT_LOD = 312,
GSK_SPV_OP_IMAGE_SPARSE_FETCH = 313,
GSK_SPV_OP_IMAGE_SPARSE_GATHER = 314,
GSK_SPV_OP_IMAGE_SPARSE_DREF_GATHER = 315,
GSK_SPV_OP_IMAGE_SPARSE_TEXELS_RESIDENT = 316,
GSK_SPV_OP_NO_LINE = 317,
GSK_SPV_OP_ATOMIC_FLAG_TEST_AND_SET = 318,
GSK_SPV_OP_ATOMIC_FLAG_CLEAR = 319,
GSK_SPV_OP_IMAGE_SPARSE_READ = 320,
GSK_SPV_OP_SUBGROUP_BALLOT_KHR = 4421,
GSK_SPV_OP_SUBGROUP_FIRST_INVOCATION_KHR = 4422,
GSK_SPV_OP_SUBGROUP_ALL_KHR = 4428,
GSK_SPV_OP_SUBGROUP_ANY_KHR = 4429,
GSK_SPV_OP_SUBGROUP_ALL_EQUAL_KHR = 4430,
GSK_SPV_OP_SUBGROUP_READ_INVOCATION_KHR = 4432,
GSK_SPV_OP_GROUP_I_ADD_NON_UNIFORM_AMD = 5000,
GSK_SPV_OP_GROUP_F_ADD_NON_UNIFORM_AMD = 5001,
GSK_SPV_OP_GROUP_F_MIN_NON_UNIFORM_AMD = 5002,
GSK_SPV_OP_GROUP_U_MIN_NON_UNIFORM_AMD = 5003,
GSK_SPV_OP_GROUP_S_MIN_NON_UNIFORM_AMD = 5004,
GSK_SPV_OP_GROUP_F_MAX_NON_UNIFORM_AMD = 5005,
GSK_SPV_OP_GROUP_U_MAX_NON_UNIFORM_AMD = 5006,
GSK_SPV_OP_GROUP_S_MAX_NON_UNIFORM_AMD = 5007,
GSK_SPV_OP_FRAGMENT_MASK_FETCH_AMD = 5011,
GSK_SPV_OP_FRAGMENT_FETCH_AMD = 5012
} GskSpvOpcode;
#endif /* __GSK_SPV_ENUMS_H__ */

View File

@@ -106,34 +106,21 @@ gsk_spv_writer_unref (GskSpvWriter *writer)
static void
gsk_spv_writer_write_header (GskSpvWriter *writer)
{
guchar instruction_set[] = "\0\0\0\0GLSL.std.450\0\0\0\0";
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_HEADER,
2, GSK_SPV_OP_CAPABILITY,
(guint32[1]) { GSK_SPV_CAPABILITY_SHADER });
*(guint32 *) instruction_set = 1;
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_HEADER,
1 + sizeof (instruction_set) / 4, GSK_SPV_OP_EXT_INST_IMPORT,
(guint32 *) instruction_set);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_HEADER,
3, GSK_SPV_OP_MEMORY_MODEL,
(guint32[2]) { GSK_SPV_ADDRESSING_LOGICAL,
GSK_SPV_MEMORY_GLSL450 });
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_HEADER,
5, GSK_SPV_OP_ENTRY_POINT,
(guint32[4]) { GSK_SPV_EXECUTION_MODEL_FRAGMENT,
writer->entry_point,
STRING ("main", 0),
0 });
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_HEADER,
3, GSK_SPV_OP_EXECUTION_MODE,
(guint32[4]) { writer->entry_point,
GSK_SPV_EXECUTION_MODE_ORIGIN_UPPER_LEFT });
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);
gsk_spv_writer_entry_point (writer,
GSK_SPV_EXECUTION_MODEL_FRAGMENT,
writer->entry_point,
"main",
NULL,
0);
gsk_spv_writer_execution_mode (writer,
writer->entry_point,
GSK_SPV_EXECUTION_MODE_ORIGIN_UPPER_LEFT);
}
static void
@@ -288,7 +275,7 @@ gsk_spv_writer_get_id_for_variable (GskSpvWriter *writer,
}
guint32
gsk_spv_writer_next_id (GskSpvWriter *writer)
gsk_spv_writer_make_id (GskSpvWriter *writer)
{
writer->last_id++;
@@ -302,18 +289,11 @@ gsk_spv_writer_set_entry_point (GskSpvWriter *writer,
writer->entry_point = entry_point;
}
void
gsk_spv_writer_add (GskSpvWriter *writer,
GskSpvWriterSection section,
guint16 word_count,
guint16 opcode,
guint32 *words)
GArray *
gsk_spv_writer_get_bytes (GskSpvWriter *writer,
GskSpvWriterSection section)
{
guint32 word;
word = word_count << 16 | opcode;
g_array_append_val (writer->code[section], word);
g_array_append_vals (writer->code[section], words, word_count - 1);
return writer->code[section];
}
static void
@@ -329,10 +309,10 @@ copy_8_bytes (gpointer dest, gpointer src)
}
guint32
gsk_spv_writer_add_conversion (GskSpvWriter *writer,
guint32 id,
GskSlType *type,
GskSlType *new_type)
gsk_spv_writer_convert (GskSpvWriter *writer,
guint32 id,
GskSlType *type,
GskSlType *new_type)
{
GskSlScalarType scalar = gsk_sl_type_get_scalar_type (type);
GskSlScalarType new_scalar = gsk_sl_type_get_scalar_type (new_type);
@@ -344,7 +324,6 @@ gsk_spv_writer_add_conversion (GskSpvWriter *writer,
gsk_sl_type_is_vector (type))
{
GskSlValue *value;
guint32 result_type_id, result_id;
guint32 true_id, false_id, zero_id;
switch (new_scalar)
@@ -360,27 +339,14 @@ gsk_spv_writer_add_conversion (GskSpvWriter *writer,
{
case GSK_SL_INT:
case GSK_SL_UINT:
result_type_id = gsk_spv_writer_get_id_for_type (writer, new_type);
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
4, GSK_SPV_OP_BITCAST,
(guint32[3]) { result_type_id,
result_id,
id });
return result_id;
return gsk_spv_writer_bitcast (writer, new_type, id);
case GSK_SL_FLOAT:
case GSK_SL_DOUBLE:
result_type_id = gsk_spv_writer_get_id_for_type (writer, new_type);
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
4, new_scalar == GSK_SL_UINT ? GSK_SPV_OP_CONVERT_F_TO_U : GSK_SPV_OP_CONVERT_F_TO_S,
(guint32[3]) { result_type_id,
result_id,
id });
return result_id;
if (new_scalar == GSK_SL_UINT)
return gsk_spv_writer_convert_f_to_u (writer, new_type, id);
else
return gsk_spv_writer_convert_f_to_s (writer, new_type, id);
case GSK_SL_BOOL:
value = gsk_sl_value_new (new_type);
@@ -388,17 +354,7 @@ gsk_spv_writer_add_conversion (GskSpvWriter *writer,
gsk_sl_value_componentwise (value, copy_4_bytes, &(gint32) { 1 });
true_id = gsk_spv_writer_get_id_for_value (writer, value);
gsk_sl_value_free (value);
result_type_id = gsk_spv_writer_get_id_for_type (writer, new_type);
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
6, GSK_SPV_OP_SELECT,
(guint32[5]) { result_type_id,
result_id,
id,
true_id,
false_id });
return result_id;
return gsk_spv_writer_select (writer, new_type, id, true_id, false_id);
case GSK_SL_VOID:
default:
@@ -412,38 +368,14 @@ gsk_spv_writer_add_conversion (GskSpvWriter *writer,
switch (scalar)
{
case GSK_SL_INT:
result_type_id = gsk_spv_writer_get_id_for_type (writer, new_type);
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
4, GSK_SPV_OP_CONVERT_S_TO_F,
(guint32[3]) { result_type_id,
result_id,
id });
return result_id;
return gsk_spv_writer_convert_s_to_f (writer, new_type, id);
case GSK_SL_UINT:
result_type_id = gsk_spv_writer_get_id_for_type (writer, new_type);
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
4, GSK_SPV_OP_CONVERT_U_TO_F,
(guint32[3]) { result_type_id,
result_id,
id });
return result_id;
return gsk_spv_writer_convert_u_to_f (writer, new_type, id);
case GSK_SL_FLOAT:
case GSK_SL_DOUBLE:
result_type_id = gsk_spv_writer_get_id_for_type (writer, new_type);
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
4, GSK_SPV_OP_F_CONVERT,
(guint32[3]) { result_type_id,
result_id,
id });
return result_id;
return gsk_spv_writer_f_convert (writer, new_type, id);
case GSK_SL_BOOL:
value = gsk_sl_value_new (new_type);
@@ -454,17 +386,11 @@ gsk_spv_writer_add_conversion (GskSpvWriter *writer,
gsk_sl_value_componentwise (value, copy_4_bytes, &(float) { 1 });
true_id = gsk_spv_writer_get_id_for_value (writer, value);
gsk_sl_value_free (value);
result_type_id = gsk_spv_writer_get_id_for_type (writer, new_type);
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
6, GSK_SPV_OP_SELECT,
(guint32[5]) { result_type_id,
result_id,
id,
true_id,
false_id });
return result_id;
return gsk_spv_writer_select (writer,
new_type,
id,
true_id,
false_id);
case GSK_SL_VOID:
default:
@@ -481,32 +407,14 @@ gsk_spv_writer_add_conversion (GskSpvWriter *writer,
value = gsk_sl_value_new (new_type);
zero_id = gsk_spv_writer_get_id_for_value (writer, value);
gsk_sl_value_free (value);
result_type_id = gsk_spv_writer_get_id_for_type (writer, new_type);
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_I_NOT_EQUAL,
(guint32[4]) { result_type_id,
result_id,
id,
zero_id });
return result_id;
return gsk_spv_writer_i_not_equal (writer, new_type, id, zero_id);
case GSK_SL_FLOAT:
case GSK_SL_DOUBLE:
value = gsk_sl_value_new (new_type);
zero_id = gsk_spv_writer_get_id_for_value (writer, value);
gsk_sl_value_free (value);
result_type_id = gsk_spv_writer_get_id_for_type (writer, new_type);
result_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_F_ORD_NOT_EQUAL,
(guint32[4]) { result_type_id,
result_id,
id,
zero_id });
return result_id;
return gsk_spv_writer_f_ord_not_equal (writer, new_type, id, zero_id);
case GSK_SL_BOOL:
case GSK_SL_VOID:
@@ -522,32 +430,17 @@ gsk_spv_writer_add_conversion (GskSpvWriter *writer,
{
GskSlType *row_type, *new_row_type;
guint i, n = gsk_sl_type_get_length (type);
guint32 ids[n + 2], row_id;
guint32 ids[n];
row_type = gsk_sl_type_get_index_type (type);
new_row_type = gsk_sl_type_get_index_type (new_type);
row_id = gsk_spv_writer_get_id_for_type (writer, row_type);
for (i = 0; i < n; i++)
{
guint tmp_id = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
5, GSK_SPV_OP_COMPOSITE_EXTRACT,
(guint32[4]) { row_id,
tmp_id,
id,
i });
ids[i + 2] = gsk_spv_writer_add_conversion (writer, tmp_id, row_type, new_row_type);
ids[i] = gsk_spv_writer_composite_extract (writer, row_type, id, (guint32[1]) { i }, 1);
ids[i] = gsk_spv_writer_convert (writer, ids[i], row_type, new_row_type);
}
ids[0] = gsk_spv_writer_get_id_for_type (writer, new_type);
ids[1] = gsk_spv_writer_next_id (writer);
gsk_spv_writer_add (writer,
GSK_SPV_WRITER_SECTION_CODE,
3 + n, GSK_SPV_OP_COMPOSITE_CONSTRUCT,
ids);
return ids[1];
return gsk_spv_writer_composite_construct (writer, new_type, ids, n);
}
else
{

File diff suppressed because it is too large Load Diff

View File

@@ -22,6 +22,7 @@
#include <glib.h>
#include "gsksltypesprivate.h"
#include "gskspvenumsprivate.h"
G_BEGIN_DECLS
@@ -30,257 +31,11 @@ G_BEGIN_DECLS
#define GSK_SPV_VERSION_MINOR 0
#define GSK_SPV_GENERATOR 0
typedef enum {
GSK_SPV_OP_NOP = 0,
GSK_SPV_OP_UNDEF = 1,
GSK_SPV_OP_SOURCE_CONTINUED = 2,
GSK_SPV_OP_SOURCE = 3,
GSK_SPV_OP_SOURCE_EXTENSION = 4,
GSK_SPV_OP_NAME = 5,
GSK_SPV_OP_MEMBER_NAME = 6,
GSK_SPV_OP_STRING = 7,
GSK_SPV_OP_LINE = 8,
GSK_SPV_OP_EXTENSION = 10,
GSK_SPV_OP_EXT_INST_IMPORT = 11,
GSK_SPV_OP_EXT_INST = 12,
GSK_SPV_OP_MEMORY_MODEL = 14,
GSK_SPV_OP_ENTRY_POINT = 15,
GSK_SPV_OP_EXECUTION_MODE = 16,
GSK_SPV_OP_CAPABILITY = 17,
GSK_SPV_OP_TYPE_VOID = 19,
GSK_SPV_OP_TYPE_BOOL = 20,
GSK_SPV_OP_TYPE_INT = 21,
GSK_SPV_OP_TYPE_FLOAT = 22,
GSK_SPV_OP_TYPE_VECTOR = 23,
GSK_SPV_OP_TYPE_MATRIX = 24,
GSK_SPV_OP_TYPE_IMAGE = 25,
GSK_SPV_OP_TYPE_SAMPLER = 26,
GSK_SPV_OP_TYPE_SAMPLED_IMAGE = 27,
GSK_SPV_OP_TYPE_ARRAY = 28,
GSK_SPV_OP_TYPE_RUNTIME_ARRAY = 29,
GSK_SPV_OP_TYPE_STRUCT = 30,
GSK_SPV_OP_TYPE_OPAQUE = 31,
GSK_SPV_OP_TYPE_POINTER = 32,
GSK_SPV_OP_TYPE_FUNCTION = 33,
GSK_SPV_OP_TYPE_EVENT = 34,
GSK_SPV_OP_TYPE_DEVICE_EVENT = 35,
GSK_SPV_OP_TYPE_RESERVE_ID = 36,
GSK_SPV_OP_TYPE_QUEUE = 37,
GSK_SPV_OP_TYPE_PIPE = 38,
GSK_SPV_OP_TYPE_FORWARD_POINTER = 39,
GSK_SPV_OP_CONSTANT_TRUE = 41,
GSK_SPV_OP_CONSTANT_FALSE = 42,
GSK_SPV_OP_CONSTANT = 43,
GSK_SPV_OP_CONSTANT_COMPOSITE = 44,
GSK_SPV_OP_CONSTANT_SAMPLER = 45,
GSK_SPV_OP_CONSTANT_NULL = 46,
GSK_SPV_OP_SPEC_CONSTANT_TRUE = 48,
GSK_SPV_OP_SPEC_CONSTANT_FALSE = 49,
GSK_SPV_OP_SPEC_CONSTANT = 50,
GSK_SPV_OP_SPEC_CONSTANT_COMPOSITE = 51,
GSK_SPV_OP_SPEC_CONSTANT_OP = 52,
GSK_SPV_OP_FUNCTION = 54,
GSK_SPV_OP_FUNCTION_PARAMETER = 55,
GSK_SPV_OP_FUNCTION_END = 56,
GSK_SPV_OP_FUNCTION_CALL = 57,
GSK_SPV_OP_VARIABLE = 59,
GSK_SPV_OP_IMAGE_TEXEL_POINTER = 60,
GSK_SPV_OP_LOAD = 61,
GSK_SPV_OP_STORE = 62,
GSK_SPV_OP_COPY_MEMORY = 63,
GSK_SPV_OP_COPY_MEMORY_SIZED = 64,
GSK_SPV_OP_ACCESS_CHAIN = 65,
GSK_SPV_OP_IN_BOUNDS_ACCESS_CHAIN = 66,
GSK_SPV_OP_PTR_ACCESS_CHAIN = 67,
GSK_SPV_OP_ARRAY_LENGTH = 68,
GSK_SPV_OP_GENERIC_PTR_MEM_SEMANTICS = 69,
GSK_SPV_OP_IN_BOUNDS_PTR_ACCESS_CHAIN = 70,
GSK_SPV_OP_DECORATE = 71,
GSK_SPV_OP_MEMBER_DECORATE = 72,
GSK_SPV_OP_DECORATION_GROUP = 73,
GSK_SPV_OP_GROUP_DECORATE = 74,
GSK_SPV_OP_GROUP_MEMBER_DECORATE = 75,
GSK_SPV_OP_VECTOR_EXTRACT_DYNAMIC = 77,
GSK_SPV_OP_VECTOR_INSERT_DYNAMIC = 78,
GSK_SPV_OP_VECTOR_SHUFFLE = 79,
GSK_SPV_OP_COMPOSITE_CONSTRUCT = 80,
GSK_SPV_OP_COMPOSITE_EXTRACT = 81,
GSK_SPV_OP_COMPOSITE_INSERT = 82,
GSK_SPV_OP_COPY_OBJECT = 83,
GSK_SPV_OP_TRANSPOSE = 84,
GSK_SPV_OP_CONVERT_F_TO_U = 109,
GSK_SPV_OP_CONVERT_F_TO_S = 110,
GSK_SPV_OP_CONVERT_S_TO_F = 111,
GSK_SPV_OP_CONVERT_U_TO_F = 112,
GSK_SPV_OP_U_CONVERT = 113,
GSK_SPV_OP_S_CONVERT = 114,
GSK_SPV_OP_F_CONVERT = 115,
GSK_SPV_OP_QUANTIZE_TO_F16 = 116,
GSK_SPV_OP_CONVERT_PTR_TO_U = 117,
GSK_SPV_OP_SAT_CONVERT_S_TO_U = 118,
GSK_SPV_OP_SAT_CONVERT_U_TO_S = 119,
GSK_SPV_OP_CONVERT_U_TO_PTR = 120,
GSK_SPV_OP_PTR_CAST_TO_GENERIC = 121,
GSK_SPV_OP_GENERIC_CAST_TO_PTR = 122,
GSK_SPV_OP_GENERIC_CAST_TO_PTR_EXPLICIT = 123,
GSK_SPV_OP_BITCAST = 124,
GSK_SPV_OP_S_NEGATE = 126,
GSK_SPV_OP_F_NEGATE = 127,
GSK_SPV_OP_I_ADD = 128,
GSK_SPV_OP_F_ADD = 129,
GSK_SPV_OP_I_SUB = 130,
GSK_SPV_OP_F_SUB = 131,
GSK_SPV_OP_I_MUL = 132,
GSK_SPV_OP_F_MUL = 133,
GSK_SPV_OP_U_DIV = 134,
GSK_SPV_OP_S_DIV = 135,
GSK_SPV_OP_F_DIV = 136,
GSK_SPV_OP_U_MOD = 137,
GSK_SPV_OP_S_REM = 138,
GSK_SPV_OP_S_MOD = 139,
GSK_SPV_OP_F_REM = 140,
GSK_SPV_OP_F_MOD = 141,
GSK_SPV_OP_VECTOR_TIMES_SCALAR = 142,
GSK_SPV_OP_MATRIX_TIMES_SCALAR = 143,
GSK_SPV_OP_VECTOR_TIMES_MATRIX = 144,
GSK_SPV_OP_MATRIX_TIMES_VECTOR = 145,
GSK_SPV_OP_MATRIX_TIMES_MATRIX = 146,
GSK_SPV_OP_OUTER_PRODUCT = 147,
GSK_SPV_OP_DOT = 148,
GSK_SPV_OP_I_ADD_CARRY = 149,
GSK_SPV_OP_I_SUB_BORROW = 150,
GSK_SPV_OP_U_MUL_EXTENDED = 151,
GSK_SPV_OP_S_MUL_EXTENDED = 152,
GSK_SPV_OP_ANY = 154,
GSK_SPV_OP_ALL = 155,
GSK_SPV_OP_IS_NAN = 156,
GSK_SPV_OP_IS_INF = 157,
GSK_SPV_OP_IS_FINITE = 158,
GSK_SPV_OP_IS_NORMAL = 159,
GSK_SPV_OP_SIGN_BIT_SET = 160,
GSK_SPV_OP_LESS_OR_GREATER = 161,
GSK_SPV_OP_ORDERED = 162,
GSK_SPV_OP_UNORDERED = 163,
GSK_SPV_OP_LOGICAL_EQUAL = 164,
GSK_SPV_OP_LOGICAL_NOT_EQUAL = 165,
GSK_SPV_OP_LOGICAL_OR = 166,
GSK_SPV_OP_LOGICAL_AND = 167,
GSK_SPV_OP_LOGICAL_NOT = 168,
GSK_SPV_OP_SELECT = 169,
GSK_SPV_OP_I_EQUAL = 170,
GSK_SPV_OP_I_NOT_EQUAL = 171,
GSK_SPV_OP_U_GREATER_THAN = 172,
GSK_SPV_OP_S_GREATER_THAN = 173,
GSK_SPV_OP_U_GREATER_THAN_EQUAL = 174,
GSK_SPV_OP_S_GREATER_THAN_EQUAL = 175,
GSK_SPV_OP_U_LESS_THAN = 176,
GSK_SPV_OP_S_LESS_THAN = 177,
GSK_SPV_OP_U_LESS_THAN_EQUAL = 178,
GSK_SPV_OP_S_LESS_THAN_EQUAL = 179,
GSK_SPV_OP_F_ORD_EQUAL = 180,
GSK_SPV_OP_F_UNORD_EQUAL = 181,
GSK_SPV_OP_F_ORD_NOT_EQUAL = 182,
GSK_SPV_OP_F_UNORD_NOT_EQUAL = 183,
GSK_SPV_OP_F_ORD_LESS_THAN = 184,
GSK_SPV_OP_F_UNORD_LESS_THAN = 185,
GSK_SPV_OP_F_ORD_GREATER_THAN = 186,
GSK_SPV_OP_F_UNORD_GREATER_THAN = 187,
GSK_SPV_OP_F_ORD_LESS_THAN_EQUAL = 188,
GSK_SPV_OP_F_UNORD_LESS_THAN_EQUAL = 189,
GSK_SPV_OP_F_ORD_GREATER_THAN_EQUAL = 190,
GSK_SPV_OP_F_UNORD_GREATER_THAN_EQUAL = 191,
GSK_SPV_OP_PHI = 245,
GSK_SPV_OP_LOOP_MERGE = 246,
GSK_SPV_OP_SELECTION_MERGE = 247,
GSK_SPV_OP_LABEL = 248,
GSK_SPV_OP_BRANCH = 249,
GSK_SPV_OP_BRANCH_CONDITIONAL = 250,
GSK_SPV_OP_SWITCH = 251,
GSK_SPV_OP_KILL = 252,
GSK_SPV_OP_RETURN = 253,
GSK_SPV_OP_RETURN_VALUE = 254,
GSK_SPV_OP_UNREACHABLE = 255,
GSK_SPV_OP_LIFETIME_START = 256,
GSK_SPV_OP_LIFETIME_STOP = 257,
GSK_SPV_OP_SIZE_OF = 321,
GSK_SPV_OP_TYPE_PIPE_STORAGE = 322,
GSK_SPV_OP_TYPE_NAMED_BARRIER = 327,
GSK_SPV_OP_DECORATE_ID = 332
} GskSpvOpcode;
typedef enum {
GSK_SPV_CAPABILITY_MATRIX = 0,
GSK_SPV_CAPABILITY_SHADER = 1
} GskSpvCapability;
typedef enum {
GSK_SPV_ADDRESSING_LOGICAL = 0,
GSK_SPV_ADDRESSING_PHYSICAL32 = 1,
GSK_SPV_ADDRESSING_PHYSICAL64 = 2,
} GskSpvAddressingModel;
typedef enum {
GSK_SPV_MEMORY_SIMPLE = 0,
GSK_SPV_MEMORY_GLSL450 = 1,
GSK_SPV_MEMORY_OPEN_CL = 2
} GskSpvMemoryModel;
typedef enum {
GSK_SPV_EXECUTION_MODEL_VERTEX = 0,
GSK_SPV_EXECUTION_MODEL_TESSELATION_CONTROL = 1,
GSK_SPV_EXECUTION_MODEL_TESSELATION_EVALUATION = 2,
GSK_SPV_EXECUTION_MODEL_GEOMETRY = 3,
GSK_SPV_EXECUTION_MODEL_FRAGMENT = 4,
GSK_SPV_EXECUTION_MODEL_GL_COMPUTE = 5,
GSK_SPV_EXECUTION_MODEL_KERNEL = 6,
} GskSpvExecutionModel;
typedef enum {
GSK_SPV_EXECUTION_MODE_ORIGIN_UPPER_LEFT = 7
} GskSpvExecutionMode;
typedef enum {
GSK_SPV_STORAGE_CLASS_UNIFORM_CONSTANT = 0,
GSK_SPV_STORAGE_CLASS_INPUT = 1,
GSK_SPV_STORAGE_CLASS_UNIFORM = 2,
GSK_SPV_STORAGE_CLASS_OUTPUT = 3,
GSK_SPV_STORAGE_CLASS_WORKGROUP = 4,
GSK_SPV_STORAGE_CLASS_CROSS_WORKGROUP = 5,
GSK_SPV_STORAGE_CLASS_PRIVATE = 6,
GSK_SPV_STORAGE_CLASS_FUNCTION = 7,
GSK_SPV_STORAGE_CLASS_GENERIC = 8,
GSK_SPV_STORAGE_CLASS_PUSH_CONSTANT = 9,
GSK_SPV_STORAGE_CLASS_ATOMIC_COUNTER = 10,
GSK_SPV_STORAGE_CLASS_IMAGE = 11,
GSK_SPV_STORAGE_CLASS_STORAGE_BUFFER = 12
} GskSpvStorageClass;
typedef enum {
GSK_SPV_DECORATION_RELAXED_PRECISION = 0,
GSK_SPV_DECORATION_SPEC_ID = 1,
GSK_SPV_DECORATION_BLOCK = 2,
GSK_SPV_DECORATION_BUFFER_BLOCK = 3,
GSK_SPV_DECORATION_ROW_MAJOR = 4,
GSK_SPV_DECORATION_COLUMN_MAJOR = 5,
GSK_SPV_DECORATION_ARRAY_STRIDE = 6,
GSK_SPV_DECORATION_MATRIX_STRIDE = 7,
GSK_SPV_DECORATION_GLSL_SHARED = 8,
GSK_SPV_DECORATION_GLSL_PACKED = 9,
GSK_SPV_DECORATION_C_PACKED = 10,
GSK_SPV_DECORATION_BUILTIN = 11,
GSK_SPV_DECORATION_NO_PERSPECTIVE = 13,
GSK_SPV_DECORATION_FLAT = 14,
GSK_SPV_DECORATION_PATCH = 15,
GSK_SPV_DECORATION_CENTROID = 16,
GSK_SPV_DECORATION_SAMPLE = 17,
GSK_SPV_DECORATION_INVARIANT = 18,
GSK_SPV_DECORATION_RESTRICT = 19,
GSK_SPV_DECORATION_ALIASED = 20
} GskSpvDecoration;
typedef enum {
GSK_SPV_WRITER_SECTION_HEADER,
GSK_SPV_WRITER_SECTION_DEBUG,
GSK_SPV_WRITER_SECTION_DECORATE,
GSK_SPV_WRITER_SECTION_DEFINE,
GSK_SPV_WRITER_SECTION_DECLARE,
GSK_SPV_WRITER_SECTION_CODE,
/* add more */
@@ -309,18 +64,17 @@ guint32 gsk_spv_writer_get_id_for_one (GskSpvWriter
guint32 gsk_spv_writer_get_id_for_variable (GskSpvWriter *writer,
GskSlVariable *variable);
guint32 gsk_spv_writer_next_id (GskSpvWriter *writer);
void gsk_spv_writer_add (GskSpvWriter *writer,
GskSpvWriterSection section,
guint16 word_count,
guint16 opcode,
guint32 *words);
guint32 gsk_spv_writer_make_id (GskSpvWriter *writer);
GArray * gsk_spv_writer_get_bytes (GskSpvWriter *writer,
GskSpvWriterSection section);
guint32 gsk_spv_writer_add_conversion (GskSpvWriter *writer,
guint32 gsk_spv_writer_convert (GskSpvWriter *writer,
guint32 id,
GskSlType *type,
GskSlType *new_type);
#include "gskspvwritergeneratedprivate.h"
G_END_DECLS
#endif /* __GSK_SPV_WRITER_PRIVATE_H__ */

View File

@@ -62,6 +62,11 @@ gsk_public_headers = files([
'gsktypes.h',
])
gsk_private_headers = files([
'gskspvenumsprivate.h',
'gskspvwritergeneratedprivate.h'
])
install_headers(gsk_public_headers, 'gsk.h', subdir: 'gtk-4.0/gsk')
gsk_private_vulkan_shaders = []

5630
gsk/spirv.core.grammar.json Normal file

File diff suppressed because it is too large Load Diff

715
gsk/spirv.js Normal file
View File

@@ -0,0 +1,715 @@
function usage()
{
print ("usage: gjs spirv.js enums|functions SPIRV_GRAMMAR_FILE");
}
if (ARGV.length != 2)
{
usage();
throw new SyntaxError ("Script needs 2 arguments but got " + ARGV.length);
}
var contents = imports.gi.Gio.File.new_for_path(ARGV[1]).load_contents(null);
var spirv = JSON.parse(contents[1]);
if (!String.prototype.format) {
String.prototype.format = function() {
var args = arguments;
return this.replace(/{(\d+)}/g, function(match, number) {
return typeof args[number] != 'undefined'
? args[number]
: match
;
});
};
}
function all_lower(s)
{
let result = "";
let needs_underscore = false;
let had_caps = false;
for (let i = 0; i < s.length; i++)
{
if (s[i] >= 'a' && s[i] <= 'z')
{
needs_underscore = true;
had_caps = false;
result += s[i];
}
else if (s[i] >= "A" && s[i] <= "Z")
{
if (needs_underscore)
result += "_";
else if (s[i+1] && s[i+1] >= "a" && s[i+1] <= "z" && had_caps)
result += "_";
needs_underscore = false;
had_caps = true;
result += s[i].toLowerCase();
}
else if (s[i] >= '0' && s[i] <= '9')
{
needs_underscore = true
had_caps = false;
result += s[i]
}
else
{
needs_underscore = false
had_caps = false;
result += "_";
}
}
return result;
}
function all_upper(s)
{
return all_lower(s).toUpperCase();
}
function sanitize_name (name)
{
name = name.substr(1);
return all_lower(name.substr(0, name.indexOf("'")));
}
var SpecialTypes = {
"OpVariable": { "result_type": "IdResultPointerType" },
"OpImageTexelPointer": { "result_type": "IdResultPointerType" },
"OpAccessChain": { "result_type": "IdResultPointerType" },
"OpInBoundsAccessChain": { "result_type": "IdResultPointerType" },
"OpConvertUToPtr": { "result_type": "IdResultPointerType" },
"OpPtrCastToGeneric": { "result_type": "IdResultPointerType" },
"OpGenericCastToPtr": { "result_type": "IdResultPointerType" },
"OpGenericCastToPtrExplicit": { "result_type": "IdResultPointerType" }
};
/* maps opcodes to section in file they appear in */
var Sections = {
"OpNop": "",
"OpUndef": "",
"OpSourceContinued": "",
"OpSource": "debug",
"OpSourceExtension": "debug",
"OpName": "debug",
"OpMemberName": "debug",
"OpString": "",
"OpLine": "",
"OpExtension": "header",
"OpExtInstImport": "header",
"OpExtInst": "",
"OpMemoryModel": "header",
"OpEntryPoint": "header",
"OpExecutionMode": "header",
"OpCapability": "header",
"OpTypeVoid": "define",
"OpTypeBool": "define",
"OpTypeInt": "define",
"OpTypeFloat": "define",
"OpTypeVector": "define",
"OpTypeMatrix": "define",
"OpTypeImage": "define",
"OpTypeSampler": "define",
"OpTypeSampledImage": "define",
"OpTypeArray": "define",
"OpTypeRuntimeArray": "define",
"OpTypeStruct": "define",
"OpTypeOpaque": "define",
"OpTypePointer": "define",
"OpTypeFunction": "define",
"OpTypeEvent": "define",
"OpTypeDeviceEvent": "define",
"OpTypeReserveId": "define",
"OpTypeQueue": "define",
"OpTypePipe": "define",
"OpTypeForwardPointer": "define",
"OpConstantTrue": "define",
"OpConstantFalse": "define",
"OpConstant": "define",
"OpConstantComposite": "define",
"OpConstantSampler": "define",
"OpConstantNull": "define",
"OpSpecConstantTrue": "define",
"OpSpecConstantFalse": "define",
"OpSpecConstant": "define",
"OpSpecConstantComposite": "define",
"OpSpecConstantOp": "define",
"OpFunction": "declare",
"OpFunctionParameter": "declare",
"OpFunctionEnd": "code",
"OpFunctionCall": "code",
"OpVariable": "declare",
"OpImageTexelPointer": "code",
"OpLoad": "code",
"OpStore": "code",
"OpCopyMemory": "code",
"OpCopyMemorySized": "code",
"OpAccessChain": "code",
"OpInBoundsAccessChain": "code",
"OpPtrAccessChain": "code",
"OpArrayLength": "code",
"OpGenericPtrMemSemantics": "",
"OpInBoundsPtrAccessChain": "code",
"OpDecorate": "decorate",
"OpMemberDecorate": "decorate",
"OpDecorationGroup": "decorate",
"OpGroupDecorate": "decorate",
"OpGroupMemberDecorate": "decorate",
"OpVectorExtractDynamic": "code",
"OpVectorInsertDynamic": "code",
"OpVectorShuffle": "code",
"OpCompositeConstruct": "code",
"OpCompositeExtract": "code",
"OpCompositeInsert": "code",
"OpCopyObject": "",
"OpTranspose": "code",
"OpSampledImage": "",
"OpImageSampleImplicitLod": "code",
"OpImageSampleExplicitLod": "code",
"OpImageSampleDrefImplicitLod": "code",
"OpImageSampleDrefExplicitLod": "code",
"OpImageSampleProjImplicitLod": "code",
"OpImageSampleProjExplicitLod": "code",
"OpImageSampleProjDrefImplicitLod": "code",
"OpImageSampleProjDrefExplicitLod": "code",
"OpImageFetch": "code",
"OpImageGather": "code",
"OpImageDrefGather": "code",
"OpImageRead": "code",
"OpImageWrite": "code",
"OpImage": "code",
"OpImageQueryFormat": "code",
"OpImageQueryOrder": "code",
"OpImageQuerySizeLod": "code",
"OpImageQuerySize": "code",
"OpImageQueryLod": "code",
"OpImageQueryLevels": "code",
"OpImageQuerySamples": "code",
"OpConvertFToU": "code",
"OpConvertFToS": "code",
"OpConvertSToF": "code",
"OpConvertUToF": "code",
"OpUConvert": "code",
"OpSConvert": "code",
"OpFConvert": "code",
"OpQuantizeToF16": "code",
"OpConvertPtrToU": "code",
"OpSatConvertSToU": "code",
"OpSatConvertUToS": "code",
"OpConvertUToPtr": "code",
"OpPtrCastToGeneric": "code",
"OpGenericCastToPtr": "code",
"OpGenericCastToPtrExplicit": "code",
"OpBitcast": "code",
"OpSNegate": "code",
"OpFNegate": "code",
"OpIAdd": "code",
"OpFAdd": "code",
"OpISub": "code",
"OpFSub": "code",
"OpIMul": "code",
"OpFMul": "code",
"OpUDiv": "code",
"OpSDiv": "code",
"OpFDiv": "code",
"OpUMod": "code",
"OpSRem": "code",
"OpSMod": "code",
"OpFRem": "code",
"OpFMod": "code",
"OpVectorTimesScalar": "code",
"OpMatrixTimesScalar": "code",
"OpVectorTimesMatrix": "code",
"OpMatrixTimesVector": "code",
"OpMatrixTimesMatrix": "code",
"OpOuterProduct": "code",
"OpDot": "code",
"OpIAddCarry": "code",
"OpISubBorrow": "code",
"OpUMulExtended": "code",
"OpSMulExtended": "code",
"OpAny": "code",
"OpAll": "code",
"OpIsNan": "code",
"OpIsInf": "code",
"OpIsFinite": "code",
"OpIsNormal": "code",
"OpSignBitSet": "code",
"OpLessOrGreater": "code",
"OpOrdered": "code",
"OpUnordered": "code",
"OpLogicalEqual": "code",
"OpLogicalNotEqual": "code",
"OpLogicalOr": "code",
"OpLogicalAnd": "code",
"OpLogicalNot": "code",
"OpSelect": "code",
"OpIEqual": "code",
"OpINotEqual": "code",
"OpUGreaterThan": "code",
"OpSGreaterThan": "code",
"OpUGreaterThanEqual": "code",
"OpSGreaterThanEqual": "code",
"OpULessThan": "code",
"OpSLessThan": "code",
"OpULessThanEqual": "code",
"OpSLessThanEqual": "code",
"OpFOrdEqual": "code",
"OpFUnordEqual": "code",
"OpFOrdNotEqual": "code",
"OpFUnordNotEqual": "code",
"OpFOrdLessThan": "code",
"OpFUnordLessThan": "code",
"OpFOrdGreaterThan": "code",
"OpFUnordGreaterThan": "code",
"OpFOrdLessThanEqual": "code",
"OpFUnordLessThanEqual": "code",
"OpFOrdGreaterThanEqual": "code",
"OpFUnordGreaterThanEqual": "code",
"OpShiftRightLogical": "code",
"OpShiftRightArithmetic": "code",
"OpShiftLeftLogical": "code",
"OpBitwiseOr": "code",
"OpBitwiseXor": "code",
"OpBitwiseAnd": "code",
"OpNot": "code",
"OpBitFieldInsert": "code",
"OpBitFieldSExtract": "code",
"OpBitFieldUExtract": "code",
"OpBitReverse": "code",
"OpBitCount": "code",
"OpDPdx": "code",
"OpDPdy": "code",
"OpFwidth": "code",
"OpDPdxFine": "code",
"OpDPdyFine": "code",
"OpFwidthFine": "code",
"OpDPdxCoarse": "code",
"OpDPdyCoarse": "code",
"OpFwidthCoarse": "code",
"OpEmitVertex": "code",
"OpEndPrimitive": "code",
"OpEmitStreamVertex": "code",
"OpEndStreamPrimitive": "code",
"OpControlBarrier": "code",
"OpMemoryBarrier": "code",
"OpAtomicLoad": "code",
"OpAtomicStore": "code",
"OpAtomicExchange": "code",
"OpAtomicCompareExchange": "code",
"OpAtomicCompareExchangeWeak": "code",
"OpAtomicIIncrement": "code",
"OpAtomicIDecrement": "code",
"OpAtomicIAdd": "code",
"OpAtomicISub": "code",
"OpAtomicSMin": "code",
"OpAtomicUMin": "code",
"OpAtomicSMax": "code",
"OpAtomicUMax": "code",
"OpAtomicAnd": "code",
"OpAtomicOr": "code",
"OpAtomicXor": "code",
"OpPhi": "code",
"OpLoopMerge": "code",
"OpSelectionMerge": "code",
"OpLabel": "code",
"OpBranch": "code",
"OpBranchConditional": "code",
"OpSwitch": "code",
"OpKill": "code",
"OpReturn": "code",
"OpReturnValue": "code",
"OpUnreachable": "",
"OpLifetimeStart": "",
"OpLifetimeStop": "",
"OpGroupAsyncCopy": "",
"OpGroupWaitEvents": "",
"OpGroupAll": "",
"OpGroupAny": "",
"OpGroupBroadcast": "",
"OpGroupIAdd": "",
"OpGroupFAdd": "",
"OpGroupFMin": "",
"OpGroupUMin": "",
"OpGroupSMin": "",
"OpGroupFMax": "",
"OpGroupUMax": "",
"OpGroupSMax": "",
"OpReadPipe": "",
"OpWritePipe": "",
"OpReservedReadPipe": "",
"OpReservedWritePipe": "",
"OpReserveReadPipePackets": "",
"OpReserveWritePipePackets": "",
"OpCommitReadPipe": "",
"OpCommitWritePipe": "",
"OpIsValidReserveId": "",
"OpGetNumPipePackets": "",
"OpGetMaxPipePackets": "",
"OpGroupReserveReadPipePackets": "",
"OpGroupReserveWritePipePackets": "",
"OpGroupCommitReadPipe": "",
"OpGroupCommitWritePipe": "",
"OpEnqueueMarker": "",
"OpEnqueueKernel": "",
"OpGetKernelNDrangeSubGroupCount": "",
"OpGetKernelNDrangeMaxSubGroupSize": "",
"OpGetKernelWorkGroupSize": "",
"OpGetKernelPreferredWorkGroupSizeMultiple": "",
"OpRetainEvent": "",
"OpReleaseEvent": "",
"OpCreateUserEvent": "",
"OpIsValidEvent": "",
"OpSetUserEventStatus": "",
"OpCaptureEventProfilingInfo": "",
"OpGetDefaultQueue": "",
"OpBuildNDRange": "",
"OpImageSparseSampleImplicitLod": "",
"OpImageSparseSampleExplicitLod": "",
"OpImageSparseSampleDrefImplicitLod": "",
"OpImageSparseSampleDrefExplicitLod": "",
"OpImageSparseSampleProjImplicitLod": "",
"OpImageSparseSampleProjExplicitLod": "",
"OpImageSparseSampleProjDrefImplicitLod": "",
"OpImageSparseSampleProjDrefExplicitLod": "",
"OpImageSparseFetch": "",
"OpImageSparseGather": "",
"OpImageSparseDrefGather": "",
"OpImageSparseTexelsResident": "",
"OpNoLine": "",
"OpAtomicFlagTestAndSet": "",
"OpAtomicFlagClear": "",
"OpImageSparseRead": "",
"OpSubgroupBallotKHR": "",
"OpSubgroupFirstInvocationKHR": "",
"OpSubgroupAllKHR": "",
"OpSubgroupAnyKHR": "",
"OpSubgroupAllEqualKHR": "",
"OpSubgroupReadInvocationKHR": "",
"OpGroupIAddNonUniformAMD": "",
"OpGroupFAddNonUniformAMD": "",
"OpGroupFMinNonUniformAMD": "",
"OpGroupUMinNonUniformAMD": "",
"OpGroupSMinNonUniformAMD": "",
"OpGroupFMaxNonUniformAMD": "",
"OpGroupUMaxNonUniformAMD": "",
"OpGroupSMaxNonUniformAMD": "",
"OpFragmentMaskFetchAMD": "",
"OpFragmentFetchAMD": ""
};
var Operands = {
"IdMemorySemantics": { ctype: "guint32", ctype_suffix: "",
optional_unset: "0",
append_many: "g_array_append_vals ({0}, {1}, {2})",
append_one: "g_array_append_val ({0}, {1})" },
"IdRef": { ctype: "guint32", ctype_suffix: "",
optional_unset: "0",
append_many: "g_array_append_vals ({0}, {1}, {2})",
append_one: "g_array_append_val ({0}, {1})" },
"IdResult": { ctype: "guint32", ctype_suffix: "",
optional_unset: "0",
declare_local: "guint32 {0}_id = gsk_spv_writer_make_id (writer);",
append_one: "g_array_append_val ({0}, {1}_id)" },
"IdResultType": { ctype: "GskSlType *", ctype_suffix: "",
optional_unset: "NULL",
declare_local: "guint32 {0}_id = gsk_spv_writer_get_id_for_type (writer, {0});",
append_one: "g_array_append_val ({0}, {1}_id)" },
"IdResultPointerType" : { ctype: "GskSlPointerType *", ctype_suffix: "",
optional_unset: "NULL",
declare_local: "guint32 {0}_id = gsk_spv_writer_get_id_for_pointer_type (writer, {0});",
append_one: "g_array_append_val ({0}, {1}_id)" },
"IdScope": { ctype: "guint32", ctype_suffix: "",
optional_unset: "0",
append_many: "g_array_append_vals ({0}, {1}, {2})",
append_one: "g_array_append_val ({0}, {1})" },
"LiteralContextDependentNumber": { ctype: "guint32", ctype_suffix: "",
is_many: true,
append_many: "g_array_append_vals ({0}, {1}, {2})" },
"LiteralExtInstInteger": { ctype: "guint32", ctype_suffix: "",
append_many: "g_array_append_vals ({0}, {1}, {2})",
append_one: "g_array_append_val ({0}, {1})" },
"LiteralInteger": { ctype: "guint32", ctype_suffix: "",
append_many: "g_array_append_vals ({0}, {1}, {2})",
append_one: "g_array_append_val ({0}, {1})" },
"LiteralString": { ctype: "const char *", ctype_suffix: "",
optional_unset: "NULL",
append_one: "append_string ({0}, {1})" },
"LiteralSpecConstantOpInteger": { ctype: "guint32", ctype_suffix: "",
is_many: true,
append_many: "g_array_append_vals ({0}, {1}, {2})" },
"PairIdRefLiteralInteger": { ctype: "guint32", ctype_suffix: "[2]",
append_many: "g_array_append_vals ({0}, {1}, 2 * {2})",
append_one: "g_array_append_vals ({0}, {1}, 2)" },
"PairIdRefIdRef": { ctype: "guint32", ctype_suffix: "[2]",
append_many: "g_array_append_vals ({0}, {1}, 2 * {2})",
append_one: "g_array_append_vals ({0}, {1}, 2)" },
"PairLiteralIntegerIdRef": { ctype: "guint32", ctype_suffix: "[2]",
append_many: "g_array_append_vals ({0}, {1}, 2 * {2})",
append_one: "g_array_append_vals ({0}, {1}, 2)" }
};
for (let kind in spirv.operand_kinds)
{
kind = spirv.operand_kinds[kind];
if (kind.category == "BitEnum" ||
kind.category == "ValueEnum")
{
Operands[kind.kind] = { ctype: "GskSpv" + kind.kind, ctype_suffix: "",
append_one: "g_array_append_val ({0}, (guint32) { {1} })" };
if (kind.category == "BitEnum")
Operands[kind.kind].optional_unset = "0";
}
}
function fix_operand (ins, o)
{
if (o.name)
{
if (o.name == "The name of the opaque type.")
o.varname = "name"
else
o.varname = sanitize_name (o.name);
}
else
{
if (o.kind == "IdResultType")
o.varname = "result_type"
else if (o.kind == "IdResult")
o.varname = "result"
else if (Operands[o.kind])
o.varname = all_lower (o.kind);
}
if (!o.varname)
throw new TypeError (o.name + " of type " + o.kind + " has no variable name");
if (o.varname == "default")
o.varname += "_";
if (o.kind == "IdResult")
ins.result = true;
let operand;
if (SpecialTypes[ins.opname] &&
SpecialTypes[ins.opname][o.varname])
operand = Operands[SpecialTypes[ins.opname][o.varname]];
else
operand = Operands[o.kind];
o.ctype = operand.ctype;
o.ctype_suffix = operand.ctype_suffix;
if (operand.append_one)
o.append_one = operand.append_one;
if (operand.append_many)
o.append_many = operand.append_many;
if (operand.declare_local)
o.declare_local = operand.declare_local;
if (operand.is_many)
{
if (o.quantifier)
throw new SyntaxError ("Can't deal with lists of " + o.kind);
else
o.quantifier = "*";
}
if (!o.quantifier)
o.quantifier = "";
if (o.quantifier == "?")
{
o.varname = "opt_" + o.varname;
if (operand.optional_unset)
o.unset = operand.optional_unset;
}
if (o.quantifier == "*")
{
if (o.varname[o.varname.length - 1] == "1")
o.varname = o.varname.substr(0, o.varname.length - 2);
if (o.varname[o.varname.length - 1] != "s")
o.varname += "s";
}
}
for (let i in spirv.instructions)
{
let ins = spirv.instructions[i];
ins.result = false;
ins.enum_value = "GSK_SPV_OP_" + all_upper (ins.opname.substr(2));
if (ins.operands)
{
for (let o in ins.operands)
{
o = ins.operands[o];
fix_operand (ins, o);
}
}
else
ins.operands = [];
if (Sections[ins.opname])
{
ins.section = Sections[ins.opname];
ins.section_enum = "GSK_SPV_WRITER_SECTION_" + ins.section.toUpperCase();
}
}
function header()
{
print ("/* GTK - The GIMP Toolkit");
print (" * ");
print (" * Copyright © 2017 Benjamin Otte <otte@gnome.org>");
print (" *");
print (" * This library is free software; you can redistribute it and/or");
print (" * modify it under the terms of the GNU Lesser General Public");
print (" * License as published by the Free Software Foundation; either");
print (" * version 2 of the License, or (at your option) any later version.");
print (" *");
print (" * This library is distributed in the hope that it will be useful,");
print (" * but WITHOUT ANY WARRANTY; without even the implied warranty of");
print (" * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU");
print (" * Lesser General Public License for more details.");
print (" *");
print (" * You should have received a copy of the GNU Lesser General Public");
print (" * License along with this library. If not, see <http://www.gnu.org/licenses/>.");
print (" */");
print ("");
print ("/*");
print (" * !!! THIS FILE WAS AUTOGENERATED !!!");
print (" * ");
print (" * This file was created using the command");
print (" * gjs spirv.js " + ARGV.join (" "));
print (" * Apply any changes to those files and then regenerate using above command.");
print (" */");
print ();
}
if (ARGV[0] == "enums")
{
header ();
print ("#ifndef __GSK_SPV_ENUMS_H__");
print ("#define __GSK_SPV_ENUMS_H__");
print ();
for (let kind in spirv.operand_kinds)
{
kind = spirv.operand_kinds[kind];
if (kind.category == "BitEnum" ||
kind.category == "ValueEnum")
{
print ("typedef enum {");
for (let i = 0; i < kind.enumerants.length; i++)
{
let e = kind.enumerants[i];
//print (Object.keys(e));
print (" GSK_SPV_" + all_upper(kind.kind) + "_" + all_upper (e.enumerant) + " = " + e.value + (i + 1 < kind.enumerants.length ? "," : ""));
}
print ("} GskSpv" + kind.kind + ";");
print ();
}
}
print ("typedef enum {");
for (let i =0; i < spirv.instructions.length; i++)
{
let ins = spirv.instructions[i];
print (" " + ins.enum_value + " = " + ins.opcode + (i + 1 < spirv.instructions.length ? "," : ""));
}
print ("} GskSpvOpcode;");
print ();
print ("#endif /* __GSK_SPV_ENUMS_H__ */");
}
else if (ARGV[0] == "functions")
{
header ();
print ("#include <string.h>");
print ();
print ("static inline void");
print ("append_string (GArray *bytes,");
print (" const char *str)");
print ("{");
print (" gsize len = strlen (str);");
print (" guint size = bytes->len;");
print (" g_array_set_size (bytes, size + len / 4 + 1);");
print (" memcpy (&g_array_index (bytes, guint32, size), str, len);");
print ("}");
print ();
for (let i in spirv.instructions)
{
let ins = spirv.instructions[i];
let prefix = "gsk_spv_writer_" + all_lower(ins.opname.substr(2)) + " (";
let len = prefix.length;
if (ins.result)
print ("static inline guint32");
else
print ("static inline void");
if (ins.operands.length > 1 ||
ins.operands.length == 1 && !ins.result)
{
let seen_result = !ins.result;
print (prefix + "GskSpvWriter *writer,");
if (!ins.section)
print (Array(len+1).join(" ") + "GskSpvWriterSection section,");
for (let i = 0; i < ins.operands.length; i++)
{
let o = ins.operands[i];
if (o.kind == "IdResult")
{
seen_result = true;
continue;
}
if (o.quantifier == "*")
{
print (Array(len+1).join(" ") + o.ctype + " *" + o.varname + o.ctype_suffix + ",")
print (Array(len+1).join(" ") + "gsize n_" + o.varname + (i + 2 - seen_result < ins.operands.length ? "," : ")"));
}
else
{
print (Array(len+1).join(" ") + o.ctype + " " + o.varname + o.ctype_suffix + (i + 2 - seen_result < ins.operands.length ? "," : ")"));
}
}
}
else
{
if (ins.section)
print ("gsk_spv_writer_" + all_lower(ins.opname.substr(2)) + " (GskSpvWriter *writer)");
else
{
print ("gsk_spv_writer_" + all_lower(ins.opname.substr(2)) + " (GskSpvWriter *writer,");
print (Array(len+1).join(" ") + "GskSpvWriterSection section)");
}
}
print ("{");
print (" GArray *bytes = gsk_spv_writer_get_bytes (writer, " + (ins.section_enum ? ins.section_enum : "section" ) + ");");
for (let i = 0; i < ins.operands.length; i++)
{
let o = ins.operands[i];
if (o.declare_local)
print (" " + o.declare_local.format (o.varname));
}
print (" guint start_index = bytes->len;");
print ("");
print (" g_array_append_val (bytes, (guint32) { 0 });");
for (let i = 0; i < ins.operands.length; i++)
{
let o = ins.operands[i];
let indent = " ";
if (o.unset)
{
print (indent + "if (" + o.varname + " != " + o.unset + ")");
indent += " ";
}
if (o.quantifier == "*")
print (indent + o.append_many.format ("bytes", o.varname, "n_" + o.varname) + ";");
else
print (indent + o.append_one.format ("bytes", o.varname) + ";");
}
print (" g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | " + ins.enum_value + ";");
if (ins.result)
{
print ("");
print (" return result_id;");
}
print ("}");
print ("");
}
}
else
{
usage ()
}