Skip to content

Commit 00d05d2

Browse files
authored
Merge pull request KhronosGroup#2428 from Tobski/GL_EXT_fragment_shading_rate
Add GL_EXT_fragment_shading_rate
2 parents 490eba5 + a315b56 commit 00d05d2

14 files changed

+243
-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

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
}

glslang/MachineIndependent/Initialize.cpp

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4928,6 +4928,11 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
49284928
"\n");
49294929
}
49304930

4931+
if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) {
4932+
stageBuiltins[EShLangVertex].append(
4933+
"out highp int gl_PrimitiveShadingRateEXT;" // GL_EXT_fragment_shading_rate
4934+
"\n");
4935+
}
49314936

49324937
//============================================================================
49334938
//
@@ -5041,6 +5046,12 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
50415046
"\n");
50425047
}
50435048

5049+
if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) {
5050+
stageBuiltins[EShLangGeometry].append(
5051+
"out highp int gl_PrimitiveShadingRateEXT;" // GL_EXT_fragment_shading_rate
5052+
"\n");
5053+
}
5054+
50445055
//============================================================================
50455056
//
50465057
// Define the interface to the tessellation control shader.
@@ -5338,6 +5349,11 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
53385349
"in vec3 gl_BaryCoordNoPerspNV;"
53395350
);
53405351

5352+
if (version >= 450)
5353+
stageBuiltins[EShLangFragment].append(
5354+
"flat in int gl_ShadingRateEXT;" // GL_EXT_fragment_shading_rate
5355+
);
5356+
53415357
} else {
53425358
// ES profile
53435359

@@ -5396,6 +5412,10 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
53965412
"in vec3 gl_BaryCoordNV;"
53975413
"in vec3 gl_BaryCoordNoPerspNV;"
53985414
);
5415+
if (version >= 310)
5416+
stageBuiltins[EShLangFragment].append(
5417+
"flat in highp int gl_ShadingRateEXT;" // GL_EXT_fragment_shading_rate
5418+
);
53995419
}
54005420
#endif
54015421

@@ -5692,6 +5712,18 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
56925712
"flat in highp uint gl_ViewID_OVR;" // GL_OVR_multiview, GL_OVR_multiview2
56935713
"\n");
56945714
}
5715+
5716+
// Adding these to common built-ins triggers an assert due to a memory corruption in related code when testing
5717+
// So instead add to each stage individually, avoiding the GLSLang bug
5718+
if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) {
5719+
for (int stage=EShLangVertex; stage<EShLangCount; stage++)
5720+
{
5721+
stageBuiltins[static_cast<EShLanguage>(stage)].append("const highp int gl_ShadingRateFlag2VerticalPixelsEXT = 1;\n");
5722+
stageBuiltins[static_cast<EShLanguage>(stage)].append("const highp int gl_ShadingRateFlag4VerticalPixelsEXT = 2;\n");
5723+
stageBuiltins[static_cast<EShLanguage>(stage)].append("const highp int gl_ShadingRateFlag2HorizontalPixelsEXT = 4;\n");
5724+
stageBuiltins[static_cast<EShLanguage>(stage)].append("const highp int gl_ShadingRateFlag4HorizontalPixelsEXT = 8;\n");
5725+
}
5726+
}
56955727
#endif // !GLSLANG_WEB
56965728

56975729
// printf("%s\n", commonBuiltins.c_str());
@@ -7650,6 +7682,20 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
76507682
BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable);
76517683
BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable);
76527684
}
7685+
7686+
if (language == EShLangGeometry || language == EShLangVertex) {
7687+
if ((profile == EEsProfile && version >= 310) ||
7688+
(profile != EEsProfile && version >= 450)) {
7689+
symbolTable.setVariableExtensions("gl_PrimitiveShadingRateEXT", 1, &E_GL_EXT_fragment_shading_rate);
7690+
BuiltInVariable("gl_PrimitiveShadingRateEXT", EbvPrimitiveShadingRateKHR, symbolTable);
7691+
7692+
symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
7693+
symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
7694+
symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
7695+
symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
7696+
}
7697+
}
7698+
76537699
#endif // !GLSLANG_WEB
76547700
break;
76557701

@@ -8156,6 +8202,17 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
81568202
}
81578203

81588204
symbolTable.setFunctionExtensions("helperInvocationEXT", 1, &E_GL_EXT_demote_to_helper_invocation);
8205+
8206+
if ((profile == EEsProfile && version >= 310) ||
8207+
(profile != EEsProfile && version >= 450)) {
8208+
symbolTable.setVariableExtensions("gl_ShadingRateEXT", 1, &E_GL_EXT_fragment_shading_rate);
8209+
BuiltInVariable("gl_ShadingRateEXT", EbvShadingRateKHR, symbolTable);
8210+
8211+
symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8212+
symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8213+
symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8214+
symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8215+
}
81598216
#endif // !GLSLANG_WEB
81608217
break;
81618218

@@ -8288,6 +8345,14 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
82888345
symbolTable.setFunctionExtensions("dFdyCoarse", 1, &E_GL_NV_compute_shader_derivatives);
82898346
symbolTable.setFunctionExtensions("fwidthCoarse", 1, &E_GL_NV_compute_shader_derivatives);
82908347
}
8348+
8349+
if ((profile == EEsProfile && version >= 310) ||
8350+
(profile != EEsProfile && version >= 450)) {
8351+
symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8352+
symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8353+
symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8354+
symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8355+
}
82918356
#endif // !GLSLANG_WEB
82928357
break;
82938358

@@ -8437,6 +8502,13 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
84378502
BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable);
84388503
BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable);
84398504
}
8505+
if ((profile == EEsProfile && version >= 310) ||
8506+
(profile != EEsProfile && version >= 450)) {
8507+
symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8508+
symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8509+
symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8510+
symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8511+
}
84408512
break;
84418513

84428514
case EShLangMeshNV:
@@ -8581,6 +8653,14 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
85818653
BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable);
85828654
BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable);
85838655
}
8656+
8657+
if ((profile == EEsProfile && version >= 310) ||
8658+
(profile != EEsProfile && version >= 450)) {
8659+
symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8660+
symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8661+
symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8662+
symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8663+
}
85848664
break;
85858665

85868666
case EShLangTaskNV:
@@ -8681,6 +8761,13 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
86818761
BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable);
86828762
BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable);
86838763
}
8764+
if ((profile == EEsProfile && version >= 310) ||
8765+
(profile != EEsProfile && version >= 450)) {
8766+
symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8767+
symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8768+
symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8769+
symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
8770+
}
86848771
break;
86858772
#endif
86868773

glslang/MachineIndependent/ParseHelper.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4226,6 +4226,8 @@ TSymbol* TParseContext::redeclareBuiltinVariable(const TSourceLoc& loc, const TS
42264226
(identifier == "gl_FragCoord" && ((nonEsRedecls && version >= 150) || esRedecls)) ||
42274227
identifier == "gl_ClipDistance" ||
42284228
identifier == "gl_CullDistance" ||
4229+
identifier == "gl_ShadingRateEXT" ||
4230+
identifier == "gl_PrimitiveShadingRateEXT" ||
42294231
identifier == "gl_FrontColor" ||
42304232
identifier == "gl_BackColor" ||
42314233
identifier == "gl_FrontSecondaryColor" ||

0 commit comments

Comments
 (0)