From ecb2480b822cefd70e2177c72e8cc98c39553efb Mon Sep 17 00:00:00 2001 From: Mark Date: Tue, 14 Jul 2026 15:23:14 +0300 Subject: [PATCH] fix(dx12): match indirect descriptor ABI size --- hal/dx12/d3d12/types.go | 6 +++++- hal/dx12/d3d12/types_test.go | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 hal/dx12/d3d12/types_test.go diff --git a/hal/dx12/d3d12/types.go b/hal/dx12/d3d12/types.go index 62055fb..504b56b 100644 --- a/hal/dx12/d3d12/types.go +++ b/hal/dx12/d3d12/types.go @@ -597,7 +597,11 @@ type D3D12_COMMAND_SIGNATURE_DESC struct { type D3D12_INDIRECT_ARGUMENT_DESC struct { Type D3D12_INDIRECT_ARGUMENT_TYPE // Union for different argument types - Union [8]byte + // The largest member (D3D12_INDIRECT_ARGUMENT_DESC_CONSTANT) is three + // uint32 values, so the C union occupies 12 bytes and the full descriptor + // is 16 bytes including Type. Keeping the exact size matters because + // CreateCommandSignature reads the native descriptor layout directly. + Union [12]byte } // D3D12_DISCARD_REGION describes a discard region. diff --git a/hal/dx12/d3d12/types_test.go b/hal/dx12/d3d12/types_test.go new file mode 100644 index 0000000..16d5052 --- /dev/null +++ b/hal/dx12/d3d12/types_test.go @@ -0,0 +1,17 @@ +//go:build windows && !(js && wasm) + +package d3d12 + +import ( + "testing" + "unsafe" +) + +func TestIndirectArgumentDescABI(t *testing.T) { + if got := unsafe.Sizeof(D3D12_INDIRECT_ARGUMENT_DESC{}); got != 16 { + t.Fatalf("D3D12_INDIRECT_ARGUMENT_DESC size = %d, want 16", got) + } + if got := unsafe.Offsetof(D3D12_INDIRECT_ARGUMENT_DESC{}.Union); got != 4 { + t.Fatalf("D3D12_INDIRECT_ARGUMENT_DESC.Union offset = %d, want 4", got) + } +}