[spirv] Add support for capability (de)serialization

This CL pulls in capabilities defined in the spec and adds
support for (de)serialize capabilities of a spv.module.

PiperOrigin-RevId: 264877413
This commit is contained in:
Lei Zhang 2019-08-22 11:15:05 -07:00 committed by A. Unique TensorFlower
parent b1ce4df505
commit 27ed82f99c
6 changed files with 312 additions and 20 deletions

View File

@ -77,6 +77,7 @@ def SPV_OC_OpName : I32EnumAttrCase<"OpName", 5>;
def SPV_OC_OpMemoryModel : I32EnumAttrCase<"OpMemoryModel", 14>;
def SPV_OC_OpEntryPoint : I32EnumAttrCase<"OpEntryPoint", 15>;
def SPV_OC_OpExecutionMode : I32EnumAttrCase<"OpExecutionMode", 16>;
def SPV_OC_OpCapability : I32EnumAttrCase<"OpCapability", 17>;
def SPV_OC_OpTypeVoid : I32EnumAttrCase<"OpTypeVoid", 19>;
def SPV_OC_OpTypeBool : I32EnumAttrCase<"OpTypeBool", 20>;
def SPV_OC_OpTypeInt : I32EnumAttrCase<"OpTypeInt", 21>;
@ -135,22 +136,22 @@ def SPV_OC_OpReturnValue : I32EnumAttrCase<"OpReturnValue", 254>;
def SPV_OpcodeAttr :
I32EnumAttr<"Opcode", "valid SPIR-V instructions", [
SPV_OC_OpNop, SPV_OC_OpName, SPV_OC_OpMemoryModel, SPV_OC_OpEntryPoint,
SPV_OC_OpExecutionMode, SPV_OC_OpTypeVoid, SPV_OC_OpTypeBool, SPV_OC_OpTypeInt,
SPV_OC_OpTypeFloat, SPV_OC_OpTypeVector, SPV_OC_OpTypeArray,
SPV_OC_OpTypeStruct, SPV_OC_OpTypePointer, SPV_OC_OpTypeFunction,
SPV_OC_OpConstantTrue, SPV_OC_OpConstantFalse, SPV_OC_OpConstant,
SPV_OC_OpConstantComposite, SPV_OC_OpConstantNull, SPV_OC_OpSpecConstantTrue,
SPV_OC_OpSpecConstantFalse, SPV_OC_OpSpecConstant, SPV_OC_OpSpecConstantComposite,
SPV_OC_OpFunction, SPV_OC_OpFunctionParameter, SPV_OC_OpFunctionEnd,
SPV_OC_OpVariable, SPV_OC_OpLoad, SPV_OC_OpStore, SPV_OC_OpAccessChain,
SPV_OC_OpDecorate,SPV_OC_OpMemberDecorate, SPV_OC_OpCompositeExtract,
SPV_OC_OpIAdd, SPV_OC_OpFAdd, SPV_OC_OpISub, SPV_OC_OpFSub, SPV_OC_OpIMul,
SPV_OC_OpFMul, SPV_OC_OpUDiv, SPV_OC_OpSDiv, SPV_OC_OpFDiv, SPV_OC_OpUMod,
SPV_OC_OpSRem, SPV_OC_OpSMod, SPV_OC_OpFRem, SPV_OC_OpFMod, SPV_OC_OpIEqual,
SPV_OC_OpINotEqual, SPV_OC_OpUGreaterThan, SPV_OC_OpSGreaterThan,
SPV_OC_OpUGreaterThanEqual, SPV_OC_OpSGreaterThanEqual, SPV_OC_OpULessThan,
SPV_OC_OpSLessThan, SPV_OC_OpULessThanEqual, SPV_OC_OpSLessThanEqual,
SPV_OC_OpReturn, SPV_OC_OpReturnValue
SPV_OC_OpExecutionMode, SPV_OC_OpCapability, SPV_OC_OpTypeVoid,
SPV_OC_OpTypeBool, SPV_OC_OpTypeInt, SPV_OC_OpTypeFloat, SPV_OC_OpTypeVector,
SPV_OC_OpTypeArray, SPV_OC_OpTypeStruct, SPV_OC_OpTypePointer,
SPV_OC_OpTypeFunction, SPV_OC_OpConstantTrue, SPV_OC_OpConstantFalse,
SPV_OC_OpConstant, SPV_OC_OpConstantComposite, SPV_OC_OpConstantNull,
SPV_OC_OpSpecConstantTrue, SPV_OC_OpSpecConstantFalse, SPV_OC_OpSpecConstant,
SPV_OC_OpSpecConstantComposite, SPV_OC_OpFunction, SPV_OC_OpFunctionParameter,
SPV_OC_OpFunctionEnd, SPV_OC_OpVariable, SPV_OC_OpLoad, SPV_OC_OpStore,
SPV_OC_OpAccessChain, SPV_OC_OpDecorate, SPV_OC_OpMemberDecorate,
SPV_OC_OpCompositeExtract, SPV_OC_OpIAdd, SPV_OC_OpFAdd, SPV_OC_OpISub,
SPV_OC_OpFSub, SPV_OC_OpIMul, SPV_OC_OpFMul, SPV_OC_OpUDiv, SPV_OC_OpSDiv,
SPV_OC_OpFDiv, SPV_OC_OpUMod, SPV_OC_OpSRem, SPV_OC_OpSMod, SPV_OC_OpFRem,
SPV_OC_OpFMod, SPV_OC_OpIEqual, SPV_OC_OpINotEqual, SPV_OC_OpUGreaterThan,
SPV_OC_OpSGreaterThan, SPV_OC_OpUGreaterThanEqual, SPV_OC_OpSGreaterThanEqual,
SPV_OC_OpULessThan, SPV_OC_OpSLessThan, SPV_OC_OpULessThanEqual,
SPV_OC_OpSLessThanEqual, SPV_OC_OpReturn, SPV_OC_OpReturnValue
]> {
let returnType = "::mlir::spirv::Opcode";
let convertFromStorage = "static_cast<::mlir::spirv::Opcode>($_self.getInt())";
@ -361,6 +362,214 @@ def SPV_BuiltInAttr :
let cppNamespace = "::mlir::spirv";
}
def SPV_C_Matrix : I32EnumAttrCase<"Matrix", 0>;
def SPV_C_Shader : I32EnumAttrCase<"Shader", 1>;
def SPV_C_Geometry : I32EnumAttrCase<"Geometry", 2>;
def SPV_C_Tessellation : I32EnumAttrCase<"Tessellation", 3>;
def SPV_C_Addresses : I32EnumAttrCase<"Addresses", 4>;
def SPV_C_Linkage : I32EnumAttrCase<"Linkage", 5>;
def SPV_C_Kernel : I32EnumAttrCase<"Kernel", 6>;
def SPV_C_Vector16 : I32EnumAttrCase<"Vector16", 7>;
def SPV_C_Float16Buffer : I32EnumAttrCase<"Float16Buffer", 8>;
def SPV_C_Float16 : I32EnumAttrCase<"Float16", 9>;
def SPV_C_Float64 : I32EnumAttrCase<"Float64", 10>;
def SPV_C_Int64 : I32EnumAttrCase<"Int64", 11>;
def SPV_C_Int64Atomics : I32EnumAttrCase<"Int64Atomics", 12>;
def SPV_C_ImageBasic : I32EnumAttrCase<"ImageBasic", 13>;
def SPV_C_ImageReadWrite : I32EnumAttrCase<"ImageReadWrite", 14>;
def SPV_C_ImageMipmap : I32EnumAttrCase<"ImageMipmap", 15>;
def SPV_C_Pipes : I32EnumAttrCase<"Pipes", 17>;
def SPV_C_Groups : I32EnumAttrCase<"Groups", 18>;
def SPV_C_DeviceEnqueue : I32EnumAttrCase<"DeviceEnqueue", 19>;
def SPV_C_LiteralSampler : I32EnumAttrCase<"LiteralSampler", 20>;
def SPV_C_AtomicStorage : I32EnumAttrCase<"AtomicStorage", 21>;
def SPV_C_Int16 : I32EnumAttrCase<"Int16", 22>;
def SPV_C_TessellationPointSize : I32EnumAttrCase<"TessellationPointSize", 23>;
def SPV_C_GeometryPointSize : I32EnumAttrCase<"GeometryPointSize", 24>;
def SPV_C_ImageGatherExtended : I32EnumAttrCase<"ImageGatherExtended", 25>;
def SPV_C_StorageImageMultisample : I32EnumAttrCase<"StorageImageMultisample", 27>;
def SPV_C_UniformBufferArrayDynamicIndexing : I32EnumAttrCase<"UniformBufferArrayDynamicIndexing", 28>;
def SPV_C_SampledImageArrayDynamicIndexing : I32EnumAttrCase<"SampledImageArrayDynamicIndexing", 29>;
def SPV_C_StorageBufferArrayDynamicIndexing : I32EnumAttrCase<"StorageBufferArrayDynamicIndexing", 30>;
def SPV_C_StorageImageArrayDynamicIndexing : I32EnumAttrCase<"StorageImageArrayDynamicIndexing", 31>;
def SPV_C_ClipDistance : I32EnumAttrCase<"ClipDistance", 32>;
def SPV_C_CullDistance : I32EnumAttrCase<"CullDistance", 33>;
def SPV_C_ImageCubeArray : I32EnumAttrCase<"ImageCubeArray", 34>;
def SPV_C_SampleRateShading : I32EnumAttrCase<"SampleRateShading", 35>;
def SPV_C_ImageRect : I32EnumAttrCase<"ImageRect", 36>;
def SPV_C_SampledRect : I32EnumAttrCase<"SampledRect", 37>;
def SPV_C_GenericPointer : I32EnumAttrCase<"GenericPointer", 38>;
def SPV_C_Int8 : I32EnumAttrCase<"Int8", 39>;
def SPV_C_InputAttachment : I32EnumAttrCase<"InputAttachment", 40>;
def SPV_C_SparseResidency : I32EnumAttrCase<"SparseResidency", 41>;
def SPV_C_MinLod : I32EnumAttrCase<"MinLod", 42>;
def SPV_C_Sampled1D : I32EnumAttrCase<"Sampled1D", 43>;
def SPV_C_Image1D : I32EnumAttrCase<"Image1D", 44>;
def SPV_C_SampledCubeArray : I32EnumAttrCase<"SampledCubeArray", 45>;
def SPV_C_SampledBuffer : I32EnumAttrCase<"SampledBuffer", 46>;
def SPV_C_ImageBuffer : I32EnumAttrCase<"ImageBuffer", 47>;
def SPV_C_ImageMSArray : I32EnumAttrCase<"ImageMSArray", 48>;
def SPV_C_StorageImageExtendedFormats : I32EnumAttrCase<"StorageImageExtendedFormats", 49>;
def SPV_C_ImageQuery : I32EnumAttrCase<"ImageQuery", 50>;
def SPV_C_DerivativeControl : I32EnumAttrCase<"DerivativeControl", 51>;
def SPV_C_InterpolationFunction : I32EnumAttrCase<"InterpolationFunction", 52>;
def SPV_C_TransformFeedback : I32EnumAttrCase<"TransformFeedback", 53>;
def SPV_C_GeometryStreams : I32EnumAttrCase<"GeometryStreams", 54>;
def SPV_C_StorageImageReadWithoutFormat : I32EnumAttrCase<"StorageImageReadWithoutFormat", 55>;
def SPV_C_StorageImageWriteWithoutFormat : I32EnumAttrCase<"StorageImageWriteWithoutFormat", 56>;
def SPV_C_MultiViewport : I32EnumAttrCase<"MultiViewport", 57>;
def SPV_C_SubgroupDispatch : I32EnumAttrCase<"SubgroupDispatch", 58>;
def SPV_C_NamedBarrier : I32EnumAttrCase<"NamedBarrier", 59>;
def SPV_C_PipeStorage : I32EnumAttrCase<"PipeStorage", 60>;
def SPV_C_GroupNonUniform : I32EnumAttrCase<"GroupNonUniform", 61>;
def SPV_C_GroupNonUniformVote : I32EnumAttrCase<"GroupNonUniformVote", 62>;
def SPV_C_GroupNonUniformArithmetic : I32EnumAttrCase<"GroupNonUniformArithmetic", 63>;
def SPV_C_GroupNonUniformBallot : I32EnumAttrCase<"GroupNonUniformBallot", 64>;
def SPV_C_GroupNonUniformShuffle : I32EnumAttrCase<"GroupNonUniformShuffle", 65>;
def SPV_C_GroupNonUniformShuffleRelative : I32EnumAttrCase<"GroupNonUniformShuffleRelative", 66>;
def SPV_C_GroupNonUniformClustered : I32EnumAttrCase<"GroupNonUniformClustered", 67>;
def SPV_C_GroupNonUniformQuad : I32EnumAttrCase<"GroupNonUniformQuad", 68>;
def SPV_C_SubgroupBallotKHR : I32EnumAttrCase<"SubgroupBallotKHR", 4423>;
def SPV_C_DrawParameters : I32EnumAttrCase<"DrawParameters", 4427>;
def SPV_C_SubgroupVoteKHR : I32EnumAttrCase<"SubgroupVoteKHR", 4431>;
def SPV_C_StorageBuffer16BitAccess : I32EnumAttrCase<"StorageBuffer16BitAccess", 4433>;
def SPV_C_UniformAndStorageBuffer16BitAccess : I32EnumAttrCase<"UniformAndStorageBuffer16BitAccess", 4434>;
def SPV_C_StoragePushConstant16 : I32EnumAttrCase<"StoragePushConstant16", 4435>;
def SPV_C_StorageInputOutput16 : I32EnumAttrCase<"StorageInputOutput16", 4436>;
def SPV_C_DeviceGroup : I32EnumAttrCase<"DeviceGroup", 4437>;
def SPV_C_MultiView : I32EnumAttrCase<"MultiView", 4439>;
def SPV_C_VariablePointersStorageBuffer : I32EnumAttrCase<"VariablePointersStorageBuffer", 4441>;
def SPV_C_VariablePointers : I32EnumAttrCase<"VariablePointers", 4442>;
def SPV_C_AtomicStorageOps : I32EnumAttrCase<"AtomicStorageOps", 4445>;
def SPV_C_SampleMaskPostDepthCoverage : I32EnumAttrCase<"SampleMaskPostDepthCoverage", 4447>;
def SPV_C_StorageBuffer8BitAccess : I32EnumAttrCase<"StorageBuffer8BitAccess", 4448>;
def SPV_C_UniformAndStorageBuffer8BitAccess : I32EnumAttrCase<"UniformAndStorageBuffer8BitAccess", 4449>;
def SPV_C_StoragePushConstant8 : I32EnumAttrCase<"StoragePushConstant8", 4450>;
def SPV_C_DenormPreserve : I32EnumAttrCase<"DenormPreserve", 4464>;
def SPV_C_DenormFlushToZero : I32EnumAttrCase<"DenormFlushToZero", 4465>;
def SPV_C_SignedZeroInfNanPreserve : I32EnumAttrCase<"SignedZeroInfNanPreserve", 4466>;
def SPV_C_RoundingModeRTE : I32EnumAttrCase<"RoundingModeRTE", 4467>;
def SPV_C_RoundingModeRTZ : I32EnumAttrCase<"RoundingModeRTZ", 4468>;
def SPV_C_Float16ImageAMD : I32EnumAttrCase<"Float16ImageAMD", 5008>;
def SPV_C_ImageGatherBiasLodAMD : I32EnumAttrCase<"ImageGatherBiasLodAMD", 5009>;
def SPV_C_FragmentMaskAMD : I32EnumAttrCase<"FragmentMaskAMD", 5010>;
def SPV_C_StencilExportEXT : I32EnumAttrCase<"StencilExportEXT", 5013>;
def SPV_C_ImageReadWriteLodAMD : I32EnumAttrCase<"ImageReadWriteLodAMD", 5015>;
def SPV_C_ShaderClockKHR : I32EnumAttrCase<"ShaderClockKHR", 5055>;
def SPV_C_SampleMaskOverrideCoverageNV : I32EnumAttrCase<"SampleMaskOverrideCoverageNV", 5249>;
def SPV_C_GeometryShaderPassthroughNV : I32EnumAttrCase<"GeometryShaderPassthroughNV", 5251>;
def SPV_C_ShaderViewportIndexLayerEXT : I32EnumAttrCase<"ShaderViewportIndexLayerEXT", 5254>;
def SPV_C_ShaderViewportMaskNV : I32EnumAttrCase<"ShaderViewportMaskNV", 5255>;
def SPV_C_ShaderStereoViewNV : I32EnumAttrCase<"ShaderStereoViewNV", 5259>;
def SPV_C_PerViewAttributesNV : I32EnumAttrCase<"PerViewAttributesNV", 5260>;
def SPV_C_FragmentFullyCoveredEXT : I32EnumAttrCase<"FragmentFullyCoveredEXT", 5265>;
def SPV_C_MeshShadingNV : I32EnumAttrCase<"MeshShadingNV", 5266>;
def SPV_C_ImageFootprintNV : I32EnumAttrCase<"ImageFootprintNV", 5282>;
def SPV_C_FragmentBarycentricNV : I32EnumAttrCase<"FragmentBarycentricNV", 5284>;
def SPV_C_ComputeDerivativeGroupQuadsNV : I32EnumAttrCase<"ComputeDerivativeGroupQuadsNV", 5288>;
def SPV_C_FragmentDensityEXT : I32EnumAttrCase<"FragmentDensityEXT", 5291>;
def SPV_C_GroupNonUniformPartitionedNV : I32EnumAttrCase<"GroupNonUniformPartitionedNV", 5297>;
def SPV_C_ShaderNonUniformEXT : I32EnumAttrCase<"ShaderNonUniformEXT", 5301>;
def SPV_C_RuntimeDescriptorArrayEXT : I32EnumAttrCase<"RuntimeDescriptorArrayEXT", 5302>;
def SPV_C_InputAttachmentArrayDynamicIndexingEXT : I32EnumAttrCase<"InputAttachmentArrayDynamicIndexingEXT", 5303>;
def SPV_C_UniformTexelBufferArrayDynamicIndexingEXT : I32EnumAttrCase<"UniformTexelBufferArrayDynamicIndexingEXT", 5304>;
def SPV_C_StorageTexelBufferArrayDynamicIndexingEXT : I32EnumAttrCase<"StorageTexelBufferArrayDynamicIndexingEXT", 5305>;
def SPV_C_UniformBufferArrayNonUniformIndexingEXT : I32EnumAttrCase<"UniformBufferArrayNonUniformIndexingEXT", 5306>;
def SPV_C_SampledImageArrayNonUniformIndexingEXT : I32EnumAttrCase<"SampledImageArrayNonUniformIndexingEXT", 5307>;
def SPV_C_StorageBufferArrayNonUniformIndexingEXT : I32EnumAttrCase<"StorageBufferArrayNonUniformIndexingEXT", 5308>;
def SPV_C_StorageImageArrayNonUniformIndexingEXT : I32EnumAttrCase<"StorageImageArrayNonUniformIndexingEXT", 5309>;
def SPV_C_InputAttachmentArrayNonUniformIndexingEXT : I32EnumAttrCase<"InputAttachmentArrayNonUniformIndexingEXT", 5310>;
def SPV_C_UniformTexelBufferArrayNonUniformIndexingEXT : I32EnumAttrCase<"UniformTexelBufferArrayNonUniformIndexingEXT", 5311>;
def SPV_C_StorageTexelBufferArrayNonUniformIndexingEXT : I32EnumAttrCase<"StorageTexelBufferArrayNonUniformIndexingEXT", 5312>;
def SPV_C_RayTracingNV : I32EnumAttrCase<"RayTracingNV", 5340>;
def SPV_C_VulkanMemoryModelKHR : I32EnumAttrCase<"VulkanMemoryModelKHR", 5345>;
def SPV_C_VulkanMemoryModelDeviceScopeKHR : I32EnumAttrCase<"VulkanMemoryModelDeviceScopeKHR", 5346>;
def SPV_C_PhysicalStorageBufferAddressesEXT : I32EnumAttrCase<"PhysicalStorageBufferAddressesEXT", 5347>;
def SPV_C_ComputeDerivativeGroupLinearNV : I32EnumAttrCase<"ComputeDerivativeGroupLinearNV", 5350>;
def SPV_C_CooperativeMatrixNV : I32EnumAttrCase<"CooperativeMatrixNV", 5357>;
def SPV_C_FragmentShaderSampleInterlockEXT : I32EnumAttrCase<"FragmentShaderSampleInterlockEXT", 5363>;
def SPV_C_FragmentShaderShadingRateInterlockEXT : I32EnumAttrCase<"FragmentShaderShadingRateInterlockEXT", 5372>;
def SPV_C_ShaderSMBuiltinsNV : I32EnumAttrCase<"ShaderSMBuiltinsNV", 5373>;
def SPV_C_FragmentShaderPixelInterlockEXT : I32EnumAttrCase<"FragmentShaderPixelInterlockEXT", 5378>;
def SPV_C_DemoteToHelperInvocationEXT : I32EnumAttrCase<"DemoteToHelperInvocationEXT", 5379>;
def SPV_C_SubgroupShuffleINTEL : I32EnumAttrCase<"SubgroupShuffleINTEL", 5568>;
def SPV_C_SubgroupBufferBlockIOINTEL : I32EnumAttrCase<"SubgroupBufferBlockIOINTEL", 5569>;
def SPV_C_SubgroupImageBlockIOINTEL : I32EnumAttrCase<"SubgroupImageBlockIOINTEL", 5570>;
def SPV_C_SubgroupImageMediaBlockIOINTEL : I32EnumAttrCase<"SubgroupImageMediaBlockIOINTEL", 5579>;
def SPV_C_IntegerFunctions2INTEL : I32EnumAttrCase<"IntegerFunctions2INTEL", 5584>;
def SPV_C_SubgroupAvcMotionEstimationINTEL : I32EnumAttrCase<"SubgroupAvcMotionEstimationINTEL", 5696>;
def SPV_C_SubgroupAvcMotionEstimationIntraINTEL : I32EnumAttrCase<"SubgroupAvcMotionEstimationIntraINTEL", 5697>;
def SPV_C_SubgroupAvcMotionEstimationChromaINTEL : I32EnumAttrCase<"SubgroupAvcMotionEstimationChromaINTEL", 5698>;
def SPV_CapabilityAttr :
I32EnumAttr<"Capability", "valid SPIR-V Capability", [
SPV_C_Matrix, SPV_C_Shader, SPV_C_Geometry, SPV_C_Tessellation,
SPV_C_Addresses, SPV_C_Linkage, SPV_C_Kernel, SPV_C_Vector16,
SPV_C_Float16Buffer, SPV_C_Float16, SPV_C_Float64, SPV_C_Int64,
SPV_C_Int64Atomics, SPV_C_ImageBasic, SPV_C_ImageReadWrite, SPV_C_ImageMipmap,
SPV_C_Pipes, SPV_C_Groups, SPV_C_DeviceEnqueue, SPV_C_LiteralSampler,
SPV_C_AtomicStorage, SPV_C_Int16, SPV_C_TessellationPointSize,
SPV_C_GeometryPointSize, SPV_C_ImageGatherExtended,
SPV_C_StorageImageMultisample, SPV_C_UniformBufferArrayDynamicIndexing,
SPV_C_SampledImageArrayDynamicIndexing,
SPV_C_StorageBufferArrayDynamicIndexing,
SPV_C_StorageImageArrayDynamicIndexing, SPV_C_ClipDistance, SPV_C_CullDistance,
SPV_C_ImageCubeArray, SPV_C_SampleRateShading, SPV_C_ImageRect,
SPV_C_SampledRect, SPV_C_GenericPointer, SPV_C_Int8, SPV_C_InputAttachment,
SPV_C_SparseResidency, SPV_C_MinLod, SPV_C_Sampled1D, SPV_C_Image1D,
SPV_C_SampledCubeArray, SPV_C_SampledBuffer, SPV_C_ImageBuffer,
SPV_C_ImageMSArray, SPV_C_StorageImageExtendedFormats, SPV_C_ImageQuery,
SPV_C_DerivativeControl, SPV_C_InterpolationFunction, SPV_C_TransformFeedback,
SPV_C_GeometryStreams, SPV_C_StorageImageReadWithoutFormat,
SPV_C_StorageImageWriteWithoutFormat, SPV_C_MultiViewport,
SPV_C_SubgroupDispatch, SPV_C_NamedBarrier, SPV_C_PipeStorage,
SPV_C_GroupNonUniform, SPV_C_GroupNonUniformVote,
SPV_C_GroupNonUniformArithmetic, SPV_C_GroupNonUniformBallot,
SPV_C_GroupNonUniformShuffle, SPV_C_GroupNonUniformShuffleRelative,
SPV_C_GroupNonUniformClustered, SPV_C_GroupNonUniformQuad,
SPV_C_SubgroupBallotKHR, SPV_C_DrawParameters, SPV_C_SubgroupVoteKHR,
SPV_C_StorageBuffer16BitAccess, SPV_C_UniformAndStorageBuffer16BitAccess,
SPV_C_StoragePushConstant16, SPV_C_StorageInputOutput16, SPV_C_DeviceGroup,
SPV_C_MultiView, SPV_C_VariablePointersStorageBuffer, SPV_C_VariablePointers,
SPV_C_AtomicStorageOps, SPV_C_SampleMaskPostDepthCoverage,
SPV_C_StorageBuffer8BitAccess, SPV_C_UniformAndStorageBuffer8BitAccess,
SPV_C_StoragePushConstant8, SPV_C_DenormPreserve, SPV_C_DenormFlushToZero,
SPV_C_SignedZeroInfNanPreserve, SPV_C_RoundingModeRTE, SPV_C_RoundingModeRTZ,
SPV_C_Float16ImageAMD, SPV_C_ImageGatherBiasLodAMD, SPV_C_FragmentMaskAMD,
SPV_C_StencilExportEXT, SPV_C_ImageReadWriteLodAMD, SPV_C_ShaderClockKHR,
SPV_C_SampleMaskOverrideCoverageNV, SPV_C_GeometryShaderPassthroughNV,
SPV_C_ShaderViewportIndexLayerEXT, SPV_C_ShaderViewportMaskNV,
SPV_C_ShaderStereoViewNV, SPV_C_PerViewAttributesNV,
SPV_C_FragmentFullyCoveredEXT, SPV_C_MeshShadingNV, SPV_C_ImageFootprintNV,
SPV_C_FragmentBarycentricNV, SPV_C_ComputeDerivativeGroupQuadsNV,
SPV_C_FragmentDensityEXT, SPV_C_GroupNonUniformPartitionedNV,
SPV_C_ShaderNonUniformEXT, SPV_C_RuntimeDescriptorArrayEXT,
SPV_C_InputAttachmentArrayDynamicIndexingEXT,
SPV_C_UniformTexelBufferArrayDynamicIndexingEXT,
SPV_C_StorageTexelBufferArrayDynamicIndexingEXT,
SPV_C_UniformBufferArrayNonUniformIndexingEXT,
SPV_C_SampledImageArrayNonUniformIndexingEXT,
SPV_C_StorageBufferArrayNonUniformIndexingEXT,
SPV_C_StorageImageArrayNonUniformIndexingEXT,
SPV_C_InputAttachmentArrayNonUniformIndexingEXT,
SPV_C_UniformTexelBufferArrayNonUniformIndexingEXT,
SPV_C_StorageTexelBufferArrayNonUniformIndexingEXT, SPV_C_RayTracingNV,
SPV_C_VulkanMemoryModelKHR, SPV_C_VulkanMemoryModelDeviceScopeKHR,
SPV_C_PhysicalStorageBufferAddressesEXT, SPV_C_ComputeDerivativeGroupLinearNV,
SPV_C_CooperativeMatrixNV, SPV_C_FragmentShaderSampleInterlockEXT,
SPV_C_FragmentShaderShadingRateInterlockEXT, SPV_C_ShaderSMBuiltinsNV,
SPV_C_FragmentShaderPixelInterlockEXT, SPV_C_DemoteToHelperInvocationEXT,
SPV_C_SubgroupShuffleINTEL, SPV_C_SubgroupBufferBlockIOINTEL,
SPV_C_SubgroupImageBlockIOINTEL, SPV_C_SubgroupImageMediaBlockIOINTEL,
SPV_C_IntegerFunctions2INTEL, SPV_C_SubgroupAvcMotionEstimationINTEL,
SPV_C_SubgroupAvcMotionEstimationIntraINTEL,
SPV_C_SubgroupAvcMotionEstimationChromaINTEL
]> {
let returnType = "::mlir::spirv::Capability";
let convertFromStorage = "static_cast<::mlir::spirv::Capability>($_self.getInt())";
let cppNamespace = "::mlir::spirv";
}
def SPV_D_RelaxedPrecision : I32EnumAttrCase<"RelaxedPrecision", 0>;
def SPV_D_SpecId : I32EnumAttrCase<"SpecId", 1>;
def SPV_D_Block : I32EnumAttrCase<"Block", 2>;

