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:
parent
084a3e6928
commit
7b0345a149
|
@ -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);
|
||||
|
|
|
@ -11,3 +11,4 @@ EXPORTS
|
|||
vkd3d_shader_scan_dxbc
|
||||
vkd3d_shader_serialize_root_signature
|
||||
vkd3d_shader_supports_dxil
|
||||
vkd3d_shader_scan_patch_vertex_count
|
||||
|
|
|
@ -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: *;
|
||||
};
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue