mirror of
https://github.com/KhronosGroup/glslang
synced 2024-11-09 12:00:05 +00:00
Implement SPV_KHR_post_depth_coverage
Added support for both extension GL_ARB_post_depth_coverage and GL_EXT_post_depth_coverage.
This commit is contained in:
parent
994660208c
commit
c120452754
@ -32,7 +32,7 @@ enum Op;
|
|||||||
enum Capability;
|
enum Capability;
|
||||||
|
|
||||||
static const int GLSLextKHRVersion = 100;
|
static const int GLSLextKHRVersion = 100;
|
||||||
static const int GLSLextKHRRevision = 1;
|
static const int GLSLextKHRRevision = 2;
|
||||||
|
|
||||||
static const char* const E_SPV_KHR_shader_ballot = "SPV_KHR_shader_ballot";
|
static const char* const E_SPV_KHR_shader_ballot = "SPV_KHR_shader_ballot";
|
||||||
static const char* const E_SPV_KHR_subgroup_vote = "SPV_KHR_subgroup_vote";
|
static const char* const E_SPV_KHR_subgroup_vote = "SPV_KHR_subgroup_vote";
|
||||||
@ -41,5 +41,6 @@ static const char* const E_SPV_KHR_multiview = "SPV_KHR_multi
|
|||||||
static const char* const E_SPV_KHR_shader_draw_parameters = "SPV_KHR_shader_draw_parameters";
|
static const char* const E_SPV_KHR_shader_draw_parameters = "SPV_KHR_shader_draw_parameters";
|
||||||
static const char* const E_SPV_KHR_16bit_storage = "SPV_KHR_16bit_storage";
|
static const char* const E_SPV_KHR_16bit_storage = "SPV_KHR_16bit_storage";
|
||||||
static const char* const E_SPV_KHR_storage_buffer_storage_class = "SPV_KHR_storage_buffer_storage_class";
|
static const char* const E_SPV_KHR_storage_buffer_storage_class = "SPV_KHR_storage_buffer_storage_class";
|
||||||
|
static const char* const E_SPV_KHR_post_depth_coverage = "SPV_KHR_post_depth_coverage";
|
||||||
|
|
||||||
#endif // #ifndef GLSLextKHR_H
|
#endif // #ifndef GLSLextKHR_H
|
||||||
|
@ -980,6 +980,12 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(const glslang::TIntermediate* gls
|
|||||||
if (glslangIntermediate->getEarlyFragmentTests())
|
if (glslangIntermediate->getEarlyFragmentTests())
|
||||||
builder.addExecutionMode(shaderEntry, spv::ExecutionModeEarlyFragmentTests);
|
builder.addExecutionMode(shaderEntry, spv::ExecutionModeEarlyFragmentTests);
|
||||||
|
|
||||||
|
if (glslangIntermediate->getPostDepthCoverage()) {
|
||||||
|
builder.addCapability(spv::CapabilitySampleMaskPostDepthCoverage);
|
||||||
|
builder.addExecutionMode(shaderEntry, spv::ExecutionModePostDepthCoverage);
|
||||||
|
builder.addExtension(spv::E_SPV_KHR_post_depth_coverage);
|
||||||
|
}
|
||||||
|
|
||||||
switch(glslangIntermediate->getDepth()) {
|
switch(glslangIntermediate->getDepth()) {
|
||||||
case glslang::EldGreater: mode = spv::ExecutionModeDepthGreater; break;
|
case glslang::EldGreater: mode = spv::ExecutionModeDepthGreater; break;
|
||||||
case glslang::EldLess: mode = spv::ExecutionModeDepthLess; break;
|
case glslang::EldLess: mode = spv::ExecutionModeDepthLess; break;
|
||||||
|
@ -175,6 +175,7 @@ const char* ExecutionModeString(int mode)
|
|||||||
case 31: return "ContractionOff";
|
case 31: return "ContractionOff";
|
||||||
case 32: return "Bad";
|
case 32: return "Bad";
|
||||||
|
|
||||||
|
case 4446: return "PostDepthCoverage";
|
||||||
case ExecutionModeCeiling:
|
case ExecutionModeCeiling:
|
||||||
default: return "Bad";
|
default: return "Bad";
|
||||||
}
|
}
|
||||||
@ -843,6 +844,7 @@ const char* CapabilityString(int info)
|
|||||||
case 5009: return "ImageGatherBiasLodAMD";
|
case 5009: return "ImageGatherBiasLodAMD";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
case 4447: return "SampleMaskPostDepthCoverage";
|
||||||
#ifdef NV_EXTENSIONS
|
#ifdef NV_EXTENSIONS
|
||||||
case 5251: return "GeometryShaderPassthroughNV";
|
case 5251: return "GeometryShaderPassthroughNV";
|
||||||
case 5254: return "ShaderViewportIndexLayerNV";
|
case 5254: return "ShaderViewportIndexLayerNV";
|
||||||
|
@ -47,11 +47,11 @@ namespace spv {
|
|||||||
typedef unsigned int Id;
|
typedef unsigned int Id;
|
||||||
|
|
||||||
#define SPV_VERSION 0x10000
|
#define SPV_VERSION 0x10000
|
||||||
#define SPV_REVISION 10
|
#define SPV_REVISION 11
|
||||||
|
|
||||||
static const unsigned int MagicNumber = 0x07230203;
|
static const unsigned int MagicNumber = 0x07230203;
|
||||||
static const unsigned int Version = 0x00010000;
|
static const unsigned int Version = 0x00010000;
|
||||||
static const unsigned int Revision = 10;
|
static const unsigned int Revision = 11;
|
||||||
static const unsigned int OpCodeMask = 0xffff;
|
static const unsigned int OpCodeMask = 0xffff;
|
||||||
static const unsigned int WordCountShift = 16;
|
static const unsigned int WordCountShift = 16;
|
||||||
|
|
||||||
@ -122,6 +122,7 @@ enum ExecutionMode {
|
|||||||
ExecutionModeOutputTriangleStrip = 29,
|
ExecutionModeOutputTriangleStrip = 29,
|
||||||
ExecutionModeVecTypeHint = 30,
|
ExecutionModeVecTypeHint = 30,
|
||||||
ExecutionModeContractionOff = 31,
|
ExecutionModeContractionOff = 31,
|
||||||
|
ExecutionModePostDepthCoverage = 4446,
|
||||||
ExecutionModeMax = 0x7fffffff,
|
ExecutionModeMax = 0x7fffffff,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -628,6 +629,7 @@ enum Capability {
|
|||||||
CapabilityMultiView = 4439,
|
CapabilityMultiView = 4439,
|
||||||
CapabilityVariablePointersStorageBuffer = 4441,
|
CapabilityVariablePointersStorageBuffer = 4441,
|
||||||
CapabilityVariablePointers = 4442,
|
CapabilityVariablePointers = 4442,
|
||||||
|
CapabilitySampleMaskPostDepthCoverage = 4447,
|
||||||
CapabilitySampleMaskOverrideCoverageNV = 5249,
|
CapabilitySampleMaskOverrideCoverageNV = 5249,
|
||||||
CapabilityGeometryShaderPassthroughNV = 5251,
|
CapabilityGeometryShaderPassthroughNV = 5251,
|
||||||
CapabilityShaderViewportIndexLayerNV = 5254,
|
CapabilityShaderViewportIndexLayerNV = 5254,
|
||||||
|
43
Test/baseResults/spv.arbPostDepthCoverage.frag.out
Normal file
43
Test/baseResults/spv.arbPostDepthCoverage.frag.out
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
spv.arbPostDepthCoverage.frag
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80001
|
||||||
|
// Id's are bound by 18
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
Capability SampleRateShading
|
||||||
|
Capability SampleMaskPostDepthCoverage
|
||||||
|
Extension "SPV_KHR_post_depth_coverage"
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 8 13
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
ExecutionMode 4 EarlyFragmentTests
|
||||||
|
ExecutionMode 4 PostDepthCoverage
|
||||||
|
Source GLSL 450
|
||||||
|
SourceExtension "GL_ARB_post_depth_coverage"
|
||||||
|
SourceExtension "GL_EXT_post_depth_coverage"
|
||||||
|
Name 4 "main"
|
||||||
|
Name 8 "readSampleMaskIn"
|
||||||
|
Name 13 "gl_SampleMaskIn"
|
||||||
|
Decorate 8(readSampleMaskIn) Location 0
|
||||||
|
Decorate 13(gl_SampleMaskIn) Flat
|
||||||
|
Decorate 13(gl_SampleMaskIn) BuiltIn SampleMask
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeInt 32 1
|
||||||
|
7: TypePointer Output 6(int)
|
||||||
|
8(readSampleMaskIn): 7(ptr) Variable Output
|
||||||
|
9: TypeInt 32 0
|
||||||
|
10: 9(int) Constant 1
|
||||||
|
11: TypeArray 6(int) 10
|
||||||
|
12: TypePointer Input 11
|
||||||
|
13(gl_SampleMaskIn): 12(ptr) Variable Input
|
||||||
|
14: 6(int) Constant 0
|
||||||
|
15: TypePointer Input 6(int)
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
16: 15(ptr) AccessChain 13(gl_SampleMaskIn) 14
|
||||||
|
17: 6(int) Load 16
|
||||||
|
Store 8(readSampleMaskIn) 17
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
7
Test/baseResults/spv.arbPostDepthCoverage_Error.frag.out
Normal file
7
Test/baseResults/spv.arbPostDepthCoverage_Error.frag.out
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
spv.arbPostDepthCoverage_Error.frag
|
||||||
|
ERROR: 0:7: 'early_fragment_tests' : can only apply to a standalone qualifier
|
||||||
|
ERROR: 0:7: 'post_depth_coverage' : can only apply to a standalone qualifier
|
||||||
|
ERROR: 2 compilation errors. No code generated.
|
||||||
|
|
||||||
|
|
||||||
|
SPIR-V is not generated for failed compile or link
|
23
Test/baseResults/spv.extPostDepthCoverage.frag.out
Normal file
23
Test/baseResults/spv.extPostDepthCoverage.frag.out
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
spv.extPostDepthCoverage.frag
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80001
|
||||||
|
// Id's are bound by 6
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
Capability SampleMaskPostDepthCoverage
|
||||||
|
Extension "SPV_KHR_post_depth_coverage"
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main"
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
ExecutionMode 4 EarlyFragmentTests
|
||||||
|
ExecutionMode 4 PostDepthCoverage
|
||||||
|
Source ESSL 310
|
||||||
|
SourceExtension "GL_EXT_post_depth_coverage"
|
||||||
|
Name 4 "main"
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
4
Test/baseResults/spv.extPostDepthCoverage_Error.frag.out
Normal file
4
Test/baseResults/spv.extPostDepthCoverage_Error.frag.out
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
spv.extPostDepthCoverage_Error.frag
|
||||||
|
ERROR: Linking fragment stage: post_depth_coverage requires early_fragment_tests
|
||||||
|
|
||||||
|
SPIR-V is not generated for failed compile or link
|
13
Test/spv.arbPostDepthCoverage.frag
Normal file
13
Test/spv.arbPostDepthCoverage.frag
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
#extension GL_ARB_post_depth_coverage : enable
|
||||||
|
#extension GL_EXT_post_depth_coverage : enable //according to ARB_post_depth_coverage,
|
||||||
|
//if both enabled, this one should be ignored
|
||||||
|
precision highp int;
|
||||||
|
layout(post_depth_coverage) in;
|
||||||
|
|
||||||
|
layout (location = 0) out int readSampleMaskIn;
|
||||||
|
|
||||||
|
void main () {
|
||||||
|
readSampleMaskIn = gl_SampleMaskIn[0];
|
||||||
|
}
|
12
Test/spv.arbPostDepthCoverage_Error.frag
Normal file
12
Test/spv.arbPostDepthCoverage_Error.frag
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#version 310 es
|
||||||
|
|
||||||
|
#extension GL_ARB_post_depth_coverage : enable
|
||||||
|
|
||||||
|
precision highp float;
|
||||||
|
|
||||||
|
layout(post_depth_coverage, location = 0) in float a; // should fail since post_depth_coverage may only
|
||||||
|
// be declared on in only (not with variable declarations)
|
||||||
|
|
||||||
|
void main () {
|
||||||
|
|
||||||
|
}
|
9
Test/spv.extPostDepthCoverage.frag
Normal file
9
Test/spv.extPostDepthCoverage.frag
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#version 310 es
|
||||||
|
|
||||||
|
#extension GL_EXT_post_depth_coverage : enable
|
||||||
|
|
||||||
|
layout(post_depth_coverage) in;
|
||||||
|
layout(early_fragment_tests) in;
|
||||||
|
|
||||||
|
void main () {
|
||||||
|
}
|
9
Test/spv.extPostDepthCoverage_Error.frag
Normal file
9
Test/spv.extPostDepthCoverage_Error.frag
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
#extension GL_EXT_post_depth_coverage : enable
|
||||||
|
|
||||||
|
layout(post_depth_coverage) in; // should fail since for GL_EXT_post_depth_coverage
|
||||||
|
// explicit declaration of early_fragment_tests is required
|
||||||
|
|
||||||
|
void main () {
|
||||||
|
}
|
@ -968,6 +968,7 @@ struct TShaderQualifiers {
|
|||||||
int localSize[3]; // compute shader
|
int localSize[3]; // compute shader
|
||||||
int localSizeSpecId[3]; // compute shader specialization id for gl_WorkGroupSize
|
int localSizeSpecId[3]; // compute shader specialization id for gl_WorkGroupSize
|
||||||
bool earlyFragmentTests; // fragment input
|
bool earlyFragmentTests; // fragment input
|
||||||
|
bool postDepthCoverage; // fragment input
|
||||||
TLayoutDepth layoutDepth;
|
TLayoutDepth layoutDepth;
|
||||||
bool blendEquation; // true if any blend equation was specified
|
bool blendEquation; // true if any blend equation was specified
|
||||||
|
|
||||||
@ -992,6 +993,7 @@ struct TShaderQualifiers {
|
|||||||
localSizeSpecId[1] = TQualifier::layoutNotSet;
|
localSizeSpecId[1] = TQualifier::layoutNotSet;
|
||||||
localSizeSpecId[2] = TQualifier::layoutNotSet;
|
localSizeSpecId[2] = TQualifier::layoutNotSet;
|
||||||
earlyFragmentTests = false;
|
earlyFragmentTests = false;
|
||||||
|
postDepthCoverage = false;
|
||||||
layoutDepth = EldNone;
|
layoutDepth = EldNone;
|
||||||
blendEquation = false;
|
blendEquation = false;
|
||||||
#ifdef NV_EXTENSIONS
|
#ifdef NV_EXTENSIONS
|
||||||
@ -1029,6 +1031,8 @@ struct TShaderQualifiers {
|
|||||||
}
|
}
|
||||||
if (src.earlyFragmentTests)
|
if (src.earlyFragmentTests)
|
||||||
earlyFragmentTests = true;
|
earlyFragmentTests = true;
|
||||||
|
if (src.postDepthCoverage)
|
||||||
|
postDepthCoverage = true;
|
||||||
if (src.layoutDepth)
|
if (src.layoutDepth)
|
||||||
layoutDepth = src.layoutDepth;
|
layoutDepth = src.layoutDepth;
|
||||||
if (src.blendEquation)
|
if (src.blendEquation)
|
||||||
|
@ -4015,6 +4015,14 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi
|
|||||||
publicType.shaderQualifiers.earlyFragmentTests = true;
|
publicType.shaderQualifiers.earlyFragmentTests = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (id == "post_depth_coverage") {
|
||||||
|
requireExtensions(loc, Num_post_depth_coverageEXTs, post_depth_coverageEXTs, "post depth coverage");
|
||||||
|
if (extensionTurnedOn(E_GL_ARB_post_depth_coverage)) {
|
||||||
|
publicType.shaderQualifiers.earlyFragmentTests = true;
|
||||||
|
}
|
||||||
|
publicType.shaderQualifiers.postDepthCoverage = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (TLayoutDepth depth = (TLayoutDepth)(EldNone + 1); depth < EldCount; depth = (TLayoutDepth)(depth+1)) {
|
for (TLayoutDepth depth = (TLayoutDepth)(EldNone + 1); depth < EldCount; depth = (TLayoutDepth)(depth+1)) {
|
||||||
if (id == TQualifier::getLayoutDepthString(depth)) {
|
if (id == TQualifier::getLayoutDepthString(depth)) {
|
||||||
requireProfile(loc, ECoreProfile | ECompatibilityProfile, "depth layout qualifier");
|
requireProfile(loc, ECoreProfile | ECompatibilityProfile, "depth layout qualifier");
|
||||||
@ -4788,6 +4796,8 @@ void TParseContext::checkNoShaderLayouts(const TSourceLoc& loc, const TShaderQua
|
|||||||
error(loc, message, "invocations", "");
|
error(loc, message, "invocations", "");
|
||||||
if (shaderQualifiers.earlyFragmentTests)
|
if (shaderQualifiers.earlyFragmentTests)
|
||||||
error(loc, message, "early_fragment_tests", "");
|
error(loc, message, "early_fragment_tests", "");
|
||||||
|
if (shaderQualifiers.postDepthCoverage)
|
||||||
|
error(loc, message, "post_depth_coverage", "");
|
||||||
for (int i = 0; i < 3; ++i) {
|
for (int i = 0; i < 3; ++i) {
|
||||||
if (shaderQualifiers.localSize[i] > 1)
|
if (shaderQualifiers.localSize[i] > 1)
|
||||||
error(loc, message, "local_size", "");
|
error(loc, message, "local_size", "");
|
||||||
@ -6282,6 +6292,12 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con
|
|||||||
else
|
else
|
||||||
error(loc, "can only apply to 'in'", "early_fragment_tests", "");
|
error(loc, "can only apply to 'in'", "early_fragment_tests", "");
|
||||||
}
|
}
|
||||||
|
if (publicType.shaderQualifiers.postDepthCoverage) {
|
||||||
|
if (publicType.qualifier.storage == EvqVaryingIn)
|
||||||
|
intermediate.setPostDepthCoverage();
|
||||||
|
else
|
||||||
|
error(loc, "can only apply to 'in'", "post_coverage_coverage", "");
|
||||||
|
}
|
||||||
if (publicType.shaderQualifiers.blendEquation) {
|
if (publicType.shaderQualifiers.blendEquation) {
|
||||||
if (publicType.qualifier.storage != EvqVaryingOut)
|
if (publicType.qualifier.storage != EvqVaryingOut)
|
||||||
error(loc, "can only apply to 'out'", "blend equation", "");
|
error(loc, "can only apply to 'out'", "blend equation", "");
|
||||||
|
@ -181,9 +181,11 @@ void TParseVersions::initializeExtensionBehavior()
|
|||||||
extensionBehavior[E_GL_ARB_sparse_texture_clamp] = EBhDisable;
|
extensionBehavior[E_GL_ARB_sparse_texture_clamp] = EBhDisable;
|
||||||
extensionBehavior[E_GL_ARB_shader_stencil_export] = EBhDisable;
|
extensionBehavior[E_GL_ARB_shader_stencil_export] = EBhDisable;
|
||||||
// extensionBehavior[E_GL_ARB_cull_distance] = EBhDisable; // present for 4.5, but need extension control over block members
|
// extensionBehavior[E_GL_ARB_cull_distance] = EBhDisable; // present for 4.5, but need extension control over block members
|
||||||
|
extensionBehavior[E_GL_ARB_post_depth_coverage] = EBhDisable;
|
||||||
|
|
||||||
extensionBehavior[E_GL_EXT_shader_non_constant_global_initializers] = EBhDisable;
|
extensionBehavior[E_GL_EXT_shader_non_constant_global_initializers] = EBhDisable;
|
||||||
extensionBehavior[E_GL_EXT_shader_image_load_formatted] = EBhDisable;
|
extensionBehavior[E_GL_EXT_shader_image_load_formatted] = EBhDisable;
|
||||||
|
extensionBehavior[E_GL_EXT_post_depth_coverage] = EBhDisable;
|
||||||
|
|
||||||
// #line and #include
|
// #line and #include
|
||||||
extensionBehavior[E_GL_GOOGLE_cpp_style_line_directive] = EBhDisable;
|
extensionBehavior[E_GL_GOOGLE_cpp_style_line_directive] = EBhDisable;
|
||||||
@ -316,8 +318,10 @@ void TParseVersions::getPreamble(std::string& preamble)
|
|||||||
"#define GL_ARB_sparse_texture_clamp 1\n"
|
"#define GL_ARB_sparse_texture_clamp 1\n"
|
||||||
"#define GL_ARB_shader_stencil_export 1\n"
|
"#define GL_ARB_shader_stencil_export 1\n"
|
||||||
// "#define GL_ARB_cull_distance 1\n" // present for 4.5, but need extension control over block members
|
// "#define GL_ARB_cull_distance 1\n" // present for 4.5, but need extension control over block members
|
||||||
|
"#define GL_ARB_post_depth_coverage 1\n"
|
||||||
"#define GL_EXT_shader_non_constant_global_initializers 1\n"
|
"#define GL_EXT_shader_non_constant_global_initializers 1\n"
|
||||||
"#define GL_EXT_shader_image_load_formatted 1\n"
|
"#define GL_EXT_shader_image_load_formatted 1\n"
|
||||||
|
"#define GL_EXT_post_depth_coverage 1\n"
|
||||||
|
|
||||||
#ifdef AMD_EXTENSIONS
|
#ifdef AMD_EXTENSIONS
|
||||||
"#define GL_AMD_shader_ballot 1\n"
|
"#define GL_AMD_shader_ballot 1\n"
|
||||||
|
@ -135,6 +135,7 @@ const char* const E_GL_ARB_sparse_texture2 = "GL_ARB_sparse_texture
|
|||||||
const char* const E_GL_ARB_sparse_texture_clamp = "GL_ARB_sparse_texture_clamp";
|
const char* const E_GL_ARB_sparse_texture_clamp = "GL_ARB_sparse_texture_clamp";
|
||||||
const char* const E_GL_ARB_shader_stencil_export = "GL_ARB_shader_stencil_export";
|
const char* const E_GL_ARB_shader_stencil_export = "GL_ARB_shader_stencil_export";
|
||||||
// const char* const E_GL_ARB_cull_distance = "GL_ARB_cull_distance"; // present for 4.5, but need extension control over block members
|
// const char* const E_GL_ARB_cull_distance = "GL_ARB_cull_distance"; // present for 4.5, but need extension control over block members
|
||||||
|
const char* const E_GL_ARB_post_depth_coverage = "GL_ARB_post_depth_coverage";
|
||||||
|
|
||||||
const char* const E_GL_EXT_shader_non_constant_global_initializers = "GL_EXT_shader_non_constant_global_initializers";
|
const char* const E_GL_EXT_shader_non_constant_global_initializers = "GL_EXT_shader_non_constant_global_initializers";
|
||||||
const char* const E_GL_EXT_shader_image_load_formatted = "GL_EXT_shader_image_load_formatted";
|
const char* const E_GL_EXT_shader_image_load_formatted = "GL_EXT_shader_image_load_formatted";
|
||||||
@ -142,6 +143,12 @@ const char* const E_GL_EXT_shader_image_load_formatted = "GL_EXT_shader_image_lo
|
|||||||
// EXT extensions
|
// EXT extensions
|
||||||
const char* const E_GL_EXT_device_group = "GL_EXT_device_group";
|
const char* const E_GL_EXT_device_group = "GL_EXT_device_group";
|
||||||
const char* const E_GL_EXT_multiview = "GL_EXT_multiview";
|
const char* const E_GL_EXT_multiview = "GL_EXT_multiview";
|
||||||
|
const char* const E_GL_EXT_post_depth_coverage = "GL_EXT_post_depth_coverage";
|
||||||
|
|
||||||
|
// Arrays of extensions for the above viewportEXTs duplications
|
||||||
|
|
||||||
|
const char* const post_depth_coverageEXTs[] = { E_GL_ARB_post_depth_coverage, E_GL_EXT_post_depth_coverage };
|
||||||
|
const int Num_post_depth_coverageEXTs = sizeof(post_depth_coverageEXTs) / sizeof(post_depth_coverageEXTs[0]);
|
||||||
|
|
||||||
// OVR extensions
|
// OVR extensions
|
||||||
const char* const E_GL_OVR_multiview = "GL_OVR_multiview";
|
const char* const E_GL_OVR_multiview = "GL_OVR_multiview";
|
||||||
|
@ -1085,6 +1085,8 @@ void TIntermediate::output(TInfoSink& infoSink, bool tree)
|
|||||||
infoSink.debug << "gl_FragCoord origin is upper left\n";
|
infoSink.debug << "gl_FragCoord origin is upper left\n";
|
||||||
if (earlyFragmentTests)
|
if (earlyFragmentTests)
|
||||||
infoSink.debug << "using early_fragment_tests\n";
|
infoSink.debug << "using early_fragment_tests\n";
|
||||||
|
if (postDepthCoverage)
|
||||||
|
infoSink.debug << "using post_depth_coverage\n";
|
||||||
if (depthLayout != EldNone)
|
if (depthLayout != EldNone)
|
||||||
infoSink.debug << "using " << TQualifier::getLayoutDepthString(depthLayout) << "\n";
|
infoSink.debug << "using " << TQualifier::getLayoutDepthString(depthLayout) << "\n";
|
||||||
if (blendEquations != 0) {
|
if (blendEquations != 0) {
|
||||||
|
@ -101,6 +101,9 @@ void TIntermediate::merge(TInfoSink& infoSink, TIntermediate& unit)
|
|||||||
if (! earlyFragmentTests)
|
if (! earlyFragmentTests)
|
||||||
earlyFragmentTests = unit.earlyFragmentTests;
|
earlyFragmentTests = unit.earlyFragmentTests;
|
||||||
|
|
||||||
|
if (!postDepthCoverage)
|
||||||
|
postDepthCoverage = unit.postDepthCoverage;
|
||||||
|
|
||||||
if (depthLayout == EldNone)
|
if (depthLayout == EldNone)
|
||||||
depthLayout = unit.depthLayout;
|
depthLayout = unit.depthLayout;
|
||||||
else if (depthLayout != unit.depthLayout)
|
else if (depthLayout != unit.depthLayout)
|
||||||
@ -485,6 +488,11 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled)
|
|||||||
error(infoSink, "At least one shader must specify a layout(max_vertices = value)");
|
error(infoSink, "At least one shader must specify a layout(max_vertices = value)");
|
||||||
break;
|
break;
|
||||||
case EShLangFragment:
|
case EShLangFragment:
|
||||||
|
// for GL_ARB_post_depth_coverage, EarlyFragmentTest is set automatically in
|
||||||
|
// ParseHelper.cpp. So if we reach here, this must be GL_EXT_post_depth_coverage
|
||||||
|
// requiring explicit early_fragment_tests
|
||||||
|
if (getPostDepthCoverage() && !getEarlyFragmentTests())
|
||||||
|
error(infoSink, "post_depth_coverage requires early_fragment_tests");
|
||||||
break;
|
break;
|
||||||
case EShLangCompute:
|
case EShLangCompute:
|
||||||
break;
|
break;
|
||||||
|
@ -164,8 +164,8 @@ public:
|
|||||||
numEntryPoints(0), numErrors(0), numPushConstants(0), recursive(false),
|
numEntryPoints(0), numErrors(0), numPushConstants(0), recursive(false),
|
||||||
invocations(TQualifier::layoutNotSet), vertices(TQualifier::layoutNotSet), inputPrimitive(ElgNone), outputPrimitive(ElgNone),
|
invocations(TQualifier::layoutNotSet), vertices(TQualifier::layoutNotSet), inputPrimitive(ElgNone), outputPrimitive(ElgNone),
|
||||||
pixelCenterInteger(false), originUpperLeft(false),
|
pixelCenterInteger(false), originUpperLeft(false),
|
||||||
vertexSpacing(EvsNone), vertexOrder(EvoNone), pointMode(false), earlyFragmentTests(false), depthLayout(EldNone), depthReplacing(false), blendEquations(0),
|
vertexSpacing(EvsNone), vertexOrder(EvoNone), pointMode(false), earlyFragmentTests(false), postDepthCoverage(false), depthLayout(EldNone), depthReplacing(false),
|
||||||
xfbMode(false), multiStream(false),
|
blendEquations(0), xfbMode(false), multiStream(false),
|
||||||
#ifdef NV_EXTENSIONS
|
#ifdef NV_EXTENSIONS
|
||||||
layoutOverrideCoverage(false),
|
layoutOverrideCoverage(false),
|
||||||
geoPassthroughEXT(false),
|
geoPassthroughEXT(false),
|
||||||
@ -403,6 +403,8 @@ public:
|
|||||||
bool getPixelCenterInteger() const { return pixelCenterInteger; }
|
bool getPixelCenterInteger() const { return pixelCenterInteger; }
|
||||||
void setEarlyFragmentTests() { earlyFragmentTests = true; }
|
void setEarlyFragmentTests() { earlyFragmentTests = true; }
|
||||||
bool getEarlyFragmentTests() const { return earlyFragmentTests; }
|
bool getEarlyFragmentTests() const { return earlyFragmentTests; }
|
||||||
|
void setPostDepthCoverage() { postDepthCoverage = true; }
|
||||||
|
bool getPostDepthCoverage() const { return postDepthCoverage; }
|
||||||
bool setDepth(TLayoutDepth d)
|
bool setDepth(TLayoutDepth d)
|
||||||
{
|
{
|
||||||
if (depthLayout != EldNone)
|
if (depthLayout != EldNone)
|
||||||
@ -513,6 +515,7 @@ protected:
|
|||||||
int localSize[3];
|
int localSize[3];
|
||||||
int localSizeSpecId[3];
|
int localSizeSpecId[3];
|
||||||
bool earlyFragmentTests;
|
bool earlyFragmentTests;
|
||||||
|
bool postDepthCoverage;
|
||||||
TLayoutDepth depthLayout;
|
TLayoutDepth depthLayout;
|
||||||
bool depthReplacing;
|
bool depthReplacing;
|
||||||
int blendEquations; // an 'or'ing of masks of shifts of TBlendEquationShift
|
int blendEquations; // an 'or'ing of masks of shifts of TBlendEquationShift
|
||||||
|
@ -226,6 +226,8 @@ INSTANTIATE_TEST_CASE_P(
|
|||||||
"spv.aggOps.frag",
|
"spv.aggOps.frag",
|
||||||
"spv.always-discard.frag",
|
"spv.always-discard.frag",
|
||||||
"spv.always-discard2.frag",
|
"spv.always-discard2.frag",
|
||||||
|
"spv.arbPostDepthCoverage.frag",
|
||||||
|
"spv.arbPostDepthCoverage_Error.frag",
|
||||||
"spv.bitCast.frag",
|
"spv.bitCast.frag",
|
||||||
"spv.bool.vert",
|
"spv.bool.vert",
|
||||||
"spv.boolInBlock.frag",
|
"spv.boolInBlock.frag",
|
||||||
@ -242,6 +244,8 @@ INSTANTIATE_TEST_CASE_P(
|
|||||||
"spv.drawParams.vert",
|
"spv.drawParams.vert",
|
||||||
"spv.doWhileLoop.frag",
|
"spv.doWhileLoop.frag",
|
||||||
"spv.earlyReturnDiscard.frag",
|
"spv.earlyReturnDiscard.frag",
|
||||||
|
"spv.extPostDepthCoverage.frag",
|
||||||
|
"spv.extPostDepthCoverage_Error.frag",
|
||||||
"spv.flowControl.frag",
|
"spv.flowControl.frag",
|
||||||
"spv.forLoop.frag",
|
"spv.forLoop.frag",
|
||||||
"spv.forwardFun.frag",
|
"spv.forwardFun.frag",
|
||||||
|
Loading…
Reference in New Issue
Block a user