View File

@ -1026,6 +1026,17 @@ static LogicalResult verify(spirv::ModuleOp moduleOp) {
"functions in 'spv.module' can only contain spv.* ops");
}
}
// Verify capabilities. ODS already guarantees that we have an array of
// string attributes.
if (auto caps = moduleOp.getAttrOfType<ArrayAttr>("capabilities")) {
for (auto cap : caps.getValue()) {
auto capStr = cap.cast<StringAttr>().getValue();
if (!spirv::symbolizeCapability(capStr))
return moduleOp.emitOpError("uses unknown capability: ") << capStr;
}
}
return success();
}

View File

@ -29,6 +29,7 @@
#include "mlir/Support/LogicalResult.h"
#include "mlir/Support/StringExtras.h"
#include "llvm/ADT/Sequence.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/bit.h"
@ -76,6 +77,13 @@ private:
/// Processes SPIR-V module header in `binary`.
LogicalResult processHeader();
/// Processes the SPIR-V OpCapability with `operands` and updates bookkeeping
/// in the deserializer.
LogicalResult processCapability(ArrayRef<uint32_t> operands);
/// Attaches all collected capabilites to `module` as an attribute.
void attachCapabilities();
/// Processes the SPIR-V OpMemoryModel with `operands` and updates `module`.
LogicalResult processMemoryModel(ArrayRef<uint32_t> operands);
@ -225,6 +233,9 @@ private:
OpBuilder opBuilder;
/// The list of capabilities used by the module.
llvm::SmallSetVector<spirv::Capability, 4> capabilities;
// Result <id> to type mapping.
DenseMap<uint32_t, Type> typeMap;
@ -305,6 +316,9 @@ LogicalResult Deserializer::deserialize() {
}
}
// Attaches the capabilities as an attribute to the module.
attachCapabilities();
return success();
}
@ -337,6 +351,32 @@ LogicalResult Deserializer::processHeader() {
return success();
}
LogicalResult Deserializer::processCapability(ArrayRef<uint32_t> operands) {
if (operands.size() != 1)
return emitError(unknownLoc, "OpMemoryModel must have one parameter");
auto cap = spirv::symbolizeCapability(operands[0]);
if (!cap)
return emitError(unknownLoc, "unknown capability: ") << operands[0];
capabilities.insert(*cap);
return success();
}
void Deserializer::attachCapabilities() {
if (capabilities.empty())
return;
SmallVector<StringRef, 2> caps;
caps.reserve(capabilities.size());
for (auto cap : capabilities) {
caps.push_back(spirv::stringifyCapability(cap));
}
module->setAttr("capabilities", opBuilder.getStrArrayAttr(caps));
}
LogicalResult Deserializer::processMemoryModel(ArrayRef<uint32_t> operands) {
if (operands.size() != 2)
return emitError(unknownLoc, "OpMemoryModel must have two operands");
@ -1102,6 +1142,8 @@ LogicalResult Deserializer::processInstruction(spirv::Opcode opcode,
// First dispatch all the instructions whose opcode does not correspond to
// those that have a direct mirror in the SPIR-V dialect
switch (opcode) {
case spirv::Opcode::OpCapability:
return processCapability(operands);
case spirv::Opcode::OpMemoryModel:
return processMemoryModel(operands);
case spirv::Opcode::OpEntryPoint:

View File

@ -130,7 +130,9 @@ private:
return funcIDMap.lookup(fnName);
}
LogicalResult processMemoryModel();
void processCapability();
void processMemoryModel();
LogicalResult processConstantOp(spirv::ConstantOp op);
@ -318,6 +320,7 @@ LogicalResult Serializer::serialize() {
return failure();
// TODO(antiagainst): handle the other sections
processCapability();
processMemoryModel();
// Iterate over the module body to serialze it. Assumptions are that there is
@ -356,12 +359,24 @@ void Serializer::collect(SmallVectorImpl<uint32_t> &binary) {
// Module structure
//===----------------------------------------------------------------------===//
LogicalResult Serializer::processMemoryModel() {
void Serializer::processCapability() {
auto caps = module.getAttrOfType<ArrayAttr>("capabilities");
if (!caps)
return;
for (auto cap : caps.getValue()) {
auto capStr = cap.cast<StringAttr>().getValue();
auto capVal = spirv::symbolizeCapability(capStr);
encodeInstructionInto(capabilities, spirv::Opcode::OpCapability,
{static_cast<uint32_t>(*capVal)});
}
}
void Serializer::processMemoryModel() {
uint32_t mm = module.getAttrOfType<IntegerAttr>("memory_model").getInt();
uint32_t am = module.getAttrOfType<IntegerAttr>("addressing_model").getInt();
return encodeInstructionInto(memoryModel, spirv::Opcode::OpMemoryModel,
{am, mm});
encodeInstructionInto(memoryModel, spirv::Opcode::OpMemoryModel, {am, mm});
}
LogicalResult Serializer::processConstantOp(spirv::ConstantOp op) {

View File

@ -0,0 +1,7 @@
// RUN: mlir-translate -serialize-spirv %s | mlir-translate -deserialize-spirv | FileCheck %s
spv.module "Logical" "GLSL450" {
} attributes {
// CHECK: capabilities = ["Shader", "Float16"]
capabilities = ["Shader", "Float16"]
}

View File

@ -367,6 +367,14 @@ spv.module "Logical" "VulkanKHR" {
// -----
// expected-error @+1 {{uses unknown capability: MyAwesomeCapability}}
spv.module "Logical" "GLSL450" {
} attributes {
capabilities = ["MyAwesomeCapability"]
}
// -----
//===----------------------------------------------------------------------===//
// spv._module_end
//===----------------------------------------------------------------------===//