Merge pull request #1029 from amdrexu/feature2
Implement extension GL_AMD_shader_image_load_store_lod
This commit is contained in:
		
						commit
						fc3436941e
					
				| @ -33,7 +33,7 @@ enum Decoration; | ||||
| enum Op; | ||||
| 
 | ||||
| static const int GLSLextAMDVersion = 100; | ||||
| static const int GLSLextAMDRevision = 4; | ||||
| static const int GLSLextAMDRevision = 5; | ||||
| 
 | ||||
| // SPV_AMD_shader_ballot
 | ||||
| static const char* const E_SPV_AMD_shader_ballot = "SPV_AMD_shader_ballot"; | ||||
| @ -101,4 +101,9 @@ static const char* const E_SPV_AMD_texture_gather_bias_lod = "SPV_AMD_texture_ga | ||||
| // SPV_AMD_gpu_shader_int16
 | ||||
| static const char* const E_SPV_AMD_gpu_shader_int16 = "SPV_AMD_gpu_shader_int16"; | ||||
| 
 | ||||
| // SPV_AMD_shader_image_load_store_lod
 | ||||
| static const char* const E_SPV_AMD_shader_image_load_store_lod = "SPV_AMD_shader_image_load_store_lod"; | ||||
| 
 | ||||
| static const Capability CapabilityImageReadWriteLodAMD = static_cast<Capability>(5015); | ||||
| 
 | ||||
| #endif  // #ifndef GLSLextAMD_H
 | ||||
|  | ||||
| @ -1453,7 +1453,11 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt | ||||
|         builder.setAccessChainRValue(result); | ||||
| 
 | ||||
|         return false; | ||||
| #ifdef AMD_EXTENSIONS | ||||
|     } else if (node->getOp() == glslang::EOpImageStore || node->getOp() == glslang::EOpImageStoreLod) { | ||||
| #else | ||||
|     } else if (node->getOp() == glslang::EOpImageStore) { | ||||
| #endif | ||||
|         // "imageStore" is a special case, which has no result
 | ||||
|         return false; | ||||
|     } | ||||
| @ -3137,6 +3141,10 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate& | ||||
|             if (i == 4) | ||||
|                 lvalue = true; | ||||
|             break; | ||||
|         case glslang::EOpSparseImageLoadLod: | ||||
|             if (i == 3) | ||||
|                 lvalue = true; | ||||
|             break; | ||||
| #endif | ||||
|         default: | ||||
|             break; | ||||
| @ -3239,26 +3247,55 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO | ||||
|         } | ||||
| 
 | ||||
