INTEL_shader_integer_functions2: Add compiler front-end support
The changes to glslang/glslang/MachineIndependent/ParseHelper.cpp exist purely to prevent even more instances of "warning: enumeration value ‘EOp...’ not handled in switch" v2: Remove 8-bit types. Overzealous copy-and-paste led to adding support for a bunch of types that the extension doesn't actually enable. v3: Update expected test results file. Just changing an expected results file to make a test pass seems sketchy to me, but I'm not sure what else to do. v4: Add missing entry for EOpAbsDifference in TOutputTraverser::visitBinary. Noticed by JohnK.
This commit is contained in:
		
							parent
							
								
									e0da415dff
								
							
						
					
					
						commit
						fbcdcac254
					
				| @ -11,7 +11,7 @@ spv.specConstant.vert | |||||||
|                               Source GLSL 400 |                               Source GLSL 400 | ||||||
|                               Name 4  "main" |                               Name 4  "main" | ||||||
|                               Name 9  "arraySize" |                               Name 9  "arraySize" | ||||||
|                               Name 14  "foo(vf4[s4393];" |                               Name 14  "foo(vf4[s4529];" | ||||||
|                               Name 13  "p" |                               Name 13  "p" | ||||||
|                               Name 17  "builtin_spec_constant(" |                               Name 17  "builtin_spec_constant(" | ||||||
|                               Name 20  "color" |                               Name 20  "color" | ||||||
| @ -102,10 +102,10 @@ spv.specConstant.vert | |||||||
|                               Store 20(color) 46 |                               Store 20(color) 46 | ||||||
|               48:          10 Load 22(ucol) |               48:          10 Load 22(ucol) | ||||||
|                               Store 47(param) 48 |                               Store 47(param) 48 | ||||||
|               49:           2 FunctionCall 14(foo(vf4[s4393];) 47(param) |               49:           2 FunctionCall 14(foo(vf4[s4529];) 47(param) | ||||||
|                               Return |                               Return | ||||||
|                               FunctionEnd |                               FunctionEnd | ||||||
| 14(foo(vf4[s4393];):           2 Function None 12 | 14(foo(vf4[s4529];):           2 Function None 12 | ||||||
|            13(p):     11(ptr) FunctionParameter |            13(p):     11(ptr) FunctionParameter | ||||||
|               15:             Label |               15:             Label | ||||||
|               54:     24(ptr) AccessChain 53(dupUcol) 23 |               54:     24(ptr) AccessChain 53(dupUcol) 23 | ||||||
|  | |||||||
| @ -899,6 +899,15 @@ enum TOperator { | |||||||
|     EOpFindLSB, |     EOpFindLSB, | ||||||
|     EOpFindMSB, |     EOpFindMSB, | ||||||
| 
 | 
 | ||||||
|  |     EOpCountLeadingZeros, | ||||||
|  |     EOpCountTrailingZeros, | ||||||
|  |     EOpAbsDifference, | ||||||
|  |     EOpAddSaturate, | ||||||
|  |     EOpSubSaturate, | ||||||
|  |     EOpAverage, | ||||||
|  |     EOpAverageRounded, | ||||||
|  |     EOpMul32x16, | ||||||
|  | 
 | ||||||
|     EOpTraceNV, |     EOpTraceNV, | ||||||
|     EOpReportIntersectionNV, |     EOpReportIntersectionNV, | ||||||
|     EOpIgnoreIntersectionNV, |     EOpIgnoreIntersectionNV, | ||||||
|  | |||||||
| @ -2854,6 +2854,181 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV | |||||||
|             "\n"); |             "\n"); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     if ((profile != EEsProfile && version >= 130) || | ||||||
|  |         (profile == EEsProfile && version >= 300)) { | ||||||
|  |         commonBuiltins.append( | ||||||
|  |             "uint countLeadingZeros(uint);" | ||||||
|  |             "uvec2 countLeadingZeros(uvec2);" | ||||||
|  |             "uvec3 countLeadingZeros(uvec3);" | ||||||
|  |             "uvec4 countLeadingZeros(uvec4);" | ||||||
|  | 
 | ||||||
|  |             "uint countTrailingZeros(uint);" | ||||||
|  |             "uvec2 countTrailingZeros(uvec2);" | ||||||
|  |             "uvec3 countTrailingZeros(uvec3);" | ||||||
|  |             "uvec4 countTrailingZeros(uvec4);" | ||||||
|  | 
 | ||||||
|  |             "uint absoluteDifference(int, int);" | ||||||
|  |             "uvec2 absoluteDifference(ivec2, ivec2);" | ||||||
|  |             "uvec3 absoluteDifference(ivec3, ivec3);" | ||||||
|  |             "uvec4 absoluteDifference(ivec4, ivec4);" | ||||||
|  | 
 | ||||||
|  |             "uint16_t absoluteDifference(int16_t, int16_t);" | ||||||
|  |             "u16vec2 absoluteDifference(i16vec2, i16vec2);" | ||||||
|  |             "u16vec3 absoluteDifference(i16vec3, i16vec3);" | ||||||
|  |             "u16vec4 absoluteDifference(i16vec4, i16vec4);" | ||||||
|  | 
 | ||||||
|  |             "uint64_t absoluteDifference(int64_t, int64_t);" | ||||||
|  |             "u64vec2 absoluteDifference(i64vec2, i64vec2);" | ||||||
|  |             "u64vec3 absoluteDifference(i64vec3, i64vec3);" | ||||||
|  |             "u64vec4 absoluteDifference(i64vec4, i64vec4);" | ||||||
|  | 
 | ||||||
|  |             "uint absoluteDifference(uint, uint);" | ||||||
|  |             "uvec2 absoluteDifference(uvec2, uvec2);" | ||||||
|  |             "uvec3 absoluteDifference(uvec3, uvec3);" | ||||||
|  |             "uvec4 absoluteDifference(uvec4, uvec4);" | ||||||
|  | 
 | ||||||
|  |             "uint16_t absoluteDifference(uint16_t, uint16_t);" | ||||||
|  |             "u16vec2 absoluteDifference(u16vec2, u16vec2);" | ||||||
|  |             "u16vec3 absoluteDifference(u16vec3, u16vec3);" | ||||||
|  |             "u16vec4 absoluteDifference(u16vec4, u16vec4);" | ||||||
|  | 
 | ||||||
|  |             "uint64_t absoluteDifference(uint64_t, uint64_t);" | ||||||
|  |             "u64vec2 absoluteDifference(u64vec2, u64vec2);" | ||||||
|  |             "u64vec3 absoluteDifference(u64vec3, u64vec3);" | ||||||
|  |             "u64vec4 absoluteDifference(u64vec4, u64vec4);" | ||||||
|  | 
 | ||||||
|  |             "int addSaturate(int, int);" | ||||||
|  |             "ivec2 addSaturate(ivec2, ivec2);" | ||||||
|  |             "ivec3 addSaturate(ivec3, ivec3);" | ||||||
|  |             "ivec4 addSaturate(ivec4, ivec4);" | ||||||
|  | 
 | ||||||
|  |             "int16_t addSaturate(int16_t, int16_t);" | ||||||
|  |             "i16vec2 addSaturate(i16vec2, i16vec2);" | ||||||
|  |             "i16vec3 addSaturate(i16vec3, i16vec3);" | ||||||
|  |             "i16vec4 addSaturate(i16vec4, i16vec4);" | ||||||
|  | 
 | ||||||
|  |             "int64_t addSaturate(int64_t, int64_t);" | ||||||
|  |             "i64vec2 addSaturate(i64vec2, i64vec2);" | ||||||
|  |             "i64vec3 addSaturate(i64vec3, i64vec3);" | ||||||
|  |             "i64vec4 addSaturate(i64vec4, i64vec4);" | ||||||
|  | 
 | ||||||
|  |             "uint addSaturate(uint, uint);" | ||||||
|  |             "uvec2 addSaturate(uvec2, uvec2);" | ||||||
|  |             "uvec3 addSaturate(uvec3, uvec3);" | ||||||
|  |             "uvec4 addSaturate(uvec4, uvec4);" | ||||||
|  | 
 | ||||||
|  |             "uint16_t addSaturate(uint16_t, uint16_t);" | ||||||
|  |             "u16vec2 addSaturate(u16vec2, u16vec2);" | ||||||
|  |             "u16vec3 addSaturate(u16vec3, u16vec3);" | ||||||
|  |             "u16vec4 addSaturate(u16vec4, u16vec4);" | ||||||
|  | 
 | ||||||
|  |             "uint64_t addSaturate(uint64_t, uint64_t);" | ||||||
|  |             "u64vec2 addSaturate(u64vec2, u64vec2);" | ||||||
|  |             "u64vec3 addSaturate(u64vec3, u64vec3);" | ||||||
|  |             "u64vec4 addSaturate(u64vec4, u64vec4);" | ||||||
|  | 
 | ||||||
|  |             "int subtractSaturate(int, int);" | ||||||
|  |             "ivec2 subtractSaturate(ivec2, ivec2);" | ||||||
|  |             "ivec3 subtractSaturate(ivec3, ivec3);" | ||||||
|  |             "ivec4 subtractSaturate(ivec4, ivec4);" | ||||||
|  | 
 | ||||||
|  |             "int16_t subtractSaturate(int16_t, int16_t);" | ||||||
|  |             "i16vec2 subtractSaturate(i16vec2, i16vec2);" | ||||||
|  |             "i16vec3 subtractSaturate(i16vec3, i16vec3);" | ||||||
|  |             "i16vec4 subtractSaturate(i16vec4, i16vec4);" | ||||||
|  | 
 | ||||||
|  |             "int64_t subtractSaturate(int64_t, int64_t);" | ||||||
|  |             "i64vec2 subtractSaturate(i64vec2, i64vec2);" | ||||||
|  |             "i64vec3 subtractSaturate(i64vec3, i64vec3);" | ||||||
|  |             "i64vec4 subtractSaturate(i64vec4, i64vec4);" | ||||||
|  | 
 | ||||||
|  |             "uint subtractSaturate(uint, uint);" | ||||||
|  |             "uvec2 subtractSaturate(uvec2, uvec2);" | ||||||
|  |             "uvec3 subtractSaturate(uvec3, uvec3);" | ||||||
|  |             "uvec4 subtractSaturate(uvec4, uvec4);" | ||||||
|  | 
 | ||||||
|  |             "uint16_t subtractSaturate(uint16_t, uint16_t);" | ||||||
|  |             "u16vec2 subtractSaturate(u16vec2, u16vec2);" | ||||||
|  |             "u16vec3 subtractSaturate(u16vec3, u16vec3);" | ||||||
|  |             "u16vec4 subtractSaturate(u16vec4, u16vec4);" | ||||||
|  | 
 | ||||||
|  |             "uint64_t subtractSaturate(uint64_t, uint64_t);" | ||||||
|  |             "u64vec2 subtractSaturate(u64vec2, u64vec2);" | ||||||
|  |             "u64vec3 subtractSaturate(u64vec3, u64vec3);" | ||||||
|  |             "u64vec4 subtractSaturate(u64vec4, u64vec4);" | ||||||
|  | 
 | ||||||
|  |             "int average(int, int);" | ||||||
|  |             "ivec2 average(ivec2, ivec2);" | ||||||
|  |             "ivec3 average(ivec3, ivec3);" | ||||||
|  |             "ivec4 average(ivec4, ivec4);" | ||||||
|  | 
 | ||||||
|  |             "int16_t average(int16_t, int16_t);" | ||||||
|  |             "i16vec2 average(i16vec2, i16vec2);" | ||||||
|  |             "i16vec3 average(i16vec3, i16vec3);" | ||||||
|  |             "i16vec4 average(i16vec4, i16vec4);" | ||||||
|  | 
 | ||||||
|  |             "int64_t average(int64_t, int64_t);" | ||||||
|  |             "i64vec2 average(i64vec2, i64vec2);" | ||||||
|  |             "i64vec3 average(i64vec3, i64vec3);" | ||||||
|  |             "i64vec4 average(i64vec4, i64vec4);" | ||||||
|  | 
 | ||||||
|  |             "uint average(uint, uint);" | ||||||
|  |             "uvec2 average(uvec2, uvec2);" | ||||||
|  |             "uvec3 average(uvec3, uvec3);" | ||||||
|  |             "uvec4 average(uvec4, uvec4);" | ||||||
|  | 
 | ||||||
|  |             "uint16_t average(uint16_t, uint16_t);" | ||||||
|  |             "u16vec2 average(u16vec2, u16vec2);" | ||||||
|  |             "u16vec3 average(u16vec3, u16vec3);" | ||||||
|  |             "u16vec4 average(u16vec4, u16vec4);" | ||||||
|  | 
 | ||||||
|  |             "uint64_t average(uint64_t, uint64_t);" | ||||||
|  |             "u64vec2 average(u64vec2, u64vec2);" | ||||||
|  |             "u64vec3 average(u64vec3, u64vec3);" | ||||||
|  |             "u64vec4 average(u64vec4, u64vec4);" | ||||||
|  | 
 | ||||||
|  |             "int averageRounded(int, int);" | ||||||
|  |             "ivec2 averageRounded(ivec2, ivec2);" | ||||||
|  |             "ivec3 averageRounded(ivec3, ivec3);" | ||||||
|  |             "ivec4 averageRounded(ivec4, ivec4);" | ||||||
|  | 
 | ||||||
|  |             "int16_t averageRounded(int16_t, int16_t);" | ||||||
|  |             "i16vec2 averageRounded(i16vec2, i16vec2);" | ||||||
|  |             "i16vec3 averageRounded(i16vec3, i16vec3);" | ||||||
|  |             "i16vec4 averageRounded(i16vec4, i16vec4);" | ||||||
|  | 
 | ||||||
|  |             "int64_t averageRounded(int64_t, int64_t);" | ||||||
|  |             "i64vec2 averageRounded(i64vec2, i64vec2);" | ||||||
|  |             "i64vec3 averageRounded(i64vec3, i64vec3);" | ||||||
|  |             "i64vec4 averageRounded(i64vec4, i64vec4);" | ||||||
|  | 
 | ||||||
|  |             "uint averageRounded(uint, uint);" | ||||||
|  |             "uvec2 averageRounded(uvec2, uvec2);" | ||||||
|  |             "uvec3 averageRounded(uvec3, uvec3);" | ||||||
|  |             "uvec4 averageRounded(uvec4, uvec4);" | ||||||
|  | 
 | ||||||
|  |             "uint16_t averageRounded(uint16_t, uint16_t);" | ||||||
|  |             "u16vec2 averageRounded(u16vec2, u16vec2);" | ||||||
|  |             "u16vec3 averageRounded(u16vec3, u16vec3);" | ||||||
|  |             "u16vec4 averageRounded(u16vec4, u16vec4);" | ||||||
|  | 
 | ||||||
|  |             "uint64_t averageRounded(uint64_t, uint64_t);" | ||||||
|  |             "u64vec2 averageRounded(u64vec2, u64vec2);" | ||||||
|  |             "u64vec3 averageRounded(u64vec3, u64vec3);" | ||||||
|  |             "u64vec4 averageRounded(u64vec4, u64vec4);" | ||||||
|  | 
 | ||||||
|  |             "int multiply32x16(int, int);" | ||||||
|  |             "ivec2 multiply32x16(ivec2, ivec2);" | ||||||
|  |             "ivec3 multiply32x16(ivec3, ivec3);" | ||||||
|  |             "ivec4 multiply32x16(ivec4, ivec4);" | ||||||
|  | 
 | ||||||
|  |             "uint multiply32x16(uint, uint);" | ||||||
|  |             "uvec2 multiply32x16(uvec2, uvec2);" | ||||||
|  |             "uvec3 multiply32x16(uvec3, uvec3);" | ||||||
|  |             "uvec4 multiply32x16(uvec4, uvec4);" | ||||||
|  |             "\n"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     if ((profile != EEsProfile && version >= 450) || |     if ((profile != EEsProfile && version >= 450) || | ||||||
|         (profile == EEsProfile && version >= 320)) { |         (profile == EEsProfile && version >= 320)) { | ||||||
|         commonBuiltins.append( |         commonBuiltins.append( | ||||||
| @ -6974,6 +7149,15 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion | |||||||
|             symbolTable.setFunctionExtensions("fragmentFetchAMD",     1, &E_GL_AMD_shader_fragment_mask); |             symbolTable.setFunctionExtensions("fragmentFetchAMD",     1, &E_GL_AMD_shader_fragment_mask); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         symbolTable.setFunctionExtensions("countLeadingZeros",  1, &E_GL_INTEL_shader_integer_functions2); | ||||||
|  |         symbolTable.setFunctionExtensions("countTrailingZeros", 1, &E_GL_INTEL_shader_integer_functions2); | ||||||
|  |         symbolTable.setFunctionExtensions("absoluteDifference", 1, &E_GL_INTEL_shader_integer_functions2); | ||||||
|  |         symbolTable.setFunctionExtensions("addSaturate",        1, &E_GL_INTEL_shader_integer_functions2); | ||||||
|  |         symbolTable.setFunctionExtensions("subtractSaturate",   1, &E_GL_INTEL_shader_integer_functions2); | ||||||
|  |         symbolTable.setFunctionExtensions("average",            1, &E_GL_INTEL_shader_integer_functions2); | ||||||
|  |         symbolTable.setFunctionExtensions("averageRounded",     1, &E_GL_INTEL_shader_integer_functions2); | ||||||
|  |         symbolTable.setFunctionExtensions("multiply32x16",      1, &E_GL_INTEL_shader_integer_functions2); | ||||||
|  | 
 | ||||||
|         symbolTable.setFunctionExtensions("textureFootprintNV",          1, &E_GL_NV_shader_texture_footprint); |         symbolTable.setFunctionExtensions("textureFootprintNV",          1, &E_GL_NV_shader_texture_footprint); | ||||||
|         symbolTable.setFunctionExtensions("textureFootprintClampNV",     1, &E_GL_NV_shader_texture_footprint); |         symbolTable.setFunctionExtensions("textureFootprintClampNV",     1, &E_GL_NV_shader_texture_footprint); | ||||||
|         symbolTable.setFunctionExtensions("textureFootprintLodNV",       1, &E_GL_NV_shader_texture_footprint); |         symbolTable.setFunctionExtensions("textureFootprintLodNV",       1, &E_GL_NV_shader_texture_footprint); | ||||||
| @ -8217,6 +8401,15 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion | |||||||
| 
 | 
 | ||||||
|     symbolTable.relateToOperator("helperInvocationEXT",  EOpIsHelperInvocation); |     symbolTable.relateToOperator("helperInvocationEXT",  EOpIsHelperInvocation); | ||||||
| 
 | 
 | ||||||
|  |     symbolTable.relateToOperator("countLeadingZeros",  EOpCountLeadingZeros); | ||||||
|  |     symbolTable.relateToOperator("countTrailingZeros", EOpCountTrailingZeros); | ||||||
|  |     symbolTable.relateToOperator("absoluteDifference", EOpAbsDifference); | ||||||
|  |     symbolTable.relateToOperator("addSaturate",        EOpAddSaturate); | ||||||
|  |     symbolTable.relateToOperator("subtractSaturate",   EOpSubSaturate); | ||||||
|  |     symbolTable.relateToOperator("average",            EOpAverage); | ||||||
|  |     symbolTable.relateToOperator("averageRounded",     EOpAverageRounded); | ||||||
|  |     symbolTable.relateToOperator("multiply32x16",      EOpMul32x16); | ||||||
|  | 
 | ||||||
|     if (PureOperatorBuiltins) { |     if (PureOperatorBuiltins) { | ||||||
|         symbolTable.relateToOperator("imageSize",               EOpImageQuerySize); |         symbolTable.relateToOperator("imageSize",               EOpImageQuerySize); | ||||||
|         symbolTable.relateToOperator("imageSamples",            EOpImageQuerySamples); |         symbolTable.relateToOperator("imageSamples",            EOpImageQuerySamples); | ||||||
|  | |||||||
| @ -213,6 +213,13 @@ bool TOutputTraverser::visitBinary(TVisit /* visit */, TIntermBinary* node) | |||||||
|     case EOpLogicalXor: out.debug << "logical-xor"; break; |     case EOpLogicalXor: out.debug << "logical-xor"; break; | ||||||
|     case EOpLogicalAnd: out.debug << "logical-and"; break; |     case EOpLogicalAnd: out.debug << "logical-and"; break; | ||||||
| 
 | 
 | ||||||
|  |     case EOpAbsDifference:          out.debug << "absoluteDifference";    break; | ||||||
|  |     case EOpAddSaturate:            out.debug << "addSaturate";           break; | ||||||
|  |     case EOpSubSaturate:            out.debug << "subtractSaturate";      break; | ||||||
|  |     case EOpAverage:                out.debug << "average";               break; | ||||||
|  |     case EOpAverageRounded:         out.debug << "averageRounded";        break; | ||||||
|  |     case EOpMul32x16:               out.debug << "multiply32x16";         break; | ||||||
|  | 
 | ||||||
|     default: out.debug << "<unknown op>"; |     default: out.debug << "<unknown op>"; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -557,6 +564,9 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node) | |||||||
|     case EOpFindLSB:                out.debug << "findLSB";               break; |     case EOpFindLSB:                out.debug << "findLSB";               break; | ||||||
|     case EOpFindMSB:                out.debug << "findMSB";               break; |     case EOpFindMSB:                out.debug << "findMSB";               break; | ||||||
| 
 | 
 | ||||||
|  |     case EOpCountLeadingZeros:      out.debug << "countLeadingZeros";     break; | ||||||
|  |     case EOpCountTrailingZeros:     out.debug << "countTrailingZeros";    break; | ||||||
|  | 
 | ||||||
|     case EOpNoise:                  out.debug << "noise";                 break; |     case EOpNoise:                  out.debug << "noise";                 break; | ||||||
| 
 | 
 | ||||||
|     case EOpBallot:                 out.debug << "ballot";                break; |     case EOpBallot:                 out.debug << "ballot";                break; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Ian Romanick
						Ian Romanick