1// Copyright (c) 2015-2016 The Khronos Group Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef SOURCE_TABLE_H_
16#define SOURCE_TABLE_H_
17
18#include "source/extensions.h"
19#include "source/latest_version_spirv_header.h"
20#include "spirv-tools/libspirv.hpp"
21
22typedef struct spv_opcode_desc_t {
23 const char* name;
24 const SpvOp opcode;
25 const uint32_t numCapabilities;
26 const SpvCapability* capabilities;
27 // operandTypes[0..numTypes-1] describe logical operands for the instruction.
28 // The operand types include result id and result-type id, followed by
29 // the types of arguments.
30 const uint16_t numTypes;
31 spv_operand_type_t operandTypes[16]; // TODO: Smaller/larger?
32 const bool hasResult; // Does the instruction have a result ID operand?
33 const bool hasType; // Does the instruction have a type ID operand?
34 // A set of extensions that enable this feature. If empty then this operand
35 // value is in core and its availability is subject to minVersion. The
36 // assembler, binary parser, and disassembler ignore this rule, so you can
37 // freely process invalid modules.
38 const uint32_t numExtensions;
39 const spvtools::Extension* extensions;
40 // Minimal core SPIR-V version required for this feature, if without
41 // extensions. ~0u means reserved for future use. ~0u and non-empty extension
42 // lists means only available in extensions.
43 const uint32_t minVersion;
44 const uint32_t lastVersion;
45} spv_opcode_desc_t;
46
47typedef struct spv_operand_desc_t {
48 const char* name;
49 const uint32_t value;
50 const uint32_t numCapabilities;
51 const SpvCapability* capabilities;
52 // A set of extensions that enable this feature. If empty then this operand
53 // value is in core and its availability is subject to minVersion. The
54 // assembler, binary parser, and disassembler ignore this rule, so you can
55 // freely process invalid modules.
56 const uint32_t numExtensions;
57 const spvtools::Extension* extensions;
58 const spv_operand_type_t operandTypes[16]; // TODO: Smaller/larger?
59 // Minimal core SPIR-V version required for this feature, if without
60 // extensions. ~0u means reserved for future use. ~0u and non-empty extension
61 // lists means only available in extensions.
62 const uint32_t minVersion;
63 const uint32_t lastVersion;
64} spv_operand_desc_t;
65
66typedef struct spv_operand_desc_group_t {
67 const spv_operand_type_t type;
68 const uint32_t count;
69 const spv_operand_desc_t* entries;
70} spv_operand_desc_group_t;
71
72typedef struct spv_ext_inst_desc_t {
73 const char* name;
74 const uint32_t ext_inst;
75 const uint32_t numCapabilities;
76 const SpvCapability* capabilities;
77 const spv_operand_type_t operandTypes[16]; // TODO: Smaller/larger?
78} spv_ext_inst_desc_t;
79
80typedef struct spv_ext_inst_group_t {
81 const spv_ext_inst_type_t type;
82 const uint32_t count;
83 const spv_ext_inst_desc_t* entries;
84} spv_ext_inst_group_t;
85
86typedef struct spv_opcode_table_t {
87 const uint32_t count;
88 const spv_opcode_desc_t* entries;
89} spv_opcode_table_t;
90
91typedef struct spv_operand_table_t {
92 const uint32_t count;
93 const spv_operand_desc_group_t* types;
94} spv_operand_table_t;
95
96typedef struct spv_ext_inst_table_t {
97 const uint32_t count;
98 const spv_ext_inst_group_t* groups;
99} spv_ext_inst_table_t;
100
101typedef const spv_opcode_desc_t* spv_opcode_desc;
102typedef const spv_operand_desc_t* spv_operand_desc;
103typedef const spv_ext_inst_desc_t* spv_ext_inst_desc;
104
105typedef const spv_opcode_table_t* spv_opcode_table;
106typedef const spv_operand_table_t* spv_operand_table;
107typedef const spv_ext_inst_table_t* spv_ext_inst_table;
108
109struct spv_context_t {
110 const spv_target_env target_env;
111 const spv_opcode_table opcode_table;
112 const spv_operand_table operand_table;
113 const spv_ext_inst_table ext_inst_table;
114 spvtools::MessageConsumer consumer;
115};
116
117namespace spvtools {
118
119// Sets the message consumer to |consumer| in the given |context|. The original
120// message consumer will be overwritten.
121void SetContextMessageConsumer(spv_context context, MessageConsumer consumer);
122} // namespace spvtools
123
124// Populates *table with entries for env.
125spv_result_t spvOpcodeTableGet(spv_opcode_table* table, spv_target_env env);
126
127// Populates *table with entries for env.
128spv_result_t spvOperandTableGet(spv_operand_table* table, spv_target_env env);
129
130// Populates *table with entries for env.
131spv_result_t spvExtInstTableGet(spv_ext_inst_table* table, spv_target_env env);
132
133#endif // SOURCE_TABLE_H_
134