Skip to content

Commit a315b56

Browse files
ShchchowAMDTobski
authored andcommitted
Add GL_EXT_fragment_shading_rate
1 parent f4f1d8a commit a315b56

15 files changed

+265
-2
lines changed

SPIRV/GLSL.ext.KHR.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,5 @@ static const char* const E_SPV_KHR_shader_clock = "SPV_KHR_shade
4848
static const char* const E_SPV_KHR_non_semantic_info = "SPV_KHR_non_semantic_info";
4949
static const char* const E_SPV_KHR_ray_tracing = "SPV_KHR_ray_tracing";
5050
static const char* const E_SPV_KHR_ray_query = "SPV_KHR_ray_query";
51+
static const char* const E_SPV_KHR_fragment_shading_rate = "SPV_KHR_fragment_shading_rate";
5152
#endif // #ifndef GLSLextKHR_H

SPIRV/GlslangToSpv.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,16 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI
769769
builder.addCapability(spv::CapabilityStencilExportEXT);
770770
return spv::BuiltInFragStencilRefEXT;
771771

772+
case glslang::EbvShadingRateKHR:
773+
builder.addExtension(spv::E_SPV_KHR_fragment_shading_rate);
774+
builder.addCapability(spv::CapabilityFragmentShadingRateKHR);
775+
return spv::BuiltInShadingRateKHR;
776+
777+
case glslang::EbvPrimitiveShadingRateKHR:
778+
builder.addExtension(spv::E_SPV_KHR_fragment_shading_rate);
779+
builder.addCapability(spv::CapabilityFragmentShadingRateKHR);
780+
return spv::BuiltInPrimitiveShadingRateKHR;
781+
772782
case glslang::EbvInvocationId: return spv::BuiltInInvocationId;
773783
case glslang::EbvTessLevelInner: return spv::BuiltInTessLevelInner;
774784
case glslang::EbvTessLevelOuter: return spv::BuiltInTessLevelOuter;

SPIRV/doc.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,8 @@ const char* BuiltInString(int builtIn)
372372
case 4424: return "BaseVertex";
373373
case 4425: return "BaseInstance";
374374
case 4426: return "DrawIndex";
375+
case 4432: return "PrimitiveShadingRateKHR";
376+
case 4444: return "ShadingRateKHR";
375377
case 5014: return "FragStencilRefEXT";
376378

377379
case 4992: return "BaryCoordNoPerspAMD";
@@ -952,6 +954,8 @@ const char* CapabilityString(int info)
952954
case CapabilityFragmentShaderPixelInterlockEXT: return "CapabilityFragmentShaderPixelInterlockEXT";
953955
case CapabilityFragmentShaderShadingRateInterlockEXT: return "CapabilityFragmentShaderShadingRateInterlockEXT";
954956

957+
case CapabilityFragmentShadingRateKHR: return "FragmentShadingRateKHR";
958+
955959
case CapabilityDemoteToHelperInvocationEXT: return "DemoteToHelperInvocationEXT";
956960
case CapabilityShaderClockKHR: return "ShaderClockKHR";
957961

