Merge pull request #1050 from amdrexu/feature
Implement the extension GL_AMD_shader_fragment_mask
This commit is contained in:
commit
4f4683d251
@ -33,7 +33,7 @@ enum Decoration;
|
|||||||
enum Op;
|
enum Op;
|
||||||
|
|
||||||
static const int GLSLextAMDVersion = 100;
|
static const int GLSLextAMDVersion = 100;
|
||||||
static const int GLSLextAMDRevision = 5;
|
static const int GLSLextAMDRevision = 6;
|
||||||
|
|
||||||
// SPV_AMD_shader_ballot
|
// SPV_AMD_shader_ballot
|
||||||
static const char* const E_SPV_AMD_shader_ballot = "SPV_AMD_shader_ballot";
|
static const char* const E_SPV_AMD_shader_ballot = "SPV_AMD_shader_ballot";
|
||||||
@ -106,4 +106,12 @@ static const char* const E_SPV_AMD_shader_image_load_store_lod = "SPV_AMD_shader
|
|||||||
|
|
||||||
static const Capability CapabilityImageReadWriteLodAMD = static_cast<Capability>(5015);
|
static const Capability CapabilityImageReadWriteLodAMD = static_cast<Capability>(5015);
|
||||||
|
|
||||||
|
// SPV_AMD_shader_fragment_mask
|
||||||
|
static const char* const E_SPV_AMD_shader_fragment_mask = "SPV_AMD_shader_fragment_mask";
|
||||||
|
|
||||||
|
static const Capability CapabilityFragmentMaskAMD = static_cast<Capability>(5010);
|
||||||
|
|
||||||
|
static const Op OpFragmentMaskFetchAMD = static_cast<Op>(5011);
|
||||||
|
static const Op OpFragmentFetchAMD = static_cast<Op>(5012);
|
||||||
|
|
||||||
#endif // #ifndef GLSLextAMD_H
|
#endif // #ifndef GLSLextAMD_H
|
||||||
|
@ -3204,9 +3204,7 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|||||||
glslang::TCrackedTextureOp cracked;
|
glslang::TCrackedTextureOp cracked;
|
||||||
node->crackTexture(sampler, cracked);
|
node->crackTexture(sampler, cracked);
|
||||||
|
|
||||||
const bool isUnsignedResult =
|
const bool isUnsignedResult = node->getType().getBasicType() == glslang::EbtUint;
|
||||||
node->getType().getBasicType() == glslang::EbtUint64 ||
|
|
||||||
node->getType().getBasicType() == glslang::EbtUint;
|
|
||||||
|
|
||||||
// Check for queries
|
// Check for queries
|
||||||
if (cracked.query) {
|
if (cracked.query) {
|
||||||
@ -3358,6 +3356,45 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef AMD_EXTENSIONS
|
||||||
|
// Check for fragment mask functions other than queries
|
||||||
|
if (cracked.fragMask) {
|
||||||
|
assert(sampler.ms);
|
||||||
|
|
||||||
|
auto opIt = arguments.begin();
|
||||||
|
std::vector<spv::Id> operands;
|
||||||
|
|
||||||
|
// Extract the image if necessary
|
||||||
|
if (builder.isSampledImage(params.sampler))
|
||||||
|
params.sampler = builder.createUnaryOp(spv::OpImage, builder.getImageType(params.sampler), params.sampler);
|
||||||
|
|
||||||
|
operands.push_back(params.sampler);
|
||||||
|
++opIt;
|
||||||
|
|
||||||
|
if (sampler.isSubpass()) {
|
||||||
|
// add on the (0,0) coordinate
|
||||||
|
spv::Id zero = builder.makeIntConstant(0);
|
||||||
|
std::vector<spv::Id> comps;
|
||||||
|
comps.push_back(zero);
|
||||||
|
comps.push_back(zero);
|
||||||
|
operands.push_back(builder.makeCompositeConstant(builder.makeVectorType(builder.makeIntType(32), 2), comps));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; opIt != arguments.end(); ++opIt)
|
||||||
|
operands.push_back(*opIt);
|
||||||
|
|
||||||
|
spv::Op fragMaskOp = spv::OpNop;
|
||||||
|
if (node->getOp() == glslang::EOpFragmentMaskFetch)
|
||||||
|
fragMaskOp = spv::OpFragmentMaskFetchAMD;
|
||||||
|
else if (node->getOp() == glslang::EOpFragmentFetch)
|
||||||
|
fragMaskOp = spv::OpFragmentFetchAMD;
|
||||||
|
|
||||||
|
builder.addExtension(spv::E_SPV_AMD_shader_fragment_mask);
|
||||||
|
builder.addCapability(spv::CapabilityFragmentMaskAMD);
|
||||||
|
return builder.createOp(fragMaskOp, resultType(), operands);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Check for texture functions other than queries
|
// Check for texture functions other than queries
|
||||||
bool sparse = node->isSparseTexture();
|
bool sparse = node->isSparseTexture();
|
||||||
bool cubeCompare = sampler.dim == glslang::EsdCube && sampler.arrayed && sampler.shadow;
|
bool cubeCompare = sampler.dim == glslang::EsdCube && sampler.arrayed && sampler.shadow;
|
||||||
|
@ -847,6 +847,7 @@ const char* CapabilityString(int info)
|
|||||||
|
|
||||||
#ifdef AMD_EXTENSIONS
|
#ifdef AMD_EXTENSIONS
|
||||||
case 5009: return "ImageGatherBiasLodAMD";
|
case 5009: return "ImageGatherBiasLodAMD";
|
||||||
|
case 5010: return "FragmentMaskAMD";
|
||||||
case 5015: return "ImageReadWriteLodAMD";
|
case 5015: return "ImageReadWriteLodAMD";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1207,6 +1208,9 @@ const char* OpcodeString(int op)
|
|||||||
case 5005: return "OpGroupFMaxNonUniformAMD";
|
case 5005: return "OpGroupFMaxNonUniformAMD";
|
||||||
case 5006: return "OpGroupUMaxNonUniformAMD";
|
case 5006: return "OpGroupUMaxNonUniformAMD";
|
||||||
case 5007: return "OpGroupSMaxNonUniformAMD";
|
case 5007: return "OpGroupSMaxNonUniformAMD";
|
||||||
|
|
||||||
|
case 5011: return "OpFragmentMaskFetchAMD";
|
||||||
|
case 5012: return "OpFragmentFetchAMD";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case OpcodeCeiling:
|
case OpcodeCeiling:
|
||||||
@ -2869,6 +2873,15 @@ void Parameterize()
|
|||||||
InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandScope, "'Execution'");
|
InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandScope, "'Execution'");
|
||||||
InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'");
|
InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'");
|
||||||
InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandId, "X");
|
InstructionDesc[OpGroupFMaxNonUniformAMD].operands.push(OperandId, "X");
|
||||||
|
|
||||||
|
InstructionDesc[OpFragmentMaskFetchAMD].capabilities.push_back(CapabilityFragmentMaskAMD);
|
||||||
|
InstructionDesc[OpFragmentMaskFetchAMD].operands.push(OperandId, "'Image'");
|
||||||
|
InstructionDesc[OpFragmentMaskFetchAMD].operands.push(OperandId, "'Coordinate'");
|
||||||
|
|
||||||
|
InstructionDesc[OpFragmentFetchAMD].capabilities.push_back(CapabilityFragmentMaskAMD);
|
||||||
|
InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Image'");
|
||||||
|
InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Coordinate'");
|
||||||
|
InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Fragment Index'");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
123
Test/baseResults/spv.shaderFragMaskAMD.frag.out
Normal file
123
Test/baseResults/spv.shaderFragMaskAMD.frag.out
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
spv.shaderFragMaskAMD.frag
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80001
|
||||||
|
// Id's are bound by 80
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
Capability StorageImageMultisample
|
||||||
|
Capability InputAttachment
|
||||||
|
Capability FragmentMaskAMD
|
||||||
|
Extension "SPV_AMD_shader_fragment_mask"
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 78
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source GLSL 450
|
||||||
|
SourceExtension "GL_AMD_shader_fragment_mask"
|
||||||
|
Name 4 "main"
|
||||||
|
Name 9 "f4"
|
||||||
|
Name 14 "fragMask"
|
||||||
|
Name 18 "s2DMS"
|
||||||
|
Name 27 "fragIndex"
|
||||||
|
Name 42 "is2DMSArray"
|
||||||
|
Name 62 "usubpassMS"
|
||||||
|
Name 78 "fragColor"
|
||||||
|
Decorate 18(s2DMS) DescriptorSet 0
|
||||||
|
Decorate 18(s2DMS) Binding 0
|
||||||
|
Decorate 42(is2DMSArray) DescriptorSet 0
|
||||||
|
Decorate 42(is2DMSArray) Binding 1
|
||||||
|
Decorate 62(usubpassMS) DescriptorSet 0
|
||||||
|
Decorate 62(usubpassMS) Binding 2
|
||||||
|
Decorate 62(usubpassMS) InputAttachmentIndex 0
|
||||||
|
Decorate 78(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: TypeInt 32 0
|
||||||
|
13: TypePointer Function 12(int)
|
||||||
|
15: TypeImage 6(float) 2D multi-sampled sampled format:Unknown
|
||||||
|
16: TypeSampledImage 15
|
||||||
|
17: TypePointer UniformConstant 16
|
||||||
|
18(s2DMS): 17(ptr) Variable UniformConstant
|
||||||
|
20: TypeInt 32 1
|
||||||
|
21: TypeVector 20(int) 2
|
||||||
|
22: 20(int) Constant 2
|
||||||
|
23: 20(int) Constant 3
|
||||||
|
24: 21(ivec2) ConstantComposite 22 23
|
||||||
|
29: 12(int) Constant 240
|
||||||
|
31: 20(int) Constant 4
|
||||||
|
34: 12(int) Constant 1
|
||||||
|
39: TypeImage 20(int) 2D array multi-sampled sampled format:Unknown
|
||||||
|
40: TypeSampledImage 39
|
||||||
|
41: TypePointer UniformConstant 40
|
||||||
|
42(is2DMSArray): 41(ptr) Variable UniformConstant
|
||||||
|
44: TypeVector 20(int) 3
|
||||||
|
45: 20(int) Constant 1
|
||||||
|
46: 44(ivec3) ConstantComposite 22 23 45
|
||||||
|
55: TypeVector 20(int) 4
|
||||||
|
60: TypeImage 12(int) SubpassData multi-sampled nonsampled format:Unknown
|
||||||
|
61: TypePointer UniformConstant 60
|
||||||
|
62(usubpassMS): 61(ptr) Variable UniformConstant
|
||||||
|
64: 20(int) Constant 0
|
||||||
|
65: 21(ivec2) ConstantComposite 64 64
|
||||||
|
72: TypeVector 12(int) 4
|
||||||
|
77: TypePointer Output 7(fvec4)
|
||||||
|
78(fragColor): 77(ptr) Variable Output
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
9(f4): 8(ptr) Variable Function
|
||||||
|
14(fragMask): 13(ptr) Variable Function
|
||||||
|
27(fragIndex): 13(ptr) Variable Function
|
||||||
|
Store 9(f4) 11
|
||||||
|
19: 16 Load 18(s2DMS)
|
||||||
|
25: 15 Image 19
|
||||||
|
26: 12(int) FragmentMaskFetchAMD 25 24
|
||||||
|
Store 14(fragMask) 26
|
||||||
|
28: 12(int) Load 14(fragMask)
|
||||||
|
30: 12(int) BitwiseAnd 28 29
|
||||||
|
32: 12(int) ShiftRightLogical 30 31
|
||||||
|
Store 27(fragIndex) 32
|
||||||
|
33: 16 Load 18(s2DMS)
|
||||||
|
35: 15 Image 33
|
||||||
|
36: 7(fvec4) FragmentFetchAMD 35 24 34
|
||||||
|
37: 7(fvec4) Load 9(f4)
|
||||||
|
38: 7(fvec4) FAdd 37 36
|
||||||
|
Store 9(f4) 38
|
||||||
|
43: 40 Load 42(is2DMSArray)
|
||||||
|
47: 39 Image 43
|
||||||
|
48: 12(int) FragmentMaskFetchAMD 47 46
|
||||||
|
Store 14(fragMask) 48
|
||||||
|
49: 12(int) Load 14(fragMask)
|
||||||
|
50: 12(int) BitwiseAnd 49 29
|
||||||
|
51: 12(int) ShiftRightLogical 50 31
|
||||||
|
Store 27(fragIndex) 51
|
||||||
|
52: 40 Load 42(is2DMSArray)
|
||||||
|
53: 12(int) Load 27(fragIndex)
|
||||||
|
54: 39 Image 52
|
||||||
|
56: 55(ivec4) FragmentFetchAMD 54 46 53
|
||||||
|
57: 7(fvec4) ConvertSToF 56
|
||||||
|
58: 7(fvec4) Load 9(f4)
|
||||||
|
59: 7(fvec4) FAdd 58 57
|
||||||
|
Store 9(f4) 59
|
||||||
|
63: 60 Load 62(usubpassMS)
|
||||||
|
66: 12(int) FragmentMaskFetchAMD 63 65
|
||||||
|
Store 14(fragMask) 66
|
||||||
|
67: 12(int) Load 14(fragMask)
|
||||||
|
68: 12(int) BitwiseAnd 67 29
|
||||||
|
69: 12(int) ShiftRightLogical 68 31
|
||||||
|
Store 27(fragIndex) 69
|
||||||
|
70: 60 Load 62(usubpassMS)
|
||||||
|
71: 12(int) Load 27(fragIndex)
|
||||||
|
73: 72(ivec4) FragmentFetchAMD 70 65 71
|
||||||
|
74: 7(fvec4) ConvertUToF 73
|
||||||
|
75: 7(fvec4) Load 9(f4)
|
||||||
|
76: 7(fvec4) FAdd 75 74
|
||||||
|
Store 9(f4) 76
|
||||||
|
79: 7(fvec4) Load 9(f4)
|
||||||
|
Store 78(fragColor) 79
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
29
Test/spv.shaderFragMaskAMD.frag
Normal file
29
Test/spv.shaderFragMaskAMD.frag
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#version 450 core
|
||||||
|
|
||||||
|
#extension GL_AMD_shader_fragment_mask: enable
|
||||||
|
|
||||||
|
layout(binding = 0) uniform sampler2DMS s2DMS;
|
||||||
|
layout(binding = 1) uniform isampler2DMSArray is2DMSArray;
|
||||||
|
|
||||||
|
layout(binding = 2, input_attachment_index = 0) uniform usubpassInputMS usubpassMS;
|
||||||
|
|
||||||
|
layout(location = 0) out vec4 fragColor;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 f4 = vec4(0.0);
|
||||||
|
|
||||||
|
uint fragMask = fragmentMaskFetchAMD(s2DMS, ivec2(2, 3));
|
||||||
|
uint fragIndex = (fragMask & 0xF0) >> 4;
|
||||||
|
f4 += fragmentFetchAMD(s2DMS, ivec2(2, 3), 1);
|
||||||
|
|
||||||
|
fragMask = fragmentMaskFetchAMD(is2DMSArray, ivec3(2, 3, 1));
|
||||||
|
fragIndex = (fragMask & 0xF0) >> 4;
|
||||||
|
f4 += fragmentFetchAMD(is2DMSArray, ivec3(2, 3, 1), fragIndex);
|
||||||
|
|
||||||
|
fragMask = fragmentMaskFetchAMD(usubpassMS);
|
||||||
|
fragIndex = (fragMask & 0xF0) >> 4;
|
||||||
|
f4 += fragmentFetchAMD(usubpassMS, fragIndex);
|
||||||
|
|
||||||
|
fragColor = f4;
|
||||||
|
}
|
@ -198,6 +198,7 @@ enum TBuiltInVariable {
|
|||||||
EbvSamplePosition,
|
EbvSamplePosition,
|
||||||
EbvSampleMask,
|
EbvSampleMask,
|
||||||
EbvHelperInvocation,
|
EbvHelperInvocation,
|
||||||
|
|
||||||
#ifdef AMD_EXTENSIONS
|
#ifdef AMD_EXTENSIONS
|
||||||
EbvBaryCoordNoPersp,
|
EbvBaryCoordNoPersp,
|
||||||
EbvBaryCoordNoPerspCentroid,
|
EbvBaryCoordNoPerspCentroid,
|
||||||
@ -334,6 +335,7 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v)
|
|||||||
case EbvSamplePosition: return "SamplePosition";
|
case EbvSamplePosition: return "SamplePosition";
|
||||||
case EbvSampleMask: return "SampleMaskIn";
|
case EbvSampleMask: return "SampleMaskIn";
|
||||||
case EbvHelperInvocation: return "HelperInvocation";
|
case EbvHelperInvocation: return "HelperInvocation";
|
||||||
|
|
||||||
#ifdef AMD_EXTENSIONS
|
#ifdef AMD_EXTENSIONS
|
||||||
case EbvBaryCoordNoPersp: return "BaryCoordNoPersp";
|
case EbvBaryCoordNoPersp: return "BaryCoordNoPersp";
|
||||||
case EbvBaryCoordNoPerspCentroid: return "BaryCoordNoPerspCentroid";
|
case EbvBaryCoordNoPerspCentroid: return "BaryCoordNoPerspCentroid";
|
||||||
|
@ -653,6 +653,8 @@ enum TOperator {
|
|||||||
EOpTextureGatherLod,
|
EOpTextureGatherLod,
|
||||||
EOpTextureGatherLodOffset,
|
EOpTextureGatherLodOffset,
|
||||||
EOpTextureGatherLodOffsets,
|
EOpTextureGatherLodOffsets,
|
||||||
|
EOpFragmentMaskFetch,
|
||||||
|
EOpFragmentFetch,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
EOpSparseTextureGuardBegin,
|
EOpSparseTextureGuardBegin,
|
||||||
@ -1032,6 +1034,9 @@ struct TCrackedTextureOp {
|
|||||||
bool grad;
|
bool grad;
|
||||||
bool subpass;
|
bool subpass;
|
||||||
bool lodClamp;
|
bool lodClamp;
|
||||||
|
#ifdef AMD_EXTENSIONS
|
||||||
|
bool fragMask;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -1079,6 +1084,9 @@ public:
|
|||||||
cracked.grad = false;
|
cracked.grad = false;
|
||||||
cracked.subpass = false;
|
cracked.subpass = false;
|
||||||
cracked.lodClamp = false;
|
cracked.lodClamp = false;
|
||||||
|
#ifdef AMD_EXTENSIONS
|
||||||
|
cracked.fragMask = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case EOpImageQuerySize:
|
case EOpImageQuerySize:
|
||||||
@ -1210,6 +1218,14 @@ public:
|
|||||||
case EOpSparseImageLoadLod:
|
case EOpSparseImageLoadLod:
|
||||||
cracked.lod = true;
|
cracked.lod = true;
|
||||||
break;
|
break;
|
||||||
|
case EOpFragmentMaskFetch:
|
||||||
|
cracked.subpass = sampler.dim == EsdSubpass;
|
||||||
|
cracked.fragMask = true;
|
||||||
|
break;
|
||||||
|
case EOpFragmentFetch:
|
||||||
|
cracked.subpass = sampler.dim == EsdSubpass;
|
||||||
|
cracked.fragMask = true;
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
case EOpSubpassLoad:
|
case EOpSubpassLoad:
|
||||||
case EOpSubpassLoadMS:
|
case EOpSubpassLoadMS:
|
||||||
|
@ -2283,7 +2283,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
|
|||||||
if (profile != EEsProfile && version >= 450) {
|
if (profile != EEsProfile && version >= 450) {
|
||||||
commonBuiltins.append(
|
commonBuiltins.append(
|
||||||
"float cubeFaceIndexAMD(vec3);"
|
"float cubeFaceIndexAMD(vec3);"
|
||||||
"vec2 cubeFaceCoordAMD(vec3);"
|
"vec2 cubeFaceCoordAMD(vec3);"
|
||||||
"uint64_t timeAMD();"
|
"uint64_t timeAMD();"
|
||||||
|
|
||||||
"\n");
|
"\n");
|
||||||
@ -2787,6 +2787,29 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
|
|||||||
|
|
||||||
"\n");
|
"\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GL_AMD_shader_fragment_mask
|
||||||
|
if (profile != EEsProfile && version >= 450) {
|
||||||
|
commonBuiltins.append(
|
||||||
|
"uint fragmentMaskFetchAMD(sampler2DMS, ivec2);"
|
||||||
|
"uint fragmentMaskFetchAMD(isampler2DMS, ivec2);"
|
||||||
|
"uint fragmentMaskFetchAMD(usampler2DMS, ivec2);"
|
||||||
|
|
||||||
|
"uint fragmentMaskFetchAMD(sampler2DMSArray, ivec3);"
|
||||||
|
"uint fragmentMaskFetchAMD(isampler2DMSArray, ivec3);"
|
||||||
|
"uint fragmentMaskFetchAMD(usampler2DMSArray, ivec3);"
|
||||||
|
|
||||||
|
"vec4 fragmentFetchAMD(sampler2DMS, ivec2, uint);"
|
||||||
|
"ivec4 fragmentFetchAMD(isampler2DMS, ivec2, uint);"
|
||||||
|
"uvec4 fragmentFetchAMD(usampler2DMS, ivec2, uint);"
|
||||||
|
|
||||||
|
"vec4 fragmentFetchAMD(sampler2DMSArray, ivec3, uint);"
|
||||||
|
"ivec4 fragmentFetchAMD(isampler2DMSArray, ivec3, uint);"
|
||||||
|
"uvec4 fragmentFetchAMD(usampler2DMSArray, ivec3, uint);"
|
||||||
|
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
@ -3126,6 +3149,20 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
|
|||||||
|
|
||||||
"\n");
|
"\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GL_AMD_shader_fragment_mask
|
||||||
|
if (profile != EEsProfile && version >= 450 && spvVersion.vulkan >= 100) {
|
||||||
|
stageBuiltins[EShLangFragment].append(
|
||||||
|
"uint fragmentMaskFetchAMD(subpassInputMS);"
|
||||||
|
"uint fragmentMaskFetchAMD(isubpassInputMS);"
|
||||||
|
"uint fragmentMaskFetchAMD(usubpassInputMS);"
|
||||||
|
|
||||||
|
"vec4 fragmentFetchAMD(subpassInputMS, uint);"
|
||||||
|
"ivec4 fragmentFetchAMD(isubpassInputMS, uint);"
|
||||||
|
"uvec4 fragmentFetchAMD(usubpassInputMS, uint);"
|
||||||
|
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
@ -5372,6 +5409,11 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
|
|||||||
symbolTable.setFunctionExtensions("cubeFaceCoordAMD", 1, &E_GL_AMD_gcn_shader);
|
symbolTable.setFunctionExtensions("cubeFaceCoordAMD", 1, &E_GL_AMD_gcn_shader);
|
||||||
symbolTable.setFunctionExtensions("timeAMD", 1, &E_GL_AMD_gcn_shader);
|
symbolTable.setFunctionExtensions("timeAMD", 1, &E_GL_AMD_gcn_shader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (profile != EEsProfile) {
|
||||||
|
symbolTable.setFunctionExtensions("fragmentMaskFetchAMD", 1, &E_GL_AMD_shader_fragment_mask);
|
||||||
|
symbolTable.setFunctionExtensions("fragmentFetchAMD", 1, &E_GL_AMD_shader_fragment_mask);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Compatibility variables, vertex only
|
// Compatibility variables, vertex only
|
||||||
@ -6210,6 +6252,9 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
|
|||||||
symbolTable.relateToOperator("imageLoadLodAMD", EOpImageLoadLod);
|
symbolTable.relateToOperator("imageLoadLodAMD", EOpImageLoadLod);
|
||||||
symbolTable.relateToOperator("imageStoreLodAMD", EOpImageStoreLod);
|
symbolTable.relateToOperator("imageStoreLodAMD", EOpImageStoreLod);
|
||||||
symbolTable.relateToOperator("sparseImageLoadLodAMD", EOpSparseImageLoadLod);
|
symbolTable.relateToOperator("sparseImageLoadLodAMD", EOpSparseImageLoadLod);
|
||||||
|
|
||||||
|
symbolTable.relateToOperator("fragmentMaskFetchAMD", EOpFragmentMaskFetch);
|
||||||
|
symbolTable.relateToOperator("fragmentFetchAMD", EOpFragmentFetch);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if (profile == EEsProfile) {
|
if (profile == EEsProfile) {
|
||||||
|
@ -201,6 +201,7 @@ void TParseVersions::initializeExtensionBehavior()
|
|||||||
extensionBehavior[E_GL_AMD_texture_gather_bias_lod] = EBhDisable;
|
extensionBehavior[E_GL_AMD_texture_gather_bias_lod] = EBhDisable;
|
||||||
extensionBehavior[E_GL_AMD_gpu_shader_int16] = EBhDisable;
|
extensionBehavior[E_GL_AMD_gpu_shader_int16] = EBhDisable;
|
||||||
extensionBehavior[E_GL_AMD_shader_image_load_store_lod] = EBhDisable;
|
extensionBehavior[E_GL_AMD_shader_image_load_store_lod] = EBhDisable;
|
||||||
|
extensionBehavior[E_GL_AMD_shader_fragment_mask] = EBhDisable;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef NV_EXTENSIONS
|
#ifdef NV_EXTENSIONS
|
||||||
@ -333,6 +334,7 @@ void TParseVersions::getPreamble(std::string& preamble)
|
|||||||
"#define GL_AMD_texture_gather_bias_lod 1\n"
|
"#define GL_AMD_texture_gather_bias_lod 1\n"
|
||||||
"#define GL_AMD_gpu_shader_int16 1\n"
|
"#define GL_AMD_gpu_shader_int16 1\n"
|
||||||
"#define GL_AMD_shader_image_load_store_lod 1\n"
|
"#define GL_AMD_shader_image_load_store_lod 1\n"
|
||||||
|
"#define GL_AMD_shader_fragment_mask 1\n"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef NV_EXTENSIONS
|
#ifdef NV_EXTENSIONS
|
||||||
|
@ -171,6 +171,7 @@ const char* const E_GL_AMD_gpu_shader_half_float = "GL_AMD_gpu_sh
|
|||||||
const char* const E_GL_AMD_texture_gather_bias_lod = "GL_AMD_texture_gather_bias_lod";
|
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_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";
|
const char* const E_GL_AMD_shader_image_load_store_lod = "GL_AMD_shader_image_load_store_lod";
|
||||||
|
const char* const E_GL_AMD_shader_fragment_mask = "GL_AMD_shader_fragment_mask";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef NV_EXTENSIONS
|
#ifdef NV_EXTENSIONS
|
||||||
|
@ -431,10 +431,13 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node)
|
|||||||
case EOpMaxInvocationsExclusiveScanNonUniform: out.debug << "maxInvocationsExclusiveScanNonUniform"; break;
|
case EOpMaxInvocationsExclusiveScanNonUniform: out.debug << "maxInvocationsExclusiveScanNonUniform"; break;
|
||||||
case EOpAddInvocationsExclusiveScanNonUniform: out.debug << "addInvocationsExclusiveScanNonUniform"; break;
|
case EOpAddInvocationsExclusiveScanNonUniform: out.debug << "addInvocationsExclusiveScanNonUniform"; break;
|
||||||
|
|
||||||
case EOpMbcnt: out.debug << "mbcnt"; break;
|
case EOpMbcnt: out.debug << "mbcnt"; break;
|
||||||
|
|
||||||
case EOpCubeFaceIndex: out.debug << "cubeFaceIndex"; break;
|
case EOpCubeFaceIndex: out.debug << "cubeFaceIndex"; break;
|
||||||
case EOpCubeFaceCoord: out.debug << "cubeFaceCoord"; break;
|
case EOpCubeFaceCoord: out.debug << "cubeFaceCoord"; break;
|
||||||
|
|
||||||
|
case EOpFragmentMaskFetch: out.debug << "fragmentMaskFetchAMD"; break;
|
||||||
|
case EOpFragmentFetch: out.debug << "fragmentFetchAMD"; break;
|
||||||
|
|
||||||
case EOpConvBoolToFloat16: out.debug << "Convert bool to float16"; break;
|
case EOpConvBoolToFloat16: out.debug << "Convert bool to float16"; break;
|
||||||
case EOpConvIntToFloat16: out.debug << "Convert int to float16"; break;
|
case EOpConvIntToFloat16: out.debug << "Convert int to float16"; break;
|
||||||
|
@ -409,6 +409,7 @@ INSTANTIATE_TEST_CASE_P(
|
|||||||
"spv.imageLoadStoreLod.frag",
|
"spv.imageLoadStoreLod.frag",
|
||||||
"spv.int16.frag",
|
"spv.int16.frag",
|
||||||
"spv.shaderBallotAMD.comp",
|
"spv.shaderBallotAMD.comp",
|
||||||
|
"spv.shaderFragMaskAMD.frag",
|
||||||
"spv.textureGatherBiasLod.frag"
|
"spv.textureGatherBiasLod.frag"
|
||||||
})),
|
})),
|
||||||
FileNameAsCustomTestSuffix
|
FileNameAsCustomTestSuffix
|
||||||
|
Loading…
x
Reference in New Issue
Block a user