On Tue, 27 Jul 2021 at 15:41, Conor McCarthy <cmccarthy(a)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.