vkd3d-shader: Add helper to parse output signature.
Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
parent
1d51818d8f
commit
a4b082a828
|
@ -736,6 +736,8 @@ int vkd3d_shader_scan_dxbc(const struct vkd3d_shader_code *dxbc,
|
|||
|
||||
int vkd3d_shader_parse_input_signature(const struct vkd3d_shader_code *dxbc,
|
||||
struct vkd3d_shader_signature *signature);
|
||||
int vkd3d_shader_parse_output_signature(const struct vkd3d_shader_code *dxbc,
|
||||
struct vkd3d_shader_signature *signature);
|
||||
struct vkd3d_shader_signature_element *vkd3d_shader_find_signature_element(
|
||||
const struct vkd3d_shader_signature *signature, const char *semantic_name,
|
||||
unsigned int semantic_index, unsigned int stream_index);
|
||||
|
|
|
@ -2249,6 +2249,21 @@ static int isgn_handler(const char *data, DWORD data_size, DWORD tag, void *ctx)
|
|||
return shader_parse_signature(tag, data, data_size, is);
|
||||
}
|
||||
|
||||
static int osgn_handler(const char *data, DWORD data_size, DWORD tag, void *ctx)
|
||||
{
|
||||
struct vkd3d_shader_signature *is = ctx;
|
||||
|
||||
if (tag != TAG_OSGN && tag != TAG_OSG1)
|
||||
return VKD3D_OK;
|
||||
|
||||
if (is->elements)
|
||||
{
|
||||
FIXME("Multiple input signatures.\n");
|
||||
vkd3d_shader_free_shader_signature(is);
|
||||
}
|
||||
return shader_parse_signature(tag, data, data_size, is);
|
||||
}
|
||||
|
||||
int shader_parse_input_signature(const void *dxbc, size_t dxbc_length,
|
||||
struct vkd3d_shader_signature *signature)
|
||||
{
|
||||
|
@ -2260,6 +2275,17 @@ int shader_parse_input_signature(const void *dxbc, size_t dxbc_length,
|
|||
return ret;
|
||||
}
|
||||
|
||||
int shader_parse_output_signature(const void *dxbc, size_t dxbc_length,
|
||||
struct vkd3d_shader_signature *signature)
|
||||
{
|
||||
int ret;
|
||||
|
||||
memset(signature, 0, sizeof(*signature));
|
||||
if ((ret = parse_dxbc(dxbc, dxbc_length, osgn_handler, signature)) < 0)
|
||||
ERR("Failed to parse output signature.\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int dxil_handler(const char *data, DWORD data_size, DWORD tag, void *context)
|
||||
{
|
||||
switch (tag)
|
||||
|
|
|
@ -672,6 +672,14 @@ int vkd3d_shader_parse_input_signature(const struct vkd3d_shader_code *dxbc,
|
|||
return shader_parse_input_signature(dxbc->code, dxbc->size, signature);
|
||||
}
|
||||
|
||||
int vkd3d_shader_parse_output_signature(const struct vkd3d_shader_code *dxbc,
|
||||
struct vkd3d_shader_signature *signature)
|
||||
{
|
||||
TRACE("dxbc {%p, %zu}, signature %p.\n", dxbc->code, dxbc->size, signature);
|
||||
|
||||
return shader_parse_output_signature(dxbc->code, dxbc->size, signature);
|
||||
}
|
||||
|
||||
struct vkd3d_shader_signature_element *vkd3d_shader_find_signature_element(
|
||||
const struct vkd3d_shader_signature *signature, const char *semantic_name,
|
||||
unsigned int semantic_index, unsigned int stream_index)
|
||||
|
|
|
@ -781,6 +781,8 @@ void free_shader_desc(struct vkd3d_shader_desc *desc);
|
|||
|
||||
int shader_parse_input_signature(const void *dxbc, size_t dxbc_length,
|
||||
struct vkd3d_shader_signature *signature);
|
||||
int shader_parse_output_signature(const void *dxbc, size_t dxbc_length,
|
||||
struct vkd3d_shader_signature *signature);
|
||||
|
||||
struct vkd3d_dxbc_compiler;
|
||||
|
||||
|
|
Loading…
Reference in New Issue