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.hpp" 42 43 #include <vector> 44 45 namespace spv { 46 47 // Fill in all the parameters 48 void Parameterize(); 49 50 // Return the English names of all the enums. 51 const char* SourceString(int); 52 const char* AddressingString(int); 53 const char* MemoryString(int); 54 const char* ExecutionModelString(int); 55 const char* ExecutionModeString(int); 56 const char* StorageClassString(int); 57 const char* DecorationString(int); 58 const char* BuiltInString(int); 59 const char* DimensionString(int); 60 const char* SelectControlString(int); 61 const char* LoopControlString(int); 62 const char* FunctionControlString(int); 63 const char* SamplerAddressingModeString(int); 64 const char* SamplerFilterModeString(int); 65 const char* ImageFormatString(int); 66 const char* ImageChannelOrderString(int); 67 const char* ImageChannelTypeString(int); 68 const char* ImageChannelDataTypeString(int type); 69 const char* ImageOperandsString(int format); 70 const char* ImageOperands(int); 71 const char* FPFastMathString(int); 72 const char* FPRoundingModeString(int); 73 const char* LinkageTypeString(int); 74 const char* FuncParamAttrString(int); 75 const char* AccessQualifierString(int); 76 const char* MemorySemanticsString(int); 77 const char* MemoryAccessString(int); 78 const char* ExecutionScopeString(int); 79 const char* GroupOperationString(int); 80 const char* KernelEnqueueFlagsString(int); 81 const char* KernelProfilingInfoString(int); 82 const char* CapabilityString(int); 83 const char* OpcodeString(int); 84 const char* ScopeString(int mem); 85 86 // For grouping opcodes into subsections 87 enum 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. 117 enum 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 161 OperandOpcode, 162 163 OperandCount 164 }; 165 166 // Any specific enum can have a set of capabilities that allow it: 167 typedef std::vector<Capability> EnumCaps; 168 169 // Parameterize a set of operands with their OperandClass(es) and descriptions. 170 class OperandParameters { 171 public: OperandParameters()172 OperandParameters() { } 173 void push(OperandClass oc, const char* d, bool opt = false) 174 { 175 opClass.push_back(oc); 176 desc.push_back(d); 177 optional.push_back(opt); 178 } 179 void setOptional(); getClass(int op)180 OperandClass getClass(int op) const { return opClass[op]; } getDesc(int op)181 const char* getDesc(int op) const { return desc[op]; } isOptional(int op)182 bool isOptional(int op) const { return optional[op]; } getNum()183 int getNum() const { return (int)opClass.size(); } 184 185 protected: 186 std::vector<OperandClass> opClass; 187 std::vector<const char*> desc; 188 std::vector<bool> optional; 189 }; 190 191 // Parameterize an enumerant 192 class EnumParameters { 193 public: EnumParameters()194 EnumParameters() : desc(nullptr) { } 195 const char* desc; 196 }; 197 198 // Parameterize a set of enumerants that form an enum 199 class EnumDefinition : public EnumParameters { 200 public: EnumDefinition()201 EnumDefinition() : 202 ceiling(0), bitmask(false), getName(nullptr), enumParams(nullptr), operandParams(nullptr) { } 203 void set(int ceil, const char* (*name)(int), EnumParameters* ep, bool mask = false) 204 { 205 ceiling = ceil; 206 getName = name; 207 bitmask = mask; 208 enumParams = ep; 209 } setOperands(OperandParameters * op)210 void setOperands(OperandParameters* op) { operandParams = op; } 211 int ceiling; // ceiling of enumerants 212 bool bitmask; // true if these enumerants combine into a bitmask 213 const char* (*getName)(int); // a function that returns the name for each enumerant value (or shift) 214 EnumParameters* enumParams; // parameters for each individual enumerant 215 OperandParameters* operandParams; // sets of operands 216 }; 217 218 // Parameterize an instruction's logical format, including its known set of operands, 219 // per OperandParameters above. 220 class InstructionParameters { 221 public: InstructionParameters()222 InstructionParameters() : 223 opDesc("TBD"), 224 opClass(OpClassMissing), 225 typePresent(true), // most normal, only exceptions have to be spelled out 226 resultPresent(true) // most normal, only exceptions have to be spelled out 227 { } 228 setResultAndType(bool r,bool t)229 void setResultAndType(bool r, bool t) 230 { 231 resultPresent = r; 232 typePresent = t; 233 } 234 hasResult()235 bool hasResult() const { return resultPresent != 0; } hasType()236 bool hasType() const { return typePresent != 0; } 237 238 const char* opDesc; 239 OpcodeClass opClass; 240 OperandParameters operands; 241 242 protected: 243 int typePresent : 1; 244 int resultPresent : 1; 245 }; 246 247 // The set of objects that hold all the instruction/operand 248 // parameterization information. 249 extern InstructionParameters InstructionDesc[]; 250 251 // These hold definitions of the enumerants used for operands 252 extern EnumDefinition OperandClassParams[]; 253 254 const char* GetOperandDesc(OperandClass operand); 255 void PrintImmediateRow(int imm, const char* name, const EnumParameters* enumParams, bool caps, bool hex = false); 256 const char* AccessQualifierString(int attr); 257 258 void PrintOperands(const OperandParameters& operands, int reservedOperands); 259 260 } // end namespace spv 261