mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +00:00 
			
		
		
		
	
		
			
	
	
		
			259 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			259 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | //
 | ||
|  | // Copyright (C) 2014-2015 LunarG, Inc.
 | ||
|  | //
 | ||
|  | // All rights reserved.
 | ||
|  | //
 | ||
|  | // Redistribution and use in source and binary forms, with or without
 | ||
|  | // modification, are permitted provided that the following conditions
 | ||
|  | // are met:
 | ||
|  | //
 | ||
|  | //    Redistributions of source code must retain the above copyright
 | ||
|  | //    notice, this list of conditions and the following disclaimer.
 | ||
|  | //
 | ||
|  | //    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.
 | ||
|  | //
 | ||
|  | //    Neither the name of 3Dlabs Inc. Ltd. 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 HOLDERS 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.
 | ||
|  | 
 | ||
|  | //
 | ||
|  | // Parameterize the SPIR-V enumerants.
 | ||
|  | //
 | ||
|  | 
 | ||
|  | #pragma once
 | ||
|  | 
 | ||
|  | #include "spirv.hpp"
 | ||
|  | 
 | ||
|  | #include <vector>
 | ||
|  | 
 | ||
|  | namespace spv { | ||
|  | 
 | ||
|  | // Fill in all the parameters
 | ||
|  | void Parameterize(); | ||
|  | 
 | ||
|  | // Return the English names of all the enums.
 | ||
|  | const char* SourceString(int); | ||
|  | const char* AddressingString(int); | ||
|  | const char* MemoryString(int); | ||
|  | const char* ExecutionModelString(int); | ||
|  | const char* ExecutionModeString(int); | ||
|  | const char* StorageClassString(int); | ||
|  | const char* DecorationString(int); | ||
|  | const char* BuiltInString(int); | ||
|  | const char* DimensionString(int); | ||
|  | const char* SelectControlString(int); | ||
|  | const char* LoopControlString(int); | ||
|  | const char* FunctionControlString(int); | ||
|  | const char* SamplerAddressingModeString(int); | ||
|  | const char* SamplerFilterModeString(int); | ||
|  | const char* ImageFormatString(int); | ||
|  | const char* ImageChannelOrderString(int); | ||
|  | const char* ImageChannelTypeString(int); | ||
|  | const char* ImageChannelDataTypeString(int type); | ||
|  | const char* ImageOperandsString(int format); | ||
|  | const char* ImageOperands(int); | ||
|  | const char* FPFastMathString(int); | ||
|  | const char* FPRoundingModeString(int); | ||
|  | const char* LinkageTypeString(int); | ||
|  | const char* FuncParamAttrString(int); | ||
|  | const char* AccessQualifierString(int); | ||
|  | const char* MemorySemanticsString(int); | ||
|  | const char* MemoryAccessString(int); | ||
|  | const char* ExecutionScopeString(int); | ||
|  | const char* GroupOperationString(int); | ||
|  | const char* KernelEnqueueFlagsString(int); | ||
|  | const char* KernelProfilingInfoString(int); | ||
|  | const char* CapabilityString(int); | ||
|  | const char* OpcodeString(int); | ||
|  | const char* ScopeString(int mem); | ||
|  | 
 | ||
|  | // For grouping opcodes into subsections
 | ||
|  | enum OpcodeClass { | ||
|  |     OpClassMisc, | ||
|  |     OpClassDebug, | ||
|  |     OpClassAnnotate, | ||
|  |     OpClassExtension, | ||
|  |     OpClassMode, | ||
|  |     OpClassType, | ||
|  |     OpClassConstant, | ||
|  |     OpClassMemory, | ||
|  |     OpClassFunction, | ||
|  |     OpClassImage, | ||
|  |     OpClassConvert, | ||
|  |     OpClassComposite, | ||
|  |     OpClassArithmetic, | ||
|  |     OpClassBit, | ||
|  |     OpClassRelationalLogical, | ||
|  |     OpClassDerivative, | ||
|  |     OpClassFlowControl, | ||
|  |     OpClassAtomic, | ||
|  |     OpClassPrimitive, | ||
|  |     OpClassBarrier, | ||
|  |     OpClassGroup, | ||
|  |     OpClassDeviceSideEnqueue, | ||
|  |     OpClassPipe, | ||
|  | 
 | ||
|  |     OpClassCount, | ||
|  |     OpClassMissing             // all instructions start out as missing
 | ||
|  | }; | ||
|  | 
 | ||
|  | // For parameterizing operands.
 | ||
|  | enum OperandClass { | ||
|  |     OperandNone, | ||
|  |     OperandId, | ||
|  |     OperandVariableIds, | ||
|  |     OperandOptionalLiteral, | ||
|  |     OperandOptionalLiteralString, | ||
|  |     OperandVariableLiterals, | ||
|  |     OperandVariableIdLiteral, | ||
|  |     OperandVariableLiteralId, | ||
|  |     OperandLiteralNumber, | ||
|  |     OperandLiteralString, | ||
|  |     OperandSource, | ||
|  |     OperandExecutionModel, | ||
|  |     OperandAddressing, | ||
|  |     OperandMemory, | ||
|  |     OperandExecutionMode, | ||
|  |     OperandStorage, | ||
|  |     OperandDimensionality, | ||
|  |     OperandSamplerAddressingMode, | ||
|  |     OperandSamplerFilterMode, | ||
|  |     OperandSamplerImageFormat, | ||
|  |     OperandImageChannelOrder, | ||
|  |     OperandImageChannelDataType, | ||
|  |     OperandImageOperands, | ||
|  |     OperandFPFastMath, | ||
|  |     OperandFPRoundingMode, | ||
|  |     OperandLinkageType, | ||
|  |     OperandAccessQualifier, | ||
|  |     OperandFuncParamAttr, | ||
|  |     OperandDecoration, | ||
|  |     OperandBuiltIn, | ||
|  |     OperandSelect, | ||
|  |     OperandLoop, | ||
|  |     OperandFunction, | ||
|  |     OperandMemorySemantics, | ||
|  |     OperandMemoryAccess, | ||
|  |     OperandScope, | ||
|  |     OperandGroupOperation, | ||
|  |     OperandKernelEnqueueFlags, | ||
|  |     OperandKernelProfilingInfo, | ||
|  |     OperandCapability, | ||
|  | 
 | ||
|  |     OperandOpcode, | ||
|  | 
 | ||
|  |     OperandCount | ||
|  | }; | ||
|  | 
 | ||
|  | // Any specific enum can have a set of capabilities that allow it:
 | ||
|  | typedef std::vector<Capability> EnumCaps; | ||
|  | 
 | ||
|  | // Parameterize a set of operands with their OperandClass(es) and descriptions.
 | ||
|  | class OperandParameters { | ||
|  | public: | ||
|  |     OperandParameters() { } | ||
|  |     void push(OperandClass oc, const char* d, bool opt = false) | ||
|  |     { | ||
|  |         opClass.push_back(oc); | ||
|  |         desc.push_back(d); | ||
|  |         optional.push_back(opt); | ||
|  |     } | ||
|  |     void setOptional(); | ||
|  |     OperandClass getClass(int op) const { return opClass[op]; } | ||
|  |     const char* getDesc(int op) const { return desc[op]; } | ||
|  |     bool isOptional(int op) const { return optional[op]; } | ||
|  |     int getNum() const { return (int)opClass.size(); } | ||
|  | 
 | ||
|  | protected: | ||
|  |     std::vector<OperandClass> opClass; | ||
|  |     std::vector<const char*> desc; | ||
|  |     std::vector<bool> optional; | ||
|  | }; | ||
|  | 
 | ||
|  | // Parameterize an enumerant
 | ||
|  | class EnumParameters { | ||
|  | public: | ||
|  |     EnumParameters() : desc(0) { } | ||
|  |     const char* desc; | ||
|  | }; | ||
|  | 
 | ||
|  | // Parameterize a set of enumerants that form an enum
 | ||
|  | class EnumDefinition : public EnumParameters { | ||
|  | public: | ||
|  |     EnumDefinition() :  | ||
|  |         ceiling(0), bitmask(false), getName(0), enumParams(0), operandParams(0) { } | ||
|  |     void set(int ceil, const char* (*name)(int), EnumParameters* ep, bool mask = false) | ||
|  |     { | ||
|  |         ceiling = ceil; | ||
|  |         getName = name; | ||
|  |         bitmask = mask; | ||
|  |         enumParams = ep; | ||
|  |     } | ||
|  |     void setOperands(OperandParameters* op) { operandParams = op; } | ||
|  |     int ceiling;   // ceiling of enumerants
 | ||
|  |     bool bitmask;  // true if these enumerants combine into a bitmask
 | ||
|  |     const char* (*getName)(int);      // a function that returns the name for each enumerant value (or shift)
 | ||
|  |     EnumParameters* enumParams;       // parameters for each individual enumerant
 | ||
|  |     OperandParameters* operandParams; // sets of operands
 | ||
|  | }; | ||
|  | 
 | ||
|  | // Parameterize an instruction's logical format, including its known set of operands,
 | ||
|  | // per OperandParameters above.
 | ||
|  | class InstructionParameters { | ||
|  | public: | ||
|  |     InstructionParameters() : | ||
|  |         opDesc("TBD"), | ||
|  |         opClass(OpClassMissing), | ||
|  |         typePresent(true),         // most normal, only exceptions have to be spelled out
 | ||
|  |         resultPresent(true)        // most normal, only exceptions have to be spelled out
 | ||
|  |     { } | ||
|  | 
 | ||
|  |     void setResultAndType(bool r, bool t) | ||
|  |     { | ||
|  |         resultPresent = r; | ||
|  |         typePresent = t; | ||
|  |     } | ||
|  | 
 | ||
|  |     bool hasResult() const { return resultPresent != 0; } | ||
|  |     bool hasType()   const { return typePresent != 0; } | ||
|  | 
 | ||
|  |     const char* opDesc; | ||
|  |     OpcodeClass opClass; | ||
|  |     OperandParameters operands; | ||
|  | 
 | ||
|  | protected: | ||
|  |     int typePresent   : 1; | ||
|  |     int resultPresent : 1; | ||
|  | }; | ||
|  | 
 | ||
|  | // The set of objects that hold all the instruction/operand
 | ||
|  | // parameterization information.
 | ||
|  | extern InstructionParameters InstructionDesc[]; | ||
|  | 
 | ||
|  | // These hold definitions of the enumerants used for operands
 | ||
|  | extern EnumDefinition OperandClassParams[]; | ||
|  | 
 | ||
|  | const char* GetOperandDesc(OperandClass operand); | ||
|  | void PrintImmediateRow(int imm, const char* name, const EnumParameters* enumParams, bool caps, bool hex = false); | ||
|  | const char* AccessQualifierString(int attr); | ||
|  | 
 | ||
|  | void PrintOperands(const OperandParameters& operands, int reservedOperands); | ||
|  | 
 | ||
|  | }  // end namespace spv
 |