SPIRV/spirv.hpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,8 +558,10 @@ enum BuiltIn {
558558
BuiltInBaseVertex = 4424,
559559
BuiltInBaseInstance = 4425,
560560
BuiltInDrawIndex = 4426,
561+
BuiltInPrimitiveShadingRateKHR = 4432,
561562
BuiltInDeviceIndex = 4438,
562563
BuiltInViewIndex = 4440,
564+
BuiltInShadingRateKHR = 4444,
563565
BuiltInBaryCoordNoPerspAMD = 4992,
564566
BuiltInBaryCoordNoPerspCentroidAMD = 4993,
565567
BuiltInBaryCoordNoPerspSampleAMD = 4994,
@@ -870,6 +872,7 @@ enum Capability {
870872
CapabilityGroupNonUniformQuad = 68,
871873
CapabilityShaderLayer = 69,
872874
CapabilityShaderViewportIndex = 70,
875+
CapabilityFragmentShadingRateKHR = 4422,
873876
CapabilitySubgroupBallotKHR = 4423,
874877
CapabilityDrawParameters = 4427,
875878
CapabilitySubgroupVoteKHR = 4431,
@@ -1024,6 +1027,22 @@ enum RayQueryCandidateIntersectionType {
10241027
RayQueryCandidateIntersectionTypeMax = 0x7fffffff,
10251028
};
10261029

1030+
enum FragmentShadingRateShift {
1031+
FragmentShadingRateVertical2PixelsShift = 0,
1032+
FragmentShadingRateVertical4PixelsShift = 1,
1033+
FragmentShadingRateHorizontal2PixelsShift = 2,
1034+
FragmentShadingRateHorizontal4PixelsShift = 3,
1035+
FragmentShadingRateMax = 0x7fffffff,
1036+
};
1037+
1038+
enum FragmentShadingRateMask {
1039+
FragmentShadingRateMaskNone = 0,
1040+
FragmentShadingRateVertical2PixelsMask = 0x00000001,
1041+
FragmentShadingRateVertical4PixelsMask = 0x00000002,
1042+
FragmentShadingRateHorizontal2PixelsMask = 0x00000004,
1043+
FragmentShadingRateHorizontal4PixelsMask = 0x00000008,
1044+
};
1045+
10271046
enum Op {
10281047
OpNop = 0,
10291048
OpUndef = 1,
@@ -1369,6 +1388,7 @@ enum Op {
13691388
OpPtrEqual = 401,
13701389
OpPtrNotEqual = 402,
13711390
OpPtrDiff = 403,
1391+
OpTerminateInvocation = 4416,
13721392
OpSubgroupBallotKHR = 4421,
13731393
OpSubgroupFirstInvocationKHR = 4422,
13741394
OpSubgroupAllKHR = 4428,
@@ -1939,6 +1959,7 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
19391959
case OpPtrEqual: *hasResult = true; *hasResultType = true; break;
19401960
case OpPtrNotEqual: *hasResult = true; *hasResultType = true; break;
19411961
case OpPtrDiff: *hasResult = true; *hasResultType = true; break;
1962+
case OpTerminateInvocation: *hasResult = false; *hasResultType = false; break;
19421963
case OpSubgroupBallotKHR: *hasResult = true; *hasResultType = true; break;
19431964
case OpSubgroupFirstInvocationKHR: *hasResult = true; *hasResultType = true; break;
19441965
case OpSubgroupAllKHR: *hasResult = true; *hasResultType = true; break;
@@ -2164,6 +2185,7 @@ inline MemorySemanticsMask operator|(MemorySemanticsMask a, MemorySemanticsMask
21642185
inline MemoryAccessMask operator|(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) | unsigned(b)); }
21652186
inline KernelProfilingInfoMask operator|(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) | unsigned(b)); }
21662187
inline RayFlagsMask operator|(RayFlagsMask a, RayFlagsMask b) { return RayFlagsMask(unsigned(a) | unsigned(b)); }
2188+
inline FragmentShadingRateMask operator|(FragmentShadingRateMask a, FragmentShadingRateMask b) { return FragmentShadingRateMask(unsigned(a) | unsigned(b)); }
21672189

21682190
} // end namespace spv
21692191

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
spv.builtin.PrimitiveShadingRateEXT.vert
2+
// Module Version 10000
3+
// Generated by (magic number): 8000a
4+
// Id's are bound by 26
5+
6+
Capability Shader
7+
Capability FragmentShadingRateKHR
8+
Extension "SPV_KHR_fragment_shading_rate"
9+
1: ExtInstImport "GLSL.std.450"
10+
MemoryModel Logical GLSL450
11+
EntryPoint Vertex 4 "main" 8 16
12+
Source GLSL 450
13+
SourceExtension "GL_EXT_fragment_shading_rate"
14+
Name 4 "main"
15+
Name 8 "id"
16+
Name 16 "gl_PrimitiveShadingRateEXT"
17+
Decorate 8(id) Location 0
18+
Decorate 16(gl_PrimitiveShadingRateEXT) BuiltIn PrimitiveShadingRateKHR
19+
2: TypeVoid
20+
3: TypeFunction 2
21+
6: TypeInt 32 1
22+
7: TypePointer Input 6(int)
23+
8(id): 7(ptr) Variable Input
24+
15: TypePointer Output 6(int)
25+
16(gl_PrimitiveShadingRateEXT): 15(ptr) Variable Output
26+
17: 6(int) Constant 5
27+
19: 6(int) Constant 9
28+
21: 6(int) Constant 6
29+
23: 6(int) Constant 10
30+
4(main): 2 Function None 3
31+
5: Label
32+
9: 6(int) Load 8(id)
33+
SelectionMerge 14 None
34+
Switch 9 14
35+
case 0: 10
36+
case 1: 11
37+
case 2: 12
38+
case 3: 13
39+
10: Label
40+
Store 16(gl_PrimitiveShadingRateEXT) 17
41+
Branch 14
42+
11: Label
43+
Store 16(gl_PrimitiveShadingRateEXT) 19
44+
Branch 14
45+
12: Label
46+
Store 16(gl_PrimitiveShadingRateEXT) 21
47+
Branch 14
48+
13: Label
49+
Store 16(gl_PrimitiveShadingRateEXT) 23
50+
Branch 14
51+
14: Label
52+
Return
53+
FunctionEnd
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
spv.builtin.ShadingRateEXT.frag
2+
WARNING: 0:5: '' : all default precisions are highp; use precision statements to quiet warning, e.g.:
3+
"precision mediump int; precision highp float;"
4+
5+
// Module Version 10000
6+
// Generated by (magic number): 8000a
7+
// Id's are bound by 12
8+
9+
Capability Shader
10+
Capability FragmentShadingRateKHR
11+
Extension "SPV_KHR_fragment_shading_rate"
12+
1: ExtInstImport "GLSL.std.450"
13+
MemoryModel Logical GLSL450
14+
EntryPoint Fragment 4 "main" 8 10
15+
ExecutionMode 4 OriginUpperLeft
16+
Source GLSL 450
17+
SourceExtension "GL_EXT_fragment_shading_rate"
18+
Name 4 "main"
19+
Name 8 "val"
20+
Name 10 "gl_ShadingRateEXT"
21+
Decorate 8(val) Location 0
22+
Decorate 10(gl_ShadingRateEXT) Flat
23+
Decorate 10(gl_ShadingRateEXT) BuiltIn ShadingRateKHR
24+
2: TypeVoid
25+
3: TypeFunction 2
26+
6: TypeInt 32 1
27+
7: TypePointer Output 6(int)
28+
8(val): 7(ptr) Variable Output
29+
9: TypePointer Input 6(int)
30+
10(gl_ShadingRateEXT): 9(ptr) Variable Input
31+
4(main): 2 Function None 3
32+
5: Label
33+
11: 6(int) Load 10(gl_ShadingRateEXT)
34+
Store 8(val) 11
35+
Return
36+
FunctionEnd
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#version 450
2+
3+
#extension GL_EXT_fragment_shading_rate : enable
4+
5+
layout(location = 0) in int id;
6+
7+
void main()
8+
{
9+
switch (id)
10+
{
11+
case 0:
12+
// V2 | H2 => 5
13+
gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag2VerticalPixelsEXT | gl_ShadingRateFlag2HorizontalPixelsEXT;
14+
break;
15+
case 1:
16+
// V2 | H4 => 9
17+
gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag2VerticalPixelsEXT | gl_ShadingRateFlag4HorizontalPixelsEXT;
18+
break;
19+
case 2:
20+
// V4 | H2 => 6
21+
gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag4VerticalPixelsEXT | gl_ShadingRateFlag2HorizontalPixelsEXT;
22+
break;
23+
case 3:
24+
// V4 | H4 => 10
25+
gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag4VerticalPixelsEXT | gl_ShadingRateFlag4HorizontalPixelsEXT;
26+
break;
27+
}
28+
}

Test/spv.builtin.ShadingRateEXT.frag

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#version 450
2+
3+
#extension GL_EXT_fragment_shading_rate : enable
4+
5+
out highp int val;
6+
void main () {
7+
val = gl_ShadingRateEXT;
8+
}

glslang/Include/BaseTypes.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,9 @@ enum TBuiltInVariable {
228228
EbvViewIndex,
229229
EbvDeviceIndex,
230230

231+
EbvShadingRateKHR,
232+
EbvPrimitiveShadingRateKHR,
233+
231234
EbvFragSizeEXT,
232235
EbvFragInvocationCountEXT,
233236

@@ -480,6 +483,9 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v)
480483
case EbvWarpID: return "WarpIDNV";
481484
case EbvSMID: return "SMIDNV";
482485

486+
case EbvShadingRateKHR: return "ShadingRateKHR";
487+
case EbvPrimitiveShadingRateKHR: return "PrimitiveShadingRateKHR";
488+
483489
default: return "unknown built-in variable";
484490
}
485491
}

0 commit comments

Comments
 (0)