mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-04-13 05:43:18 -07:00
vkd3d-shader/dxil: Validate the descriptor list metadata nodes.
This commit is contained in:
committed by
Alexandre Julliard
parent
9b64d04ed3
commit
f7525bf0c6
Notes:
Alexandre Julliard
2023-10-19 23:23:04 +02:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/401
@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
#define BITCODE_MAGIC VKD3D_MAKE_TAG('B', 'C', 0xc0, 0xde)
|
#define BITCODE_MAGIC VKD3D_MAKE_TAG('B', 'C', 0xc0, 0xde)
|
||||||
#define DXIL_OP_MAX_OPERANDS 17
|
#define DXIL_OP_MAX_OPERANDS 17
|
||||||
|
static const unsigned int SHADER_DESCRIPTOR_TYPE_COUNT = 4;
|
||||||
|
|
||||||
static const unsigned int dx_max_thread_group_size[3] = {1024, 1024, 64};
|
static const unsigned int dx_max_thread_group_size[3] = {1024, 1024, 64};
|
||||||
|
|
||||||
@ -3374,6 +3375,43 @@ static const struct sm6_metadata_value *sm6_parser_find_named_metadata(struct sm
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static enum vkd3d_result sm6_parser_resources_init(struct sm6_parser *sm6)
|
||||||
|
{
|
||||||
|
const struct sm6_metadata_value *m = sm6_parser_find_named_metadata(sm6, "dx.resources");
|
||||||
|
enum vkd3d_shader_descriptor_type type;
|
||||||
|
const struct sm6_metadata_node *node;
|
||||||
|
|
||||||
|
if (!m)
|
||||||
|
return VKD3D_OK;
|
||||||
|
|
||||||
|
node = m->u.node;
|
||||||
|
if (node->operand_count != SHADER_DESCRIPTOR_TYPE_COUNT)
|
||||||
|
{
|
||||||
|
WARN("Unexpected descriptor type count %u.\n", node->operand_count);
|
||||||
|
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCES,
|
||||||
|
"Descriptor type count %u is invalid.", node->operand_count);
|
||||||
|
return VKD3D_ERROR_INVALID_SHADER;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (type = 0; type < SHADER_DESCRIPTOR_TYPE_COUNT; ++type)
|
||||||
|
{
|
||||||
|
if (!(m = node->operands[type]))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!sm6_metadata_value_is_node(m))
|
||||||
|
{
|
||||||
|
WARN("Resource list is not a node.\n");
|
||||||
|
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCES,
|
||||||
|
"Resource list is not a metadata node.");
|
||||||
|
return VKD3D_ERROR_INVALID_SHADER;
|
||||||
|
}
|
||||||
|
|
||||||
|
FIXME("Descriptor info is unhandled.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return VKD3D_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static void signature_element_read_additional_element_values(struct signature_element *e,
|
static void signature_element_read_additional_element_values(struct signature_element *e,
|
||||||
const struct sm6_metadata_node *node, struct sm6_parser *sm6)
|
const struct sm6_metadata_node *node, struct sm6_parser *sm6)
|
||||||
{
|
{
|
||||||
@ -4176,6 +4214,9 @@ static enum vkd3d_result sm6_parser_init(struct sm6_parser *sm6, const uint32_t
|
|||||||
if ((ret = sm6_parser_entry_point_init(sm6)) < 0)
|
if ((ret = sm6_parser_entry_point_init(sm6)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
if ((ret = sm6_parser_resources_init(sm6)) < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
if ((ret = sm6_parser_module_init(sm6, &sm6->root_block, 0)) < 0)
|
if ((ret = sm6_parser_module_init(sm6, &sm6->root_block, 0)) < 0)
|
||||||
{
|
{
|
||||||
if (ret == VKD3D_ERROR_OUT_OF_MEMORY)
|
if (ret == VKD3D_ERROR_OUT_OF_MEMORY)
|
||||||
|
@ -180,6 +180,7 @@ enum vkd3d_shader_error
|
|||||||
VKD3D_SHADER_ERROR_DXIL_INVALID_ENTRY_POINT = 8015,
|
VKD3D_SHADER_ERROR_DXIL_INVALID_ENTRY_POINT = 8015,
|
||||||
VKD3D_SHADER_ERROR_DXIL_INVALID_SIGNATURE = 8016,
|
VKD3D_SHADER_ERROR_DXIL_INVALID_SIGNATURE = 8016,
|
||||||
VKD3D_SHADER_ERROR_DXIL_INVALID_PROPERTIES = 8017,
|
VKD3D_SHADER_ERROR_DXIL_INVALID_PROPERTIES = 8017,
|
||||||
|
VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCES = 8018,
|
||||||
|
|
||||||
VKD3D_SHADER_WARNING_DXIL_UNKNOWN_MAGIC_NUMBER = 8300,
|
VKD3D_SHADER_WARNING_DXIL_UNKNOWN_MAGIC_NUMBER = 8300,
|
||||||
VKD3D_SHADER_WARNING_DXIL_UNKNOWN_SHADER_TYPE = 8301,
|
VKD3D_SHADER_WARNING_DXIL_UNKNOWN_SHADER_TYPE = 8301,
|
||||||
|
Reference in New Issue
Block a user