[PATCH vkd3d 5/6] vkd3d-shader: Handle descriptor array dynamic indexing.

Henri Verbeet hverbeet at gmail.com
Wed Jul 28 05:22:56 CDT 2021


On Tue, 27 Jul 2021 at 15:41, Conor McCarthy <cmccarthy at codeweavers.com> wrote:
> +static bool vkd3d_dxbc_compiler_enable_descriptor_indexing(struct vkd3d_dxbc_compiler *compiler,
> +        enum vkd3d_shader_register_type reg_type, enum vkd3d_shader_resource_type resource_type)
> +{
> +    struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
> +
> +    if (!vkd3d_dxbc_compiler_is_target_extension_supported(compiler,
> +            VKD3D_SHADER_SPIRV_EXTENSION_EXT_DESCRIPTOR_INDEXING))
> +        return false;
> +
> +    switch (reg_type)
> +    {
> +        case VKD3DSPR_CONSTBUFFER:
> +            vkd3d_spirv_enable_capability(builder, SpvCapabilityUniformBufferArrayDynamicIndexing);
> +            break;
> +        case VKD3DSPR_RESOURCE:
> +            vkd3d_spirv_enable_capability(builder, resource_type == VKD3D_SHADER_RESOURCE_BUFFER
> +                    ? SpvCapabilityUniformTexelBufferArrayDynamicIndexingEXT
> +                    : SpvCapabilitySampledImageArrayDynamicIndexing);
> +            break;
> +        case VKD3DSPR_UAV:
> +            vkd3d_spirv_enable_capability(builder, resource_type == VKD3D_SHADER_RESOURCE_BUFFER
> +                    ? SpvCapabilityStorageTexelBufferArrayDynamicIndexingEXT
> +                    : SpvCapabilityStorageImageArrayDynamicIndexing);
> +            break;

Yes, but when the application enabled
"VKD3D_SHADER_COMPILE_OPTION_BUFFER_UAV_STORAGE_BUFFER", we use
storage buffers for buffer UAVs. (See also
vkd3d_dxbc_compiler_use_storage_buffer().)

>  static uint32_t vkd3d_dxbc_compiler_get_descriptor_index(struct vkd3d_dxbc_compiler *compiler,
> -        const struct vkd3d_shader_register *reg, unsigned int binding_base_idx)
> +        const struct vkd3d_shader_register *reg, unsigned int binding_base_idx,
> +        enum vkd3d_shader_resource_type resource_type)
>  {
>      struct vkd3d_shader_register_index index = reg->idx[1];
>      uint32_t index_id;
>
>      if (index.rel_addr)
>      {
> -        FIXME("Descriptor dynamic indexing is not supported.\n");
> -        vkd3d_dxbc_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_DESCRIPTOR_IDX_UNSUPPORTED,
> -                "Cannot dynamically index a descriptor array of type %#x, id %u. "
> -                "Dynamic indexing is not supported.", reg->type, reg->idx[0].offset);
> +        if (!vkd3d_dxbc_compiler_enable_descriptor_indexing(compiler, reg->type, resource_type))
> +        {
> +            FIXME("The device does not support descriptor indexing.\n");
> +            vkd3d_dxbc_compiler_error(compiler, VKD3D_SHADER_ERROR_SPV_DESCRIPTOR_IDX_UNSUPPORTED,
> +                    "Cannot dynamically index a descriptor array of type %#x, id %u. "
> +                    "The device does not support descriptor indexing.", reg->type, reg->idx[0].offset);
> +        }
>      }
>
Using "The device" here is a little awkward. It makes sense when
vkd3d-shader is used by libvkd3d or wined3d, but less so when used for
offline compilation by e.g. vkd3d-compiler. Perhaps something like
"The target environment" would be more appropriate.



More information about the wine-devel mailing list