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;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT d3d12_root_signature_create(struct d3d12_device *device,
|
static HRESULT d3d12_root_signature_create_from_blob(struct d3d12_device *device,
|
||||||
const void *bytecode, size_t bytecode_length, struct d3d12_root_signature **root_signature)
|
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};
|
const struct vkd3d_shader_code dxbc = {bytecode, bytecode_length};
|
||||||
union
|
union
|
||||||
|
@ -1509,10 +1510,21 @@ HRESULT d3d12_root_signature_create(struct d3d12_device *device,
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
int ret;
|
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);
|
if ((ret = vkd3d_parse_root_signature_v_1_1_from_raw_payload(&dxbc, &root_signature_desc.vkd3d)))
|
||||||
return hresult_from_vkd3d_result(ret);
|
{
|
||||||
|
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))))
|
if (!(object = vkd3d_malloc(sizeof(*object))))
|
||||||
|
@ -1541,6 +1553,20 @@ HRESULT d3d12_root_signature_create(struct d3d12_device *device,
|
||||||
return S_OK;
|
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 d3d12_root_signature_get_shader_interface_flags(const struct d3d12_root_signature *root_signature)
|
||||||
{
|
{
|
||||||
unsigned int flags = 0;
|
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,
|
static int vkd3d_parse_root_signature_for_version(const struct vkd3d_shader_code *dxbc,
|
||||||
struct vkd3d_versioned_root_signature_desc *out_desc,
|
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;
|
struct vkd3d_versioned_root_signature_desc desc, converted_desc;
|
||||||
int ret;
|
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);
|
if ((ret = vkd3d_shader_parse_root_signature_raw(dxbc->code, dxbc->size, &desc)) < 0)
|
||||||
return ret;
|
{
|
||||||
|
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)
|
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,
|
int vkd3d_parse_root_signature_v_1_0(const struct vkd3d_shader_code *dxbc,
|
||||||
struct vkd3d_versioned_root_signature_desc *out_desc)
|
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,
|
int vkd3d_parse_root_signature_v_1_1(const struct vkd3d_shader_code *dxbc,
|
||||||
struct vkd3d_versioned_root_signature_desc *out_desc)
|
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,
|
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,
|
HRESULT d3d12_root_signature_create(struct d3d12_device *device, const void *bytecode,
|
||||||
size_t bytecode_length, struct d3d12_root_signature **root_signature);
|
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,
|
HRESULT d3d12_root_signature_create_empty(struct d3d12_device *device,
|
||||||
struct d3d12_root_signature **root_signature);
|
struct d3d12_root_signature **root_signature);
|
||||||
/* Private ref counts, for pipeline library. */
|
/* 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);
|
struct vkd3d_versioned_root_signature_desc *desc);
|
||||||
int vkd3d_parse_root_signature_v_1_1(const struct vkd3d_shader_code *dxbc,
|
int vkd3d_parse_root_signature_v_1_1(const struct vkd3d_shader_code *dxbc,
|
||||||
struct vkd3d_versioned_root_signature_desc *desc);
|
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);
|
VkShaderStageFlags vkd3d_vk_stage_flags_from_visibility(D3D12_SHADER_VISIBILITY visibility);
|
||||||
enum vkd3d_shader_visibility vkd3d_shader_visibility_from_d3d12(D3D12_SHADER_VISIBILITY visibility);
|
enum vkd3d_shader_visibility vkd3d_shader_visibility_from_d3d12(D3D12_SHADER_VISIBILITY visibility);
|
||||||
|
|
Loading…
Reference in New Issue