From 788556aaaab1b5767e24cf86dc2f71fd285c06f5 Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Wed, 19 Feb 2020 14:36:44 -0800 Subject: Don't allocate a default space for a VK push-constant buffer (#1231) When a shader only uses `ParameterBlock`s plus a single buffer for root constants: ```hlsl ParameterBlock a; ParameterBlock b; [[vk::push_constant]] cbuffer Stuff { ... } ``` we expect the push-constant buffer should not affect the `space` allocated to the parameter blocks (so `a` should get `space=0`). This behavior wasn't being implemented correctly in `slang-parameter-binding.cpp`. There was logic to ignore certain resource kinds in entry-point parameter lists when computing whether a default space is needed, but the equivalent logic for the global scope only considered parameters that consuem whole register spaces/sets. This change shuffles the code around and makes sure it considers a global push-constant buffer as *not* needing a default space/set. Note that this change will have no impact on D3D targets, where `Stuff` above would always get put in `space0` because for D3D targets a push-constant buffer is no different from any other constant buffer in terms of register/space allocation. One unrelated point that this change brings to mind is the `[[vk::push_constant]]` should ideally also be allowed to apply to an entry point (where it would modify the default/implicit constant buffer). In fact, it could be argued that push-constant allocation should be the *default* for (non-RT) entry point `uniform` parameters (while `[[vk::shader_record]]` should be the default for RT entry point `uniform` parameters). --- tests/cross-compile/vk-push-constant-set.slang | 23 ++++++++++++++++++ .../cross-compile/vk-push-constant-set.slang.glsl | 28 ++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 tests/cross-compile/vk-push-constant-set.slang create mode 100644 tests/cross-compile/vk-push-constant-set.slang.glsl (limited to 'tests') diff --git a/tests/cross-compile/vk-push-constant-set.slang b/tests/cross-compile/vk-push-constant-set.slang new file mode 100644 index 000000000..ee9c68ed8 --- /dev/null +++ b/tests/cross-compile/vk-push-constant-set.slang @@ -0,0 +1,23 @@ +// vk-push-constant.slang + +// Test to confirm that a `[[vk::push_constant]]` buffer +// doesn't end up reserving `space=0` for global scope +// parameters and shifting a parameer block over to +// `space=1`. + +//TEST:CROSS_COMPILE:-target spirv-assembly -entry main -stage fragment + +struct S +{ + float4 v; +} + +[[vk::push_constant]] +ConstantBuffer x; + +ParameterBlock y; + +float4 main() : SV_Target +{ + return x.v + y.v; +} diff --git a/tests/cross-compile/vk-push-constant-set.slang.glsl b/tests/cross-compile/vk-push-constant-set.slang.glsl new file mode 100644 index 000000000..189b14caf --- /dev/null +++ b/tests/cross-compile/vk-push-constant-set.slang.glsl @@ -0,0 +1,28 @@ +// vk-push-constant.slang.glsl +#version 450 + +struct S_0 +{ + vec4 v_0; +}; + +layout(push_constant) +layout(std140) uniform _S1 +{ + S_0 _data; +} x_0; + +layout(binding = 0, set = 0) +layout(std140) uniform _S2 +{ + S_0 _data; +} y_0; + +layout(location = 0) +out vec4 _S3; + +void main() +{ + _S3 = x_0._data.v_0 + y_0._data.v_0; + return; +} -- cgit v1.2.3