summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2017-10-16 02:44:09 +0200
committerBenjamin Otte <otte@redhat.com>2017-10-30 02:58:03 +0100
commitfd83132d76429d6ad1d1f3931395300561d49da7 (patch)
tree053764988c1ab5b43387e3e3290e57ffbaec6a89
parentfde721eda810dee2b08ae6251c11388a17d2a41f (diff)
downloadgtk+-fd83132d76429d6ad1d1f3931395300561d49da7.tar.gz
gskspv: Generate code for the extended instructions
This way, we can use the same approach to emit code for built-in functions that we use for the rest of SPIRV emission.
-rw-r--r--gsk/extinst.glsl.std.450.grammar.json642
-rw-r--r--gsk/gskspvenumsglslprivate.h114
-rw-r--r--gsk/gskspvwriter.c12
-rw-r--r--gsk/gskspvwritergeneratedglslprivate.h1820
-rw-r--r--gsk/gskspvwritergeneratedprivate.h3
-rw-r--r--gsk/gskspvwriterprivate.h4
-rw-r--r--gsk/spirv.js54
7 files changed, 2635 insertions, 14 deletions
diff --git a/gsk/extinst.glsl.std.450.grammar.json b/gsk/extinst.glsl.std.450.grammar.json
new file mode 100644
index 0000000000..3d9f39e76c
--- /dev/null
+++ b/gsk/extinst.glsl.std.450.grammar.json
@@ -0,0 +1,642 @@
+{
+ "copyright" : [
+ "Copyright (c) 2014-2016 The Khronos Group Inc.",
+ "",
+ "Permission is hereby granted, free of charge, to any person obtaining a copy",
+ "of this software and/or associated documentation files (the \"Materials\"),",
+ "to deal in the Materials without restriction, including without limitation",
+ "the rights to use, copy, modify, merge, publish, distribute, sublicense,",
+ "and/or sell copies of the Materials, and to permit persons to whom the",
+ "Materials are furnished to do so, subject to the following conditions:",
+ "",
+ "The above copyright notice and this permission notice shall be included in",
+ "all copies or substantial portions of the Materials.",
+ "",
+ "MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS",
+ "STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND",
+ "HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ ",
+ "",
+ "THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS",
+ "OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,",
+ "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL",
+ "THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER",
+ "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING",
+ "FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS",
+ "IN THE MATERIALS."
+ ],
+ "version" : 100,
+ "revision" : 2,
+ "instructions" : [
+ {
+ "opname" : "Round",
+ "opcode" : 1,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "RoundEven",
+ "opcode" : 2,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Trunc",
+ "opcode" : 3,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "FAbs",
+ "opcode" : 4,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "SAbs",
+ "opcode" : 5,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "FSign",
+ "opcode" : 6,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "SSign",
+ "opcode" : 7,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Floor",
+ "opcode" : 8,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Ceil",
+ "opcode" : 9,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Fract",
+ "opcode" : 10,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Radians",
+ "opcode" : 11,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'degrees'" }
+ ]
+ },
+ {
+ "opname" : "Degrees",
+ "opcode" : 12,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'radians'" }
+ ]
+ },
+ {
+ "opname" : "Sin",
+ "opcode" : 13,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Cos",
+ "opcode" : 14,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Tan",
+ "opcode" : 15,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Asin",
+ "opcode" : 16,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Acos",
+ "opcode" : 17,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Atan",
+ "opcode" : 18,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'y_over_x'" }
+ ]
+ },
+ {
+ "opname" : "Sinh",
+ "opcode" : 19,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Cosh",
+ "opcode" : 20,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Tanh",
+ "opcode" : 21,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Asinh",
+ "opcode" : 22,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Acosh",
+ "opcode" : 23,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Atanh",
+ "opcode" : 24,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Atan2",
+ "opcode" : 25,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'y'" },
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Pow",
+ "opcode" : 26,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'y'" }
+ ]
+ },
+ {
+ "opname" : "Exp",
+ "opcode" : 27,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Log",
+ "opcode" : 28,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Exp2",
+ "opcode" : 29,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Log2",
+ "opcode" : 30,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Sqrt",
+ "opcode" : 31,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "InverseSqrt",
+ "opcode" : 32,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Determinant",
+ "opcode" : 33,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "MatrixInverse",
+ "opcode" : 34,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Modf",
+ "opcode" : 35,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'i'" }
+ ]
+ },
+ {
+ "opname" : "ModfStruct",
+ "opcode" : 36,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "FMin",
+ "opcode" : 37,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'y'" }
+ ]
+ },
+ {
+ "opname" : "UMin",
+ "opcode" : 38,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'y'" }
+ ]
+ },
+ {
+ "opname" : "SMin",
+ "opcode" : 39,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'y'" }
+ ]
+ },
+ {
+ "opname" : "FMax",
+ "opcode" : 40,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'y'" }
+ ]
+ },
+ {
+ "opname" : "UMax",
+ "opcode" : 41,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'y'" }
+ ]
+ },
+ {
+ "opname" : "SMax",
+ "opcode" : 42,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'y'" }
+ ]
+ },
+ {
+ "opname" : "FClamp",
+ "opcode" : 43,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'minVal'" },
+ { "kind" : "IdRef", "name" : "'maxVal'" }
+ ]
+ },
+ {
+ "opname" : "UClamp",
+ "opcode" : 44,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'minVal'" },
+ { "kind" : "IdRef", "name" : "'maxVal'" }
+ ]
+ },
+ {
+ "opname" : "SClamp",
+ "opcode" : 45,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'minVal'" },
+ { "kind" : "IdRef", "name" : "'maxVal'" }
+ ]
+ },
+ {
+ "opname" : "FMix",
+ "opcode" : 46,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'y'" },
+ { "kind" : "IdRef", "name" : "'a'" }
+ ]
+ },
+ {
+ "opname" : "IMix",
+ "opcode" : 47,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'y'" },
+ { "kind" : "IdRef", "name" : "'a'" }
+ ]
+ },
+ {
+ "opname" : "Step",
+ "opcode" : 48,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'edge'" },
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "SmoothStep",
+ "opcode" : 49,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'edge0'" },
+ { "kind" : "IdRef", "name" : "'edge1'" },
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Fma",
+ "opcode" : 50,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'a'" },
+ { "kind" : "IdRef", "name" : "'b'" },
+ { "kind" : "IdRef", "name" : "'c'" }
+ ]
+ },
+ {
+ "opname" : "Frexp",
+ "opcode" : 51,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'exp'" }
+ ]
+ },
+ {
+ "opname" : "FrexpStruct",
+ "opcode" : 52,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Ldexp",
+ "opcode" : 53,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'exp'" }
+ ]
+ },
+ {
+ "opname" : "PackSnorm4x8",
+ "opcode" : 54,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'v'" }
+ ]
+ },
+ {
+ "opname" : "PackUnorm4x8",
+ "opcode" : 55,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'v'" }
+ ]
+ },
+ {
+ "opname" : "PackSnorm2x16",
+ "opcode" : 56,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'v'" }
+ ]
+ },
+ {
+ "opname" : "PackUnorm2x16",
+ "opcode" : 57,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'v'" }
+ ]
+ },
+ {
+ "opname" : "PackHalf2x16",
+ "opcode" : 58,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'v'" }
+ ]
+ },
+ {
+ "opname" : "PackDouble2x32",
+ "opcode" : 59,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'v'" }
+ ],
+ "capabilities" : [ "Float64" ]
+ },
+ {
+ "opname" : "UnpackSnorm2x16",
+ "opcode" : 60,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'p'" }
+ ]
+ },
+ {
+ "opname" : "UnpackUnorm2x16",
+ "opcode" : 61,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'p'" }
+ ]
+ },
+ {
+ "opname" : "UnpackHalf2x16",
+ "opcode" : 62,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'v'" }
+ ]
+ },
+ {
+ "opname" : "UnpackSnorm4x8",
+ "opcode" : 63,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'p'" }
+ ]
+ },
+ {
+ "opname" : "UnpackUnorm4x8",
+ "opcode" : 64,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'p'" }
+ ]
+ },
+ {
+ "opname" : "UnpackDouble2x32",
+ "opcode" : 65,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'v'" }
+ ],
+ "capabilities" : [ "Float64" ]
+ },
+ {
+ "opname" : "Length",
+ "opcode" : 66,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "Distance",
+ "opcode" : 67,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'p0'" },
+ { "kind" : "IdRef", "name" : "'p1'" }
+ ]
+ },
+ {
+ "opname" : "Cross",
+ "opcode" : 68,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'y'" }
+ ]
+ },
+ {
+ "opname" : "Normalize",
+ "opcode" : 69,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" }
+ ]
+ },
+ {
+ "opname" : "FaceForward",
+ "opcode" : 70,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'N'" },
+ { "kind" : "IdRef", "name" : "'I'" },
+ { "kind" : "IdRef", "name" : "'Nref'" }
+ ]
+ },
+ {
+ "opname" : "Reflect",
+ "opcode" : 71,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'I'" },
+ { "kind" : "IdRef", "name" : "'N'" }
+ ]
+ },
+ {
+ "opname" : "Refract",
+ "opcode" : 72,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'I'" },
+ { "kind" : "IdRef", "name" : "'N'" },
+ { "kind" : "IdRef", "name" : "'eta'" }
+ ]
+ },
+ {
+ "opname" : "FindILsb",
+ "opcode" : 73,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'Value'" }
+ ]
+ },
+ {
+ "opname" : "FindSMsb",
+ "opcode" : 74,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'Value'" }
+ ]
+ },
+ {
+ "opname" : "FindUMsb",
+ "opcode" : 75,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'Value'" }
+ ]
+ },
+ {
+ "opname" : "InterpolateAtCentroid",
+ "opcode" : 76,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'interpolant'" }
+ ],
+ "capabilities" : [ "InterpolationFunction" ]
+ },
+ {
+ "opname" : "InterpolateAtSample",
+ "opcode" : 77,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'interpolant'" },
+ { "kind" : "IdRef", "name" : "'sample'" }
+ ],
+ "capabilities" : [ "InterpolationFunction" ]
+ },
+ {
+ "opname" : "InterpolateAtOffset",
+ "opcode" : 78,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'interpolant'" },
+ { "kind" : "IdRef", "name" : "'offset'" }
+ ],
+ "capabilities" : [ "InterpolationFunction" ]
+ },
+ {
+ "opname" : "NMin",
+ "opcode" : 79,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'y'" }
+ ]
+ },
+ {
+ "opname" : "NMax",
+ "opcode" : 80,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'y'" }
+ ]
+ },
+ {
+ "opname" : "NClamp",
+ "opcode" : 81,
+ "operands" : [
+ { "kind" : "IdRef", "name" : "'x'" },
+ { "kind" : "IdRef", "name" : "'minVal'" },
+ { "kind" : "IdRef", "name" : "'maxVal'" }
+ ]
+ }
+ ]
+}
diff --git a/gsk/gskspvenumsglslprivate.h b/gsk/gskspvenumsglslprivate.h
new file mode 100644
index 0000000000..ef7df14532
--- /dev/null
+++ b/gsk/gskspvenumsglslprivate.h
@@ -0,0 +1,114 @@
+/* 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 Glsl-enums extinst.glsl.std.450.grammar.json
+ * Apply any changes to those files and then regenerate using above command.
+ */
+
+#ifndef __GSK_SPV_GLSL_ENUMS_H__
+#define __GSK_SPV_GLSL_ENUMS_H__
+
+typedef enum {
+ GSK_SPV_OP_GLSL_ROUND = 1,
+ GSK_SPV_OP_GLSL_ROUND_EVEN = 2,
+ GSK_SPV_OP_GLSL_TRUNC = 3,
+ GSK_SPV_OP_GLSL_F_ABS = 4,
+ GSK_SPV_OP_GLSL_S_ABS = 5,
+ GSK_SPV_OP_GLSL_F_SIGN = 6,
+ GSK_SPV_OP_GLSL_S_SIGN = 7,
+ GSK_SPV_OP_GLSL_FLOOR = 8,
+ GSK_SPV_OP_GLSL_CEIL = 9,
+ GSK_SPV_OP_GLSL_FRACT = 10,
+ GSK_SPV_OP_GLSL_RADIANS = 11,
+ GSK_SPV_OP_GLSL_DEGREES = 12,
+ GSK_SPV_OP_GLSL_SIN = 13,
+ GSK_SPV_OP_GLSL_COS = 14,
+ GSK_SPV_OP_GLSL_TAN = 15,
+ GSK_SPV_OP_GLSL_ASIN = 16,
+ GSK_SPV_OP_GLSL_ACOS = 17,
+ GSK_SPV_OP_GLSL_ATAN = 18,
+ GSK_SPV_OP_GLSL_SINH = 19,
+ GSK_SPV_OP_GLSL_COSH = 20,
+ GSK_SPV_OP_GLSL_TANH = 21,
+ GSK_SPV_OP_GLSL_ASINH = 22,
+ GSK_SPV_OP_GLSL_ACOSH = 23,
+ GSK_SPV_OP_GLSL_ATANH = 24,
+ GSK_SPV_OP_GLSL_ATAN2 = 25,
+ GSK_SPV_OP_GLSL_POW = 26,
+ GSK_SPV_OP_GLSL_EXP = 27,
+ GSK_SPV_OP_GLSL_LOG = 28,
+ GSK_SPV_OP_GLSL_EXP2 = 29,
+ GSK_SPV_OP_GLSL_LOG2 = 30,
+ GSK_SPV_OP_GLSL_SQRT = 31,
+ GSK_SPV_OP_GLSL_INVERSE_SQRT = 32,
+ GSK_SPV_OP_GLSL_DETERMINANT = 33,
+ GSK_SPV_OP_GLSL_MATRIX_INVERSE = 34,
+ GSK_SPV_OP_GLSL_MODF = 35,
+ GSK_SPV_OP_GLSL_MODF_STRUCT = 36,
+ GSK_SPV_OP_GLSL_F_MIN = 37,
+ GSK_SPV_OP_GLSL_U_MIN = 38,
+ GSK_SPV_OP_GLSL_S_MIN = 39,
+ GSK_SPV_OP_GLSL_F_MAX = 40,
+ GSK_SPV_OP_GLSL_U_MAX = 41,
+ GSK_SPV_OP_GLSL_S_MAX = 42,
+ GSK_SPV_OP_GLSL_F_CLAMP = 43,
+ GSK_SPV_OP_GLSL_U_CLAMP = 44,
+ GSK_SPV_OP_GLSL_S_CLAMP = 45,
+ GSK_SPV_OP_GLSL_F_MIX = 46,
+ GSK_SPV_OP_GLSL_I_MIX = 47,
+ GSK_SPV_OP_GLSL_STEP = 48,
+ GSK_SPV_OP_GLSL_SMOOTH_STEP = 49,
+ GSK_SPV_OP_GLSL_FMA = 50,
+ GSK_SPV_OP_GLSL_FREXP = 51,
+ GSK_SPV_OP_GLSL_FREXP_STRUCT = 52,
+ GSK_SPV_OP_GLSL_LDEXP = 53,
+ GSK_SPV_OP_GLSL_PACK_SNORM4X8 = 54,
+ GSK_SPV_OP_GLSL_PACK_UNORM4X8 = 55,
+ GSK_SPV_OP_GLSL_PACK_SNORM2X16 = 56,
+ GSK_SPV_OP_GLSL_PACK_UNORM2X16 = 57,
+ GSK_SPV_OP_GLSL_PACK_HALF2X16 = 58,
+ GSK_SPV_OP_GLSL_PACK_DOUBLE2X32 = 59,
+ GSK_SPV_OP_GLSL_UNPACK_SNORM2X16 = 60,
+ GSK_SPV_OP_GLSL_UNPACK_UNORM2X16 = 61,
+ GSK_SPV_OP_GLSL_UNPACK_HALF2X16 = 62,
+ GSK_SPV_OP_GLSL_UNPACK_SNORM4X8 = 63,
+ GSK_SPV_OP_GLSL_UNPACK_UNORM4X8 = 64,
+ GSK_SPV_OP_GLSL_UNPACK_DOUBLE2X32 = 65,
+ GSK_SPV_OP_GLSL_LENGTH = 66,
+ GSK_SPV_OP_GLSL_DISTANCE = 67,
+ GSK_SPV_OP_GLSL_CROSS = 68,
+ GSK_SPV_OP_GLSL_NORMALIZE = 69,
+ GSK_SPV_OP_GLSL_FACE_FORWARD = 70,
+ GSK_SPV_OP_GLSL_REFLECT = 71,
+ GSK_SPV_OP_GLSL_REFRACT = 72,
+ GSK_SPV_OP_GLSL_FIND_I_LSB = 73,
+ GSK_SPV_OP_GLSL_FIND_S_MSB = 74,
+ GSK_SPV_OP_GLSL_FIND_U_MSB = 75,
+ GSK_SPV_OP_GLSL_INTERPOLATE_AT_CENTROID = 76,
+ GSK_SPV_OP_GLSL_INTERPOLATE_AT_SAMPLE = 77,
+ GSK_SPV_OP_GLSL_INTERPOLATE_AT_OFFSET = 78,
+ GSK_SPV_OP_GLSL_N_MIN = 79,
+ GSK_SPV_OP_GLSL_N_MAX = 80,
+ GSK_SPV_OP_GLSL_N_CLAMP = 81
+} GskSpvOpcodeGlsl;
+
+#endif /* __GSK_SPV_GLSL_ENUMS_H__ */
diff --git a/gsk/gskspvwriter.c b/gsk/gskspvwriter.c
index 1692a53f31..3bfb3ded5e 100644
--- a/gsk/gskspvwriter.c
+++ b/gsk/gskspvwriter.c
@@ -47,6 +47,7 @@ struct _GskSpvWriter
int ref_count;
guint32 last_id;
+ guint extended_instructions_id;
GArray *code[GSK_SPV_WRITER_N_GLOBAL_SECTIONS];
GSList *blocks;
GSList *pending_blocks;
@@ -275,8 +276,8 @@ gsk_spv_writer_do_write (GskSpvWriter *writer,
guint32 entry_point_id;
gsk_spv_writer_capability (writer, GSK_SPV_CAPABILITY_SHADER);
- gsk_spv_writer_ext_inst_import (writer,
- "GLSL.std.450");
+ writer->extended_instructions_id = gsk_spv_writer_ext_inst_import (writer,
+ "GLSL.std.450");
gsk_spv_writer_source (writer,
GSK_SPV_SOURCE_LANGUAGE_GLSL,
440,
@@ -312,6 +313,7 @@ gsk_spv_writer_clear (GskSpvWriter *writer)
g_slist_free_full (writer->pending_blocks, (GDestroyNotify) gsk_spv_code_block_free);
writer->pending_blocks = NULL;
+ writer->extended_instructions_id = 0;
for (i = 0; i < GSK_SPV_WRITER_N_GLOBAL_SECTIONS; i++)
{
@@ -369,6 +371,12 @@ gsk_spv_writer_write (GskSpvWriter *writer,
}
guint32
+gsk_spv_writer_get_id_for_extended_instructions (GskSpvWriter *writer)
+{
+ return writer->extended_instructions_id;
+}
+
+guint32
gsk_spv_writer_get_id_for_type (GskSpvWriter *writer,
GskSlType *type)
{
diff --git a/gsk/gskspvwritergeneratedglslprivate.h b/gsk/gskspvwritergeneratedglslprivate.h
new file mode 100644
index 0000000000..6e989ab8eb
--- /dev/null
+++ b/gsk/gskspvwritergeneratedglslprivate.h
@@ -0,0 +1,1820 @@
+/* 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 Glsl-functions extinst.glsl.std.450.grammar.json
+ * Apply any changes to those files and then regenerate using above command.
+ */
+
+#include <string.h>
+
+#ifndef __GSK_SPV_SEEN_AUTOGENERATED_FUNCTIONS__
+#define __GSK_SPV_SEEN_AUTOGENERATED_FUNCTIONS__
+static inline void
+append_string (GArray *bytes,
+ const char *str)
+{
+ gsize len = strlen (str);
+ guint size = bytes->len;
+ g_array_set_size (bytes, size + len / 4 + 1);
+ memcpy (&g_array_index (bytes, guint32, size), str, len);
+}
+#endif /* __GSK_SPV_SEEN_AUTOGENERATED_FUNCTIONS__ */
+
+static inline guint32
+gsk_spv_writer_round (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_ROUND });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_round_even (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_ROUND_EVEN });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_trunc (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_TRUNC });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_f_abs (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_F_ABS });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_s_abs (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_S_ABS });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_f_sign (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_F_SIGN });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_s_sign (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_S_SIGN });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_floor (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_FLOOR });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_ceil (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_CEIL });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_fract (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_FRACT });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_radians (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 degrees)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_RADIANS });
+ g_array_append_val (bytes, degrees);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_degrees (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 radians)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_DEGREES });
+ g_array_append_val (bytes, radians);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_sin (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_SIN });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_cos (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_COS });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_tan (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_TAN });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_asin (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_ASIN });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_acos (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_ACOS });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_atan (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 y_over_x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_ATAN });
+ g_array_append_val (bytes, y_over_x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_sinh (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_SINH });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_cosh (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_COSH });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_tanh (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_TANH });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_asinh (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_ASINH });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_acosh (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_ACOSH });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_atanh (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_ATANH });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_atan2 (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 y,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_ATAN2 });
+ g_array_append_val (bytes, y);
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_pow (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 y)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_POW });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, y);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_exp (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_EXP });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_log (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_LOG });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_exp2 (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_EXP2 });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_log2 (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_LOG2 });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_sqrt (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_SQRT });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_inverse_sqrt (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_INVERSE_SQRT });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_determinant (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_DETERMINANT });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_matrix_inverse (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_MATRIX_INVERSE });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_modf (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 i)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_MODF });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, i);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_modf_struct (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_MODF_STRUCT });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_f_min (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 y)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_F_MIN });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, y);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_u_min (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 y)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_U_MIN });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, y);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_s_min (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 y)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_S_MIN });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, y);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_f_max (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 y)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_F_MAX });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, y);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_u_max (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 y)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_U_MAX });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, y);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_s_max (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 y)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_S_MAX });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, y);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_f_clamp (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 min_val,
+ guint32 max_val)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_F_CLAMP });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, min_val);
+ g_array_append_val (bytes, max_val);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_u_clamp (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 min_val,
+ guint32 max_val)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_U_CLAMP });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, min_val);
+ g_array_append_val (bytes, max_val);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_s_clamp (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 min_val,
+ guint32 max_val)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_S_CLAMP });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, min_val);
+ g_array_append_val (bytes, max_val);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_f_mix (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 y,
+ guint32 a)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_F_MIX });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, y);
+ g_array_append_val (bytes, a);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_i_mix (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 y,
+ guint32 a)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_I_MIX });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, y);
+ g_array_append_val (bytes, a);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_step (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 edge,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_STEP });
+ g_array_append_val (bytes, edge);
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_smooth_step (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 edge0,
+ guint32 edge1,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_SMOOTH_STEP });
+ g_array_append_val (bytes, edge0);
+ g_array_append_val (bytes, edge1);
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_fma (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 a,
+ guint32 b,
+ guint32 c)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_FMA });
+ g_array_append_val (bytes, a);
+ g_array_append_val (bytes, b);
+ g_array_append_val (bytes, c);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_frexp (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 exp)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_FREXP });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, exp);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_frexp_struct (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_FREXP_STRUCT });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_ldexp (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 exp)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_LDEXP });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, exp);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_pack_snorm4x8 (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 v)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_PACK_SNORM4X8 });
+ g_array_append_val (bytes, v);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_pack_unorm4x8 (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 v)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_PACK_UNORM4X8 });
+ g_array_append_val (bytes, v);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_pack_snorm2x16 (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 v)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_PACK_SNORM2X16 });
+ g_array_append_val (bytes, v);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_pack_unorm2x16 (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 v)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_PACK_UNORM2X16 });
+ g_array_append_val (bytes, v);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_pack_half2x16 (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 v)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_PACK_HALF2X16 });
+ g_array_append_val (bytes, v);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_pack_double2x32 (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 v)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_PACK_DOUBLE2X32 });
+ g_array_append_val (bytes, v);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_unpack_snorm2x16 (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 p)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_UNPACK_SNORM2X16 });
+ g_array_append_val (bytes, p);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_unpack_unorm2x16 (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 p)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_UNPACK_UNORM2X16 });
+ g_array_append_val (bytes, p);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_unpack_half2x16 (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 v)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_UNPACK_HALF2X16 });
+ g_array_append_val (bytes, v);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_unpack_snorm4x8 (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 p)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_UNPACK_SNORM4X8 });
+ g_array_append_val (bytes, p);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_unpack_unorm4x8 (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 p)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_UNPACK_UNORM4X8 });
+ g_array_append_val (bytes, p);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_unpack_double2x32 (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 v)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_UNPACK_DOUBLE2X32 });
+ g_array_append_val (bytes, v);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_length (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_LENGTH });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_distance (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 p0,
+ guint32 p1)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_DISTANCE });
+ g_array_append_val (bytes, p0);
+ g_array_append_val (bytes, p1);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_cross (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 y)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_CROSS });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, y);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_normalize (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_NORMALIZE });
+ g_array_append_val (bytes, x);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_face_forward (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 n,
+ guint32 i,
+ guint32 nref)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_FACE_FORWARD });
+ g_array_append_val (bytes, n);
+ g_array_append_val (bytes, i);
+ g_array_append_val (bytes, nref);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_reflect (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 i,
+ guint32 n)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_REFLECT });
+ g_array_append_val (bytes, i);
+ g_array_append_val (bytes, n);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_refract (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 i,
+ guint32 n,
+ guint32 eta)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_REFRACT });
+ g_array_append_val (bytes, i);
+ g_array_append_val (bytes, n);
+ g_array_append_val (bytes, eta);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_find_i_lsb (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 value)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_FIND_I_LSB });
+ g_array_append_val (bytes, value);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_find_s_msb (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 value)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_FIND_S_MSB });
+ g_array_append_val (bytes, value);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_find_u_msb (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 value)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_FIND_U_MSB });
+ g_array_append_val (bytes, value);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_interpolate_at_centroid (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 interpolant)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_INTERPOLATE_AT_CENTROID });
+ g_array_append_val (bytes, interpolant);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_interpolate_at_sample (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 interpolant,
+ guint32 sample)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_INTERPOLATE_AT_SAMPLE });
+ g_array_append_val (bytes, interpolant);
+ g_array_append_val (bytes, sample);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_interpolate_at_offset (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 interpolant,
+ guint32 offset)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_INTERPOLATE_AT_OFFSET });
+ g_array_append_val (bytes, interpolant);
+ g_array_append_val (bytes, offset);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_n_min (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 y)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_N_MIN });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, y);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_n_max (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 y)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_N_MAX });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, y);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
+static inline guint32
+gsk_spv_writer_n_clamp (GskSpvWriter *writer,
+ GskSlType *result_type,
+ guint32 x,
+ guint32 min_val,
+ guint32 max_val)
+{
+ GArray *bytes = gsk_spv_writer_get_bytes (writer, GSK_SPV_WRITER_SECTION_CODE);
+ guint32 result_type_id = gsk_spv_writer_get_id_for_type (writer, result_type);
+ guint32 result_id = gsk_spv_writer_make_id (writer);
+ guint start_index = bytes->len;
+
+ g_array_append_val (bytes, (guint32) { 0 });
+ g_array_append_val (bytes, result_type_id);
+ g_array_append_val (bytes, result_id);
+ g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });
+ g_array_append_val (bytes, (guint32) { GSK_SPV_OP_GLSL_N_CLAMP });
+ g_array_append_val (bytes, x);
+ g_array_append_val (bytes, min_val);
+ g_array_append_val (bytes, max_val);
+ g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | GSK_SPV_OP_EXT_INST;
+
+ return result_id;
+}
+
diff --git a/gsk/gskspvwritergeneratedprivate.h b/gsk/gskspvwritergeneratedprivate.h
index b9746b1ac2..5985b01f1b 100644
--- a/gsk/gskspvwritergeneratedprivate.h
+++ b/gsk/gskspvwritergeneratedprivate.h
@@ -26,6 +26,8 @@
#include <string.h>
+#ifndef __GSK_SPV_SEEN_AUTOGENERATED_FUNCTIONS__
+#define __GSK_SPV_SEEN_AUTOGENERATED_FUNCTIONS__
static inline void
append_string (GArray *bytes,
const char *str)
@@ -35,6 +37,7 @@ append_string (GArray *bytes,
g_array_set_size (bytes, size + len / 4 + 1);
memcpy (&g_array_index (bytes, guint32, size), str, len);
}
+#endif /* __GSK_SPV_SEEN_AUTOGENERATED_FUNCTIONS__ */
static inline void
gsk_spv_writer_nop (GskSpvWriter *writer,
diff --git a/gsk/gskspvwriterprivate.h b/gsk/gskspvwriterprivate.h
index 58b276daff..e7b541b297 100644
--- a/gsk/gskspvwriterprivate.h
+++ b/gsk/gskspvwriterprivate.h
@@ -23,6 +23,7 @@
#include "gsksltypesprivate.h"
#include "gskspvenumsprivate.h"
+#include "gskspvenumsglslprivate.h"
G_BEGIN_DECLS
@@ -58,6 +59,8 @@ GBytes * gsk_spv_writer_write (GskSpvWriter
GskSpvWriterFunc initializer,
gpointer initializer_data);
+guint32 gsk_spv_writer_get_id_for_extended_instructions
+ (GskSpvWriter *writer);
guint32 gsk_spv_writer_get_id_for_type (GskSpvWriter *writer,
GskSlType *type);
guint32 gsk_spv_writer_get_id_for_pointer_type (GskSpvWriter *writer,
@@ -107,6 +110,7 @@ void gsk_spv_access_chain_store (GskSpvAccessCha
guint32 value);
#include "gskspvwritergeneratedprivate.h"
+#include "gskspvwritergeneratedglslprivate.h"
G_END_DECLS
diff --git a/gsk/spirv.js b/gsk/spirv.js
index 3ffb85d305..c67451abcd 100644
--- a/gsk/spirv.js
+++ b/gsk/spirv.js
@@ -9,6 +9,14 @@ if (ARGV.length != 2)
throw new SyntaxError ("Script needs 2 arguments but got " + ARGV.length);
}
+var command = ARGV[0];
+var extinst = "";
+if (ARGV[0].indexOf("-") > 0)
+ {
+ extinst = ARGV[0].substr (0, ARGV[0].indexOf("-"));
+ command = ARGV[0].substr (extinst.length + 1);
+ }
+
var contents = imports.gi.Gio.File.new_for_path(ARGV[1]).load_contents(null);
var spirv = JSON.parse(contents[1]);
@@ -536,21 +544,35 @@ 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));
+ ins.enum_value = "GSK_SPV_OP_" + (extinst ? all_upper(extinst) + "_" + all_upper (ins.opname) : all_upper (ins.opname.substr(2)));
if (!ins.operands)
ins.operands = [];
if (ExtraOperands[ins.opname])
ins.operands = ins.operands.concat (ExtraOperands[ins.opname]);
+ if (extinst)
+ {
+ ins.operands.unshift (
+ { "kind" : "IdResultType" },
+ { "kind" : "IdResult" }
+ );
+ }
for (let o in ins.operands)
{
o = ins.operands[o];
fix_operand (ins, o);
}
- if (Sections[ins.opname])
+ if (extinst)
+ {
+ ins.section = "code";
+ ins.section_enum = "GSK_SPV_WRITER_SECTION_CODE";
+ }
+ else if (Sections[ins.opname])
{
ins.section = Sections[ins.opname];
ins.section_enum = "GSK_SPV_WRITER_SECTION_" + ins.section.toUpperCase();
}
+ if (!extinst)
+ ins.opname = ins.opname.substr(2);
}
function header()
@@ -583,11 +605,11 @@ function header()
print ();
}
-if (ARGV[0] == "enums")
+if (command == "enums")
{
header ();
- print ("#ifndef __GSK_SPV_ENUMS_H__");
- print ("#define __GSK_SPV_ENUMS_H__");
+ print ("#ifndef __GSK_SPV_" + (extinst ? all_upper (extinst) + "_" : "") + "ENUMS_H__");
+ print ("#define __GSK_SPV_" + (extinst ? all_upper (extinst) + "_" : "") + "ENUMS_H__");
print ();
for (let kind in spirv.operand_kinds)
@@ -614,15 +636,17 @@ if (ARGV[0] == "enums")
let ins = spirv.instructions[i];
print (" " + ins.enum_value + " = " + ins.opcode + (i + 1 < spirv.instructions.length ? "," : ""));
}
- print ("} GskSpvOpcode;");
+ print ("} GskSpvOpcode" + extinst + ";");
print ();
- print ("#endif /* __GSK_SPV_ENUMS_H__ */");
+ print ("#endif /* __GSK_SPV_" + (extinst ? all_upper (extinst) + "_" : "") + "ENUMS_H__ */");
}
-else if (ARGV[0] == "functions")
+else if (command == "functions")
{
header ();
print ("#include <string.h>");
print ();
+ print ("#ifndef __GSK_SPV_SEEN_AUTOGENERATED_FUNCTIONS__");
+ print ("#define __GSK_SPV_SEEN_AUTOGENERATED_FUNCTIONS__");
print ("static inline void");
print ("append_string (GArray *bytes,");
print (" const char *str)");
@@ -632,11 +656,12 @@ else if (ARGV[0] == "functions")
print (" g_array_set_size (bytes, size + len / 4 + 1);");
print (" memcpy (&g_array_index (bytes, guint32, size), str, len);");
print ("}");
+ print ("#endif /* __GSK_SPV_SEEN_AUTOGENERATED_FUNCTIONS__ */");
print ();
for (let i in spirv.instructions)
{
let ins = spirv.instructions[i];
- let prefix = "gsk_spv_writer_" + all_lower(ins.opname.substr(2)) + " (";
+ let prefix = "gsk_spv_writer_" + all_lower(ins.opname) + " (";
let len = prefix.length;
if (ins.result)
print ("static inline guint32");
@@ -671,10 +696,10 @@ else if (ARGV[0] == "functions")
else
{
if (ins.section)
- print ("gsk_spv_writer_" + all_lower(ins.opname.substr(2)) + " (GskSpvWriter *writer)");
+ print ("gsk_spv_writer_" + all_lower(ins.opname) + " (GskSpvWriter *writer)");
else
{
- print ("gsk_spv_writer_" + all_lower(ins.opname.substr(2)) + " (GskSpvWriter *writer,");
+ print ("gsk_spv_writer_" + all_lower(ins.opname) + " (GskSpvWriter *writer,");
print (Array(len+1).join(" ") + "GskSpvWriterSection section)");
}
}
@@ -702,8 +727,13 @@ else if (ARGV[0] == "functions")
print (indent + o.append_many.format ("bytes", o.varname, "n_" + o.varname) + ";");
else
print (indent + o.append_one.format ("bytes", o.varname) + ";");
+ if (i == 1 && extinst)
+ {
+ print (" g_array_append_val (bytes, (guint32) { gsk_spv_writer_get_id_for_extended_instructions (writer) });");
+ print (" g_array_append_val (bytes, (guint32) { " + ins.enum_value + " });");
+ }
}
- print (" g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | " + ins.enum_value + ";");
+ print (" g_array_index (bytes, guint32, start_index) = (bytes->len - start_index) << 16 | " + (extinst ? "GSK_SPV_OP_EXT_INST" : ins.enum_value) + ";");
if (ins.result)
{
print ("");