From 7f377879fc526dfb69966ed1672d3036e807235c Mon Sep 17 00:00:00 2001 From: Giovanni Mascellani Date: Wed, 12 Nov 2025 13:43:59 +0100 Subject: [PATCH] vkd3d-shader/spirv: Clamp push constant CBV sizes to those of the push constant ranges backing them. Otherwise invalid SPIR-V may be generated, because the CBV field in "push_cb_struct" may end up overlapping with a subsequent one. --- libs/vkd3d-shader/spirv.c | 13 +++++++++---- libs/vkd3d-shader/vkd3d_shader_private.h | 1 + tests/hlsl/descriptors.shader_test | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 5ebbefe5f..2f5dbe8c0 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -6668,13 +6668,18 @@ static void spirv_compiler_emit_cbv_declaration(struct spirv_compiler *compiler, /* Push constant buffers are handled in * spirv_compiler_emit_push_constant_buffers(). */ - push_cb->reg = reg; - push_cb->size = size; if (size_in_bytes > push_cb->pc.size) { - WARN("Constant buffer size %u exceeds push constant size %u.\n", - size_in_bytes, push_cb->pc.size); + spirv_compiler_warning(compiler, VKD3D_SHADER_WARNING_SPV_INVALID_SIZE, + "Constant buffer cb%u, space %u, has size %u which exceeds the push constant size %u.", + push_cb->pc.register_index, push_cb->pc.register_space, size_in_bytes, push_cb->pc.size); + size_in_bytes = push_cb->pc.size; + size = align(size_in_bytes, VKD3D_VEC4_SIZE * sizeof(uint32_t)); + size /= VKD3D_VEC4_SIZE * sizeof(uint32_t); } + + push_cb->reg = reg; + push_cb->size = size; return; } diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 6802f4ed2..524aa5e6c 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -110,6 +110,7 @@ enum vkd3d_shader_error VKD3D_SHADER_WARNING_SPV_INVALID_SWIZZLE = 2300, VKD3D_SHADER_WARNING_SPV_INVALID_UAV_FLAGS = 2301, VKD3D_SHADER_WARNING_SPV_IGNORING_FLAG = 2302, + VKD3D_SHADER_WARNING_SPV_INVALID_SIZE = 2303, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY = 3000, VKD3D_SHADER_ERROR_RS_INVALID_VERSION = 3001, diff --git a/tests/hlsl/descriptors.shader_test b/tests/hlsl/descriptors.shader_test index 033125523..3c8541259 100644 --- a/tests/hlsl/descriptors.shader_test +++ b/tests/hlsl/descriptors.shader_test @@ -22,7 +22,7 @@ float4 main() : SV_Target [test] uniform 0 float4 1.0 2.0 3.0 4.0 -todo(d3d12 & !windows & !mvk) draw quad +draw quad probe (0, 0) f32(2.0, 3.0, 4.0, 5.0) [require]