Add type checks for hitObjectNV (#3689)
`VK_NV_ray_tracing_invocation_reorder` extension introduces `hitObjectNV`, a special opaque type
that can only be declared without storage qualifiers in either global or function scope.
Added checks/tests to enforce this constraint.
References:
https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_NV_ray_tracing_invocation_reorder.html
3e0d9a3b3f/extensions/nv/GLSL_NV_shader_invocation_reorder.txt (L180)
Co-authored-by: Tianyun <tianyuny@nvidia.com>
This commit is contained in:
parent
5398d55e33
commit
7c4d91e781
5 changed files with 48 additions and 0 deletions
9
Test/baseResults/spv.nv.hitobject-errors.rgen.out
Normal file
9
Test/baseResults/spv.nv.hitobject-errors.rgen.out
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
spv.nv.hitobject-errors.rgen
|
||||||
|
ERROR: 0:7: 'hitObjectNV' : hitObjectNV can only be declared in global or function scope with no storage qualifier: uHitObj
|
||||||
|
ERROR: 0:9: 'hitObjectNV' : hitObjectNV can only be declared in global or function scope with no storage qualifier: hobjIn
|
||||||
|
ERROR: 0:10: 'hitObjectNV' : hitObjectNV can only be declared in global or function scope with no storage qualifier: hobjOut
|
||||||
|
ERROR: 0:21: 'hObjWrapper' : struct is not allowed to contain hitObjectNV: wrapper
|
||||||
|
ERROR: 4 compilation errors. No code generated.
|
||||||
|
|
||||||
|
|
||||||
|
SPIR-V is not generated for failed compile or link
|
||||||
24
Test/spv.nv.hitobject-errors.rgen
Normal file
24
Test/spv.nv.hitobject-errors.rgen
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
#version 460
|
||||||
|
#extension GL_EXT_ray_tracing : enable
|
||||||
|
#extension GL_NV_shader_invocation_reorder : enable
|
||||||
|
|
||||||
|
|
||||||
|
hitObjectNV hObjGlob; // OK
|
||||||
|
uniform hitObjectNV uHitObj; // ERROR
|
||||||
|
|
||||||
|
layout(location=0) in hitObjectNV hobjIn; // ERROR
|
||||||
|
out hitObjectNV hobjOut; // ERROR
|
||||||
|
|
||||||
|
struct hObjWrapper{
|
||||||
|
hitObjectNV objField;
|
||||||
|
vec3 v;
|
||||||
|
};
|
||||||
|
|
||||||
|
void foo(hitObjectNV hObjArg) {} // OK
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
hObjWrapper wrapper; // ERROR
|
||||||
|
hitObjectNV localHitObj; // OK
|
||||||
|
foo(localHitObj); // OK
|
||||||
|
}
|
||||||
|
|
@ -3936,6 +3936,18 @@ void TParseContext::accStructCheck(const TSourceLoc& loc, const TType& type, con
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TParseContext::hitObjectNVCheck(const TSourceLoc & loc, const TType & type, const TString & identifier)
|
||||||
|
{
|
||||||
|
if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtHitObjectNV)) {
|
||||||
|
error(loc, "struct is not allowed to contain hitObjectNV:", type.getTypeName().c_str(), identifier.c_str());
|
||||||
|
} else if (type.getBasicType() == EbtHitObjectNV) {
|
||||||
|
TStorageQualifier qualifier = type.getQualifier().storage;
|
||||||
|
if (qualifier != EvqGlobal && qualifier != EvqTemporary) {
|
||||||
|
error(loc, "hitObjectNV can only be declared in global or function scope with no storage qualifier:", "hitObjectNV", identifier.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void TParseContext::transparentOpaqueCheck(const TSourceLoc& loc, const TType& type, const TString& identifier)
|
void TParseContext::transparentOpaqueCheck(const TSourceLoc& loc, const TType& type, const TString& identifier)
|
||||||
{
|
{
|
||||||
if (parsingBuiltins)
|
if (parsingBuiltins)
|
||||||
|
|
@ -7875,6 +7887,7 @@ TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& iden
|
||||||
transparentOpaqueCheck(loc, type, identifier);
|
transparentOpaqueCheck(loc, type, identifier);
|
||||||
atomicUintCheck(loc, type, identifier);
|
atomicUintCheck(loc, type, identifier);
|
||||||
accStructCheck(loc, type, identifier);
|
accStructCheck(loc, type, identifier);
|
||||||
|
hitObjectNVCheck(loc, type, identifier);
|
||||||
checkAndResizeMeshViewDim(loc, type, /*isBlockMember*/ false);
|
checkAndResizeMeshViewDim(loc, type, /*isBlockMember*/ false);
|
||||||
if (type.getQualifier().storage == EvqConst && type.containsReference()) {
|
if (type.getQualifier().storage == EvqConst && type.containsReference()) {
|
||||||
error(loc, "variables with reference type can't have qualifier 'const'", "qualifier", "");
|
error(loc, "variables with reference type can't have qualifier 'const'", "qualifier", "");
|
||||||
|
|
|
||||||
|
|
@ -397,6 +397,7 @@ public:
|
||||||
void samplerCheck(const TSourceLoc&, const TType&, const TString& identifier, TIntermTyped* initializer);
|
void samplerCheck(const TSourceLoc&, const TType&, const TString& identifier, TIntermTyped* initializer);
|
||||||
void atomicUintCheck(const TSourceLoc&, const TType&, const TString& identifier);
|
void atomicUintCheck(const TSourceLoc&, const TType&, const TString& identifier);
|
||||||
void accStructCheck(const TSourceLoc & loc, const TType & type, const TString & identifier);
|
void accStructCheck(const TSourceLoc & loc, const TType & type, const TString & identifier);
|
||||||
|
void hitObjectNVCheck(const TSourceLoc & loc, const TType & type, const TString & identifier);
|
||||||
void transparentOpaqueCheck(const TSourceLoc&, const TType&, const TString& identifier);
|
void transparentOpaqueCheck(const TSourceLoc&, const TType&, const TString& identifier);
|
||||||
void memberQualifierCheck(glslang::TPublicType&);
|
void memberQualifierCheck(glslang::TPublicType&);
|
||||||
void globalQualifierFixCheck(const TSourceLoc&, TQualifier&, bool isMemberCheck = false, const TPublicType* publicType = nullptr);
|
void globalQualifierFixCheck(const TSourceLoc&, TQualifier&, bool isMemberCheck = false, const TPublicType* publicType = nullptr);
|
||||||
|
|
|
||||||
|
|
@ -710,6 +710,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||||
|
|
||||||
// SPV_NV_shader_execution_reorder
|
// SPV_NV_shader_execution_reorder
|
||||||
|
|
||||||
|
"spv.nv.hitobject-errors.rgen",
|
||||||
"spv.nv.hitobject-allops.rgen",
|
"spv.nv.hitobject-allops.rgen",
|
||||||
"spv.nv.hitobject-allops.rchit",
|
"spv.nv.hitobject-allops.rchit",
|
||||||
"spv.nv.hitobject-allops.rmiss",
|
"spv.nv.hitobject-allops.rmiss",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue