build ios SPIRV-Cross on tag 2021-01-15 (#128)
This commit is contained in:
parent
58f1f1e1f5
commit
8eec924e33
|
|
@ -0,0 +1 @@
|
||||||
|
**/.DS_Store
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -50,11 +50,11 @@ namespace spv {
|
||||||
typedef unsigned int Id;
|
typedef unsigned int Id;
|
||||||
|
|
||||||
#define SPV_VERSION 0x10500
|
#define SPV_VERSION 0x10500
|
||||||
#define SPV_REVISION 1
|
#define SPV_REVISION 4
|
||||||
|
|
||||||
static const unsigned int MagicNumber = 0x07230203;
|
static const unsigned int MagicNumber = 0x07230203;
|
||||||
static const unsigned int Version = 0x00010500;
|
static const unsigned int Version = 0x00010500;
|
||||||
static const unsigned int Revision = 1;
|
static const unsigned int Revision = 4;
|
||||||
static const unsigned int OpCodeMask = 0xffff;
|
static const unsigned int OpCodeMask = 0xffff;
|
||||||
static const unsigned int WordCountShift = 16;
|
static const unsigned int WordCountShift = 16;
|
||||||
|
|
||||||
|
|
@ -168,6 +168,10 @@ enum ExecutionMode {
|
||||||
ExecutionModeSampleInterlockUnorderedEXT = 5369,
|
ExecutionModeSampleInterlockUnorderedEXT = 5369,
|
||||||
ExecutionModeShadingRateInterlockOrderedEXT = 5370,
|
ExecutionModeShadingRateInterlockOrderedEXT = 5370,
|
||||||
ExecutionModeShadingRateInterlockUnorderedEXT = 5371,
|
ExecutionModeShadingRateInterlockUnorderedEXT = 5371,
|
||||||
|
ExecutionModeMaxWorkgroupSizeINTEL = 5893,
|
||||||
|
ExecutionModeMaxWorkDimINTEL = 5894,
|
||||||
|
ExecutionModeNoGlobalOffsetINTEL = 5895,
|
||||||
|
ExecutionModeNumSIMDWorkitemsINTEL = 5896,
|
||||||
ExecutionModeMax = 0x7fffffff,
|
ExecutionModeMax = 0x7fffffff,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -199,6 +203,7 @@ enum StorageClass {
|
||||||
StorageClassShaderRecordBufferNV = 5343,
|
StorageClassShaderRecordBufferNV = 5343,
|
||||||
StorageClassPhysicalStorageBuffer = 5349,
|
StorageClassPhysicalStorageBuffer = 5349,
|
||||||
StorageClassPhysicalStorageBufferEXT = 5349,
|
StorageClassPhysicalStorageBufferEXT = 5349,
|
||||||
|
StorageClassCodeSectionINTEL = 5605,
|
||||||
StorageClassMax = 0x7fffffff,
|
StorageClassMax = 0x7fffffff,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -269,6 +274,8 @@ enum ImageFormat {
|
||||||
ImageFormatRg8ui = 37,
|
ImageFormatRg8ui = 37,
|
||||||
ImageFormatR16ui = 38,
|
ImageFormatR16ui = 38,
|
||||||
ImageFormatR8ui = 39,
|
ImageFormatR8ui = 39,
|
||||||
|
ImageFormatR64ui = 40,
|
||||||
|
ImageFormatR64i = 41,
|
||||||
ImageFormatMax = 0x7fffffff,
|
ImageFormatMax = 0x7fffffff,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -477,11 +484,24 @@ enum Decoration {
|
||||||
DecorationRestrictPointerEXT = 5355,
|
DecorationRestrictPointerEXT = 5355,
|
||||||
DecorationAliasedPointer = 5356,
|
DecorationAliasedPointer = 5356,
|
||||||
DecorationAliasedPointerEXT = 5356,
|
DecorationAliasedPointerEXT = 5356,
|
||||||
|
DecorationReferencedIndirectlyINTEL = 5602,
|
||||||
DecorationCounterBuffer = 5634,
|
DecorationCounterBuffer = 5634,
|
||||||
DecorationHlslCounterBufferGOOGLE = 5634,
|
DecorationHlslCounterBufferGOOGLE = 5634,
|
||||||
DecorationHlslSemanticGOOGLE = 5635,
|
DecorationHlslSemanticGOOGLE = 5635,
|
||||||
DecorationUserSemantic = 5635,
|
DecorationUserSemantic = 5635,
|
||||||
DecorationUserTypeGOOGLE = 5636,
|
DecorationUserTypeGOOGLE = 5636,
|
||||||
|
DecorationRegisterINTEL = 5825,
|
||||||
|
DecorationMemoryINTEL = 5826,
|
||||||
|
DecorationNumbanksINTEL = 5827,
|
||||||
|
DecorationBankwidthINTEL = 5828,
|
||||||
|
DecorationMaxPrivateCopiesINTEL = 5829,
|
||||||
|
DecorationSinglepumpINTEL = 5830,
|
||||||
|
DecorationDoublepumpINTEL = 5831,
|
||||||
|
DecorationMaxReplicatesINTEL = 5832,
|
||||||
|
DecorationSimpleDualPortINTEL = 5833,
|
||||||
|
DecorationMergeINTEL = 5834,
|
||||||
|
DecorationBankBitsINTEL = 5835,
|
||||||
|
DecorationForcePow2DepthINTEL = 5836,
|
||||||
DecorationMax = 0x7fffffff,
|
DecorationMax = 0x7fffffff,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -540,8 +560,10 @@ enum BuiltIn {
|
||||||
BuiltInBaseVertex = 4424,
|
BuiltInBaseVertex = 4424,
|
||||||
BuiltInBaseInstance = 4425,
|
BuiltInBaseInstance = 4425,
|
||||||
BuiltInDrawIndex = 4426,
|
BuiltInDrawIndex = 4426,
|
||||||
|
BuiltInPrimitiveShadingRateKHR = 4432,
|
||||||
BuiltInDeviceIndex = 4438,
|
BuiltInDeviceIndex = 4438,
|
||||||
BuiltInViewIndex = 4440,
|
BuiltInViewIndex = 4440,
|
||||||
|
BuiltInShadingRateKHR = 4444,
|
||||||
BuiltInBaryCoordNoPerspAMD = 4992,
|
BuiltInBaryCoordNoPerspAMD = 4992,
|
||||||
BuiltInBaryCoordNoPerspCentroidAMD = 4993,
|
BuiltInBaryCoordNoPerspCentroidAMD = 4993,
|
||||||
BuiltInBaryCoordNoPerspSampleAMD = 4994,
|
BuiltInBaryCoordNoPerspSampleAMD = 4994,
|
||||||
|
|
@ -592,7 +614,6 @@ enum BuiltIn {
|
||||||
BuiltInObjectToWorldNV = 5330,
|
BuiltInObjectToWorldNV = 5330,
|
||||||
BuiltInWorldToObjectKHR = 5331,
|
BuiltInWorldToObjectKHR = 5331,
|
||||||
BuiltInWorldToObjectNV = 5331,
|
BuiltInWorldToObjectNV = 5331,
|
||||||
BuiltInHitTKHR = 5332,
|
|
||||||
BuiltInHitTNV = 5332,
|
BuiltInHitTNV = 5332,
|
||||||
BuiltInHitKindKHR = 5333,
|
BuiltInHitKindKHR = 5333,
|
||||||
BuiltInHitKindNV = 5333,
|
BuiltInHitKindNV = 5333,
|
||||||
|
|
@ -628,6 +649,13 @@ enum LoopControlShift {
|
||||||
LoopControlIterationMultipleShift = 6,
|
LoopControlIterationMultipleShift = 6,
|
||||||
LoopControlPeelCountShift = 7,
|
LoopControlPeelCountShift = 7,
|
||||||
LoopControlPartialCountShift = 8,
|
LoopControlPartialCountShift = 8,
|
||||||
|
LoopControlInitiationIntervalINTELShift = 16,
|
||||||
|
LoopControlMaxConcurrencyINTELShift = 17,
|
||||||
|
LoopControlDependencyArrayINTELShift = 18,
|
||||||
|
LoopControlPipelineEnableINTELShift = 19,
|
||||||
|
LoopControlLoopCoalesceINTELShift = 20,
|
||||||
|
LoopControlMaxInterleavingINTELShift = 21,
|
||||||
|
LoopControlSpeculatedIterationsINTELShift = 22,
|
||||||
LoopControlMax = 0x7fffffff,
|
LoopControlMax = 0x7fffffff,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -642,6 +670,13 @@ enum LoopControlMask {
|
||||||
LoopControlIterationMultipleMask = 0x00000040,
|
LoopControlIterationMultipleMask = 0x00000040,
|
||||||
LoopControlPeelCountMask = 0x00000080,
|
LoopControlPeelCountMask = 0x00000080,
|
||||||
LoopControlPartialCountMask = 0x00000100,
|
LoopControlPartialCountMask = 0x00000100,
|
||||||
|
LoopControlInitiationIntervalINTELMask = 0x00010000,
|
||||||
|
LoopControlMaxConcurrencyINTELMask = 0x00020000,
|
||||||
|
LoopControlDependencyArrayINTELMask = 0x00040000,
|
||||||
|
LoopControlPipelineEnableINTELMask = 0x00080000,
|
||||||
|
LoopControlLoopCoalesceINTELMask = 0x00100000,
|
||||||
|
LoopControlMaxInterleavingINTELMask = 0x00200000,
|
||||||
|
LoopControlSpeculatedIterationsINTELMask = 0x00400000,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum FunctionControlShift {
|
enum FunctionControlShift {
|
||||||
|
|
@ -838,6 +873,7 @@ enum Capability {
|
||||||
CapabilityGroupNonUniformQuad = 68,
|
CapabilityGroupNonUniformQuad = 68,
|
||||||
CapabilityShaderLayer = 69,
|
CapabilityShaderLayer = 69,
|
||||||
CapabilityShaderViewportIndex = 70,
|
CapabilityShaderViewportIndex = 70,
|
||||||
|
CapabilityFragmentShadingRateKHR = 4422,
|
||||||
CapabilitySubgroupBallotKHR = 4423,
|
CapabilitySubgroupBallotKHR = 4423,
|
||||||
CapabilityDrawParameters = 4427,
|
CapabilityDrawParameters = 4427,
|
||||||
CapabilitySubgroupVoteKHR = 4431,
|
CapabilitySubgroupVoteKHR = 4431,
|
||||||
|
|
@ -862,12 +898,15 @@ enum Capability {
|
||||||
CapabilityRoundingModeRTE = 4467,
|
CapabilityRoundingModeRTE = 4467,
|
||||||
CapabilityRoundingModeRTZ = 4468,
|
CapabilityRoundingModeRTZ = 4468,
|
||||||
CapabilityRayQueryProvisionalKHR = 4471,
|
CapabilityRayQueryProvisionalKHR = 4471,
|
||||||
CapabilityRayTraversalPrimitiveCullingProvisionalKHR = 4478,
|
CapabilityRayQueryKHR = 4472,
|
||||||
|
CapabilityRayTraversalPrimitiveCullingKHR = 4478,
|
||||||
|
CapabilityRayTracingKHR = 4479,
|
||||||
CapabilityFloat16ImageAMD = 5008,
|
CapabilityFloat16ImageAMD = 5008,
|
||||||
CapabilityImageGatherBiasLodAMD = 5009,
|
CapabilityImageGatherBiasLodAMD = 5009,
|
||||||
CapabilityFragmentMaskAMD = 5010,
|
CapabilityFragmentMaskAMD = 5010,
|
||||||
CapabilityStencilExportEXT = 5013,
|
CapabilityStencilExportEXT = 5013,
|
||||||
CapabilityImageReadWriteLodAMD = 5015,
|
CapabilityImageReadWriteLodAMD = 5015,
|
||||||
|
CapabilityInt64ImageEXT = 5016,
|
||||||
CapabilityShaderClockKHR = 5055,
|
CapabilityShaderClockKHR = 5055,
|
||||||
CapabilitySampleMaskOverrideCoverageNV = 5249,
|
CapabilitySampleMaskOverrideCoverageNV = 5249,
|
||||||
CapabilityGeometryShaderPassthroughNV = 5251,
|
CapabilityGeometryShaderPassthroughNV = 5251,
|
||||||
|
|
@ -928,9 +967,20 @@ enum Capability {
|
||||||
CapabilitySubgroupImageBlockIOINTEL = 5570,
|
CapabilitySubgroupImageBlockIOINTEL = 5570,
|
||||||
CapabilitySubgroupImageMediaBlockIOINTEL = 5579,
|
CapabilitySubgroupImageMediaBlockIOINTEL = 5579,
|
||||||
CapabilityIntegerFunctions2INTEL = 5584,
|
CapabilityIntegerFunctions2INTEL = 5584,
|
||||||
|
CapabilityFunctionPointersINTEL = 5603,
|
||||||
|
CapabilityIndirectReferencesINTEL = 5604,
|
||||||
CapabilitySubgroupAvcMotionEstimationINTEL = 5696,
|
CapabilitySubgroupAvcMotionEstimationINTEL = 5696,
|
||||||
CapabilitySubgroupAvcMotionEstimationIntraINTEL = 5697,
|
CapabilitySubgroupAvcMotionEstimationIntraINTEL = 5697,
|
||||||
CapabilitySubgroupAvcMotionEstimationChromaINTEL = 5698,
|
CapabilitySubgroupAvcMotionEstimationChromaINTEL = 5698,
|
||||||
|
CapabilityFPGAMemoryAttributesINTEL = 5824,
|
||||||
|
CapabilityUnstructuredLoopControlsINTEL = 5886,
|
||||||
|
CapabilityFPGALoopControlsINTEL = 5888,
|
||||||
|
CapabilityKernelAttributesINTEL = 5892,
|
||||||
|
CapabilityFPGAKernelAttributesINTEL = 5897,
|
||||||
|
CapabilityBlockingPipesINTEL = 5945,
|
||||||
|
CapabilityFPGARegINTEL = 5948,
|
||||||
|
CapabilityAtomicFloat32AddEXT = 6033,
|
||||||
|
CapabilityAtomicFloat64AddEXT = 6034,
|
||||||
CapabilityMax = 0x7fffffff,
|
CapabilityMax = 0x7fffffff,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -981,6 +1031,22 @@ enum RayQueryCandidateIntersectionType {
|
||||||
RayQueryCandidateIntersectionTypeMax = 0x7fffffff,
|
RayQueryCandidateIntersectionTypeMax = 0x7fffffff,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum FragmentShadingRateShift {
|
||||||
|
FragmentShadingRateVertical2PixelsShift = 0,
|
||||||
|
FragmentShadingRateVertical4PixelsShift = 1,
|
||||||
|
FragmentShadingRateHorizontal2PixelsShift = 2,
|
||||||
|
FragmentShadingRateHorizontal4PixelsShift = 3,
|
||||||
|
FragmentShadingRateMax = 0x7fffffff,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum FragmentShadingRateMask {
|
||||||
|
FragmentShadingRateMaskNone = 0,
|
||||||
|
FragmentShadingRateVertical2PixelsMask = 0x00000001,
|
||||||
|
FragmentShadingRateVertical4PixelsMask = 0x00000002,
|
||||||
|
FragmentShadingRateHorizontal2PixelsMask = 0x00000004,
|
||||||
|
FragmentShadingRateHorizontal4PixelsMask = 0x00000008,
|
||||||
|
};
|
||||||
|
|
||||||
enum Op {
|
enum Op {
|
||||||
OpNop = 0,
|
OpNop = 0,
|
||||||
OpUndef = 1,
|
OpUndef = 1,
|
||||||
|
|
@ -1326,13 +1392,19 @@ enum Op {
|
||||||
OpPtrEqual = 401,
|
OpPtrEqual = 401,
|
||||||
OpPtrNotEqual = 402,
|
OpPtrNotEqual = 402,
|
||||||
OpPtrDiff = 403,
|
OpPtrDiff = 403,
|
||||||
|
OpTerminateInvocation = 4416,
|
||||||
OpSubgroupBallotKHR = 4421,
|
OpSubgroupBallotKHR = 4421,
|
||||||
OpSubgroupFirstInvocationKHR = 4422,
|
OpSubgroupFirstInvocationKHR = 4422,
|
||||||
OpSubgroupAllKHR = 4428,
|
OpSubgroupAllKHR = 4428,
|
||||||
OpSubgroupAnyKHR = 4429,
|
OpSubgroupAnyKHR = 4429,
|
||||||
OpSubgroupAllEqualKHR = 4430,
|
OpSubgroupAllEqualKHR = 4430,
|
||||||
OpSubgroupReadInvocationKHR = 4432,
|
OpSubgroupReadInvocationKHR = 4432,
|
||||||
OpTypeRayQueryProvisionalKHR = 4472,
|
OpTraceRayKHR = 4445,
|
||||||
|
OpExecuteCallableKHR = 4446,
|
||||||
|
OpConvertUToAccelerationStructureKHR = 4447,
|
||||||
|
OpIgnoreIntersectionKHR = 4448,
|
||||||
|
OpTerminateRayKHR = 4449,
|
||||||
|
OpTypeRayQueryKHR = 4472,
|
||||||
OpRayQueryInitializeKHR = 4473,
|
OpRayQueryInitializeKHR = 4473,
|
||||||
OpRayQueryTerminateKHR = 4474,
|
OpRayQueryTerminateKHR = 4474,
|
||||||
OpRayQueryGenerateIntersectionKHR = 4475,
|
OpRayQueryGenerateIntersectionKHR = 4475,
|
||||||
|
|
@ -1355,15 +1427,11 @@ enum Op {
|
||||||
OpWritePackedPrimitiveIndices4x8NV = 5299,
|
OpWritePackedPrimitiveIndices4x8NV = 5299,
|
||||||
OpReportIntersectionKHR = 5334,
|
OpReportIntersectionKHR = 5334,
|
||||||
OpReportIntersectionNV = 5334,
|
OpReportIntersectionNV = 5334,
|
||||||
OpIgnoreIntersectionKHR = 5335,
|
|
||||||
OpIgnoreIntersectionNV = 5335,
|
OpIgnoreIntersectionNV = 5335,
|
||||||
OpTerminateRayKHR = 5336,
|
|
||||||
OpTerminateRayNV = 5336,
|
OpTerminateRayNV = 5336,
|
||||||
OpTraceNV = 5337,
|
OpTraceNV = 5337,
|
||||||
OpTraceRayKHR = 5337,
|
|
||||||
OpTypeAccelerationStructureKHR = 5341,
|
OpTypeAccelerationStructureKHR = 5341,
|
||||||
OpTypeAccelerationStructureNV = 5341,
|
OpTypeAccelerationStructureNV = 5341,
|
||||||
OpExecuteCallableKHR = 5344,
|
|
||||||
OpExecuteCallableNV = 5344,
|
OpExecuteCallableNV = 5344,
|
||||||
OpTypeCooperativeMatrixNV = 5358,
|
OpTypeCooperativeMatrixNV = 5358,
|
||||||
OpCooperativeMatrixLoadNV = 5359,
|
OpCooperativeMatrixLoadNV = 5359,
|
||||||
|
|
@ -1398,6 +1466,8 @@ enum Op {
|
||||||
OpUSubSatINTEL = 5596,
|
OpUSubSatINTEL = 5596,
|
||||||
OpIMul32x16INTEL = 5597,
|
OpIMul32x16INTEL = 5597,
|
||||||
OpUMul32x16INTEL = 5598,
|
OpUMul32x16INTEL = 5598,
|
||||||
|
OpFunctionPointerINTEL = 5600,
|
||||||
|
OpFunctionPointerCallINTEL = 5601,
|
||||||
OpDecorateString = 5632,
|
OpDecorateString = 5632,
|
||||||
OpDecorateStringGOOGLE = 5632,
|
OpDecorateStringGOOGLE = 5632,
|
||||||
OpMemberDecorateString = 5633,
|
OpMemberDecorateString = 5633,
|
||||||
|
|
@ -1520,6 +1590,10 @@ enum Op {
|
||||||
OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL = 5814,
|
OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL = 5814,
|
||||||
OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL = 5815,
|
OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL = 5815,
|
||||||
OpSubgroupAvcSicGetInterRawSadsINTEL = 5816,
|
OpSubgroupAvcSicGetInterRawSadsINTEL = 5816,
|
||||||
|
OpLoopControlINTEL = 5887,
|
||||||
|
OpReadPipeBlockingINTEL = 5946,
|
||||||
|
OpWritePipeBlockingINTEL = 5947,
|
||||||
|
OpFPGARegINTEL = 5949,
|
||||||
OpRayQueryGetRayTMinKHR = 6016,
|
OpRayQueryGetRayTMinKHR = 6016,
|
||||||
OpRayQueryGetRayFlagsKHR = 6017,
|
OpRayQueryGetRayFlagsKHR = 6017,
|
||||||
OpRayQueryGetIntersectionTKHR = 6018,
|
OpRayQueryGetIntersectionTKHR = 6018,
|
||||||
|
|
@ -1537,6 +1611,7 @@ enum Op {
|
||||||
OpRayQueryGetWorldRayOriginKHR = 6030,
|
OpRayQueryGetWorldRayOriginKHR = 6030,
|
||||||
OpRayQueryGetIntersectionObjectToWorldKHR = 6031,
|
OpRayQueryGetIntersectionObjectToWorldKHR = 6031,
|
||||||
OpRayQueryGetIntersectionWorldToObjectKHR = 6032,
|
OpRayQueryGetIntersectionWorldToObjectKHR = 6032,
|
||||||
|
OpAtomicFAddEXT = 6035,
|
||||||
OpMax = 0x7fffffff,
|
OpMax = 0x7fffffff,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1889,12 +1964,25 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
|
||||||
case OpPtrEqual: *hasResult = true; *hasResultType = true; break;
|
case OpPtrEqual: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpPtrNotEqual: *hasResult = true; *hasResultType = true; break;
|
case OpPtrNotEqual: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpPtrDiff: *hasResult = true; *hasResultType = true; break;
|
case OpPtrDiff: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpTerminateInvocation: *hasResult = false; *hasResultType = false; break;
|
||||||
case OpSubgroupBallotKHR: *hasResult = true; *hasResultType = true; break;
|
case OpSubgroupBallotKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpSubgroupFirstInvocationKHR: *hasResult = true; *hasResultType = true; break;
|
case OpSubgroupFirstInvocationKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpSubgroupAllKHR: *hasResult = true; *hasResultType = true; break;
|
case OpSubgroupAllKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpSubgroupAnyKHR: *hasResult = true; *hasResultType = true; break;
|
case OpSubgroupAnyKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpSubgroupAllEqualKHR: *hasResult = true; *hasResultType = true; break;
|
case OpSubgroupAllEqualKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpSubgroupReadInvocationKHR: *hasResult = true; *hasResultType = true; break;
|
case OpSubgroupReadInvocationKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpTraceRayKHR: *hasResult = false; *hasResultType = false; break;
|
||||||
|
case OpExecuteCallableKHR: *hasResult = false; *hasResultType = false; break;
|
||||||
|
case OpConvertUToAccelerationStructureKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpIgnoreIntersectionKHR: *hasResult = false; *hasResultType = false; break;
|
||||||
|
case OpTerminateRayKHR: *hasResult = false; *hasResultType = false; break;
|
||||||
|
case OpTypeRayQueryKHR: *hasResult = true; *hasResultType = false; break;
|
||||||
|
case OpRayQueryInitializeKHR: *hasResult = false; *hasResultType = false; break;
|
||||||
|
case OpRayQueryTerminateKHR: *hasResult = false; *hasResultType = false; break;
|
||||||
|
case OpRayQueryGenerateIntersectionKHR: *hasResult = false; *hasResultType = false; break;
|
||||||
|
case OpRayQueryConfirmIntersectionKHR: *hasResult = false; *hasResultType = false; break;
|
||||||
|
case OpRayQueryProceedKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetIntersectionTypeKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpGroupIAddNonUniformAMD: *hasResult = true; *hasResultType = true; break;
|
case OpGroupIAddNonUniformAMD: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpGroupFAddNonUniformAMD: *hasResult = true; *hasResultType = true; break;
|
case OpGroupFAddNonUniformAMD: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpGroupFMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;
|
case OpGroupFMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;
|
||||||
|
|
@ -1914,30 +2002,6 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
|
||||||
case OpTerminateRayNV: *hasResult = false; *hasResultType = false; break;
|
case OpTerminateRayNV: *hasResult = false; *hasResultType = false; break;
|
||||||
case OpTraceNV: *hasResult = false; *hasResultType = false; break;
|
case OpTraceNV: *hasResult = false; *hasResultType = false; break;
|
||||||
case OpTypeAccelerationStructureNV: *hasResult = true; *hasResultType = false; break;
|
case OpTypeAccelerationStructureNV: *hasResult = true; *hasResultType = false; break;
|
||||||
case OpTypeRayQueryProvisionalKHR: *hasResult = true; *hasResultType = false; break;
|
|
||||||
case OpRayQueryInitializeKHR: *hasResult = false; *hasResultType = false; break;
|
|
||||||
case OpRayQueryTerminateKHR: *hasResult = false; *hasResultType = false; break;
|
|
||||||
case OpRayQueryGenerateIntersectionKHR: *hasResult = false; *hasResultType = false; break;
|
|
||||||
case OpRayQueryConfirmIntersectionKHR: *hasResult = false; *hasResultType = false; break;
|
|
||||||
case OpRayQueryProceedKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetIntersectionTypeKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetRayTMinKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetRayFlagsKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetIntersectionTKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetIntersectionInstanceCustomIndexKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetIntersectionInstanceIdKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetIntersectionGeometryIndexKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetIntersectionPrimitiveIndexKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetIntersectionBarycentricsKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetIntersectionFrontFaceKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetIntersectionCandidateAABBOpaqueKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetIntersectionObjectRayDirectionKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetIntersectionObjectRayOriginKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetWorldRayDirectionKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetWorldRayOriginKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetIntersectionObjectToWorldKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpRayQueryGetIntersectionWorldToObjectKHR: *hasResult = true; *hasResultType = true; break;
|
|
||||||
case OpExecuteCallableNV: *hasResult = false; *hasResultType = false; break;
|
case OpExecuteCallableNV: *hasResult = false; *hasResultType = false; break;
|
||||||
case OpTypeCooperativeMatrixNV: *hasResult = true; *hasResultType = false; break;
|
case OpTypeCooperativeMatrixNV: *hasResult = true; *hasResultType = false; break;
|
||||||
case OpCooperativeMatrixLoadNV: *hasResult = true; *hasResultType = true; break;
|
case OpCooperativeMatrixLoadNV: *hasResult = true; *hasResultType = true; break;
|
||||||
|
|
@ -1972,6 +2036,8 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
|
||||||
case OpUSubSatINTEL: *hasResult = true; *hasResultType = true; break;
|
case OpUSubSatINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpIMul32x16INTEL: *hasResult = true; *hasResultType = true; break;
|
case OpIMul32x16INTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpUMul32x16INTEL: *hasResult = true; *hasResultType = true; break;
|
case OpUMul32x16INTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpFunctionPointerINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpFunctionPointerCallINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpDecorateString: *hasResult = false; *hasResultType = false; break;
|
case OpDecorateString: *hasResult = false; *hasResultType = false; break;
|
||||||
case OpMemberDecorateString: *hasResult = false; *hasResultType = false; break;
|
case OpMemberDecorateString: *hasResult = false; *hasResultType = false; break;
|
||||||
case OpVmeImageINTEL: *hasResult = true; *hasResultType = true; break;
|
case OpVmeImageINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
|
|
@ -2092,6 +2158,28 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
|
||||||
case OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL: *hasResult = true; *hasResultType = true; break;
|
case OpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL: *hasResult = true; *hasResultType = true; break;
|
case OpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
case OpSubgroupAvcSicGetInterRawSadsINTEL: *hasResult = true; *hasResultType = true; break;
|
case OpSubgroupAvcSicGetInterRawSadsINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpLoopControlINTEL: *hasResult = false; *hasResultType = false; break;
|
||||||
|
case OpReadPipeBlockingINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpWritePipeBlockingINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpFPGARegINTEL: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetRayTMinKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetRayFlagsKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetIntersectionTKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetIntersectionInstanceCustomIndexKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetIntersectionInstanceIdKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetIntersectionGeometryIndexKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetIntersectionPrimitiveIndexKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetIntersectionBarycentricsKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetIntersectionFrontFaceKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetIntersectionCandidateAABBOpaqueKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetIntersectionObjectRayDirectionKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetIntersectionObjectRayOriginKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetWorldRayDirectionKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetWorldRayOriginKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetIntersectionObjectToWorldKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpRayQueryGetIntersectionWorldToObjectKHR: *hasResult = true; *hasResultType = true; break;
|
||||||
|
case OpAtomicFAddEXT: *hasResult = true; *hasResultType = true; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* SPV_ENABLE_UTILITY_CODE */
|
#endif /* SPV_ENABLE_UTILITY_CODE */
|
||||||
|
|
@ -2107,6 +2195,7 @@ inline MemorySemanticsMask operator|(MemorySemanticsMask a, MemorySemanticsMask
|
||||||
inline MemoryAccessMask operator|(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) | unsigned(b)); }
|
inline MemoryAccessMask operator|(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) | unsigned(b)); }
|
||||||
inline KernelProfilingInfoMask operator|(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) | unsigned(b)); }
|
inline KernelProfilingInfoMask operator|(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) | unsigned(b)); }
|
||||||
inline RayFlagsMask operator|(RayFlagsMask a, RayFlagsMask b) { return RayFlagsMask(unsigned(a) | unsigned(b)); }
|
inline RayFlagsMask operator|(RayFlagsMask a, RayFlagsMask b) { return RayFlagsMask(unsigned(a) | unsigned(b)); }
|
||||||
|
inline FragmentShadingRateMask operator|(FragmentShadingRateMask a, FragmentShadingRateMask b) { return FragmentShadingRateMask(unsigned(a) | unsigned(b)); }
|
||||||
|
|
||||||
} // end namespace spv
|
} // end namespace spv
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2016-2020 Arm Limited
|
* Copyright 2016-2021 Arm Limited
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -14,6 +14,13 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At your option, you may choose to accept this material under either:
|
||||||
|
* 1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or
|
||||||
|
* 2. The MIT License, found at <http://opensource.org/licenses/MIT>.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 OR MIT.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef SPIRV_CROSS_CFG_HPP
|
#ifndef SPIRV_CROSS_CFG_HPP
|
||||||
#define SPIRV_CROSS_CFG_HPP
|
#define SPIRV_CROSS_CFG_HPP
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2015-2020 Arm Limited
|
* Copyright 2015-2021 Arm Limited
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -14,6 +14,13 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At your option, you may choose to accept this material under either:
|
||||||
|
* 1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or
|
||||||
|
* 2. The MIT License, found at <http://opensource.org/licenses/MIT>.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 OR MIT.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef SPIRV_CROSS_COMMON_HPP
|
#ifndef SPIRV_CROSS_COMMON_HPP
|
||||||
#define SPIRV_CROSS_COMMON_HPP
|
#define SPIRV_CROSS_COMMON_HPP
|
||||||
|
|
||||||
|
|
@ -262,6 +269,29 @@ inline std::string convert_to_string(double t, char locale_radix_point)
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct ValueSaver
|
||||||
|
{
|
||||||
|
explicit ValueSaver(T ¤t_)
|
||||||
|
: current(current_)
|
||||||
|
, saved(current_)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void release()
|
||||||
|
{
|
||||||
|
current = saved;
|
||||||
|
}
|
||||||
|
|
||||||
|
~ValueSaver()
|
||||||
|
{
|
||||||
|
release();
|
||||||
|
}
|
||||||
|
|
||||||
|
T ¤t;
|
||||||
|
T saved;
|
||||||
|
};
|
||||||
|
|
||||||
#if defined(__clang__) || defined(__GNUC__)
|
#if defined(__clang__) || defined(__GNUC__)
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
|
|
@ -334,28 +364,6 @@ public:
|
||||||
return TypedID<U>(*this);
|
return TypedID<U>(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const TypedID &other) const
|
|
||||||
{
|
|
||||||
return id == other.id;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const TypedID &other) const
|
|
||||||
{
|
|
||||||
return id != other.id;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <Types type>
|
|
||||||
bool operator==(const TypedID<type> &other) const
|
|
||||||
{
|
|
||||||
return id == uint32_t(other);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <Types type>
|
|
||||||
bool operator!=(const TypedID<type> &other) const
|
|
||||||
{
|
|
||||||
return id != uint32_t(other);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint32_t id = 0;
|
uint32_t id = 0;
|
||||||
};
|
};
|
||||||
|
|
@ -380,26 +388,6 @@ public:
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const TypedID &other) const
|
|
||||||
{
|
|
||||||
return id == other.id;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const TypedID &other) const
|
|
||||||
{
|
|
||||||
return id != other.id;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const TypedID<TypeNone> &other) const
|
|
||||||
{
|
|
||||||
return id == uint32_t(other);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const TypedID<TypeNone> &other) const
|
|
||||||
{
|
|
||||||
return id != uint32_t(other);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint32_t id = 0;
|
uint32_t id = 0;
|
||||||
};
|
};
|
||||||
|
|
@ -535,6 +523,7 @@ struct SPIRType : IVariant
|
||||||
|
|
||||||
// Keep internal types at the end.
|
// Keep internal types at the end.
|
||||||
ControlPointArray,
|
ControlPointArray,
|
||||||
|
Interpolant,
|
||||||
Char
|
Char
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -558,11 +547,16 @@ struct SPIRType : IVariant
|
||||||
// Keep track of how many pointer layers we have.
|
// Keep track of how many pointer layers we have.
|
||||||
uint32_t pointer_depth = 0;
|
uint32_t pointer_depth = 0;
|
||||||
bool pointer = false;
|
bool pointer = false;
|
||||||
|
bool forward_pointer = false;
|
||||||
|
|
||||||
spv::StorageClass storage = spv::StorageClassGeneric;
|
spv::StorageClass storage = spv::StorageClassGeneric;
|
||||||
|
|
||||||
SmallVector<TypeID> member_types;
|
SmallVector<TypeID> member_types;
|
||||||
|
|
||||||
|
// If member order has been rewritten to handle certain scenarios with Offset,
|
||||||
|
// allow codegen to rewrite the index.
|
||||||
|
SmallVector<uint32_t> member_type_index_redirection;
|
||||||
|
|
||||||
struct ImageType
|
struct ImageType
|
||||||
{
|
{
|
||||||
TypeID type;
|
TypeID type;
|
||||||
|
|
@ -636,7 +630,7 @@ struct SPIREntryPoint
|
||||||
SmallVector<VariableID> interface_variables;
|
SmallVector<VariableID> interface_variables;
|
||||||
|
|
||||||
Bitset flags;
|
Bitset flags;
|
||||||
struct
|
struct WorkgroupSize
|
||||||
{
|
{
|
||||||
uint32_t x = 0, y = 0, z = 0;
|
uint32_t x = 0, y = 0, z = 0;
|
||||||
uint32_t constant = 0; // Workgroup size can be expressed as a constant/spec-constant instead.
|
uint32_t constant = 0; // Workgroup size can be expressed as a constant/spec-constant instead.
|
||||||
|
|
@ -694,6 +688,9 @@ struct SPIRExpression : IVariant
|
||||||
// Used by access chain Store and Load since we read multiple expressions in this case.
|
// Used by access chain Store and Load since we read multiple expressions in this case.
|
||||||
SmallVector<ID> implied_read_expressions;
|
SmallVector<ID> implied_read_expressions;
|
||||||
|
|
||||||
|
// The expression was emitted at a certain scope. Lets us track when an expression read means multiple reads.
|
||||||
|
uint32_t emitted_loop_level = 0;
|
||||||
|
|
||||||
SPIRV_CROSS_DECLARE_CLONE(SPIRExpression)
|
SPIRV_CROSS_DECLARE_CLONE(SPIRExpression)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -732,7 +729,9 @@ struct SPIRBlock : IVariant
|
||||||
|
|
||||||
Return, // Block ends with return.
|
Return, // Block ends with return.
|
||||||
Unreachable, // Noop
|
Unreachable, // Noop
|
||||||
Kill // Discard
|
Kill, // Discard
|
||||||
|
IgnoreIntersection, // Ray Tracing
|
||||||
|
TerminateRay // Ray Tracing
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Merge
|
enum Merge
|
||||||
|
|
@ -776,7 +775,7 @@ struct SPIRBlock : IVariant
|
||||||
ComplexLoop
|
ComplexLoop
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum : uint32_t
|
||||||
{
|
{
|
||||||
NoDominator = 0xffffffffu
|
NoDominator = 0xffffffffu
|
||||||
};
|
};
|
||||||
|
|
@ -1064,7 +1063,8 @@ struct SPIRConstant : IVariant
|
||||||
type = TypeConstant
|
type = TypeConstant
|
||||||
};
|
};
|
||||||
|
|
||||||
union Constant {
|
union Constant
|
||||||
|
{
|
||||||
uint32_t u32;
|
uint32_t u32;
|
||||||
int32_t i32;
|
int32_t i32;
|
||||||
float f32;
|
float f32;
|
||||||
|
|
@ -1102,7 +1102,8 @@ struct SPIRConstant : IVariant
|
||||||
int e = (u16_value >> 10) & 0x1f;
|
int e = (u16_value >> 10) & 0x1f;
|
||||||
int m = (u16_value >> 0) & 0x3ff;
|
int m = (u16_value >> 0) & 0x3ff;
|
||||||
|
|
||||||
union {
|
union
|
||||||
|
{
|
||||||
float f32;
|
float f32;
|
||||||
uint32_t u32;
|
uint32_t u32;
|
||||||
} u;
|
} u;
|
||||||
|
|
@ -1521,6 +1522,7 @@ struct AccessChainMeta
|
||||||
bool need_transpose = false;
|
bool need_transpose = false;
|
||||||
bool storage_is_packed = false;
|
bool storage_is_packed = false;
|
||||||
bool storage_is_invariant = false;
|
bool storage_is_invariant = false;
|
||||||
|
bool flattened_struct = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ExtendedDecorations
|
enum ExtendedDecorations
|
||||||
|
|
@ -1555,8 +1557,10 @@ enum ExtendedDecorations
|
||||||
// Marks a buffer block for using explicit offsets (GLSL/HLSL).
|
// Marks a buffer block for using explicit offsets (GLSL/HLSL).
|
||||||
SPIRVCrossDecorationExplicitOffset,
|
SPIRVCrossDecorationExplicitOffset,
|
||||||
|
|
||||||
// Apply to a variable in the Input storage class; marks it as holding the base group passed to vkCmdDispatchBase().
|
// Apply to a variable in the Input storage class; marks it as holding the base group passed to vkCmdDispatchBase(),
|
||||||
// In MSL, this is used to adjust the WorkgroupId and GlobalInvocationId variables.
|
// or the base vertex and instance indices passed to vkCmdDrawIndexed().
|
||||||
|
// In MSL, this is used to adjust the WorkgroupId and GlobalInvocationId variables in compute shaders,
|
||||||
|
// and to hold the BaseVertex and BaseInstance variables in vertex shaders.
|
||||||
SPIRVCrossDecorationBuiltInDispatchBase,
|
SPIRVCrossDecorationBuiltInDispatchBase,
|
||||||
|
|
||||||
// Apply to a variable that is a function parameter; marks it as being a "dynamic"
|
// Apply to a variable that is a function parameter; marks it as being a "dynamic"
|
||||||
|
|
@ -1565,6 +1569,27 @@ enum ExtendedDecorations
|
||||||
// Y'CbCr conversion.
|
// Y'CbCr conversion.
|
||||||
SPIRVCrossDecorationDynamicImageSampler,
|
SPIRVCrossDecorationDynamicImageSampler,
|
||||||
|
|
||||||
|
// Apply to a variable in the Input storage class; marks it as holding the size of the stage
|
||||||
|
// input grid.
|
||||||
|
// In MSL, this is used to hold the vertex and instance counts in a tessellation pipeline
|
||||||
|
// vertex shader.
|
||||||
|
SPIRVCrossDecorationBuiltInStageInputSize,
|
||||||
|
|
||||||
|
// Apply to any access chain of a tessellation I/O variable; stores the type of the sub-object
|
||||||
|
// that was chained to, as recorded in the input variable itself. This is used in case the pointer
|
||||||
|
// is itself used as the base of an access chain, to calculate the original type of the sub-object
|
||||||
|
// chained to, in case a swizzle needs to be applied. This should not happen normally with valid
|
||||||
|
// SPIR-V, but the MSL backend can change the type of input variables, necessitating the
|
||||||
|
// addition of swizzles to keep the generated code compiling.
|
||||||
|
SPIRVCrossDecorationTessIOOriginalInputTypeID,
|
||||||
|
|
||||||
|
// Apply to any access chain of an interface variable used with pull-model interpolation, where the variable is a
|
||||||
|
// vector but the resulting pointer is a scalar; stores the component index that is to be accessed by the chain.
|
||||||
|
// This is used when emitting calls to interpolation functions on the chain in MSL: in this case, the component
|
||||||
|
// must be applied to the result, since pull-model interpolants in MSL cannot be swizzled directly, but the
|
||||||
|
// results of interpolation can.
|
||||||
|
SPIRVCrossDecorationInterpolantComponentExpr,
|
||||||
|
|
||||||
SPIRVCrossDecorationCount
|
SPIRVCrossDecorationCount
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1584,6 +1609,7 @@ struct Meta
|
||||||
uint32_t offset = 0;
|
uint32_t offset = 0;
|
||||||
uint32_t xfb_buffer = 0;
|
uint32_t xfb_buffer = 0;
|
||||||
uint32_t xfb_stride = 0;
|
uint32_t xfb_stride = 0;
|
||||||
|
uint32_t stream = 0;
|
||||||
uint32_t array_stride = 0;
|
uint32_t array_stride = 0;
|
||||||
uint32_t matrix_stride = 0;
|
uint32_t matrix_stride = 0;
|
||||||
uint32_t input_attachment = 0;
|
uint32_t input_attachment = 0;
|
||||||
|
|
|
||||||
|
|
@ -1,86 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2015-2020 Arm Limited
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef SPIRV_CROSS_CPP_HPP
|
|
||||||
#define SPIRV_CROSS_CPP_HPP
|
|
||||||
|
|
||||||
#include "spirv_glsl.hpp"
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
namespace SPIRV_CROSS_NAMESPACE
|
|
||||||
{
|
|
||||||
class CompilerCPP : public CompilerGLSL
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
explicit CompilerCPP(std::vector<uint32_t> spirv_)
|
|
||||||
: CompilerGLSL(std::move(spirv_))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
CompilerCPP(const uint32_t *ir_, size_t word_count)
|
|
||||||
: CompilerGLSL(ir_, word_count)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit CompilerCPP(const ParsedIR &ir_)
|
|
||||||
: CompilerGLSL(ir_)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit CompilerCPP(ParsedIR &&ir_)
|
|
||||||
: CompilerGLSL(std::move(ir_))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string compile() override;
|
|
||||||
|
|
||||||
// Sets a custom symbol name that can override
|
|
||||||
// spirv_cross_get_interface.
|
|
||||||
//
|
|
||||||
// Useful when several shader interfaces are linked
|
|
||||||
// statically into the same binary.
|
|
||||||
void set_interface_name(std::string name)
|
|
||||||
{
|
|
||||||
interface_name = std::move(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void emit_header() override;
|
|
||||||
void emit_c_linkage();
|
|
||||||
void emit_function_prototype(SPIRFunction &func, const Bitset &return_flags) override;
|
|
||||||
|
|
||||||
void emit_resources();
|
|
||||||
void emit_buffer_block(const SPIRVariable &type) override;
|
|
||||||
void emit_push_constant_block(const SPIRVariable &var) override;
|
|
||||||
void emit_interface_block(const SPIRVariable &type);
|
|
||||||
void emit_block_chain(SPIRBlock &block);
|
|
||||||
void emit_uniform(const SPIRVariable &var) override;
|
|
||||||
void emit_shared(const SPIRVariable &var);
|
|
||||||
void emit_block_struct(SPIRType &type);
|
|
||||||
std::string variable_decl(const SPIRType &type, const std::string &name, uint32_t id) override;
|
|
||||||
|
|
||||||
std::string argument_decl(const SPIRFunction::Parameter &arg);
|
|
||||||
|
|
||||||
SmallVector<std::string> resource_registrations;
|
|
||||||
std::string impl_type;
|
|
||||||
std::string resource_type;
|
|
||||||
uint32_t shared_counter = 0;
|
|
||||||
|
|
||||||
std::string interface_name;
|
|
||||||
};
|
|
||||||
} // namespace SPIRV_CROSS_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2015-2020 Arm Limited
|
* Copyright 2015-2021 Arm Limited
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -14,6 +14,13 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At your option, you may choose to accept this material under either:
|
||||||
|
* 1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or
|
||||||
|
* 2. The MIT License, found at <http://opensource.org/licenses/MIT>.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 OR MIT.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef SPIRV_CROSS_HPP
|
#ifndef SPIRV_CROSS_HPP
|
||||||
#define SPIRV_CROSS_HPP
|
#define SPIRV_CROSS_HPP
|
||||||
|
|
||||||
|
|
@ -513,9 +520,22 @@ protected:
|
||||||
|
|
||||||
SPIRFunction *current_function = nullptr;
|
SPIRFunction *current_function = nullptr;
|
||||||
SPIRBlock *current_block = nullptr;
|
SPIRBlock *current_block = nullptr;
|
||||||
|
uint32_t current_loop_level = 0;
|
||||||
std::unordered_set<VariableID> active_interface_variables;
|
std::unordered_set<VariableID> active_interface_variables;
|
||||||
bool check_active_interface_variables = false;
|
bool check_active_interface_variables = false;
|
||||||
|
|
||||||
|
void add_loop_level();
|
||||||
|
|
||||||
|
void set_initializers(SPIRExpression &e)
|
||||||
|
{
|
||||||
|
e.emitted_loop_level = current_loop_level;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void set_initializers(const T &)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
// If our IDs are out of range here as part of opcodes, throw instead of
|
// If our IDs are out of range here as part of opcodes, throw instead of
|
||||||
// undefined behavior.
|
// undefined behavior.
|
||||||
template <typename T, typename... P>
|
template <typename T, typename... P>
|
||||||
|
|
@ -524,6 +544,7 @@ protected:
|
||||||
ir.add_typed_id(static_cast<Types>(T::type), id);
|
ir.add_typed_id(static_cast<Types>(T::type), id);
|
||||||
auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
|
auto &var = variant_set<T>(ir.ids[id], std::forward<P>(args)...);
|
||||||
var.self = id;
|
var.self = id;
|
||||||
|
set_initializers(var);
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -611,7 +632,7 @@ protected:
|
||||||
bool expression_is_lvalue(uint32_t id) const;
|
bool expression_is_lvalue(uint32_t id) const;
|
||||||
bool variable_storage_is_aliased(const SPIRVariable &var);
|
bool variable_storage_is_aliased(const SPIRVariable &var);
|
||||||
SPIRVariable *maybe_get_backing_variable(uint32_t chain);
|
SPIRVariable *maybe_get_backing_variable(uint32_t chain);
|
||||||
spv::StorageClass get_backing_variable_storage(uint32_t ptr);
|
spv::StorageClass get_expression_effective_storage_class(uint32_t ptr);
|
||||||
|
|
||||||
void register_read(uint32_t expr, uint32_t chain, bool forwarded);
|
void register_read(uint32_t expr, uint32_t chain, bool forwarded);
|
||||||
void register_write(uint32_t chain);
|
void register_write(uint32_t chain);
|
||||||
|
|
@ -812,6 +833,9 @@ protected:
|
||||||
Compiler &compiler;
|
Compiler &compiler;
|
||||||
|
|
||||||
void handle_builtin(const SPIRType &type, spv::BuiltIn builtin, const Bitset &decoration_flags);
|
void handle_builtin(const SPIRType &type, spv::BuiltIn builtin, const Bitset &decoration_flags);
|
||||||
|
void add_if_builtin(uint32_t id);
|
||||||
|
void add_if_builtin_or_block(uint32_t id);
|
||||||
|
void add_if_builtin(uint32_t id, bool allow_blocks);
|
||||||
};
|
};
|
||||||
|
|
||||||
bool traverse_all_reachable_opcodes(const SPIRBlock &block, OpcodeHandler &handler) const;
|
bool traverse_all_reachable_opcodes(const SPIRBlock &block, OpcodeHandler &handler) const;
|
||||||
|
|
@ -1037,6 +1061,7 @@ protected:
|
||||||
void unset_extended_member_decoration(uint32_t type, uint32_t index, ExtendedDecorations decoration);
|
void unset_extended_member_decoration(uint32_t type, uint32_t index, ExtendedDecorations decoration);
|
||||||
|
|
||||||
bool type_is_array_of_pointers(const SPIRType &type) const;
|
bool type_is_array_of_pointers(const SPIRType &type) const;
|
||||||
|
bool type_is_top_level_physical_pointer(const SPIRType &type) const;
|
||||||
bool type_is_block_like(const SPIRType &type) const;
|
bool type_is_block_like(const SPIRType &type) const;
|
||||||
bool type_is_opaque_value(const SPIRType &type) const;
|
bool type_is_opaque_value(const SPIRType &type) const;
|
||||||
|
|
||||||
|
|
@ -1045,6 +1070,11 @@ protected:
|
||||||
|
|
||||||
bool flush_phi_required(BlockID from, BlockID to) const;
|
bool flush_phi_required(BlockID from, BlockID to) const;
|
||||||
|
|
||||||
|
uint32_t evaluate_spec_constant_u32(const SPIRConstantOp &spec) const;
|
||||||
|
uint32_t evaluate_constant_u32(uint32_t id) const;
|
||||||
|
|
||||||
|
bool is_vertex_like_shader() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Used only to implement the old deprecated get_entry_point() interface.
|
// Used only to implement the old deprecated get_entry_point() interface.
|
||||||
const SPIREntryPoint &get_first_entry_point(const std::string &name) const;
|
const SPIREntryPoint &get_first_entry_point(const std::string &name) const;
|
||||||
|
|
|
||||||
|
|
@ -1,912 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2019-2020 Hans-Kristian Arntzen
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef SPIRV_CROSS_C_API_H
|
|
||||||
#define SPIRV_CROSS_C_API_H
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include "spirv.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* C89-compatible wrapper for SPIRV-Cross' API.
|
|
||||||
* Documentation here is sparse unless the behavior does not map 1:1 with C++ API.
|
|
||||||
* It is recommended to look at the canonical C++ API for more detailed information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Bumped if ABI or API breaks backwards compatibility. */
|
|
||||||
#define SPVC_C_API_VERSION_MAJOR 0
|
|
||||||
/* Bumped if APIs or enumerations are added in a backwards compatible way. */
|
|
||||||
#define SPVC_C_API_VERSION_MINOR 33
|
|
||||||
/* Bumped if internal implementation details change. */
|
|
||||||
#define SPVC_C_API_VERSION_PATCH 0
|
|
||||||
|
|
||||||
#if !defined(SPVC_PUBLIC_API)
|
|
||||||
#if defined(SPVC_EXPORT_SYMBOLS)
|
|
||||||
/* Exports symbols. Standard C calling convention is used. */
|
|
||||||
#if defined(__GNUC__)
|
|
||||||
#define SPVC_PUBLIC_API __attribute__((visibility("default")))
|
|
||||||
#elif defined(_MSC_VER)
|
|
||||||
#define SPVC_PUBLIC_API __declspec(dllexport)
|
|
||||||
#else
|
|
||||||
#define SPVC_PUBLIC_API
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define SPVC_PUBLIC_API
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Gets the SPVC_C_API_VERSION_* used to build this library.
|
|
||||||
* Can be used to check for ABI mismatch if so-versioning did not catch it.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API void spvc_get_version(unsigned *major, unsigned *minor, unsigned *patch);
|
|
||||||
|
|
||||||
/* Gets a human readable version string to identify which commit a particular binary was created from. */
|
|
||||||
SPVC_PUBLIC_API const char *spvc_get_commit_revision_and_timestamp(void);
|
|
||||||
|
|
||||||
/* These types are opaque to the user. */
|
|
||||||
typedef struct spvc_context_s *spvc_context;
|
|
||||||
typedef struct spvc_parsed_ir_s *spvc_parsed_ir;
|
|
||||||
typedef struct spvc_compiler_s *spvc_compiler;
|
|
||||||
typedef struct spvc_compiler_options_s *spvc_compiler_options;
|
|
||||||
typedef struct spvc_resources_s *spvc_resources;
|
|
||||||
struct spvc_type_s;
|
|
||||||
typedef const struct spvc_type_s *spvc_type;
|
|
||||||
typedef struct spvc_constant_s *spvc_constant;
|
|
||||||
struct spvc_set_s;
|
|
||||||
typedef const struct spvc_set_s *spvc_set;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Shallow typedefs. All SPIR-V IDs are plain 32-bit numbers, but this helps communicate which data is used.
|
|
||||||
* Maps to a SPIRType.
|
|
||||||
*/
|
|
||||||
typedef SpvId spvc_type_id;
|
|
||||||
/* Maps to a SPIRVariable. */
|
|
||||||
typedef SpvId spvc_variable_id;
|
|
||||||
/* Maps to a SPIRConstant. */
|
|
||||||
typedef SpvId spvc_constant_id;
|
|
||||||
|
|
||||||
/* See C++ API. */
|
|
||||||
typedef struct spvc_reflected_resource
|
|
||||||
{
|
|
||||||
spvc_variable_id id;
|
|
||||||
spvc_type_id base_type_id;
|
|
||||||
spvc_type_id type_id;
|
|
||||||
const char *name;
|
|
||||||
} spvc_reflected_resource;
|
|
||||||
|
|
||||||
/* See C++ API. */
|
|
||||||
typedef struct spvc_entry_point
|
|
||||||
{
|
|
||||||
SpvExecutionModel execution_model;
|
|
||||||
const char *name;
|
|
||||||
} spvc_entry_point;
|
|
||||||
|
|
||||||
/* See C++ API. */
|
|
||||||
typedef struct spvc_combined_image_sampler
|
|
||||||
{
|
|
||||||
spvc_variable_id combined_id;
|
|
||||||
spvc_variable_id image_id;
|
|
||||||
spvc_variable_id sampler_id;
|
|
||||||
} spvc_combined_image_sampler;
|
|
||||||
|
|
||||||
/* See C++ API. */
|
|
||||||
typedef struct spvc_specialization_constant
|
|
||||||
{
|
|
||||||
spvc_constant_id id;
|
|
||||||
unsigned constant_id;
|
|
||||||
} spvc_specialization_constant;
|
|
||||||
|
|
||||||
/* See C++ API. */
|
|
||||||
typedef struct spvc_buffer_range
|
|
||||||
{
|
|
||||||
unsigned index;
|
|
||||||
size_t offset;
|
|
||||||
size_t range;
|
|
||||||
} spvc_buffer_range;
|
|
||||||
|
|
||||||
/* See C++ API. */
|
|
||||||
typedef struct spvc_hlsl_root_constants
|
|
||||||
{
|
|
||||||
unsigned start;
|
|
||||||
unsigned end;
|
|
||||||
unsigned binding;
|
|
||||||
unsigned space;
|
|
||||||
} spvc_hlsl_root_constants;
|
|
||||||
|
|
||||||
/* See C++ API. */
|
|
||||||
typedef struct spvc_hlsl_vertex_attribute_remap
|
|
||||||
{
|
|
||||||
unsigned location;
|
|
||||||
const char *semantic;
|
|
||||||
} spvc_hlsl_vertex_attribute_remap;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Be compatible with non-C99 compilers, which do not have stdbool.
|
|
||||||
* Only recent MSVC compilers supports this for example, and ideally SPIRV-Cross should be linkable
|
|
||||||
* from a wide range of compilers in its C wrapper.
|
|
||||||
*/
|
|
||||||
typedef unsigned char spvc_bool;
|
|
||||||
#define SPVC_TRUE ((spvc_bool)1)
|
|
||||||
#define SPVC_FALSE ((spvc_bool)0)
|
|
||||||
|
|
||||||
typedef enum spvc_result
|
|
||||||
{
|
|
||||||
/* Success. */
|
|
||||||
SPVC_SUCCESS = 0,
|
|
||||||
|
|
||||||
/* The SPIR-V is invalid. Should have been caught by validation ideally. */
|
|
||||||
SPVC_ERROR_INVALID_SPIRV = -1,
|
|
||||||
|
|
||||||
/* The SPIR-V might be valid or invalid, but SPIRV-Cross currently cannot correctly translate this to your target language. */
|
|
||||||
SPVC_ERROR_UNSUPPORTED_SPIRV = -2,
|
|
||||||
|
|
||||||
/* If for some reason we hit this, new or malloc failed. */
|
|
||||||
SPVC_ERROR_OUT_OF_MEMORY = -3,
|
|
||||||
|
|
||||||
/* Invalid API argument. */
|
|
||||||
SPVC_ERROR_INVALID_ARGUMENT = -4,
|
|
||||||
|
|
||||||
SPVC_ERROR_INT_MAX = 0x7fffffff
|
|
||||||
} spvc_result;
|
|
||||||
|
|
||||||
typedef enum spvc_capture_mode
|
|
||||||
{
|
|
||||||
/* The Parsed IR payload will be copied, and the handle can be reused to create other compiler instances. */
|
|
||||||
SPVC_CAPTURE_MODE_COPY = 0,
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The payload will now be owned by the compiler.
|
|
||||||
* parsed_ir should now be considered a dead blob and must not be used further.
|
|
||||||
* This is optimal for performance and should be the go-to option.
|
|
||||||
*/
|
|
||||||
SPVC_CAPTURE_MODE_TAKE_OWNERSHIP = 1,
|
|
||||||
|
|
||||||
SPVC_CAPTURE_MODE_INT_MAX = 0x7fffffff
|
|
||||||
} spvc_capture_mode;
|
|
||||||
|
|
||||||
typedef enum spvc_backend
|
|
||||||
{
|
|
||||||
/* This backend can only perform reflection, no compiler options are supported. Maps to spirv_cross::Compiler. */
|
|
||||||
SPVC_BACKEND_NONE = 0,
|
|
||||||
SPVC_BACKEND_GLSL = 1, /* spirv_cross::CompilerGLSL */
|
|
||||||
SPVC_BACKEND_HLSL = 2, /* CompilerHLSL */
|
|
||||||
SPVC_BACKEND_MSL = 3, /* CompilerMSL */
|
|
||||||
SPVC_BACKEND_CPP = 4, /* CompilerCPP */
|
|
||||||
SPVC_BACKEND_JSON = 5, /* CompilerReflection w/ JSON backend */
|
|
||||||
SPVC_BACKEND_INT_MAX = 0x7fffffff
|
|
||||||
} spvc_backend;
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef enum spvc_resource_type
|
|
||||||
{
|
|
||||||
SPVC_RESOURCE_TYPE_UNKNOWN = 0,
|
|
||||||
SPVC_RESOURCE_TYPE_UNIFORM_BUFFER = 1,
|
|
||||||
SPVC_RESOURCE_TYPE_STORAGE_BUFFER = 2,
|
|
||||||
SPVC_RESOURCE_TYPE_STAGE_INPUT = 3,
|
|
||||||
SPVC_RESOURCE_TYPE_STAGE_OUTPUT = 4,
|
|
||||||
SPVC_RESOURCE_TYPE_SUBPASS_INPUT = 5,
|
|
||||||
SPVC_RESOURCE_TYPE_STORAGE_IMAGE = 6,
|
|
||||||
SPVC_RESOURCE_TYPE_SAMPLED_IMAGE = 7,
|
|
||||||
SPVC_RESOURCE_TYPE_ATOMIC_COUNTER = 8,
|
|
||||||
SPVC_RESOURCE_TYPE_PUSH_CONSTANT = 9,
|
|
||||||
SPVC_RESOURCE_TYPE_SEPARATE_IMAGE = 10,
|
|
||||||
SPVC_RESOURCE_TYPE_SEPARATE_SAMPLERS = 11,
|
|
||||||
SPVC_RESOURCE_TYPE_ACCELERATION_STRUCTURE = 12,
|
|
||||||
SPVC_RESOURCE_TYPE_RAY_QUERY = 13,
|
|
||||||
SPVC_RESOURCE_TYPE_INT_MAX = 0x7fffffff
|
|
||||||
} spvc_resource_type;
|
|
||||||
|
|
||||||
/* Maps to spirv_cross::SPIRType::BaseType. */
|
|
||||||
typedef enum spvc_basetype
|
|
||||||
{
|
|
||||||
SPVC_BASETYPE_UNKNOWN = 0,
|
|
||||||
SPVC_BASETYPE_VOID = 1,
|
|
||||||
SPVC_BASETYPE_BOOLEAN = 2,
|
|
||||||
SPVC_BASETYPE_INT8 = 3,
|
|
||||||
SPVC_BASETYPE_UINT8 = 4,
|
|
||||||
SPVC_BASETYPE_INT16 = 5,
|
|
||||||
SPVC_BASETYPE_UINT16 = 6,
|
|
||||||
SPVC_BASETYPE_INT32 = 7,
|
|
||||||
SPVC_BASETYPE_UINT32 = 8,
|
|
||||||
SPVC_BASETYPE_INT64 = 9,
|
|
||||||
SPVC_BASETYPE_UINT64 = 10,
|
|
||||||
SPVC_BASETYPE_ATOMIC_COUNTER = 11,
|
|
||||||
SPVC_BASETYPE_FP16 = 12,
|
|
||||||
SPVC_BASETYPE_FP32 = 13,
|
|
||||||
SPVC_BASETYPE_FP64 = 14,
|
|
||||||
SPVC_BASETYPE_STRUCT = 15,
|
|
||||||
SPVC_BASETYPE_IMAGE = 16,
|
|
||||||
SPVC_BASETYPE_SAMPLED_IMAGE = 17,
|
|
||||||
SPVC_BASETYPE_SAMPLER = 18,
|
|
||||||
SPVC_BASETYPE_ACCELERATION_STRUCTURE = 19,
|
|
||||||
|
|
||||||
SPVC_BASETYPE_INT_MAX = 0x7fffffff
|
|
||||||
} spvc_basetype;
|
|
||||||
|
|
||||||
#define SPVC_COMPILER_OPTION_COMMON_BIT 0x1000000
|
|
||||||
#define SPVC_COMPILER_OPTION_GLSL_BIT 0x2000000
|
|
||||||
#define SPVC_COMPILER_OPTION_HLSL_BIT 0x4000000
|
|
||||||
#define SPVC_COMPILER_OPTION_MSL_BIT 0x8000000
|
|
||||||
#define SPVC_COMPILER_OPTION_LANG_BITS 0x0f000000
|
|
||||||
#define SPVC_COMPILER_OPTION_ENUM_BITS 0xffffff
|
|
||||||
|
|
||||||
#define SPVC_MAKE_MSL_VERSION(major, minor, patch) ((major) * 10000 + (minor) * 100 + (patch))
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef enum spvc_msl_platform
|
|
||||||
{
|
|
||||||
SPVC_MSL_PLATFORM_IOS = 0,
|
|
||||||
SPVC_MSL_PLATFORM_MACOS = 1,
|
|
||||||
SPVC_MSL_PLATFORM_MAX_INT = 0x7fffffff
|
|
||||||
} spvc_msl_platform;
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef enum spvc_msl_vertex_format
|
|
||||||
{
|
|
||||||
SPVC_MSL_VERTEX_FORMAT_OTHER = 0,
|
|
||||||
SPVC_MSL_VERTEX_FORMAT_UINT8 = 1,
|
|
||||||
SPVC_MSL_VERTEX_FORMAT_UINT16 = 2
|
|
||||||
} spvc_msl_vertex_format;
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef struct spvc_msl_vertex_attribute
|
|
||||||
{
|
|
||||||
unsigned location;
|
|
||||||
unsigned msl_buffer;
|
|
||||||
unsigned msl_offset;
|
|
||||||
unsigned msl_stride;
|
|
||||||
spvc_bool per_instance;
|
|
||||||
spvc_msl_vertex_format format;
|
|
||||||
SpvBuiltIn builtin;
|
|
||||||
} spvc_msl_vertex_attribute;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initializes the vertex attribute struct.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API void spvc_msl_vertex_attribute_init(spvc_msl_vertex_attribute *attr);
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef struct spvc_msl_resource_binding
|
|
||||||
{
|
|
||||||
SpvExecutionModel stage;
|
|
||||||
unsigned desc_set;
|
|
||||||
unsigned binding;
|
|
||||||
unsigned msl_buffer;
|
|
||||||
unsigned msl_texture;
|
|
||||||
unsigned msl_sampler;
|
|
||||||
} spvc_msl_resource_binding;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initializes the resource binding struct.
|
|
||||||
* The defaults are non-zero.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API void spvc_msl_resource_binding_init(spvc_msl_resource_binding *binding);
|
|
||||||
|
|
||||||
#define SPVC_MSL_PUSH_CONSTANT_DESC_SET (~(0u))
|
|
||||||
#define SPVC_MSL_PUSH_CONSTANT_BINDING (0)
|
|
||||||
#define SPVC_MSL_SWIZZLE_BUFFER_BINDING (~(1u))
|
|
||||||
#define SPVC_MSL_BUFFER_SIZE_BUFFER_BINDING (~(2u))
|
|
||||||
#define SPVC_MSL_ARGUMENT_BUFFER_BINDING (~(3u))
|
|
||||||
|
|
||||||
/* Obsolete. Sticks around for backwards compatibility. */
|
|
||||||
#define SPVC_MSL_AUX_BUFFER_STRUCT_VERSION 1
|
|
||||||
|
|
||||||
/* Runtime check for incompatibility. Obsolete. */
|
|
||||||
SPVC_PUBLIC_API unsigned spvc_msl_get_aux_buffer_struct_version(void);
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef enum spvc_msl_sampler_coord
|
|
||||||
{
|
|
||||||
SPVC_MSL_SAMPLER_COORD_NORMALIZED = 0,
|
|
||||||
SPVC_MSL_SAMPLER_COORD_PIXEL = 1,
|
|
||||||
SPVC_MSL_SAMPLER_INT_MAX = 0x7fffffff
|
|
||||||
} spvc_msl_sampler_coord;
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef enum spvc_msl_sampler_filter
|
|
||||||
{
|
|
||||||
SPVC_MSL_SAMPLER_FILTER_NEAREST = 0,
|
|
||||||
SPVC_MSL_SAMPLER_FILTER_LINEAR = 1,
|
|
||||||
SPVC_MSL_SAMPLER_FILTER_INT_MAX = 0x7fffffff
|
|
||||||
} spvc_msl_sampler_filter;
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef enum spvc_msl_sampler_mip_filter
|
|
||||||
{
|
|
||||||
SPVC_MSL_SAMPLER_MIP_FILTER_NONE = 0,
|
|
||||||
SPVC_MSL_SAMPLER_MIP_FILTER_NEAREST = 1,
|
|
||||||
SPVC_MSL_SAMPLER_MIP_FILTER_LINEAR = 2,
|
|
||||||
SPVC_MSL_SAMPLER_MIP_FILTER_INT_MAX = 0x7fffffff
|
|
||||||
} spvc_msl_sampler_mip_filter;
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef enum spvc_msl_sampler_address
|
|
||||||
{
|
|
||||||
SPVC_MSL_SAMPLER_ADDRESS_CLAMP_TO_ZERO = 0,
|
|
||||||
SPVC_MSL_SAMPLER_ADDRESS_CLAMP_TO_EDGE = 1,
|
|
||||||
SPVC_MSL_SAMPLER_ADDRESS_CLAMP_TO_BORDER = 2,
|
|
||||||
SPVC_MSL_SAMPLER_ADDRESS_REPEAT = 3,
|
|
||||||
SPVC_MSL_SAMPLER_ADDRESS_MIRRORED_REPEAT = 4,
|
|
||||||
SPVC_MSL_SAMPLER_ADDRESS_INT_MAX = 0x7fffffff
|
|
||||||
} spvc_msl_sampler_address;
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef enum spvc_msl_sampler_compare_func
|
|
||||||
{
|
|
||||||
SPVC_MSL_SAMPLER_COMPARE_FUNC_NEVER = 0,
|
|
||||||
SPVC_MSL_SAMPLER_COMPARE_FUNC_LESS = 1,
|
|
||||||
SPVC_MSL_SAMPLER_COMPARE_FUNC_LESS_EQUAL = 2,
|
|
||||||
SPVC_MSL_SAMPLER_COMPARE_FUNC_GREATER = 3,
|
|
||||||
SPVC_MSL_SAMPLER_COMPARE_FUNC_GREATER_EQUAL = 4,
|
|
||||||
SPVC_MSL_SAMPLER_COMPARE_FUNC_EQUAL = 5,
|
|
||||||
SPVC_MSL_SAMPLER_COMPARE_FUNC_NOT_EQUAL = 6,
|
|
||||||
SPVC_MSL_SAMPLER_COMPARE_FUNC_ALWAYS = 7,
|
|
||||||
SPVC_MSL_SAMPLER_COMPARE_FUNC_INT_MAX = 0x7fffffff
|
|
||||||
} spvc_msl_sampler_compare_func;
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef enum spvc_msl_sampler_border_color
|
|
||||||
{
|
|
||||||
SPVC_MSL_SAMPLER_BORDER_COLOR_TRANSPARENT_BLACK = 0,
|
|
||||||
SPVC_MSL_SAMPLER_BORDER_COLOR_OPAQUE_BLACK = 1,
|
|
||||||
SPVC_MSL_SAMPLER_BORDER_COLOR_OPAQUE_WHITE = 2,
|
|
||||||
SPVC_MSL_SAMPLER_BORDER_COLOR_INT_MAX = 0x7fffffff
|
|
||||||
} spvc_msl_sampler_border_color;
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef enum spvc_msl_format_resolution
|
|
||||||
{
|
|
||||||
SPVC_MSL_FORMAT_RESOLUTION_444 = 0,
|
|
||||||
SPVC_MSL_FORMAT_RESOLUTION_422,
|
|
||||||
SPVC_MSL_FORMAT_RESOLUTION_420,
|
|
||||||
SPVC_MSL_FORMAT_RESOLUTION_INT_MAX = 0x7fffffff
|
|
||||||
} spvc_msl_format_resolution;
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef enum spvc_msl_chroma_location
|
|
||||||
{
|
|
||||||
SPVC_MSL_CHROMA_LOCATION_COSITED_EVEN = 0,
|
|
||||||
SPVC_MSL_CHROMA_LOCATION_MIDPOINT,
|
|
||||||
SPVC_MSL_CHROMA_LOCATION_INT_MAX = 0x7fffffff
|
|
||||||
} spvc_msl_chroma_location;
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef enum spvc_msl_component_swizzle
|
|
||||||
{
|
|
||||||
SPVC_MSL_COMPONENT_SWIZZLE_IDENTITY = 0,
|
|
||||||
SPVC_MSL_COMPONENT_SWIZZLE_ZERO,
|
|
||||||
SPVC_MSL_COMPONENT_SWIZZLE_ONE,
|
|
||||||
SPVC_MSL_COMPONENT_SWIZZLE_R,
|
|
||||||
SPVC_MSL_COMPONENT_SWIZZLE_G,
|
|
||||||
SPVC_MSL_COMPONENT_SWIZZLE_B,
|
|
||||||
SPVC_MSL_COMPONENT_SWIZZLE_A,
|
|
||||||
SPVC_MSL_COMPONENT_SWIZZLE_INT_MAX = 0x7fffffff
|
|
||||||
} spvc_msl_component_swizzle;
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef enum spvc_msl_sampler_ycbcr_model_conversion
|
|
||||||
{
|
|
||||||
SPVC_MSL_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY = 0,
|
|
||||||
SPVC_MSL_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY,
|
|
||||||
SPVC_MSL_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_BT_709,
|
|
||||||
SPVC_MSL_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_BT_601,
|
|
||||||
SPVC_MSL_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_BT_2020,
|
|
||||||
SPVC_MSL_SAMPLER_YCBCR_MODEL_CONVERSION_INT_MAX = 0x7fffffff
|
|
||||||
} spvc_msl_sampler_ycbcr_model_conversion;
|
|
||||||
|
|
||||||
/* Maps to C+ API. */
|
|
||||||
typedef enum spvc_msl_sampler_ycbcr_range
|
|
||||||
{
|
|
||||||
SPVC_MSL_SAMPLER_YCBCR_RANGE_ITU_FULL = 0,
|
|
||||||
SPVC_MSL_SAMPLER_YCBCR_RANGE_ITU_NARROW,
|
|
||||||
SPVC_MSL_SAMPLER_YCBCR_RANGE_INT_MAX = 0x7fffffff
|
|
||||||
} spvc_msl_sampler_ycbcr_range;
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef struct spvc_msl_constexpr_sampler
|
|
||||||
{
|
|
||||||
spvc_msl_sampler_coord coord;
|
|
||||||
spvc_msl_sampler_filter min_filter;
|
|
||||||
spvc_msl_sampler_filter mag_filter;
|
|
||||||
spvc_msl_sampler_mip_filter mip_filter;
|
|
||||||
spvc_msl_sampler_address s_address;
|
|
||||||
spvc_msl_sampler_address t_address;
|
|
||||||
spvc_msl_sampler_address r_address;
|
|
||||||
spvc_msl_sampler_compare_func compare_func;
|
|
||||||
spvc_msl_sampler_border_color border_color;
|
|
||||||
float lod_clamp_min;
|
|
||||||
float lod_clamp_max;
|
|
||||||
int max_anisotropy;
|
|
||||||
|
|
||||||
spvc_bool compare_enable;
|
|
||||||
spvc_bool lod_clamp_enable;
|
|
||||||
spvc_bool anisotropy_enable;
|
|
||||||
} spvc_msl_constexpr_sampler;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initializes the constexpr sampler struct.
|
|
||||||
* The defaults are non-zero.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API void spvc_msl_constexpr_sampler_init(spvc_msl_constexpr_sampler *sampler);
|
|
||||||
|
|
||||||
/* Maps to the sampler Y'CbCr conversion-related portions of MSLConstexprSampler. See C++ API for defaults and details. */
|
|
||||||
typedef struct spvc_msl_sampler_ycbcr_conversion
|
|
||||||
{
|
|
||||||
unsigned planes;
|
|
||||||
spvc_msl_format_resolution resolution;
|
|
||||||
spvc_msl_sampler_filter chroma_filter;
|
|
||||||
spvc_msl_chroma_location x_chroma_offset;
|
|
||||||
spvc_msl_chroma_location y_chroma_offset;
|
|
||||||
spvc_msl_component_swizzle swizzle[4];
|
|
||||||
spvc_msl_sampler_ycbcr_model_conversion ycbcr_model;
|
|
||||||
spvc_msl_sampler_ycbcr_range ycbcr_range;
|
|
||||||
unsigned bpc;
|
|
||||||
} spvc_msl_sampler_ycbcr_conversion;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initializes the constexpr sampler struct.
|
|
||||||
* The defaults are non-zero.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API void spvc_msl_sampler_ycbcr_conversion_init(spvc_msl_sampler_ycbcr_conversion *conv);
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef enum spvc_hlsl_binding_flag_bits
|
|
||||||
{
|
|
||||||
SPVC_HLSL_BINDING_AUTO_NONE_BIT = 0,
|
|
||||||
SPVC_HLSL_BINDING_AUTO_PUSH_CONSTANT_BIT = 1 << 0,
|
|
||||||
SPVC_HLSL_BINDING_AUTO_CBV_BIT = 1 << 1,
|
|
||||||
SPVC_HLSL_BINDING_AUTO_SRV_BIT = 1 << 2,
|
|
||||||
SPVC_HLSL_BINDING_AUTO_UAV_BIT = 1 << 3,
|
|
||||||
SPVC_HLSL_BINDING_AUTO_SAMPLER_BIT = 1 << 4,
|
|
||||||
SPVC_HLSL_BINDING_AUTO_ALL = 0x7fffffff
|
|
||||||
} spvc_hlsl_binding_flag_bits;
|
|
||||||
typedef unsigned spvc_hlsl_binding_flags;
|
|
||||||
|
|
||||||
#define SPVC_HLSL_PUSH_CONSTANT_DESC_SET (~(0u))
|
|
||||||
#define SPVC_HLSL_PUSH_CONSTANT_BINDING (0)
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
typedef struct spvc_hlsl_resource_binding_mapping
|
|
||||||
{
|
|
||||||
unsigned register_space;
|
|
||||||
unsigned register_binding;
|
|
||||||
} spvc_hlsl_resource_binding_mapping;
|
|
||||||
|
|
||||||
typedef struct spvc_hlsl_resource_binding
|
|
||||||
{
|
|
||||||
SpvExecutionModel stage;
|
|
||||||
unsigned desc_set;
|
|
||||||
unsigned binding;
|
|
||||||
|
|
||||||
spvc_hlsl_resource_binding_mapping cbv, uav, srv, sampler;
|
|
||||||
} spvc_hlsl_resource_binding;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initializes the resource binding struct.
|
|
||||||
* The defaults are non-zero.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API void spvc_hlsl_resource_binding_init(spvc_hlsl_resource_binding *binding);
|
|
||||||
|
|
||||||
/* Maps to the various spirv_cross::Compiler*::Option structures. See C++ API for defaults and details. */
|
|
||||||
typedef enum spvc_compiler_option
|
|
||||||
{
|
|
||||||
SPVC_COMPILER_OPTION_UNKNOWN = 0,
|
|
||||||
|
|
||||||
SPVC_COMPILER_OPTION_FORCE_TEMPORARY = 1 | SPVC_COMPILER_OPTION_COMMON_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_FLATTEN_MULTIDIMENSIONAL_ARRAYS = 2 | SPVC_COMPILER_OPTION_COMMON_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_FIXUP_DEPTH_CONVENTION = 3 | SPVC_COMPILER_OPTION_COMMON_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_FLIP_VERTEX_Y = 4 | SPVC_COMPILER_OPTION_COMMON_BIT,
|
|
||||||
|
|
||||||
SPVC_COMPILER_OPTION_GLSL_SUPPORT_NONZERO_BASE_INSTANCE = 5 | SPVC_COMPILER_OPTION_GLSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_GLSL_SEPARATE_SHADER_OBJECTS = 6 | SPVC_COMPILER_OPTION_GLSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_GLSL_ENABLE_420PACK_EXTENSION = 7 | SPVC_COMPILER_OPTION_GLSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_GLSL_VERSION = 8 | SPVC_COMPILER_OPTION_GLSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_GLSL_ES = 9 | SPVC_COMPILER_OPTION_GLSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_GLSL_VULKAN_SEMANTICS = 10 | SPVC_COMPILER_OPTION_GLSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_GLSL_ES_DEFAULT_FLOAT_PRECISION_HIGHP = 11 | SPVC_COMPILER_OPTION_GLSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_GLSL_ES_DEFAULT_INT_PRECISION_HIGHP = 12 | SPVC_COMPILER_OPTION_GLSL_BIT,
|
|
||||||
|
|
||||||
SPVC_COMPILER_OPTION_HLSL_SHADER_MODEL = 13 | SPVC_COMPILER_OPTION_HLSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_HLSL_POINT_SIZE_COMPAT = 14 | SPVC_COMPILER_OPTION_HLSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_HLSL_POINT_COORD_COMPAT = 15 | SPVC_COMPILER_OPTION_HLSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_HLSL_SUPPORT_NONZERO_BASE_VERTEX_BASE_INSTANCE = 16 | SPVC_COMPILER_OPTION_HLSL_BIT,
|
|
||||||
|
|
||||||
SPVC_COMPILER_OPTION_MSL_VERSION = 17 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_TEXEL_BUFFER_TEXTURE_WIDTH = 18 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
|
|
||||||
/* Obsolete, use SWIZZLE_BUFFER_INDEX instead. */
|
|
||||||
SPVC_COMPILER_OPTION_MSL_AUX_BUFFER_INDEX = 19 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_SWIZZLE_BUFFER_INDEX = 19 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
|
|
||||||
SPVC_COMPILER_OPTION_MSL_INDIRECT_PARAMS_BUFFER_INDEX = 20 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_SHADER_OUTPUT_BUFFER_INDEX = 21 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_SHADER_PATCH_OUTPUT_BUFFER_INDEX = 22 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_SHADER_TESS_FACTOR_OUTPUT_BUFFER_INDEX = 23 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_SHADER_INPUT_WORKGROUP_INDEX = 24 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_ENABLE_POINT_SIZE_BUILTIN = 25 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_DISABLE_RASTERIZATION = 26 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_CAPTURE_OUTPUT_TO_BUFFER = 27 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_SWIZZLE_TEXTURE_SAMPLES = 28 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_PAD_FRAGMENT_OUTPUT_COMPONENTS = 29 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_TESS_DOMAIN_ORIGIN_LOWER_LEFT = 30 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_PLATFORM = 31 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_ARGUMENT_BUFFERS = 32 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
|
|
||||||
SPVC_COMPILER_OPTION_GLSL_EMIT_PUSH_CONSTANT_AS_UNIFORM_BUFFER = 33 | SPVC_COMPILER_OPTION_GLSL_BIT,
|
|
||||||
|
|
||||||
SPVC_COMPILER_OPTION_MSL_TEXTURE_BUFFER_NATIVE = 34 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
|
|
||||||
SPVC_COMPILER_OPTION_GLSL_EMIT_UNIFORM_BUFFER_AS_PLAIN_UNIFORMS = 35 | SPVC_COMPILER_OPTION_GLSL_BIT,
|
|
||||||
|
|
||||||
SPVC_COMPILER_OPTION_MSL_BUFFER_SIZE_BUFFER_INDEX = 36 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
|
|
||||||
SPVC_COMPILER_OPTION_EMIT_LINE_DIRECTIVES = 37 | SPVC_COMPILER_OPTION_COMMON_BIT,
|
|
||||||
|
|
||||||
SPVC_COMPILER_OPTION_MSL_MULTIVIEW = 38 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_VIEW_MASK_BUFFER_INDEX = 39 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_DEVICE_INDEX = 40 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_VIEW_INDEX_FROM_DEVICE_INDEX = 41 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_DISPATCH_BASE = 42 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_DYNAMIC_OFFSETS_BUFFER_INDEX = 43 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_TEXTURE_1D_AS_2D = 44 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_ENABLE_BASE_INDEX_ZERO = 45 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_IOS_FRAMEBUFFER_FETCH_SUBPASS = 46 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_INVARIANT_FP_MATH = 47 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_EMULATE_CUBEMAP_ARRAY = 48 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_ENABLE_DECORATION_BINDING = 49 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_FORCE_ACTIVE_ARGUMENT_BUFFER_RESOURCES = 50 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_FORCE_NATIVE_ARRAYS = 51 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
|
|
||||||
SPVC_COMPILER_OPTION_ENABLE_STORAGE_IMAGE_QUALIFIER_DEDUCTION = 52 | SPVC_COMPILER_OPTION_COMMON_BIT,
|
|
||||||
|
|
||||||
SPVC_COMPILER_OPTION_HLSL_FORCE_STORAGE_BUFFER_AS_UAV = 53 | SPVC_COMPILER_OPTION_HLSL_BIT,
|
|
||||||
|
|
||||||
SPVC_COMPILER_OPTION_FORCE_ZERO_INITIALIZED_VARIABLES = 54 | SPVC_COMPILER_OPTION_COMMON_BIT,
|
|
||||||
|
|
||||||
SPVC_COMPILER_OPTION_HLSL_NONWRITABLE_UAV_TEXTURE_AS_SRV = 55 | SPVC_COMPILER_OPTION_HLSL_BIT,
|
|
||||||
|
|
||||||
SPVC_COMPILER_OPTION_MSL_ENABLE_FRAG_OUTPUT_MASK = 56 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_ENABLE_FRAG_DEPTH_BUILTIN = 57 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_ENABLE_FRAG_STENCIL_REF_BUILTIN = 58 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
SPVC_COMPILER_OPTION_MSL_ENABLE_CLIP_DISTANCE_USER_VARYING = 59 | SPVC_COMPILER_OPTION_MSL_BIT,
|
|
||||||
|
|
||||||
SPVC_COMPILER_OPTION_INT_MAX = 0x7fffffff
|
|
||||||
} spvc_compiler_option;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Context is the highest-level API construct.
|
|
||||||
* The context owns all memory allocations made by its child object hierarchy, including various non-opaque structs and strings.
|
|
||||||
* This means that the API user only has to care about one "destroy" call ever when using the C API.
|
|
||||||
* All pointers handed out by the APIs are only valid as long as the context
|
|
||||||
* is alive and spvc_context_release_allocations has not been called.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_context_create(spvc_context *context);
|
|
||||||
|
|
||||||
/* Frees all memory allocations and objects associated with the context and its child objects. */
|
|
||||||
SPVC_PUBLIC_API void spvc_context_destroy(spvc_context context);
|
|
||||||
|
|
||||||
/* Frees all memory allocations and objects associated with the context and its child objects, but keeps the context alive. */
|
|
||||||
SPVC_PUBLIC_API void spvc_context_release_allocations(spvc_context context);
|
|
||||||
|
|
||||||
/* Get the string for the last error which was logged. */
|
|
||||||
SPVC_PUBLIC_API const char *spvc_context_get_last_error_string(spvc_context context);
|
|
||||||
|
|
||||||
/* Get notified in a callback when an error triggers. Useful for debugging. */
|
|
||||||
typedef void (*spvc_error_callback)(void *userdata, const char *error);
|
|
||||||
SPVC_PUBLIC_API void spvc_context_set_error_callback(spvc_context context, spvc_error_callback cb, void *userdata);
|
|
||||||
|
|
||||||
/* SPIR-V parsing interface. Maps to Parser which then creates a ParsedIR, and that IR is extracted into the handle. */
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_context_parse_spirv(spvc_context context, const SpvId *spirv, size_t word_count,
|
|
||||||
spvc_parsed_ir *parsed_ir);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create a compiler backend. Capture mode controls if we construct by copy or move semantics.
|
|
||||||
* It is always recommended to use SPVC_CAPTURE_MODE_TAKE_OWNERSHIP if you only intend to cross-compile the IR once.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_context_create_compiler(spvc_context context, spvc_backend backend,
|
|
||||||
spvc_parsed_ir parsed_ir, spvc_capture_mode mode,
|
|
||||||
spvc_compiler *compiler);
|
|
||||||
|
|
||||||
/* Maps directly to C++ API. */
|
|
||||||
SPVC_PUBLIC_API unsigned spvc_compiler_get_current_id_bound(spvc_compiler compiler);
|
|
||||||
|
|
||||||
/* Create compiler options, which will initialize defaults. */
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_create_compiler_options(spvc_compiler compiler,
|
|
||||||
spvc_compiler_options *options);
|
|
||||||
/* Override options. Will return error if e.g. MSL options are used for the HLSL backend, etc. */
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_options_set_bool(spvc_compiler_options options,
|
|
||||||
spvc_compiler_option option, spvc_bool value);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_options_set_uint(spvc_compiler_options options,
|
|
||||||
spvc_compiler_option option, unsigned value);
|
|
||||||
/* Set compiler options. */
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_install_compiler_options(spvc_compiler compiler,
|
|
||||||
spvc_compiler_options options);
|
|
||||||
|
|
||||||
/* Compile IR into a string. *source is owned by the context, and caller must not free it themselves. */
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_compile(spvc_compiler compiler, const char **source);
|
|
||||||
|
|
||||||
/* Maps to C++ API. */
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_add_header_line(spvc_compiler compiler, const char *line);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_require_extension(spvc_compiler compiler, const char *ext);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_flatten_buffer_block(spvc_compiler compiler, spvc_variable_id id);
|
|
||||||
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_compiler_variable_is_depth_or_compare(spvc_compiler compiler, spvc_variable_id id);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* HLSL specifics.
|
|
||||||
* Maps to C++ API.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_hlsl_set_root_constants_layout(spvc_compiler compiler,
|
|
||||||
const spvc_hlsl_root_constants *constant_info,
|
|
||||||
size_t count);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_hlsl_add_vertex_attribute_remap(spvc_compiler compiler,
|
|
||||||
const spvc_hlsl_vertex_attribute_remap *remap,
|
|
||||||
size_t remaps);
|
|
||||||
SPVC_PUBLIC_API spvc_variable_id spvc_compiler_hlsl_remap_num_workgroups_builtin(spvc_compiler compiler);
|
|
||||||
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_hlsl_set_resource_binding_flags(spvc_compiler compiler,
|
|
||||||
spvc_hlsl_binding_flags flags);
|
|
||||||
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_hlsl_add_resource_binding(spvc_compiler compiler,
|
|
||||||
const spvc_hlsl_resource_binding *binding);
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_compiler_hlsl_is_resource_used(spvc_compiler compiler,
|
|
||||||
SpvExecutionModel model,
|
|
||||||
unsigned set,
|
|
||||||
unsigned binding);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* MSL specifics.
|
|
||||||
* Maps to C++ API.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_compiler_msl_is_rasterization_disabled(spvc_compiler compiler);
|
|
||||||
|
|
||||||
/* Obsolete. Renamed to needs_swizzle_buffer. */
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_compiler_msl_needs_aux_buffer(spvc_compiler compiler);
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_compiler_msl_needs_swizzle_buffer(spvc_compiler compiler);
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_compiler_msl_needs_buffer_size_buffer(spvc_compiler compiler);
|
|
||||||
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_compiler_msl_needs_output_buffer(spvc_compiler compiler);
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_compiler_msl_needs_patch_output_buffer(spvc_compiler compiler);
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_compiler_msl_needs_input_threadgroup_mem(spvc_compiler compiler);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_msl_add_vertex_attribute(spvc_compiler compiler,
|
|
||||||
const spvc_msl_vertex_attribute *attrs);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_msl_add_resource_binding(spvc_compiler compiler,
|
|
||||||
const spvc_msl_resource_binding *binding);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_msl_add_discrete_descriptor_set(spvc_compiler compiler, unsigned desc_set);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_msl_set_argument_buffer_device_address_space(spvc_compiler compiler, unsigned desc_set, spvc_bool device_address);
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_compiler_msl_is_vertex_attribute_used(spvc_compiler compiler, unsigned location);
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_compiler_msl_is_resource_used(spvc_compiler compiler,
|
|
||||||
SpvExecutionModel model,
|
|
||||||
unsigned set,
|
|
||||||
unsigned binding);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_msl_remap_constexpr_sampler(spvc_compiler compiler, spvc_variable_id id, const spvc_msl_constexpr_sampler *sampler);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_msl_remap_constexpr_sampler_by_binding(spvc_compiler compiler, unsigned desc_set, unsigned binding, const spvc_msl_constexpr_sampler *sampler);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_msl_remap_constexpr_sampler_ycbcr(spvc_compiler compiler, spvc_variable_id id, const spvc_msl_constexpr_sampler *sampler, const spvc_msl_sampler_ycbcr_conversion *conv);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_msl_remap_constexpr_sampler_by_binding_ycbcr(spvc_compiler compiler, unsigned desc_set, unsigned binding, const spvc_msl_constexpr_sampler *sampler, const spvc_msl_sampler_ycbcr_conversion *conv);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_msl_set_fragment_output_components(spvc_compiler compiler, unsigned location, unsigned components);
|
|
||||||
|
|
||||||
SPVC_PUBLIC_API unsigned spvc_compiler_msl_get_automatic_resource_binding(spvc_compiler compiler, spvc_variable_id id);
|
|
||||||
SPVC_PUBLIC_API unsigned spvc_compiler_msl_get_automatic_resource_binding_secondary(spvc_compiler compiler, spvc_variable_id id);
|
|
||||||
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_msl_add_dynamic_buffer(spvc_compiler compiler, unsigned desc_set, unsigned binding, unsigned index);
|
|
||||||
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_msl_add_inline_uniform_block(spvc_compiler compiler, unsigned desc_set, unsigned binding);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Reflect resources.
|
|
||||||
* Maps almost 1:1 to C++ API.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_get_active_interface_variables(spvc_compiler compiler, spvc_set *set);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_set_enabled_interface_variables(spvc_compiler compiler, spvc_set set);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_create_shader_resources(spvc_compiler compiler, spvc_resources *resources);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_create_shader_resources_for_active_variables(spvc_compiler compiler,
|
|
||||||
spvc_resources *resources,
|
|
||||||
spvc_set active);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_resources_get_resource_list_for_type(spvc_resources resources, spvc_resource_type type,
|
|
||||||
const spvc_reflected_resource **resource_list,
|
|
||||||
size_t *resource_size);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Decorations.
|
|
||||||
* Maps to C++ API.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API void spvc_compiler_set_decoration(spvc_compiler compiler, SpvId id, SpvDecoration decoration,
|
|
||||||
unsigned argument);
|
|
||||||
SPVC_PUBLIC_API void spvc_compiler_set_decoration_string(spvc_compiler compiler, SpvId id, SpvDecoration decoration,
|
|
||||||
const char *argument);
|
|
||||||
SPVC_PUBLIC_API void spvc_compiler_set_name(spvc_compiler compiler, SpvId id, const char *argument);
|
|
||||||
SPVC_PUBLIC_API void spvc_compiler_set_member_decoration(spvc_compiler compiler, spvc_type_id id, unsigned member_index,
|
|
||||||
SpvDecoration decoration, unsigned argument);
|
|
||||||
SPVC_PUBLIC_API void spvc_compiler_set_member_decoration_string(spvc_compiler compiler, spvc_type_id id,
|
|
||||||
unsigned member_index, SpvDecoration decoration,
|
|
||||||
const char *argument);
|
|
||||||
SPVC_PUBLIC_API void spvc_compiler_set_member_name(spvc_compiler compiler, spvc_type_id id, unsigned member_index,
|
|
||||||
const char *argument);
|
|
||||||
SPVC_PUBLIC_API void spvc_compiler_unset_decoration(spvc_compiler compiler, SpvId id, SpvDecoration decoration);
|
|
||||||
SPVC_PUBLIC_API void spvc_compiler_unset_member_decoration(spvc_compiler compiler, spvc_type_id id,
|
|
||||||
unsigned member_index, SpvDecoration decoration);
|
|
||||||
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_compiler_has_decoration(spvc_compiler compiler, SpvId id, SpvDecoration decoration);
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_compiler_has_member_decoration(spvc_compiler compiler, spvc_type_id id,
|
|
||||||
unsigned member_index, SpvDecoration decoration);
|
|
||||||
SPVC_PUBLIC_API const char *spvc_compiler_get_name(spvc_compiler compiler, SpvId id);
|
|
||||||
SPVC_PUBLIC_API unsigned spvc_compiler_get_decoration(spvc_compiler compiler, SpvId id, SpvDecoration decoration);
|
|
||||||
SPVC_PUBLIC_API const char *spvc_compiler_get_decoration_string(spvc_compiler compiler, SpvId id,
|
|
||||||
SpvDecoration decoration);
|
|
||||||
SPVC_PUBLIC_API unsigned spvc_compiler_get_member_decoration(spvc_compiler compiler, spvc_type_id id,
|
|
||||||
unsigned member_index, SpvDecoration decoration);
|
|
||||||
SPVC_PUBLIC_API const char *spvc_compiler_get_member_decoration_string(spvc_compiler compiler, spvc_type_id id,
|
|
||||||
unsigned member_index, SpvDecoration decoration);
|
|
||||||
SPVC_PUBLIC_API const char *spvc_compiler_get_member_name(spvc_compiler compiler, spvc_type_id id, unsigned member_index);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Entry points.
|
|
||||||
* Maps to C++ API.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_get_entry_points(spvc_compiler compiler,
|
|
||||||
const spvc_entry_point **entry_points,
|
|
||||||
size_t *num_entry_points);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_set_entry_point(spvc_compiler compiler, const char *name,
|
|
||||||
SpvExecutionModel model);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_rename_entry_point(spvc_compiler compiler, const char *old_name,
|
|
||||||
const char *new_name, SpvExecutionModel model);
|
|
||||||
SPVC_PUBLIC_API const char *spvc_compiler_get_cleansed_entry_point_name(spvc_compiler compiler, const char *name,
|
|
||||||
SpvExecutionModel model);
|
|
||||||
SPVC_PUBLIC_API void spvc_compiler_set_execution_mode(spvc_compiler compiler, SpvExecutionMode mode);
|
|
||||||
SPVC_PUBLIC_API void spvc_compiler_unset_execution_mode(spvc_compiler compiler, SpvExecutionMode mode);
|
|
||||||
SPVC_PUBLIC_API void spvc_compiler_set_execution_mode_with_arguments(spvc_compiler compiler, SpvExecutionMode mode,
|
|
||||||
unsigned arg0, unsigned arg1, unsigned arg2);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_get_execution_modes(spvc_compiler compiler, const SpvExecutionMode **modes,
|
|
||||||
size_t *num_modes);
|
|
||||||
SPVC_PUBLIC_API unsigned spvc_compiler_get_execution_mode_argument(spvc_compiler compiler, SpvExecutionMode mode);
|
|
||||||
SPVC_PUBLIC_API unsigned spvc_compiler_get_execution_mode_argument_by_index(spvc_compiler compiler,
|
|
||||||
SpvExecutionMode mode, unsigned index);
|
|
||||||
SPVC_PUBLIC_API SpvExecutionModel spvc_compiler_get_execution_model(spvc_compiler compiler);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Type query interface.
|
|
||||||
* Maps to C++ API, except it's read-only.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API spvc_type spvc_compiler_get_type_handle(spvc_compiler compiler, spvc_type_id id);
|
|
||||||
|
|
||||||
/* Pulls out SPIRType::self. This effectively gives the type ID without array or pointer qualifiers.
|
|
||||||
* This is necessary when reflecting decoration/name information on members of a struct,
|
|
||||||
* which are placed in the base type, not the qualified type.
|
|
||||||
* This is similar to spvc_reflected_resource::base_type_id. */
|
|
||||||
SPVC_PUBLIC_API spvc_type_id spvc_type_get_base_type_id(spvc_type type);
|
|
||||||
|
|
||||||
SPVC_PUBLIC_API spvc_basetype spvc_type_get_basetype(spvc_type type);
|
|
||||||
SPVC_PUBLIC_API unsigned spvc_type_get_bit_width(spvc_type type);
|
|
||||||
SPVC_PUBLIC_API unsigned spvc_type_get_vector_size(spvc_type type);
|
|
||||||
SPVC_PUBLIC_API unsigned spvc_type_get_columns(spvc_type type);
|
|
||||||
SPVC_PUBLIC_API unsigned spvc_type_get_num_array_dimensions(spvc_type type);
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_type_array_dimension_is_literal(spvc_type type, unsigned dimension);
|
|
||||||
SPVC_PUBLIC_API SpvId spvc_type_get_array_dimension(spvc_type type, unsigned dimension);
|
|
||||||
SPVC_PUBLIC_API unsigned spvc_type_get_num_member_types(spvc_type type);
|
|
||||||
SPVC_PUBLIC_API spvc_type_id spvc_type_get_member_type(spvc_type type, unsigned index);
|
|
||||||
SPVC_PUBLIC_API SpvStorageClass spvc_type_get_storage_class(spvc_type type);
|
|
||||||
|
|
||||||
/* Image type query. */
|
|
||||||
SPVC_PUBLIC_API spvc_type_id spvc_type_get_image_sampled_type(spvc_type type);
|
|
||||||
SPVC_PUBLIC_API SpvDim spvc_type_get_image_dimension(spvc_type type);
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_type_get_image_is_depth(spvc_type type);
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_type_get_image_arrayed(spvc_type type);
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_type_get_image_multisampled(spvc_type type);
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_type_get_image_is_storage(spvc_type type);
|
|
||||||
SPVC_PUBLIC_API SpvImageFormat spvc_type_get_image_storage_format(spvc_type type);
|
|
||||||
SPVC_PUBLIC_API SpvAccessQualifier spvc_type_get_image_access_qualifier(spvc_type type);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Buffer layout query.
|
|
||||||
* Maps to C++ API.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_get_declared_struct_size(spvc_compiler compiler, spvc_type struct_type, size_t *size);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_get_declared_struct_size_runtime_array(spvc_compiler compiler,
|
|
||||||
spvc_type struct_type, size_t array_size, size_t *size);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_get_declared_struct_member_size(spvc_compiler compiler, spvc_type type, unsigned index, size_t *size);
|
|
||||||
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_type_struct_member_offset(spvc_compiler compiler,
|
|
||||||
spvc_type type, unsigned index, unsigned *offset);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_type_struct_member_array_stride(spvc_compiler compiler,
|
|
||||||
spvc_type type, unsigned index, unsigned *stride);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_type_struct_member_matrix_stride(spvc_compiler compiler,
|
|
||||||
spvc_type type, unsigned index, unsigned *stride);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Workaround helper functions.
|
|
||||||
* Maps to C++ API.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_build_dummy_sampler_for_combined_images(spvc_compiler compiler, spvc_variable_id *id);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_build_combined_image_samplers(spvc_compiler compiler);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_get_combined_image_samplers(spvc_compiler compiler,
|
|
||||||
const spvc_combined_image_sampler **samplers,
|
|
||||||
size_t *num_samplers);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Constants
|
|
||||||
* Maps to C++ API.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_get_specialization_constants(spvc_compiler compiler,
|
|
||||||
const spvc_specialization_constant **constants,
|
|
||||||
size_t *num_constants);
|
|
||||||
SPVC_PUBLIC_API spvc_constant spvc_compiler_get_constant_handle(spvc_compiler compiler,
|
|
||||||
spvc_constant_id id);
|
|
||||||
|
|
||||||
SPVC_PUBLIC_API spvc_constant_id spvc_compiler_get_work_group_size_specialization_constants(spvc_compiler compiler,
|
|
||||||
spvc_specialization_constant *x,
|
|
||||||
spvc_specialization_constant *y,
|
|
||||||
spvc_specialization_constant *z);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Buffer ranges
|
|
||||||
* Maps to C++ API.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_get_active_buffer_ranges(spvc_compiler compiler,
|
|
||||||
spvc_variable_id id,
|
|
||||||
const spvc_buffer_range **ranges,
|
|
||||||
size_t *num_ranges);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* No stdint.h until C99, sigh :(
|
|
||||||
* For smaller types, the result is sign or zero-extended as appropriate.
|
|
||||||
* Maps to C++ API.
|
|
||||||
* TODO: The SPIRConstant query interface and modification interface is not quite complete.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API float spvc_constant_get_scalar_fp16(spvc_constant constant, unsigned column, unsigned row);
|
|
||||||
SPVC_PUBLIC_API float spvc_constant_get_scalar_fp32(spvc_constant constant, unsigned column, unsigned row);
|
|
||||||
SPVC_PUBLIC_API double spvc_constant_get_scalar_fp64(spvc_constant constant, unsigned column, unsigned row);
|
|
||||||
SPVC_PUBLIC_API unsigned spvc_constant_get_scalar_u32(spvc_constant constant, unsigned column, unsigned row);
|
|
||||||
SPVC_PUBLIC_API int spvc_constant_get_scalar_i32(spvc_constant constant, unsigned column, unsigned row);
|
|
||||||
SPVC_PUBLIC_API unsigned spvc_constant_get_scalar_u16(spvc_constant constant, unsigned column, unsigned row);
|
|
||||||
SPVC_PUBLIC_API int spvc_constant_get_scalar_i16(spvc_constant constant, unsigned column, unsigned row);
|
|
||||||
SPVC_PUBLIC_API unsigned spvc_constant_get_scalar_u8(spvc_constant constant, unsigned column, unsigned row);
|
|
||||||
SPVC_PUBLIC_API int spvc_constant_get_scalar_i8(spvc_constant constant, unsigned column, unsigned row);
|
|
||||||
SPVC_PUBLIC_API void spvc_constant_get_subconstants(spvc_constant constant, const spvc_constant_id **constituents, size_t *count);
|
|
||||||
SPVC_PUBLIC_API spvc_type_id spvc_constant_get_type(spvc_constant constant);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Misc reflection
|
|
||||||
* Maps to C++ API.
|
|
||||||
*/
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_compiler_get_binary_offset_for_decoration(spvc_compiler compiler,
|
|
||||||
spvc_variable_id id,
|
|
||||||
SpvDecoration decoration,
|
|
||||||
unsigned *word_offset);
|
|
||||||
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_compiler_buffer_is_hlsl_counter_buffer(spvc_compiler compiler, spvc_variable_id id);
|
|
||||||
SPVC_PUBLIC_API spvc_bool spvc_compiler_buffer_get_hlsl_counter_buffer(spvc_compiler compiler, spvc_variable_id id,
|
|
||||||
spvc_variable_id *counter_id);
|
|
||||||
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_get_declared_capabilities(spvc_compiler compiler,
|
|
||||||
const SpvCapability **capabilities,
|
|
||||||
size_t *num_capabilities);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_get_declared_extensions(spvc_compiler compiler, const char ***extensions,
|
|
||||||
size_t *num_extensions);
|
|
||||||
|
|
||||||
SPVC_PUBLIC_API const char *spvc_compiler_get_remapped_declared_block_name(spvc_compiler compiler, spvc_variable_id id);
|
|
||||||
SPVC_PUBLIC_API spvc_result spvc_compiler_get_buffer_block_decorations(spvc_compiler compiler, spvc_variable_id id,
|
|
||||||
const SpvDecoration **decorations,
|
|
||||||
size_t *num_decorations);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2019-2020 Hans-Kristian Arntzen
|
* Copyright 2019-2021 Hans-Kristian Arntzen
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -14,6 +14,13 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At your option, you may choose to accept this material under either:
|
||||||
|
* 1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or
|
||||||
|
* 2. The MIT License, found at <http://opensource.org/licenses/MIT>.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 OR MIT.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef SPIRV_CROSS_CONTAINERS_HPP
|
#ifndef SPIRV_CROSS_CONTAINERS_HPP
|
||||||
#define SPIRV_CROSS_CONTAINERS_HPP
|
#define SPIRV_CROSS_CONTAINERS_HPP
|
||||||
|
|
||||||
|
|
@ -63,7 +70,8 @@ public:
|
||||||
private:
|
private:
|
||||||
#if defined(_MSC_VER) && _MSC_VER < 1900
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
// MSVC 2013 workarounds, sigh ...
|
// MSVC 2013 workarounds, sigh ...
|
||||||
union {
|
union
|
||||||
|
{
|
||||||
char aligned_char[sizeof(T) * N];
|
char aligned_char[sizeof(T) * N];
|
||||||
double dummy_aligner;
|
double dummy_aligner;
|
||||||
} u;
|
} u;
|
||||||
|
|
@ -211,6 +219,10 @@ public:
|
||||||
this->buffer_size = count;
|
this->buffer_size = count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SmallVector(std::initializer_list<T> init) SPIRV_CROSS_NOEXCEPT : SmallVector(init.begin(), init.end())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
SmallVector(SmallVector &&other) SPIRV_CROSS_NOEXCEPT : SmallVector()
|
SmallVector(SmallVector &&other) SPIRV_CROSS_NOEXCEPT : SmallVector()
|
||||||
{
|
{
|
||||||
*this = std::move(other);
|
*this = std::move(other);
|
||||||
|
|
@ -327,8 +339,9 @@ public:
|
||||||
size_t target_capacity = buffer_capacity;
|
size_t target_capacity = buffer_capacity;
|
||||||
if (target_capacity == 0)
|
if (target_capacity == 0)
|
||||||
target_capacity = 1;
|
target_capacity = 1;
|
||||||
if (target_capacity < N)
|
|
||||||
target_capacity = N;
|
// Weird parens works around macro issues on Windows if NOMINMAX is not used.
|
||||||
|
target_capacity = (std::max)(target_capacity, N);
|
||||||
|
|
||||||
// Need to ensure there is a POT value of target capacity which is larger than count,
|
// Need to ensure there is a POT value of target capacity which is larger than count,
|
||||||
// otherwise this will overflow.
|
// otherwise this will overflow.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2015-2020 Arm Limited
|
* Copyright 2015-2021 Arm Limited
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -14,6 +14,13 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At your option, you may choose to accept this material under either:
|
||||||
|
* 1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or
|
||||||
|
* 2. The MIT License, found at <http://opensource.org/licenses/MIT>.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 OR MIT.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef SPIRV_CROSS_ERROR_HANDLING
|
#ifndef SPIRV_CROSS_ERROR_HANDLING
|
||||||
#define SPIRV_CROSS_ERROR_HANDLING
|
#define SPIRV_CROSS_ERROR_HANDLING
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018-2020 Arm Limited
|
* Copyright 2018-2021 Arm Limited
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -14,6 +14,13 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At your option, you may choose to accept this material under either:
|
||||||
|
* 1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or
|
||||||
|
* 2. The MIT License, found at <http://opensource.org/licenses/MIT>.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 OR MIT.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef SPIRV_CROSS_PARSED_IR_HPP
|
#ifndef SPIRV_CROSS_PARSED_IR_HPP
|
||||||
#define SPIRV_CROSS_PARSED_IR_HPP
|
#define SPIRV_CROSS_PARSED_IR_HPP
|
||||||
|
|
||||||
|
|
@ -139,6 +146,7 @@ public:
|
||||||
void mark_used_as_array_length(ID id);
|
void mark_used_as_array_length(ID id);
|
||||||
uint32_t increase_bound_by(uint32_t count);
|
uint32_t increase_bound_by(uint32_t count);
|
||||||
Bitset get_buffer_block_flags(const SPIRVariable &var) const;
|
Bitset get_buffer_block_flags(const SPIRVariable &var) const;
|
||||||
|
Bitset get_buffer_block_type_flags(const SPIRType &type) const;
|
||||||
|
|
||||||
void add_typed_id(Types type, ID id);
|
void add_typed_id(Types type, ID id);
|
||||||
void remove_typed_id(Types type, ID id);
|
void remove_typed_id(Types type, ID id);
|
||||||
|
|
@ -208,6 +216,14 @@ public:
|
||||||
|
|
||||||
void make_constant_null(uint32_t id, uint32_t type, bool add_to_typed_id_set);
|
void make_constant_null(uint32_t id, uint32_t type, bool add_to_typed_id_set);
|
||||||
|
|
||||||
|
void fixup_reserved_names();
|
||||||
|
|
||||||
|
static void sanitize_underscores(std::string &str);
|
||||||
|
static void sanitize_identifier(std::string &str, bool member, bool allow_reserved_prefixes);
|
||||||
|
static bool is_globally_reserved_identifier(std::string &str, bool allow_reserved_prefixes);
|
||||||
|
|
||||||
|
uint32_t get_spirv_version() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T &get(uint32_t id)
|
T &get(uint32_t id)
|
||||||
|
|
@ -225,6 +241,8 @@ private:
|
||||||
mutable uint32_t loop_iteration_depth_soft = 0;
|
mutable uint32_t loop_iteration_depth_soft = 0;
|
||||||
std::string empty_string;
|
std::string empty_string;
|
||||||
Bitset cleared_bitset;
|
Bitset cleared_bitset;
|
||||||
|
|
||||||
|
std::unordered_set<uint32_t> meta_needing_name_fixup;
|
||||||
};
|
};
|
||||||
} // namespace SPIRV_CROSS_NAMESPACE
|
} // namespace SPIRV_CROSS_NAMESPACE
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2015-2020 Arm Limited
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef SPIRV_CROSS_UTIL_HPP
|
|
||||||
#define SPIRV_CROSS_UTIL_HPP
|
|
||||||
|
|
||||||
#include "spirv_cross.hpp"
|
|
||||||
|
|
||||||
namespace spirv_cross_util
|
|
||||||
{
|
|
||||||
void rename_interface_variable(SPIRV_CROSS_NAMESPACE::Compiler &compiler,
|
|
||||||
const SPIRV_CROSS_NAMESPACE::SmallVector<SPIRV_CROSS_NAMESPACE::Resource> &resources,
|
|
||||||
uint32_t location, const std::string &name);
|
|
||||||
void inherit_combined_sampler_bindings(SPIRV_CROSS_NAMESPACE::Compiler &compiler);
|
|
||||||
} // namespace spirv_cross_util
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2015-2020 Arm Limited
|
* Copyright 2015-2021 Arm Limited
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -14,6 +14,13 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At your option, you may choose to accept this material under either:
|
||||||
|
* 1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or
|
||||||
|
* 2. The MIT License, found at <http://opensource.org/licenses/MIT>.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 OR MIT.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef SPIRV_CROSS_GLSL_HPP
|
#ifndef SPIRV_CROSS_GLSL_HPP
|
||||||
#define SPIRV_CROSS_GLSL_HPP
|
#define SPIRV_CROSS_GLSL_HPP
|
||||||
|
|
||||||
|
|
@ -57,7 +64,8 @@ enum AccessChainFlagBits
|
||||||
ACCESS_CHAIN_CHAIN_ONLY_BIT = 1 << 1,
|
ACCESS_CHAIN_CHAIN_ONLY_BIT = 1 << 1,
|
||||||
ACCESS_CHAIN_PTR_CHAIN_BIT = 1 << 2,
|
ACCESS_CHAIN_PTR_CHAIN_BIT = 1 << 2,
|
||||||
ACCESS_CHAIN_SKIP_REGISTER_EXPRESSION_READ_BIT = 1 << 3,
|
ACCESS_CHAIN_SKIP_REGISTER_EXPRESSION_READ_BIT = 1 << 3,
|
||||||
ACCESS_CHAIN_LITERAL_MSB_FORCE_ID = 1 << 4
|
ACCESS_CHAIN_LITERAL_MSB_FORCE_ID = 1 << 4,
|
||||||
|
ACCESS_CHAIN_FLATTEN_ALL_MEMBERS_BIT = 1 << 5
|
||||||
};
|
};
|
||||||
typedef uint32_t AccessChainFlags;
|
typedef uint32_t AccessChainFlags;
|
||||||
|
|
||||||
|
|
@ -120,6 +128,10 @@ public:
|
||||||
// which would otherwise be uninitialized will now be initialized to 0 instead.
|
// which would otherwise be uninitialized will now be initialized to 0 instead.
|
||||||
bool force_zero_initialized_variables = false;
|
bool force_zero_initialized_variables = false;
|
||||||
|
|
||||||
|
// In GLSL, force use of I/O block flattening, similar to
|
||||||
|
// what happens on legacy GLSL targets for blocks and structs.
|
||||||
|
bool force_flattened_io_blocks = false;
|
||||||
|
|
||||||
enum Precision
|
enum Precision
|
||||||
{
|
{
|
||||||
DontCare,
|
DontCare,
|
||||||
|
|
@ -128,14 +140,16 @@ public:
|
||||||
Highp
|
Highp
|
||||||
};
|
};
|
||||||
|
|
||||||
struct
|
struct VertexOptions
|
||||||
{
|
{
|
||||||
// GLSL: In vertex shaders, rewrite [0, w] depth (Vulkan/D3D style) to [-w, w] depth (GL style).
|
// "Vertex-like shader" here is any shader stage that can write BuiltInPosition.
|
||||||
// MSL: In vertex shaders, rewrite [-w, w] depth (GL style) to [0, w] depth.
|
|
||||||
// HLSL: In vertex shaders, rewrite [-w, w] depth (GL style) to [0, w] depth.
|
// GLSL: In vertex-like shaders, rewrite [0, w] depth (Vulkan/D3D style) to [-w, w] depth (GL style).
|
||||||
|
// MSL: In vertex-like shaders, rewrite [-w, w] depth (GL style) to [0, w] depth.
|
||||||
|
// HLSL: In vertex-like shaders, rewrite [-w, w] depth (GL style) to [0, w] depth.
|
||||||
bool fixup_clipspace = false;
|
bool fixup_clipspace = false;
|
||||||
|
|
||||||
// Inverts gl_Position.y or equivalent.
|
// In vertex-like shaders, inverts gl_Position.y or equivalent.
|
||||||
bool flip_vert_y = false;
|
bool flip_vert_y = false;
|
||||||
|
|
||||||
// GLSL only, for HLSL version of this option, see CompilerHLSL.
|
// GLSL only, for HLSL version of this option, see CompilerHLSL.
|
||||||
|
|
@ -145,7 +159,7 @@ public:
|
||||||
bool support_nonzero_base_instance = true;
|
bool support_nonzero_base_instance = true;
|
||||||
} vertex;
|
} vertex;
|
||||||
|
|
||||||
struct
|
struct FragmentOptions
|
||||||
{
|
{
|
||||||
// Add precision mediump float in ES targets when emitting GLES source.
|
// Add precision mediump float in ES targets when emitting GLES source.
|
||||||
// Add precision highp int in ES targets when emitting GLES source.
|
// Add precision highp int in ES targets when emitting GLES source.
|
||||||
|
|
@ -237,6 +251,82 @@ public:
|
||||||
bool variable_is_depth_or_compare(VariableID id) const;
|
bool variable_is_depth_or_compare(VariableID id) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
struct ShaderSubgroupSupportHelper
|
||||||
|
{
|
||||||
|
// lower enum value = greater priority
|
||||||
|
enum Candidate
|
||||||
|
{
|
||||||
|
KHR_shader_subgroup_ballot,
|
||||||
|
KHR_shader_subgroup_basic,
|
||||||
|
KHR_shader_subgroup_vote,
|
||||||
|
NV_gpu_shader_5,
|
||||||
|
NV_shader_thread_group,
|
||||||
|
NV_shader_thread_shuffle,
|
||||||
|
ARB_shader_ballot,
|
||||||
|
ARB_shader_group_vote,
|
||||||
|
AMD_gcn_shader,
|
||||||
|
|
||||||
|
CandidateCount
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *get_extension_name(Candidate c);
|
||||||
|
static SmallVector<std::string> get_extra_required_extension_names(Candidate c);
|
||||||
|
static const char *get_extra_required_extension_predicate(Candidate c);
|
||||||
|
|
||||||
|
enum Feature
|
||||||
|
{
|
||||||
|
SubgroupMask = 0,
|
||||||
|
SubgroupSize = 1,
|
||||||
|
SubgroupInvocationID = 2,
|
||||||
|
SubgroupID = 3,
|
||||||
|
NumSubgroups = 4,
|
||||||
|
SubgroupBroadcast_First = 5,
|
||||||
|
SubgroupBallotFindLSB_MSB = 6,
|
||||||
|
SubgroupAll_Any_AllEqualBool = 7,
|
||||||
|
SubgroupAllEqualT = 8,
|
||||||
|
SubgroupElect = 9,
|
||||||
|
SubgroupBarrier = 10,
|
||||||
|
SubgroupMemBarrier = 11,
|
||||||
|
SubgroupBallot = 12,
|
||||||
|
SubgroupInverseBallot_InclBitCount_ExclBitCout = 13,
|
||||||
|
SubgroupBallotBitExtract = 14,
|
||||||
|
SubgroupBallotBitCount = 15,
|
||||||
|
|
||||||
|
FeatureCount
|
||||||
|
};
|
||||||
|
|
||||||
|
using FeatureMask = uint32_t;
|
||||||
|
static_assert(sizeof(FeatureMask) * 8u >= FeatureCount, "Mask type needs more bits.");
|
||||||
|
|
||||||
|
using CandidateVector = SmallVector<Candidate, CandidateCount>;
|
||||||
|
using FeatureVector = SmallVector<Feature>;
|
||||||
|
|
||||||
|
static FeatureVector get_feature_dependencies(Feature feature);
|
||||||
|
static FeatureMask get_feature_dependency_mask(Feature feature);
|
||||||
|
static bool can_feature_be_implemented_without_extensions(Feature feature);
|
||||||
|
static Candidate get_KHR_extension_for_feature(Feature feature);
|
||||||
|
|
||||||
|
struct Result
|
||||||
|
{
|
||||||
|
Result();
|
||||||
|
uint32_t weights[CandidateCount];
|
||||||
|
};
|
||||||
|
|
||||||
|
void request_feature(Feature feature);
|
||||||
|
bool is_feature_requested(Feature feature) const;
|
||||||
|
Result resolve() const;
|
||||||
|
|
||||||
|
static CandidateVector get_candidates_for_feature(Feature ft, const Result &r);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static CandidateVector get_candidates_for_feature(Feature ft);
|
||||||
|
static FeatureMask build_mask(const SmallVector<Feature> &features);
|
||||||
|
FeatureMask feature_mask = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO remove this function when all subgroup ops are supported (or make it always return true)
|
||||||
|
static bool is_supported_subgroup_op_in_opengl(spv::Op op);
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
void emit_function(SPIRFunction &func, const Bitset &return_flags);
|
void emit_function(SPIRFunction &func, const Bitset &return_flags);
|
||||||
|
|
||||||
|
|
@ -267,9 +357,11 @@ protected:
|
||||||
void build_workgroup_size(SmallVector<std::string> &arguments, const SpecializationConstant &x,
|
void build_workgroup_size(SmallVector<std::string> &arguments, const SpecializationConstant &x,
|
||||||
const SpecializationConstant &y, const SpecializationConstant &z);
|
const SpecializationConstant &y, const SpecializationConstant &z);
|
||||||
|
|
||||||
|
void request_subgroup_feature(ShaderSubgroupSupportHelper::Feature feature);
|
||||||
|
|
||||||
virtual void emit_sampled_image_op(uint32_t result_type, uint32_t result_id, uint32_t image_id, uint32_t samp_id);
|
virtual void emit_sampled_image_op(uint32_t result_type, uint32_t result_id, uint32_t image_id, uint32_t samp_id);
|
||||||
virtual void emit_texture_op(const Instruction &i);
|
virtual void emit_texture_op(const Instruction &i, bool sparse);
|
||||||
virtual std::string to_texture_op(const Instruction &i, bool *forward,
|
virtual std::string to_texture_op(const Instruction &i, bool sparse, bool *forward,
|
||||||
SmallVector<uint32_t> &inherited_expressions);
|
SmallVector<uint32_t> &inherited_expressions);
|
||||||
virtual void emit_subgroup_op(const Instruction &i);
|
virtual void emit_subgroup_op(const Instruction &i);
|
||||||
virtual std::string type_to_glsl(const SPIRType &type, uint32_t id = 0);
|
virtual std::string type_to_glsl(const SPIRType &type, uint32_t id = 0);
|
||||||
|
|
@ -284,14 +376,42 @@ protected:
|
||||||
virtual void emit_fixup();
|
virtual void emit_fixup();
|
||||||
virtual std::string variable_decl(const SPIRType &type, const std::string &name, uint32_t id = 0);
|
virtual std::string variable_decl(const SPIRType &type, const std::string &name, uint32_t id = 0);
|
||||||
virtual std::string to_func_call_arg(const SPIRFunction::Parameter &arg, uint32_t id);
|
virtual std::string to_func_call_arg(const SPIRFunction::Parameter &arg, uint32_t id);
|
||||||
virtual std::string to_function_name(VariableID img, const SPIRType &imgtype, bool is_fetch, bool is_gather,
|
|
||||||
bool is_proj, bool has_array_offsets, bool has_offset, bool has_grad,
|
struct TextureFunctionBaseArguments
|
||||||
bool has_dref, uint32_t lod, uint32_t minlod);
|
{
|
||||||
virtual std::string to_function_args(VariableID img, const SPIRType &imgtype, bool is_fetch, bool is_gather,
|
// GCC 4.8 workarounds, it doesn't understand '{}' constructor here, use explicit default constructor.
|
||||||
bool is_proj, uint32_t coord, uint32_t coord_components, uint32_t dref,
|
TextureFunctionBaseArguments() = default;
|
||||||
uint32_t grad_x, uint32_t grad_y, uint32_t lod, uint32_t coffset,
|
VariableID img = 0;
|
||||||
uint32_t offset, uint32_t bias, uint32_t comp, uint32_t sample,
|
const SPIRType *imgtype = nullptr;
|
||||||
uint32_t minlod, bool *p_forward);
|
bool is_fetch = false, is_gather = false, is_proj = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TextureFunctionNameArguments
|
||||||
|
{
|
||||||
|
// GCC 4.8 workarounds, it doesn't understand '{}' constructor here, use explicit default constructor.
|
||||||
|
TextureFunctionNameArguments() = default;
|
||||||
|
TextureFunctionBaseArguments base;
|
||||||
|
bool has_array_offsets = false, has_offset = false, has_grad = false;
|
||||||
|
bool has_dref = false, is_sparse_feedback = false, has_min_lod = false;
|
||||||
|
uint32_t lod = 0;
|
||||||
|
};
|
||||||
|
virtual std::string to_function_name(const TextureFunctionNameArguments &args);
|
||||||
|
|
||||||
|
struct TextureFunctionArguments
|
||||||
|
{
|
||||||
|
// GCC 4.8 workarounds, it doesn't understand '{}' constructor here, use explicit default constructor.
|
||||||
|
TextureFunctionArguments() = default;
|
||||||
|
TextureFunctionBaseArguments base;
|
||||||
|
uint32_t coord = 0, coord_components = 0, dref = 0;
|
||||||
|
uint32_t grad_x = 0, grad_y = 0, lod = 0, coffset = 0, offset = 0;
|
||||||
|
uint32_t bias = 0, component = 0, sample = 0, sparse_texel = 0, min_lod = 0;
|
||||||
|
bool nonuniform_expression = false;
|
||||||
|
};
|
||||||
|
virtual std::string to_function_args(const TextureFunctionArguments &args, bool *p_forward);
|
||||||
|
|
||||||
|
void emit_sparse_feedback_temporaries(uint32_t result_type_id, uint32_t id, uint32_t &feedback_id,
|
||||||
|
uint32_t &texel_id);
|
||||||
|
uint32_t get_sparse_feedback_texel_id(uint32_t id) const;
|
||||||
virtual void emit_buffer_block(const SPIRVariable &type);
|
virtual void emit_buffer_block(const SPIRVariable &type);
|
||||||
virtual void emit_push_constant_block(const SPIRVariable &var);
|
virtual void emit_push_constant_block(const SPIRVariable &var);
|
||||||
virtual void emit_uniform(const SPIRVariable &var);
|
virtual void emit_uniform(const SPIRVariable &var);
|
||||||
|
|
@ -441,25 +561,33 @@ protected:
|
||||||
bool supports_extensions = false;
|
bool supports_extensions = false;
|
||||||
bool supports_empty_struct = false;
|
bool supports_empty_struct = false;
|
||||||
bool array_is_value_type = true;
|
bool array_is_value_type = true;
|
||||||
|
bool buffer_offset_array_is_value_type = true;
|
||||||
bool comparison_image_samples_scalar = false;
|
bool comparison_image_samples_scalar = false;
|
||||||
bool native_pointers = false;
|
bool native_pointers = false;
|
||||||
bool support_small_type_sampling_result = false;
|
bool support_small_type_sampling_result = false;
|
||||||
bool support_case_fallthrough = true;
|
bool support_case_fallthrough = true;
|
||||||
bool use_array_constructor = false;
|
bool use_array_constructor = false;
|
||||||
|
bool needs_row_major_load_workaround = false;
|
||||||
} backend;
|
} backend;
|
||||||
|
|
||||||
void emit_struct(SPIRType &type);
|
void emit_struct(SPIRType &type);
|
||||||
void emit_resources();
|
void emit_resources();
|
||||||
|
void emit_extension_workarounds(spv::ExecutionModel model);
|
||||||
void emit_buffer_block_native(const SPIRVariable &var);
|
void emit_buffer_block_native(const SPIRVariable &var);
|
||||||
void emit_buffer_reference_block(SPIRType &type, bool forward_declaration);
|
void emit_buffer_reference_block(SPIRType &type, bool forward_declaration);
|
||||||
void emit_buffer_block_legacy(const SPIRVariable &var);
|
void emit_buffer_block_legacy(const SPIRVariable &var);
|
||||||
void emit_buffer_block_flattened(const SPIRVariable &type);
|
void emit_buffer_block_flattened(const SPIRVariable &type);
|
||||||
|
void fixup_implicit_builtin_block_names();
|
||||||
void emit_declared_builtin_block(spv::StorageClass storage, spv::ExecutionModel model);
|
void emit_declared_builtin_block(spv::StorageClass storage, spv::ExecutionModel model);
|
||||||
bool should_force_emit_builtin_block(spv::StorageClass storage);
|
bool should_force_emit_builtin_block(spv::StorageClass storage);
|
||||||
void emit_push_constant_block_vulkan(const SPIRVariable &var);
|
void emit_push_constant_block_vulkan(const SPIRVariable &var);
|
||||||
void emit_push_constant_block_glsl(const SPIRVariable &var);
|
void emit_push_constant_block_glsl(const SPIRVariable &var);
|
||||||
void emit_interface_block(const SPIRVariable &type);
|
void emit_interface_block(const SPIRVariable &type);
|
||||||
void emit_flattened_io_block(const SPIRVariable &var, const char *qual);
|
void emit_flattened_io_block(const SPIRVariable &var, const char *qual);
|
||||||
|
void emit_flattened_io_block_struct(const std::string &basename, const SPIRType &type, const char *qual,
|
||||||
|
const SmallVector<uint32_t> &indices);
|
||||||
|
void emit_flattened_io_block_member(const std::string &basename, const SPIRType &type, const char *qual,
|
||||||
|
const SmallVector<uint32_t> &indices);
|
||||||
void emit_block_chain(SPIRBlock &block);
|
void emit_block_chain(SPIRBlock &block);
|
||||||
void emit_hoisted_temporaries(SmallVector<std::pair<TypeID, ID>> &temporaries);
|
void emit_hoisted_temporaries(SmallVector<std::pair<TypeID, ID>> &temporaries);
|
||||||
std::string constant_value_macro_name(uint32_t id);
|
std::string constant_value_macro_name(uint32_t id);
|
||||||
|
|
@ -522,6 +650,7 @@ protected:
|
||||||
void emit_unary_op(uint32_t result_type, uint32_t result_id, uint32_t op0, const char *op);
|
void emit_unary_op(uint32_t result_type, uint32_t result_id, uint32_t op0, const char *op);
|
||||||
bool expression_is_forwarded(uint32_t id) const;
|
bool expression_is_forwarded(uint32_t id) const;
|
||||||
bool expression_suppresses_usage_tracking(uint32_t id) const;
|
bool expression_suppresses_usage_tracking(uint32_t id) const;
|
||||||
|
bool expression_read_implies_multiple_reads(uint32_t id) const;
|
||||||
SPIRExpression &emit_op(uint32_t result_type, uint32_t result_id, const std::string &rhs, bool forward_rhs,
|
SPIRExpression &emit_op(uint32_t result_type, uint32_t result_id, const std::string &rhs, bool forward_rhs,
|
||||||
bool suppress_usage_tracking = false);
|
bool suppress_usage_tracking = false);
|
||||||
|
|
||||||
|
|
@ -531,6 +660,9 @@ protected:
|
||||||
std::string access_chain_internal(uint32_t base, const uint32_t *indices, uint32_t count, AccessChainFlags flags,
|
std::string access_chain_internal(uint32_t base, const uint32_t *indices, uint32_t count, AccessChainFlags flags,
|
||||||
AccessChainMeta *meta);
|
AccessChainMeta *meta);
|
||||||
|
|
||||||
|
virtual void prepare_access_chain_for_scalar_access(std::string &expr, const SPIRType &type,
|
||||||
|
spv::StorageClass storage, bool &is_packed);
|
||||||
|
|
||||||
std::string access_chain(uint32_t base, const uint32_t *indices, uint32_t count, const SPIRType &target_type,
|
std::string access_chain(uint32_t base, const uint32_t *indices, uint32_t count, const SPIRType &target_type,
|
||||||
AccessChainMeta *meta = nullptr, bool ptr_chain = false);
|
AccessChainMeta *meta = nullptr, bool ptr_chain = false);
|
||||||
|
|
||||||
|
|
@ -559,7 +691,7 @@ protected:
|
||||||
SPIRExpression &emit_uninitialized_temporary_expression(uint32_t type, uint32_t id);
|
SPIRExpression &emit_uninitialized_temporary_expression(uint32_t type, uint32_t id);
|
||||||
void append_global_func_args(const SPIRFunction &func, uint32_t index, SmallVector<std::string> &arglist);
|
void append_global_func_args(const SPIRFunction &func, uint32_t index, SmallVector<std::string> &arglist);
|
||||||
std::string to_expression(uint32_t id, bool register_expression_read = true);
|
std::string to_expression(uint32_t id, bool register_expression_read = true);
|
||||||
std::string to_composite_constructor_expression(uint32_t id);
|
std::string to_composite_constructor_expression(uint32_t id, bool uses_buffer_offset);
|
||||||
std::string to_rerolled_array_expression(const std::string &expr, const SPIRType &type);
|
std::string to_rerolled_array_expression(const std::string &expr, const SPIRType &type);
|
||||||
std::string to_enclosed_expression(uint32_t id, bool register_expression_read = true);
|
std::string to_enclosed_expression(uint32_t id, bool register_expression_read = true);
|
||||||
std::string to_unpacked_expression(uint32_t id, bool register_expression_read = true);
|
std::string to_unpacked_expression(uint32_t id, bool register_expression_read = true);
|
||||||
|
|
@ -575,9 +707,12 @@ protected:
|
||||||
void strip_enclosed_expression(std::string &expr);
|
void strip_enclosed_expression(std::string &expr);
|
||||||
std::string to_member_name(const SPIRType &type, uint32_t index);
|
std::string to_member_name(const SPIRType &type, uint32_t index);
|
||||||
virtual std::string to_member_reference(uint32_t base, const SPIRType &type, uint32_t index, bool ptr_chain);
|
virtual std::string to_member_reference(uint32_t base, const SPIRType &type, uint32_t index, bool ptr_chain);
|
||||||
|
std::string to_multi_member_reference(const SPIRType &type, const SmallVector<uint32_t> &indices);
|
||||||
std::string type_to_glsl_constructor(const SPIRType &type);
|
std::string type_to_glsl_constructor(const SPIRType &type);
|
||||||
std::string argument_decl(const SPIRFunction::Parameter &arg);
|
std::string argument_decl(const SPIRFunction::Parameter &arg);
|
||||||
virtual std::string to_qualifiers_glsl(uint32_t id);
|
virtual std::string to_qualifiers_glsl(uint32_t id);
|
||||||
|
void fixup_io_block_patch_qualifiers(const SPIRVariable &var);
|
||||||
|
void emit_output_variable_initializer(const SPIRVariable &var);
|
||||||
const char *to_precision_qualifiers_glsl(uint32_t id);
|
const char *to_precision_qualifiers_glsl(uint32_t id);
|
||||||
virtual const char *to_storage_qualifiers_glsl(const SPIRVariable &var);
|
virtual const char *to_storage_qualifiers_glsl(const SPIRVariable &var);
|
||||||
const char *flags_to_qualifiers_glsl(const SPIRType &type, const Bitset &flags);
|
const char *flags_to_qualifiers_glsl(const SPIRType &type, const Bitset &flags);
|
||||||
|
|
@ -624,8 +759,7 @@ protected:
|
||||||
|
|
||||||
void replace_fragment_output(SPIRVariable &var);
|
void replace_fragment_output(SPIRVariable &var);
|
||||||
void replace_fragment_outputs();
|
void replace_fragment_outputs();
|
||||||
bool check_explicit_lod_allowed(uint32_t lod);
|
std::string legacy_tex_op(const std::string &op, const SPIRType &imgtype, uint32_t id);
|
||||||
std::string legacy_tex_op(const std::string &op, const SPIRType &imgtype, uint32_t lod, uint32_t id);
|
|
||||||
|
|
||||||
uint32_t indent = 0;
|
uint32_t indent = 0;
|
||||||
|
|
||||||
|
|
@ -635,11 +769,16 @@ protected:
|
||||||
std::unordered_set<uint32_t> flushed_phi_variables;
|
std::unordered_set<uint32_t> flushed_phi_variables;
|
||||||
|
|
||||||
std::unordered_set<uint32_t> flattened_buffer_blocks;
|
std::unordered_set<uint32_t> flattened_buffer_blocks;
|
||||||
std::unordered_set<uint32_t> flattened_structs;
|
std::unordered_map<uint32_t, bool> flattened_structs;
|
||||||
|
|
||||||
std::string load_flattened_struct(SPIRVariable &var);
|
ShaderSubgroupSupportHelper shader_subgroup_supporter;
|
||||||
std::string to_flattened_struct_member(const SPIRVariable &var, uint32_t index);
|
|
||||||
void store_flattened_struct(SPIRVariable &var, uint32_t value);
|
std::string load_flattened_struct(const std::string &basename, const SPIRType &type);
|
||||||
|
std::string to_flattened_struct_member(const std::string &basename, const SPIRType &type, uint32_t index);
|
||||||
|
void store_flattened_struct(uint32_t lhs_id, uint32_t value);
|
||||||
|
void store_flattened_struct(const std::string &basename, uint32_t rhs, const SPIRType &type,
|
||||||
|
const SmallVector<uint32_t> &indices);
|
||||||
|
std::string to_flattened_access_chain_expression(uint32_t id);
|
||||||
|
|
||||||
// Usage tracking. If a temporary is used more than once, use the temporary instead to
|
// Usage tracking. If a temporary is used more than once, use the temporary instead to
|
||||||
// avoid AST explosion when SPIRV is generated with pure SSA and doesn't write stuff to variables.
|
// avoid AST explosion when SPIRV is generated with pure SSA and doesn't write stuff to variables.
|
||||||
|
|
@ -654,6 +793,10 @@ protected:
|
||||||
// Currently used by NMin/Max/Clamp implementations.
|
// Currently used by NMin/Max/Clamp implementations.
|
||||||
std::unordered_map<uint32_t, uint32_t> extra_sub_expressions;
|
std::unordered_map<uint32_t, uint32_t> extra_sub_expressions;
|
||||||
|
|
||||||
|
SmallVector<TypeID> workaround_ubo_load_overload_types;
|
||||||
|
void request_workaround_wrapper_overload(TypeID id);
|
||||||
|
void rewrite_load_for_wrapped_row_major(std::string &expr, TypeID loaded_type, ID ptr);
|
||||||
|
|
||||||
uint32_t statement_count = 0;
|
uint32_t statement_count = 0;
|
||||||
|
|
||||||
inline bool is_legacy() const
|
inline bool is_legacy() const
|
||||||
|
|
@ -671,6 +814,12 @@ protected:
|
||||||
return !options.es && options.version < 130;
|
return !options.es && options.version < 130;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool requires_transpose_2x2 = false;
|
||||||
|
bool requires_transpose_3x3 = false;
|
||||||
|
bool requires_transpose_4x4 = false;
|
||||||
|
bool ray_tracing_is_khr = false;
|
||||||
|
void ray_tracing_khr_fixup_locations();
|
||||||
|
|
||||||
bool args_will_forward(uint32_t id, const uint32_t *args, uint32_t num_args, bool pure);
|
bool args_will_forward(uint32_t id, const uint32_t *args, uint32_t num_args, bool pure);
|
||||||
void register_call_out_argument(uint32_t id);
|
void register_call_out_argument(uint32_t id);
|
||||||
void register_impure_function_call();
|
void register_impure_function_call();
|
||||||
|
|
@ -712,8 +861,6 @@ protected:
|
||||||
|
|
||||||
virtual void declare_undefined_values();
|
virtual void declare_undefined_values();
|
||||||
|
|
||||||
static std::string sanitize_underscores(const std::string &str);
|
|
||||||
|
|
||||||
bool can_use_io_location(spv::StorageClass storage, bool block);
|
bool can_use_io_location(spv::StorageClass storage, bool block);
|
||||||
const Instruction *get_next_instruction_in_block(const Instruction &instr);
|
const Instruction *get_next_instruction_in_block(const Instruction &instr);
|
||||||
static uint32_t mask_relevant_memory_semantics(uint32_t semantics);
|
static uint32_t mask_relevant_memory_semantics(uint32_t semantics);
|
||||||
|
|
@ -726,9 +873,9 @@ protected:
|
||||||
|
|
||||||
// Builtins in GLSL are always specific signedness, but the SPIR-V can declare them
|
// Builtins in GLSL are always specific signedness, but the SPIR-V can declare them
|
||||||
// as either unsigned or signed.
|
// as either unsigned or signed.
|
||||||
// Sometimes we will need to automatically perform bitcasts on load and store to make this work.
|
// Sometimes we will need to automatically perform casts on load and store to make this work.
|
||||||
virtual void bitcast_to_builtin_store(uint32_t target_id, std::string &expr, const SPIRType &expr_type);
|
virtual void cast_to_builtin_store(uint32_t target_id, std::string &expr, const SPIRType &expr_type);
|
||||||
virtual void bitcast_from_builtin_load(uint32_t source_id, std::string &expr, const SPIRType &expr_type);
|
virtual void cast_from_builtin_load(uint32_t source_id, std::string &expr, const SPIRType &expr_type);
|
||||||
void unroll_array_from_complex_load(uint32_t target_id, uint32_t source_id, std::string &expr);
|
void unroll_array_from_complex_load(uint32_t target_id, uint32_t source_id, std::string &expr);
|
||||||
void convert_non_uniform_expression(const SPIRType &type, std::string &expr);
|
void convert_non_uniform_expression(const SPIRType &type, std::string &expr);
|
||||||
|
|
||||||
|
|
@ -736,6 +883,7 @@ protected:
|
||||||
void disallow_forwarding_in_expression_chain(const SPIRExpression &expr);
|
void disallow_forwarding_in_expression_chain(const SPIRExpression &expr);
|
||||||
|
|
||||||
bool expression_is_constant_null(uint32_t id) const;
|
bool expression_is_constant_null(uint32_t id) const;
|
||||||
|
bool expression_is_non_value_type_array(uint32_t ptr);
|
||||||
virtual void emit_store_statement(uint32_t lhs_expression, uint32_t rhs_expression);
|
virtual void emit_store_statement(uint32_t lhs_expression, uint32_t rhs_expression);
|
||||||
|
|
||||||
uint32_t get_integer_width_for_instruction(const Instruction &instr) const;
|
uint32_t get_integer_width_for_instruction(const Instruction &instr) const;
|
||||||
|
|
|
||||||
|
|
@ -1,329 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016-2020 Robert Konrad
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef SPIRV_HLSL_HPP
|
|
||||||
#define SPIRV_HLSL_HPP
|
|
||||||
|
|
||||||
#include "spirv_glsl.hpp"
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
namespace SPIRV_CROSS_NAMESPACE
|
|
||||||
{
|
|
||||||
// Interface which remaps vertex inputs to a fixed semantic name to make linking easier.
|
|
||||||
struct HLSLVertexAttributeRemap
|
|
||||||
{
|
|
||||||
uint32_t location;
|
|
||||||
std::string semantic;
|
|
||||||
};
|
|
||||||
// Specifying a root constant (d3d12) or push constant range (vulkan).
|
|
||||||
//
|
|
||||||
// `start` and `end` denotes the range of the root constant in bytes.
|
|
||||||
// Both values need to be multiple of 4.
|
|
||||||
struct RootConstants
|
|
||||||
{
|
|
||||||
uint32_t start;
|
|
||||||
uint32_t end;
|
|
||||||
|
|
||||||
uint32_t binding;
|
|
||||||
uint32_t space;
|
|
||||||
};
|
|
||||||
|
|
||||||
// For finer control, decorations may be removed from specific resources instead with unset_decoration().
|
|
||||||
enum HLSLBindingFlagBits
|
|
||||||
{
|
|
||||||
HLSL_BINDING_AUTO_NONE_BIT = 0,
|
|
||||||
|
|
||||||
// Push constant (root constant) resources will be declared as CBVs (b-space) without a register() declaration.
|
|
||||||
// A register will be automatically assigned by the D3D compiler, but must therefore be reflected in D3D-land.
|
|
||||||
// Push constants do not normally have a DecorationBinding set, but if they do, this can be used to ignore it.
|
|
||||||
HLSL_BINDING_AUTO_PUSH_CONSTANT_BIT = 1 << 0,
|
|
||||||
|
|
||||||
// cbuffer resources will be declared as CBVs (b-space) without a register() declaration.
|
|
||||||
// A register will be automatically assigned, but must be reflected in D3D-land.
|
|
||||||
HLSL_BINDING_AUTO_CBV_BIT = 1 << 1,
|
|
||||||
|
|
||||||
// All SRVs (t-space) will be declared without a register() declaration.
|
|
||||||
HLSL_BINDING_AUTO_SRV_BIT = 1 << 2,
|
|
||||||
|
|
||||||
// All UAVs (u-space) will be declared without a register() declaration.
|
|
||||||
HLSL_BINDING_AUTO_UAV_BIT = 1 << 3,
|
|
||||||
|
|
||||||
// All samplers (s-space) will be declared without a register() declaration.
|
|
||||||
HLSL_BINDING_AUTO_SAMPLER_BIT = 1 << 4,
|
|
||||||
|
|
||||||
// No resources will be declared with register().
|
|
||||||
HLSL_BINDING_AUTO_ALL = 0x7fffffff
|
|
||||||
};
|
|
||||||
using HLSLBindingFlags = uint32_t;
|
|
||||||
|
|
||||||
// By matching stage, desc_set and binding for a SPIR-V resource,
|
|
||||||
// register bindings are set based on whether the HLSL resource is a
|
|
||||||
// CBV, UAV, SRV or Sampler. A single binding in SPIR-V might contain multiple
|
|
||||||
// resource types, e.g. COMBINED_IMAGE_SAMPLER, and SRV/Sampler bindings will be used respectively.
|
|
||||||
// On SM 5.0 and lower, register_space is ignored.
|
|
||||||
//
|
|
||||||
// To remap a push constant block which does not have any desc_set/binding associated with it,
|
|
||||||
// use ResourceBindingPushConstant{DescriptorSet,Binding} as values for desc_set/binding.
|
|
||||||
// For deeper control of push constants, set_root_constant_layouts() can be used instead.
|
|
||||||
struct HLSLResourceBinding
|
|
||||||
{
|
|
||||||
spv::ExecutionModel stage = spv::ExecutionModelMax;
|
|
||||||
uint32_t desc_set = 0;
|
|
||||||
uint32_t binding = 0;
|
|
||||||
|
|
||||||
struct Binding
|
|
||||||
{
|
|
||||||
uint32_t register_space = 0;
|
|
||||||
uint32_t register_binding = 0;
|
|
||||||
} cbv, uav, srv, sampler;
|
|
||||||
};
|
|
||||||
|
|
||||||
class CompilerHLSL : public CompilerGLSL
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
struct Options
|
|
||||||
{
|
|
||||||
uint32_t shader_model = 30; // TODO: map ps_4_0_level_9_0,... somehow
|
|
||||||
|
|
||||||
// Allows the PointSize builtin, and ignores it, as PointSize is not supported in HLSL.
|
|
||||||
bool point_size_compat = false;
|
|
||||||
|
|
||||||
// Allows the PointCoord builtin, returns float2(0.5, 0.5), as PointCoord is not supported in HLSL.
|
|
||||||
bool point_coord_compat = false;
|
|
||||||
|
|
||||||
// If true, the backend will assume that VertexIndex and InstanceIndex will need to apply
|
|
||||||
// a base offset, and you will need to fill in a cbuffer with offsets.
|
|
||||||
// Set to false if you know you will never use base instance or base vertex
|
|
||||||
// functionality as it might remove an internal cbuffer.
|
|
||||||
bool support_nonzero_base_vertex_base_instance = false;
|
|
||||||
|
|
||||||
// Forces a storage buffer to always be declared as UAV, even if the readonly decoration is used.
|
|
||||||
// By default, a readonly storage buffer will be declared as ByteAddressBuffer (SRV) instead.
|
|
||||||
bool force_storage_buffer_as_uav = false;
|
|
||||||
|
|
||||||
// Forces any storage image type marked as NonWritable to be considered an SRV instead.
|
|
||||||
// For this to work with function call parameters, NonWritable must be considered to be part of the type system
|
|
||||||
// so that NonWritable image arguments are also translated to Texture rather than RWTexture.
|
|
||||||
bool nonwritable_uav_texture_as_srv = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
explicit CompilerHLSL(std::vector<uint32_t> spirv_)
|
|
||||||
: CompilerGLSL(std::move(spirv_))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
CompilerHLSL(const uint32_t *ir_, size_t size)
|
|
||||||
: CompilerGLSL(ir_, size)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit CompilerHLSL(const ParsedIR &ir_)
|
|
||||||
: CompilerGLSL(ir_)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit CompilerHLSL(ParsedIR &&ir_)
|
|
||||||
: CompilerGLSL(std::move(ir_))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
const Options &get_hlsl_options() const
|
|
||||||
{
|
|
||||||
return hlsl_options;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_hlsl_options(const Options &opts)
|
|
||||||
{
|
|
||||||
hlsl_options = opts;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Optionally specify a custom root constant layout.
|
|
||||||
//
|
|
||||||
// Push constants ranges will be split up according to the
|
|
||||||
// layout specified.
|
|
||||||
void set_root_constant_layouts(std::vector<RootConstants> layout);
|
|
||||||
|
|
||||||
// Compiles and remaps vertex attributes at specific locations to a fixed semantic.
|
|
||||||
// The default is TEXCOORD# where # denotes location.
|
|
||||||
// Matrices are unrolled to vectors with notation ${SEMANTIC}_#, where # denotes row.
|
|
||||||
// $SEMANTIC is either TEXCOORD# or a semantic name specified here.
|
|
||||||
void add_vertex_attribute_remap(const HLSLVertexAttributeRemap &vertex_attributes);
|
|
||||||
std::string compile() override;
|
|
||||||
|
|
||||||
// This is a special HLSL workaround for the NumWorkGroups builtin.
|
|
||||||
// This does not exist in HLSL, so the calling application must create a dummy cbuffer in
|
|
||||||
// which the application will store this builtin.
|
|
||||||
// The cbuffer layout will be:
|
|
||||||
// cbuffer SPIRV_Cross_NumWorkgroups : register(b#, space#) { uint3 SPIRV_Cross_NumWorkgroups_count; };
|
|
||||||
// This must be called before compile().
|
|
||||||
// The function returns 0 if NumWorkGroups builtin is not statically used in the shader from the current entry point.
|
|
||||||
// If non-zero, this returns the variable ID of a cbuffer which corresponds to
|
|
||||||
// the cbuffer declared above. By default, no binding or descriptor set decoration is set,
|
|
||||||
// so the calling application should declare explicit bindings on this ID before calling compile().
|
|
||||||
VariableID remap_num_workgroups_builtin();
|
|
||||||
|
|
||||||
// Controls how resource bindings are declared in the output HLSL.
|
|
||||||
void set_resource_binding_flags(HLSLBindingFlags flags);
|
|
||||||
|
|
||||||
// resource is a resource binding to indicate the HLSL CBV, SRV, UAV or sampler binding
|
|
||||||
// to use for a particular SPIR-V description set
|
|
||||||
// and binding. If resource bindings are provided,
|
|
||||||
// is_hlsl_resource_binding_used() will return true after calling ::compile() if
|
|
||||||
// the set/binding combination was used by the HLSL code.
|
|
||||||
void add_hlsl_resource_binding(const HLSLResourceBinding &resource);
|
|
||||||
bool is_hlsl_resource_binding_used(spv::ExecutionModel model, uint32_t set, uint32_t binding) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::string type_to_glsl(const SPIRType &type, uint32_t id = 0) override;
|
|
||||||
std::string image_type_hlsl(const SPIRType &type, uint32_t id);
|
|
||||||
std::string image_type_hlsl_modern(const SPIRType &type, uint32_t id);
|
|
||||||
std::string image_type_hlsl_legacy(const SPIRType &type, uint32_t id);
|
|
||||||
void emit_function_prototype(SPIRFunction &func, const Bitset &return_flags) override;
|
|
||||||
void emit_hlsl_entry_point();
|
|
||||||
void emit_header() override;
|
|
||||||
void emit_resources();
|
|
||||||
void declare_undefined_values() override;
|
|
||||||
void emit_interface_block_globally(const SPIRVariable &type);
|
|
||||||
void emit_interface_block_in_struct(const SPIRVariable &type, std::unordered_set<uint32_t> &active_locations);
|
|
||||||
void emit_builtin_inputs_in_struct();
|
|
||||||
void emit_builtin_outputs_in_struct();
|
|
||||||
void emit_texture_op(const Instruction &i) override;
|
|
||||||
void emit_instruction(const Instruction &instruction) override;
|
|
||||||
void emit_glsl_op(uint32_t result_type, uint32_t result_id, uint32_t op, const uint32_t *args,
|
|
||||||
uint32_t count) override;
|
|
||||||
void emit_buffer_block(const SPIRVariable &type) override;
|
|
||||||
void emit_push_constant_block(const SPIRVariable &var) override;
|
|
||||||
void emit_uniform(const SPIRVariable &var) override;
|
|
||||||
void emit_modern_uniform(const SPIRVariable &var);
|
|
||||||
void emit_legacy_uniform(const SPIRVariable &var);
|
|
||||||
void emit_specialization_constants_and_structs();
|
|
||||||
void emit_composite_constants();
|
|
||||||
void emit_fixup() override;
|
|
||||||
std::string builtin_to_glsl(spv::BuiltIn builtin, spv::StorageClass storage) override;
|
|
||||||
std::string layout_for_member(const SPIRType &type, uint32_t index) override;
|
|
||||||
std::string to_interpolation_qualifiers(const Bitset &flags) override;
|
|
||||||
std::string bitcast_glsl_op(const SPIRType &result_type, const SPIRType &argument_type) override;
|
|
||||||
bool emit_complex_bitcast(uint32_t result_type, uint32_t id, uint32_t op0) override;
|
|
||||||
std::string to_func_call_arg(const SPIRFunction::Parameter &arg, uint32_t id) override;
|
|
||||||
std::string to_sampler_expression(uint32_t id);
|
|
||||||
std::string to_resource_binding(const SPIRVariable &var);
|
|
||||||
std::string to_resource_binding_sampler(const SPIRVariable &var);
|
|
||||||
std::string to_resource_register(HLSLBindingFlagBits flag, char space, uint32_t binding, uint32_t set);
|
|
||||||
void emit_sampled_image_op(uint32_t result_type, uint32_t result_id, uint32_t image_id, uint32_t samp_id) override;
|
|
||||||
void emit_access_chain(const Instruction &instruction);
|
|
||||||
void emit_load(const Instruction &instruction);
|
|
||||||
void read_access_chain(std::string *expr, const std::string &lhs, const SPIRAccessChain &chain);
|
|
||||||
void read_access_chain_struct(const std::string &lhs, const SPIRAccessChain &chain);
|
|
||||||
void read_access_chain_array(const std::string &lhs, const SPIRAccessChain &chain);
|
|
||||||
void write_access_chain(const SPIRAccessChain &chain, uint32_t value, const SmallVector<uint32_t> &composite_chain);
|
|
||||||
void write_access_chain_struct(const SPIRAccessChain &chain, uint32_t value,
|
|
||||||
const SmallVector<uint32_t> &composite_chain);
|
|
||||||
void write_access_chain_array(const SPIRAccessChain &chain, uint32_t value,
|
|
||||||
const SmallVector<uint32_t> &composite_chain);
|
|
||||||
std::string write_access_chain_value(uint32_t value, const SmallVector<uint32_t> &composite_chain, bool enclose);
|
|
||||||
void emit_store(const Instruction &instruction);
|
|
||||||
void emit_atomic(const uint32_t *ops, uint32_t length, spv::Op op);
|
|
||||||
void emit_subgroup_op(const Instruction &i) override;
|
|
||||||
void emit_block_hints(const SPIRBlock &block) override;
|
|
||||||
|
|
||||||
void emit_struct_member(const SPIRType &type, uint32_t member_type_id, uint32_t index, const std::string &qualifier,
|
|
||||||
uint32_t base_offset = 0) override;
|
|
||||||
|
|
||||||
const char *to_storage_qualifiers_glsl(const SPIRVariable &var) override;
|
|
||||||
void replace_illegal_names() override;
|
|
||||||
|
|
||||||
Options hlsl_options;
|
|
||||||
|
|
||||||
// TODO: Refactor this to be more similar to MSL, maybe have some common system in place?
|
|
||||||
bool requires_op_fmod = false;
|
|
||||||
bool requires_fp16_packing = false;
|
|
||||||
bool requires_uint2_packing = false;
|
|
||||||
bool requires_explicit_fp16_packing = false;
|
|
||||||
bool requires_unorm8_packing = false;
|
|
||||||
bool requires_snorm8_packing = false;
|
|
||||||
bool requires_unorm16_packing = false;
|
|
||||||
bool requires_snorm16_packing = false;
|
|
||||||
bool requires_bitfield_insert = false;
|
|
||||||
bool requires_bitfield_extract = false;
|
|
||||||
bool requires_inverse_2x2 = false;
|
|
||||||
bool requires_inverse_3x3 = false;
|
|
||||||
bool requires_inverse_4x4 = false;
|
|
||||||
bool requires_scalar_reflect = false;
|
|
||||||
bool requires_scalar_refract = false;
|
|
||||||
bool requires_scalar_faceforward = false;
|
|
||||||
uint64_t required_textureSizeVariants = 0;
|
|
||||||
void require_texture_query_variant(const SPIRType &type);
|
|
||||||
|
|
||||||
enum TextureQueryVariantDim
|
|
||||||
{
|
|
||||||
Query1D = 0,
|
|
||||||
Query1DArray,
|
|
||||||
Query2D,
|
|
||||||
Query2DArray,
|
|
||||||
Query3D,
|
|
||||||
QueryBuffer,
|
|
||||||
QueryCube,
|
|
||||||
QueryCubeArray,
|
|
||||||
Query2DMS,
|
|
||||||
Query2DMSArray,
|
|
||||||
QueryDimCount
|
|
||||||
};
|
|
||||||
|
|
||||||
enum TextureQueryVariantType
|
|
||||||
{
|
|
||||||
QueryTypeFloat = 0,
|
|
||||||
QueryTypeInt = 16,
|
|
||||||
QueryTypeUInt = 32,
|
|
||||||
QueryTypeCount = 3
|
|
||||||
};
|
|
||||||
|
|
||||||
enum BitcastType
|
|
||||||
{
|
|
||||||
TypeNormal,
|
|
||||||
TypePackUint2x32,
|
|
||||||
TypeUnpackUint64
|
|
||||||
};
|
|
||||||
|
|
||||||
BitcastType get_bitcast_type(uint32_t result_type, uint32_t op0);
|
|
||||||
|
|
||||||
void emit_builtin_variables();
|
|
||||||
bool require_output = false;
|
|
||||||
bool require_input = false;
|
|
||||||
SmallVector<HLSLVertexAttributeRemap> remap_vertex_attributes;
|
|
||||||
|
|
||||||
uint32_t type_to_consumed_locations(const SPIRType &type) const;
|
|
||||||
|
|
||||||
void emit_io_block(const SPIRVariable &var);
|
|
||||||
std::string to_semantic(uint32_t location, spv::ExecutionModel em, spv::StorageClass sc);
|
|
||||||
|
|
||||||
uint32_t num_workgroups_builtin = 0;
|
|
||||||
HLSLBindingFlags resource_binding_flags = 0;
|
|
||||||
|
|
||||||
// Custom root constant layout, which should be emitted
|
|
||||||
// when translating push constant ranges.
|
|
||||||
std::vector<RootConstants> root_constants_layout;
|
|
||||||
|
|
||||||
void validate_shader_model();
|
|
||||||
|
|
||||||
std::string get_unique_identifier();
|
|
||||||
uint32_t unique_identifier_count = 0;
|
|
||||||
|
|
||||||
std::unordered_map<StageSetBinding, std::pair<HLSLResourceBinding, bool>, InternalHasher> resource_bindings;
|
|
||||||
void remap_hlsl_resource_binding(HLSLBindingFlagBits type, uint32_t &desc_set, uint32_t &binding);
|
|
||||||
};
|
|
||||||
} // namespace SPIRV_CROSS_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2016-2020 The Brenwill Workshop Ltd.
|
* Copyright 2016-2021 The Brenwill Workshop Ltd.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -14,6 +14,13 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At your option, you may choose to accept this material under either:
|
||||||
|
* 1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or
|
||||||
|
* 2. The MIT License, found at <http://opensource.org/licenses/MIT>.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 OR MIT.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef SPIRV_CROSS_MSL_HPP
|
#ifndef SPIRV_CROSS_MSL_HPP
|
||||||
#define SPIRV_CROSS_MSL_HPP
|
#define SPIRV_CROSS_MSL_HPP
|
||||||
|
|
||||||
|
|
@ -27,33 +34,44 @@
|
||||||
namespace SPIRV_CROSS_NAMESPACE
|
namespace SPIRV_CROSS_NAMESPACE
|
||||||
{
|
{
|
||||||
|
|
||||||
// Indicates the format of the vertex attribute. Currently limited to specifying
|
// Indicates the format of a shader input. Currently limited to specifying
|
||||||
// if the attribute is an 8-bit unsigned integer, 16-bit unsigned integer, or
|
// if the input is an 8-bit unsigned integer, 16-bit unsigned integer, or
|
||||||
// some other format.
|
// some other format.
|
||||||
enum MSLVertexFormat
|
enum MSLShaderInputFormat
|
||||||
{
|
{
|
||||||
MSL_VERTEX_FORMAT_OTHER = 0,
|
MSL_SHADER_INPUT_FORMAT_OTHER = 0,
|
||||||
MSL_VERTEX_FORMAT_UINT8 = 1,
|
MSL_SHADER_INPUT_FORMAT_UINT8 = 1,
|
||||||
MSL_VERTEX_FORMAT_UINT16 = 2,
|
MSL_SHADER_INPUT_FORMAT_UINT16 = 2,
|
||||||
MSL_VERTEX_FORMAT_INT_MAX = 0x7fffffff
|
MSL_SHADER_INPUT_FORMAT_ANY16 = 3,
|
||||||
|
MSL_SHADER_INPUT_FORMAT_ANY32 = 4,
|
||||||
|
|
||||||
|
// Deprecated aliases.
|
||||||
|
MSL_VERTEX_FORMAT_OTHER = MSL_SHADER_INPUT_FORMAT_OTHER,
|
||||||
|
MSL_VERTEX_FORMAT_UINT8 = MSL_SHADER_INPUT_FORMAT_UINT8,
|
||||||
|
MSL_VERTEX_FORMAT_UINT16 = MSL_SHADER_INPUT_FORMAT_UINT16,
|
||||||
|
|
||||||
|
MSL_SHADER_INPUT_FORMAT_INT_MAX = 0x7fffffff
|
||||||
};
|
};
|
||||||
|
|
||||||
// Defines MSL characteristics of a vertex attribute at a particular location.
|
// Defines MSL characteristics of an input variable at a particular location.
|
||||||
// After compilation, it is possible to query whether or not this location was used.
|
// After compilation, it is possible to query whether or not this location was used.
|
||||||
struct MSLVertexAttr
|
// If vecsize is nonzero, it must be greater than or equal to the vecsize declared in the shader,
|
||||||
|
// or behavior is undefined.
|
||||||
|
struct MSLShaderInput
|
||||||
{
|
{
|
||||||
uint32_t location = 0;
|
uint32_t location = 0;
|
||||||
uint32_t msl_buffer = 0;
|
MSLShaderInputFormat format = MSL_SHADER_INPUT_FORMAT_OTHER;
|
||||||
uint32_t msl_offset = 0;
|
|
||||||
uint32_t msl_stride = 0;
|
|
||||||
bool per_instance = false;
|
|
||||||
MSLVertexFormat format = MSL_VERTEX_FORMAT_OTHER;
|
|
||||||
spv::BuiltIn builtin = spv::BuiltInMax;
|
spv::BuiltIn builtin = spv::BuiltInMax;
|
||||||
|
uint32_t vecsize = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Matches the binding index of a MSL resource for a binding within a descriptor set.
|
// Matches the binding index of a MSL resource for a binding within a descriptor set.
|
||||||
// Taken together, the stage, desc_set and binding combine to form a reference to a resource
|
// Taken together, the stage, desc_set and binding combine to form a reference to a resource
|
||||||
// descriptor used in a particular shading stage.
|
// descriptor used in a particular shading stage. The count field indicates the number of
|
||||||
|
// resources consumed by this binding, if the binding represents an array of resources.
|
||||||
|
// If the resource array is a run-time-sized array, which are legal in GLSL or SPIR-V, this value
|
||||||
|
// will be used to declare the array size in MSL, which does not support run-time-sized arrays.
|
||||||
|
// For resources that are not held in a run-time-sized array, the count field does not need to be populated.
|
||||||
// If using MSL 2.0 argument buffers, the descriptor set is not marked as a discrete descriptor set,
|
// If using MSL 2.0 argument buffers, the descriptor set is not marked as a discrete descriptor set,
|
||||||
// and (for iOS only) the resource is not a storage image (sampled != 2), the binding reference we
|
// and (for iOS only) the resource is not a storage image (sampled != 2), the binding reference we
|
||||||
// remap to will become an [[id(N)]] attribute within the "descriptor set" argument buffer structure.
|
// remap to will become an [[id(N)]] attribute within the "descriptor set" argument buffer structure.
|
||||||
|
|
@ -64,6 +82,7 @@ struct MSLResourceBinding
|
||||||
spv::ExecutionModel stage = spv::ExecutionModelMax;
|
spv::ExecutionModel stage = spv::ExecutionModelMax;
|
||||||
uint32_t desc_set = 0;
|
uint32_t desc_set = 0;
|
||||||
uint32_t binding = 0;
|
uint32_t binding = 0;
|
||||||
|
uint32_t count = 0;
|
||||||
uint32_t msl_buffer = 0;
|
uint32_t msl_buffer = 0;
|
||||||
uint32_t msl_texture = 0;
|
uint32_t msl_texture = 0;
|
||||||
uint32_t msl_sampler = 0;
|
uint32_t msl_sampler = 0;
|
||||||
|
|
@ -242,6 +261,9 @@ static const uint32_t kArgumentBufferBinding = ~(3u);
|
||||||
|
|
||||||
static const uint32_t kMaxArgumentBuffers = 8;
|
static const uint32_t kMaxArgumentBuffers = 8;
|
||||||
|
|
||||||
|
// The arbitrary maximum for the nesting of array of array copies.
|
||||||
|
static const uint32_t kArrayCopyMultidimMax = 6;
|
||||||
|
|
||||||
// Decompiles SPIR-V to Metal Shading Language
|
// Decompiles SPIR-V to Metal Shading Language
|
||||||
class CompilerMSL : public CompilerGLSL
|
class CompilerMSL : public CompilerGLSL
|
||||||
{
|
{
|
||||||
|
|
@ -258,6 +280,8 @@ public:
|
||||||
Platform platform = macOS;
|
Platform platform = macOS;
|
||||||
uint32_t msl_version = make_msl_version(1, 2);
|
uint32_t msl_version = make_msl_version(1, 2);
|
||||||
uint32_t texel_buffer_texture_width = 4096; // Width of 2D Metal textures used as 1D texel buffers
|
uint32_t texel_buffer_texture_width = 4096; // Width of 2D Metal textures used as 1D texel buffers
|
||||||
|
uint32_t r32ui_linear_texture_alignment = 4;
|
||||||
|
uint32_t r32ui_alignment_constant_id = 65535;
|
||||||
uint32_t swizzle_buffer_index = 30;
|
uint32_t swizzle_buffer_index = 30;
|
||||||
uint32_t indirect_params_buffer_index = 29;
|
uint32_t indirect_params_buffer_index = 29;
|
||||||
uint32_t shader_output_buffer_index = 28;
|
uint32_t shader_output_buffer_index = 28;
|
||||||
|
|
@ -266,9 +290,15 @@ public:
|
||||||
uint32_t buffer_size_buffer_index = 25;
|
uint32_t buffer_size_buffer_index = 25;
|
||||||
uint32_t view_mask_buffer_index = 24;
|
uint32_t view_mask_buffer_index = 24;
|
||||||
uint32_t dynamic_offsets_buffer_index = 23;
|
uint32_t dynamic_offsets_buffer_index = 23;
|
||||||
|
uint32_t shader_input_buffer_index = 22;
|
||||||
|
uint32_t shader_index_buffer_index = 21;
|
||||||
uint32_t shader_input_wg_index = 0;
|
uint32_t shader_input_wg_index = 0;
|
||||||
uint32_t device_index = 0;
|
uint32_t device_index = 0;
|
||||||
uint32_t enable_frag_output_mask = 0xffffffff;
|
uint32_t enable_frag_output_mask = 0xffffffff;
|
||||||
|
// Metal doesn't allow setting a fixed sample mask directly in the pipeline.
|
||||||
|
// We can evade this restriction by ANDing the internal sample_mask output
|
||||||
|
// of the shader with the additional fixed sample mask.
|
||||||
|
uint32_t additional_fixed_sample_mask = 0xffffffff;
|
||||||
bool enable_point_size_builtin = true;
|
bool enable_point_size_builtin = true;
|
||||||
bool enable_frag_depth_builtin = true;
|
bool enable_frag_depth_builtin = true;
|
||||||
bool enable_frag_stencil_ref_builtin = true;
|
bool enable_frag_stencil_ref_builtin = true;
|
||||||
|
|
@ -277,6 +307,7 @@ public:
|
||||||
bool swizzle_texture_samples = false;
|
bool swizzle_texture_samples = false;
|
||||||
bool tess_domain_origin_lower_left = false;
|
bool tess_domain_origin_lower_left = false;
|
||||||
bool multiview = false;
|
bool multiview = false;
|
||||||
|
bool multiview_layered_rendering = true;
|
||||||
bool view_index_from_device_index = false;
|
bool view_index_from_device_index = false;
|
||||||
bool dispatch_base = false;
|
bool dispatch_base = false;
|
||||||
bool texture_1D_as_2D = false;
|
bool texture_1D_as_2D = false;
|
||||||
|
|
@ -296,7 +327,7 @@ public:
|
||||||
bool ios_support_base_vertex_instance = false;
|
bool ios_support_base_vertex_instance = false;
|
||||||
|
|
||||||
// Use Metal's native frame-buffer fetch API for subpass inputs.
|
// Use Metal's native frame-buffer fetch API for subpass inputs.
|
||||||
bool ios_use_framebuffer_fetch_subpasses = false;
|
bool use_framebuffer_fetch_subpasses = false;
|
||||||
|
|
||||||
// Enables use of "fma" intrinsic for invariant float math
|
// Enables use of "fma" intrinsic for invariant float math
|
||||||
bool invariant_float_math = false;
|
bool invariant_float_math = false;
|
||||||
|
|
@ -324,6 +355,64 @@ public:
|
||||||
// can be read in subsequent stages.
|
// can be read in subsequent stages.
|
||||||
bool enable_clip_distance_user_varying = true;
|
bool enable_clip_distance_user_varying = true;
|
||||||
|
|
||||||
|
// In a tessellation control shader, assume that more than one patch can be processed in a
|
||||||
|
// single workgroup. This requires changes to the way the InvocationId and PrimitiveId
|
||||||
|
// builtins are processed, but should result in more efficient usage of the GPU.
|
||||||
|
bool multi_patch_workgroup = false;
|
||||||
|
|
||||||
|
// If set, a vertex shader will be compiled as part of a tessellation pipeline.
|
||||||
|
// It will be translated as a compute kernel, so it can use the global invocation ID
|
||||||
|
// to index the output buffer.
|
||||||
|
bool vertex_for_tessellation = false;
|
||||||
|
|
||||||
|
// Assume that SubpassData images have multiple layers. Layered input attachments
|
||||||
|
// are addressed relative to the Layer output from the vertex pipeline. This option
|
||||||
|
// has no effect with multiview, since all input attachments are assumed to be layered
|
||||||
|
// and will be addressed using the current ViewIndex.
|
||||||
|
bool arrayed_subpass_input = false;
|
||||||
|
|
||||||
|
// Whether to use SIMD-group or quadgroup functions to implement group nnon-uniform
|
||||||
|
// operations. Some GPUs on iOS do not support the SIMD-group functions, only the
|
||||||
|
// quadgroup functions.
|
||||||
|
bool ios_use_simdgroup_functions = false;
|
||||||
|
|
||||||
|
// If set, the subgroup size will be assumed to be one, and subgroup-related
|
||||||
|
// builtins and operations will be emitted accordingly. This mode is intended to
|
||||||
|
// be used by MoltenVK on hardware/software configurations which do not provide
|
||||||
|
// sufficient support for subgroups.
|
||||||
|
bool emulate_subgroups = false;
|
||||||
|
|
||||||
|
// If nonzero, a fixed subgroup size to assume. Metal, similarly to VK_EXT_subgroup_size_control,
|
||||||
|
// allows the SIMD-group size (aka thread execution width) to vary depending on
|
||||||
|
// register usage and requirements. In certain circumstances--for example, a pipeline
|
||||||
|
// in MoltenVK without VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT--
|
||||||
|
// this is undesirable. This fixes the value of the SubgroupSize builtin, instead of
|
||||||
|
// mapping it to the Metal builtin [[thread_execution_width]]. If the thread
|
||||||
|
// execution width is reduced, the extra invocations will appear to be inactive.
|
||||||
|
// If zero, the SubgroupSize will be allowed to vary, and the builtin will be mapped
|
||||||
|
// to the Metal [[thread_execution_width]] builtin.
|
||||||
|
uint32_t fixed_subgroup_size = 0;
|
||||||
|
|
||||||
|
enum class IndexType
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
UInt16 = 1,
|
||||||
|
UInt32 = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
// The type of index in the index buffer, if present. For a compute shader, Metal
|
||||||
|
// requires specifying the indexing at pipeline creation, rather than at draw time
|
||||||
|
// as with graphics pipelines. This means we must create three different pipelines,
|
||||||
|
// for no indexing, 16-bit indices, and 32-bit indices. Each requires different
|
||||||
|
// handling for the gl_VertexIndex builtin. We may as well, then, create three
|
||||||
|
// different shaders for these three scenarios.
|
||||||
|
IndexType vertex_index_type = IndexType::None;
|
||||||
|
|
||||||
|
// If set, a dummy [[sample_id]] input is added to a fragment shader if none is present.
|
||||||
|
// This will force the shader to run at sample rate, assuming Metal does not optimize
|
||||||
|
// the extra threads away.
|
||||||
|
bool force_sample_rate_shading = false;
|
||||||
|
|
||||||
bool is_ios() const
|
bool is_ios() const
|
||||||
{
|
{
|
||||||
return platform == iOS;
|
return platform == iOS;
|
||||||
|
|
@ -423,11 +512,10 @@ public:
|
||||||
explicit CompilerMSL(const ParsedIR &ir);
|
explicit CompilerMSL(const ParsedIR &ir);
|
||||||
explicit CompilerMSL(ParsedIR &&ir);
|
explicit CompilerMSL(ParsedIR &&ir);
|
||||||
|
|
||||||
// attr is a vertex attribute binding used to match
|
// input is a shader input description used to fix up shader input variables.
|
||||||
// vertex content locations to MSL attributes. If vertex attributes are provided,
|
// If shader inputs are provided, is_msl_shader_input_used() will return true after
|
||||||
// is_msl_vertex_attribute_used() will return true after calling ::compile() if
|
// calling ::compile() if the location was used by the MSL code.
|
||||||
// the location was used by the MSL code.
|
void add_msl_shader_input(const MSLShaderInput &input);
|
||||||
void add_msl_vertex_attribute(const MSLVertexAttr &attr);
|
|
||||||
|
|
||||||
// resource is a resource binding to indicate the MSL buffer,
|
// resource is a resource binding to indicate the MSL buffer,
|
||||||
// texture or sampler index to use for a particular SPIR-V description set
|
// texture or sampler index to use for a particular SPIR-V description set
|
||||||
|
|
@ -459,8 +547,8 @@ public:
|
||||||
// constant. Opt-in to this behavior here on a per set basis.
|
// constant. Opt-in to this behavior here on a per set basis.
|
||||||
void set_argument_buffer_device_address_space(uint32_t desc_set, bool device_storage);
|
void set_argument_buffer_device_address_space(uint32_t desc_set, bool device_storage);
|
||||||
|
|
||||||
// Query after compilation is done. This allows you to check if a location or set/binding combination was used by the shader.
|
// Query after compilation is done. This allows you to check if an input location was used by the shader.
|
||||||
bool is_msl_vertex_attribute_used(uint32_t location);
|
bool is_msl_shader_input_used(uint32_t location);
|
||||||
|
|
||||||
// NOTE: Only resources which are remapped using add_msl_resource_binding will be reported here.
|
// NOTE: Only resources which are remapped using add_msl_resource_binding will be reported here.
|
||||||
// Constexpr samplers are always assumed to be emitted.
|
// Constexpr samplers are always assumed to be emitted.
|
||||||
|
|
@ -509,6 +597,9 @@ public:
|
||||||
// to use for a particular location. The default is 4 if number of components is not overridden.
|
// to use for a particular location. The default is 4 if number of components is not overridden.
|
||||||
void set_fragment_output_components(uint32_t location, uint32_t components);
|
void set_fragment_output_components(uint32_t location, uint32_t components);
|
||||||
|
|
||||||
|
void set_combined_sampler_suffix(const char *suffix);
|
||||||
|
const char *get_combined_sampler_suffix() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// An enum of SPIR-V functions that are implemented in additional
|
// An enum of SPIR-V functions that are implemented in additional
|
||||||
// source code that is added to the shader if necessary.
|
// source code that is added to the shader if necessary.
|
||||||
|
|
@ -548,12 +639,20 @@ protected:
|
||||||
SPVFuncImplTextureSwizzle,
|
SPVFuncImplTextureSwizzle,
|
||||||
SPVFuncImplGatherSwizzle,
|
SPVFuncImplGatherSwizzle,
|
||||||
SPVFuncImplGatherCompareSwizzle,
|
SPVFuncImplGatherCompareSwizzle,
|
||||||
|
SPVFuncImplSubgroupBroadcast,
|
||||||
|
SPVFuncImplSubgroupBroadcastFirst,
|
||||||
SPVFuncImplSubgroupBallot,
|
SPVFuncImplSubgroupBallot,
|
||||||
SPVFuncImplSubgroupBallotBitExtract,
|
SPVFuncImplSubgroupBallotBitExtract,
|
||||||
SPVFuncImplSubgroupBallotFindLSB,
|
SPVFuncImplSubgroupBallotFindLSB,
|
||||||
SPVFuncImplSubgroupBallotFindMSB,
|
SPVFuncImplSubgroupBallotFindMSB,
|
||||||
SPVFuncImplSubgroupBallotBitCount,
|
SPVFuncImplSubgroupBallotBitCount,
|
||||||
SPVFuncImplSubgroupAllEqual,
|
SPVFuncImplSubgroupAllEqual,
|
||||||
|
SPVFuncImplSubgroupShuffle,
|
||||||
|
SPVFuncImplSubgroupShuffleXor,
|
||||||
|
SPVFuncImplSubgroupShuffleUp,
|
||||||
|
SPVFuncImplSubgroupShuffleDown,
|
||||||
|
SPVFuncImplQuadBroadcast,
|
||||||
|
SPVFuncImplQuadSwap,
|
||||||
SPVFuncImplReflectScalar,
|
SPVFuncImplReflectScalar,
|
||||||
SPVFuncImplRefractScalar,
|
SPVFuncImplRefractScalar,
|
||||||
SPVFuncImplFaceForwardScalar,
|
SPVFuncImplFaceForwardScalar,
|
||||||
|
|
@ -577,13 +676,11 @@ protected:
|
||||||
SPVFuncImplConvertYCbCrBT601,
|
SPVFuncImplConvertYCbCrBT601,
|
||||||
SPVFuncImplConvertYCbCrBT2020,
|
SPVFuncImplConvertYCbCrBT2020,
|
||||||
SPVFuncImplDynamicImageSampler,
|
SPVFuncImplDynamicImageSampler,
|
||||||
|
|
||||||
SPVFuncImplArrayCopyMultidimMax = 6
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// If the underlying resource has been used for comparison then duplicate loads of that resource must be too
|
// If the underlying resource has been used for comparison then duplicate loads of that resource must be too
|
||||||
// Use Metal's native frame-buffer fetch API for subpass inputs.
|
// Use Metal's native frame-buffer fetch API for subpass inputs.
|
||||||
void emit_texture_op(const Instruction &i) override;
|
void emit_texture_op(const Instruction &i, bool sparse) override;
|
||||||
void emit_binary_unord_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1, const char *op);
|
void emit_binary_unord_op(uint32_t result_type, uint32_t result_id, uint32_t op0, uint32_t op1, const char *op);
|
||||||
void emit_instruction(const Instruction &instr) override;
|
void emit_instruction(const Instruction &instr) override;
|
||||||
void emit_glsl_op(uint32_t result_type, uint32_t result_id, uint32_t op, const uint32_t *args,
|
void emit_glsl_op(uint32_t result_type, uint32_t result_id, uint32_t op, const uint32_t *args,
|
||||||
|
|
@ -594,7 +691,7 @@ protected:
|
||||||
void emit_function_prototype(SPIRFunction &func, const Bitset &return_flags) override;
|
void emit_function_prototype(SPIRFunction &func, const Bitset &return_flags) override;
|
||||||
void emit_sampled_image_op(uint32_t result_type, uint32_t result_id, uint32_t image_id, uint32_t samp_id) override;
|
void emit_sampled_image_op(uint32_t result_type, uint32_t result_id, uint32_t image_id, uint32_t samp_id) override;
|
||||||
void emit_subgroup_op(const Instruction &i) override;
|
void emit_subgroup_op(const Instruction &i) override;
|
||||||
std::string to_texture_op(const Instruction &i, bool *forward,
|
std::string to_texture_op(const Instruction &i, bool sparse, bool *forward,
|
||||||
SmallVector<uint32_t> &inherited_expressions) override;
|
SmallVector<uint32_t> &inherited_expressions) override;
|
||||||
void emit_fixup() override;
|
void emit_fixup() override;
|
||||||
std::string to_struct_member(const SPIRType &type, uint32_t member_type_id, uint32_t index,
|
std::string to_struct_member(const SPIRType &type, uint32_t member_type_id, uint32_t index,
|
||||||
|
|
@ -614,17 +711,12 @@ protected:
|
||||||
std::string variable_decl(const SPIRType &type, const std::string &name, uint32_t id = 0) override;
|
std::string variable_decl(const SPIRType &type, const std::string &name, uint32_t id = 0) override;
|
||||||
|
|
||||||
std::string image_type_glsl(const SPIRType &type, uint32_t id = 0) override;
|
std::string image_type_glsl(const SPIRType &type, uint32_t id = 0) override;
|
||||||
std::string sampler_type(const SPIRType &type);
|
std::string sampler_type(const SPIRType &type, uint32_t id);
|
||||||
std::string builtin_to_glsl(spv::BuiltIn builtin, spv::StorageClass storage) override;
|
std::string builtin_to_glsl(spv::BuiltIn builtin, spv::StorageClass storage) override;
|
||||||
std::string to_func_call_arg(const SPIRFunction::Parameter &arg, uint32_t id) override;
|
std::string to_func_call_arg(const SPIRFunction::Parameter &arg, uint32_t id) override;
|
||||||
std::string to_name(uint32_t id, bool allow_alias = true) const override;
|
std::string to_name(uint32_t id, bool allow_alias = true) const override;
|
||||||
std::string to_function_name(VariableID img, const SPIRType &imgtype, bool is_fetch, bool is_gather, bool is_proj,
|
std::string to_function_name(const TextureFunctionNameArguments &args) override;
|
||||||
bool has_array_offsets, bool has_offset, bool has_grad, bool has_dref, uint32_t lod,
|
std::string to_function_args(const TextureFunctionArguments &args, bool *p_forward) override;
|
||||||
uint32_t minlod) override;
|
|
||||||
std::string to_function_args(VariableID img, const SPIRType &imgtype, bool is_fetch, bool is_gather, bool is_proj,
|
|
||||||
uint32_t coord, uint32_t coord_components, uint32_t dref, uint32_t grad_x,
|
|
||||||
uint32_t grad_y, uint32_t lod, uint32_t coffset, uint32_t offset, uint32_t bias,
|
|
||||||
uint32_t comp, uint32_t sample, uint32_t minlod, bool *p_forward) override;
|
|
||||||
std::string to_initializer_expression(const SPIRVariable &var) override;
|
std::string to_initializer_expression(const SPIRVariable &var) override;
|
||||||
std::string to_zero_initialized_expression(uint32_t type_id) override;
|
std::string to_zero_initialized_expression(uint32_t type_id) override;
|
||||||
|
|
||||||
|
|
@ -643,6 +735,12 @@ protected:
|
||||||
void declare_undefined_values() override;
|
void declare_undefined_values() override;
|
||||||
void declare_constant_arrays();
|
void declare_constant_arrays();
|
||||||
|
|
||||||
|
void replace_illegal_entry_point_names();
|
||||||
|
void sync_entry_point_aliases_and_names();
|
||||||
|
|
||||||
|
static const std::unordered_set<std::string> &get_reserved_keyword_set();
|
||||||
|
static const std::unordered_set<std::string> &get_illegal_func_names();
|
||||||
|
|
||||||
// Constant arrays of non-primitive types (i.e. matrices) won't link properly into Metal libraries
|
// Constant arrays of non-primitive types (i.e. matrices) won't link properly into Metal libraries
|
||||||
void declare_complex_constant_arrays();
|
void declare_complex_constant_arrays();
|
||||||
|
|
||||||
|
|
@ -693,9 +791,9 @@ protected:
|
||||||
|
|
||||||
void fix_up_interface_member_indices(spv::StorageClass storage, uint32_t ib_type_id);
|
void fix_up_interface_member_indices(spv::StorageClass storage, uint32_t ib_type_id);
|
||||||
|
|
||||||
void mark_location_as_used_by_shader(uint32_t location, spv::StorageClass storage);
|
void mark_location_as_used_by_shader(uint32_t location, const SPIRType &type, spv::StorageClass storage);
|
||||||
uint32_t ensure_correct_builtin_type(uint32_t type_id, spv::BuiltIn builtin);
|
uint32_t ensure_correct_builtin_type(uint32_t type_id, spv::BuiltIn builtin);
|
||||||
uint32_t ensure_correct_attribute_type(uint32_t type_id, uint32_t location, uint32_t num_components = 0);
|
uint32_t ensure_correct_input_type(uint32_t type_id, uint32_t location, uint32_t num_components = 0);
|
||||||
|
|
||||||
void emit_custom_templates();
|
void emit_custom_templates();
|
||||||
void emit_custom_functions();
|
void emit_custom_functions();
|
||||||
|
|
@ -703,6 +801,7 @@ protected:
|
||||||
void emit_specialization_constants_and_structs();
|
void emit_specialization_constants_and_structs();
|
||||||
void emit_interface_block(uint32_t ib_var_id);
|
void emit_interface_block(uint32_t ib_var_id);
|
||||||
bool maybe_emit_array_assignment(uint32_t id_lhs, uint32_t id_rhs);
|
bool maybe_emit_array_assignment(uint32_t id_lhs, uint32_t id_rhs);
|
||||||
|
uint32_t get_resource_array_size(uint32_t id) const;
|
||||||
|
|
||||||
void fix_up_shader_inputs_outputs();
|
void fix_up_shader_inputs_outputs();
|
||||||
|
|
||||||
|
|
@ -717,6 +816,8 @@ protected:
|
||||||
std::string to_sampler_expression(uint32_t id);
|
std::string to_sampler_expression(uint32_t id);
|
||||||
std::string to_swizzle_expression(uint32_t id);
|
std::string to_swizzle_expression(uint32_t id);
|
||||||
std::string to_buffer_size_expression(uint32_t id);
|
std::string to_buffer_size_expression(uint32_t id);
|
||||||
|
bool is_sample_rate() const;
|
||||||
|
bool is_direct_input_builtin(spv::BuiltIn builtin);
|
||||||
std::string builtin_qualifier(spv::BuiltIn builtin);
|
std::string builtin_qualifier(spv::BuiltIn builtin);
|
||||||
std::string builtin_type_decl(spv::BuiltIn builtin, uint32_t id = 0);
|
std::string builtin_type_decl(spv::BuiltIn builtin, uint32_t id = 0);
|
||||||
std::string built_in_func_arg(spv::BuiltIn builtin, bool prefix_comma);
|
std::string built_in_func_arg(spv::BuiltIn builtin, bool prefix_comma);
|
||||||
|
|
@ -739,7 +840,13 @@ protected:
|
||||||
uint32_t get_declared_struct_member_matrix_stride_msl(const SPIRType &struct_type, uint32_t index) const;
|
uint32_t get_declared_struct_member_matrix_stride_msl(const SPIRType &struct_type, uint32_t index) const;
|
||||||
uint32_t get_declared_struct_member_alignment_msl(const SPIRType &struct_type, uint32_t index) const;
|
uint32_t get_declared_struct_member_alignment_msl(const SPIRType &struct_type, uint32_t index) const;
|
||||||
|
|
||||||
|
uint32_t get_declared_input_size_msl(const SPIRType &struct_type, uint32_t index) const;
|
||||||
|
uint32_t get_declared_input_array_stride_msl(const SPIRType &struct_type, uint32_t index) const;
|
||||||
|
uint32_t get_declared_input_matrix_stride_msl(const SPIRType &struct_type, uint32_t index) const;
|
||||||
|
uint32_t get_declared_input_alignment_msl(const SPIRType &struct_type, uint32_t index) const;
|
||||||
|
|
||||||
const SPIRType &get_physical_member_type(const SPIRType &struct_type, uint32_t index) const;
|
const SPIRType &get_physical_member_type(const SPIRType &struct_type, uint32_t index) const;
|
||||||
|
SPIRType get_presumed_input_type(const SPIRType &struct_type, uint32_t index) const;
|
||||||
|
|
||||||
uint32_t get_declared_struct_size_msl(const SPIRType &struct_type, bool ignore_alignment = false,
|
uint32_t get_declared_struct_size_msl(const SPIRType &struct_type, bool ignore_alignment = false,
|
||||||
bool ignore_padding = false) const;
|
bool ignore_padding = false) const;
|
||||||
|
|
@ -758,6 +865,8 @@ protected:
|
||||||
SPIRType &get_patch_stage_in_struct_type();
|
SPIRType &get_patch_stage_in_struct_type();
|
||||||
SPIRType &get_patch_stage_out_struct_type();
|
SPIRType &get_patch_stage_out_struct_type();
|
||||||
std::string get_tess_factor_struct_name();
|
std::string get_tess_factor_struct_name();
|
||||||
|
SPIRType &get_uint_type();
|
||||||
|
uint32_t get_uint_type_id();
|
||||||
void emit_atomic_func_op(uint32_t result_type, uint32_t result_id, const char *op, uint32_t mem_order_1,
|
void emit_atomic_func_op(uint32_t result_type, uint32_t result_id, const char *op, uint32_t mem_order_1,
|
||||||
uint32_t mem_order_2, bool has_mem_order_2, uint32_t op0, uint32_t op1 = 0,
|
uint32_t mem_order_2, bool has_mem_order_2, uint32_t op0, uint32_t op1 = 0,
|
||||||
bool op1_is_pointer = false, bool op1_is_literal = false, uint32_t op2 = 0);
|
bool op1_is_pointer = false, bool op1_is_literal = false, uint32_t op2 = 0);
|
||||||
|
|
@ -772,6 +881,7 @@ protected:
|
||||||
void emit_entry_point_declarations() override;
|
void emit_entry_point_declarations() override;
|
||||||
uint32_t builtin_frag_coord_id = 0;
|
uint32_t builtin_frag_coord_id = 0;
|
||||||
uint32_t builtin_sample_id_id = 0;
|
uint32_t builtin_sample_id_id = 0;
|
||||||
|
uint32_t builtin_sample_mask_id = 0;
|
||||||
uint32_t builtin_vertex_idx_id = 0;
|
uint32_t builtin_vertex_idx_id = 0;
|
||||||
uint32_t builtin_base_vertex_id = 0;
|
uint32_t builtin_base_vertex_id = 0;
|
||||||
uint32_t builtin_instance_idx_id = 0;
|
uint32_t builtin_instance_idx_id = 0;
|
||||||
|
|
@ -783,17 +893,26 @@ protected:
|
||||||
uint32_t builtin_subgroup_invocation_id_id = 0;
|
uint32_t builtin_subgroup_invocation_id_id = 0;
|
||||||
uint32_t builtin_subgroup_size_id = 0;
|
uint32_t builtin_subgroup_size_id = 0;
|
||||||
uint32_t builtin_dispatch_base_id = 0;
|
uint32_t builtin_dispatch_base_id = 0;
|
||||||
|
uint32_t builtin_stage_input_size_id = 0;
|
||||||
|
uint32_t builtin_local_invocation_index_id = 0;
|
||||||
|
uint32_t builtin_workgroup_size_id = 0;
|
||||||
uint32_t swizzle_buffer_id = 0;
|
uint32_t swizzle_buffer_id = 0;
|
||||||
uint32_t buffer_size_buffer_id = 0;
|
uint32_t buffer_size_buffer_id = 0;
|
||||||
uint32_t view_mask_buffer_id = 0;
|
uint32_t view_mask_buffer_id = 0;
|
||||||
uint32_t dynamic_offsets_buffer_id = 0;
|
uint32_t dynamic_offsets_buffer_id = 0;
|
||||||
|
uint32_t uint_type_id = 0;
|
||||||
|
|
||||||
void bitcast_to_builtin_store(uint32_t target_id, std::string &expr, const SPIRType &expr_type) override;
|
bool does_shader_write_sample_mask = false;
|
||||||
void bitcast_from_builtin_load(uint32_t source_id, std::string &expr, const SPIRType &expr_type) override;
|
|
||||||
|
void cast_to_builtin_store(uint32_t target_id, std::string &expr, const SPIRType &expr_type) override;
|
||||||
|
void cast_from_builtin_load(uint32_t source_id, std::string &expr, const SPIRType &expr_type) override;
|
||||||
void emit_store_statement(uint32_t lhs_expression, uint32_t rhs_expression) override;
|
void emit_store_statement(uint32_t lhs_expression, uint32_t rhs_expression) override;
|
||||||
|
|
||||||
void analyze_sampled_image_usage();
|
void analyze_sampled_image_usage();
|
||||||
|
|
||||||
|
void prepare_access_chain_for_scalar_access(std::string &expr, const SPIRType &type, spv::StorageClass storage,
|
||||||
|
bool &is_packed) override;
|
||||||
|
void fix_up_interpolant_access_chain(const uint32_t *ops, uint32_t length);
|
||||||
bool emit_tessellation_access_chain(const uint32_t *ops, uint32_t length);
|
bool emit_tessellation_access_chain(const uint32_t *ops, uint32_t length);
|
||||||
bool emit_tessellation_io_load(uint32_t result_type, uint32_t id, uint32_t ptr);
|
bool emit_tessellation_io_load(uint32_t result_type, uint32_t id, uint32_t ptr);
|
||||||
bool is_out_of_bounds_tessellation_level(uint32_t id_lhs);
|
bool is_out_of_bounds_tessellation_level(uint32_t id_lhs);
|
||||||
|
|
@ -806,9 +925,10 @@ protected:
|
||||||
|
|
||||||
Options msl_options;
|
Options msl_options;
|
||||||
std::set<SPVFuncImpl> spv_function_implementations;
|
std::set<SPVFuncImpl> spv_function_implementations;
|
||||||
std::unordered_map<uint32_t, MSLVertexAttr> vtx_attrs_by_location;
|
// Must be ordered to ensure declarations are in a specific order.
|
||||||
std::unordered_map<uint32_t, MSLVertexAttr> vtx_attrs_by_builtin;
|
std::map<uint32_t, MSLShaderInput> inputs_by_location;
|
||||||
std::unordered_set<uint32_t> vtx_attrs_in_use;
|
std::unordered_map<uint32_t, MSLShaderInput> inputs_by_builtin;
|
||||||
|
std::unordered_set<uint32_t> inputs_in_use;
|
||||||
std::unordered_map<uint32_t, uint32_t> fragment_output_components;
|
std::unordered_map<uint32_t, uint32_t> fragment_output_components;
|
||||||
std::set<std::string> pragma_lines;
|
std::set<std::string> pragma_lines;
|
||||||
std::set<std::string> typedef_lines;
|
std::set<std::string> typedef_lines;
|
||||||
|
|
@ -851,6 +971,8 @@ protected:
|
||||||
bool used_swizzle_buffer = false;
|
bool used_swizzle_buffer = false;
|
||||||
bool added_builtin_tess_level = false;
|
bool added_builtin_tess_level = false;
|
||||||
bool needs_subgroup_invocation_id = false;
|
bool needs_subgroup_invocation_id = false;
|
||||||
|
bool needs_subgroup_size = false;
|
||||||
|
bool needs_sample_id = false;
|
||||||
std::string qual_pos_var_name;
|
std::string qual_pos_var_name;
|
||||||
std::string stage_in_var_name = "in";
|
std::string stage_in_var_name = "in";
|
||||||
std::string stage_out_var_name = "out";
|
std::string stage_out_var_name = "out";
|
||||||
|
|
@ -861,9 +983,11 @@ protected:
|
||||||
std::string buffer_size_name_suffix = "BufferSize";
|
std::string buffer_size_name_suffix = "BufferSize";
|
||||||
std::string plane_name_suffix = "Plane";
|
std::string plane_name_suffix = "Plane";
|
||||||
std::string input_wg_var_name = "gl_in";
|
std::string input_wg_var_name = "gl_in";
|
||||||
|
std::string input_buffer_var_name = "spvIn";
|
||||||
std::string output_buffer_var_name = "spvOut";
|
std::string output_buffer_var_name = "spvOut";
|
||||||
std::string patch_output_buffer_var_name = "spvPatchOut";
|
std::string patch_output_buffer_var_name = "spvPatchOut";
|
||||||
std::string tess_factor_buffer_var_name = "spvTessLevel";
|
std::string tess_factor_buffer_var_name = "spvTessLevel";
|
||||||
|
std::string index_buffer_var_name = "spvIndices";
|
||||||
spv::Op previous_instruction_opcode = spv::OpNop;
|
spv::Op previous_instruction_opcode = spv::OpNop;
|
||||||
|
|
||||||
// Must be ordered since declaration is in a specific order.
|
// Must be ordered since declaration is in a specific order.
|
||||||
|
|
@ -874,6 +998,7 @@ protected:
|
||||||
std::unordered_set<uint32_t> buffers_requiring_array_length;
|
std::unordered_set<uint32_t> buffers_requiring_array_length;
|
||||||
SmallVector<uint32_t> buffer_arrays;
|
SmallVector<uint32_t> buffer_arrays;
|
||||||
std::unordered_set<uint32_t> atomic_image_vars; // Emulate texture2D atomic operations
|
std::unordered_set<uint32_t> atomic_image_vars; // Emulate texture2D atomic operations
|
||||||
|
std::unordered_set<uint32_t> pull_model_inputs;
|
||||||
|
|
||||||
// Must be ordered since array is in a specific order.
|
// Must be ordered since array is in a specific order.
|
||||||
std::map<SetBindingPair, std::pair<uint32_t, uint32_t>> buffers_requiring_dynamic_offset;
|
std::map<SetBindingPair, std::pair<uint32_t, uint32_t>> buffers_requiring_dynamic_offset;
|
||||||
|
|
@ -890,7 +1015,9 @@ protected:
|
||||||
bool descriptor_set_is_argument_buffer(uint32_t desc_set) const;
|
bool descriptor_set_is_argument_buffer(uint32_t desc_set) const;
|
||||||
|
|
||||||
uint32_t get_target_components_for_fragment_location(uint32_t location) const;
|
uint32_t get_target_components_for_fragment_location(uint32_t location) const;
|
||||||
uint32_t build_extended_vector_type(uint32_t type_id, uint32_t components);
|
uint32_t build_extended_vector_type(uint32_t type_id, uint32_t components,
|
||||||
|
SPIRType::BaseType basetype = SPIRType::Unknown);
|
||||||
|
uint32_t build_msl_interpolant_type(uint32_t type_id, bool is_noperspective);
|
||||||
|
|
||||||
bool suppress_missing_prototypes = false;
|
bool suppress_missing_prototypes = false;
|
||||||
|
|
||||||
|
|
@ -899,6 +1026,7 @@ protected:
|
||||||
void activate_argument_buffer_resources();
|
void activate_argument_buffer_resources();
|
||||||
|
|
||||||
bool type_is_msl_framebuffer_fetch(const SPIRType &type) const;
|
bool type_is_msl_framebuffer_fetch(const SPIRType &type) const;
|
||||||
|
bool is_supported_argument_buffer_type(const SPIRType &type) const;
|
||||||
|
|
||||||
// OpcodeHandler that handles several MSL preprocessing operations.
|
// OpcodeHandler that handles several MSL preprocessing operations.
|
||||||
struct OpCodePreprocessor : OpcodeHandler
|
struct OpCodePreprocessor : OpcodeHandler
|
||||||
|
|
@ -919,6 +1047,8 @@ protected:
|
||||||
bool uses_atomics = false;
|
bool uses_atomics = false;
|
||||||
bool uses_resource_write = false;
|
bool uses_resource_write = false;
|
||||||
bool needs_subgroup_invocation_id = false;
|
bool needs_subgroup_invocation_id = false;
|
||||||
|
bool needs_subgroup_size = false;
|
||||||
|
bool needs_sample_id = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
// OpcodeHandler that scans for uses of sampled images
|
// OpcodeHandler that scans for uses of sampled images
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2018-2020 Arm Limited
|
* Copyright 2018-2021 Arm Limited
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -14,6 +14,13 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At your option, you may choose to accept this material under either:
|
||||||
|
* 1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or
|
||||||
|
* 2. The MIT License, found at <http://opensource.org/licenses/MIT>.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 OR MIT.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef SPIRV_CROSS_PARSER_HPP
|
#ifndef SPIRV_CROSS_PARSER_HPP
|
||||||
#define SPIRV_CROSS_PARSER_HPP
|
#define SPIRV_CROSS_PARSER_HPP
|
||||||
|
|
||||||
|
|
@ -84,6 +91,7 @@ private:
|
||||||
|
|
||||||
// This must be an ordered data structure so we always pick the same type aliases.
|
// This must be an ordered data structure so we always pick the same type aliases.
|
||||||
SmallVector<uint32_t> global_struct_cache;
|
SmallVector<uint32_t> global_struct_cache;
|
||||||
|
SmallVector<std::pair<uint32_t, uint32_t>> forward_pointer_fixups;
|
||||||
|
|
||||||
bool types_are_logically_equivalent(const SPIRType &a, const SPIRType &b) const;
|
bool types_are_logically_equivalent(const SPIRType &a, const SPIRType &b) const;
|
||||||
bool variable_storage_is_aliased(const SPIRVariable &v) const;
|
bool variable_storage_is_aliased(const SPIRVariable &v) const;
|
||||||
|
|
|
||||||
|
|
@ -1,83 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2018-2020 Bradley Austin Davis
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef SPIRV_CROSS_REFLECT_HPP
|
|
||||||
#define SPIRV_CROSS_REFLECT_HPP
|
|
||||||
|
|
||||||
#include "spirv_glsl.hpp"
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
namespace simple_json
|
|
||||||
{
|
|
||||||
class Stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace SPIRV_CROSS_NAMESPACE
|
|
||||||
{
|
|
||||||
class CompilerReflection : public CompilerGLSL
|
|
||||||
{
|
|
||||||
using Parent = CompilerGLSL;
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit CompilerReflection(std::vector<uint32_t> spirv_)
|
|
||||||
: Parent(std::move(spirv_))
|
|
||||||
{
|
|
||||||
options.vulkan_semantics = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
CompilerReflection(const uint32_t *ir_, size_t word_count)
|
|
||||||
: Parent(ir_, word_count)
|
|
||||||
{
|
|
||||||
options.vulkan_semantics = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit CompilerReflection(const ParsedIR &ir_)
|
|
||||||
: CompilerGLSL(ir_)
|
|
||||||
{
|
|
||||||
options.vulkan_semantics = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit CompilerReflection(ParsedIR &&ir_)
|
|
||||||
: CompilerGLSL(std::move(ir_))
|
|
||||||
{
|
|
||||||
options.vulkan_semantics = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_format(const std::string &format);
|
|
||||||
std::string compile() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
static std::string execution_model_to_str(spv::ExecutionModel model);
|
|
||||||
|
|
||||||
void emit_entry_points();
|
|
||||||
void emit_types();
|
|
||||||
void emit_resources();
|
|
||||||
void emit_specialization_constants();
|
|
||||||
|
|
||||||
void emit_type(const SPIRType &type, bool &emitted_open_tag);
|
|
||||||
void emit_type_member(const SPIRType &type, uint32_t index);
|
|
||||||
void emit_type_member_qualifiers(const SPIRType &type, uint32_t index);
|
|
||||||
void emit_type_array(const SPIRType &type);
|
|
||||||
void emit_resources(const char *tag, const SmallVector<Resource> &resources);
|
|
||||||
|
|
||||||
std::string to_member_name(const SPIRType &type, uint32_t index) const;
|
|
||||||
|
|
||||||
std::shared_ptr<simple_json::Stream> json_stream;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace SPIRV_CROSS_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue