| // Copyright 2023 The Dawn & Tint Authors |
| // |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions are met: |
| // |
| // 1. Redistributions of source code must retain the above copyright notice, this |
| // list of conditions and the following disclaimer. |
| // |
| // 2. Redistributions in binary form must reproduce the above copyright notice, |
| // this list of conditions and the following disclaimer in the documentation |
| // and/or other materials provided with the distribution. |
| // |
| // 3. Neither the name of the copyright holder nor the names of its |
| // contributors may be used to endorse or promote products derived from |
| // this software without specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
| // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
| // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| syntax = "proto3"; |
| |
| package tint.core.ir.binary.pb; |
| |
| message Module { |
| repeated Type types = 1; |
| repeated Value values = 2; |
| repeated ConstantValue constant_values = 3; |
| repeated Function functions = 4; |
| repeated Block blocks = 5; |
| uint32 root_block = 6; // Module.blocks |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // Types |
| //////////////////////////////////////////////////////////////////////////////// |
| message Type { |
| oneof kind { |
| TypeBasic basic = 1; |
| TypeVector vector = 2; |
| TypeMatrix matrix = 3; |
| TypeArray array = 4; |
| TypePointer pointer = 5; |
| TypeStruct struct = 6; |
| TypeAtomic atomic = 7; |
| TypeDepthTexture depth_texture = 8; |
| TypeSampledTexture sampled_texture = 9; |
| TypeMultisampledTexture multisampled_texture = 10; |
| TypeStorageTexture storage_texture = 11; |
| TypeExternalTexture external_texture = 12; |
| TypeSampler sampler = 13; |
| } |
| } |
| |
| // Non-compound types |
| enum TypeBasic { |
| void = 0; |
| bool = 1; |
| i32 = 2; |
| u32 = 3; |
| f32 = 4; |
| f16 = 5; |
| } |
| |
| message TypeVector { |
| uint32 width = 1; |
| uint32 element_type = 2; // Module.types |
| } |
| |
| message TypeMatrix { |
| uint32 num_columns = 1; |
| uint32 num_rows = 2; |
| uint32 element_type = 3; // Module.types |
| } |
| |
| message TypeArray { |
| uint32 element = 1; // Module.types |
| uint32 stride = 2; |
| uint32 count = 3; |
| } |
| |
| message TypePointer { |
| AddressSpace address_space = 1; |
| uint32 store_type = 2; // Module.types |
| AccessControl access = 3; |
| } |
| |
| message TypeStruct { |
| string name = 1; |
| repeated TypeStructMember member = 2; |
| } |
| |
| message TypeStructMember { |
| string name = 1; |
| uint32 type = 2; |
| uint32 size = 3; |
| uint32 align = 4; |
| optional AttributesStructMember attributes = 5; |
| } |
| |
| message TypeAtomic { |
| uint32 type = 1; // Module.types |
| } |
| |
| message TypeDepthTexture { |
| TextureDimension dimension = 1; |
| } |
| |
| message TypeSampledTexture { |
| TextureDimension dimension = 1; |
| uint32 sub_type = 2; // Module.types |
| } |
| |
| message TypeMultisampledTexture { |
| TextureDimension dimension = 1; |
| uint32 sub_type = 2; // Module.types |
| } |
| |
| message TypeStorageTexture { |
| TextureDimension dimension = 1; |
| TexelFormat texel_format = 2; |
| AccessControl access = 3; |
| } |
| |
| message TypeExternalTexture {} |
| |
| message TypeSampler { |
| SamplerKind kind = 1; |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // Values |
| //////////////////////////////////////////////////////////////////////////////// |
| message Value { |
| oneof kind { |
| uint32 function = 1; // Module.functions |
| InstructionResult instruction_result = 2; |
| FunctionParameter function_parameter = 3; |
| BlockParameter block_parameter = 4; |
| uint32 constant = 5; // Module.constant_values |
| } |
| } |
| |
| message InstructionResult { |
| uint32 type = 1; // Module.types |
| optional string name = 2; |
| } |
| |
| message FunctionParameter { |
| uint32 type = 1; // Module.types |
| optional string name = 2; |
| optional AttributesFunctionParameter attributes = 3; |
| } |
| |
| message BlockParameter { |
| uint32 type = 1; // Module.types |
| optional string name = 2; |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // ConstantValues |
| //////////////////////////////////////////////////////////////////////////////// |
| message ConstantValue { |
| oneof kind { |
| ConstantValueScalar scalar = 1; |
| ConstantValueComposite composite = 2; |
| ConstantValueSplat splat = 3; |
| } |
| } |
| |
| message ConstantValueScalar { |
| oneof kind { |
| bool bool = 1; |
| int32 i32 = 2; |
| uint32 u32 = 3; |
| float f32 = 4; |
| float f16 = 5; |
| } |
| } |
| |
| message ConstantValueComposite { |
| uint32 type = 1; // Module.types |
| repeated uint32 elements = 2; // Module.constant_values |
| } |
| |
| message ConstantValueSplat { |
| uint32 type = 1; // Module.types |
| uint32 elements = 2; // Module.constant_values |
| uint32 count = 3; // splat count |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // Functions |
| //////////////////////////////////////////////////////////////////////////////// |
| message Function { |
| uint32 return_type = 1; // Module.types |
| uint32 block = 2; // Module.blocks |
| optional string name = 3; |
| optional PipelineStage pipeline_stage = 4; |
| optional WorkgroupSize workgroup_size = 5; |
| repeated uint32 parameters = 6; // Module.values |
| optional Location return_location = 7; |
| optional BuiltinValue return_builtin = 8; |
| bool return_invariant = 9; |
| } |
| |
| enum PipelineStage { |
| Compute = 0; |
| Fragment = 1; |
| Vertex = 2; |
| } |
| |
| message WorkgroupSize { |
| uint32 x = 1; |
| uint32 y = 2; |
| uint32 z = 3; |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // Blocks |
| //////////////////////////////////////////////////////////////////////////////// |
| message Block { |
| repeated uint32 parameters = 1; // Module.values |
| repeated Instruction instructions = 2; |
| bool is_multi_in = 3; |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // Instructions |
| //////////////////////////////////////////////////////////////////////////////// |
| message Instruction { |
| repeated uint32 operands = 1; // Module.values |
| repeated uint32 results = 2; // Module.values |
| oneof kind { |
| InstructionReturn return = 3; |
| InstructionUnary unary = 4; |
| InstructionBinary binary = 5; |
| InstructionBuiltin builtin = 6; |
| InstructionDiscard discard = 7; |
| InstructionLet let = 8; |
| InstructionVar var = 9; |
| InstructionBitcast bitcast = 10; |
| InstructionConstruct construct = 11; |
| InstructionConvert convert = 12; |
| InstructionAccess access = 13; |
| InstructionUserCall user_call = 14; |
| InstructionBuiltinCall builtin_call = 15; |
| InstructionLoad load = 16; |
| InstructionStore store = 17; |
| InstructionLoadVectorElement load_vector_element = 18; |
| InstructionStoreVectorElement store_vector_element = 19; |
| InstructionSwizzle swizzle = 20; |
| InstructionIf if = 21; |
| InstructionSwitch switch = 22; |
| InstructionLoop loop = 23; |
| InstructionExitIf exit_if = 24; |
| InstructionExitSwitch exit_switch = 25; |
| InstructionExitLoop exit_loop = 26; |
| InstructionNextIteration next_iteration = 27; |
| InstructionContinue continue = 28; |
| InstructionBreakIf break_if = 29; |
| } |
| } |
| |
| message InstructionReturn {} |
| |
| message InstructionUnary { |
| UnaryOp op = 1; |
| } |
| |
| message InstructionBinary { |
| BinaryOp op = 1; |
| } |
| |
| message InstructionBuiltin {} |
| |
| message InstructionBitcast {} |
| |
| message InstructionConstruct {} |
| |
| message InstructionDiscard {} |
| |
| message InstructionLet {} |
| |
| message InstructionVar { |
| optional BindingPoint binding_point = 1; |
| } |
| |
| message InstructionConvert {} |
| |
| message InstructionAccess {} |
| |
| message InstructionUserCall {} |
| |
| message InstructionBuiltinCall { |
| BuiltinFn builtin = 1; |
| } |
| |
| message InstructionLoad {} |
| |
| message InstructionStore {} |
| |
| message InstructionLoadVectorElement {} |
| |
| message InstructionStoreVectorElement {} |
| |
| message InstructionSwizzle { |
| repeated uint32 indices = 1; |
| } |
| |
| message InstructionIf { |
| optional uint32 true = 1; // Module.blocks |
| optional uint32 false = 2; // Module.blocks |
| } |
| |
| message InstructionSwitch { |
| repeated SwitchCase cases = 1; // Module.blocks |
| } |
| |
| message InstructionLoop { |
| optional uint32 initalizer = 1; // Module.blocks |
| optional uint32 body = 2; // Module.blocks |
| optional uint32 continuing = 3; // Module.blocks |
| } |
| |
| message InstructionExitIf {} |
| |
| message InstructionExitSwitch {} |
| |
| message InstructionExitLoop {} |
| |
| message SwitchCase { |
| uint32 block = 1; // Module.blocks |
| repeated uint32 selectors = 2; // Module.constant_values |
| bool is_default = 3; |
| } |
| |
| message BindingPoint { |
| uint32 group = 1; |
| uint32 binding = 2; |
| } |
| |
| message InstructionNextIteration {} |
| |
| message InstructionContinue {} |
| |
| message InstructionBreakIf {} |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // Attributes |
| //////////////////////////////////////////////////////////////////////////////// |
| message AttributesStructMember { |
| optional uint32 location = 1; |
| optional uint32 index = 2; |
| optional uint32 color = 3; |
| optional BuiltinValue builtin = 4; |
| optional Interpolation interpolation = 5; |
| bool invariant = 6; |
| } |
| |
| message AttributesFunctionParameter { |
| optional BuiltinValue builtin = 1; |
| optional Location location = 2; |
| optional BindingPoint binding_point = 3; |
| bool invariant = 4; |
| } |
| |
| message Interpolation { |
| InterpolationType type = 1; |
| optional InterpolationSampling sampling = 2; |
| } |
| |
| message Location { |
| uint32 value = 1; |
| optional Interpolation interpolation = 2; |
| } |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // Enums |
| //////////////////////////////////////////////////////////////////////////////// |
| enum AddressSpace { |
| function = 0; |
| handle = 1; |
| pixel_local = 2; |
| private = 3; |
| push_constant = 4; |
| storage = 5; |
| uniform = 6; |
| workgroup = 7; |
| } |
| |
| enum AccessControl { |
| read = 0; |
| write = 1; |
| read_write = 2; |
| } |
| |
| enum UnaryOp { |
| complement = 0; |
| negation = 1; |
| } |
| |
| enum BinaryOp { |
| add_ = 0; |
| subtract = 1; |
| multiply = 2; |
| divide = 3; |
| modulo = 4; |
| and = 5; |
| or_ = 6; |
| xor_ = 7; |
| equal = 8; |
| not_equal = 9; |
| less_than = 10; |
| greater_than = 11; |
| less_than_equal = 12; |
| greater_than_equal = 13; |
| shift_left = 14; |
| shift_right = 15; |
| } |
| |
| enum TextureDimension { |
| _1d = 0; |
| _2d = 1; |
| _2d_array = 2; |
| _3d = 3; |
| cube = 4; |
| cube_array = 5; |
| } |
| |
| enum TexelFormat { |
| bgra8_unorm = 0; |
| r32_float = 1; |
| r32_sint = 2; |
| r32_uint = 3; |
| rg32_float = 4; |
| rg32_sint = 5; |
| rg32_uint = 6; |
| rgba16_float = 7; |
| rgba16_sint = 8; |
| rgba16_uint = 9; |
| rgba32_float = 10; |
| rgba32_sint = 11; |
| rgba32_uint = 12; |
| rgba8_sint = 13; |
| rgba8_snorm = 14; |
| rgba8_uint = 15; |
| rgba8_unorm = 16; |
| } |
| |
| enum SamplerKind { |
| sampler = 0; |
| comparison = 1; |
| } |
| |
| enum InterpolationType { |
| flat = 0; |
| linear = 1; |
| perspective = 2; |
| } |
| |
| enum InterpolationSampling { |
| center = 0; |
| centroid = 1; |
| sample = 2; |
| } |
| |
| enum BuiltinValue { |
| point_size = 0; |
| frag_depth = 1; |
| front_facing = 2; |
| global_invocation_id = 3; |
| instance_index = 4; |
| local_invocation_id = 5; |
| local_invocation_index = 6; |
| num_workgroups = 7; |
| position = 8; |
| sample_index = 9; |
| sample_mask = 10; |
| subgroup_invocation_id = 11; |
| subgroup_size = 12; |
| vertex_index = 13; |
| workgroup_id = 14; |
| } |
| |
| enum BuiltinFn { |
| abs = 0; |
| acos = 1; |
| acosh = 2; |
| all = 3; |
| any = 4; |
| array_length = 5; |
| asin = 6; |
| asinh = 7; |
| atan = 8; |
| atan2 = 9; |
| atanh = 10; |
| ceil = 11; |
| clamp = 12; |
| cos = 13; |
| cosh = 14; |
| count_leading_zeros = 15; |
| count_one_bits = 16; |
| count_trailing_zeros = 17; |
| cross = 18; |
| degrees = 19; |
| determinant = 20; |
| distance = 21; |
| dot = 22; |
| dot4i8_packed = 23; |
| dot4u8_packed = 24; |
| dpdx = 25; |
| dpdx_coarse = 26; |
| dpdx_fine = 27; |
| dpdy = 28; |
| dpdy_coarse = 29; |
| dpdy_fine = 30; |
| exp = 31; |
| exp2 = 32; |
| extract_bits = 33; |
| face_forward = 34; |
| first_leading_bit = 35; |
| first_trailing_bit = 36; |
| floor = 37; |
| fma = 38; |
| fract = 39; |
| frexp = 40; |
| fwidth = 41; |
| fwidth_coarse = 42; |
| fwidth_fine = 43; |
| insert_bits = 44; |
| inverse_sqrt = 45; |
| ldexp = 46; |
| length = 47; |
| log = 48; |
| log2 = 49; |
| max = 50; |
| min = 51; |
| mix = 52; |
| modf = 53; |
| normalize = 54; |
| pack2x16_float = 55; |
| pack2x16_snorm = 56; |
| pack2x16_unorm = 57; |
| pack4x8_snorm = 58; |
| pack4x8_unorm = 59; |
| pow = 60; |
| quantize_to_f16 = 61; |
| radians = 62; |
| reflect = 63; |
| refract = 64; |
| reverse_bits = 65; |
| round = 66; |
| saturate = 67; |
| select = 68; |
| sign = 69; |
| sin = 70; |
| sinh = 71; |
| smoothstep = 72; |
| sqrt = 73; |
| step = 74; |
| storage_barrier = 75; |
| tan = 76; |
| tanh = 77; |
| transpose = 78; |
| trunc = 79; |
| unpack2x16_float = 80; |
| unpack2x16_snorm = 81; |
| unpack2x16_unorm = 82; |
| unpack4x8_snorm = 83; |
| unpack4x8_unorm = 84; |
| workgroup_barrier = 85; |
| texture_barrier = 86; |
| texture_dimensions = 87; |
| texture_gather = 88; |
| texture_gather_compare = 89; |
| texture_num_layers = 90; |
| texture_num_levels = 91; |
| texture_num_samples = 92; |
| texture_sample = 93; |
| texture_sample_bias = 94; |
| texture_sample_compare = 95; |
| texture_sample_compare_level = 96; |
| texture_sample_grad = 97; |
| texture_sample_level = 98; |
| texture_sample_base_clamp_to_edge = 99; |
| texture_store = 100; |
| texture_load = 101; |
| atomic_load = 102; |
| atomic_store = 103; |
| atomic_add = 104; |
| atomic_sub = 105; |
| atomic_max = 106; |
| atomic_min = 107; |
| atomic_and = 108; |
| atomic_or = 109; |
| atomic_xor = 110; |
| atomic_exchange = 111; |
| atomic_compare_exchange_weak = 112; |
| subgroup_ballot = 113; |
| subgroup_broadcast = 114; |
| } |