[PATCH vkd3d v2 3/6] vkd3d-shader: Introduce a descriptor array symbol type to struct vkd3d_symbol.

Henri Verbeet hverbeet at gmail.com
Thu Jul 22 04:13:38 CDT 2021


On Mon, 19 Jul 2021 at 09:22, Conor McCarthy
<conor.mccarthy6 at bigpond.com> wrote:
> +static uint32_t vkd3d_dxbc_compiler_build_descriptor_variable(struct vkd3d_dxbc_compiler *compiler,
> +        SpvStorageClass storage_class, uint32_t type_id, const struct vkd3d_shader_register *reg,
> +        const struct vkd3d_shader_register_range *range, enum vkd3d_shader_resource_type resource_type,
> +        bool is_uav_counter, const struct vkd3d_symbol **array_symbol)
> +{
The "is_uav_counter" parameter is always false. (At least, until patch
6/6 in this series.)

> +    if (array_variable)
> +    {
> +        symbol.info.descriptor_array.contained_type_id = type_id;
> +        type_id = vkd3d_spirv_get_op_type_array(builder, type_id,
> +                vkd3d_dxbc_compiler_get_constant_uint(compiler, binding.count));
> +    }
> +
> +    ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, storage_class, type_id);
> +
> +    if (!array_variable)
> +    {
> +        uint32_t var_id = vkd3d_spirv_build_op_variable(builder, &builder->global_stream,
> +                ptr_type_id, storage_class, 0);
> +
> +        vkd3d_dxbc_compiler_emit_descriptor_binding(compiler, var_id, &binding);
> +        vkd3d_dxbc_compiler_emit_register_debug_name(builder, var_id, reg);
> +
> +        *array_symbol = NULL;
> +        return var_id;
> +    }
> +
"type_id" stores different things depending on whether
"array_variable" is true or not, and I don't think it's making the
code any clearer. It may be clearer to introduce a separate variable
for the array type id. I.e., like this:

    if (!array_variable)
    {
        ptr_type_id = vkd3d_spirv_build_op_variable(..., type_id);
        ...
        return var_id;
    }

    array_type_id = vkd3d_spirv_get_op_type_array(...);
    ptr_type_id = vkd3d_spirv_build_op_variable(..., array_type_id);

    ...
    return var_id;

> +    /* Declare one array variable per Vulkan binding, and use it for all array declarations
> +     * which map to it. In this case ptr_type_id must point to an array type. */
> +    symbol.type = VKD3D_SYMBOL_DESCRIPTOR_ARRAY;
> +    memset(&symbol.key, 0, sizeof(symbol.key));
> +    symbol.key.descriptor_array.ptr_type_id = ptr_type_id;
> +    symbol.key.descriptor_array.set = binding.set;
> +    symbol.key.descriptor_array.binding = binding.binding;
> +    if ((entry = rb_get(&compiler->symbol_table, &symbol)))
> +    {
> +        array_symbol_entry = RB_ENTRY_VALUE(entry, struct vkd3d_symbol, entry);
> +        *array_symbol = array_symbol_entry;
> +        return array_symbol_entry->id;
> +    }
> +

    *array_symbol = RB_ENTRY_VALUE(...);
    return (*array_symbol)->id;

right?



More information about the wine-devel mailing list