On Mon, 19 Jul 2021 at 09:22, Conor McCarthy conor.mccarthy6@bigpond.com wrote:
-static void vkd3d_dxbc_compiler_emit_descriptor_binding_for_reg(struct vkd3d_dxbc_compiler *compiler,
uint32_t variable_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)
-{
- struct vkd3d_shader_descriptor_binding binding;
- unsigned int binding_base_idx; /* Value not used. */
- binding = vkd3d_dxbc_compiler_get_descriptor_binding(compiler, reg, range,
resource_type, is_uav_counter, &binding_base_idx);
- vkd3d_dxbc_compiler_emit_descriptor_binding(compiler, variable_id, &binding);
-}
[...]
@@ -5758,41 +5742,41 @@ static void vkd3d_dxbc_compiler_emit_resource_declaration(struct vkd3d_dxbc_comp { assert(structure_stride); /* counters are valid only for structured buffers */
counter_type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_UINT, 1); if (vkd3d_dxbc_compiler_is_opengl_target(compiler)) {
counter_type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_UINT, 1); vkd3d_spirv_enable_capability(builder, SpvCapabilityAtomicStorage); storage_class = SpvStorageClassAtomicCounter;
ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, storage_class, counter_type_id); } else if (compiler->ssbo_uavs) {
uint32_t length_id, array_type_id, struct_id;
uint32_t length_id, array_type_id; length_id = vkd3d_dxbc_compiler_get_constant_uint(compiler, 1);
array_type_id = vkd3d_spirv_build_op_type_array(builder, counter_type_id, length_id);
array_type_id = vkd3d_spirv_build_op_type_array(builder, vkd3d_spirv_get_type_id(builder,
VKD3D_SHADER_COMPONENT_UINT, 1), length_id); vkd3d_spirv_build_op_decorate1(builder, array_type_id, SpvDecorationArrayStride, 4);
struct_id = vkd3d_spirv_build_op_type_struct(builder, &array_type_id, 1);
vkd3d_spirv_build_op_decorate(builder, struct_id, SpvDecorationBufferBlock, NULL, 0);
vkd3d_spirv_build_op_member_decorate1(builder, struct_id, 0, SpvDecorationOffset, 0);
counter_type_id = vkd3d_spirv_build_op_type_struct(builder, &array_type_id, 1);
vkd3d_spirv_build_op_decorate(builder, counter_type_id, SpvDecorationBufferBlock, NULL, 0);
vkd3d_spirv_build_op_member_decorate1(builder, counter_type_id, 0, SpvDecorationOffset, 0); storage_class = SpvStorageClassUniform;
ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, storage_class, struct_id);
}
else
{
counter_type_id = type_id; }
counter_var_id = vkd3d_spirv_build_op_variable(builder, &builder->global_stream,
ptr_type_id, storage_class, 0);
vkd3d_dxbc_compiler_emit_descriptor_binding_for_reg(compiler,
counter_var_id, reg, &resource->range, resource_type, true);
vkd3d_spirv_build_op_name(builder, counter_var_id, "u%u_counter", reg->idx[0].offset);
/* TODO: UAV counter descriptor arrays. */
counter_var_id = vkd3d_dxbc_compiler_build_descriptor_variable(compiler, storage_class,
}counter_type_id, reg, &resource->range, resource_type, true, &counter_array_symbol); }
Most of this seems like a separate change from the rest of the patch.