[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