vkd3d: Expose utility for creating root signature from raw blob.
Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
parent
83a84fba23
commit
2ca9210a08
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue