[PATCH vkd3d 2/5] vkd3d-shader: Implement parsing of root signature 1.1.
Henri Verbeet
hverbeet at gmail.com
Mon Apr 15 09:55:04 CDT 2019
On Fri, 12 Apr 2019 at 19:43, Józef Kucia <joseph.kucia at gmail.com> wrote:
> +static int shader_parse_descriptor_ranges(struct root_signature_parser_context *context,
> + unsigned int offset, unsigned int count, struct vkd3d_descriptor_range *ranges)
> +{
> + unsigned int element_size = context->version >= VKD3D_ROOT_SIGNATURE_VERSION_1_1 ? 6: 5;
> const char *ptr;
> unsigned int i;
>
> - if (!require_space(offset, 5 * count, sizeof(DWORD), data_size))
> + if (!require_space(offset, element_size * count, sizeof(DWORD), context->data_size))
> {
> - WARN("Invalid data size %#x (offset %u, count %u).\n", data_size, offset, count);
> + WARN("Invalid data size %#x (offset %u, count %u).\n", context->data_size, offset, count);
> return VKD3D_ERROR_INVALID_ARGUMENT;
> }
> - ptr = &data[offset];
> + ptr = &context->data[offset];
>
> for (i = 0; i < count; ++i)
> {
> @@ -2106,6 +2121,8 @@ static int shader_parse_descriptor_ranges(const char *data, DWORD data_size,
> read_dword(&ptr, &ranges[i].descriptor_count);
> read_dword(&ptr, &ranges[i].base_shader_register);
> read_dword(&ptr, &ranges[i].register_space);
> + if (context->version >= VKD3D_ROOT_SIGNATURE_VERSION_1_1)
> + skip_dword(&ptr, 1);
> read_dword(&ptr, &ranges[i].descriptor_table_offset);
>
> TRACE("Type %#x, descriptor count %u, base shader register %u, "
> @@ -2118,19 +2135,52 @@ static int shader_parse_descriptor_ranges(const char *data, DWORD data_size,
> return VKD3D_OK;
> }
>
> -static int shader_parse_descriptor_table(const char *data, DWORD data_size,
> - DWORD offset, struct vkd3d_root_descriptor_table *table)
> +static int shader_parse_descriptor_ranges1(struct root_signature_parser_context *context,
> + unsigned int offset, unsigned int count, struct vkd3d_descriptor_range1 *ranges)
> +{
> + const char *ptr;
> + unsigned int i;
> +
> + assert(context->version == VKD3D_ROOT_SIGNATURE_VERSION_1_1);
> + if (!require_space(offset, 6 * count, sizeof(uint32_t), context->data_size))
> + {
> + WARN("Invalid data size %#x (offset %u, count %u).\n", context->data_size, offset, count);
> + return VKD3D_ERROR_INVALID_ARGUMENT;
> + }
> + ptr = &context->data[offset];
> +
> + for (i = 0; i < count; ++i)
> + {
> + read_dword(&ptr, &ranges[i].range_type);
> + read_dword(&ptr, &ranges[i].descriptor_count);
> + read_dword(&ptr, &ranges[i].base_shader_register);
> + read_dword(&ptr, &ranges[i].register_space);
> + read_dword(&ptr, &ranges[i].flags);
> + read_dword(&ptr, &ranges[i].descriptor_table_offset);
> +
> + TRACE("Type %#x, descriptor count %u, base shader register %u, "
> + "register space %u, flags %#x, offset %u.\n",
> + ranges[i].range_type, ranges[i].descriptor_count,
> + ranges[i].base_shader_register, ranges[i].register_space,
> + ranges[i].flags, ranges[i].descriptor_table_offset);
> + }
> +
> + return VKD3D_OK;
> +}
Do we really need shader_parse_descriptor_ranges() to be able to
handle 1.1 signatures if we also have
shader_parse_descriptor_ranges1()? Or alternatively, do we really need
shader_parse_descriptor_ranges1()? Likewise for
shader_parse_root_descriptor() and shader_parse_root_parameters().
> int vkd3d_shader_parse_root_signature(const struct vkd3d_shader_code *dxbc,
> struct vkd3d_root_signature_desc *root_signature)
> +{
> + struct vkd3d_versioned_root_signature_desc desc = {.version = VKD3D_ROOT_SIGNATURE_VERSION_1_0};
> + int ret;
> +
> + TRACE("dxbc {%p, %zu}, root_signature %p.\n", dxbc->code, dxbc->size, root_signature);
> +
> + memset(root_signature, 0, sizeof(*root_signature));
> + if ((ret = parse_dxbc(dxbc->code, dxbc->size, rts0_handler, &desc)) < 0)
> + {
> + vkd3d_shader_free_versioned_root_signature(&desc);
> + return ret;
> + }
> +
> + assert(desc.version == VKD3D_ROOT_SIGNATURE_VERSION_1_0);
> +
> + *root_signature = desc.u.v_1_0;
> +
> + return VKD3D_OK;
> +}
Since vkd3d_shader_parse_root_signature() isn't in any released
version of libvkd3d-shader, could we just get rid of it?
More information about the wine-devel
mailing list