From 2ca9210a08df7c0b237023a1b449fd0cd68fd875 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Mon, 9 May 2022 19:46:31 +0200 Subject: [PATCH] vkd3d: Expose utility for creating root signature from raw blob. Signed-off-by: Hans-Kristian Arntzen --- libs/vkd3d/state.c | 36 +++++++++++++++++++++++++++++++----- libs/vkd3d/vkd3d_main.c | 30 ++++++++++++++++++++++++------ libs/vkd3d/vkd3d_private.h | 4 ++++ 3 files changed, 59 insertions(+), 11 deletions(-) diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c index 6fd4ee51..88b12611 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c @@ -1496,8 +1496,9 @@ HRESULT d3d12_root_signature_create_empty(struct d3d12_device *device, return S_OK; } -HRESULT d3d12_root_signature_create(struct d3d12_device *device, - const void *bytecode, size_t bytecode_length, struct d3d12_root_signature **root_signature) +static HRESULT d3d12_root_signature_create_from_blob(struct d3d12_device *device, + const void *bytecode, size_t bytecode_length, bool raw_payload, + struct d3d12_root_signature **root_signature) { const struct vkd3d_shader_code dxbc = {bytecode, bytecode_length}; union @@ -1509,10 +1510,21 @@ HRESULT d3d12_root_signature_create(struct d3d12_device *device, HRESULT hr; int ret; - if ((ret = vkd3d_parse_root_signature_v_1_1(&dxbc, &root_signature_desc.vkd3d)) < 0) + if (raw_payload) { - WARN("Failed to parse root signature, vkd3d result %d.\n", ret); - return hresult_from_vkd3d_result(ret); + if ((ret = vkd3d_parse_root_signature_v_1_1_from_raw_payload(&dxbc, &root_signature_desc.vkd3d))) + { + WARN("Failed to parse root signature, vkd3d result %d.\n", ret); + return hresult_from_vkd3d_result(ret); + } + } + else + { + if ((ret = vkd3d_parse_root_signature_v_1_1(&dxbc, &root_signature_desc.vkd3d)) < 0) + { + WARN("Failed to parse root signature, vkd3d result %d.\n", ret); + return hresult_from_vkd3d_result(ret); + } } if (!(object = vkd3d_malloc(sizeof(*object)))) @@ -1541,6 +1553,20 @@ HRESULT d3d12_root_signature_create(struct d3d12_device *device, return S_OK; } +HRESULT d3d12_root_signature_create(struct d3d12_device *device, + const void *bytecode, size_t bytecode_length, + struct d3d12_root_signature **root_signature) +{ + return d3d12_root_signature_create_from_blob(device, bytecode, bytecode_length, false, root_signature); +} + +HRESULT d3d12_root_signature_create_raw(struct d3d12_device *device, + const void *payload, size_t payload_length, + struct d3d12_root_signature **root_signature) +{ + return d3d12_root_signature_create_from_blob(device, payload, payload_length, true, root_signature); +} + unsigned int d3d12_root_signature_get_shader_interface_flags(const struct d3d12_root_signature *root_signature) { unsigned int flags = 0; diff --git a/libs/vkd3d/vkd3d_main.c b/libs/vkd3d/vkd3d_main.c index bc804a95..9052a06b 100644 --- a/libs/vkd3d/vkd3d_main.c +++ b/libs/vkd3d/vkd3d_main.c @@ -165,15 +165,27 @@ static CONST_VTBL struct ID3D12RootSignatureDeserializerVtbl d3d12_root_signatur static int vkd3d_parse_root_signature_for_version(const struct vkd3d_shader_code *dxbc, struct vkd3d_versioned_root_signature_desc *out_desc, - enum vkd3d_root_signature_version target_version) + enum vkd3d_root_signature_version target_version, + bool raw_payload) { struct vkd3d_versioned_root_signature_desc desc, converted_desc; int ret; - if ((ret = vkd3d_shader_parse_root_signature(dxbc, &desc)) < 0) + if (raw_payload) { - WARN("Failed to parse root signature, vkd3d result %d.\n", ret); - return ret; + if ((ret = vkd3d_shader_parse_root_signature_raw(dxbc->code, dxbc->size, &desc)) < 0) + { + WARN("Failed to parse root signature, vkd3d result %d.\n", ret); + return ret; + } + } + else + { + if ((ret = vkd3d_shader_parse_root_signature(dxbc, &desc)) < 0) + { + WARN("Failed to parse root signature, vkd3d result %d.\n", ret); + return ret; + } } if (desc.version == target_version) @@ -199,13 +211,19 @@ static int vkd3d_parse_root_signature_for_version(const struct vkd3d_shader_code int vkd3d_parse_root_signature_v_1_0(const struct vkd3d_shader_code *dxbc, struct vkd3d_versioned_root_signature_desc *out_desc) { - return vkd3d_parse_root_signature_for_version(dxbc, out_desc, VKD3D_ROOT_SIGNATURE_VERSION_1_0); + return vkd3d_parse_root_signature_for_version(dxbc, out_desc, VKD3D_ROOT_SIGNATURE_VERSION_1_0, false); } int vkd3d_parse_root_signature_v_1_1(const struct vkd3d_shader_code *dxbc, struct vkd3d_versioned_root_signature_desc *out_desc) { - return vkd3d_parse_root_signature_for_version(dxbc, out_desc, VKD3D_ROOT_SIGNATURE_VERSION_1_1); + return vkd3d_parse_root_signature_for_version(dxbc, out_desc, VKD3D_ROOT_SIGNATURE_VERSION_1_1, false); +} + +int vkd3d_parse_root_signature_v_1_1_from_raw_payload(const struct vkd3d_shader_code *dxbc, + struct vkd3d_versioned_root_signature_desc *out_desc) +{ + return vkd3d_parse_root_signature_for_version(dxbc, out_desc, VKD3D_ROOT_SIGNATURE_VERSION_1_1, true); } static HRESULT d3d12_root_signature_deserializer_init(struct d3d12_root_signature_deserializer *deserializer, diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 1ed5cac6..e7fc756c 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -1397,6 +1397,8 @@ struct d3d12_root_signature HRESULT d3d12_root_signature_create(struct d3d12_device *device, const void *bytecode, size_t bytecode_length, struct d3d12_root_signature **root_signature); +HRESULT d3d12_root_signature_create_raw(struct d3d12_device *device, const void *payload, + size_t payload_size, struct d3d12_root_signature **root_signature); HRESULT d3d12_root_signature_create_empty(struct d3d12_device *device, struct d3d12_root_signature **root_signature); /* Private ref counts, for pipeline library. */ @@ -1424,6 +1426,8 @@ int vkd3d_parse_root_signature_v_1_0(const struct vkd3d_shader_code *dxbc, struct vkd3d_versioned_root_signature_desc *desc); int vkd3d_parse_root_signature_v_1_1(const struct vkd3d_shader_code *dxbc, struct vkd3d_versioned_root_signature_desc *desc); +int vkd3d_parse_root_signature_v_1_1_from_raw_payload(const struct vkd3d_shader_code *dxbc, + struct vkd3d_versioned_root_signature_desc *desc); VkShaderStageFlags vkd3d_vk_stage_flags_from_visibility(D3D12_SHADER_VISIBILITY visibility); enum vkd3d_shader_visibility vkd3d_shader_visibility_from_d3d12(D3D12_SHADER_VISIBILITY visibility);