|         operands.push_back(*(opIt++)); | ||||
| #ifdef AMD_EXTENSIONS | ||||
|         if (node->getOp() == glslang::EOpImageLoad || node->getOp() == glslang::EOpImageLoadLod) { | ||||
| #else | ||||
|         if (node->getOp() == glslang::EOpImageLoad) { | ||||
| #endif | ||||
|             if (sampler.ms) { | ||||
|                 operands.push_back(spv::ImageOperandsSampleMask); | ||||
|                 operands.push_back(*opIt); | ||||
| #ifdef AMD_EXTENSIONS | ||||
|             } else if (cracked.lod) { | ||||
|                 builder.addExtension(spv::E_SPV_AMD_shader_image_load_store_lod); | ||||
|                 builder.addCapability(spv::CapabilityImageReadWriteLodAMD); | ||||
| 
 | ||||
|                 operands.push_back(spv::ImageOperandsLodMask); | ||||
|                 operands.push_back(*opIt); | ||||
| #endif | ||||
|             } | ||||
|             if (builder.getImageTypeFormat(builder.getImageType(operands.front())) == spv::ImageFormatUnknown) | ||||
|                 builder.addCapability(spv::CapabilityStorageImageReadWithoutFormat); | ||||
|             return builder.createOp(spv::OpImageRead, resultType(), operands); | ||||
| #ifdef AMD_EXTENSIONS | ||||
|         } else if (node->getOp() == glslang::EOpImageStore || node->getOp() == glslang::EOpImageStoreLod) { | ||||
| #else | ||||
|         } else if (node->getOp() == glslang::EOpImageStore) { | ||||
| #endif | ||||
|             if (sampler.ms) { | ||||
|                 operands.push_back(*(opIt + 1)); | ||||
|                 operands.push_back(spv::ImageOperandsSampleMask); | ||||
|                 operands.push_back(*opIt); | ||||
| #ifdef AMD_EXTENSIONS | ||||
|             } else if (cracked.lod) { | ||||
|                 builder.addExtension(spv::E_SPV_AMD_shader_image_load_store_lod); | ||||
|                 builder.addCapability(spv::CapabilityImageReadWriteLodAMD); | ||||
| 
 | ||||
|                 operands.push_back(*(opIt + 1)); | ||||
|                 operands.push_back(spv::ImageOperandsLodMask); | ||||
|                 operands.push_back(*opIt); | ||||
| #endif | ||||
|             } else | ||||
|                 operands.push_back(*opIt); | ||||
|             builder.createNoResultOp(spv::OpImageWrite, operands); | ||||
|             if (builder.getImageTypeFormat(builder.getImageType(operands.front())) == spv::ImageFormatUnknown) | ||||
|                 builder.addCapability(spv::CapabilityStorageImageWriteWithoutFormat); | ||||
|             return spv::NoResult; | ||||
| #ifdef AMD_EXTENSIONS | ||||
|         } else if (node->getOp() == glslang::EOpSparseImageLoad || node->getOp() == glslang::EOpSparseImageLoadLod) { | ||||
| #else | ||||
|         } else if (node->getOp() == glslang::EOpSparseImageLoad) { | ||||
| #endif | ||||
|             builder.addCapability(spv::CapabilitySparseResidency); | ||||
|             if (builder.getImageTypeFormat(builder.getImageType(operands.front())) == spv::ImageFormatUnknown) | ||||
|                 builder.addCapability(spv::CapabilityStorageImageReadWithoutFormat); | ||||
| @ -3266,6 +3303,14 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO | ||||
|             if (sampler.ms) { | ||||
|                 operands.push_back(spv::ImageOperandsSampleMask); | ||||
|                 operands.push_back(*opIt++); | ||||
| #ifdef AMD_EXTENSIONS | ||||
|             } else if (cracked.lod) { | ||||
|                 builder.addExtension(spv::E_SPV_AMD_shader_image_load_store_lod); | ||||
|                 builder.addCapability(spv::CapabilityImageReadWriteLodAMD); | ||||
| 
 | ||||
|                 operands.push_back(spv::ImageOperandsLodMask); | ||||
|                 operands.push_back(*opIt++); | ||||
| #endif | ||||
|             } | ||||
| 
 | ||||
|             // Create the return type that was a special structure
 | ||||
|  | ||||
| @ -847,6 +847,7 @@ const char* CapabilityString(int info) | ||||
| 
 | ||||
| #ifdef AMD_EXTENSIONS | ||||
|     case 5009: return "ImageGatherBiasLodAMD"; | ||||
|     case 5015: return "ImageReadWriteLodAMD"; | ||||
| #endif | ||||
| 
 | ||||
|     case 4445: return "AtomicStorageOps"; | ||||
|  | ||||
							
								
								
									
										135
									
								
								Test/baseResults/spv.imageLoadStoreLod.frag.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								Test/baseResults/spv.imageLoadStoreLod.frag.out
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,135 @@ | ||||
| spv.imageLoadStoreLod.frag | ||||
| // Module Version 10000 | ||||
| // Generated by (magic number): 80001 | ||||
| // Id's are bound by 82 | ||||
| 
 | ||||
|                               Capability Shader | ||||
|                               Capability ImageCubeArray | ||||
|                               Capability SparseResidency | ||||
|                               Capability Image1D | ||||
|                               Capability ImageReadWriteLodAMD | ||||
|                               Extension  "SPV_AMD_shader_image_load_store_lod" | ||||
|                1:             ExtInstImport  "GLSL.std.450" | ||||
|                               MemoryModel Logical GLSL450 | ||||
|                               EntryPoint Fragment 4  "main" 77 | ||||
|                               ExecutionMode 4 OriginUpperLeft | ||||
|                               Source GLSL 450 | ||||
|                               SourceExtension  "GL_AMD_shader_image_load_store_lod" | ||||
|                               Name 4  "main" | ||||
|                               Name 9  "f4" | ||||
|                               Name 14  "i1D" | ||||
|                               Name 24  "i2D" | ||||
|                               Name 34  "i3D" | ||||
|                               Name 46  "iiCube" | ||||
|                               Name 53  "ii1DArray" | ||||
|                               Name 60  "ui2DArray" | ||||
|                               Name 64  "u4" | ||||
|                               Name 65  "ResType" | ||||
|                               Name 71  "uiCubeArray" | ||||
|                               Name 77  "fragColor" | ||||
|                               Decorate 14(i1D) DescriptorSet 0 | ||||
|                               Decorate 14(i1D) Binding 0 | ||||
|                               Decorate 24(i2D) DescriptorSet 0 | ||||
|                               Decorate 24(i2D) Binding 1 | ||||
|                               Decorate 34(i3D) DescriptorSet 0 | ||||
|                               Decorate 34(i3D) Binding 2 | ||||
|                               Decorate 46(iiCube) DescriptorSet 0 | ||||
|                               Decorate 46(iiCube) Binding 3 | ||||
|                               Decorate 53(ii1DArray) DescriptorSet 0 | ||||
|                               Decorate 53(ii1DArray) Binding 4 | ||||
|                               Decorate 60(ui2DArray) DescriptorSet 0 | ||||
|                               Decorate 60(ui2DArray) Binding 5 | ||||
|                               Decorate 71(uiCubeArray) DescriptorSet 0 | ||||
|                               Decorate 71(uiCubeArray) Binding 6 | ||||
|                               Decorate 77(fragColor) Location 0 | ||||
|                2:             TypeVoid | ||||
|                3:             TypeFunction 2 | ||||
|                6:             TypeFloat 32 | ||||
|                7:             TypeVector 6(float) 4 | ||||
|                8:             TypePointer Function 7(fvec4) | ||||
|               10:    6(float) Constant 0 | ||||
|               11:    7(fvec4) ConstantComposite 10 10 10 10 | ||||
|               12:             TypeImage 6(float) 1D nonsampled format:Rgba32f | ||||
|               13:             TypePointer UniformConstant 12 | ||||
|          14(i1D):     13(ptr) Variable UniformConstant | ||||
|               16:             TypeInt 32 1 | ||||
|               17:     16(int) Constant 1 | ||||
|               18:     16(int) Constant 3 | ||||
|               22:             TypeImage 6(float) 2D nonsampled format:Rgba32f | ||||
|               23:             TypePointer UniformConstant 22 | ||||
|          24(i2D):     23(ptr) Variable UniformConstant | ||||
|               26:             TypeVector 16(int) 2 | ||||
|               27:     16(int) Constant 2 | ||||
|               28:   26(ivec2) ConstantComposite 27 18 | ||||
|               32:             TypeImage 6(float) 3D nonsampled format:Rgba32f | ||||
|               33:             TypePointer UniformConstant 32 | ||||
|          34(i3D):     33(ptr) Variable UniformConstant | ||||
|               36:             TypeVector 16(int) 3 | ||||
|               37:     16(int) Constant 4 | ||||
|               38:     16(int) Constant 5 | ||||
|               39:     16(int) Constant 6 | ||||
|               40:   36(ivec3) ConstantComposite 37 38 39 | ||||
|               44:             TypeImage 16(int) Cube nonsampled format:Rgba32i | ||||
|               45:             TypePointer UniformConstant 44 | ||||
|       46(iiCube):     45(ptr) Variable UniformConstant | ||||
|               49:             TypeVector 16(int) 4 | ||||
|               51:             TypeImage 16(int) 1D array nonsampled format:Rgba32i | ||||
|               52:             TypePointer UniformConstant 51 | ||||
|    53(ii1DArray):     52(ptr) Variable UniformConstant | ||||
|               57:             TypeInt 32 0 | ||||
|               58:             TypeImage 57(int) 2D array nonsampled format:Rgba32ui | ||||
|               59:             TypePointer UniformConstant 58 | ||||
|    60(ui2DArray):     59(ptr) Variable UniformConstant | ||||
|               62:             TypeVector 57(int) 4 | ||||
|               63:             TypePointer Function 62(ivec4) | ||||
|      65(ResType):             TypeStruct 16(int) 62(ivec4) | ||||
|               69:             TypeImage 57(int) Cube array nonsampled format:Rgba32ui | ||||
|               70:             TypePointer UniformConstant 69 | ||||
|  71(uiCubeArray):     70(ptr) Variable UniformConstant | ||||
|               76:             TypePointer Output 7(fvec4) | ||||
|    77(fragColor):     76(ptr) Variable Output | ||||
|          4(main):           2 Function None 3 | ||||
|                5:             Label | ||||
|            9(f4):      8(ptr) Variable Function | ||||
|           64(u4):     63(ptr) Variable Function | ||||
|                               Store 9(f4) 11 | ||||
|               15:          12 Load 14(i1D) | ||||
|               19:    7(fvec4) ImageRead 15 17 Lod 18 | ||||
|               20:    7(fvec4) Load 9(f4) | ||||
|               21:    7(fvec4) FAdd 20 19 | ||||
|                               Store 9(f4) 21 | ||||
|               25:          22 Load 24(i2D) | ||||
|               29:    7(fvec4) ImageRead 25 28 Lod 18 | ||||
|               30:    7(fvec4) Load 9(f4) | ||||
|               31:    7(fvec4) FAdd 30 29 | ||||
|                               Store 9(f4) 31 | ||||
|               35:          32 Load 34(i3D) | ||||
|               41:    7(fvec4) ImageRead 35 40 Lod 18 | ||||
|               42:    7(fvec4) Load 9(f4) | ||||
|               43:    7(fvec4) FAdd 42 41 | ||||
|                               Store 9(f4) 43 | ||||
|               47:          44 Load 46(iiCube) | ||||
|               48:    7(fvec4) Load 9(f4) | ||||
|               50:   49(ivec4) ConvertFToS 48 | ||||
|                               ImageWrite 47 40 50 Lod 18 | ||||
|               54:          51 Load 53(ii1DArray) | ||||
|               55:    7(fvec4) Load 9(f4) | ||||
|               56:   49(ivec4) ConvertFToS 55 | ||||
|                               ImageWrite 54 28 56 Lod 18 | ||||
|               61:          58 Load 60(ui2DArray) | ||||
|               66: 65(ResType) ImageSparseRead 61 40 Lod 18 | ||||
|               67:   62(ivec4) CompositeExtract 66 1 | ||||
|                               Store 64(u4) 67 | ||||
|               68:     16(int) CompositeExtract 66 0 | ||||
|               72:          69 Load 71(uiCubeArray) | ||||
|               73: 65(ResType) ImageSparseRead 72 40 Lod 18 | ||||
|               74:   62(ivec4) CompositeExtract 73 1 | ||||
|                               Store 64(u4) 74 | ||||
|               75:     16(int) CompositeExtract 73 0 | ||||
|               78:    7(fvec4) Load 9(f4) | ||||
|               79:   62(ivec4) Load 64(u4) | ||||
|               80:    7(fvec4) ConvertUToF 79 | ||||
|               81:    7(fvec4) FAdd 78 80 | ||||
|                               Store 77(fragColor) 81 | ||||
|                               Return | ||||
|                               FunctionEnd | ||||
							
								
								
									
										36
									
								
								Test/spv.imageLoadStoreLod.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								Test/spv.imageLoadStoreLod.frag
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | ||||
| #version 450 core | ||||
| 
 | ||||
| #extension GL_AMD_shader_image_load_store_lod: enable | ||||
| 
 | ||||
| layout(rgba32f,  binding = 0) uniform image1D         i1D; | ||||
| layout(rgba32f,  binding = 1) uniform image2D         i2D; | ||||
| layout(rgba32f,  binding = 2) uniform image3D         i3D; | ||||
| layout(rgba32i,  binding = 3) uniform iimageCube      iiCube; | ||||
| layout(rgba32i,  binding = 4) uniform iimage1DArray   ii1DArray; | ||||
| layout(rgba32ui, binding = 5) uniform uimage2DArray   ui2DArray; | ||||
| layout(rgba32ui, binding = 6) uniform uimageCubeArray uiCubeArray; | ||||
| 
 | ||||
| layout(location = 0) out vec4 fragColor; | ||||
| 
 | ||||
| void main() | ||||
| { | ||||
|     const int c1 = 1; | ||||
|     const ivec2 c2 = ivec2(2, 3); | ||||
|     const ivec3 c3 = ivec3(4, 5, 6); | ||||
| 
 | ||||
|     const int lod = 3; | ||||
| 
 | ||||
|     vec4 f4 = vec4(0.0); | ||||
|     f4 += imageLoadLodAMD(i1D, c1, lod); | ||||
|     f4 += imageLoadLodAMD(i2D, c2, lod); | ||||
|     f4 += imageLoadLodAMD(i3D, c3, lod); | ||||
| 
 | ||||
|     imageStoreLodAMD(iiCube, c3, lod, ivec4(f4)); | ||||
|     imageStoreLodAMD(ii1DArray, c2, lod, ivec4(f4)); | ||||
| 
 | ||||
|     uvec4 u4; | ||||
|     sparseImageLoadLodAMD(ui2DArray, c3, lod, u4); | ||||
|     sparseImageLoadLodAMD(uiCubeArray, c3, lod, u4); | ||||
| 
 | ||||
|     fragColor = f4 + vec4(u4); | ||||
| } | ||||
| @ -593,6 +593,10 @@ enum TOperator { | ||||
|     EOpImageQuerySamples, | ||||
|     EOpImageLoad, | ||||
|     EOpImageStore, | ||||
| #ifdef AMD_EXTENSIONS | ||||
|     EOpImageLoadLod, | ||||
|     EOpImageStoreLod, | ||||
| #endif | ||||
|     EOpImageAtomicAdd, | ||||
|     EOpImageAtomicMin, | ||||
|     EOpImageAtomicMax, | ||||
| @ -605,6 +609,9 @@ enum TOperator { | ||||
|     EOpSubpassLoad, | ||||
|     EOpSubpassLoadMS, | ||||
|     EOpSparseImageLoad, | ||||
| #ifdef AMD_EXTENSIONS | ||||
|     EOpSparseImageLoadLod, | ||||
| #endif | ||||
| 
 | ||||
|     EOpImageGuardEnd, | ||||
| 
 | ||||
| @ -1198,6 +1205,11 @@ public: | ||||
|             cracked.offsets = true; | ||||
|             cracked.lod     = true; | ||||
|             break; | ||||
|         case EOpImageLoadLod: | ||||
|         case EOpImageStoreLod: | ||||
|         case EOpSparseImageLoadLod: | ||||
|             cracked.lod = true; | ||||
|             break; | ||||
| #endif | ||||
|         case EOpSubpassLoad: | ||||
|         case EOpSubpassLoadMS: | ||||
|  | ||||
| @ -4238,6 +4238,43 @@ void TBuiltIns::addImageFunctions(TSampler sampler, const TString& typeName, int | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| #ifdef AMD_EXTENSIONS | ||||
|     if (sampler.dim == EsdRect || sampler.dim == EsdBuffer || sampler.shadow || sampler.ms) | ||||
|         return; | ||||
| 
 | ||||
|     if (profile == EEsProfile || version < 450) | ||||
|         return; | ||||
| 
 | ||||
|     TString imageLodParams = typeName; | ||||
|     if (dims == 1) | ||||
|         imageLodParams.append(", int"); | ||||
|     else { | ||||
|         imageLodParams.append(", ivec"); | ||||
|         imageLodParams.append(postfixes[dims]); | ||||
|     } | ||||
|     imageLodParams.append(", int"); | ||||
| 
 | ||||
|     commonBuiltins.append(prefixes[sampler.type]); | ||||
|     commonBuiltins.append("vec4 imageLoadLodAMD(readonly volatile coherent "); | ||||
|     commonBuiltins.append(imageLodParams); | ||||
|     commonBuiltins.append(");\n"); | ||||
| 
 | ||||
|     commonBuiltins.append("void imageStoreLodAMD(writeonly volatile coherent "); | ||||
|     commonBuiltins.append(imageLodParams); | ||||
|     commonBuiltins.append(", "); | ||||
|     commonBuiltins.append(prefixes[sampler.type]); | ||||
|     commonBuiltins.append("vec4);\n"); | ||||
| 
 | ||||
|     if (sampler.dim != Esd1D) { | ||||
|         commonBuiltins.append("int sparseImageLoadLodAMD(readonly volatile coherent "); | ||||
|         commonBuiltins.append(imageLodParams); | ||||
|         commonBuiltins.append(", out "); | ||||
|         commonBuiltins.append(prefixes[sampler.type]); | ||||
|         commonBuiltins.append("vec4"); | ||||
|         commonBuiltins.append(");\n"); | ||||
|     } | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| //
 | ||||
| @ -5710,6 +5747,13 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion | ||||
|             symbolTable.setFunctionExtensions("sparseTextureGatherLodOffsetAMD",    1, &E_GL_AMD_texture_gather_bias_lod); | ||||
|             symbolTable.setFunctionExtensions("sparseTextureGatherLodOffsetsAMD",   1, &E_GL_AMD_texture_gather_bias_lod); | ||||
|         } | ||||
| 
 | ||||
|         // E_GL_AMD_shader_image_load_store_lod
 | ||||
|         if (profile != EEsProfile) { | ||||
|             symbolTable.setFunctionExtensions("imageLoadLodAMD",        1, &E_GL_AMD_shader_image_load_store_lod); | ||||
|             symbolTable.setFunctionExtensions("imageStoreLodAMD",       1, &E_GL_AMD_shader_image_load_store_lod); | ||||
|             symbolTable.setFunctionExtensions("sparseImageLoadLodAMD",  1, &E_GL_AMD_shader_image_load_store_lod); | ||||
|         } | ||||
| #endif | ||||
| 
 | ||||
|         symbolTable.setVariableExtensions("gl_FragDepthEXT", 1, &E_GL_EXT_frag_depth); | ||||
| @ -6146,6 +6190,10 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion | ||||
|             symbolTable.relateToOperator("sparseTextureGatherLodAMD",           EOpSparseTextureGatherLod); | ||||
|             symbolTable.relateToOperator("sparseTextureGatherLodOffsetAMD",     EOpSparseTextureGatherLodOffset); | ||||
|             symbolTable.relateToOperator("sparseTextureGatherLodOffsetsAMD",    EOpSparseTextureGatherLodOffsets); | ||||
| 
 | ||||
|             symbolTable.relateToOperator("imageLoadLodAMD",                     EOpImageLoadLod); | ||||
|             symbolTable.relateToOperator("imageStoreLodAMD",                    EOpImageStoreLod); | ||||
|             symbolTable.relateToOperator("sparseImageLoadLodAMD",               EOpSparseImageLoadLod); | ||||
| #endif | ||||
|         } | ||||
|         if (profile == EEsProfile) { | ||||
|  | ||||
| @ -1144,7 +1144,13 @@ void TParseContext::computeBuiltinPrecisions(TIntermTyped& node, const TFunction | ||||
|             operationPrecision = std::max(operationPrecision, function[arg].type->getQualifier().precision); | ||||
|         } | ||||
|         // compute the result precision
 | ||||
| #ifdef AMD_EXTENSIONS | ||||
|         if (agg->isSampling() || | ||||
|             agg->getOp() == EOpImageLoad || agg->getOp() == EOpImageStore || | ||||
|             agg->getOp() == EOpImageLoadLod || agg->getOp() == EOpImageStoreLod) | ||||
| #else | ||||
|         if (agg->isSampling() || agg->getOp() == EOpImageLoad || agg->getOp() == EOpImageStore) | ||||
| #endif | ||||
|             resultPrecision = sequence[0]->getAsTyped()->getQualifier().precision; | ||||
|         else if (function.getType().getBasicType() != EbtBool) | ||||
|             resultPrecision = function.getType().getQualifier().precision == EpqNone ? | ||||
|  | ||||
| @ -200,6 +200,7 @@ void TParseVersions::initializeExtensionBehavior() | ||||
|     extensionBehavior[E_GL_AMD_gpu_shader_half_float]                = EBhDisable; | ||||
|     extensionBehavior[E_GL_AMD_texture_gather_bias_lod]              = EBhDisable; | ||||
|     extensionBehavior[E_GL_AMD_gpu_shader_int16]                     = EBhDisable; | ||||
|     extensionBehavior[E_GL_AMD_shader_image_load_store_lod]          = EBhDisable; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef NV_EXTENSIONS | ||||
| @ -331,6 +332,7 @@ void TParseVersions::getPreamble(std::string& preamble) | ||||
|             "#define GL_AMD_gpu_shader_half_float 1\n" | ||||
|             "#define GL_AMD_texture_gather_bias_lod 1\n" | ||||
|             "#define GL_AMD_gpu_shader_int16 1\n" | ||||
|             "#define GL_AMD_shader_image_load_store_lod 1\n" | ||||
| #endif | ||||
| 
 | ||||
| #ifdef NV_EXTENSIONS | ||||
|  | ||||
| @ -170,6 +170,7 @@ const char* const E_GL_AMD_gcn_shader                           = "GL_AMD_gcn_sh | ||||
| const char* const E_GL_AMD_gpu_shader_half_float                = "GL_AMD_gpu_shader_half_float"; | ||||
| const char* const E_GL_AMD_texture_gather_bias_lod              = "GL_AMD_texture_gather_bias_lod"; | ||||
| const char* const E_GL_AMD_gpu_shader_int16                     = "GL_AMD_gpu_shader_int16"; | ||||
| const char* const E_GL_AMD_shader_image_load_store_lod          = "GL_AMD_shader_image_load_store_lod"; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef NV_EXTENSIONS | ||||
|  | ||||
| @ -704,6 +704,10 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node | ||||
|     case EOpImageAtomicXor:             out.debug << "imageAtomicXor";        break; | ||||
|     case EOpImageAtomicExchange:        out.debug << "imageAtomicExchange";   break; | ||||
|     case EOpImageAtomicCompSwap:        out.debug << "imageAtomicCompSwap";   break; | ||||
| #ifdef AMD_EXTENSIONS | ||||
|     case EOpImageLoadLod:               out.debug << "imageLoadLod";          break; | ||||
|     case EOpImageStoreLod:              out.debug << "imageStoreLod";         break; | ||||
| #endif | ||||
| 
 | ||||
|     case EOpTextureQuerySize:           out.debug << "textureSize";           break; | ||||
|     case EOpTextureQueryLod:            out.debug << "textureQueryLod";       break; | ||||
| @ -756,6 +760,7 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node | ||||
|     case EOpSparseTextureGatherLod:         out.debug << "sparseTextureGatherLod";          break; | ||||
|     case EOpSparseTextureGatherLodOffset:   out.debug << "sparseTextureGatherLodOffset";    break; | ||||
|     case EOpSparseTextureGatherLodOffsets:  out.debug << "sparseTextureGatherLodOffsets";   break; | ||||
|     case EOpSparseImageLoadLod:             out.debug << "sparseImageLoadLod";              break; | ||||
| #endif | ||||
| 
 | ||||
|     case EOpAddCarry:                   out.debug << "addCarry";              break; | ||||
|  | ||||
| @ -406,6 +406,7 @@ INSTANTIATE_TEST_CASE_P( | ||||
|     Glsl, CompileVulkanToSpirvTestAMD, | ||||
|     ::testing::ValuesIn(std::vector<std::string>({ | ||||
|         "spv.float16.frag", | ||||
|         "spv.imageLoadStoreLod.frag", | ||||
|         "spv.int16.frag", | ||||
|         "spv.shaderBallotAMD.comp", | ||||
|         "spv.textureGatherBiasLod.frag" | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 John Kessenich
						John Kessenich