yum-mirror/glslang

git clone https://git.yummers.dev/yum-mirror/glslang

Jan KelemenReplace spirv.hpp with spirv.hpp11f3234432

main
7.9 KiB261 linesraw
1//
2// Copyright (C) 2014-2015 LunarG, Inc.
3//
4// All rights reserved.
5//
6// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions
8// are met:
9//
10//    Redistributions of source code must retain the above copyright
11//    notice, this list of conditions and the following disclaimer.
12//
13//    Redistributions in binary form must reproduce the above
14//    copyright notice, this list of conditions and the following
15//    disclaimer in the documentation and/or other materials provided
16//    with the distribution.
17//
18//    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
19//    contributors may be used to endorse or promote products derived
20//    from this software without specific prior written permission.
21//
22// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33// POSSIBILITY OF SUCH DAMAGE.
34
35//
36// Parameterize the SPIR-V enumerants.
37//
38
39#pragma once
40
41#include "spirv.hpp11"
42
43#include <vector>
44
45namespace spv {
46
47// Fill in all the parameters
48void Parameterize();
49
50// Return the English names of all the enums.
51const char* SourceString(int);
52const char* AddressingString(int);
53const char* MemoryString(int);
54const char* ExecutionModelString(int);
55const char* ExecutionModeString(int);
56const char* StorageClassString(int);
57const char* DecorationString(int);
58const char* BuiltInString(int);
59const char* DimensionString(int);
60const char* SelectControlString(int);
61const char* LoopControlString(int);
62const char* FunctionControlString(int);
63const char* SamplerAddressingModeString(int);
64const char* SamplerFilterModeString(int);
65const char* ImageFormatString(int);
66const char* ImageChannelOrderString(int);
67const char* ImageChannelTypeString(int);
68const char* ImageChannelDataTypeString(int type);
69const char* ImageOperandsString(int format);
70const char* ImageOperands(int);
71const char* FPFastMathString(int);
72const char* FPRoundingModeString(int);
73const char* LinkageTypeString(int);
74const char* FuncParamAttrString(int);
75const char* AccessQualifierString(int);
76const char* MemorySemanticsString(int);
77const char* MemoryAccessString(int);
78const char* ExecutionScopeString(int);
79const char* GroupOperationString(int);
80const char* KernelEnqueueFlagsString(int);
81const char* KernelProfilingInfoString(int);
82const char* CapabilityString(int);
83const char* OpcodeString(int);
84const char* ScopeString(int mem);
85
86// For grouping opcodes into subsections
87enum OpcodeClass {
88    OpClassMisc,
89    OpClassDebug,
90    OpClassAnnotate,
91    OpClassExtension,
92    OpClassMode,
93    OpClassType,
94    OpClassConstant,
95    OpClassMemory,
96    OpClassFunction,
97    OpClassImage,
98    OpClassConvert,
99    OpClassComposite,
100    OpClassArithmetic,
101    OpClassBit,
102    OpClassRelationalLogical,
103    OpClassDerivative,
104    OpClassFlowControl,
105    OpClassAtomic,
106    OpClassPrimitive,
107    OpClassBarrier,
108    OpClassGroup,
109    OpClassDeviceSideEnqueue,
110    OpClassPipe,
111
112    OpClassCount,
113    OpClassMissing             // all instructions start out as missing
114};
115
116// For parameterizing operands.
117enum OperandClass {
118    OperandNone,
119    OperandId,
120    OperandVariableIds,
121    OperandOptionalLiteral,
122    OperandOptionalLiteralString,
123    OperandVariableLiterals,
124    OperandVariableIdLiteral,
125    OperandVariableLiteralId,
126    OperandLiteralNumber,
127    OperandLiteralString,
128    OperandVariableLiteralStrings,
129    OperandSource,
130    OperandExecutionModel,
131    OperandAddressing,
132    OperandMemory,
133    OperandExecutionMode,
134    OperandStorage,
135    OperandDimensionality,
136    OperandSamplerAddressingMode,
137    OperandSamplerFilterMode,
138    OperandSamplerImageFormat,
139    OperandImageChannelOrder,
140    OperandImageChannelDataType,
141    OperandImageOperands,
142    OperandFPFastMath,
143    OperandFPRoundingMode,
144    OperandLinkageType,
145    OperandAccessQualifier,
146    OperandFuncParamAttr,
147    OperandDecoration,
148    OperandBuiltIn,
149    OperandSelect,
150    OperandLoop,
151    OperandFunction,
152    OperandMemorySemantics,
153    OperandMemoryAccess,
154    OperandScope,
155    OperandGroupOperation,
156    OperandKernelEnqueueFlags,
157    OperandKernelProfilingInfo,
158    OperandCapability,
159    OperandCooperativeMatrixOperands,
160    OperandTensorAddressingOperands,
161
162    OperandOpcode,
163
164    OperandCount
165};
166
167// Any specific enum can have a set of capabilities that allow it:
168typedef std::vector<Capability> EnumCaps;
169
170// Parameterize a set of operands with their OperandClass(es) and descriptions.
171class OperandParameters {
172public:
173    OperandParameters() { }
174    void push(OperandClass oc, const char* d, bool opt = false)
175    {
176        opClass.push_back(oc);
177        desc.push_back(d);
178        optional.push_back(opt);
179    }
180    void setOptional();
181    OperandClass getClass(int op) const { return opClass[op]; }
182    const char* getDesc(int op) const { return desc[op]; }
183    bool isOptional(int op) const { return optional[op]; }
184    int getNum() const { return (int)opClass.size(); }
185
186protected:
187    std::vector<OperandClass> opClass;
188    std::vector<const char*> desc;
189    std::vector<bool> optional;
190};
191
192// Parameterize an enumerant
193class EnumParameters {
194public:
195    EnumParameters() : desc(nullptr) { }
196    const char* desc;
197};
198
199// Parameterize a set of enumerants that form an enum
200class EnumDefinition : public EnumParameters {
201public:
202    EnumDefinition() :
203        ceiling(0), bitmask(false), getName(nullptr), enumParams(nullptr), operandParams(nullptr) { }
204    void set(int ceil, const char* (*name)(int), EnumParameters* ep, bool mask = false)
205    {
206        ceiling = ceil;
207        getName = name;
208        bitmask = mask;
209        enumParams = ep;
210    }
211    void setOperands(OperandParameters* op) { operandParams = op; }
212    int ceiling;   // ceiling of enumerants
213    bool bitmask;  // true if these enumerants combine into a bitmask
214    const char* (*getName)(int);      // a function that returns the name for each enumerant value (or shift)
215    EnumParameters* enumParams;       // parameters for each individual enumerant
216    OperandParameters* operandParams; // sets of operands
217};
218
219// Parameterize an instruction's logical format, including its known set of operands,
220// per OperandParameters above.
221class InstructionParameters {
222public:
223    InstructionParameters() :
224        opDesc("TBD"),
225        opClass(OpClassMissing),
226        typePresent(true),         // most normal, only exceptions have to be spelled out
227        resultPresent(true)        // most normal, only exceptions have to be spelled out
228    { }
229
230    void setResultAndType(bool r, bool t)
231    {
232        resultPresent = r;
233        typePresent = t;
234    }
235
236    bool hasResult() const { return resultPresent != 0; }
237    bool hasType()   const { return typePresent != 0; }
238
239    const char* opDesc;
240    OpcodeClass opClass;
241    OperandParameters operands;
242
243protected:
244    bool typePresent   : 1;
245    bool resultPresent : 1;
246};
247
248// The set of objects that hold all the instruction/operand
249// parameterization information.
250extern InstructionParameters InstructionDesc[];
251
252// These hold definitions of the enumerants used for operands
253extern EnumDefinition OperandClassParams[];
254
255const char* GetOperandDesc(OperandClass operand);
256void PrintImmediateRow(int imm, const char* name, const EnumParameters* enumParams, bool caps, bool hex = false);
257const char* AccessQualifierString(int attr);
258
259void PrintOperands(const OperandParameters& operands, int reservedOperands);
260
261}  // end namespace spv