vkd3d-shader: Add way to scan for expected patch vertex count from HS.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2020-06-25 14:26:55 +02:00
parent 084a3e6928
commit 7b0345a149
4 changed files with 51 additions and 0 deletions

View File

@ -654,6 +654,10 @@ int vkd3d_shader_convert_root_signature(struct vkd3d_versioned_root_signature_de
int vkd3d_shader_scan_dxbc(const struct vkd3d_shader_code *dxbc,
struct vkd3d_shader_scan_info *scan_info);
/* If value cannot be determined, *patch_vertex_count returns 0. */
int vkd3d_shader_scan_patch_vertex_count(const struct vkd3d_shader_code *dxbc,
unsigned int *patch_vertex_count);
int vkd3d_shader_parse_input_signature(const struct vkd3d_shader_code *dxbc,
struct vkd3d_shader_signature *signature);
struct vkd3d_shader_signature_element *vkd3d_shader_find_signature_element(
@ -686,6 +690,8 @@ typedef int (*PFN_vkd3d_shader_convert_root_signature)(struct vkd3d_versioned_ro
typedef int (*PFN_vkd3d_shader_scan_dxbc)(const struct vkd3d_shader_code *dxbc,
struct vkd3d_shader_scan_info *scan_info);
typedef int (*PFN_vkd3d_shader_scan_patch_vertex_count)(const struct vkd3d_shader_code *dxbc,
unsigned int *patch_vertex_count);
typedef int (*PFN_vkd3d_shader_parse_input_signature)(const struct vkd3d_shader_code *dxbc,
struct vkd3d_shader_signature *signature);

View File

@ -11,3 +11,4 @@ EXPORTS
vkd3d_shader_scan_dxbc
vkd3d_shader_serialize_root_signature
vkd3d_shader_supports_dxil
vkd3d_shader_scan_patch_vertex_count

View File

@ -12,6 +12,7 @@ global:
vkd3d_shader_scan_dxbc;
vkd3d_shader_serialize_root_signature;
vkd3d_shader_supports_dxil;
vkd3d_shader_scan_patch_vertex_count;
local: *;
};

View File

@ -309,6 +309,49 @@ static void vkd3d_shader_scan_instruction(struct vkd3d_shader_scan_info *scan_in
vkd3d_shader_scan_record_uav_counter(scan_info, &instruction->src[0].reg);
}
int vkd3d_shader_scan_patch_vertex_count(const struct vkd3d_shader_code *dxbc,
unsigned int *patch_vertex_count)
{
struct vkd3d_shader_instruction instruction;
struct vkd3d_shader_parser parser;
int ret;
if (shader_is_dxil(dxbc->code, dxbc->size))
{
/* TODO */
*patch_vertex_count = 0;
return VKD3D_OK;
}
else
{
if ((ret = vkd3d_shader_parser_init(&parser, dxbc)) < 0)
return ret;
*patch_vertex_count = 0;
while (!shader_sm4_is_end(parser.data, &parser.ptr))
{
shader_sm4_read_instruction(parser.data, &parser.ptr, &instruction);
if (instruction.handler_idx == VKD3DSIH_INVALID)
{
WARN("Encountered unrecognized or invalid instruction.\n");
vkd3d_shader_parser_destroy(&parser);
return VKD3D_ERROR_INVALID_ARGUMENT;
}
if (instruction.handler_idx == VKD3DSIH_DCL_INPUT_CONTROL_POINT_COUNT)
{
*patch_vertex_count = instruction.declaration.count;
break;
}
}
vkd3d_shader_parser_destroy(&parser);
return VKD3D_OK;
}
}
int vkd3d_shader_scan_dxbc(const struct vkd3d_shader_code *dxbc,
struct vkd3d_shader_scan_info *scan_info)
{