diff options
| -rw-r--r-- | slang.h | 5 | ||||
| -rw-r--r-- | source/slang/type-layout.cpp | 21 | ||||
| -rw-r--r-- | tests/reflection/parameter-block.slang | 2 | ||||
| -rw-r--r-- | tests/reflection/parameter-block.slang.1.expected | 54 | ||||
| -rw-r--r-- | tests/reflection/parameter-block.slang.2.expected | 51 |
5 files changed, 129 insertions, 4 deletions
@@ -446,7 +446,10 @@ extern "C" enum { /* When compiling for a D3D Shader Model 5.1 or higher target, allocate - distinct register spaces for parameter blocks. */ + distinct register spaces for parameter blocks. + + @deprecated This behavior is now enabled unconditionally. + */ SLANG_TARGET_FLAG_PARAMETER_BLOCKS_USE_REGISTER_SPACES = 1 << 4, }; diff --git a/source/slang/type-layout.cpp b/source/slang/type-layout.cpp index 7fc6320cc..41476a7e5 100644 --- a/source/slang/type-layout.cpp +++ b/source/slang/type-layout.cpp @@ -868,6 +868,22 @@ static bool isSM5OrEarlier(TargetRequest* targetReq) return false; } +static bool isSM5_1OrLater(TargetRequest* targetReq) +{ + if(!isD3DTarget(targetReq)) + return false; + + auto profile = targetReq->targetProfile; + + if(profile.getFamily() == ProfileFamily::DX) + { + if(profile.GetVersion() >= ProfileVersion::DX_5_1) + return true; + } + + return false; +} + static bool isVulkanTarget(TargetRequest* targetReq) { switch( targetReq->target ) @@ -907,10 +923,9 @@ static bool shouldAllocateRegisterSpaceForParameterBlock( // are generating code for D3D12, and using SM5.1 or later. // We will use a register space for parameter blocks *if* // the target options tell us to: - if( isD3D12Target(targetReq) ) + if( isD3D12Target(targetReq) && isSM5_1OrLater(targetReq) ) { - if(targetReq->targetFlags & SLANG_TARGET_FLAG_PARAMETER_BLOCKS_USE_REGISTER_SPACES) - return true; + return true; } return false; diff --git a/tests/reflection/parameter-block.slang b/tests/reflection/parameter-block.slang index 5fbcbb959..5c91ed339 100644 --- a/tests/reflection/parameter-block.slang +++ b/tests/reflection/parameter-block.slang @@ -1,4 +1,6 @@ //TEST:REFLECTION:-stage fragment -target glsl +//TEST:REFLECTION:-stage fragment -target hlsl -profile sm_5_0 +//TEST:REFLECTION:-stage fragment -target hlsl -profile sm_5_1 // Confirm that we do parameter binding correctly // when we have both a parameter block *and* user-defined diff --git a/tests/reflection/parameter-block.slang.1.expected b/tests/reflection/parameter-block.slang.1.expected new file mode 100644 index 000000000..bbd52a784 --- /dev/null +++ b/tests/reflection/parameter-block.slang.1.expected @@ -0,0 +1,54 @@ +result code = 0 +standard error = { +} +standard output = { +{ + "parameters": [ + { + "name": "a", + "bindings": [ + {"kind": "shaderResource", "index": 0}, + {"kind": "samplerState", "index": 0} + ], + "type": { + "kind": "parameterBlock", + "elementType": { + "kind": "struct", + "name": "Helper", + "fields": [ + { + "name": "t", + "type": { + "kind": "resource", + "baseShape": "texture2D" + }, + "binding": {"kind": "shaderResource", "index": 0} + }, + { + "name": "s", + "type": { + "kind": "samplerState" + }, + "binding": {"kind": "samplerState", "index": 0} + } + ] + } + } + }, + { + "name": "b", + "binding": {"kind": "shaderResource", "index": 1}, + "type": { + "kind": "resource", + "baseShape": "texture2D" + } + } + ], + "entryPoints": [ + { + "name": "main", + "stage:": "fragment" + } + ] +} +} diff --git a/tests/reflection/parameter-block.slang.2.expected b/tests/reflection/parameter-block.slang.2.expected new file mode 100644 index 000000000..e692718e8 --- /dev/null +++ b/tests/reflection/parameter-block.slang.2.expected @@ -0,0 +1,51 @@ +result code = 0 +standard error = { +} +standard output = { +{ + "parameters": [ + { + "name": "a", + "binding": {"kind": "registerSpace", "index": 1}, + "type": { + "kind": "parameterBlock", + "elementType": { + "kind": "struct", + "name": "Helper", + "fields": [ + { + "name": "t", + "type": { + "kind": "resource", + "baseShape": "texture2D" + }, + "binding": {"kind": "shaderResource", "index": 0} + }, + { + "name": "s", + "type": { + "kind": "samplerState" + }, + "binding": {"kind": "samplerState", "index": 0} + } + ] + } + } + }, + { + "name": "b", + "binding": {"kind": "shaderResource", "index": 0}, + "type": { + "kind": "resource", + "baseShape": "texture2D" + } + } + ], + "entryPoints": [ + { + "name": "main", + "stage:": "fragment" + } + ] +} +} |
