Otherwise if the input is located above position 0 in the private array it will be swizzled incorrectly, e.g. a.yz instead of a.xy in test_domain_shader_inputs().
Based on a vkd3d-proton patch by Hans-Kristian Arntzen.
Signed-off-by: Conor McCarthy cmccarthy@codeweavers.com --- libs/vkd3d-shader/spirv.c | 4 ++-- tests/d3d12.c | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 579d1362..f7e2a857 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -4626,8 +4626,8 @@ static uint32_t vkd3d_dxbc_compiler_emit_input(struct vkd3d_dxbc_compiler *compi }
val_id = vkd3d_dxbc_compiler_emit_swizzle(compiler, val_id, - vkd3d_write_mask_from_component_count(input_component_count) << component_idx, - VKD3D_SHADER_COMPONENT_FLOAT, VKD3D_SHADER_NO_SWIZZLE, dst->write_mask); + vkd3d_write_mask_from_component_count(input_component_count), + VKD3D_SHADER_COMPONENT_FLOAT, VKD3D_SHADER_NO_SWIZZLE, dst->write_mask >> component_idx);
vkd3d_dxbc_compiler_emit_store_reg(compiler, &dst_reg, dst->write_mask, val_id); } diff --git a/tests/d3d12.c b/tests/d3d12.c index 8551ea43..505d3200 100644 --- a/tests/d3d12.c +++ b/tests/d3d12.c @@ -29131,7 +29131,6 @@ static void test_domain_shader_inputs(void) {1.0f, 2.0f, 0.0f, 0.5f, 2.5f, 8.0f, 2.0f, 1.0f}, {1.0f, 2.0f, 1.0f, 0.5f, 2.5f, 8.0f, 2.0f, 1.0f}, }; - static const unsigned int is_todo[4] = {0x00110000, 0x00110000, 0x00110000, 0x00110000}; static const unsigned int stride = sizeof(reference[0]);
memset(&desc, 0, sizeof(desc)); @@ -29181,7 +29180,6 @@ static void test_domain_shader_inputs(void) float *elems = get_readback_data(&rb, y, 0, 0, stride); for (x = 0; x < 8; ++x) { - todo_if(is_todo[y] & (1u << (x * 4))) ok(compare_float(reference[y][x], elems[x], 0), "Got unexpected value %f for [%u][%u], expected %f.\n", elems[x], y, x, reference[y][x]); }