On Mon, 19 Jul 2021 at 09:22, Conor McCarthy <conor.mccarthy6(a)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.